Forum: Mikrocontroller und Digitale Elektronik uC Einsteiger sucht Lösungsansatz für LED-Ansteuerung


von Armin Volk (Gast)


Lesenswert?

Hallo,
ich will eine Kleinigkeit basteln. Leider bin ich fast kompletter uC 
Neueinsteiger. Ich hab aufgrund der Berufsausbildung nur sehr wenige 
Erfahrung mit Atmegas und C.

Prozessor: evtl. Atiny

1) Wenn es dunkel wird soll eine SMD Angehen (Also den uC per 
Dämmerdungsschalter triggern)

2) Alle 15 Minuten soll die LED für eine Minute ausgehen

3) Dann soll ein bestimmter Satz  + GPS-Koordinaten per Morsecode 
ausgesendet werden. Evtl 2-3x wiederholt...

3) Zur 20. Minute soll das Teil wieder auf Dauerlicht gehen

Wie löst man so etwas? Zwei bis drei verschachtelte Timer?

Sonderlich genau muss das Teil natürlich nicht sein - aber es sollte 
auch nicht um mehrere Minuten davon laufen. Also denke ich dass ich 
keine RTC benötigen werde.


Das ganze soll dann mal später zu einem Geocache gehören.

Vielen Dank für eure Tipps!

Gruß
Armin Volk

von Coder (Gast)


Lesenswert?

Wenn der Hardware Timer frei ist, kannst Du diesen als "System-Timer" 
verwendeN bzw. programmieren.  Du könntest einen Uhren-Quarz als 
Taktquelle für den Timer verwenden und falls beim ATTiny möglich den uC 
in einen besonders stromsparenden Betriebsmodus versetzen, wenn es 
nichts zu tun gibt.

von MaWin (Gast)


Lesenswert?

Woher willst du denn den ganzen Strom nehmen ?

Selbst kleine LEDs brauchen so 2mA damit man sie erkennen kann.

GPS wohl nicht eingebaut, sondern Position fest einprogrammiert ?

Zumindest die"Ansteuerng" der LED wird einfach sein: Über einen 
Vorwiderstand an einen Portpin hängen, fertig.

Der uC muß sehr stromspared programmiert werden, also viel sleep und 
sich vom watchdog wecken lassen. Leider muß für halbwegs genaue Zeit der 
Quartzoszillator durchlaufen, 32kHz spart dabei Strom.

von Armin Volk (Gast)


Lesenswert?

hallo Marvin,
ja die Position ist natürlich fest Einprogrammiert. Diese Elektronik 
soll nur den nächsten Wegpunkt zum Cache ausgeben.

Wie Weckt man den uC mit dem Wartchdog?
Warum sparen 32kHz Strom?

Der Strom ist zwar nicht das Problem, denn der Punkt des Caches steht 
auf eigenem Gelände - die Batterie (Autobatterie) könnte in unserem 
Gartenhäuschen untergebracht sein. Da sehe ich nicht das Problem. Der uC 
+ 20mA LED ist ja für eine KFZ-Batterie nicht wirklich eine Last... 
Dennoch wäre ich natürlich am Stromsparenden Aufbau interessiert - dies 
verringert Wartungsintervalle ;-)

von TO (Gast)


Lesenswert?

Was ist mit "Ausgesendet" gemeint?

Die eigentliche Frage nach der Anzahl der Timer: Genau einer nötig ;)

von Armin Volk (Gast)


Lesenswert?

Ausgesendet= LED blinkt (morst)

Wie wird sowas deiner Meinung nach gelöst?

Danke

von MaWin (Gast)


Lesenswert?

Gut, wenn du genug Strom hast, kannst du es dir einfach machen und den 
uC durchlaufen lassen.
Ein 32kHz Uhrenquartz ist trotzdem gut, weil genauer ist als ein xxMHz 
Quartz, selbst wenn du den lansameren Takt der Strom spart nicht 
brauchst. Schnell genug ist der uC immer noch für den primitiven Job. 
Auch eine 20mA LED kann über einen Vorwiderstand dirket an eine Ausgang.

von Armin Volk (Gast)


Lesenswert?

Ok vielen Dank - aber eigentlich ging es mir viel mehr um die 
Realisierung im Programmcode als um die Elektronik ;-)

von Dietrich L. (dietrichl)


Lesenswert?

Man nehme:
- µC (es reicht ein sehr kleiner)
- 32kHz-Quarz (ggf. reicht bzgl. Genauigkeit auch der interne Takt)
- Fotowiderstand (z.B. LDR05) als Dämmerungsschalter
- eine LED + Widerstand
- Stromversorgung nach Bedarf
- ein passendes Programm ;-)

Gruß Dietrich

von Dietrich L. (dietrichl)


Lesenswert?

Armin Volk schrieb:
> Realisierung im Programmcode

Prinzip (Beispiel):
- ein Timer wird so programmiert, dass er alle xx ms einen Interrupt 
erzeugt
- in der Interruptroutine wird eine Zeit-Variable bis auf 0 
heruntergezählt
- im Hauptprogramm wird ausgewertet, ob es dunkel ist (z.B. LDR05 mit 
Vorwiderstand an einem Analogeingang)
- dann wird die Sequenz der benötigten Zeiten erzeugt (setzen der 
Zeit-Variablen auf benötigten Wert und warten, bis sie 0 ist; bei 
längeren Zeiten das ggf. in einer Schleife)
- zu den gewünschten Zeitpunkten die LED ein- bzw. ausschalten

In der einfachen Version kann man die ganze Sequenz hintereinander 
schreiben. Wenn der Speicher nicht reicht oder es schöner werden soll, 
kann man das mit Funktionen (z.B. Blinken kurz/lang) und Tabellen 
"verfeinern".

Gruß Dietrich

von Sam .. (sam1994)


Lesenswert?

Du nimmst eine Variable welchen den aktuellen Zustand speichert. Z.b. in 
Sekunden. Im Timerinterrupt wird die Variable um eins erhöht und 
abgefragt ob sie xxx ist. Wenn ja führst du die entsprechende Aktion 
aus. Beim gleichen Nenner deiner Intervalle kannst du die Sekunden 
wieder auf 0 setzen.
1
secs++;
2
if(secs == 15*60)
3
  Led ausschalten
4
if(secs == 16*60)
5
  Led anschalten
6
if(secs == xxx)
7
  foo();
8
...
9
10
sleep();
Das Triggern über die Helligkeit geht am einfachsten über den 
Analogcomperator, da dieser eigenen Interrupt hat. Wenn dieser auslöst, 
schaltest du den Timer ein bzw. aus.

Das ganze passt locker in einen Tiny12.

Vorteil dieser Variante ist, alles wird in der ISR ausgeführt. Nach der 
ISR kann man den Avr sofort schlafen legen.

von Sam .. (sam1994)


Lesenswert?

Beim Morsen kann man einfach das nächste Bit auslesen und wenn es wahr 
ist, den nächsten Interrupt überspringen und damit die Led länger 
anlassen.
1
if(secs >= xxx && secs < xyz) //Morsen
2
{
3
  if(next)
4
  {
5
    if(next == 1) //Bei 1 led ausschalten
6
      Led ausschalten
7
    next--;
8
  }
9
  else
10
  {
11
    Led anschalten
12
    if(morsecode[pos / 8] && (1 << (pos % 8)))
13
      next = 2; //1 Takte länger Led anlassen
14
    else
15
      next = 1; //Nächstes mal ausschalten
16
    pos++;
17
  }
18
}

von TO (Gast)


Lesenswert?

Hallo.

Ausgesendet klang nach Funk, vor allem bei morsen. Die LED klang nur 
nach
Betriebskontrolle. Wenn es aber nur um "Licht senden geht", hey, kein 
Thema.

Nen LiPo-Akku über Solarladeregler schön voll halten, damit er in der
Nacht leer gemacht werden kann. 5000 mAh sollten wohl reichen. Deine
vorhandene Autobatterie tut es aber ganz sicher auch.

Wie ich es machen würde ?

Zuerst die Akkuspannung mit z.B. LM2576 + Bauteile drum herum 
runterbringen.
LED über Transistor ansteuern. Oder gar über Transistor und MOSFET, hat 
den
Vorteil, das man auch ne 3W LED dranhängen kann, wenn man das Ding 
später
mal pimpen will.

Morsecode soll ja hartkodiert sein, den würde ich also direkt 
"optimiert"
speichern. Entweder im EEPROM (wenn vorhanden), ansonsten im Codespace.

Kleines Assemblerprogramm, hauptsächlich aus dem Timerinterrupt und ner
Hauptschleife, die die Arbeit macht.

Der Timer zählt brav vor sich hin. Setzt alle 60 Sekunden nen Flag, 
damit
die Hauptschleife was zu tun kriegt.

Jetzt wird's spannend. Wenn über einen Eingang der Pegel passt (also der
Dämmerungsschalter mir sagt, das es dunkel ist), nur dann gehe ich in
die Hauptschleife, ansonsten springe ich wieder zur Prüfung, ob es 
dunkel
ist.

In der Hauptschleife warte ich auf das Flag vom timer. Ich erhöhe einen
Zähler, und wenn der bei 15 ist, schalte ich die LED aus. Ist er bei 16,
schalte ich sie wieder ein.

Oh, ach ja, wenn ich die Aufgabe richtig verstehe, würde ich bei 16 auch
noch die Morse-Ausgabe anstossen. Wie schnell soll die eigentlich sein,
und ist sie evtl. zu lang für eine Minute? Wenn ja, sollte ich mir ein
Flag ausdenken, das ich gerade morse, um nicht evtl. die Leuchtdiode mit
einem "dauereinschalten" beim Morsen zu stören.

Wenn der Zähler von vorhin bei 20 ist, schalte ich wieder ein? Moment,
das Licht wurde doch in der 15. Minute für 1 Min. ausgeschaltet. Anders
gesagt AUS, 1 Min. warten, EIN .. ist also an ? .. ich vermute einen
Definitionsfehler. Ich gehe also davon aus, das in der 15. Minute die
LED aus gemacht wird, vielleicht noch einen Moment gewartet wird, und
dann 5 Minuten lang der Morsecode blinken soll ? Danach in der 20. 
Minute
wieder statisch licht an und alles wieder von vorne? cool, dann würde
ich bei zähler = 20 einfach den zähler auf 0 setzen, dann geht ja alles
wieder von vorn los.

Damit ist die Hauptschleife praktisch durch, ich brauch nur noch ne 
kleine
Routine, um meine morsenachricht auszugeben, je nach Speed würde ich 
eine
zweite zählvariable im verwendeten timer zählen lassen und ein flag 
setzen,
und in abhängigkeit meiner daten dann "led an" oder "led aus" 
entscheiden.
die daten könnten z.B. "1" = "morse kurz", "2"="morse lang", "3"="pause"
sein. in der morseroutine würde ich also bei jedem flag schauen, ob mein
aktuelles zeichen 1,2,3 ist, morse kurz lasse ich 1 flag lang stehen,
morse lang zwei flags, und ne pause lasse ich 1 flag mit led aus stehen.
Wortende würde ich einfach mit 2 pausen versehen, um die pausenlänge zu
haben.

Das ganze in Assembler braucht nicht mehr Zeit als die, die ich nun in
Textform niedergeschrieben habe, lass es mal 30 Minuten sein ..

Konkrete Fragen bitte jetzt stellen ;)

von Armin Volk (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe jetzt mal einen ersten Schaltplan-entwurf gemacht.
Was haltet ihr davon?

Wäre super, wenn ihr euch den Transistor als Schalter mal anschauen 
könntet.
Da bin ich von hfe=100 ausgegangen.
Transistor BC817-25: 
http://www.reichelt.de/BC-Transistoren/BC-817-25-SMD/index.html?ACTION=3&GROUPID=2881&ARTICLE=18554&SHOW=1&START=0&OFFSET=16&;PROVID=2402

Ich denke fast dass das zu hoch ist - habe im Datenblatt baer nichts 
anderes gefunden.

Weiter, passt die Beschaltung des Linearreglers? Ich habe bisher nur 
Festspannungsregler verwendet. Leider hat Reichelt keinen im Angebot...

Vielen Dank schonmal...

von Armin Volk (Gast)


Lesenswert?

Hallo TO,
danke für deinen Beitrag! Echt super Denkanstoß - genau sowas habe ich 
gebraucht. Leider kann ich nur C aber das sollte sich ja umsetzen lassen 
:-)

von Daniel S. (ds1982)


Lesenswert?


von Armin Volk (Gast)


Lesenswert?

Daniel S. schrieb:
> ... um nur einige Beispiele zu nennen!

Danke, aber ist dir mal aufgefallen dass der Aufbau in SMD ist?

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Der Mikrocontroller braucht entweder ein Quarz für die Uhr oder ein 
DCF77-Modul oder eine externe Uhr. Mit dem internen RC-Oszillator kann 
man keine Uhr bauen, der ist viel zu ungenau.

Grüße,

Peter

von Maria (Gast)


Lesenswert?

Peter Diener schrieb:
> Der Mikrocontroller braucht entweder ein Quarz für die Uhr oder ein
> DCF77-Modul oder eine externe Uhr. Mit dem internen RC-Oszillator kann
> man keine Uhr bauen, der ist viel zu ungenau.
>
> Grüße,
>
> Peter

Es soll ja auch keine Uhr werden.
Er soll einfach ab anschalten alle 20min per Licht morsen. Fertig

Ob das nun 19,3 oder 20,1 Minuten sind ist im Prinzip auch Wurst.

von Maria (Gast)


Lesenswert?

Misst jetzt bi ich auf absenden gekommen :-(
So hab ich das zumindest verstanden!

von Sam .. (sam1994)


Lesenswert?

Das ganze Programm sollte nur von Interrupts gesteuert sein - die 
Hauptschleife leer. Da gibt es auch keine Zeitprobleme bei der einfachen 
Aufgabe. Das macht das ganze auch einfacher. Kleine Frage: Warum nicht 
der AnalogComperator, der würde das Programm nochmals vereinfachen.

AnalogComperatorISR:
   Timer ein/ausschalten
TimerISR:
   Led kontrollieren

von n halber goggel (Gast)


Lesenswert?

Samuel K. schrieb:
>Willst du dass ihm alles um die Ohren fliegt?
Wieso denn das?

von Sam .. (sam1994)


Lesenswert?

n halber goggel schrieb:
> Ich zitiere, was andere nicht geschrieben haben

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.