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

Bascom Code macht nciht das was ich möchte :-)

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?

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
 

Sushkin

Geocacher
Moin!

Die LDRs haben meines Wissens selten eine gleiche Charakteristik. Bei gleicher Helligkeit gilt also in den seltensten Fällen LDR1=LDR2. Daher würde ich als Unterscheidungsmerkmal folgende Zeile verwenden:
If Ldr <= Ldr2 Then Gosub Pause else Portb.3 = 1
Wenn Du nur den Helligkeitsunterschied zwischen den beiden LDRs messen willst, empfehle ich, die Sensoren in einer Wheatstone-Brückenschaltung aufzubauen. Dazu kommen noch zwei Widerstände, die Du so anpasst, dass bei Umgebungslicht und gleicher Beleuchtung der LDRs gerade noch "Ldr1 < Ldr2" gilt.
Grüße,
Sushkin
 

Windi

Geoguru
Wie Sushkin schon schrieb sind die beiden LDR-Werte nicht gleich.
Außerdem schwanken diese auch bei konstanter Beleuchtung immer.
Ich würde hier (ähnlich wie beim Reaktivlicht) auch eine Schwellwert integrieren.
Weiterhin wird in Deinem Programm Portb.3 nicht mehr auf 0 gesetzt.
 
OP
chr2k

chr2k

Geomaster
Danke euch beiden für diese Tipps.

Windi schrieb:
Ich würde hier (ähnlich wie beim Reaktivlicht) auch eine Schwellwert integrieren.

Hm naja... mit diesem Teil des Codes hab ich noch so meine Probleme, daher hab ich das mal außen vor gelassen.


Windi schrieb:
Weiterhin wird in Deinem Programm Portb.3 nicht mehr auf 0 gesetzt.
Das ist erstmal zu testzwecken so beabsichtigt. Aber danke :)


Nun aber nochmal zurück zu meiner Schaltung und dem modifizierten Code:
Ich habe die Schaltung nach Abbildung 6 aus dem Kochbuch aufgebaut. Ich habe für den zweiten LDR einen seperaten Widerstand mit gleicher Größe (im vergleich zu dem anderen Widerstand) genommen.
Angenommen beide LDRs würden syncron zu Ihrer Helligkeitsmessung laufen oder der eine würde vom Umgebungslicht abgedeckt werden, der andere würde zusätzlich ncoh angestrahlt werden. Dann müsste doch mit dieser Schaltung und dem Code die LED aufleuchten. Oder wäre da auch noch irgendwo ein Fehler?

Ich möchte dies nur wissen ob ich auf dem richtigen Weg war.

Danke
 

Windi

Geoguru
Ohne Schwellwert kann es sein dass die LED auch zu Leuchten beginnt wenn der LDR nicht angestrahlt wird.
Bei gleicher Helligkeit springt der AD-Wandler-Wert (Deshalb gibt es ja den Schwellwert).
Und so kann es sein dass der eine LDR etwas mehr misst als der andere und somit löst die LED aus.
Bedenke dass der Helligkeitswert Werte zwischen 0 und 1023 annehmen kann. Da ist ein Unterschied von 1 sehr minimal.
 
OP
chr2k

chr2k

Geomaster
Bei folgendem Code bekomme ich diese Meldung beim Compilieren:
Error 61 Label not found [_ENDIF0 ]

weiß da jemand was?

Code:
$regfile = "ATtiny13.DAT"
$crystal = 16000                                            'Frequenz des internen Oszillators

$hwstack = 36                                               'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen


Config Adc = Single , Prescaler = Auto


'Config Pinb.0 = Output
'Config Pinb.1 = Output
Config Pinb.2 = Input
Config Pinb.3 = Output
Config Pinb.4 = Input
Config Pinb.5 = Output




Portb.3 = 1
Wait 3
Portb.3 = 0

Portb.5 = 1
Wait 3
Portb.5 = 0









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 = 350                                        '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
Dim Ldrlaser As Integer                                     '0 = Dunkel, 1023 = Hell
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
Ldrlaser = Getadc(1)


Stop Adc                                                    'A/D-Wandler zum Stromsparen wieder stoppen

Merker = Ldr - Ldrlaser

'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
'   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




' If Ldr <= Ldrlaser Then Gosub Pause else Portb.3 = 1





Loop


Blinken:                                                    'LED blinken lassen
For A = 0 To 5
  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
 
Oben