chr2k
Geomaster
Hallo an alle ATMEL Tiny13 "Programmierer".
Ich hab hier versucht Programmcode von windi auf meine bedüfrnisse (ein "projekt" das ich verwirklichen möchte) anzupassen.
Hierbei soll ein LDR (an ADC2) die allgemeine umgebungshelligkeit wahrnehmen. ein zweiter LDR (an ADC1) wird zusätzlich zu der umgebungshelligkeit mti einer lampe oder einem laserpointer angestrahlt. Meiner meinung nach ist dann der gemessene Widerstand am LDR(ADC1) kleiner und dies wird vom Tiny erkannt. Mit dem Code möchte ich dann, dass wenn LDR(ADC1) angestrahlt wird der tiny ausgang geschaltet wird.
Hier nun der code, wie ich mir das vorstelle. Ich schätze mal da fehlt noch irgendwas oder so. Wer kann helfen?
Danke
Gruß Christian
Ich hab hier versucht Programmcode von windi auf meine bedüfrnisse (ein "projekt" das ich verwirklichen möchte) anzupassen.
Hierbei soll ein LDR (an ADC2) die allgemeine umgebungshelligkeit wahrnehmen. ein zweiter LDR (an ADC1) wird zusätzlich zu der umgebungshelligkeit mti einer lampe oder einem laserpointer angestrahlt. Meiner meinung nach ist dann der gemessene Widerstand am LDR(ADC1) kleiner und dies wird vom Tiny erkannt. Mit dem Code möchte ich dann, dass wenn LDR(ADC1) angestrahlt wird der tiny ausgang geschaltet wird.
Hier nun der code, wie ich mir das vorstelle. Ich schätze mal da fehlt noch irgendwas oder so. Wer kann helfen?
Code:
'============================================================
'
' ********************************************************
' *** erstellt von Windi für www.geoclub.de ***
' *** 15.10.2006 ***
' ********************************************************
$regfile = "ATtiny13.DAT"
$crystal = 16000 'Frequenz des internen Oszillators
$hwstack = 6 'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
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 Ldr2 As Integer
'Dim Alt As Integer
Dim Merker As Integer
Do
Reset Watchdog
Powerdown 'prozessor bremsen da sonst lichtänderung nicht erkannt wird
Start Adc 'A/D-Wandler starten
Ldr = Getadc(2) 'Helligkeitswert einlesen
Ldr2 = Getadc(1)
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 Blinken '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
If Ldr = Ldr2 Then Gosub Pause
If Ldr2 > Ldr Then Portb.3 = 1
' If Ldr2 > Ldr Then Gosub Blinken
Loop
'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
'Blinken: 'LED blinken lassen
''''''''''''''For A = 0 To 10
' Portb.3 = 1
' Reset Watchdog
' Powerdown
' Portb.3 = 0
' Reset Watchdog
' Powerdown
''''''''''''''Next A
''''''''''''''Alt = 1023 'Doppelauslösung verhindern
'Return
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
End
Danke
Gruß Christian