Forum: Mikrocontroller und Digitale Elektronik AVR: Timer1 mit BASCOM


von Nick (Gast)


Lesenswert?

Hallo,

ich habe ein kleines Problem mit dem Timer1

ich will das er bei 0 Startet und dann hoch zählt bis zum dem im Timer1
gespeicherten Wert. Dazwischen soll er den Compare1A erreichen und einen
Interrupt auslösen.

Also Timer1 = 0 /timer1=Compare1A –> Compare1_ISR / Timer läuft weiter
/ Timer1 Compare à Timer1 ISR à Timer1 = 0 beginnt von vorne.

Das Port setzten und Löschen im ISR ist nur zum testen da soll später
was anderes passieren deswegen ist auch kein PWM möglich da ich die
beiden ISR dann noch brauche.

Der Timer sollte dann bei Timer1 IRQ automatisch auf 0 gesetzt werden.
Set Tccr1b.3

Ist bestimmt eine Kleinigkeit was ich vergessen oder falsch verstanden
habe.

Kann mir jemand auf die Sprünge helfen.

Danke



Nicklas







$regfile = "m32def.dat"

$crystal = 16000000

$baud = 19200



Config Portb.3 = Output

Config Portd.6 = Output

Config Portd.7 = Output



Config Portb.0 = Input                                      'Taster
vom Incrementgeber

Config Portb.1 = Input
'Incrementgeber

Config Portb.2 = Input
'Incrementgeber



Dim A As Word

A = 15000



Set Timsk.2

Set Timsk.3

'Set Timsk.4

Set Tccr1b.3



On Int2 Increment_isr

Enable Int2

Config Int2 = Rising



Enable Interrupts





Cursor Off



Compare1a = A







On Compare1a Compare1:

'On Compare1b Compare2:

On Timer1 _timer1:



Timer1 = 65000

Set Tccr1b.0







Do



Cls

Locate 1 , 1

Lcd A

Locate 2 , 1

Lcd B

Compare1a = A



Waitms 100





Loop





Compare1:

Portb.3 = 1

Return



_timer1:

Portb.3 = 0

Return



Increment_isr:

If Pinb.2 = 1 Then

     If Pinb.1 = 0 Then

       A = A + 100

     End If



     If Pinb.1 = 1 Then

      A = A - 100

     End If



End If



Return

von Hannes L. (hannes)


Lesenswert?

> ich will das er bei 0 Startet und dann hoch zählt bis zum dem im
> Timer1 gespeicherten Wert.

Timer1 (tcnt1h:tcnt1l) ist der Zähler, du kannst also nicht bis zu
seinem "gespeicherten Wert" zählen lassen.

Nimm das Datenblatt des Mega32 (Complete-Version Seite 84 bis 111) und
schau dir die Funktionsweise des Timers an.

Da gibt es zwei Compare-Registerpaare (Datenblatt Seite 109), in die du
Vergleichswerte schreiben kannst und mit denen du Interrupts auslösen
kannst (und somit ISRs aufrufen kannst). Zusätzlich gibt es noch den
Überlauf-Interrupt und den Input-Capture-Interrupt. Alles für Timer1
und bei geschickter Programmierung (wenn man den Timer frei durchlaufen
lässt) alle gleichzeitig nutzbar.

Um den Timer1 erstmal zu starten, musst du einen geeigneten Vorteiler
einschalten. Dies geschieht durch Setzen der entsprechenden Bits in
TCCR1B (Datenblatt Seite 108).

Damit ein Interrupt ausgelöst wird, müssen die entsprechenden Bits in
TIMSK gesetzt werden (Datenblatt Seite 110). Zusätzlich ist im SREG das
Interrupt-Flag zu setzen, in ASM macht das der Befehl SEI.

> Dazwischen soll er den Compare1A erreichen und einen Interrupt
> auslösen.

Das kann er machen...

...

von Nick (Gast)


Lesenswert?

Hallo,
Da habe ich mich vielleicht ein bisserl unglücklich ausgedrückt.
Ich habe das schon denke ich richtig Verstanden.
Der Timer Zählt schon hoch und wird vom Clock "gespeist"
Set Tccr1b.0
Sollte den Timer1 mit ungeteilten CLK versorgen.

Das freigeben der IRQ habe ich auch gesehen:
Set Timsk.2
Bit 2 – TOIE1: Timer/Counter1, Overflow Interrupt Enable
Set Timsk.3
Bit 3 – OCIE1B: Timer/Counter1, Output Compare B Match Interrupt
Enable

Set Tccr1b.3
Zugewiesenen Pin deaktivieren

SEI wird von BASCOM generiert mit dem Befehl enable Interrupts

Also das hilft noch nicht wirklich weiter

von Rahul (Gast)


Lesenswert?

und

was


willst


du


nun


wirklich



machen?


irgendwie


verstehe ich dein Problem nicht so ganz.

Übrigens

ist

dein

Programm

nicht

wirklich

übersichtlich

durch

die

vielen

Zwischenräume...

von Nick (Gast)


Lesenswert?

Sorry wegen den Leerzeilen ist beim Kopieren irgendwie falsch Formatiert
worden.

Ich will? was will ich eigentlich ;-)

Timer1 soll bei 0 anfangen und aufwärts zählen und dabei 2 Interrupts
auslösen

0 – Interrupt – Interrupt – 0

Im ersten Interrupt soll weiter nix passieren außer die ISR aufrufen,
im zweiten soll dann wieder eine isr aufgerufen werden und der Timer
wieder bei 0 anfangen.
Mehr soll es gar net sein ;-)

von Rahul (Gast)


Lesenswert?

OC und CTC...
Liefern beide Interrupts.

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.