hallo, ich wollte gerade bei einem atmega16 testen ob er so wie gedacht mit 16MHz arbeitet. Wollte mit dem code eine led im sekundentakt blinken lassen: #include <avr/io.h> #include <util/delay.h> int main(){ int i; DDRA = 0xFF; while(1){ for(i=0; 1<100; i++) _delay_ms(10); PORTA = 0x20; for(i=0; 1<100; i++) _delay_ms(10); PORTA = 0x00; } } die for-schleife ist dafür, weil ja _delay_ms() nicht so große zahlen verträgt. leider passiert garnichts, die LED an portA bleibt aus. wenn ich die erste For-schleife auskommentier dann leuchtet die LED logischerweise sofort und bleibt dann für immer an. selbst wenn der atmega nur mit 1mhz arbeitet, irgendwann müsste die led doch trotzdem mal angehn oder? weis jemand rat?
for(i=0; 1<100; i++) läuft unendlich, da "1" nie größer als "100" wird. Probiers mal mit i statt 1, oder mach gleich n 1000er delay..
Moin, Deine Laufbedingung in der For-Schleife ist immer wahr (1<100). Du meinst sicher i<100. Gruß, Lui
Fehlt da nicht das
1 | #define f_cpu 16000000
|
? IIRC wird sonst ein (wie auch immer gearteter) Standardwert genommen. vg
Florian Th. schrieb: > Fehlt da nicht das
1 | #define f_cpu 16000000
|
? IIRC wird sonst ein > (wie auch immer gearteter) Standardwert genommen. Macht oft die Entwicklungsumgebung, z.B. das AVR Studio.
Danke an euch... des ist mir jetz echt peinlich, versteh gar ned wie man i mit 1 verwechseln kann, liegt doch ned mal nahe beieinander :/ manchmal ist man vom ewigen draufstarren so blind dass man den wald vor lauter bäumen nicht mehr sieht... achja, das #define F_CPU steht ja im makefile scho drin. der compiler hat mir als ichs im code mit drin hatte immer den hinweiß gegeben, ich würde F_CPU neu definieren, also hab ichs rausgelassen. 1mal sollte reichen :)
Wenns denn korrekt eingestellt ist - ich weiß nicht, ob der OP in den Einstellungen das ganze eingegeben hat. -- edit Hiermit dann erledigt ;-)
F_CPU gehört in das Makefile, damit es vom Compiler bei allen Source-Code Dateien berücksichtigt werden kann.
so, umgeschrieben und auf 5s erhöht, ging natürlich sofort, danke nochmal :) hab das ganze jetz bisl beobachtet, präzise alle 5s schaltet die LED um. Heißt dass ich kann mir jetz 100%ig sicher sein dass der atmega mit 16Mhz läuft?
karamalz schrieb: > die for-schleife ist dafür, weil ja _delay_ms() nicht so große zahlen > verträgt. Das stimmt nicht. Wer sich die Mühe macht und die Funktion in der avr-libc nachschlägt findet dort Folgendes: "When the user request delay which exceed the maximum possible one, _delay_ms() provides a decreased resolution functionality. In this mode _delay_ms() will work with a resolution of 1/10 ms, providing delays up to 6.5535 seconds (independent from CPU frequency). The user will not be informed about decreased resolution." Es ist also kein Problem _delay_ms(1000) zu nutzen.
stimmt, gerade mit _delay_ms(5000) probiert, funkt. hab halt im forum bisl gelesen und da hies es immer irgendwo is stop, und man müsse das ganze in ne schleife packen. evtl ne neue version der lib? egal, macht das ganze nur einfacher
karamalz schrieb: > hab halt im forum bisl gelesen und da hies es immer irgendwo is stop, > und man müsse das ganze in ne schleife packen. War bis vor einigen Jahren noch so.
Jörg Wunsch schrieb: > War bis vor einigen Jahren noch so. Und hat auch immer wieder für Überraschungen gesorgt :-)
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.