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
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.
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.
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 ;-)
Was ist mit "Ausgesendet" gemeint? Die eigentliche Frage nach der Anzahl der Timer: Genau einer nötig ;)
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.
Ok vielen Dank - aber eigentlich ging es mir viel mehr um die Realisierung im Programmcode als um die Elektronik ;-)
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
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
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.
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 | }
|
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 ;)
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...
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 :-)
Armin Volk schrieb: > Leider hat Reichelt keinen im Angebot... http://www.reichelt.de/?ARTICLE=23470;PROVID=1024 http://www.reichelt.de/?ARTICLE=23443;PROVID=1024 http://www.reichelt.de/?ARTICLE=10441;PROVID=1024 ... um nur einige Beispiele zu nennen!
Daniel S. schrieb: > ... um nur einige Beispiele zu nennen! Danke, aber ist dir mal aufgefallen dass der Aufbau in SMD ist?
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
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.
Misst jetzt bi ich auf absenden gekommen :-( So hab ich das zumindest verstanden!
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
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.