Forum: Mikrocontroller und Digitale Elektronik _ms_delay() tut nicht :(


von karamalz (Gast)


Lesenswert?

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?

von Stefan P. (form)


Lesenswert?

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..

von Lui S. (lute)


Lesenswert?

Moin,

Deine Laufbedingung in der For-Schleife ist immer wahr (1<100).
Du meinst sicher i<100.

Gruß, Lui

von Thi L. (flothi)


Lesenswert?

Fehlt da nicht das
1
#define f_cpu 16000000
? IIRC wird sonst ein (wie auch immer gearteter) Standardwert genommen.

vg

von (prx) A. K. (prx)


Lesenswert?

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.

von karamalz (Gast)


Lesenswert?

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 :)

von Thi L. (flothi)


Lesenswert?

Wenns denn korrekt eingestellt ist - ich weiß nicht, ob der OP in den 
Einstellungen das ganze eingegeben hat.

-- edit
Hiermit dann erledigt ;-)

von Pete K. (pete77)


Lesenswert?

F_CPU gehört in das Makefile, damit es vom Compiler bei allen 
Source-Code Dateien berücksichtigt werden kann.

von karamalz (Gast)


Lesenswert?

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?

von Richard U. (ronw)


Lesenswert?

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.

von karamalz (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Pete K. (pete77)


Lesenswert?

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
Noch kein Account? Hier anmelden.