Und noch ein seltsames Problem: #include <avr/io.h> #define F_CPU 16000000 #import <avr/delay.h> int main(void) { DDRB = 0xff; while(1) { _delay_ms(20); PORTB=0x00; _delay_ms(20); PORTB=0xff;; } } Dieses kleine Programm funktioniert in etwa bis 16-17ms, alles darüber hinaus wird ignoriert (mit dem Oszi gemessen). Wenn ich _delay_ms(500) angebe hab ich das gleiche Signal wie bei _delay_ms(20) (Impulslänge ca 17ms). Wenn ich _delay_ms(10) angebe habe ich schöne 10ms Impulse. Ist mir ein Rätsel Woran liegt das?
Das liegt daran, daß du die Dokumentation nicht gelesen hast. Da steht nämlich: "The maximal possible delay is 262.14 ms / F_CPU in MHz" Die maximale Delay-Länge mit dieser Funktion liegt bei 16Mhz also bei ca. 16,38ms, was mit deiner Beobachtung von "ca. 17ms" übereinstimmt.
Ok, Doku hab ich in der Tat nicht gelesen, und das obwohl ich grad ein T-Shirt mit dem Aufdruck "RTFM" an hab ;) Aber ich hab ehrlich gesagt auch nicht damit gerechnet das die Delay Routine so eingeschrängt ist wesshalb ich auch erst gar nicht auf die Idee gekommen bin das zu verdächtigen, zumal im Tutorial auch Beispiele mit _delay_ms(100) drin sind. Der angegebene Takt beträgt 3,6864MHz, und wenn ich mich nicht verreichnet hab komme ich auf nur 71ms. Also würde das Beispiel auch nicht stimmen. Sei's drum, der Fehler im Tutorial sollte wohl korrigiert werden. Aber wie kann man dann längere Delays erzeugen?
Ich beziehe mich dabei auf das Beispiel "Tasten entprellen" http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#.28Tasten-.29Entprellung Wobei es wünschenswert wäre richtig darauf hinzuweisen und nicht nur das Delay auf unter 70ms geändert würde. Ich würde es ja machen wenn ich wüsste wie's richtig geht, aber das lerne ich grad erst noch
Nimm die hier: http://mitglied.lycos.de/projectsilence/syscontrol/source/delay.c http://mitglied.lycos.de/projectsilence/syscontrol/source/delay.h Dazu musst Du noch deinen Systemtakt definieren. Also unter SYSCLOCK in Hz angeben. Den us-ASM-Code habe ich irgendwo mal "geklaut" und den Rest angepasst, damit alles von den Timnings her stimmt.
Fettes Merci, es funzt. Hab aber SYSCLOCK auch auf F_CPU geändert weil die Variable anscheinend auch noch von weiteren Routinen (UART?) verwendet wird.
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.