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

Reaktivlicht auf Atmega8

kirby27b

Geocacher
Hi,

nachdem ich den ganzen Tag gebraucht habe um den Schaltungsfehler in meiner LED Matrix zu finden, komme ich bei der Portierung des Reaktivmorsen auf den Mega 8 keinen deut weiter. Wiso Mega 8, naja ich brauche die größere Anzahl an Ausgängen. Wäre schön wenn jemand eine Lösung ( Bascom ) für mich hätte
Danke Olaf

Ps.: es geht um dieses Programm:
'============================================================
'
' ********************************************************
' *** ***
' *** Tiny-Reaktivlicht mit LDR und A/D-Wandler ***
' *** mit Watchdog-Energiesparmodus und Tagabschaltung ***
' *** Ausgabe von Morsesignalen beim Anleuchten ***
' *** ***
' *** erstellt von Windi für www.geoclub.de ***
' *** 04.01.2008 ***
' *** ***
' ********************************************************
'
' µC: ATtiny13V
' +Ub: 3,00 V
' I: 17 µA im Leerlauf (Nachtbetrieb)
' I: 5 µA bei Tagabschaltung
' Reichweite: 650 m mit Maglite 5D
'
'============================================================

$hwstack = 20 'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
$regfile = "ATtiny13.DAT"
$crystal = 128000 'Frequenz des internen Oszillators




Config Adc = Single , Prescaler = Auto
Config Portb = &B00001000 'Pinb.3 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 = 50 'je größer der Schwellwert, desto unempfindlicher
Const Tagschwelle = 800 'Schwellwert für Schlafmodus
Const Zwangsimpuls = 8 '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 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 '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 'int-variable geht nur bis 255
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 Schlafmodus durchlaufen wurde
If Schlafzaehler = Zwangsimpuls Then 'als Funktionskontrolle tagsüber LED auslösen
Portb.3 = 1
Reset Watchdog
Powerdown
Portb.3 = 0
Schlafzaehler = 0
End If
Return

Morsen:
Restore Daten 'Am Beginn der Daten anfangen
Alt = 1023 'Doppelauslösung verhindern
Do
Read Zeichen
Wdtcr = &B11010100 'Watchdog auf 250ms stellen
If Zeichen = "*" Then Gosub Kurz
If Zeichen = "-" Then Gosub Lang
If Zeichen = " " Then Gosub Leer
Wdtcr = &B11010011 'Watchdog wieder auf 125ms stellen
If Zeichen = "X" Then Return
Loop

Kurz:
Portb.3 = 1
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Return

Lang:
Portb.3 = 1
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Return


Leer:
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Return

End

Daten:
Data "*" , "-" , " " 'A
Data "-" , "-" , "*" , "*" , "*" , " " '7
Data "-" , "*" , "*" , "*" , " " 'B
Data "*" , "*" , "*" , "*" , "-" , " " '4
Data "X"
 

Kappler

Geowizard
Auf jeden Fall musst du die Zeile Regfile="attiny13.dat" ändern in "m8def.dat", damit auch die richtigen Register verwendet werden.

Ansonsten die Ein- und Ausgänge auf die verwendeten Pins setzen, dann sollte es eigentlich laufen...

Es kann höchstens sein, dass beim Mega8 die Register andere Namen haben, dann soltest du eigentlich beim Kompilieren Syntax-Fehler ehalten. Die richtigen Registernamen müssten im Datenblatt oder im Regfile zu finden sein.
 

Windi

Geoguru
Wie Kappler schon schrieb ist evtl. das Watchdog-Register anders.
Zum Ausprobieren kannst Du ja mal "Reset Watchdog / Powerdown"-Befehle weglassen und durch "waitms xxxx" ersetzen.
Wenn ich wieder am heimischen Rechner bin kann ich mir mal das Datenblatt ansehen wie die Register-Zuordnung ist.
 
Oben