Forum: Mikrocontroller und Digitale Elektronik Ich werde irre ;-) (Timer compare match interrupt)


von Michael K. (stoertie)


Lesenswert?

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,0b00000000
2
  out  TCCR1A,temp  
3
4
  ldi  temp,0b00001101
5
  out  TCCR1B,temp  ; CTC und Prescaler auf 1024
6
7
; Timer soll bis 1000(dez) zählen, das macht bei 1MHz gut eine Sekunde (1,024 Sekunden um genau zu sein).
8
9
  ldi  r16,0b00000011
10
  ldi  r17,0b11101000
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,0b0001000
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

von MaWin O. (mawin_original)


Lesenswert?

Michael K. schrieb:
> Interrupt-Vektor ist gesetzt.

Bitte kompletten Source als Anhang posten.
Ich sehe dort nicht, wie die Vektoren korrekt gesetzt sind.

von Oliver S. (oliverso)


Lesenswert?

Vor allem der Stackpointer…

Oliver

von Robert L. (bart)


Lesenswert?

Kenne mich jetzt mit ATmega nicht so aus, aber Interrupts müssen 
allgemein freigegeben werden - Stichwort: SEI

von Achim H. (pluto25)


Lesenswert?

Dieser CTC hat OC1a als Top. Wenn die kleiner als b sind wird er keinen 
weiteren int auslösen.

von Michael K. (stoertie)


Angehängte Dateien:

Lesenswert?

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,0b00000000
50
  out  TCCR1A,temp  ; setze Compare Output Mode for channel A
51
52
  ldi  temp,0b00001101
53
  out  TCCR1B,temp  ; CTC und Prescaler auf 1024
54
55
  ldi  temp,0b00000011
56
  ldi  r17,0b11101000
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,0b0001000
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

von Reinhard R. (reirawb)


Lesenswert?

Michael K. schrieb:
> ldi  temp,0b0001000      <---- da fehlt 'ne Ziffer, sind nur 7

> out  TIMSK,temp  ; aktiviere Output Compare B Match

Reinhard

von Michael K. (stoertie)


Lesenswert?

Moin Reinhard,

stimmt, aber auch damit (OCIE1B = 1):
1
  ldi  temp,0b00001000
2
  out  TIMSK,temp

schaltet er die LED ein, aber nicht wieder aus. :-(

Viele Grüße
Michael

von Wastl (hartundweichware)


Lesenswert?

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.

von Michael K. (stoertie)


Lesenswert?

@Wastl:
Sorry, kommt nicht wieder vor! ;-)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Michael K. (stoertie)


Lesenswert?

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

von MaWin O. (mawin_original)


Lesenswert?

Michael K. schrieb:
> Falsch?

ja
TOP im CTC-Modus ist OCR1A

von Michael K. (stoertie)


Lesenswert?

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

von MaWin O. (mawin_original)


Lesenswert?

Michael K. schrieb:
> wieder zurück auf "B" und sie blinkte auch.

kann nicht sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.