Mikrocontroller und Digitale Elektronik
›
Thread
Ich werde irre ;-) (Timer compare match interrupt)
Hallo zusammen,
ich brauche mal einen kleinen Schubbs in die richtige Richtung. Ich weiß, das klingt lächerlich, aber ich sitze schon seit einer gefühlten Ewigkeit daran und versuche auf einem ATmega8 (derzeit erstmal nur testhalber) einen Compare Match Interrupt zum laufen zu bringen.(Zu meiner Entschuldigung muss ich sagen, ich habe eine ganze Zeit nichts mit Controllern gemacht und jetzt hänge ich irgendwie fest. heul
Der ATmega8 soll an PORTD,7 (Port ist auf Ausgang konfiguriert) beim ersten Interrupt (nach ca. einer Sekunde) eine LED einschalten und beim nächsten Interrupt (wieder nach ca. einer Sekunde) die LED wieder ausschalten und so weiter und so fort.
Ich liste Euch mal die wichtigen Teile des Codes auf, vielleicht kann einer von mal drüber gucken und mich in die richtige Richtung schubbsen. ;-)
Interrupt-Vektor ist gesetzt.
1
. include "m8def.inc"
2
; ------------------------------------------------------------------------
3
; Reset and Interrupt vector ; VNr . Beschreibung
4
.
5
.
6
rjmp HELLIGKEIT ; 8 TC1 Compare Match B
7
.
8
.
Den Timer habe ich folgendermaßen konfoguriert:
1
ldi temp , 0 b00000000
2
out TCCR1A , temp
3
4
ldi temp , 0 b00001101
5
out TCCR1B , temp ; CTC und Prescaler auf 1024
6
7
; Timer soll bis 1000 ( dez ) z ä hlen , das macht bei 1 MHz gut eine Sekunde ( 1 , 024 Sekunden um genau zu sein ).
8
9
ldi r16 , 0 b00000011
10
ldi r17 , 0 b11101000
11
out OCR1BH , r16 ; lade Comparewert 3 ( dez ) ins H - Byte
12
out OCR1BL , r17 ; lade Comparewert 232 ins L - Byte
13
14
ldi temp , 0 b0001000
15
out TIMSK , temp ; aktiviere Output Compare B Match Interrupt
Die Mainloop ist völlig simpel (ist ja nur zum Testen:
1
mainloop: wdr
2
rjmp mainloop
...und hier die Interrupt-Routine:
1
; ---------- LED - Interruptroutine --------------------------------------
2
LED :
3
sbic PORTD , 7 ; springe wenn LED "AUS"
4
rjmp AUS ; gehe zu "AUS"
5
rjmp EIN ; gehe zu "EIN"
6
AUS :
7
cbi PORTD , 7 ; schalte LED aus
8
reti ; zur ü ck
9
10
EIN :
11
sbi PORTD , 7 ; schalte LED ein
12
reti ; zur ü ck
Die LED blinkt ums verrecken nicht. Sie schaltet nach einen Reset nach der richtigen Zeit ein und bleibt dann eingeschaltet. (Verlängere ich die Zeit durch vergrößeren der OCR1B Werte schaltet sich die LED später ein, aber sie schaltet sich nicht mehr aus.
Ich bin sicher ich habe irgendwo, irgendeine Kleinigkeit übersehen und mich dann in einer "Endlosschleife" verrannt und brauche tatsächlich nur einen kleinen Schubbs in die richtige Richtung.
Viele Grüße
Michael
Michael K. schrieb:
Interrupt-Vektor ist gesetzt.
Bitte kompletten Source als Anhang posten.
Ich sehe dort nicht, wie die Vektoren korrekt gesetzt sind.
Vor allem der Stackpointer…
Oliver
Kenne mich jetzt mit ATmega nicht so aus, aber Interrupts müssen allgemein freigegeben werden - Stichwort: SEI
Dieser CTC hat OC1a als Top. Wenn die kleiner als b sind wird er keinen weiteren int auslösen.
Guten Morgen zusammen,
sorry, dass ich mich erst jetzt melde...
Hier zuerst mal mein aktueller, kompletter Code:
1
. include "m8def.inc"
2
; ------------------------------------------------------------------------
3
; Reset and Interrupt vector ; VNr . Beschreibung
4
rjmp main ; 1 POWER ON RESET
5
reti ; 2 Int0 - Interrupt
6
reti ; 3 Int1 - Interrupt
7
reti ; 4 TC2 Compare Match
8
reti ; 5 TC2 Overflow
9
reti ; 6 TC1 Capture
10
reti ; 7 TC1 Compare Match A (
11
rjmp LED ; 8 TC1 Compare Match B
12
reti ; 9 TC1 Overflow
13
reti ; 10 TC0 Overflow
14
reti ; 11 SPI , STC Serial Transfer Complete
15
reti ; 12 UART Rx Complete
16
reti ; 13 UART Data Register Empty
17
reti ; 14 UART Tx Complete
18
reti ; 15 ADC Conversion Complete
19
reti ; 16 EEPROM Ready
20
reti ; 17 Analog Comparator
21
reti ; 18 TWI ( I ² C ) Serial Interface
22
reti ; 19 Store Program Memory Ready
23
; ------------------------------------------------------------------------
24
main :
25
; Start , Power ON , Reset
26
init :
27
ldi temp , HIGH ( RAMEND ) ; HIGH - Byte der obersten RAM - Adresse
28
out SPH , temp
29
ldi temp , LOW ( RAMEND ) ; LOW - Byte der obersten RAM - Adresse
30
out SPL , temp
31
32
; ================================================================
33
; Ports initialisieren
34
; ----------------------------------------------------------------
35
36
sbi DDRD , 7 ; Port auf Ausgang
37
cbi PORTD , 7 ; Port auf H ü ber Pullup
38
39
40
; --------------------------------------------------------------------------------------
41
; Zuordnung der Register u . Laden von Vorgaben
42
; --------------------------------------------------------------------------------------
43
. def temp = r16
44
45
; ------------------------------------------------------------------------
46
; TC1 - Timer Compare Match Interrupt setzen
47
; ------------------------------------------------------------------------
48
cli
49
ldi temp , 0 b00000000
50
out TCCR1A , temp ; setze Compare Output Mode for channel A
51
52
ldi temp , 0 b00001101
53
out TCCR1B , temp ; CTC und Prescaler auf 1024
54
55
ldi temp , 0 b00000011
56
ldi r17 , 0 b11101000
57
out OCR1BH , temp ; lade Comparewert 3 ( dez ) ins H - Byte
58
out OCR1BL , r17 ; lade Comparewert 232 ( dez ) ins L - Byte
59
60
ldi temp , 0 b0001000
61
out TIMSK , temp ; aktiviere Output Compare B Match
62
63
64
65
66
sei
67
68
mainloop : wdr
69
rjmp mainloop
70
71
; ---------- LED - Interruptroutine -----------------------------------------------
72
LED :
73
sbic PORTD , 7
74
rjmp AUS
75
rjmp EIN
76
AUS :
77
cbi PORTD , 7
78
reti
79
80
EIN :
81
sbi PORTD , 7
82
reti
@ MaWin O.:
Anhang in welchem Datei-Format? ist *.s OK?
Viele Grüße
Michael
Michael K. schrieb:
ldi temp,0b0001000 <---- da fehlt 'ne Ziffer, sind nur 7
out TIMSK,temp ; aktiviere Output Compare B Match
Reinhard
Moin Reinhard,
stimmt, aber auch damit (OCIE1B = 1):
1
ldi temp , 0 b00001000
2
out TIMSK , temp
schaltet er die LED ein, aber nicht wieder aus. :-(
Viele Grüße
Michael
Michael K. schrieb:
Guten Morgen zusammen,
Wenn's noch schlimmer werden sollte: verinnerliche die Prosa
die vor jedem Textfenster zum Posten steht:
1
Wichtige Regeln - erst lesen, dann posten!
2
...........
3
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
Längerer Sourcecode ist der, der über eine Seite hinausgeht und
der Betrachter dauernd Scrollen muss um alles zu sehen/verstehen.
@Wastl:
Sorry, kommt nicht wieder vor! ;-)
MS
Matthias S.
(mschoeldgen)
(Firma: matzetronics)
17.09.2023 10:43
#7498553
Michael K. schrieb:
ldi temp,0b00001101
out TCCR1B,temp ; CTC und Prescaler auf 1024
CTC gut und schön, aber wo setzt du denn TOP? Bei Mode 4 (nur WGM12 gesetzt) muss TOP in OCR1A geschrieben werden, sonst steht da eine Null drin.
Moin Matthias,
ich möchte den 16 Bit Counter (B) nutzen und habe deshalb auch OCIE1B im TCCR1B gesetzt und den TOP-Wert in OCR1BH und OCR1BL geladen. - Falsch?
Viele Grüße
Michael
Michael K. schrieb:
Falsch?
ja
TOP im CTC-Modus ist OCR1A
Hat sich erledigt! Es läuft.
Und ich habe absolut Keine Ahnung warum...
Ich hatte probehalber den Code auf den Compare Match A umgeschrieben, da blinkte LED plötzlich - wieder zurück auf "B" und sie blinkte auch.
Ich danke Euch für Eure "Anteilnahme"...
Viele Grüße
Michael
Michael K. schrieb:
wieder zurück auf "B" und sie blinkte auch.
kann nicht sein.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren