;______________________________________ ; GESTION DU PUITS ; Matériel : ATtiny 45/85 8MHz 5V ; HC-SR04 ; (c) sammy76.free.fr ;______________________________________ ; V1.0 ESSAI ; V2.0 MESURE ; V3.0 WATCHDOG ; V4.0 EEPROM WRITE ; V5.0 FLASH ROM WRITE ; ATtiny45 - 8MHz interne ; +-\/-+ ; PB5 1|- -|8 Vcc ;Trigger PB3 2|- -|7 PB2 SENSELED ; Echo PB4 3|- -|6 PB1 ; GND 4|- -|5 PB0 ; +----+ .CSEG .include "../includes/tn45def.inc" .equ SENSELED=PORTB2 ; SENSELED pin (Output on AVR) Objet détecte .equ TRIG=PORTB3 ; Sensor TRIG pin (Output on AVR, input on sensor) .equ ECHO=PORTB4 ; Sensor ECHO pin (Input on AVR, output on sensor) ;8MHz=> clk=1/8µs=0,125µs/clk ;Pour 10µs =>80clks ;(80-9-5)/3=24,7 soit 25xBDELAY .equ BDV10usCNT=22 ; Nombre d'itérations de BDELAY(3*BDV+5)+9 ;(50000µs-5)/3= 16665clks .equ WDV50msCNT=16665 ; WDELAY count for 50ms delay #4119 ;Le son vas à 340,19m/s soit A/R 170,10m/s ; 1E6µs 58,79µs/cm ;---------=58,79µs/cm soit en cycles ------------ =470,32 clks/cm ;17010cm/s 0,125µs/clks ;(470-9)/3=152 x BDELAY pour 1cm .equ BDV1cmCNT=152 ; Nombre d'itérations de BDELAY(3*BDV+5)+9 pour une résolution d'1cm. .equ mesure_temps=30 ; les mesures toutes les X min .equ time_wait=1 ;(mesure_temps*60)/8 ;225x8S pour 30min .equ PAGESIZEB = PAGESIZE*2 ;PAGESIZEB (PAGESIZE=32 pour ATtiny45) is page size in BYTES, not words FLASH RAM .equ MAX_SAVE=0xC0 ; Nombre de sauvegarde dans l'eeprom 192 (3x64 0x40) bytes soit 96h(4j) .def A = R16 ; GENERAL PURPOSE ACCUMULATOR .def BDV = R17 ; Counter used in BDELAY routine. .def DATA=R18 ; Data to EEPROM ou FLASH ou SRAM .def temp1=R19 ;Pour FLASH RAM (do_spm) .def temp2=R20 ;Pour FLASH RAM (do_spm) .org 0000 ;************************************************ ;* Interrupt Vectors * ;************************************************ zRESET: ; Reset Handler rjmp ON_RESET zINT0addr: ; External Interrupt 0 reti zPCI0addr: ; Pin change Interrupt Request 0 reti zOC1Aaddr: ; Timer/Counter1 Compare Match 1A reti zOVF1addr: ; Timer/Counter1 Overflow reti zOVF0addr: ; Timer/Counter0 Overflow reti zERDYaddr: ; EEPROM Ready reti zACIaddr: ; Analog comparator reti zADCCaddr: ; ADC Conversion ready reti zOC1Baddr: ; Timer/Counter1 Compare Match B reti zOC0Aaddr: ; Timer/Counter0 Compare Match A reti zOC0Baddr: ; Timer/Counter0 Compare Match B reti zWDTaddr: ; Watchdog Time-out rjmp WDTinterrupt zUSI_STARTaddr: ; USI START reti zUSI_OVFaddr: ; USI Overflow reti ;______________________________________ ; SETUP ;______________________________________ ON_RESET: ldi A, LOW(RAMEND) ;Setup of stack pointer 0x15F out SPL, A ldi A, HIGH(RAMEND) out SPH, A ldi A,0b10000000 ;Attention, ces 2 instructions sont importantes pour le changement de fréquence (sécurité AVR) out CLKPR,A ldi A,0b00000000 ;divise par 1 le clock RC de 8MHz, donc 8MHz out CLKPR,A ;Eteint le CAN cbi ADCSRA, ADEN ;switch Analog to Digitalconverter OFF ; rcall WDT_on ;Set le watchdog rcall WDT_off ;Stop le watchdog ;Configure les sorties ldi A, (1<=1 (>511cm); objet non détecté brge MAINWAIT tst XL breq MAINWAIT ;Si 0 pas d'objet OBJETOK: rcall sauvegarde ;SBI PORTB,SENSELED ; Allume la Led SENSELED Objet détecté. rjmp MAINWAIT MAINWAIT: ldi A,time_wait ;225x8S pour 30min BOUCLE: ;Pause de 8s Push A rcall WDT_on ; Watch dog on ldi A,(1<=1 brge GEPret ; 1/2 If CNT overflows to zero, exit routine. ; Timing: false:1clk, true:2clk ldi BDV,BDV1cmCNT ; 1 Charge le compteur de délai rcall BDELAY ; 4 *time is 9+(5+3x(BDVxxxCNT)) incl. setting BDV and this rcall. ; BDVxxxCNT=(470-9-5)/3=152. sbic PINB, ECHO ; 1/2 Check ECHO pin. If no ECHO, skip over next instruction. ; Timing: false:1clk, true:2clk rjmp GEP1 ; 2 GEPret: ret ; 4 ;______________________________________ ; BDELAY ; A simple 1-byte loop delay ; See notes above for timing specifications ; BDV must be loaded with timing count before this routine is called! BDELAY: ; 3 # of clks to call here (3*BDV+6) dec BDV ; 1 Decrement counter brne BDELAY ; 2 Loop back up if not zero ; Timing: false:1clks, true:2clks ret ; 4 Else return ;______________________________________ ; WDELAY ; A simple 2-byte (Word) loop delay ; See notes above for timing specifications ; XH and XL must be pre-loaded with desired n *before* this routine is called as follows: ; ldi XH, HIGH(n) ; ldi XL, LOW(n) ; rcall WDELAY WDELAY: ; *3 +5 sbiw XH:XL,1 ; 2 Word-level decrement brne WDELAY ; 1/2 Loop back up if not zero ; Timing: false:1clks, true:2clks ret ; 4 Else return ;___________________________________________ ; RECUPERE L'ADRESSE DANS L'EEPROM (YL) ; SAUVEGARDE LA DONNEE-100cm (XH:XL) ;___________________________________________ ; RECUPERE L'ADRESSE DANS L'EEPROM (00:YL) sauvegarde: ;Départ EEPROM ;Lit Les 2 premiers octets pour l'adresse ou écrire ;EEPROM_readAnything(0, adr); ser YL ;YL=FF rcall EEPROM_read ;Read EEPROM (00:FF)->DATA (YL) mov YL,DATA ; SAUVEGARDE LA DONNEE-100cm dans OO:YL inc_adr: inc YL ;Adresse de sauvegarde +1 ldi A,MAX_SAVE cp A,YL ;if (0xBF>=YL) ; ;En fonction de la taille mémoire brsh save_adr ;si >= alors save_adr ;Sauvegarde dans RAM FLASH rcall save_flash clr YL ;YL=00 RETOURNE A LA VALEUR 0 save_adr: ;Sauve l'adresse en 0xFF mov DATA,YL ;DATA=YL ser YL ;YL=FF rcall EEPROM_write ;write EEPROM (00:FF)<-DATA (YL) mov YL,DATA ;Déduit 100cm sbiw XH:XL,63 ;Si dist=dist-100 (63+37) brmi save_data3 ;si<0 sbiw XH:XL,37 ; brpl save_data1 ;si >0 save_data3: clr XL ;Sinon XL 0 si (dist-100)<0 clr XH save_data1: tst XH ;Si XH=0 sauve breq save_data2 ser XL ;sinon XL=maxi (0xFF) save_data2: mov DATA,XL rcall EEPROM_write ret ;_______________________ ; END SAUVEGARDE ;_______________________ ;___________________________________________ ; SAUVEGARDE FLASH de 0x00 à 0xBF ; DANS RAM FLASH de 0x0200 à 0x7FF par plage de 32 mots ;___________________________________________ save_flash: ;Récupère l'adresse de la FLASH RAM dans ZH:ZL ldi YL,0xFD ;YL=FD rcall EEPROM_read ;Read EEPROM (00:FD)->DATA (ZH) mov ZH,DATA rcall EEPROM_read ;Read EEPROM (00:FE)->DATA (ZL) mov ZL,DATA clr YH clr YL ldi temp1,3 wrloop: push ZH push ZL ;write_page: ;Efface la page pointé par Z ldi A, (1<DATA (ZH) mov r0,DATA rcall EEPROM_read ;Read EEPROM (00:FD)->DATA (ZH) mov r1,DATA ldi A, (1<=ZH brsh save_adr_flash ;si >= ldi ZH,0x02 ;RAZ adr ZH:ZL clr ZL save_adr_flash: ldi YL,0xFD mov DATA,ZH rcall EEPROM_write ;DATA (00)->EEPROM (00:FD) ZH inc YL mov DATA,ZL rcall EEPROM_write ;DATA (00)->EEPROM (00:FE) ZL ret ;_______________________ ; END SAUVEGARDE ;_______________________ ; Interruption du timeout du watchdog. On retourne simplement juste après le "sleep" ! WDTinterrupt: reti ;***** Include modules .include "watchdog.asm" .include "eeprom_V5.asm" ;______________________________________ ; END OF PROGRAM ; ;______________________________________ .ESEG .org 0xc0 buildtime: .db "sammy76.free.fr " .db "V5.00:%DAY%.%MONTH%.%YEAR% %HOUR%:%MINUTE%" .org 0xfd .db 02,00,0x00