;| Prozessor : ATtiny45 ;| Takt : 8 MHz internal ;| Sprache : Assembler ;| Datum : 091214 ;| Version : VER4.3 ;| Autor : ... ;+----------------------------------------------------------------------------- .include "tn45def.inc" ;------------------------------------------------------------------------------ begin: rjmp main ; RESET External Pin, Power-on Reset, Brown-out Reset,Watchdog Reset rjmp messstart ; INT0 External Interrupt 0 reti ; PCINT0 Pin change Interrupt Request 0 reti ; TIMER1_COMPA Timer/Counter1 Compare Match 1A reti ; TIMER1_OVF Timer/Counter1 Overflow rjmp zehnus ; TIMER0_OVF Timer/Counter0 Overflow reti ; EE_RDY EEPROM Ready reti ; ANA_COMP Analog comparator reti ; ADC ADC Conversion ready reti ; TIMER1_COMPB Timer/Counter1 Compare Match B reti ; TIMER0_COMPA Timer/Counter0 Compare Match A reti ; TIMER0_COMPB Timer/Counter0 Compare Match B reti ; WDT Watchdog Time-out reti ; USI_START USI START reti ; USI_OVF USI Overflow ;------------------------------------------------------------------------------ main: ldi r16, low(RAMEND) ; Stackpointer initialisieren out SPL, r16 ldi r16, high(RAMEND) out SPH, r16 ldi r16,0b00011011 out DDRB,r16 ; PB0,PB1,PB3,PB4= Ausgang, PB2= Eingang sbi PORTB,2 ; Pull Up für PB2 ldi r16,0b01000000 out GIMSK,r16 ; INT0 (Pin 7) wird aktiviert ldi r16,0b00000010 out MCUCR,r16 ; INT0 löst bei fallender Flanke int. aus ldi r16,0b00000010 out TCCR0B,r16 ; Vorteiler Timer 0 auf 8 ldi r18,0 ; Zählregister auf 0 sei ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ mainloop: in r20,PINB sbrc r20,2 ; überspringe solange PINB2= low (messzeit läuft) rjmp auswert ; messung beendet, auswertung beginnt rjmp mainloop ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ messstart: in r25,SREG ; sicherung des Statusregisters push r25 ldi r18,0 ; löschen des Zählregisters für neue messung ldi r17,247 ; (247) 8 schritte bis nulldurchgang für 10us out TCNT0,r17 ; aufwärtszähler wird mit ausgangswert geladen ldi r16,0b00000010 out TIMSK,r16 ; Timer 0 Interupt bei Overflow EIN (10us zeit) pop r25 out SREG,r25 ; Statusregister wieder Herstellen reti ;------------------------------------------------------------------------------ zehnus: in r25,SREG ; sicherung des Statusregisters push r25 inc r18 ; erhöhe messregister um 1 out TCNT0,r17 ; aufwärtszähler wird mit ausgangswert (10us) geladen pop r25 out SREG,r25 ; Statusregister wieder Herstellen reti ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ auswert: ldi r16,0b00000000 out TIMSK,r16 ; Timer 0 Interupt bei Overflow AUS cpi r18,150 ; vergleiche Zählregister mit 150 brlo aus ; verzweige bei kleiner als 150 brsh ein ; verzweige bei grösser/ gleich als 150 ;------------------------------------------------------------------------------ aus: ldi r27,0b00001100 ; LED grün aus, LED rot an out PORTB,r27 rjmp mainloop ;------------------------------------------------------------------------------ ein: ldi r27,0b00010111 ; LED grün an, LED rot aus out PORTB,r27 rjmp mainloop ;------------------------------------------------------------------------------