Forum: Mikrocontroller und Digitale Elektronik CTC-Interrupt Atmega8 funktioniert nicht


von Paul Baumann (Gast)


Lesenswert?

Kann mir mal jemand unter die Arme greifen? Ich wollte mal auf dem
Experimentierbrett den CTC-Modus von Timer 1 des Atmega8 ausprobieren,
aber meine LED blinkt nicht und ich sehe nicht warum. Den Ausgang OC1B
kann ich nicht nehmen -ich wollte deswegen die LED an einem anderen Pin
jede Sekunde toggeln lassen, so daß 0,5 Hz aus Portc.5 kommen.

Der Quelltext ist Teil eines größeren Programmes, ich habe nur diese
Sache separat testen wollen.

Habe ich alle Register, die damit zu tun haben erwischt oder was habe 
ich
übersehen?

$regfile = "M8def.dat"
$crystal = 16000000
Dim Timer1_interrupt_zähler As Word

Led Alias Portc.5 : Config Led = Output : Led = 1

        '### Timer1 - Zeittakt 1ms 
#####################################################
Tccr1b = &B00001011 
'CTC-Modus,Prescaler=64  (WGM12 und 13 CTC Modus, CS10-12 Teilerfaktor)
        Ocr1b = 250 
'Vergleichswert bei dem Interrupt ausgelöst wird
        Timsk.ocie1b = 1 
'Output_Compare_Match_Interrupt_erlauben

Enable Interrupts
Enable Timer1
On Oc1b Isr_timer1
'Bei Gleichstand Interrupt auslösen


        '####################################################################### 
########
        Do
          Nop
        Loop
      End

Isr_timer1:
           Incr Timer1_interrupt_zähler
                    'Die Interrupts zählen
           If Timer1_interrupt_zähler = 1000 Then
                    'nach Tausend Interrupts LED umschalten d.h. 1Hz
                 Timer1_interrupt_zähler = 0
                 Toggle Led
           End If
        Return


MfG Paul

von spess53 (Gast)


Lesenswert?

Hi

>Habe ich alle Register, die damit zu tun haben erwischt oder was habe
>ich übersehen?

Du hast das Register für den Topwert, ICR1 vergessen.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

>         Ocr1b = 250

Laut Tabelle 39, auf Seite 97 vom Datasheet, steht der Vergleichswert 
aber im OCR1A

von Karl H. (kbuchegg)


Lesenswert?

> 'Vergleichswert bei dem Interrupt ausgelöst wird
>        Timsk.ocie1b = 1
> 'Output_Compare_Match_Interrupt_erlauben
>
> Enable Interrupts
> Enable Timer1
> On Oc1b Isr_timer1

Hä? Was versuchst du da?

Du benutzt Modus 4
> Tccr1b = &B00001011
(deinen Kommentar darunter kannst du dir in die Haare schmieren. WGM13 
wird nicht gesetzt, also ist das Modus 4).

Das ist: CTC mit einem Top Wert in OCR1A

Und bei einer 0 in OCR1A hast du dann halt dauernd einen Compare Match 
mit Timer Reset.

Wenn du dir besagte Tabelle im Datanblatt ansiehst, fällt eines auf: Es 
gibt keinen einzigen Spezialmodus, bei dem das OCR1B Register eine 
spezielle Rolle spielen würde! Immer nur OCR1A bzw. ICR1 bzw. fixe 
Werte.

von spess53 (Gast)


Lesenswert?

Hi

>Du hast das Register für den Topwert, ICR1 vergessen.

Mist. OCR1A

MfG Spess

von Paul Baumann (Gast)


Lesenswert?

Karl Heinz schrob:
>Du benutzt Modus 4
> Tccr1b = &B00001011
>(deinen Kommentar darunter kannst du dir in die Haare schmieren. WGM13
>wird nicht gesetzt, also ist das Modus 4).

Ja, den Kommentar habe ich mir jetzt in die Haare geschmiert. Sieht im
Spiegel etwas komisch aus...

>Das ist: CTC mit einem Top Wert in OCR1A

Nachdem ich nun statt OCR1B OCR1A mit 250 "beschickt" habe, funktioniert
es auch richtig. Ich habe das nicht gesehen, daß ich B statt A drin 
hatte.
Das kommt davon, wenn man mit der Brechstange ein Programm fertig 
bringen
will....

Ich danke Euch für die Hilfe und die Ratschläge.

MfG Paul

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.