;======================================================================= ; Fichier : pilote_servo.asm ; Titre: BASE DE PROGRAMMATION ; Version: 1.0 ; Auteur: Silicium628 ; Date: 26/06/2007 ;======================================================================= ;DECLENCHEUR manuel et automatique pour appareil photo numerique ;en mode manuel, permet de declencher sans toucher l'appareil afin d'eviter toutes vibrations (appareil utilise sur un petit telescope) ;en mode automatique, permet de realiser des films tres fortement acceleres en recreant un .avi (ou gif anime etc...) a partir des images ;(formation et deplacement des nuages, mouvement des vegetaux, pousse d'une fleur, deplacement de l'ombre du soleil etc...) ; ;======================================================================= ;PRINCIPE ;actionne un servo-moteur (tels que ceux utilises en aeromodelisme ou en robotique) pour appuyer DOUCEMENT sur le declencheur de l'APN ;soit; ;-au coup par coup commande par un bouton poussoir ;-soit automatiquement avec une periode (10s, 30s, 1mn , 5mn, 10mn) selectionnable par 3 pontets ;======================================================================= ;LISTE DES PARTIES: ;Déclaration des Variables ;MACROS ;Déclaration des Vecteurs d'interruptions ;Routines de traitement des interruptions ;Programme de RESET ;initialisation des ports ;PROGRAMME PRINCIPAL ;ROUTINES ;======================================================================= .include "m8def.inc" ; nom du fichiers de références des registres (ATMEGA 8) ;------------------------------------------------------------------------ ;Déclaration des Variables ;------------------------------------------------------------------------ .def T0 = r4 .def T1 = r5 .def compte1 = r6 .def postdiv = r7 .def periode1 = r8 .def SAUVREG = r15 ; registre de sauvegarde de SREG .def F1 = r16 ;"mesflags1" ;F1[0]= declenchement auto INTERDIT ;F1[1]= decrementation compte1 ;F1[2]= ;F1[3]= ;F1[4]= .def a = r17 .def AA = r18 .def BB = r19 .def AL = r18 .def AH = r19 .def BL = r20 .def BH = r21 ;r26,27 reserve comme registre d'adresse d'indexation (X) ;r30,31 reserve comme registre d'adresse d'indexation (Z) permet la lecture en memoire de programme .DSEG nombre1: .BYTE 3 ;nombre code sur 3 octets (binaire) 0...16 777 216 nombre2: .BYTE 3 ;"" dividende: .BYTE 3 numerateur: .BYTE 1 denominateur: .BYTE 1 ;------------------------------------------------------------------------ ;MACROS ;------------------------------------------------------------------------ ;cette macro fait @0(variable en RAM, 24bits) := @1 valeur(24bits) pasee en parametre .MACRO Mset24 ldi a,BYTE1(@1) sts @0+0,a ldi a,BYTE2(@1) sts @0+1,a ldi a,BYTE3(@1) sts @0+2,a .ENDMACRO ;------------------------------------------------------------------------ ;cette macro fait @0(variable en RAM, 24bits) := r20,21,22 .MACRO Mstore24 sts @0+0,r20 sts @0+1,r21 sts @0+2,r22 .ENDMACRO ;------------------------------------------------------------------------ ;cette macro fait 3 registres successifs := @0 (variable en RAM, 24bits, pasee en parametre) .MACRO Mload24 lds r20,@0+0 lds r21,@0+1 lds r22,@0+2 .ENDMACRO ;------------------------------------------------------------------------ ;Déclaration des Vecteurs d'interruptions ;------------------------------------------------------------------------ .CSEG .ORG 0x0000 ;début zone mémoire programme rjmp RESET ;RESET rjmp EXT_INT0 ;Interruption externe INT0 rjmp EXT_INT1 ;Interruption externe INT1 rjmp TIM2_COMP ;Interrution comparaison réussie TIMER2 rjmp TIM2_OVF ;Interrution débordement compteur TIMER2 rjmp TIM1_CAPT ;Interrution entrée capture TIMER1 rjmp TIM1_COMPA ;Interrution comparateurA TIMER1 rjmp TIM1_COMPB ;Interrution comparateurB TIMER1 rjmp TIM1_OVF ;Interrution débordement compteur TIMER1 rjmp TIM0_OVF ;Interrution débordement compteur TIMER0 rjmp SPI_STC ;Interrution transmissions SPI terminée rjmp UART_RXC ;Interrution réception UART terminé RX rjmp UART_DRE ;Interrution UART vide rjmp UART_TXC ;Interrution émission UART terminé TX rjmp ADC_ok ;Interrution Conversion A/D terminée rjmp EE_RDY ;Interrution EEPROM prête rjmp ANA_COMP ;Interrution comparaison analogique effectuée ;------------------------------------------------------------------------ ;Routines de traitement des interruptions ;------------------------------------------------------------------------ EXT_INT0: reti ;------------------------------------------------------------------------ EXT_INT1: reti ;------------------------------------------------------------------------ TIM2_COMP: reti ;------------------------------------------------------------------------ TIM2_OVF: reti ;------------------------------------------------------------------------ TIM1_CAPT: reti ;------------------------------------------------------------------------ ;genere duree implulsion de voie PPM (1ms) ; OBSOLETE :declencheur automatique a intervales reguliers TIM1_COMPA: in sauvreg,sreg push sauvreg push a cbi portb,0 ;fin d'impulsion PPM pop a pop sauvreg out sreg,sauvreg reti ;------------------------------------------------------------------------ TIM1_COMPB: reti ;------------------------------------------------------------------------ ;------------------------------------------------------------------------ TIM1_OVF: reti ;------------------------------------------------------------------------ ;Genere la periode de recurence du signal PPM (16ms), la periode de declenchement auto, et bride la nervosite du servo TIM0_OVF: in sauvreg,sreg push sauvreg push a bst F1,1 brtc suite3 dec compte1 ;a chaque decrementation de compte1 le servo tounera d'un angle dx ;la frequence a laquelle on passe ici determine donc la nervosite du servo (et la bride volontairement) suite3: sbrc F1,0 ;declenchement auto interdit? rjmp suite4 ;oui dec T0 brne suite4 ldi a,203 ;periode de declenchement auto, etage1 mov T0,a dec T1 brne suite4 mov T1,periode1 ;periode de declenchement auto, etage2 (16e6 Hz/1024/256/203/3=0.10022Hz) ldi a,80 ;recharge de la duree de declenchement (provoque 1 declenchement auto) mov compte1,a suite4: ldi a,0 out TCNT1H,a ;RAZ Timer1 qui sert a generer la duree d'impulsion out TCNT1L,a sbi portb,0 fin_t0: pop a pop sauvreg out sreg,sauvreg reti ;------------------------------------------------------------------------ SPI_STC: reti ;------------------------------------------------------------------------ UART_RXC: reti ;------------------------------------------------------------------------ UART_DRE: reti ;------------------------------------------------------------------------ EE_RDY: reti ;------------------------------------------------------------------------ ANA_COMP: reti ;------------------------------------------------------------------------ ADC_ok: reti ;------------------------------------------------------------------------ UART_TXC: reti ;------------------------------------------------------------------------ UART_RXC1: reti ;------------------------------------------------------------------------ ;------------------------------------------------------------------------ ;Programme de RESET ;------------------------------------------------------------------------ nop texte: .DB 'P','I','L','O','T','E' ;Pour reperer facilement le bon .ASM dans PonyProg! ;(evite de grosses meprises lorsque je travaille sur plusieurs softs en meme temps...) RESET: ldi a,low(RAMEND) out SPL,a ; Initialisation de la pile à ldi a,high(RAMEND) ; l'adresse haute de la SRAM out SPH,a ;------------------------------------------------------------------------ ;initialisation des ports ldi a,0b11111111 ;toutes en sorties ; PB0 = sortie signal PPM out ddrb,a ldi a,0b11110000 ;PD0,1,2,3 en entree out ddrd,a ldi a,0b11111111 ;R de tirage out portd,a ldi a,0b11111111 ;toutes en sorties out ddrc,a clr a out portc,a ;sorties = 0 cbi portb,1 ;RAZ signal de depassement de vitesse ;------------------------------------------------------------------------ ;wachtdog ; wdr ; ldi a,0b00001111 ; wachtdog enable; delai = 2s (voir p:82) ; out wdtcr,a wdr ldi a,0b00011111 out wdtcr,a ldi a,0b00010111 out wdtcr,a ; disable le wachtdog. (voir p:83) ;------------------------------------------------------------------------ ;TIMSK ;Timer Interrupt Mask; voir pdf p:70 ;bit7 (OCIE2) ;bit6 (TOIE2) ;bit5 (TICIE1) Timer/Counter1, Input Capture Interrupt Enable ;bit4 (OCIE1A) Timer/Counter1, Output Compare A Match Interrupt Enable ;bit3 (OCIE1B) Timer/Counter1, Output Compare B Match Interrupt Enable ;bit2 (TOIE1) Timer/Counter1, Overflow Interrupt Enable ;bit1 inutilise ;bit0 (TOIE0) Timer/Counter0 Overflow Interrupt Enable - voir Tavernier p:96 ; 76543210 ldi a,0b00010001 ;Timer0 Overflow Interrupt Enable out TIMSK,a ;------------------------------------------------------------------------ ;TCCR0 voir Tavernier p:87 et pdf p:70 ;definit le mode de fonctionnement du Timer0 ;bits7a3 = non utilise ;bits2,1,0 = taux de predivision de l'horloge ;16MHz/1024 = 15625 Hz ; 76543210 ldi a,0b00000101 ;1/1024 out TCCR0,a ;------------------------------------------------------------------------ ;TCCR1A ;definit le mode de fonctionnement du Timer1 ;voir Tavernier p:93 ;bit7 (COM1A1) ;definit le comportement de la sortie OC1A ;bit6 (COM1A0) ;bit5 (COM1B0) ;bit4 (COM1B1) ;bit3,2 NC ;bit1 (PWM11) ;bit0 (PWM10) ; 76543210 ldi a,0b00000000 ;voir tableau Tavernier p:93 out TCCR1A,a ;------------------------------------------------------------------------ ;TCCR1B ;definit le mode de fonctionnement du Timer1 ;voir Tavernier p:94-95 ;et p:81-82 du datasheet.pdf ;bit7 (ICNC1): enable/disable reducteur de bruit ;bit6 (ICES1)=1: transfert du registre de comptage TCNT1 dans le registre de capture ICR1 sur front montant du pin ICP ;bit5 : inutilise ;bit4 : inutilise ;bit3 (WGM12 ou CTC1): raz registre de comptage (TCNT1) apres comparaison ;bits2,1,0: taux de predivision applique a l'horloge systeme. voir Tavernier p:95 et pdf p:98 ; 76543210 ldi a,0b00000010 ;clk/8 pour le Timer1; out TCCR1B,a ;------------------------------------------------------------------------ ;MCUCR ;voir datasheet p:31 ;bits[3,2] -> ISC11 ISC10 Description ;0 0 The low level of INT1 generates an interrupt request. ;0 1 Any logical change on INT1 generates an interrupt request. ;1 0 The falling edge of INT1 generates an interrupt request. ;1 1 The rising edge of INT1 generates an interrupt request. ;bits[1,0] -> ISC01 ISC00 Description ;0 0 The low level of INT0 generates an interrupt request. ;0 1 Any logical change on INT0 generates an interrupt request. ;1 0 The falling edge of INT0 generates an interrupt request. ;1 1 The rising edge of INT0 generates an interrupt request. ; 76543210 ldi a,0b00000000 out MCUCR,a ;voir p:64 du datasheet.pdf et Tavernier p:30 ;------------------------------------------------------------------------ ;GICR (GENERAL INTERRUPT CONTROL REGISTER) ;page 47 et 65 du datasheet ;bit 7 = INT1 enable ;bit 6 = INT0 enable ; 76543210 ldi a,0b00000000 out GICR,a ;------------------------------------------------------------------------ ;chargement du registre de comparaison (A) du Timer1 ; cli ldi AL,LOW(2000) ldi AH,HIGH(2000) out OCR1AH,AH out OCR1AL,AL ;chargement du registre de comparaison (B) du Timer1 ; ldi r20,LOW(10) ; ldi r21,HIGH(10) ; out OCR1BH,r21 ; out OCR1BL,r20 ; ;------------------------------------------------------------------------ ;zone de tests de procedures ;------------------------------------------------------------------------ ;PROGRAMME PRINCIPAL ;------------------------------------------------------------------------ initvar: ldi F1,0b00000001 ;declenchement auto interdit ldi a,160 mov r0,a ldi a,12 mov r1,a ldi a,0 mov compte1,a ldi a,255 mov T0,a ldi a,1 mov periode1,a mov T1,a sei ;Sets the Global Interrupt flag (I) in SREG (status register) ;------------------------------------------------------------------------ ;BOUCLE PRINCIPALE bcl_0: in a,pind ;lecture de la configuration des trois pontets determinant la periode de declenchement auto. andi a,0b00000111 ;masque cpi a,0 breq suite00 ;pas de declenchement auto cpi a,1 breq t10s cpi a,2 breq t30s cpi a,3 breq t1mn cpi a,4 breq t5mn cpi a,5 breq t10mn ;declenchement auto, periode 10s t10s: ldi a,3 mov periode1,a rjmp finchar ;declenchement auto, periode 30s t30s: ldi a,9 mov periode1,a rjmp finchar ;declenchement auto, periode 1mn t1mn: ldi a,18 mov periode1,a rjmp finchar ;declenchement auto, periode 5mn t5mn: ldi a,90 mov periode1,a rjmp finchar ;declenchement auto, periode 10mn t10mn: ldi a,180 mov periode1,a rjmp finchar finchar: andi F1,0b11111110 ;declenchement auto autorise rjmp suite01 ;---------------------------------------- suite00: ori F1,0b00000001 ;interdit declenchement auto suite01: mov a,compte1 ;si compte1<>0 -> on declenche (lentement pour eviter les vibrations) cpi a,0 breq suite02 ori F1,0b00000010 ;demande de decrementation de compte1 rjmp dur1 suite02: andi F1,0b11111101 ;decrementation de compte1 interdite sbic pind,3 ;declenchement manuel - test bouton poussoir sur pind,0 rjmp dur0 ;bouton relache ldi a,80 ;bouton appuye, on recharge la duree de declenchement (la valeur 80 determine cette duree) mov compte1,a rjmp dur1 ;les valeurs de BH,L suivantes determinent les positions extremes de la course du servo ; (a adapter au cas par cas suivant le servo utilise) dur0: ldi BL,LOW(1600) ;valeur de la duree mini de l'impulsion PPM ldi BH,HIGH(1600) rjmp go ;on va faire tendre lentement 'duree' vers 'but' dur1: ldi BL,LOW(2200) ;valeur de la duree maxi de l'impulsion PPM ldi BH,HIGH(2200) rjmp go go: rcall cp16 ;(compare AH,L a BH,L) breq fin_bcl0 brsh plus brlo moins plus: rcall dec16 ;rotation LENTE du servo sens + rjmp outVal moins: rcall inc16 rjmp outVal outVal: out OCR1AH,AH out OCR1AL,AL rcall tp1ms fin_bcl0: rjmp bcl_0 ;------------------------------------------------------------------------ ;ROUTINES ;------------------------------------------------------------------------ ;------------------------------------------------------------------------ ;.include "EEPROM.inc" ;------------------------------------------------------------------------ ;.include "affi_LCD.inc" ;------------------------------------------------------------------------ .include "tempos1_16MHz.inc" ;------------------------------------------------------------------------ .include "math1.inc" ;------------------------------------------------------------------------