Hallo,
ich möchte gerne den Abstand zwischen zwei mal Taste drücken (angeschlossen an ICP1 an einem ATmega8) messen:
.include "AVR.H"
;------------------------------------------------------------------------
;Reset and Interruptvectoren ;VNr. Beschreibung
begin: rjmp main ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
rjmp on_ICP ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
rjmp on_TC1 ;9 TC1 Overflow
reti ;10 TC0 Overflow
reti ;11 SPI, STC Serial Transfer Complete
reti ;12 UART Rx Complete
reti ;13 UART Data Register Empty
reti ;14 UART Tx Complete
reti ;15 ADC Conversion Complete
reti ;16 EEPROM Ready
reti ;17 Analog Comperator
reti ;18 TWI (I²C) Serial Interface
reti ;19 Store Program Memory Ready
;------------------------------------------------------------------------
;Start, Power ON, Reset
main: ldi r16,lo8(RAMEND)
out SPL,r16 ;Init Stackpointer LO
ldi r16,hi8(RAMEND)
out SPH,r16 ;Init Stackpointer HI
sbi UCSRB,4 ;UCR=UCSRB=0x0B RXEN=Bit4 RX aktivieren
sbi UCSRB,3 ;UCR=UCSRB=0x0B UDRE=Bit3 TX aktiv
ldi r16,3686400/(38400*16)-1 ;Baudrate 38400 einstellen
out UBRRL,r16
ldi r16,0b00000001
out DDRB,r16
ldi r16,0b00000001
out PORTB,r16
ldi r16,0
out TCCR1A,r16
ldi r16,0b01000001
out TCCR1B,r16 ;Timer1 setup Clock
ldi r16,0b00100100
out TIMSK,r16 ;Interrupt Timer1 bei overflow
ldi r26,0
ldi r27,hi8(RAMEND)
subi r27,2
ldi r28,0
ldi r29,hi8(RAMEND)
subi r29,2
sei ;erlaube Interrupts
;------------------------------------------------------------------------
mainloop: wdr
rjmp mainloop
;------------------------------------------------------------------------
putChar: sbis UCSRA,5 ;USR Bit5 = UDRC
rjmp putChar ;warten, bis UDR bereit
out UDR,r16
ret ;zurück zum Hauptprogramm
;------------------------------------------------------------------------
on_TC1: cli
push r16
ldi r16,129
rjmp putChar
pop r16
sei
reti
;------------------------------------------------------------------------
on_ICP: cli
push r16
ldi r16,ICR1L
rjmp putChar
ldi r16,ICR1H
rjmp putChar
pop r16
sei
ret
Meine Idee ist:
Bei jedem Overflow des Counter1 wird ein Interrupt ausgeführt, dieser gibt 0h81 an die serielle Schnittstelle aus. Das scheint auch ganz gut zu funktionieren.
Wenn der Taster gedrückt wurde (ich würde hier gerne auf die steigende Flanke triggern), soll der aktuelle Wert des Counters ausgegeben werden. Hier hakt es jedoch und der µC gibt nur Mist aus (meist nur ein Wert, und zwar 0h26). Kann mir da jemand helfen?