Zum Inhalt springen

[AVR] Interruptprogrammierung, Zähler


beebof

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...