Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
Migrer 16F vers 18F
- F6FCO
Expert- Messages : 1413
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Bonjour tous,
J'essaie de mettre un pied dans les 18F. Comme aide pour les configs je me sers du code qu'a posté Temps-X dans le sujet 'Soft Commande CNC'.
Par contre je manque cruellement d'infos sur les interrupt et j'ai le nez dans le datasheet mais pas simple avec mon anglais primaire
Première question:
Temps-X, un truc me chiffonne, la première zone des variables commence à H'0' et le départ après reset également. Normal ? il me semble qu'il y a conflit, la première ligne 'goto début' va écraser les premières variables loop1, loop2, etc. ?
Autre question:
Pour faire simple au début je compte ne pas mettre de priorités aux interruptions, donc registre RCON --> IPEN=0 si j'ai bien pigé. Mais du coup ou commencent les interrupt ? à H'8' ou bien H'18' ?
J'essaie de mettre un pied dans les 18F. Comme aide pour les configs je me sers du code qu'a posté Temps-X dans le sujet 'Soft Commande CNC'.
Par contre je manque cruellement d'infos sur les interrupt et j'ai le nez dans le datasheet mais pas simple avec mon anglais primaire
Première question:
Temps-X, un truc me chiffonne, la première zone des variables commence à H'0' et le départ après reset également. Normal ? il me semble qu'il y a conflit, la première ligne 'goto début' va écraser les premières variables loop1, loop2, etc. ?
Autre question:
Pour faire simple au début je compte ne pas mettre de priorités aux interruptions, donc registre RCON --> IPEN=0 si j'ai bien pigé. Mais du coup ou commencent les interrupt ? à H'8' ou bien H'18' ?
Code : Tout sélectionner
;**********************************************************************************************
Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct"
list p=18f4525 ; processeur utilisé
#include <p18f4525.inc> ; Définitions des constantes
;**********************************************************************************************
CONFIG OSC = XT ; Oscillateur ext 4MHz
CONFIG IESO = OFF ; Oscillateur secondaire refusé (ON/OFF)
CONFIG PWRT = ON ; Délai au démarrage (ON/OFF)
CONFIG BOREN = OFF ; Reset si chute de tension (ON/OFF)
CONFIG BORV = 0 ; Tension de reset en 1/10ème Volts
CONFIG WDT = OFF ; Mise hors service du watchdog (ON/OFF)
CONFIG PBADEN = OFF ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
CONFIG LPT1OSC = OFF ; Timer1 configuré pour un fonctionnement plus puissant
CONFIG MCLRE = OFF ; Mclr configuré comme entrée
CONFIG STVREN = ON ; Reset sur débordement de pile (ON/OFF)
CONFIG LVP = OFF ; Programmation basse tension autorisée (ON/OFF)
CONFIG XINST = OFF ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
CONFIG DEBUG = OFF ; Debugger hors service
CONFIG CP0 = OFF ; Code protection sur block 0 (ON/OFF)
CONFIG CP1 = OFF ; Code protection sur block 1 (ON/OFF)
CONFIG CP2 = OFF ; Code protection sur block 2 (ON/OFF)
CONFIG CPB = OFF ; Code protection sur bootblock (ON/OFF)
CONFIG CPD = OFF ; Code protection sur eeprom (ON/OFF)
CONFIG WRT0 = OFF ; Protection écriture block 0 (ON/OFF)
CONFIG WRT1 = OFF ; Protection écriture block 1 (ON/OFF)
CONFIG WRT2 = OFF ; Protection écriture block 2 (ON/OFF)
CONFIG WRTB = OFF ; Protection écriture bootblock (ON/OFF)
CONFIG WRTC = OFF ; Protection écriture configurations (ON/OFF)
CONFIG WRTD = OFF ; Protection écriture zone eeprom (ON/OFF)
CONFIG EBTR0 = OFF ; Protection lecture de table block 0 (ON/OFF)
CONFIG EBTR1 = OFF ; Protection lecture de table block 1 (ON/OFF)
CONFIG EBTR2 = OFF ; Protection lecture de table block 2 (ON/OFF)
CONFIG EBTRB = OFF ; Protection lecture de table bootblock (ON/OFF)
;*************************************** assignations *****************************************
; #DEFINE
;****************************** déclaration des variables *************************************
CBLOCK H'0'
loop1
loop2
loop3
loop4
loop5
ENDC
CBLOCK H'80'
wreg_temps
status_temps
bsr_temps
ENDC
;**************************** adresse de depart après reset ******************************
ORG H'0'
goto debut
;*************************** interruption haute priorité *********************************
ORG H'8'
retfie
;*************************** interruption basse priorité *********************************
ORG H'18'
movff STATUS,status_temps ; sauve STATUS register
movff WREG,wreg_temps ; sauve registe de travaille
movff BSR,bsr_temps ; sauve le BSR registe
movff bsr_temps,BSR ; restore BSR
movff wreg_temps,WREG ; restore registe de travail
movff status_temps,STATUS ; restore STATUS
retfie
;**********************************************************************************************
debut
movlw B'01110011'
movwf OSCCON ; oscillateur à 8 Mhz
movlw B'00001111'
movwf ADCON1 ; mode analogique
clrf TRISA
clignote
call _1s
bsf PORTA,0
call _1s
bcf PORTA,0
bra clignote
;************************** tempo de 1 seconde ****************************************
_1s
movlw D'93'
movwf loop1
movlw D'38'
movwf loop2
movlw D'11'
movwf loop3
decfsz loop1
bra $-D'2'
decfsz loop2,F
bra $-D'6'
decfsz loop3,F
bra $-D'10'
return
end
Migrer 16F vers 18F
Bonjour, je devance Temps-x, et je luis dis que la bibliothèque arrive :)
Les pic 16F et 18F possèdent une architecture Harvard. Les mémoires programme et données sont distinctes et démarrent toutes les 2 à 0.
Flash 16F, adresses en dur :
0x0000 reset
0x0004 interruption
Flash 18F (en mode compatible 16F, un seul niveau d'interruption, IPEN = 0)
0x0000 reset
0x0008 interruption
Flash 18F (à 2 niveaux d'interruption, IPEN = 1)
0x0000 reset
0x0008 interruption high level
0x0018 interruption low level
Ram 16F877
0x000 à 0x01F bank0, registres
0x020 à 0x07F bank0, ram disponible (96)
0x080 à 0x0FF bank1, registres + ram disponible (80)
0x100 à 0x17F bank2, registres + ram disponible (80)
0x180 à 0x1FF bank3, registres + ram disponible (80)
Ram 18F4525
0x000 à 0x0FF bank0, ram disponible (256)
0x100 à 0x1FF bank1, ram disponible (256)
0x200 à 0x2FF bank2, ram disponible (256)
0x300 à 0x3FF bank3, ram disponible (256)
0x400 à 0x4FF bank4, ram disponible (256)
0x500 à 0x5FF bank5, ram disponible (256)
0x600 à 0x6FF bank6, ram disponible (256)
0x700 à 0x7FF bank7, ram disponible (256)
0x800 à 0x8FF bank8, ram disponible (256)
0x900 à 0x9FF bank9, ram disponible (256)
0xA00 à 0xAFF bank10, ram disponible (256)
0xB00 à 0xBFF bank11, ram disponible (256)
0xC00 à 0xCFF bank12, ram disponible (256)
0xD00 à 0xDFF bank13, ram disponible (256)
0xE00 à 0xEFF bank14, ram disponible (256)
0xF00 à 0xF7F bank15, ram disponible (128)
0xF80 à 0xFFF bank15, registres
Les registres du 18F sont en fin de ram, ceux du 16F en début de ram. Dans les 2 cas, c'est indépendant de la mémoire programme qui est ailleurs. Les 16F877 et 18F4525 ont toutes les banks ram pleines, on peut pas faire plus gros. Je connais pas les derniers pic, il y a peut être mieux.
Les pic 16F et 18F possèdent une architecture Harvard. Les mémoires programme et données sont distinctes et démarrent toutes les 2 à 0.
Flash 16F, adresses en dur :
0x0000 reset
0x0004 interruption
Flash 18F (en mode compatible 16F, un seul niveau d'interruption, IPEN = 0)
0x0000 reset
0x0008 interruption
Flash 18F (à 2 niveaux d'interruption, IPEN = 1)
0x0000 reset
0x0008 interruption high level
0x0018 interruption low level
Ram 16F877
0x000 à 0x01F bank0, registres
0x020 à 0x07F bank0, ram disponible (96)
0x080 à 0x0FF bank1, registres + ram disponible (80)
0x100 à 0x17F bank2, registres + ram disponible (80)
0x180 à 0x1FF bank3, registres + ram disponible (80)
Ram 18F4525
0x000 à 0x0FF bank0, ram disponible (256)
0x100 à 0x1FF bank1, ram disponible (256)
0x200 à 0x2FF bank2, ram disponible (256)
0x300 à 0x3FF bank3, ram disponible (256)
0x400 à 0x4FF bank4, ram disponible (256)
0x500 à 0x5FF bank5, ram disponible (256)
0x600 à 0x6FF bank6, ram disponible (256)
0x700 à 0x7FF bank7, ram disponible (256)
0x800 à 0x8FF bank8, ram disponible (256)
0x900 à 0x9FF bank9, ram disponible (256)
0xA00 à 0xAFF bank10, ram disponible (256)
0xB00 à 0xBFF bank11, ram disponible (256)
0xC00 à 0xCFF bank12, ram disponible (256)
0xD00 à 0xDFF bank13, ram disponible (256)
0xE00 à 0xEFF bank14, ram disponible (256)
0xF00 à 0xF7F bank15, ram disponible (128)
0xF80 à 0xFFF bank15, registres
Les registres du 18F sont en fin de ram, ceux du 16F en début de ram. Dans les 2 cas, c'est indépendant de la mémoire programme qui est ailleurs. Les 16F877 et 18F4525 ont toutes les banks ram pleines, on peut pas faire plus gros. Je connais pas les derniers pic, il y a peut être mieux.
Migrer 16F vers 18F
- F6FCO
Expert- Messages : 1413
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Bonjour Satinas,
et merci pour ta réponse. Entre ma question et ton post j'étais allé voir le fichier 18F4525TEMP fourni avec MPLAB et j'avais vu que c'était 0x0 aussi pour les deux, et je ne comprenais pas
C'est plus clair maintenant.
Mon autre question c'était si on est hors priorités à quelle adresse commence-t'on et tu y as répondu.
Je me suis fais un petit pense-bête:
1/ activer les interrutions INTCON/GIE=1
2/ priorités désactivées RCON/IPEN=0
3/ autoriser les interrupt EUSART PIE1/RCIE=1 et TXIE=1
4/ on ne s'occupe pas du registre IPR1 si priorités désactivées
5/ Réglage vitesse pour 9600 bauds avec un xtal de 4Mhz: SYNC=0, BRGH=1, BRG16=0, SPBRG=25
Je vais continuer mon apprentissage et essayer de faire tourner une liaison série sur le 4525, si je bloque je reviendrai quérir des infos (ce qui ne manquera pas d'arriver
et merci pour ta réponse. Entre ma question et ton post j'étais allé voir le fichier 18F4525TEMP fourni avec MPLAB et j'avais vu que c'était 0x0 aussi pour les deux, et je ne comprenais pas
C'est plus clair maintenant.
Mon autre question c'était si on est hors priorités à quelle adresse commence-t'on et tu y as répondu.
Je me suis fais un petit pense-bête:
1/ activer les interrutions INTCON/GIE=1
2/ priorités désactivées RCON/IPEN=0
3/ autoriser les interrupt EUSART PIE1/RCIE=1 et TXIE=1
4/ on ne s'occupe pas du registre IPR1 si priorités désactivées
5/ Réglage vitesse pour 9600 bauds avec un xtal de 4Mhz: SYNC=0, BRGH=1, BRG16=0, SPBRG=25
Je vais continuer mon apprentissage et essayer de faire tourner une liaison série sur le 4525, si je bloque je reviendrai quérir des infos (ce qui ne manquera pas d'arriver
Migrer 16F vers 18F
- F6FCO
Expert- Messages : 1413
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Je cale
J'ai beau lire et relire la partie usart de Bigonoff ainsi que la partie usart du datasheet 18F4525 je ne vois pas pourquoi çà ne touille pas. J'ai surement du omettre un truc propre aux 18F et ma liaison série ne fonctionne pas.
Entre autre je ne sais pas trop quoi faire avec RCIP et TXIP du registre IPR1 puisque les priorités sont désactivées.
Çà m'embête j'aurai bien voulu y arriver tout seul mais bon, voilà mon code,
Datasheet:
J'ai beau lire et relire la partie usart de Bigonoff ainsi que la partie usart du datasheet 18F4525 je ne vois pas pourquoi çà ne touille pas. J'ai surement du omettre un truc propre aux 18F et ma liaison série ne fonctionne pas.
Entre autre je ne sais pas trop quoi faire avec RCIP et TXIP du registre IPR1 puisque les priorités sont désactivées.
Çà m'embête j'aurai bien voulu y arriver tout seul mais bon, voilà mon code,
Code : Tout sélectionner
;**********************************************************************************************
Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct"
list p=18f4525 ; processeur utilisé
#include <p18f4525.inc> ; Définitions des constantes
;**********************************************************************************************
CONFIG OSC = XT ; Oscillateur ext 4MHz
CONFIG IESO = OFF ; Oscillateur secondaire refusé (ON/OFF)
CONFIG PWRT = ON ; Délai au démarrage (ON/OFF)
CONFIG BOREN = OFF ; Reset si chute de tension (ON/OFF)
CONFIG BORV = 0 ; Tension de reset en 1/10ème Volts
CONFIG WDT = OFF ; Mise hors service du watchdog (ON/OFF)
CONFIG PBADEN = OFF ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
CONFIG LPT1OSC = OFF ; Timer1 configuré pour un fonctionnement plus puissant
CONFIG MCLRE = ON ; Mclr
CONFIG STVREN = ON ; Reset sur débordement de pile (ON/OFF)
CONFIG LVP = OFF ; Programmation basse tension autorisée (ON/OFF)
CONFIG XINST = OFF ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
CONFIG DEBUG = ON ; Debugger hors service
CONFIG CP0 = OFF ; Code protection sur block 0 (ON/OFF)
CONFIG CP1 = OFF ; Code protection sur block 1 (ON/OFF)
CONFIG CP2 = OFF ; Code protection sur block 2 (ON/OFF)
CONFIG CPB = OFF ; Code protection sur bootblock (ON/OFF)
CONFIG CPD = OFF ; Code protection sur eeprom (ON/OFF)
CONFIG WRT0 = OFF ; Protection écriture block 0 (ON/OFF)
CONFIG WRT1 = OFF ; Protection écriture block 1 (ON/OFF)
CONFIG WRT2 = OFF ; Protection écriture block 2 (ON/OFF)
CONFIG WRTB = OFF ; Protection écriture bootblock (ON/OFF)
CONFIG WRTC = OFF ; Protection écriture configurations (ON/OFF)
CONFIG WRTD = OFF ; Protection écriture zone eeprom (ON/OFF)
CONFIG EBTR0 = OFF ; Protection lecture de table block 0 (ON/OFF)
CONFIG EBTR1 = OFF ; Protection lecture de table block 1 (ON/OFF)
CONFIG EBTR2 = OFF ; Protection lecture de table block 2 (ON/OFF)
CONFIG EBTRB = OFF ; Protection lecture de table bootblock (ON/OFF)
;*************************************** assignations *****************************************
; #DEFINE
;****************************** déclaration des variables *************************************
CBLOCK H'0'
ENDC
CBLOCK H'80'
W_TEMP
STATUS_TEMP
BSR_TEMP
Tampon_REC ; tampon réception
Tampon_EM ; tampon émission
Reg_1 ; sert à la tempo
Reg_2 ; sert à la tempo
ENDC
;**************************** adresse de depart après reset ******************************
ORG H'0'
goto init
;************************************ interruptions *********************************
ORG H'08'
Sauvegarde_registres
movwf W_TEMP
movff STATUS,STATUS_TEMP
movff BSR,BSR_TEMP
btfsc PIR1, RCIF
goto reception
btfsc PIR1, TXIF
goto emission
restauration_registres
movff BSR_TEMP,BSR
movf W_TEMP,w
movff STATUS_TEMP,STATUS
retfie
reception
movf RCREG , W
movwf Tampon_REC ; les 8 bits de données sont transférés dans un registre d'usage général
btfss RCSTA , OERR ; test d'une erreur d'overrun
; traitement de l'erreur d'overrun
bcf RCSTA , CREN ; on efface le bit OERR
bsf RCSTA , CREN ; on relance la réception
goto restauration_registres
emission
; les 8 bits de données à transmettre sont dans le registre d'usage général Tampon_EMISSION
movf Tampon_EM,w
movwf TXREG
boucle_EM
btfss PIR1,TXIF ; test du flag émission
goto boucle_EM
goto restauration_registres
;**********************************************************************************************
init
movlw B'11000000' ; Rc6 et Rc7 en input
movwf TRISC
bsf INTCON,GIE ; activation des interruptions
bcf RCON,IPEN ; désactivation des priorités
bsf PIE1,TXIE ; interrupt emission et reception usart activées
bsf PIE1,RCIE
;-------------- init TXSTA
movlw b'00100100'
movwf TXSTA
; bit 7 (CSRC) = 0 (non utilisé : 0 par exemple)
; bit 6 (TX9) = 0 8 bits de transmission
; bit 5 (TXEN) = 1 autorise la transmission
; bit 4 (SYNC) = 0 mode asynchrone
; bit 3 = 0 (non implémenté)
; bit 2 (BRGH) = 1 mode asynchrone haute vitesse
; bit 1 (TRMT) = 0 (en lecture seule)
; bit 0 (TX9D) = 0 (non utilisé : 0 par exemple)
;------------- init RCSTA
Bank0
movlw b'10010000'
movwf RCSTA
; bit 7 (SPEN) = 1 utilisation du port série
; bit 6 (RX9) = 0 8 bits reception
; bit 5 (SREN) = 0 (non utilisé : 0 par exemple)
; bit 4 (CREN) = 1 autorise la reception
; bit 3 (ADEN) = 0 (non utilisé : 0 par exemple)
; bit 2 (FERR) = 0 (non utilisé : 0 par exemple)
; bit 1 (OERR) = 0 (non utilisé : 0 par exemple)
; bit 0 (RX9D) = 0 (non utilisé : 0 par exemple)
; réglages vitesse
movlw d'25' ; réglages sur 9600bauds avec sync=O, brgh=1, brg16=0, xtal=4Mhz
movwf SPBRG
bcf BAUDCON,BRG16 ; réglé à 8bits
main
movlw 0x46 ;F
movwf Tampon_EM
call tempo
movlw 0x36 ;6
movwf Tampon_EM
call tempo
movlw 0x46 ;F
movwf Tampon_EM
call tempo
movlw 0x43 ;C
movwf Tampon_EM
call tempo
movlw 0x4F ;O
movwf Tampon_EM
call tempo
movlw 0x20 ;espace
movwf Tampon_EM
call tempo
goto main
tempo
; Délai 1 000 Cycles de la machine
; Durée du délai 1 milliseconde
; Fréquence de l'oscillateur 4 MHZ
movlw .75
movwf Reg_1
movlw .2
movwf Reg_2
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
return
end
Datasheet:
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Migrer 16F vers 18F
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour F6FC0,
config Hardware OK ?
y aurait pas un ANSELX quelque part ?
Pourquoi utiliser l'interrupt sur TX , puisque dans l'interrupt on fait un pooling sur le bit TXIF
dans la boucle principale un simple test sur le bit buffer transmiter serait suffisant
et juste une tempo apres l'envoi des 5 caracteres, histoire de ne pas surcharger le terminal PC !
500mS , le temps de voir ce qui se passe.
Personnellement, je n'ai encore jamais utilisé l'interrupt sur TX.
config Hardware OK ?
y aurait pas un ANSELX quelque part ?
Pourquoi utiliser l'interrupt sur TX , puisque dans l'interrupt on fait un pooling sur le bit TXIF
dans la boucle principale un simple test sur le bit buffer transmiter serait suffisant
Code : Tout sélectionner
movlw 0x46 ;F
btfss TXSTA1,TRMT
goto $-2
nop
movwf TXREG1
et juste une tempo apres l'envoi des 5 caracteres, histoire de ne pas surcharger le terminal PC !
500mS , le temps de voir ce qui se passe.
Personnellement, je n'ai encore jamais utilisé l'interrupt sur TX.
Migrer 16F vers 18F
Bonjour aux uartiens
Lors d'une interruption, le 18F sauvegarde automatiquement W, BSR et STATUS dans des registres de copie.
En sortant de l'interruption par "RETFIE 1" au lieu de RETFIE tout court, les 3 valeurs sauvegardées sont copiées dans les 3 registres. Il n'y a donc plus besoin de sauvegarde/restauration registres, c'est fait automatiquement.
C'est un fusil à un coup, il faut l'utiliser que pour l'int prioritaire si IPEN = 1.
Quand on utilise pas les priorités, on oublie les bits de registre correspondants, ils restent à leur valeur par défaut.
Lors d'une interruption, le 18F sauvegarde automatiquement W, BSR et STATUS dans des registres de copie.
En sortant de l'interruption par "RETFIE 1" au lieu de RETFIE tout court, les 3 valeurs sauvegardées sont copiées dans les 3 registres. Il n'y a donc plus besoin de sauvegarde/restauration registres, c'est fait automatiquement.
C'est un fusil à un coup, il faut l'utiliser que pour l'int prioritaire si IPEN = 1.
Quand on utilise pas les priorités, on oublie les bits de registre correspondants, ils restent à leur valeur par défaut.
Migrer 16F vers 18F
- F6FCO
Expert- Messages : 1413
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
C'est bon çà marche , je te remercie pour ton aide Paulfjujo.
J'ai ensuite procédé à quelques modifs pour comprendre et c'est le passage par ma variable d'émission Tampon_EM qui faisait le blocage, comme tu le dis en chargeant directement TXREG à partir du main c'est bien plus simple.
J'ai ensuite procédé à quelques modifs pour comprendre et c'est le passage par ma variable d'émission Tampon_EM qui faisait le blocage, comme tu le dis en chargeant directement TXREG à partir du main c'est bien plus simple.
Modifié en dernier par F6FCO le sam. 2 juin 2018 17:31, modifié 1 fois.
Migrer 16F vers 18F
- F6FCO
Expert- Messages : 1413
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Bonjour Satinas,
j'ai effectué les sauvegardes comme indiqué à la page 121 du datasheet.
Si je comprends bien ce que tu dis on effectue normalement les sauvegardes quand on a les priorités désactivées et on utilise Refie1 que pour les prioritaires.
j'ai effectué les sauvegardes comme indiqué à la page 121 du datasheet.
Si je comprends bien ce que tu dis on effectue normalement les sauvegardes quand on a les priorités désactivées et on utilise Refie1 que pour les prioritaires.
Migrer 16F vers 18F
Tu as IPEN = 0, il n'y a qu'une seule routine d'interruption en 0x0008. Tu n'as pas à sauvegarder, c'est fait automatiquement, et "RETFIE 1" restitue aussi automatiquement les 3 registres.
Avec 2 interruptions basse et haute priorité, lors de l'appel de la routine basse priorité, les registres sont sauvegardés automatiquement. Si cette int est interrompue par l'int haute priorité, il y a à nouveau sauvegarde auto, et les premières valeurs de sauvegarde sont écrasées.
Donc, il faut faire sauvegarde/restauration manuelles pour l'int basse priorité avec un "RETFIE" , et réserver le "RETFIE 1" pour l'int haute priorité, qui elle ne sera jamais interrompue.
Avec 2 interruptions basse et haute priorité, lors de l'appel de la routine basse priorité, les registres sont sauvegardés automatiquement. Si cette int est interrompue par l'int haute priorité, il y a à nouveau sauvegarde auto, et les premières valeurs de sauvegarde sont écrasées.
Donc, il faut faire sauvegarde/restauration manuelles pour l'int basse priorité avec un "RETFIE" , et réserver le "RETFIE 1" pour l'int haute priorité, qui elle ne sera jamais interrompue.
Modifié en dernier par satinas le sam. 2 juin 2018 18:04, modifié 1 fois.
Migrer 16F vers 18F
- F6FCO
Expert- Messages : 1413
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Merci pour l'info, je viens de modifier le code qui est ainsi simplifié . Je poste ce code de liaison série pour 18F qui fonctionne ci-dessous, çà pourra peut-être servir à quelqu'un.
Par contre, un petit bug de MPlab que j'ai laissé volontairement: dans la partie init de RCSTA j'avais oublié d'enlever l'appel à une macro de changement de banque qui me servait pour les 16F (Bank0 ligne 121). Dans ce code pour 18F les macros ne sont pas déclarées et MPlab ne me signale aucune erreur malgré l'appel.
Par contre, un petit bug de MPlab que j'ai laissé volontairement: dans la partie init de RCSTA j'avais oublié d'enlever l'appel à une macro de changement de banque qui me servait pour les 16F (Bank0 ligne 121). Dans ce code pour 18F les macros ne sont pas déclarées et MPlab ne me signale aucune erreur malgré l'appel.
Code : Tout sélectionner
;**********************************************************************************************
Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct"
list p=18f4525 ; processeur utilisé
#include <p18f4525.inc> ; Définitions des constantes
;**********************************************************************************************
CONFIG OSC = XT ; Oscillateur ext 4MHz
CONFIG IESO = OFF ; Oscillateur secondaire refusé (ON/OFF)
CONFIG PWRT = ON ; Délai au démarrage (ON/OFF)
CONFIG BOREN = OFF ; Reset si chute de tension (ON/OFF)
CONFIG BORV = 0 ; Tension de reset en 1/10ème Volts
CONFIG WDT = OFF ; Mise hors service du watchdog (ON/OFF)
CONFIG PBADEN = OFF ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
CONFIG LPT1OSC = OFF ; Timer1 configuré pour un fonctionnement plus puissant
CONFIG MCLRE = ON ; Mclr
CONFIG STVREN = ON ; Reset sur débordement de pile (ON/OFF)
CONFIG LVP = OFF ; Programmation basse tension autorisée (ON/OFF)
CONFIG XINST = OFF ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
CONFIG DEBUG = ON ; Debugger hors service
CONFIG CP0 = OFF ; Code protection sur block 0 (ON/OFF)
CONFIG CP1 = OFF ; Code protection sur block 1 (ON/OFF)
CONFIG CP2 = OFF ; Code protection sur block 2 (ON/OFF)
CONFIG CPB = OFF ; Code protection sur bootblock (ON/OFF)
CONFIG CPD = OFF ; Code protection sur eeprom (ON/OFF)
CONFIG WRT0 = OFF ; Protection écriture block 0 (ON/OFF)
CONFIG WRT1 = OFF ; Protection écriture block 1 (ON/OFF)
CONFIG WRT2 = OFF ; Protection écriture block 2 (ON/OFF)
CONFIG WRTB = OFF ; Protection écriture bootblock (ON/OFF)
CONFIG WRTC = OFF ; Protection écriture configurations (ON/OFF)
CONFIG WRTD = OFF ; Protection écriture zone eeprom (ON/OFF)
CONFIG EBTR0 = OFF ; Protection lecture de table block 0 (ON/OFF)
CONFIG EBTR1 = OFF ; Protection lecture de table block 1 (ON/OFF)
CONFIG EBTR2 = OFF ; Protection lecture de table block 2 (ON/OFF)
CONFIG EBTRB = OFF ; Protection lecture de table bootblock (ON/OFF)
;*************************************** assignations *****************************************
; #DEFINE
;****************************** déclaration des variables *************************************
CBLOCK H'0'
ENDC
CBLOCK H'80'
W_TEMP
STATUS_TEMP
BSR_TEMP
Tampon_REC ; tampon réception
Tampon_EM ; tampon émission
Reg_1
Reg_2
Reg_3
ENDC
;**************************** adresse de depart après reset ******************************
ORG H'0'
goto init
;********************************** interruptions ***************************************
ORG H'08'
entrée_interrupt
btfsc PIR1, RCIF
bra reception
btfsc PIR1, TXIF
bra emission
sortie_interrupt
retfie 1
reception
movf RCREG , W
movwf Tampon_REC ; les 8 bits de données sont transférés dans un registre d'usage général
btfss RCSTA , OERR ; test d'une erreur d'overrun
; traitement de l'erreur d'overrun
bcf RCSTA , CREN ; on efface le bit OERR
bsf RCSTA , CREN ; on relance la réception
bra sortie_interrupt
emission
; les 8 bits de données à transmettre sont dans le registre d'usage général Tampon_EMISSION
movf Tampon_EM,w
movwf TXREG
boucle_EM
btfss PIR1,TXIF ; test du flag émission
bra boucle_EM
bra sortie_interrupt
;**********************************************************************************************
init
movlw B'11000000' ; Rc6 et Rc7 en input
movwf TRISC
bsf INTCON,GIE ; activation des interruptions
bcf RCON,IPEN ; désactivation des priorités
bsf PIE1,TXIE ; interrupt emission et reception usart activées
bsf PIE1,RCIE
;-------------- init TXSTA
movlw b'00100100'
movwf TXSTA
; bit 7 (CSRC) = 0 (non utilisé : 0 par exemple)
; bit 6 (TX9) = 0 8 bits de transmission
; bit 5 (TXEN) = 1 autorise la transmission
; bit 4 (SYNC) = 0 mode asynchrone
; bit 3 = 0 (non implémenté)
; bit 2 (BRGH) = 1 mode asynchrone haute vitesse
; bit 1 (TRMT) = 0 (en lecture seule)
; bit 0 (TX9D) = 0 (non utilisé : 0 par exemple)
;------------- init RCSTA
Bank0
movlw b'10010000'
movwf RCSTA
; bit 7 (SPEN) = 1 utilisation du port série
; bit 6 (RX9) = 0 8 bits reception
; bit 5 (SREN) = 0 (non utilisé : 0 par exemple)
; bit 4 (CREN) = 1 autorise la reception
; bit 3 (ADEN) = 0 (non utilisé : 0 par exemple)
; bit 2 (FERR) = 0 (non utilisé : 0 par exemple)
; bit 1 (OERR) = 0 (non utilisé : 0 par exemple)
; bit 0 (RX9D) = 0 (non utilisé : 0 par exemple)
; réglages vitesse
movlw d'25' ; réglages sur 9600bauds avec sync=O, brgh=1, brg16=0, xtal=4Mhz
movwf SPBRG
bcf BAUDCON,BRG16 ; réglé à 8bits
main
movlw 0x46 ;F
btfss TXSTA,TRMT
bra $-2
nop
movwf TXREG
movlw 0x36 ;6
btfss TXSTA,TRMT
bra $-2
nop
movwf TXREG
movlw 0x46 ;F
btfss TXSTA,TRMT
bra $-2
nop
movwf TXREG
movlw 0x43 ;C
btfss TXSTA,TRMT
bra $-2
nop
movwf TXREG
movlw 0x4F ;0
btfss TXSTA,TRMT
bra $-2
nop
movwf TXREG
movlw 0x20 ;espace
btfss TXSTA,TRMT
bra $-2
nop
movwf TXREG
call tempo
bra main
tempo
; Délai 10 000 000 Cycles de la machine
; Durée du délai 10 seconde
; Fréquence de l'oscillateur 4 MHZ
movlw .223
movwf Reg_1
movlw .187
movwf Reg_2
movlw .51
movwf Reg_3
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
decfsz Reg_3,F
goto $-5
nop
nop
return
end
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 88 invités