Comment écrire dans la mémoire flash en utilisant l’assemblage en ligne?

J’utilise le compilateur MPLAB C18 avec PIC18F87J11 et j’essaie de sauvegarder certaines valeurs dans la mémoire flash, en utilisant l’assembly inline, qui est une combinaison de code C et d’assembly.

Il semble que je puisse écrire et lire correctement dans la mémoire flash, mais dès que je relance mon PIC puis que je tente de lire ce que j’avais précédemment enregistré depuis une adresse spécifique, je n’obtiens pas la même valeur. Je sauve 0x09 à l’adresse 0xB22A . Comme je l’ai dit, si je sauvegarde la valeur puis la lis immédiatement, tout s’affiche correctement, mais lors de la réinitialisation du PIC, je reçois 0x00 .

Est-ce que je ne sauvegarde pas de manière permanente dans la mémoire flash ou que se passe-t-il vraiment ici?

Ceci est mon code:

Effacer la mémoire

 _asm MOVLW 0x00 MOVWF TBLPTRU,BANKED MOVLW 0xB2 MOVWF TBLPTRH,BANKED MOVLW 0x2A MOVWF TBLPTRL,BANKED _endasm EECON1bits.FREE = 1; INTCONbits.GIE = 0; _asm MOVLW 0x55 MOVWF EECON2,BANKED MOVLW 0xAA MOVWF EECON2,BANKED _endasm EECON1bits.WR = 1; INTCONbits.GIE = 1; 

Écrire dans la mémoire flash

 _asm MOVLW 0x00 MOVWF TBLPTRU,BANKED MOVLW 0xB2 MOVWF TBLPTRH,BANKED MOVLW 0x2A MOVWF TBLPTRL,BANKED MOVLW 0x09 MOVWF TABLAT,BANKED TBLWTPOSTINC MOVLW 0x09 MOVWF TABLAT,BANKED TBLWT _endasm EECON1bits.WPROG = 1; EECON1bits.WREN = 1; INTCONbits.GIE = 0; _asm MOVLW 0x55 MOVWF EECON2,BANKED MOVLW 0xAA MOVWF EECON2,BANKED _endasm EECON1bits.WR = 1; INTCONbits.GIE = 1; EECON1bits.WPROG = 0; EECON1bits.WREN = 0; 

Lire du mémoire flash

 _asm MOVLW 0x00 MOVWF TBLPTRU,BANKED MOVLW 0xB2 MOVWF TBLPTRH,BANKED MOVLW 0x2A MOVWF TBLPTRL,BANKED READ_WORD: TBLRDPOSTINC MOVF TABLAT, 0,BANKED MOVWF WORD_EVEN,ACCESS TBLRDPOSTINC MOVF TABLAT, 0,BANKED MOVWF WORD_ODD,ACCESS _endasm printf("\r\n"); PrintChar(WORD_EVEN); printf("\r\n"); PrintChar(WORD_ODD); 

Le code original se trouve dans la fiche technique du chapitre 6, mais rappelez-vous que j’ai dû le modifier un peu pour pouvoir l’utiliser avec C. Je ne suis pas sûr de la différence entre ACCESS et BANKED car je soupçonne qu’ils pourraient l’être. liée au problème.

    On dirait que vous êtes déjà arrivé à la solution: le problème est d’utiliser BANKED .

    EECON2 et similaires sont des registres de fonctions spéciales (SFR) qui se trouvent dans la banque 15. Le moyen le plus rapide d’y accéder est d’utiliser ACCESS , qui ignore le registre de banque dans le calcul de l’adresse.

    Dans le langage d’assemblage utilisé, ACCESS signifie 0 et BANKED signifie 1. L’une de ces valeurs est requirejse dans l’instruction movwf . La fiche technique utilise les nombres réels dans ses exemples, au lieu de constantes symboliques.

    La fiche technique explique également comment la RAM est mise en banque.

    Fondamentalement, il existe un registre contenant 4 bits représentant les banques 0 à 15. Ce nombre est préfixé au nombre de 8 bits atsortingbué à l’instruction, ce qui donne les 12 bits. Cela permet une exécution plus rapide. Pour stocker au bon endroit, vous devez d’abord régler ce registre sur la bonne banque.

    Deux des banques, 0 et 15, sont également mappées aux registres à usage général et aux registres à fonction spéciale. Comme ils sont utilisés le plus souvent, le moyen le plus rapide pour les obtenir est d’utiliser un indicateur dans l’instruction pour ignorer le registre de la banque lors du calcul de l’adresse et aller directement au GPR ou au SFR souhaité.

    Votre problème est que vous définissiez le drapeau pour utiliser une banque de mémoire différente de celle du registre.