mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega32 Timer/Counter


Autor: kurze Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kurze Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

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.

Autor: Lars R. (larsr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Probiere mal folgendes:
TCCR0 = 0b00000010;
DDRC=0xff;

do
{
  DDRC++;
}
while(!(TIFR & TOV0));

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

Viele Grüße,

Lars

Autor: kurze Frage (Gast)
Datum:

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

Autor: hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Lars R. (larsr)
Datum:

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

Der folgende Code muss funktionieren:
#include<avr/io.h>

int main (void)
{
    TCCR0 = (1<<CS01);
    DDRC = 0xFF;
    do
    {
        DDRC++;
    }
    while (!(TIFR & (1 << TOV0)));
    while (1);
}

Autor: kurze Frage (Gast)
Datum:

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

Autor: Lars R. (larsr)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kurze Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.