 Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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
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,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
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,0b00001000
| 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! ;-)
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|