Das Erste, was mir nach der Anmeldung im Geoclub-Forum ins Auge stach (und nein, es hat nicht weh getan 😉 war der „Elektronik-Bereich“. Da noch nicht alle Kenntnisse aus den 4 Semestern Elektrotechnik und dem Versuchspraktikum verloren sind und mein letztes Projekt (der Beitrag folgt noch) schon etwas zurück liegt, musste ein neues Vorhaben geplant werden 🙂 Die Spielerei mit Microcontrollern wollte ich schon lange ausprobieren, da sich an dieser Stelle Informatik und E-Technik wunderbar vereinen lassen. Und nicht zu vergessen, natürlich das Geocaching. Nach einiger Lektüre im Forum, wusste ich, was es werden sollte:
ein Reaktivlicht mit Siebensegmentanzeige.
Für den Bauplan und den Code des µC orientierte ich mich an der Variante von
Als µController wurde der ATtiny24 gewählt. Nachdem ich das zugehörige Datenblatt gelesen habe, war ich von den Möglichkeiten, die das kleine Teil für unter 2€ bietet, so begeistert, dass ich darüber auch noch nen ganzen Artikel schreiben könnte 🙂 Für die Messung des Umgebungslichtskommt ein Fotowiderstand (LDR) zum Einsatz und keine LED, wie bei einigen Reaktivlichtern ohne Siebensegmentanzeige. Beim Anschluss der Anzeige an den µC musste ich das Datenblatt bemühen, da die Pins von Modell zu Modell unterschiedlich sind. Die Stiftleiste zum Anschluss der Spannungsquelle und des Programmieradapters habe ich weggelassen, da ich den µC auf einem IC-Sockel verbaut Eryaman habe und ihn dadurch nicht in der Schaltung programmieren muss. Diese Realisierung finde ich vorteilhaft, da man den µC nun austauschen kann und eine Erweiterung der Funktionen Arrontes einfacher ist. Der Aufbau erfolgte auf einer Lochrasterplatine, da ich mich mit dem Ätzen von Platinen nicht beschäftigen wollte. Nun zur Software:
II. Das Programm
Für die Programmierung des µC wählte ich Bascom-AVR, da man dort spezielle Befehle und Register der Atmel-µC einfacher ansprechen kann, als unter C oder Assembler. Die Sprache Website in Bascom ist ein Mix aus Basic und Assemblerbefehlen. Beim Programm selbst, habe ich auch große Teile der Version von
Der Code:
$hwstack = 20 'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen $regfile = "ATtiny24.DAT" $crystal = 128000 'Frequenz des internen OszillatorsConfig Adc = Single , Prescaler = Auto Config Portb = &B00000111 'Pinb.0-2 auf 'Ausgang', Rest auf 'Eingang' schalten Config Porta = &B10001011 'Pinq.0+1+3+7 auf 'Ausgang', Rest auf 'Eingang' schalten Portb = 0 'Ausgänge auf Low setzen Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen Wdtcr = &B11010011 'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset Enable Interrupts 'Interrupts freigeben Const Schwelle = 60 'je größer der Schwellwert, desto unempfindlicher Const Tagschwelle = 800 'Schwellwert für Schlafmodus Const Zwangsimpuls = 15 'LED-Impuls tagsüber alle X Schlafyklen (á ca. 8 Sekunden) Dim A As Byte 'Variablen definieren Dim Tagzaehler As Byte Dim Schlafzaehler As Byte Dim Zaehler As Byte Dim Ldr As Integer '0 = Dunkel, 1023 = Hell Dim Alt As Integer Dim Merker As Integer Dim Zeichen As String * 1 Do Reset Watchdog Powerdown 'prozessor bremsen da sonst lichtänderung nicht erkannt wird Start Adc 'A/D-Wandler starten Ldr = Getadc(2) 'Helligkeitswert einlesen Stop Adc 'A/D-Wandler zum Stromsparen wieder stoppen Merker = Ldr - Alt 'Unterschied zwischen letzter und aktueller Messung ermitteln Alt = Ldr wholesale NBA jerseys 'letzten LDR-Wert sichern If Merker > Schwelle Then Gosub Morsen 'Bei großer Änderung Dunkel->Hell: Blinken If Ldr > Tagschwelle Then 'prüfen ob helligkeit über tagschwelle liegt If Tagzaehler < 255 Then Tagzaehler = Tagzaehler + 1 End If Else Tagzaehler = 0 'wenn wieder dunkel tagzähler löschen End If If Tagzaehler > 200 Then Gosub Pause 'wenn mehr als x Zyklen hell dann Schlafmodus Loop Pause: Wdtcr = &B11110001 'Watchdog auf 8 Sekunden stellen Reset Watchdog Powerdown Wdtcr = &B11010011 'Watchdog wieder auf 0,125 Sekunden zurückstellen Schlafzaehler = Schlafzaehler + 1 'merken wie oft cheap NBA jerseys Schlafmodus durchlaufen wurde If Schlafzaehler = Zwangsimpuls Then 'als Funktionskontrolle tagsüber LED auslösen Porta.1 = 1 Reset Watchdog Powerdown Porta.1 = 0 Schlafzaehler = 0 End If Return Morsen: Restore Daten 'Am Beginn der Daten anfangen Alt = 1023 'Doppelauslösung verhindern Do Read Zeichen Wdtcr = &B11110000 'Watchdog auf 4s stellen If Zeichen = "0" Then Gosub K0 If Zeichen = "1" Then Gosub K1 If Zeichen = "2" Then Gosub K2 If Zeichen = "3" Then Gosub K3 If Zeichen = "4" Then Gosub K4 If Zeichen = "5" Then Gosub K5 If Zeichen = "6" Then Gosub K6 If Zeichen = "7" Then Gosub K7 If Zeichen = "8" Then Gosub K8 If Zeichen = "9" Then Gosub K9 If Zeichen = "n" Then Gosub Pn If Zeichen = "e" Then Gosub Pe Wdtcr = &B11010110 'Watchdog auf 1s stellen If Zeichen = "B" Then Gosub Pb Wdtcr = &B11010010 'Watchdog auf 0,064s stellen If Zeichen = "Z" Then Gosub Pz Wdtcr = &B11010011 'Watchdog wieder auf 125ms stellen If Zeichen = "X" Then Return Loop Pb: Reset Watchdog 'loescht Anzeige fuer Watchdogperiode Powerdown Portb = 0 Porta = 0 Return P0: Portb = &B00000111 Porta = &B10000011 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return P1: Portb = &B00000110 Reset Watchdog Powerdown Portb = 0 Return P2: Portb = &B00000011 Porta = &B10001010 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return P3: Portb = &B00000111 Porta = &B00001010 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return P4: Portb = &B00000110 Porta = &B00001001 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return P5: Portb = 2013. &B00000101 Porta = &B00001011 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return P6: Portb = &B00000100 Porta = &B10001011 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return P7: Portb = &B00000111 Reset Watchdog Powerdown Portb = 0 Return P8: Portb = &B00000111 Porta = &B10001011 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return P9: Portb = &B00000111 Porta = &B00001001 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return Pn: Portb = &B00000100 Porta = &B10001000 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return Pe: Portb = &B00000001 Porta = &B10001011 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return Pz: Zaehler = 0 Do Portb = &B00000001 Reset Watchdog Powerdown Portb = 0 Portb = &B00000010 Reset Watchdog Powerdown Portb = 0 Porta = &B00001000 Reset Watchdog Powerdown Porta = 0 Porta = &B10000000 Reset Watchdog Powerdown Porta = 0 Porta = &B00000010 Reset Watchdog Powerdown Porta = 0 Portb = &B00000100 Reset Watchdog Powerdown Portb = 0 Porta = &B00001000 Reset Watchdog Powerdown Porta = 0 Porta = &B00000001 Reset Watchdog Powerdown Porta = 0 Portb = &B00000001 Reset Watchdog Powerdown Portb = 0 Portb = &B00000010 Reset Watchdog Powerdown Portb = 0 Porta = &B00001000 Reset Watchdog Powerdown Porta = 0 Porta = &B10000000 Reset Watchdog Powerdown Porta = 0 Porta = &B00000010 Reset Watchdog Powerdown Porta = 0 Portb = &B00000100 Reset Watchdog Powerdown Portb = 0 Porta = &B00001000 Reset Watchdog Powerdown Porta = 0 Porta = &B00000001 Reset Watchdog Powerdown Porta = 0 Zaehler = Zaehler + 1 If Zaehler = 2 Then Return Loop Return Leer: Reset Watchdog Powerdown Reset Watchdog Powerdown Return 'b immer aus 'f immer an K0: Portb = &B00000101 Porta = &B10000011 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return K1: Portb = &B00000100 Porta = &B00000001 Reset Watchdog Powerdown Porta = 0 Portb = 0 Return K2: Portb = &B00000001 Porta = &B10001011 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return K3: Portb = &B00000101 Porta = &B00001011 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return K4: Portb = &B00000100 Porta = &B00001001 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return K5: Portb = &B00000101 Porta = &B00001011 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return K6: Portb = &B00000100 Porta = &B10001011 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return K7: Portb = &B00000101 Porta = &B00000001 Reset Watchdog Powerdown Porta = 0 Portb = 0 Return K8: Portb Renewal = &B00000101 Porta = &B10001011 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return K9: Portb = &B00000101 Porta = &B00001001 Reset Watchdog Powerdown Portb = 0 Porta = 0 Return End Daten: Data "Z" , "B" Data "n" , "1" , "2" , "3" , "4" , "5" Data "e" , "6" , "7" , "8" , "9" , "0" Data "B" , "Z" Data "X"
Wer den Code so auf den µC überträgt, wird entweder denken, dass seine 7-Segmentanzeige kaputt ist oder das die Verdrahtung nicht stimmt 🙂 Aber seid beruhigt, es ist bestimmt alles in Ordnung.
Da mir die „normale“ Anzeige der Koordinaten zu einfach erschien, wholesale NBA jerseys überlegte ich, wie man da ein kleines Rätsel einbauen konnte. Da kam mir die Idee, dass ja einzelne Segmente „kaputt gegangen“ sein könnten und so erweiterte ich den Code um die Bereiche K0 – K9, die nicht die normalen Zahlen anzeigen, sonder eine kaputte 7-Segmentanzeige simulieren, bei der das Segment f dauerhaft leuchtet und das Segment b immer aus ist.
Den Schwierigkeitsgrad könnte man natürlich noch erhöhen, indem man z.B. noch mehr Segmente „ausfallen“ lässt. Wer die normalen Zahlen möchte, muss in der Sub „Morsen“ die gosub-Befehle auf die Label P0 – P9 verweisen. Das Label „Z“ zeigt ein selbstgebasteltes Lauflicht, das man beispielsweise zur Signalisierung der Auslösung verwenden kann.
Die ganze Bastelei wurde so konzipiert, dass sie in einen PETling passt und somit dann wasserdicht platziert werden kann. Oh, fast hätte ich ja die Spannungsversorgung vergessen 🙂 Die läuft bei mir über eine 3,6V Lithium-Zelle, auch bekannt als die „10-jahres Batterie für niedrige Ströme“ 😉
Sollte ich nochmal Zeit finden, ein Video davon zu erstellen, wird es natürlich hier veröffentlicht.