;***************************************************************************** ;COMPOSANT : ATMEL AVR 8 Bits (RISC) - ATMega32 Quartz = 8 MHz ;PROGRAMME : Cligotant.asm ;VERSION : V 1.00 ;DATE : 10/05/2005 ;DERNIERE MAJ. : xx/xx/2005 ;DESCRIPTION : Exemple de clignotement d'une LED sur port A0 ;AUTEUR : Jean-Noël ;***************************************************************************** ; DIRECTIVES D'ASSEMBLAGE ;***************************************************************************** ;.DEVICE atmega32 ;Type de Microcontrôleur (définit dans l'include) .INCLUDE "m32def.inc" ;Fichier de définition du microcontrôleur ;***************************************************************************** ; PORTS D'ENTREES/SORTIES ;***************************************************************************** ; Port A0 Branché sur une LED ; A1 à A7 Libre ; Port B0 à B7 Libre ; Port C0 à C7 Libre ; Port D0 à D7 Libre ;***************************************************************************** ; CONSTANTES ;***************************************************************************** ; Pas de constante ;***************************************************************************** ; DEFINITIONS DE REGISTRES ;***************************************************************************** ; r0 à r15 Libre ; r16 à r20 Utilisé par le programme ; r21 à r25 Libre ; r26 à r31 Réservé pour registre X, Y, Z ;***************************************************************************** ; ORGANISATION RAM ;***************************************************************************** .DSEG .ORG $60 ;début de la mémoire disponible pour l'utilisateur (vous) vAlumer: .BYTE 1 ;Led alumé si = 1, éteinte si 0 ;***************************************************************************** ; INTERRUPTIONS ET RESET ;***************************************************************************** ; Même si les interruptions ne sont pas utilisées ces définitions doivent être déclarées .CSEG ;Segment de Code .ORG $0000 ;Positionnement au début de la mémoire jmp RESET ;Reset Handler jmp EXT_INT0 ;IRQ0 Handler jmp EXT_INT1 ;IRQ1 Handler jmp EXT_INT2 ;IRQ2 Handler jmp TIM2_COMP ;Timer2 Compare Handler jmp TIM2_OVF ;Timer2 Overflow Handler jmp TIM1_CAPT ;Timer1 Capture Handler jmp TIM1_COMPA ;Timer1 CompareA Handler jmp TIM1_COMPB ;Timer1 CompareB Handler jmp TIM1_OVF ;Timer1 Overflow Handler jmp TIM0_COMP ;Timer0 Compare Handler jmp TIM0_OVF ;Timer0 Overflow Handler jmp SPI_STC ;SPI Transfer Complete Handler jmp USART_RXC ;USART RX Complete Handler jmp USART_UDRE ;UDR Empty Handler jmp USART_TXC ;USART TX Complete Handler jmp ADC_COMP ;ADC Conversion Complete Handler jmp EE_RDY ;EEPROM Ready Handler jmp ANA_COMP ;Analog Comparator Handler jmp TWI ;Two-wire Serial Interface Handler jmp SPM_RDY ;Store Program Memory Ready Handler ;***************************************************************************** ; PROGRAMME PRINCIPAL (RESET) ;***************************************************************************** ;Initialise la pile en bas de la mémoire RAM en adresse 16 bits RESET: ldi r16, HIGH(RAMEND);Charge la valeur haute de l'adresse en fin mémoire RAM out SPH, r16 ;Positionne le pointeur de pile haut sur cette adresse ldi r16, LOW(RAMEND);Charge la valeur basse de l'adresse en fin mémoire RAM out SPL, r16 ;Positionne le pointeur de pile bas sur cette adresse ;----------------------------------------------------------------------------- ;Initialise du WatchDog (Chien de garde) pour éviter de bloquer le processeur (Facultatif) wdr ;Mis à 0 du compteur du Watchdog ldi r16, $0F ;WDE = 1 avec base de temps maximum 1900 ms out WDTCR, r16 ;Ecriture du registre du WatchDog ;----------------------------------------------------------------------------- ;Initialisation Port A ;PA0 = Led - PA1 à PA7 libres ser r16 ;Port en sortie (les bits du port sont mis à 1, soit en sortie) out DDRA, r16 ;Ecriture sur le clr r16 ;Port en bas (les bits du port sont mis à 0, Led éteinte) out PORTA, r16 ;Port A mis à zéro ;----------------------------------------------------------------------------- ;Fin d'initialisation wdr ;Réamorce le watchdog jmp Debut ;Fin d'initialisation, saute au début ;_____________________________________________________________________________ ;Interruptions non utilisées EXT_INT0: ;IRQ0 EXT_INT1: ;IRQ1 EXT_INT2: ;IRQ2 TIM2_COMP: ;Timer2 Comparaison TIM2_OVF: ;Timer2 Overflow TIM1_CAPT: ;Timer1 Capture TIM1_COMPA: ;Timer1 CompareA TIM1_COMPB: ;Timer1 CompareB TIM1_OVF: ;Timer1 Overflow TIM0_COMP: ;Timer0 Compare TIM0_OVF: ;Timer0 Overflow SPI_STC: ;SPI Transfer Complete USART_RXC: ;USART RX Complete USART_UDRE: ;UDR Empty USART_TXC: ;USART TX Complete EE_RDY: ;EEPROM Ready ADC_COMP: ;ADC Conversion Complète ANA_COMP: ;Analog Comparator TWI: ;Two-wire Serial Interface SPM_RDY: ;Store Program Memory Ready nop ;Ne rien faire dans cette interruption reti ;Fin de l'interruption ;***************************************************************************** ;_____________________________________________________________________________ ;Programme principal ;_____________________________________________________________________________ Debut: ;Programme principal ;Exemple, cligotement de la LED wdr ;Réamorce le WatchDog in r16, PORTA ;Lire Port A ldi r17, PA0 ;Le port A0 eor r16, r17 ;Inversion du bit 0 de r16 out PORTA, r16 ;Ecrir Port A0 ;Boucle d'attente de quelques dixième de seconde ldi r18, 250 ;Charge le temps d'attente primaire (125 µs) ldi r19, 200 ;Charge le temps d'attente secondaire (25 ms) ldi r20, 20 ;Charge le temps d'attente tertiaire (1/2 seconde) Attente: ;Attente 0,125 ns (Fréquence oscillateur à 8MHz) dec r18 ;Décrément de 1 de la variable r18 (125 ns) nop ;Attente d'un cycle d'horloge (125 ns) brne Attente ;Boucle sur Attente jusqu'à l'obtention d'un zéro dans r18 (250 ns) ;Boucle secondaire qui réutilise la boucle primaire de 125 µs pour attendre 25 ms ldi r18, 250 ;Réinitialise la boucle primaire dec r19 ;Décrémente de 1 la boucle secondaire brne Attente ;Boucle sur Attente jusqu'à l'obtention d'un zéro dans r19 ;Boucle tertiaire qui réutilise la boucle secondaire et primaire de 25 ms ldi r19, 200 ;Réinitialise la boucle secondaire dec r20 ;Décrémente de 1 la boucle tertiaire brne Attente ;Boucle sur Attente jusqu'à l'obtention d'un zéro dans r20 rjmp Debut ;Boucle infini sur le programme principal ;_____________________________________________________________________________