Ich werde irre ;-) (Timer compare match interrupt)

OP #7498332
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

OP #7498527
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

Angehängte Dateien:
#7498547
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren