Question

Je suis confus par le changement de banque dans l'assembleur PIC ... Cela fonctionne pour mettre un 'Q' sur le lecteur:

bsf PORTB,1         ;Set Transmit DIR (PORTB (0x6) not mirrored in other banks)
movlw 'Q'           ;'Q' to work reg
movwf TXREG         ;work reg to TXREG (TXREG (0x19) not mirrored in other banks)
clrwdt              ;Clear watchdog
btfss TXSTA,TRMT    ;Wait until 'Q' is shifted (TXSTA is 0x18, not mirrored)
goto $-2
bcf PORTB,1         ;Set Recive DIR

Et cela fonctionne aussi bien:

BCF 0x3, 0x5        ;Switch to bank 0
BCF 0x3, 0x6
bsf PORTB,1         ;Set Transmit DIR
movlw 'Q'           ;'Q' to work reg
movwf TXREG         ;work reg to TXREG 
BSF 0x3, 0x5        ;Switch to bank 1
clrwdt              ;Clear watchdog
btfss TXSTA,TRMT    ;Wait until 'Q' is shifted
goto $-2
BCF 0x3, 0x5        ;Switch to bank 0
bcf PORTB,1         ;Set Recive DIR

J'ai vérifié que le compilateur ne change pas de banque lorsque je ne regarde pas ... Quand faut-il changer de banque?

Était-ce utile?

La solution

Tout d’abord, quel appareil photo utilisez-vous parce que cela fait une légère différence. De plus, quel compilateur utilisez-vous.

Cependant, la raison pour laquelle votre code fonctionne est que tout ce que vous devez faire pour envoyer des messages se trouve dans la banque 0. Vos écritures sur le port b ne font rien Je devine que vous voulez changer de trisb et que se trouve dans la banque 1 mais puisque le contrôleur a le contrôle des broches écrivant sur le port B, il n'a aucun effet. Dans votre deuxième exemple, vous interrogez ce que vous pensez être TXSTA mais qui se trouve dans la banque 0 et non pas dans la banque 1. Je suppose que vous avez de la chance en interrogeant le mauvais emplacement et que le bit est toujours dans le bon état pour que la boucle se termine.

Lorsque je fais une transmission, je préfère d'abord voir si le message est vide et attendre jusqu'à ce qu'il le soit, puis envoyer le caractère. Inutile d'attendre la fin de la transmission sauf si vous souhaitez utiliser un interrupteur par exemple pour obtenir le caractère suivant.

Donc, les deux morceaux de code fonctionnent parce que vous êtes dans la banque 0 dans les deux quand vous effectuez movwf TXREG. Le reste est traité dans le matériel pour vous.

Modifier: Maintenant que je connais la partie que vous avez raison de dire que TXSTA est dans la banque 1. Vous par mon intermédiaire parce que vous aviez un commentaire de l'adresse en tant que 0x18 et que ce devrait être 0x98. Dans le premier exemple, vous interrogez le bit 1 de RCSTA, qui correspond au OERR et non à TXSTA. Donc, si cela fonctionne, cela implique que OERR = 1, ce qui est très possible, je le supprime généralement lorsque je fais quelque chose avec la réception.

Autres conseils

Il est préférable d’utiliser BANKSEL pour changer de banque automatiquement. C'est une directive spéciale de l'assembleur qui indique à l'assembleur de basculer sur la bonne banque. Donc, si vous souhaitez accéder à PORTB, juste BANKSEL (PORTB) avant de l’utiliser.

PS: PORTB est dans BANK0 de la famille PIC16 et non pas dans BANK1 comme dans votre code.

J'ai aussi trouvé le choix des banques très difficile à comprendre.

Je commence un projet en utilisant les PIC12F1822s, pour leur fonctionnalité I2C. Effectuer une recherche sur l’arrière-plan revient plutôt à démêler un écheveau de fils, chacun ayant besoin de beaucoup de difficultés avant qu’il devienne clair. L’un des fils que j’ai réussi à extraire est une explication de la phrase "BANKSEL". directive.

Arrière-plan. Il existe plusieurs douzaines de SFR - registres de fonctions spéciales - qui facilitent le fonctionnement du périphérique, mappés dans la mémoire de données inférieure. Comme ils sont nombreux, ils sont organisés en 32 banques, numérotées de 0 à 31, de 32 SFR chacune. Les SFR sont numérotés séquentiellement sous la forme (bits) bbbbbfffffff bbbbb est le numéro de banque et fffffff est le décalage de la banque. Leurs valeurs sont définies dans le fichier .INC du PIC et la séquence comporte de nombreuses lacunes. Notez que pour les décalages SFR dans les banques 0 à 30, cinq bits suffisent, mais pour la banque 31, sept bits sont nécessaires.

Lorsqu’il accède à l’un de ces SFR, son numéro de banque doit figurer dans le registre BSR, défini par le paramètre "MOVLB". instruction d'assembleur. Pour rendre cela facile, il existe une directive "BANKSEL". qui peut être utilisé avant chaque accès d'un SFR. (Dans d'autres PIC, les bits du registre STATUS contiennent le numéro de banque.) Après un test réussi, tous les BANKSEL superflus peuvent être supprimés. Mon casse-tête (après l'avoir établi jusqu'à présent - les informations contenues dans la documentation est rare et dispersée) était comment cette directive fonctionnait. Bien sûr, il est évalué par l’assembleur avant la production de tout code, et c’est mon code de test pour le vérifier, en utilisant EQU pour effectuer les calculs et l’expliquer (notez que locn est "Location"), c’est-à-dire l’adresse du instruction.):

        ;BANKSEL is a directive that does the equivalent of 
        ;       movlb  (<SFRname> & 0XF0) >> 7

        ;For example TRISA is defined in P12F1822.INC as:

        ;-----Bank1------------------
        TRISA            EQU  H'008C' 

   Assembler:
   Locn   Resulting value     Line  Original code line content ";" is a comment
   ~~~~   ~~~~~~~~~~~~~~~     ~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                              00047 ; Test of equivalent of BANKSEL directive          
          0000008C            00048 selbank equ TRISA
          00000080            00049 selbnk1 equ selbank & 0XF80 ; Extract bank no. ..
          00000001            00050 selbnk2 equ selbnk1 >> 7 ; .. move it to the right
          0000000C            00051 selbnk3 equ TRISA & 0XF80 >> 7 
        [ Operator precedence: >> (bit shift right) higher than & (bitwise AND) ]
          0000000C            00052 selbnk4 equ TRISA & (0XF80 >> 7) ; default
          00000001            00053 selbnk5 equ (TRISA & 0XF80) >> 7 ; as needed`
                     . . .
   006C   0021                00100 movlb  1           ; Should be same as next line
   006D   0021                00101 banksel TRISA       
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top