1)Allumage de LEDS en sortie. ;**************************** ;*Allumer une LED sur PortB * ;**************************** ; fichier 1_led.asm ;A la mise sous tension la LED SUR RB s'allume ; ; Device = 16F84 ; Utilisation du circuit 16F84 ; Horloge = XT ; Déclaration et config du Circuit ; Equivalence registres ;*********************** PORTB equ TRISB equ STATUS equ 0x0006 ; Adresse du portb 0x0086 ; Adresse du registre de direction du portb 0x0003 ; Le bit 5 permet d'acceder à la Banque 1 ou 0 ; ce qui donne acces au TRIS ou au PORT ; Equivalence DONNEES ; ******************* donnee D2, D6 et D7 equ 0x0062 ; Donnee en hexa a stocker en sortie on allume les LED ;*************** ;Initialisation* ;*************** org 00h ; Apres le reset le PC pointe l'adresse 00 goto début org 05h clrf bsf movlw movwf bcf PORTB ; Mise a zero des latches de sorties STATUS,05 ; Selection de Bank 1 pour l'accès au TRIS 00h TRISB ; RAZ registre de direction portb soit en sortie. STATUS,05 ; Selection de Bank 0 pour l'accès au PORT ; ; ; ; On 04 On en saute les 5 premiers octets car à l'adresse on a l'adresse d'interruption prend l'habitude de ne pas ecrire sur ce segment sautant simplement jusqu'apres ce segment debut ;********************* ;Programme principal * ;********************* ; On active les sorties 1,5 et 6 sur le portb movlw movwf donnee ; chargement dans le registre W valeur litterale PORTB ; chargement du contenu de w dans le fichier PORTB goto fin fin end 2) Recopie d'un port en entrée sur sortie. ;********************************* ;*Recopier le portA sur le PortB * ;********************************* ; fichier 2_recop.asm ; ; Device = 16F84 ; Horloge = XT ; Utilisation du circuit 16F84 ; Déclaration et config du Circuit ; Equivalence registres ;*********************** PORTA PORTB TRISA TRISB STATUS equ equ equ equ equ ;*************** ;Initialisation* ;*************** org 0x0005 0x0006 0x0085 0x0086 0x0003 ; ; ; ; ; ; Adresse du porta Adresse du portb Adresse du registre de direction du portb Adresse du registre de direction du porta Le bit 5 permet d'acceder à la Banque 1 ou 0 ce qui donne acces au TRIS ou au PORT 00h ; Apres le reset le PC pointe l'adresse 00 goto debut ; ; ; ; org 05h clrf clrf bsf movlw movwf PORTB PORTA STATUS,05 00h TRISB ; ; ; ; ; movlw movwf bcf 1fh TRISA STATUS,05 ; ; Declaration du porta en entree ; Selection de Bank 0 pour l'accès au PORT On 04 On en saute les 5 premiers octets car à l'adresse on a l'adresse d'interruption prend l'habitude de ne pas ecrire sur ce segment sautant simplement jusqu'apres ce segment debut Mise a zero des latches de sorties Mise a zero des latches de sorties Selection de Bank 1 pour l'accès au TRIS Declaration du portb en sortie ;********************* ;Programme principal * ;********************* boucle movf movwf goto end PORTA,0 ; chargement dans le registre Work du porta PORTB ; chargement du contenu de w dans le fichier PORTB boucle ; recopie permanente 1-3) Clignotement de toutes les LED sur un port en sortie à l'aide d'une tempo par boucle. ;******************************** ;*Faire clignoter tout le PortB * ;******************************** ; fichier 3_cligno.asm ; Le clignotement n'est pas visible a l'oeil nu ; un oscilloscope sur l'une des sorties permet de s'assurer du clignotement de la LED ; On pourra verifier aussi la mesure du temps à l'oscilloscope ; La comparer au calcul effectue ; Device = 16F84 ; Utilisation du circuit 16F84 ; Horloge = XT ; Déclaration et config du Circuit ; Equivalence registres ;*********************** PORTB equ TRISB equ STATUS equ 0x0006 ; Adresse du portb 0x0086 ; Adresse du registre de direction du porta 0x0003 ; Le bit 5 permet d'acceder à la Banque 1 ou 0 ; ce qui donne acces au TRIS ou au PORT ;* Reservation memoire * ; Les registres occupent la RAM jusqu'en OBh COMPT equ 0Ch ;Initialisation* org 00h ; Apres le reset le PC pointe l'adresse 00 goto debut ; On saute les 5 premiers octets car à l'adresse ; 04 on a l'adresse d'interruption ; On prend l'habitude de ne pas ecrire sur ce segment ; en sautant simplement jusqu'apres ce segment org 05h debut clrf bsf movlw movwf bcf ;Programme principal * clrf boucle movlw movwf tempo decfsz goto comf goto end PORTB STATUS,05 00h TRISB STATUS,05 ; ; ; ; ; Mise a zero des latches de sorties Selection de Bank 1 pour l'accès au TRIS PORTB ; Extinction de toutes les LEDS 0x00ff COMPT ; chargement de COMPT de la valeur maximale Declaration du portb en sortie Selection de Bank 0 pour l'accès au PORT COMPT,1 ; Le temps de decompter 256 valeurs tempo ; calcultemps : 1 instruction =Tquartz/4=1µs =1 cycle ; l'instruction decfz est de 2 cycles ; 2 instructions = 3µs repeter 256 fois t=768µs PORTB,1 ; on inverse l'etat des LEDs boucle ; recopie permanente 1-4) Clignotement d'une seule LED sur un port en sortie à l'aide d'une tempo par boucle. Introduction d'un sous programme. ;**************************************** ;*Faire clignoter la LED 1 du PortB * ;**************************************** ; fichier 4_ledcli.asm ; Le clignotement n'est pas visible a l'oeil nu ; un oscilloscope sur la sortie clignotante permet de s'assurer du clignotement de la LED ; On pourra verifier aussi la mesure du temps à l'oscilloscope ; La comparer au calcul effectue ; ; ; Device = 16F84 ; Utilisation du circuit 16F84 ; Horloge = XT ; Déclaration et config du Circuit ; Equivalence registres PORTB equ 0x0006 ; Adresse du portb TRISB equ 0x0086 ; Adresse du registre de direction du porta STATUS equ 0x0003 ; Le bit 5 permet d'acceder à la Banque 1 ou 0 ; ce qui donne acces au TRIS ou au PORT ;* Reservation memoire * ; Les registres occupent la RAM jusqu'en OBh COMPT equ 0Ch ;Initialisation* org 00h ; Apres le reset le PC pointe l'adresse 00 goto debut ; On saute les 5 premiers octets car à l'adresse ; 04 on a l'adresse d'interruption ; On prend l'habitude de ne pas ecrire sur ce segment ; en sautant simplement jusqu'apres ce segment org 05h debut clrf PORTB ; Mise a zero des latches de sorties bsf STATUS,05 ; Selection de Bank 1 pour l'accès au TRIS movlw 00h ; movwf TRISB ; Declaration du portb en sortie bcf ;Programme principal * boucle clrf call movlw movwf call goto ;Sous Programmes * tempo movlw movwf delai decfsz goto =1 cycle STATUS,05 ; Selection de Bank 0 pour l'accès au PORT PORTB tempo 01h PORTB tempo boucle ; Extinction de toutes les LEDS 0x00ff COMPT ; chargement de COMPT de la valeur maximale COMPT,1 delai ; Le temps de decompter 256 valeurs ; calcul du temps : 1 instruction =Tquartz/4=1µs ; on inverse l'etat de la LED 1 ; recopie permanente ; l'instruction decfz est de 2 cycles ; 2 instructions = 3 µs repeter 256 fois t=768µs return end 1-5) Clignotement d'une seule LED sur un port en sortie à l'aide d'une tempo par boucles imbriquées Faire clignoter la LED 0 sur le PortB a la frequence de 0,5 Hz * ; fichier 5_led1cl.asm ; Le clignotement est visible a l'oeil nu periode de 200 ms ; Device = 16F84 ; Utilisation du circuit 16F84 ; Horloge = XT ; Déclaration et config du Circuit ; Equivalence registres PORTB equ 0x0006 ; TRISB equ 0x0086 ; STATUS equ 0x0003 ; * Reservation memoire * ; Les registres occupent la RAM jusqu'en OBh COMPT equ 0Ch COMPT1 equ 0Dh ;Initialisation* ;*************** org 00h; Apres le reset le PC pointe l'adresse 00 goto debut ; On saute les 5 premiers octets car à l'adresse ; 04 on a l'adresse d'interruption ; On prend l'habitude de ne pas ecrire sur ce segment ; en sautant simplement jusqu'apres ce segment org 05h debut clrf PORTB ; Mise a zero des latches de sorties bsf STATUS,05 ; Selection de Bank 1 pour l'accès au TRIS movlw 00h ; movwf TRISB ; Declaration du portb en sortie bcf STATUS,05 ; Selection de Bank 0 pour l'accès au PORT ;Programme principal * clrf PORTB ; Extinction de toutes les LEDS boucle bsf PORTB,0 ; On allume la LED 1 call tempo bcf PORTB,0 ; On eteind la LED 1 call tempo goto boucle ; recopie permanente ; SOUS PROGRAMME * ; SP tempo de 100 ms * tempo movlw 0x00C8 ; chargement de COMPT1 DE 200 movwf COMPT1 ; delai1 movlw 0x00A6 ; chargement de COMPT movwf COMPT delai decfsz COMPT,1 ; Le temps de decompter 166 valeurs goto delai ; calcul temps:1 instruction =Tquartz/4=1µs =1 cycle ; l'instruction goto est de 2 cycles ; 2 instructions = 3 µs repeter 166 fois t=498 µs decfsz goto return end COMPT1,1 delai1 ; ON execute la boucle 200 fois ; calcul du temps : 500µs*200=100ms 1-6) Clignotement d'une seule LED2 sur le même port en sortie. La durée d'extinction et d'allumage étant différente. Introduction de variable et passage de paramètre ;******************************************** ;* Faire clignoter la LED 0 sur le PortB * ;* Duree niveau haut de 3s niveau bas de 1s * ;******************************************** ; fichier 6_hautba.asm ; Device = 16F84 ; Horloge = XT ; Utilisation du circuit 16F84 ; Déclaration et config du Circuit ; Equivalence registres ;*********************** PORTB TRISB STATUS equ equ equ 0x0006 ; Adresse du portb 0x0086 ; Adresse du registre de direction du porta 0x0003 ; Le bit 5 permet d'acceder à la Banque 1 ou 0 ; ce qui donne acces au TRIS ou au PORT equ equ 1Dh 0Ah ; Constantes ;************ DUREEAL DUREEET ; 30 * 1/10s ; 10 * 1/10s ;* Reservation memoire * ;*********************** ; Les registres occupent la RAM jusqu'en OBh COMPT COMPT1 DUREE equ equ equ ;*************** 0Ch 0Dh 0Eh ;Initialisation* ;*************** org goto 00h ; Apres le reset le PC pointe l'adresse 00 debut ; On saute les 5 premiers octets car à l'adresse ; 04 on a l'adresse d'interruption ; On prend l'habitude de ne pas ecrire sur ce segment ; en sautant simplement jusqu'apres ce segment org 05h clrf bsf movlw movwf PORTB STATUS,05 00h TRISB ; Mise a zero des latches de sorties ; Selection de Bank 1 pour l'accès au TRIS ; ; Declaration du portb en sortie bcf clrf STATUS,05 PORTB ; Selection de Bank 0 pour l'accès au PORT ; Extinction de toutes les LEDS PORTB,07 ; On allume la LED 7 seule PORTB,0 DUREEAL DUREE tempo PORTB,0 DUREEET DUREE tempo boucle ; On allume la LED 0 seule ; Passage du parametre pour la duree ; de la tempo ici niveau haut debut ;********************* ;Programme principal * ;********************* bsf boucle bsf movlw movwf call bcf movlw movwf call goto ; On eteint la LED 0 seule ; Passage du parametre pour la duree ; de la tempo ici niveau bas ; recopie permanente ;****************** ; SOUS PROGRAMME * ;****************** ; SP tempo par passage de parametre duree est en 10 eme de seconde * ;************************************************************************* tempo movlw movwf 0x00C8 COMPT1 ; chargement de COMPT1 DE 200 ; movlw movwf 0x00A5 COMPT ; chargement de COMPT de 165 decfsz goto COMPT,1 delai ; Le temps de decompter 165 valeurs ; calcul du temps : 1 instruction =Tquartz/4=1µs delai1 delai =1 cycle decfsz goto decfsz goto return end COMPT1,1 delai1 DUREE,1 tempo ; l'instruction goto est de 2 cycles ; 2 instructions = 3 µs repeter 165 fois t=495 µs ; ON execute la boucle 200 fois ; calcul du temps : 500µs*200=100ms ; ON execute les boucles de la valeur de duree ; calcul du temps : duree*100ms 1-7) Même problème que ci-dessus avec modulation de la temporisation par donnée sur port d'entrée. ;********************************************* ;* Faire clignoter la LED 0 sur le PortB * ;* Duree niveau haut est module par le porta * ;********************************************* ; fichier 7_ledmod.asm ; ; ; Device = 16F84 ; Horloge = XT ; Utilisation du circuit 16F84 ; Déclaration et config du Circuit ; Equivalence registres ;*********************** PORTA TRISA PORTB TRISB STATUS equ equ equ equ equ 0x0005 0x0085 0x0006 0x0086 0x0003 equ equ 30 10 ; ; ; ; ; ; Adresse du portb Adresse du registre de direction du porta Adresse du portb Adresse du registre de direction du porta Le bit 5 permet d'acceder à la Banque 1 ou 0 ce qui donne acces au TRIS ou au PORT ; Constantes ;************ DUREEAL DUREEET ;* Reservation memoire * ;*********************** ; Les registres occupent la RAM jusqu'en OBh COMPT COMPT1 DUREE equ equ equ 0Ch 0Dh 0Eh ;*************** ;Initialisation* ;*************** org 00h ; Apres le reset le PC pointe l'adresse 00 goto debut ; On saute les 5 premiers octets car à l'adresse ; 04 on a l'adresse d'interruption ; On prend l'habitude de ne pas ecrire sur ce segment ; en sautant simplement jusqu'apres ce segment org 05h clrf clrf bsf movlw movwf movlw movwf PORTA PORTB STATUS,05 00h TRISB 1fh TRISA debut ; Mise a zero des latches de sorties ; Selection de Bank 1 pour l'accès au TRIS ; ; Declaration du portb en sortie ; ; Declaration du portA en entree bcf clrf STATUS,05 PORTB ; Selection de Bank 0 pour l'accès au PORT ; Extinction de toutes les LEDS bsf PORTB,07 ; On allume la LED 7 seule bsf movf addlw movwf call bcf movlw movwf call goto PORTB,0 PORTA,0 1 DUREE tempo PORTB,0 DUREEET DUREE tempo boucle ; ; ; ; ;********************* ;Programme principal * ;********************* boucle On allume la LED 0 seule Passage du parametre pour la duree on evite que duree est de 0 de la tempo ici niveau haut ; On eteint la LED 0 seule ; Passage du parametre pour la duree ; de la tempo ici niveau bas ; recopie permanente ;****************** ; SOUS PROGRAMME * ;****************** ; SP tempo par passage de parametre duree est en 10 eme de seconde * ;************************************************************************* tempo movlw movwf 0x00C8 COMPT1 ; chargement de COMPT1 DE 200 ; movlw movwf 0x00A6 COMPT ; chargement de COMPT decfsz goto COMPT,1 delai decfsz goto decfsz goto COMPT1,1 delai1 DUREE,1 tempo delai1 delai return end ; Le temps de decompter 166 valeurs ; calcultemps : 1 instruction =Tquartz/4=1µs =1cycle ; l'instruction goto est de 2 cycles ; 2 instructions = 3 µs repeter 166 fois t=498 µs ; ON execute la boucle 200 fois ; calcul du temps : 500µs*200=100ms ; ON execute les boucles de la valeur de duree ; calcul du temps : duree*100ms 8) Gestion d'un feu tricolore. Elaboration d'une tempo de base de 1s et modulable par paramètre selon la durée des 3 feux. Trois boucles imbriquées. presentation du probleme Séquence d'allumage : Au démarrage : Feu rouge 36s Feu vert 32s Feu Orange 4s Pour une souplesse des temps de temporisation on se servira d'une base de temps de 1 seconde avec une sous base de 0,1s. ;******************************* ;* Gestion d'un feu tricolore * ;******************************* ; fichier 8_feux.asm ; ; ; ; ; Gestion D'un seul feu Feu tricolore sur portB Feu rouge bit 1, orange bit 2 et vert bit 3. V O R 7 6 5 4 3 2 1 0 ; ; Device = 16F84 ; Horloge = XT ; Utilisation du circuit 16F84 ; Déclaration et config du Circuit ; Equivalence registres ;*********************** PORTB TRISB STATUS equ equ equ 0x0006 ; Adresse du portb 0x0086 ; Adresse du registre de direction du porta 0x0003 ; Le bit 5 permet d'acceder à la Banque 1 ou 0 ; ce qui donne acces au TRIS ou au PORT equ equ equ 24h 04h 20h ; Constantes ;************ DUREER DUREEO DUREEV ; 36 secondes ; 4 secondes ; 32 secondes ;* Reservation memoire * ;*********************** ; Les registres occupent la RAM jusqu'en OBh COMPT COMPT1 COMPT2 DUREE equ equ equ equ ;*************** ;Initialisation* ;*************** org goto 0Ch 0Dh 0Eh 0Fh 00h ; Apres le reset le PC pointe l'adresse 00 debut ; On saute les 5 premiers octets car à l'adresse ; 04 on a l'adresse d'interruption ; On prend l'habitude de ne pas ecrire sur ce segment ; en sautant simplement jusqu'apres ce segment org 05h clrf bsf movlw movwf bcf clrf PORTB STATUS,05 00h TRISB STATUS,05 PORTB debut ; ; ; ; ; Selection de Bank 0 pour l'accès au TRIS Declaration du portb en sortie Selection de Bank 1 pour l'accès au PORT Extinction de toutes les LEDS ;********************* ;Programme principal * ;********************* ; On allume le feu rouge et on eteint le feu Orange boucle movlw movwf movlw movwf call 02h PORTB DUREER ; DUREE tempo ; Seul le feu rouge est allume ; duree du feu rouge ; On allume le feu vert et on eteint le feu rouge movlw movwf movlw movwf call 08h PORTB DUREEV DUREE tempo ; Seul le feu vert est allume ; ; duree du feu orange ; On allume le feu orange et on eteint le feu vert movlw movwf movlw movwf call 04h PORTB DUREEO DUREE tempo ; Seul le feu orange est allume goto boucle ; feu permanent ; ; duree du feu vert ;****************** ; SOUS PROGRAMME * ;****************** ; SP tempo par passage de parametre duree est en seconde * ;************************************************************************* tempo movlw movwf 0x000A COMPT2 ; chargement de COMPT2 DE 10 ; movlw movwf 0x00C8 COMPT1 ; chargement de COMPT1 DE 200 ; movlw movwf 0x00A5 COMPT ; chargement de COMPT de 165 decfsz goto COMPT,1 delai ; Le temps de decompter 165 valeurs ; calcul du temps : 1 instruction =Tquartz/4=1µs delai2 delai1 delai =1 cycle ; l'instruction decfz est de 2 cycles ; 2 instructions = 3 µs repeter 165 fois t=495 µs + 2 inst =497µs decfsz instr dont 1 à 2 cycle goto les 5µs rstant COMPT1,1 ; ON execute la boucle de 497µs 200 fois + 2 delai1 ; calcul du temps : 500µs*200=100ms on neglige decfsz goto COMPT2,1 delai2 ; ON execute les boucles de 100 ms 10 fois ; calcul du temps : 100ms*10=1s decfsz goto DUREE,1 tempo ; ON execute les boucles de la valeur de duree ; calcul du temps : duree*100ms return end 9- Gestion de 2 feux de carrefour On effectue la gestion de 2 feux de carrefour. Les SP de temporisation reprennent ceux precedents. ;******************************* ;* Gestion d'un feu tricolore * ;******************************* ; fichier 9_2feux.asm ; ; ; ; ; ; ; ; ; Gestion de 2 feux Feu tricolore sur portB Feu rouge bit 1, orange bit 2 et vert bit 3. V O R V O R 7 6 5 4 3 2 1 0 8 4 2 1 8 4 2 1 Device = 16F84 Horloge = XT ; ; ; Equivalence registres ;*********************** PORTB TRISB STATUS ; Constantes ;************ equ equ equ 0x0006 ; 0x0086 ; 0x0003 ; DUREE2R DUREEO DUREEV equ equ equ 02h 04h 20h ; 02 secondes ; 4 secondes ; 32 secondes ;* Reservation memoire * ;*********************** ; Les registres occupent la RAM jusqu'en OBh COMPT COMPT1 COMPT2 DUREE equ equ equ equ 0Ch 0Dh 0Eh 0Fh ;*************** ;Initialisation* ;*************** org 00h ; Apres le reset le PC pointe l'adresse 00 debut ; On saute les 5 premiers octets car à l'adresse ; 04 on a l'adresse d'interruption ; On prend l'habitude de ne pas ecrire sur ce goto segment ; en sautant simplement jusqu'apres ce segment org 05h clrf bsf movlw movwf bcf clrf PORTB STATUS,05 00h TRISB STATUS,05 PORTB debut ; ; ; ; ; Selection de Bank 1 pour l'accès au TRIS Declaration du portb en sortie Selection de Bank 0 pour l'accès au PORT Extinction de toutes les LEDS ;********************* ;Programme principal * ;********************* ; On allume le feu rouge 1 et le feu vert 2 et on eteint les autres feux boucle movlw movwf movlw movwf call 82h PORTB DUREEV DUREE tempo ; FR1 et FV2 sont allumes ; ; duree des feux ; On allume le feu rouge 1 et le feu orange 2 et on eteint les autres feux movlw movwf movlw movwf call 42h PORTB DUREEO DUREE tempo ; FR1 et FO2 sont allumes ; ; duree des feux ; On allume le feu rouge 1 et le feu rouge 2 et on eteint les autres feux movlw movwf movlw movwf call 22h PORTB DUREE2R DUREE tempo ; FR1 et FO2 sont allumes ; ; duree des feux ; On allume le feu vert 1 et le feu rouge 2 et on eteint les autres feux movlw movwf movlw movwf call 28h PORTB DUREEV DUREE tempo ; FR1 et FO2 sont allumes ; ; duree des feux ; On allume le feu orange 1 et le feu rouge 2 et on eteint les autres feux movlw movwf movlw movwf call 24h PORTB DUREEO DUREE tempo ; FR1 et FO2 sont allumes ; ; duree des feux ; On allume le feu rouge 1 et le feu rouge 2 et on eteint les autres feux movlw movwf movlw movwf call 22h PORTB DUREE2R DUREE tempo ; FR1 et FO2 sont allumes ; ; duree des feux goto boucle ; feu permanent ;****************** ; SOUS PROGRAMME * ;****************** ; SP tempo par passage de parametre duree est en seconde * ;************************************************************************* tempo movlw movwf 0x000A COMPT2 ; chargement de COMPT2 DE 10 ; movlw movwf 0x00C8 COMPT1 ; chargement de COMPT1 DE 200 ; movlw movwf 0x00A5 COMPT ; chargement de COMPT de 165 decfsz goto COMPT,1 delai ; Le temps de decompter 165 valeurs ; calcul du temps : 1 instruction =Tquartz/4=1µs delai2 delai1 delai =1 cycle ; l'instruction decfz est de 2 cycles ; 2 instructions = 3 µs repeter 165 fois t=495 µs + 2 inst =497µs decfsz instr dont 1 à 2 cycle goto les 5µs rstant COMPT1,1 ; ON execute la boucle de 497µs 200 fois + 2 delai1 ; calcul du temps : 500µs*200=100ms on neglige decfsz goto COMPT2,1 delai2 ; ON execute les boucles de 100 ms 10 fois ; calcul du temps : 100ms*10=1s decfsz goto DUREE,1 tempo ; ON execute les boucles de la valeur de duree ; calcul du temps : duree*100ms return end INTRODUCTION aux INTERRUPTIONS. Il existe des interruptions materielles et logicielles. Ces dernières permettent lorsque l'evenement arrive de le traiter sans l'attendre. Lorsque l'on a au moins deux traitements à effectuer, au moins l'un des 2 est traite par interruption, voire tous les traitements. Interruptions materielles : Une patte du microprocesseur est directement affectee par l'interruption. Un front ou un niveau logique declenche l'interruption. Interruptions Logicielle Un bit concernant un registre provoque une interruption. Ce bit s'active par un evenement logiciel. Par exemple lorsque l'on reçoit une donnee d'un modem, le registre de la communication vers le modem est rempli, une interruption est generee, le programme d'interruption lit la donnee. Ainsi entre deux receptions d'octets on peut effectuer une autre tache (par emple traiter les info du clavier de la souris, ect…) Lors d'une interruption autorisee, le micro fini par executer l'instruction en cours, sauvegarde l'adresse de retour dans la pile. Lorsque le programme execute le sous programme d'interruption, le Bit de masque d'interruption est positionne à 1. (c'est à dire plus d'interruption autorisee). Lors du retour du sous programme d'interruption il est repositionne à zero. 2-1) Gestion d'un feu tricolore avec pieton prioritaire ;******************************* ;* Gestion d'un feu tricolore * ;* avec pieton prioritaire * ;******************************* ; fichier 10_pieto.asm ; Gestion D'un seul feu avec pieton ; Le pieton appui n'importe quand le feu passe au orange et puis rouge. ; La coherence de la realite fait que l'on appui seulement quand le feu est vert ; Feu tricolore sur portB ; Feu rouge bit 1, orange bit 2 et vert bit 3. ; V O R ; 7 6 5 4 3 2 1 0 ; Device = 16F84 ; Horloge = XT ; Utilisation du circuit 16F84 ; Déclaration et config du Circuit ; directive d'assemblage list p=16f84 #include p16f84.inc ; Dans le fichier p16f84.inc on trouve l'equivalence de tous les registres ; ainsi que les bits de ces registres ; Constantes ;************ DUREER equ 24h ; 36 secondes DUREEO equ 04h ; 4 secondes DUREEV equ 20h ; 32 secondes DUREEP equ 0Ah ; 10 secondes ;* Reservation memoire * ;*********************** ; Les registres occupent la RAM jusqu'en OBh COMPT equ 0Ch ; Variable de tempo decrementer pour augmenter le temps COMPT1 equ 0Dh ; Variable de tempo decrementer pour augmenter le temps COMPT2 equ 0Eh ; Variable de tempo decrementer pour augmenter le temps DUREE equ 0Fh ; Variable temps la valeur correspond au temps en seconde BUFFERB equ 10h ; Sauvegarde du portb en interruption BUFFER equ 11h ; Sauvegarde de compt en interruption BUFFER1 equ 12h ; Sauvegarde de compt1 en interruption BUFFER2 equ 13h ; Sauvegarde de compt2 en interruption BUFFERD equ 14h ; Sauvegarde de duree en interruption ;*************** ;Initialisation* ;*************** org 00h ; Apres le reset le PC pointe l'adresse 00 goto debut ; On saute les 5 premiers octets car à l'adresse ; 04 on a l'adresse d'interruption ; On prend l'habitude de ne pas ecrire sur ce segment ; en sautant simplement jusqu'apres ce segment org goto 04h pieton org 05h debut clrf bsf movlw movwf ;************************* ;* Init interruption INT * ;************************* bsf bcf bsf PORTB STATUS,RP0 01h TRISB ; Selection de Bank 1 pour l'accès au TRIS ; ; Declaration du portb en sortie sauf RB0 INTCON,INTE OPTION_REG,INTEDG INTCON,GIE ; autorise les interuptions materielles ; interruption sur front montant ; Autorisation generale interruptions Acces au ports ************** bcf STATUS,RP0 ; Selection de Bank 0 pour l'accès au PORT clrf PORTB ; Extinction de toutes les LEDS ;********************* ;Programme principal * ;********************* ; On allume le feu rouge et on eteint le feu Orange boucle movlw movwf movlw movwf call ; On allume le feu vert et on 02h ; Seul le feu rouge est allume PORTB DUREER ; DUREE ; duree du feu rouge tempo eteint le feu rouge movlw 08h ; Seul le feu vert est allume movwf PORTB movlw DUREEV ; movwf DUREE ; duree du feu orange call tempo ; On allume le feu orange et on eteint le feu vert movlw 04h ; Seul le feu orange est allume movwf PORTB movlw DUREEO ; movwf DUREE ; duree du feu vert call tempo goto boucle ; feu permanent ;****************** ; SOUS PROGRAMME * ;****************** ; SP tempo par passage de parametre duree est en seconde * ;************************************************************************* tempo movlw 0x000A ; chargement de COMPT2 DE 10 movwf COMPT2 ; delai2 movlw 0x00C8 ; chargement de COMPT1 DE 200 movwf COMPT1 ; delai1 movlw 0x00A5 ; chargement de COMPT de 165 movwf COMPT delai decfsz COMPT,1 ; Le temps de decompter 165 valeurs goto delai ; calcultemps :1 instruction =Tquartz/4=1µs =1cycle ; l'instruction decfz est de 2 cycles ;2 instructions =3 µs repeter 165 fois t=495 µs+2inst =497µs decfsz goto COMPT1,1;executeboucle de 497µs 200fois+2instr dont1à2 cycle delai1 ; calcultemps:500µs*200=100ms on neglige les 5µs rstant decfsz goto COMPT2,1; ON execute les boucles de 100 ms 10 fois delai2 ; calcul du temps : 100ms*10=1s decfsz goto DUREE,1 ; ON execute les boucles de la valeur de duree tempo ; calcul du temps : duree*100ms return ;******************************** ;* Sous Programme INTERRUPTION * ;******************************** pieton ; Sauvegarde des differentes valeurs utilises aussi dans le pgm interupt movf movwf PORTB,0 BUFFERB movf movwf movf movwf movf movwf movf movwf COMPT,0 BUFFER COMPT1,0 BUFFER1 COMPT2,0 BUFFER2 DUREE,0 BUFFERD ; On allume le feu orange et on eteint le feu vert movlw movwf movlw movwf call 04h PORTB DUREEO DUREE tempo ; Seul le feu orange est allume ; ; duree du feu orange ; On allume le feu rouge et on eteint le feu Orange movlw movwf movlw movwf call 02h PORTB DUREEP ; DUREE tempo ; Seul le feu rouge est allume ; duree du feu rouge ; restitution de l'etat avant l'appui sur le poussoir movf movwf BUFFERB,0 PORTB movf movwf BUFFER,0 COMPT movf movwf BUFFER1,0 COMPT1 ; movf movwf BUFFER2,0 COMPT2 ; movf movwf BUFFERD,0 DUREE ; bcf INTCON,INTF ; Remise à zéro du drapeaux interruptions INT retfie end ; 2-2)Gestion de 2 feux de carrefour ajout d'un feu clignotant. ;******************************* ;* Gestion d'un feu tricolore * ;* Orange clignotement * ;* par debordement timer * ;******************************* ; fichier 11_Ocli.asm ; Gestion de 2 feux ; tempo orange cligntant par interrup timer ; Feu tricolore sur portB ; Feu rouge bit 1, orange bit 2 et vert bit 3. ; V O R 0 V O R ; 7 6 5 4 3 2 1 0 ; 8 4 2 1 8 4 2 1 ; ; Device = 16F84 ; Utilisation du circuit 16F84 ; Horloge = XT ; Déclaration et config du Circuit ; Pas de WD ; directive d'assemblage list p=16f84 #include p16f84.inc ; Dans le fichier p16f84.inc on trouve l'equivalence de tous les registres ; ainsi que les bits de ces registres ; Constantes ;************ DUREE2R DUREEO DUREEV equ equ equ 02h 04h 20h ; 02 secondes ; 4 secondes ; 32 secondes ;* Reservation memoire * ;*********************** ; Les registres occupent la RAM jusqu'en OBh COMPT COMPT1 COMPT2 DUREE COMPT3 equ equ equ equ equ 0Ch 0Dh 0Eh 0Fh 10h ;*************** ;Initialisation* ;*************** org 00h ; Apres le reset le PC pointe l'adresse 00 goto debut ; On saute les 5 premiers octets car à l'adresse ; 04 on a l'adresse d'interruption ; On prend l'habitude de ne pas ecrire sur ce segment ; en sautant simplement jusqu'apres ce segment org 04h goto timer clrf bsf PORTB STATUS,05 ; Selection de Bank 1 pour l'accès au TRIS et movlw movwf 00h TRISB ; ; Declaration du portb en sortie ;PROGRAMME* ;*********** debut registres ;************************* ;* Init interruption INT * ;************************* bcf bsf OPTION_REG,T0CS OPTION_REG,PS0 ; prise en compte de l'horloge interne ; Division de l'horloge par 256 en bsf OPTION_REG,PS1 ; PS0 PS1 a OPTION_REG,PS2 ; quartz 4Mhz fosc/4=1MHz T=1µs soit OPTION_REG,PSA INTCON,GIE ; Prediviseur assigne au timer ; Autorisation generale des interruptions placant 1 et PS2 à 0, Predivision par 16 de TM0 bcf T=256µs apres division bcf bsf ;*Acces au ports ;**************** bcf clrf STATUS,05 PORTB ; Init Variables ; ************** movlw movwf 0x007A COMPT3 ; Selection de Bank 0 pour l'accès au PORT ; Extinction de toutes les LEDS ;********************* ;Programme principal * ;********************* ; On allume le feu rouge 1 et le feu vert 2 et on eteint les autres feux boucle movlw movwf movlw movwf call 82h PORTB DUREEV DUREE tempo ; FR1 et FV2 sont allumes ; ; duree des feux ; On allume le feu rouge 1 et le feu orange 2 et on eteint les autres feux movlw movwf movlw movwf call 42h PORTB DUREEO DUREE tempo ; FR1 et FO2 sont allumes ; ; duree des feux ; On allume le feu rouge 1 et le feu rouge 2 et on eteint les autres feux movlw movwf movlw movwf call 22h PORTB DUREE2R DUREE tempo ; FR1 et FO2 sont allumes ; ; duree des feux ; On allume le feu vert 1 et le feu rouge 2 Orange clignotant et on eteint les autres feux bsf movlw movwf movlw movwf call bcf INTCON,T0IE 28h PORTB DUREEV ; DUREE tempo INTCON,T0IE ; autorise les interuptions debordement timer ; FR1 et FO2 sont allumes ; duree des feux ; inhibe les interruptions debordement timer ; On allume le feu orange 1 et le feu rouge 2 et on eteint les autres feux movlw movwf movlw movwf call 24h PORTB DUREEO ; DUREE tempo ; FR1 et FO2 sont allumes ; duree des feux ; On allume le feu rouge 1 et le feu rouge 2 et on eteint les autres feux movlw movwf movlw movwf call 22h PORTB DUREE2R ; DUREE tempo ; FR1 et FO2 sont allumes goto boucle ; feu permanent ;****************** ; SOUS PROGRAMME * ;****************** ; SP tempo ;********** ; duree des feux tempo movlw movwf 0x000A COMPT2 ; chargement de COMPT2 DE 10 ; movlw movwf 0x00C8 COMPT1 ; chargement de COMPT1 DE 200 ; movlw movwf 0x00A5 COMPT ; chargement de COMPT de 165 decfsz goto COMPT,1 delai ; Le temps de decompter 165 valeurs ; calcul du temps : 1 instruction =Tquartz/4=1µs delai2 delai1 delai =1 cycle ; l'instruction decfz est de 2 cycles ; 2 instructions = 3 µs repeter 165 fois t=495 µs + 2 inst =497µs decfsz instr dont 1 à 2 cycle goto les 5µs rstant COMPT1,1 ; ON execute la boucle de 497µs 200 fois + 2 delai1 ; calcul du temps : 500µs*200=100ms on neglige decfsz goto COMPT2,1 delai2 ; ON execute les boucles de 100 ms 10 fois ; calcul du temps : 100ms*10=1s decfsz goto DUREE,1 tempo ; ON execute les boucles de la valeur de duree ; calcul du temps : duree*100ms return ;******************************* ; SOUS PROGRAMME Interruption * ;******************************* ; SP debordement timer ;********************* timer decfsz goto COMPT3,1 fin ; Debordement toutes les 4,096ms ; Decompteur par 122 soit toutes les 0,5s movlw movwf 0x007A COMPT3 ; Init compteur btfss goto bcf goto PORTB,4 afin PORTB,4 fin bsf PORTB,4 bcf retfie INTCON,T0IF afin fin end ; Remise à zéro du drapeau interruption TMR0