beebof Geschrieben 19. September 2007 Geschrieben 19. September 2007 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? Zitieren
beebof Geschrieben 21. September 2007 Autor Geschrieben 21. September 2007 So, ich habs raus. on_ICP: in r2,SREG push r16 in r16,ICR1L rcall putChar in r16,ICR1H rcall putChar pop r16 out SREG,r2 reti So muss es aussehen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.