Forum: Compiler & IDEs Blinklicht mit sleep


von Thorsten (Gast)


Lesenswert?

Kann ich den sleep Befehl benutzen um ein Lämpchen blinken zu lassen.
Wenn ja welche Biliothek muss ich dann einbinden (zB.:
#include<avr/io.h>.
Wenn das nicht mit dem sleep Befehl geht, wie kann ich das dann lösen

von Dieter B (Gast)


Lesenswert?

Les dir das erstmal durch.

Slepp ist für den Anfang nicht so ganz geeignet.

http://www.mc-project.de/

http://www.mikrocontroller.net/articles/c/

MFG
Dieter

von Thorsten (Gast)


Lesenswert?

Wieso die sleep Funktion hört sich doch viel einfacher an. Oder gibt es
da irgendwelche Probleme

von Torsten (Gast)


Lesenswert?

Naja, weil man damit "schlecht" programmiert. Zumindest für ein
Blinklicht. Das sollte man immer mit einem Timer machen. Bibliothek
braucht du für sleep gar keine. geht ja so:

while(...)
 asm volatile "nop";

Für die Ports die <io.h>

MfG Torsten

von Christian (Gast)


Lesenswert?

Hallo

sleep, beim aktuellen gcc, geht zB so:
MCUCR = _BV(SE); // sleep enable
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_mode();
Aufwachen kann man mittels Interrupt (zB Timer oder extern). Es steht
aber alles in der libc Beschreibung (evtl. da
C:\WinAVR\doc\avr-libc\avr-libc-user-manual-1.0.3.pdf)

Gruss
Christian

von Christian (Gast)


Lesenswert?

Nachtrag: #include <avr/sleep.h>

von Thorsten (Gast)


Lesenswert?

Hat jemand schon ein Blinklicht programmiert und kann mir jemand den
Quelltext dazu schicken

von Dieter B. (Gast)


Lesenswert?

Hallo Thorsten

Klappt das mit dem Sleep doch nicht so. Grins

Spaß beiseite. Wo hängst du denn ?

Es gibt soviele Möglichkeiten LEDs zum blinken zu bekommen.

1. Blinkleds    Port auf High und die Dinger blinken ( Grins )

2. Delays   Rechenzeit in einer Schleife verbraten, nicht so
geschickt.

3. Timer  schöne Möglichkeit, ist auch nicht so schwer

Sag mal wo es klemmt und welchen uC mit welchem Takt du verwendest.
Und an welchem Port die LED angeschlossen wird, dann schauen wir mal.

MFG
Dieter

von Rolf F. (Gast)


Lesenswert?

Normalerweise nimmt man dafür den WDT.
Ich benutze den als Blinklicht so: Nach dem Start von main nach init()
in den Sleep-Mode (LPM3 beim MSP430) und die sekündlich aufgerufene
WDT-ISR macht das Blinken (1 Pin auf high schalten). Dabei wird der WDT
von 1s-Intervall auf 1/512 s -Intervall umgeschaltet und nach dem 1/512
s-Intervall wird wieder auf low und 1s-Intervall umgeschaltet.
Dadurch verbraucht der MC durchschnittlich weniger als 3 uA, also
weniger als 1/1000 dessen, was die LED verbraucht.

von leo9 (Gast)


Lesenswert?

Das "normalerweise" möchte ich relativieren: Für eine z.B.
Alarmanlagenimitation ist das eine perfekte Lösung in Bezug auf
Stromverbrauch, wenn es um genaues Timing geht versagt diese Methode.

Ich denke bei den meisten Anwendungen wird das Timing wichtiger als der
Stromverbrauch sein. Es kommt natürlich auch auf das gewünschte
Gesamttiming an. Im Minutenbereich würde sich auch sleep mit externem
Interrupt durch einen RTC-Baustein anbieten (damit kommt man dan auch
auf wenige uA Stromverbrauch).

@Thorsten:
spezifiziere doch deine Rahmenparameter etwas genauer, dann werden sich
auch Lösungen finden.

grüsse leo9

von Rolf F. (Gast)


Lesenswert?

Der WDT ist beim MSP430 mit einem 32768 Hz Quarz getaktet; da stimmt das
Timing quarzgenau.
Man kann da auch Sekunden mit einem 64-Bit-Int zählen und so richtig
lange Wartezeiten programmieren, aber die Uhrenquarze haben ohne
Kalibrierung eine Ungenauigkeit von einigen Sekunden pro Tag.

von Thorsten (Gast)


Lesenswert?

Atmega 8 von Atmel mit 4MHz. Das Licht ist an PB0 angeschlossen

von leo9 (Gast)


Lesenswert?

@Rolf:
Sorry, bin wohl etwas "avr geschädigt"; da ist der WDT deutlich
ungenauer.

@Thorsten:
start:
sbi     PORTB, 0
cbi     PORTB, 0
rjmp    start
blinkt halt mit ca. 40kHz

grüsse leo9

von Thorsten (Gast)


Lesenswert?

Das ist assembler möchte aber in C programmieren

von leo9 (Gast)


Lesenswert?

#asm
start:
sbi     PORTB, 0
cbi     PORTB, 0
rjmp    start
#endasm

... und schon ist es c-Code ;-)

von Dieter B (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Thorsten

Hier mal ein kleines C Pro. zum blinken lassen der LED.

Verwendet wird TIMER0 .

Schau mal rein und frage, falls was unklar ist.

MFG
Dieter

von Cen (Gast)


Lesenswert?

@Dieter

Atmega8 und 4MHz habe ich 4 sec. an und 4 sec. aus. Rechnung
falsch!???? oder????

von nobody0 (Gast)


Lesenswert?

@leo9: Das ist kein Standard-C und wird von Prettyprintern wie indent
häufig kaputt gemacht.
Deshalb sind auch Assembler-Makros in Include-Dateien problematisch.
Die saubere Lösung sind getrennte Dateien für Assembler u. C.

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.