mikrocontroller.net

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


Autor: karamalz (Gast)
Datum:

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

Autor: Stefan P. (form)
Datum:

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

Autor: Lui S. (lute)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

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

Gruß, Lui

Autor: Thi Lo (flothi)
Datum:

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

vg

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian Th. schrieb:

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

Macht oft die Entwicklungsumgebung, z.B. das AVR Studio.

Autor: karamalz (Gast)
Datum:

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

Autor: Thi Lo (flothi)
Datum:

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

-- edit
Hiermit dann erledigt ;-)

Autor: Pete K. (pete77)
Datum:

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

Autor: karamalz (Gast)
Datum:

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

Autor: Richard U. (ronw)
Datum:

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

Autor: karamalz (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:

> War bis vor einigen Jahren noch so.

Und hat auch immer wieder für Überraschungen gesorgt :-)

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.