Mega32 Timer/Counter

Gast #1331098
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?
Gast #1331113
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.
Gast #1331137
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)
#1331141
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
}
#1331164
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.
Gast #1331191
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.
Gast #1331937
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.

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