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?
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
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.
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
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)
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 | }
|
jau diese bedingung while (!(TIFR & (1 << TOV0))); tuts die verstehe ich aber schon wieder nich ;) ist aber auch kein c++ oder?
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.
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.