• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Reaktives Licht mit Atmel AVR

doncorso

Geocacher
-... also wenn´s ECHT daran liegt, wäre ja klasse!

ich hab einen Attiny13V, also mit "V", aber ide Sache mit dem halben USB-Kabel interessiert mich. Gibt´s da ne Bastelanleitung zu? Ich würd nur ungern einfach drauflostesten, weil ich im Moment nur den einen Attony hier hab und wenn ich den verbruzzel, muss ich bis nach Ostern warten, bis neue kommen ...

danke!

DC

.
 

chr2k

Geomaster
USB Kbel aufschneiden, den Vcc und den Ground Draht nehmen und am Tiny richtig anschließen. USB Kabel dann ind en PC stecken. Die Datenadern des USB Kabels lässt du beim anschließen natürlich weg.
 

stonewood

Geowizard
... und die Standardfarben von USB-Kabeln sind:

- schwarz - GND
- weiß, grün - Datenleitung
- rot - +5V

Bei den flachen Steckern (Typ A glaub ich) ist GND und +5V jeweils ganz rechts und ganz links, die mittleren beiden Kontakte sind die Datenleitungen.
 

conrad

Geocacher
Windi schrieb:
Willst Du nach dem Anleuchten nur einen Dauerimpuls von 15 Sekunden.
.............................
Code:
Blinken:                                                    'LED blinken lassen
Wdtcr = &B11110001                                          'Watchdog auf 8 Sekunden stellen
  Portb.3 = 1
  Reset Watchdog
  Powerdown
  Reset Watchdog
  Powerdown
  Portb.3 = 0
Wdtcr = &B11010011                                          'Watchdog wieder auf 0,125 Sekunden zurückstellen
Alt = 1023                                                  'Doppelauslösung verhindern
Return

Wenn ich jetzt 3 Sekunden Dauerleuchten wollte, müßte ich dann Wdtcr = &B11110001 gegen &B10000001 tauschen? Also Quasi 1 Sek. 3x durchlaufen lassen? Danke fürs drüberschauen an die Programmierer ;-)
Gruß Conrad

EDIT: Nee, klappt nicht. Wi e stellt sich eine Sekunde dar?
 

stonewood

Geowizard
conrad schrieb:
Wenn ich jetzt 3 Sekunden Dauerleuchten wollte, müßte ich dann Wdtcr = &B11110001 gegen &B10000001 tauschen? Also Quasi 1 Sek. 3x durchlaufen lassen? Danke fürs drüberschauen an die Programmierer ;-)
Gruß Conrad

EDIT: Nee, klappt nicht. Wi e stellt sich eine Sekunde dar?
Dann schau Dir mal http://www.geoclub.de/viewtopic.php?p=361689#361689 genau an.
1s: 0 1 1 0
2s: 0 1 1 1
4s: 1 0 0 0
8s: 1 0 0 1

Also sollte 11100110 Dich weiterbringen. Wie immer, ungetestet. :wink:
 

conrad

Geocacher
Dqanke sehr....
Aber wen 8s = 1001 warum taucht 1001 dann nicht in Windys 24s Programm auf? da wird doch der WD auf 8s gesetzt. Teste morgen mal weiter.... Nochmals danke
Conrad
 

stonewood

Geowizard
Neenee, das taucht da nicht im Klartext auf. Die Bits sind etwas verschoben, insbesondere ist WDP3 nicht da wo man es vermutet: Das ist an der 5. Stelle, nicht an der 3. (von 0 an gezählt) . 11x10xxx ist also fest. Und da die 8s reingepfriemelt gibt dann 11110001. Uii, das gleiche wie bei Windi. :)
 

conrad

Geocacher
Na das soll nun einer wissen :lol:
Danke für die kurze Erläuterung.
Auf jeden Fall kann ich nun die 3 Sek. realisieren....
Gruß und Dank
Conrad
 

ksbender

Geocacher
waste1 schrieb:
Nachdem hier eine Nachfrage für die Morseerkennung besteht, stell ich mal mein Programm rein, so wie es ist. Es ist speziell auf meine Bedürfnisse, also nicht auf Universalität ausgelegt, kann aber trotzdem für den ein oder anderen nützlich sein. Das Programm ist leider nicht mehr mit der Schaltung nach Abb.6 aus dem Kochbuch kompatibel. Ich musste den ATtiny45 nehmen, weil das Programm nicht mehr in den ATtiny13 passte. Außerdem habe ich anstatt des LDRs einen Fototransistor genommen, weil der schneller reagiert und zudem den Vorwiderstand und Fototransistor vertauscht. So ist jetzt der AD-Wert bei hell = 0 und bei dunkel = 1023 ist. Damit kann ich dann den internen Pullup softwaremäßig zum Vorwiderstand parallel schalten, um die Erkennung unempfindlicher zu machen, so dass im Nahfeld der Lichtsensor nicht übersteuert wird. Bei meinen Reaktivlichtern steht man nämlich beim Morsen sehr nahe. Das Programm ist eine Erweiterung von Windis Programm aus dem Kochbuch Kap. 5.2. Zum Teil sind noch Variablennamen vorhanden, obwohl sie keinen Bezug mehr haben, z.B. LDR . Wen es stört, darf sie ersetzen.

Das Programm erkennt eingegebene Morsezeichen und vergleicht sie mit den Symbolen, die in der Variable „Ein“ gespeichert sind. Bei Übereinstimmung wird dann das in der Variable „Aus“ gespeicherte Losungswort ausgegeben. Bei einem Fehler werden sofort 8 dits (Irrung) ausgegeben. Die Erkennung funktioniert im Bereich von 1.2 bis 20 WPM. Die Geschwindigkeit wird beim 1. Symbol gemessen und daraus der Grenzwert Bx für dit/dah bestimmt. In meinem Beispiel ist das 1. Symbol ein dit. Bei einem dah als 1. Symbol müsste Bx dementsprechend anders berechnet werden. Die Erkennung unterscheidet nicht zwischen Symbol-, Buchstaben- und Wortpausen. Deshalb gibt es auch keine eigene Zeichen für Buchstaben- oder Wortpausen. Das Morsen mit der Taschenlampe ist schon so schwer genug, da braucht es nicht auch noch diese Unterscheidung. Die Fehlermeldung wird immer mit konstanter Geschwindigkeit ausgegeben, während das Losungswort mit der Geschwindigkeit der eingegeben Zeichen wiedergegeben wird. Während der Morseerkennung wird der Watchdog auf 32ms umgestellt, damit man auch schnelleres Morsen erkennen kann.

Ach ja, noch etwas. Für mein Programm müssen die Fusebits unverändert sein, also wie ab Werk.
Nun viel Spaß beim Nachbauen!

Code:
'=============================================================
'
' ************************************************************
' ***                                                      ***
' ***            Reaktivlicht mit Morseerkennung           ***
' ***            Fototransistor und A/D-Wandler            ***
' ***     Watchdog-Energiesparmodus und Tagabschaltung     ***
' ***                                                      ***
' ************************************************************
'
' µC: ATtiny45V
' Fusebits bleiben wie ab Werk
' +Ub: 3,00 V
' I: 6 µA im Leerlauf (Nachtbetrieb)
' I: 5 µA bei Tagabschaltung
' Reichweite:
'
'=============================================================

$regfile = "ATtiny45.DAT"
$crystal = 500000                                           'Frequenz des internen Oszillators

$hwstack = 32

Config Clockdiv = 16                                        'ergibt 500kHz Clock

Config Adc = Single , Prescaler = 2
Admux = &B00000010                                          'Channel 2 für ADC
Config Portb = &B00001000                                   'Pinb.3 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111                                          'Pullups zuschalten, außer für Pinb.3 und .4
Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen
Set Didr0.4                                                 'Digital Buffer für ADC2 abschalten
Set Portb.4                                                 'Pullup für PORTB.4 zuschalten

Wdtcr = &B11010011                                          'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset
Enable Interrupts                                           'Interrupts freigeben

Const Tagschwelle = 100                                     'Schwellwert für Schlafmodus

Dim Abfrage As Byte
Dim Hell As Byte
Dim Vhell As Byte
Dim Ok As Byte
Dim B As Byte
Dim Bx As Byte
Dim Z As Byte
Dim I As Byte
Dim Lb As Byte
Dim Aus As Byte
Dim Ein As Long
Dim Count As Word
Dim Tagzaehler As Integer
Dim Schwelle As Integer
Dim Ldr As Integer                                          '0 = Hell, 1023 = Dunkel
Dim Alt As Integer
Dim Merker As Integer
Dim D1 As Integer
Dim B2 As Integer

Z = 0
Ein = &B11100100010100000                                   'Eingabezeichen: ".... .- .-.. .-.. ---" = HALLO
Schwelle = 90                                               'je größer der Schwellwert, desto unempfindlicher

Portb.3 = 1                                                 ' LED an
Waitms 300
Portb.3 = 0                                                 ' LED aus

Do
Reset Watchdog
Powerdown                                                   'prozessor bremsen da sonst lichtänderung nicht erkannt wird
'Start Adc                                                   'A/D-Wandler starten
'Ldr = Getadc(2)                                             'geht nicht
Adcsra = &B11000000                                         'startet ADC und Messung
Do
Loop Until Adcsra.6 = 0                                     'warte bis Messung fertig
Stop Adc                                                    'A/D-Wandler zum Stromsparen wieder stoppen
Lb = Adcl                                                   'Helligkeitswert einlesen
Ldr = Adch
Shift Ldr , Left , 8
Ldr = Ldr + Lb

If Abfrage = 1 Then
   If Ldr < Schwelle Then
      Hell = 1
   Else
      Hell = 0
   End If
Else
   Merker = Alt - Ldr
   If Schwelle < Merker Then
      Abfrage = 1
      Ok = 1
      B = 0
      Schwelle = Alt + Ldr
      Shift Schwelle , Right , 1                            'Schwelle = Schwelle / 2
      Hell = 1
   Else
      Abfrage = 0
      Schwelle = 90
   End If
End If
Alt = Ldr

If Abfrage = 1 Then
   If Hell = 1 Then
      If Vhell = 0 Then B = 0                               ' Übergang zu Hell
      Vhell = 1
   End If
   If Hell = 0 Then
      If Vhell = 1 Then                                     ' Übergang zu Dunkel
         If Z = 0 Then
            Bx = B + B                                      ' B * 2, Grenze für dit/dah
            B2 = 3 * Bx                                     'Grenze für Pause = 6 dit
         End If
         If B < Bx Then
            If Ein.z = 1 Then Ok = 0
         Else
            If Ein.z = 0 Then Ok = 0
         End If
         Z = Z + 1
         B = 0
      End If
      Vhell = 0
      If B > B2 Then Ok = 0                                 ' zu lange dunkel
   End If
   B = B + 1
   If B > 90 Then Ok = 0                                    ' zu langsam
   If Count = 0 Then Ok = 0                                 ' beim 1.Mal blinken
   Count = 2400                                             'macht Erkennung scharf, Pull up
   If Ok = 1 Then
      If Z = 17 Then                                        ' dann morsen
         Waitms 500                                         ' Pause
         Aus = &B00011                                      'Bits von rechts n. links = Ausgabezeichen: "--..." = 7
         Z = 4
         D1 = Bx
         Shift D1 , Left , 4                                'Bx * 16, D1 = B * 32ms
         Gosub Morsen
      End If
   Else
         Aus = &B00000000                                   'Fehler: Ausgabezeichen: "........" = Irrung
         Z = 7
         D1 = 120
         Gosub Morsen
   End If
End If

If Count > 0 Then                                           'Pullup für schnellere Detektion zuschalten
   If Count = 1 Then
      Reset Portb.4                                         'Pullup für PORTB.4 ausschalten
      Alt = 0                                               'Auslösung wegen Abschalten des Pullups vermeiden
      Portb.3 = 1                                           ' LED kurz an
      Waitms 5
      Portb.3 = 0                                           ' LED aus
   Else
      Set Portb.4                                           'Pullup für PORTB.4 zuschalten
   End If
   Decr Count
End If

If Ldr < Tagschwelle Then                                   'prüfen ob helligkeit über tagschwelle liegt
   If Tagzaehler < 2500 Then
      Incr Tagzaehler
   End If
Else
   Tagzaehler = 0                                           'wenn wieder dunkel tagzähler löschen
End If

If Tagzaehler < 2400 Then                                   ' entspricht 5min
   If Count = 0 Then
      Wdtcr = &B11010011                                    'Watchdog auf 0,125 Sekunden stellen
   Else
      Wdtcr = &B11010001                                    'Watchdog auf 0,032 Sekunde stellen
   End If
Else
   Wdtcr = &B11110001                                       'Watchdog auf 8 Sekunden stellen
End If

Loop

Morsen:
   For I = 0 To Z
      Portb.3 = 1                                           ' LED an
      Waitms D1                                             ' dit
      If Aus.i = 1 Then                                     ' dah
         Waitms D1
         Waitms D1
      End If
      Portb.3 = 0                                           ' LED aus
      Waitms D1                                             ' 1 dit Pause
   Next I
   Abfrage = 0
   Z = 0
   Schwelle = 90
Return

End

Das war ja echt ein nettes Programm, genauso wie es mir für den nächsten Nachtcache gewünscht habe. Man will sich ja schließlich steigern. Endlich habe ich auch einen 45V nach Portugal bekommen. Aktuell habe ich ein 3-Farben-Reaktivlicht installiert.
Aber hier habe ich leider irgendein Problem.
Bei jedem anleuchten geht auf der Stelle die Irrung an.
Hat jemand eine Ahnung, wo ich einen Bock drin haben könnte?
Gruß
Stephan
 

ksbender

Geocacher
ksbender schrieb:
Hat jemand eine Ahnung, wo ich einen Bock drin haben könnte?
Gruß
Stephan

So, ich habe ein wenig an der Oszillatorfrequenz und der Clockdiv herumgespielt. Jetzt funktioniert es hervorragend.
Andere Frage: Weiß jemand, wie man beim ATtiny 45V Morsezeichen ins EEPROM schreiben kann? Im Kochbuch unter 4.11 war´s ja ganz prima für den ATtiny 13 beschrieben.
Fusebit High 6 auf 0 - nehme ich an.
$regfile = "ATtiny45.DAT" - neheme ich an.
Aber leider wird nichts ins EEPROM geschrieben.
Kann mir bitte jemand weiterhelfen?
Danke und Gruß
Stephan
 

thomas_st

Geowizard
ksbender schrieb:
Fusebit High 6 auf 0 - nehme ich an.
Nein! Damit hast Du DebugWIRE eingeschaltet (DWEN = 0). Das EESAVE Fuse ist High 3. Darin unterscheidet sich der Tiny 13 vom Tiny 25/45/85. Beim Tiny 13 ist das EESAVE Fuse allerdings auch im Fuse Lowbyte (Low 6).
So wie ich das Datenblatt verstehe, hat das aber nur eine Bedeutung wenn der Chip komplett gelöscht wird: EESAVE auf 0 und der Löschvorgang ignoriert den EEPROM.
Hast Du keine programmtechnische Hilfe für die Programmierung der Fusebits - dann spielst Du aber ganz schön mit dem Feuer. Zumindest ein Blick ins Datenblatt solltest Du dann vorher riskieren!

Was ich gerade noch sehe, ist folgender Satz im Datenblatt bzgl DWEN Fuse: After this fuse has been progammed device can be programmed via high-voltage serial mode, only.

Ich glaube Du hast Dich damit gerade ausgesperrt :?

HTH,
Thomas(_st)
 

ksbender

Geocacher
thomas_st schrieb:
Ich glaube Du hast Dich damit gerade ausgesperrt :?

HTH,
Thomas(_st)


Vielleicht hatte ich ja Glück.
Auf jeden Fall komme ich unter BASCOM an Fusebit High 3 gar nicht ran.
Gruß
Stephan
 

Anhänge

  • 45_Lock and Fuse Bits.jpg
    45_Lock and Fuse Bits.jpg
    113,3 KB · Aufrufe: 1.020

thomas_st

Geowizard
ksbender schrieb:
Vielleicht hatte ich ja Glück.
Auf jeden Fall komme ich unter BASCOM an Fusebit High 3 gar nicht ran.
Ok. Da scheint BASCOM (nutze ich nicht) eine andere Bezeichung als das Datenblatt zu nutzen. Das Datenblatt zum Tiny25/45/85 meint:
Code:
Fuse Lowbyte:
 Bit 0...3: CKSEL 0...3
 Bit 4&5: SUT0&1
 Bit 6: CKOUT
 Bit 7: CKDIV8
Fuse Highbyte:
 Bit 0...2: BODLEVEL0...2
 Bit 3: EESAVE
 Bit 4: WDTON
 Bit 5: SPIEN
 Bit 6: DWEN
 Bit 7: RSTDISBL
Fuse Extended Byte:
 Bit 0: SELFPRGEN
Sorry für die Verwirrung, aber die Bezeichung von BASCOM empfinde ich etwas verwirrend. High 6 hatte ich eben einfach auf Highbyte Bit 6 interpretiert und das ist DWEN (im BASCOM Nomenklatur wohl Fusebit High 9 :roll:)

Viele Grüße,
Thomas(_st) - ansonsten weiß ich jetzt auch erstmal nicht weiter, warum das Programmieren des EEPROMS nicht klappt.
 
ksbender schrieb:
ksbender schrieb:
Andere Frage: Weiß jemand, wie man beim ATtiny 45V Morsezeichen ins EEPROM schreiben kann? Im Kochbuch unter 4.11 war´s ja ganz prima für den ATtiny 13 beschrieben.

Aber leider wird nichts ins EEPROM geschrieben.
Kann mir bitte jemand weiterhelfen?

Hallo Stephan,

probier doch mal das EEPROM "per Hand" zu beschreiben analog zum ATtiny 13 müßte das doch auch folgendermaßen funktionieren:

"""EEPROM programmieren unter BASCOM geht unter "Program" -> "Send to Chip" - Aber jetzt nur der rechte PFEIL !!! -> "Manual Program"

Das ist genau da, wo Du die Fusebits eingestellt hast.

Jetzt die mittlere Karteikarte "EEPROM" auswählen.

Ändere die entsprechenden Adressen auf dem "Schachbrett" durch überschreiben.

Jetzt noch "Write Buffer into EEPROM" - der rote Pfeil!

Fertig! """

Viel Erfolg!
 

ksbender

Geocacher
Waste1 hat auf Seite 80 dieses Threads Hell und Dunkel vertauscht.
Damit müssen die entsprechenden Variablen auch umgestellt werden.
Hat bei mir nicht geklappt - ich habe jetzt einen Dauerblinker (bei Tag und Nacht).
Könnte jemand mal windis Programm 5.2 aus dem Kochbuch entsprechend anpassen und hier posten?
Grüße
Stephan
 

Funki_8

Geocacher
Hi, jetzt habe ich mir auch mal ein ATtiny 13 nach dem Kochbuch konfiguriert.

Nicht schlecht, was man so mit einer LED ohne LDR anrichten kann :)
Zum Stromsparen habe ich dann auch noch mal, wie beschrieben, die Fuse verstellt, seit dem komme ich mit Bascom nicht mehr an ihn ran. Er wirt nicht mal mehr erkannt.

Klar denkt ihr jetzt alle, ich habe dort ein falsches Bit gesetzt, aber neee.

Mit dem STK500 komme ich auch mit ISP noch ran.
Nur mit dem einfachen LPT Kabel plus 3 Widerstände geht nix mehr.
Inzwischen habe ich mir noch mal ein zweiten gekauft, der geht, also ist das Kabel i.O.
Muß ich in Bascom, aufgrund des geänderten internen Taktgenerators, was neu einstellen?

Ich hoffe ihr konntet mir folgen

Grüße aus Berlin
 

Windi

Geoguru
Funki_8 schrieb:
Muß ich in Bascom, aufgrund des geänderten internen Taktgenerators, was neu einstellen?
Stell mal den Crystal-Wert auf 16000
Programm nochmals kompilieren und dann sollte es wieder klappen.

Die "Taktfrequenz" der parallelen Schnittstelle wird damit an die Taktfrequenz des Prozessors angepasst.
 

thomas_st

Geowizard
Funki_8 schrieb:
Klar denkt ihr jetzt alle, ich habe dort ein falsches Bit gesetzt, aber neee.
Doch ;) Du hast die Taktfrequenz zu weit nach unten gesetzt. Solche "lahmen Enten" hatte ich auch mal produziert. Die waren dann auch erst mit dem STK500 wiederzubeleben. Bei diesem ist die Kommunikationsgeschwindigkeit über den seriellen Bus unabhängig von der Taktfrequenz des Tiny.

Funki_8 schrieb:
Muß ich in Bascom, aufgrund des geänderten internen Taktgenerators, was neu einstellen?
Siehe Posting von windi. Mit dem Bascom hast Du eventuell noch Chancen - mit dem mir damals zur Verfügung stehenden Ponyprog und avrdrude ging nichts mehr.

Viel Erfolg,
Thomas(_st)
 

Funki_8

Geocacher
Danke für eure schnellen Antworten.
Mit dem Crystal-Wert werde ich heute Abend mal versuchen, aber da ich den ATtiny ja nicht mehr ansprechen kann wird es mit dem Programmieren denke ich schwer.
Ich kann ja nicht mal mehr die ID mit Bascom auslesen.

Ich habe mich mit den Einstellungen der Fuse komplett nach dem "Kochbuch" gerichtet.

>Wir stellen nun zwei Sachen
>ein: „Interner 128 kHz-Oszillatorbetrieb“ und „Taktverhältnis beim Starten 1:1“. Dazu klicken
>wir zunächst auf das „Fusebit DCBA“ und stellen es auf „1011:Int. RC Osc. 128 kHz; >Start-up time:
>14 CK + 64 ms“. Dann klicken wir auf das „Fusebit E“ und stellen dort „1:Divide clock by 8, >OFF“
>ein.


Da dürfte es doch eigentlich keine Probleme geben, ist doch mehrfach erprobt?
Was nutzt ihr für eine Einstellung für den internen Oszillator?

Gruß
 
Oben