Forum: Mikrocontroller und Digitale Elektronik Mega32 Timer/Counter


von kurze Frage (Gast)


Lesenswert?

Ich warte derzeit auf mein AVR Testboard und wollte in der Zwischenzeit 
schonmal ein paar Dinge im AVR Studio simulieren. Das Handling des 
Timers wirft dabei ein Rätsel auf. Ich kann ihn initialisieren und er 
zählt auch fleißig hoch wie er soll. Ich kann aber nich aufs Overflow 
Flag TOV0 reagieren. Oder ich bin einfach zu blöd. Hier mal ein Auszug 
aus dem Testprogramm:


TCCR0 = 0b00000010;
DDRC=0xff;

do
{
  DDRC++;
}
while(TOV0<0x01);

Nun kann man im AVR Studio ja schön sehen wie der Timer zählt und beim 
Overflow TOV0 gesetzt wird. Aber aus meiner Schleife springt er dann 
nicht raus, warum?

von spess53 (Gast)


Lesenswert?

Hi

Timer-Overflow-IR freigegeben?
Interrupts erlaubt?

Sehe keins von beiden.

>DDRC++
Du bist dir bewusst, um welches Register es sich da handelt?

MfG Spess

von kurze Frage (Gast)


Lesenswert?

DDRC wird in der Schleife nur zu Testzwecken inkrementiert damit die 
Schleife überhaupt was zu tun hat.

Die ersten beiden Punkte sind dann wohl der Knackpunkt. Da habe ich 
nichts eingestellt. Als Anfänger habe ich mich am GCC Tutorial entlang 
gehangelt und dort steht nichts von diesen beiden Einstellungen:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Timer.2FCounter_des_AVR

kannst du das nochmal genauer erläutern? Denn eigentlich will ich ja 
keinen Interrupt, sondern nur aus der Schleife springen. Wenn ich die 
while Bedingung zB TCCNT0<254 prüfen lassen komme ich ohne Interrupt aus 
der Schleife.

Und noch eine Frage am Rande. Kennt jemand ein gutes Tutorial in denen 
die Programmierung mit C++ besser beschrieben wird? Das GCC Tutorial auf 
dieser Seite bezieht sich ja auf C. Ich möchte aber ungern zwei 
Baustellen gleichzeitig anfangen.

von Lars R. (larsr)


Lesenswert?

Hallo,

Probiere mal folgendes:
1
TCCR0 = 0b00000010;
2
DDRC=0xff;
3
4
do
5
{
6
  DDRC++;
7
}
8
while(!(TIFR & TOV0));

Das Problem ist, dass der Atmel AVR nicht - wie beispielsweise der Intel 
8051 - einzelne Bits adressieren kann.

Viele Grüße,

Lars

von kurze Frage (Gast)


Lesenswert?

Das tuts leider auch nicht. Die Schleife rennt fleißig weiter

von hmm... (Gast)


Lesenswert?

Natuerlich kann der AVR einzelne bits adressieren, sogut wie ein 8051 
sind die schon seit immer. Aber nicht so. Man kann sich nicht drauf 
verlassen, dass ein Register immer innerhalb der direkt adressierbaren 
Bank ist.

Das Overflow bit kommt auch ohne interrupt. Dh man kann in der Tat das 
Overflow bit des zaehlers pollen.

while ((TCCRx and 0x01)==0)

von Lars R. (larsr)


Lesenswert?

kurze Frage schrieb:
> Das tuts leider auch nicht. Die Schleife rennt fleißig weiter

Der folgende Code muss funktionieren:
1
#include<avr/io.h>
2
3
int main (void)
4
{
5
    TCCR0 = (1<<CS01);
6
    DDRC = 0xFF;
7
    do
8
    {
9
        DDRC++;
10
    }
11
    while (!(TIFR & (1 << TOV0)));
12
    while (1);
13
}

von kurze Frage (Gast)


Lesenswert?

jau diese bedingung while (!(TIFR & (1 << TOV0))); tuts
die verstehe ich aber schon wieder nich ;)
ist aber auch kein c++ oder?

von Lars R. (larsr)


Lesenswert?

kurze Frage schrieb:
> jau diese bedingung while (!(TIFR & (1 << TOV0))); tuts
> die verstehe ich aber schon wieder nich ;)
> ist aber auch kein c++ oder?

Das ist ganz normales C.

Zu erst wird die Bedinung negiert, da wir warten wollen, bis TOV0 
gesetzt ist und nicht bis es gelöscht ist. Anschließend brauchen wir 
eine UND-Verknüpfung um nur an das Bit was TOV0 repräsentiert zu kommen, 
da das Byte TIFR, welches dieses Bit enthält, natürlich auch noch sieben 
andere Bits beinhaltet.

Schau mal in das AVR-GCC-Tutorial auf dieser Seite, dort sind 
Bitmanipulationen glaube ich beschrieben.

von kurze Frage (Gast)


Lesenswert?

jetzt hab ichs kapiert. das problem ist also, das ich nicht direkt TOV0 
addressieren bzw abfragen kann, weils nur ein bit aus dem TIFR register 
bzw byte ist.

dann kann man die while schleife auch ganz einfach auf (TIFR < 0x03) 
prüfen.
TIFR besteht nämlich nur aus TOV0 als MSB und OCF0 mit der wertigkeit 
zwei. OFC0 wird direkt mit beginn des zählvorgangs gestartet.

von Rolf Magnus (Gast)


Lesenswert?

> dann kann man die while schleife auch ganz einfach auf (TIFR <
> 0x03) prüfen.

Was ist daran einfacher?

> TIFR besteht nämlich nur aus TOV0 als MSB und OCF0 mit der
> wertigkeit zwei. OFC0 wird direkt mit beginn des zählvorgangs
> gestartet.

Speziell beim Mega32 mag das so sein. Bei anderen AVRs kann das aber 
anders 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.