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

Fragen zur Software

thomas_st

Geowizard
schnasemann schrieb:
Nun bin ich am Ende meines Lateins.
Nicht gleich verzweifeln :) Versuche mal
1.) den Programmcode so weit abzuspecken, dass am Ende nur noch die Konfiguration der Ports und die eigentliche Schaltung der IO-Pins übrig bleibt + Endlosschleife. Mal sehen, ob es dann funktioniert. ... sofern noch nicht geschehen: die Spannungspegel an den Beinchen messen.
2.) Wenn es nicht die Software ist, bleibt nur noch die Hardware: mal testen ob alles richtig angeschlossen ist. Dann: Tiny raus (ich denke mal das Ganze ist auf einem Steckbrett) und die zugehörigen Pins für PortA.0 und PortB.0 mit Vcc verbinden. Leuchtet jetzt die LED? ... sofern es dabei nach gegrilltem Transistor riecht, fehlte der Basis-Vorwiderstand :p

Viele Grüße und HTH,
Thomas(_st)
 

schnasemann

Geocacher
thomas_st schrieb:
schnasemann schrieb:
Nun bin ich am Ende meines Lateins.
Nicht gleich verzweifeln :) Versuche mal
1.) den Programmcode so weit abzuspecken, dass am Ende nur noch die Konfiguration der Ports und die eigentliche Schaltung der IO-Pins übrig bleibt + Endlosschleife. Mal sehen, ob es dann funktioniert. ... sofern noch nicht geschehen: die Spannungspegel an den Beinchen messen.
2.) Wenn es nicht die Software ist, bleibt nur noch die Hardware: mal testen ob alles richtig angeschlossen ist. Dann: Tiny raus (ich denke mal das Ganze ist auf einem Steckbrett) und die zugehörigen Pins für PortA.0 und PortB.0 mit Vcc verbinden. Leuchtet jetzt die LED? ... sofern es dabei nach gegrilltem Transistor riecht, fehlte der Basis-Vorwiderstand :p

Viele Grüße und HTH,
Thomas(_st)

Hallo, Thomas,
1) war nur noch übrig, den PORTA auf 255 und den PORTB auf 1. Dann sollten 7 LEDs leuchten. Tun sie aber nicht.
2) Habe Lithiumbatterie direkt an den Anschlussbeinchen den uC. Dort (IC Fassung) hatte ich an einem Netzteil (Betrieb) auch schon GND angeschlossen und mittels Strippen die einzelnen PORTA und PORTB (ohne eingesteckten uC) alle Anschlüsse geprüft. Klappte. Ist eine gefräste und gelötete Platine.

Mich irritiert folgendes:
1. finde ich keine History, das von Dir genannte Problem mit dem Config-File macht mich nervös.
2. Macht der tiny irgendwie gar nichts. Ausser, sich einwandfrei fusen und programmieren zu lassen.
War Joggen, geh jetzt Duschen und dann probier ichs zur Not doch noch mal in C.
 

thomas_st

Geowizard
schnasemann schrieb:
1) war nur noch übrig, den PORTA auf 255 und den PORTB auf 1. Dann sollten 7 LEDs leuchten. Tun sie aber nicht.
:???: Viel weniger geht ja nicht mehr - also SW (bis auf weiter unten) sollte gehen.

schnasemann schrieb:
[...] und mittels Strippen die einzelnen PORTA und PORTB (ohne eingesteckten uC) alle Anschlüsse geprüft. Klappte.
Ok, also auch die HW nicht. Versuche mal mit einem Multimeter die Spannungen an den Ports zu messen. Dabei verschiedene IO-Ports durch testen und auch einige auf 0 belassen und überprüfen ob das mit der gemessenen Spannung übereinstimmt.

schnasemann schrieb:
Ist eine gefräste und gelötete Platine.
Ok, erhöhte Schwierigkeit bei der Fehlersuche. Haarrisse scheiden aus, wenn Du das schonmal mit den Leitungen probiert hast.

schnasemann schrieb:
Mich irritiert folgendes:
1. finde ich keine History, das von Dir genannte Problem mit dem Config-File macht mich nervös.
Das hatte ich nur am Rande mitbekommen und mit dem Gedanken "das betrifft mich nicht" dann überlesen. Soweit ich mich aber noch erinnere, gab es bei einer Tiny-Reihe ein fehlerhaftes Config-File, was aber mit einem Bascom-Update dann wohl erledigt war. Aber da wissen die Bascom-Experten sicherlich mehr.

Viele Grüße,
Thomas(_st)
 

schnasemann

Geocacher
:roll: so, halbes Licht ist wieder aufgegangen. Mit Oszi angeschaut, liegt der Pegel des Reset-Eingangs bei ~1V. Warum, erklärt sich mir nicht, er ist als Reset-Pin gefused und es ist ein NPN-Transistor mit Basisvorwiderstand angeschlossen. Wenn ich das Beinchen aber von der Schaltung trenne, machen zumindest die restlichen Pins das, was sie sollen. Werde nun doch mal das Risiko eingehen, die Fuses richtig zu setzen. Zur Not muss man halt wieder HV-Rücksetzen.
Halte Euch weiter auf dem Laufenden.
 

thomas_st

Geowizard
schnasemann schrieb:
:roll: so, halbes Licht ist wieder aufgegangen. Mit Oszi angeschaut, liegt der Pegel des Reset-Eingangs bei ~1V. Warum, erklärt sich mir nicht, er ist als Reset-Pin gefused und es ist ein NPN-Transistor mit Basisvorwiderstand angeschlossen.
:kopfklatsch: Da soll man drauf kommen. Aber eigentlich ist es klar: der /RST-Pin ist eigentlich ein Eingang - also sehr hochohmig. Über den Basis-Vorwiderstand und die BE-Strecke des Transistors ist jetzt Strom gegen GND abgeflossen. Der hochohmige /RST-Eingang war nicht fähig diesen Strom zu liefern und die Spannung bricht ein - vermutlich auf die BE-Durchlassspannung (~0,7V). Diese Spannung liegt aber unter 0,2*Vcc, so dass am /RST-Eingang Low an lag und der Tiny im Reset blieb.

Will heißen: er stand still.

Viele Grüße,
Thomas(_st)
 

schnasemann

Geocacher
Tja, hätte mir nicht gedacht, dass so ein geringer Strom den Reset aus dem Tritt bringt. Aber naja. Was auf jeden Fall Bascom verstolpert, ist meine Abfrage nach dem Magic Byte. Das klappt nicht. Nach 10 Durchgängen ist Schluss. Habe nun eine fixe Schleife reingebaut und dann klappt es.
Nun muss aus dem Prototyp noch etwas Gescheites werden und fertig.
Danke für Euren seelischen Beistand!
 

upigors

Geowizard
So, nun frag ich doch einfach mal. Hab versucht da mal was zu finden aber selbst im alten Reaktivlichttread war irgendwie die Antwort nicht dabei.
So oder so ähnlich:

Const Schwelle = 150
Const Tagschwelle = 800
Const Zwangsimpuls = 8

Dim A As Byte
Dim Tagzaehler As Byte
Dim Schlafzaehler As Byte
Dim Ldr As Integer
Dim Alt As Integer
Dim Merker As Integer
Dim Zeichen As String * 1

Do
Reset Watchdog
Powerdown
Start Adc
Waitms 250
Ldr = Getadc(2)
Waitms 250
Stop Adc
Merker = Ldr - Alt
Alt = Ldr
If Merker > Schwelle Then
Gosub Morsen
End If
If Ldr > Tagschwelle Then
If Tagzaehler < 255 Then
Tagzaehler = Tagzaehler + 1
End If
Else
Tagzaehler = 0
End If
If Tagzaehler > 200 Then
Gosub Pause
End If
Loop


sieht ja der Teil von den meisten geposteten Programmen aus welcher dafür verantwortlich ist das der Blinker oder was auch immer anfängt zu "morsen" wenns plötzlich hell wird.
Hier hab ich schon mal mit den werten "gespielt" und so, alles soweit klar.
Nun möchte ich aber erreichen das der LDR ganz weg fällt und das Teil los legt wenn sagen wir mal 3V an dem entsprechenden Pin anliegen bzw kurz angelegt werden.
Bisher hab ich sowas mit 1 bzw 2 Widerständen erreicht, im schlimmsten fall musste die Versorgungsspannung herhalten trennen und bei Bedarf wieder anlegen, dann läuft das Programm ja ebenfalls 1x durch. Find ich aber irgendwie "unelegant" und ich bin mir sicher das geht besser und deutlich einfacher. Nur komm ich nicht drauf wie ....
ich weiß der Eine oder Andere sagt jetzt ist doch ganz einfach..... ich komm nicht auf nen vernünftigen Ansatz.
Danke für Eure Hilfe im vorraus
Uwe
 

huzzel

Geowizard
Mal ganz billig, wenn Spannung da, dann geh nach "morsen", ganz ohne Feinheiten, wie darf nur kurz anliegen etc.

Code:
Do
	Reset Watchdog
	Powerdown
	Start Adc
	'Waitms 250	für was soll das warten sein???
	Ldr = Getadc(2)
	Stop Adc
	'Waitms 250	für was soll das warten sein???
	
	If LDR > 900 Then
		Gosub Morsen
	End If
	
Loop
 

upigors

Geowizard
danke schön werds gleich mal schreiben und probieren :D
Wird sicher funktionieren aber da ich ja neugiertig bin - wofür steht da der LDR-Befehl?
 

huzzel

Geowizard
upigors schrieb:
wofür steht da der LDR-Befehl?
Och komm, das ist jetzt nicht Dein Ernst, oder???
LDR ist die Variable, Getadc ist die Funktion ;)
Und bei Basom mach die:
lese zwei mal den gegebene Kanal ein und verwerfe die Ergebnisse
lese dann den Kanal noch ein drittes mal ein und gebe den Wert zurück
 

upigors

Geowizard
:kopfwand: Danke und Sorry.....
War ich wohl Kreide holen....
Nee im ernst, dieses ganze Thema - ich hab mir das nur anhand der ersten hier geposteten Programme angenommen und eben an diesen 2 Werten mußte ich bisher nie rumspielen und daher stellte sich die Frage eben nicht.
 

Windi

Geoguru
Ich würde das ganz ohne den ADC machen. Einfach nur den Zustand des Portpins abfragen ob High oder Low. So wie quais im Ur-Reaktivlicht.

Config Portb.4 = Input
Portb.4 = 0
do
Variable = Pinb.4
if variable = 1 then tue_irgendwas
loop
 

rumo&amp;rala

Geocacher
Ich entschuldige mich schon einmal für den Doppel-post, aber ich hab jetzt erst diesen Thread speziell zu Software gesehen.
Mein Problem ist folgendes:
Ich hab schon vor geraumer Zeit mir nen 7-Segment RL gebaut und es ist kurz vor seinem Einsatz.
Es sollen 2 Informationen übertragen werden. Damit es etwas schwieriger wird habe ich folgendes ausgedacht.
es gibt zwei Daten. beim ersten auslösen werden daten 1 ausgegeben. sollte innerhalb von 1 Minute nach dem ersten Mal das RL erneut ausgelöst werden wird daten 2 ausgegeben.

Ich habe nur rudimentäre Programmierkenntisse und hab mir das meiste nur logisch erschlossen:
Am Ende der ersten Ausgabe springt das Programm in eine Do-Schleife die 60 sekunden lang durchlaufen wird. Wenn in der Zeit die helligkeit über den schwellenwert ist, springt er zu der Ausgabe der Daten 2.

Soweit läuft das Programm auch, aber er springt jedesmal sofort nach der Ausgabe der daten1 zur Ausgabe der daten2. Also irgendwie funktioniert es noch nicht.
Es wäre schön wenn jemand mit Erfahrung da mal drüber schauen würde.
Auf Anfrage schick ich euch auch gern den ganzen Code, hier erstmal der wichtige Teil:

Code:
If Zeichen = "S" Then Gosub Schleife                  'zur Schleife springen
If Zeichen = "X" Then Return
Loop

Schleife:                                                   '60 sek Schleife
Wdtcsr = &B11010101                                         'Watchdog auf 0,5s stellen
Do                                                          'do schleife
   If Merker > Schwelle Then Gosub Morsen2                  'Bei großer Änderung Dunkel->Hell:morsen2
   Reset Watchdog
   Powerdown
   Sekundenzaehler = Sekundenzaehler + 1                    'zählt alle halbe sekunde
   If Sekundenzaehler < 120 Then Return                     'nach 60sekunden is schluss
   Loop
Wdtcsr = &B11010011                                         'Watchdog wieder auf 125ms stellen
Return

Morsen2:
Restore Daten2                                              'Am Beginn der Daten anfangen
Alt = 1023                                                  'Doppelauslösung verhindern
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown

Do
Reset Watchdog
Powerdown
Read Zeichen
Wdtcsr = &B11010101                                         'Watchdog auf 0,5s stellen
If Zeichen = "0" Then Gosub P0                              'schreibt 0 ins Display
If Zeichen = "1" Then Gosub P1                              'schreibt 1 ins Display
If Zeichen = "2" Then Gosub P2                              'schreibt 2 ins Display
If Zeichen = "3" Then Gosub P3                              'schreibt 3 ins Display
Jetzt schon einmal vielen Dank.
 

Windi

Geoguru
Ich vermisse in der 60-Sekunden-Schleife die nochmalige Abfrage des Lichtsensors.
Wenn dieser nicht neu abgefragt und mit den alten Werten weitergemacht wird ist es klar dass die 2. Anzeige sofort kommt.
 

rumo&amp;rala

Geocacher
Ach herje, manchmal ist man auch echt blind. :kopfwand:
Das hab ich jetzt in meinem Code geändert.
Leider funktioniert es immernoch nicht, das Fehlerbild hat sich allerdings geändert.
Jetzt wartet er nach der ersten Ausgabe zwar auf ein Signal, gibt dann allerdings wieder die ersten Daten aus.
Also liegt der Schluß nahe, dass er gar nicht in die 60sek-Schleife geht, sondern direkt wieder zum Start. :???:
Irgendwo ist noch der Wurm drin. Hier noch mal mein "zusammen-geschusterter" Code in ganzer Länge:
Code:
$hwstack = 20                                               'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
$regfile = "ATtiny24.DAT"
$crystal = 128000                                           'Frequenz des internen Oszillators


Config Adc = Single , Prescaler = Auto

Config Portb = &B00000111                                   'Pinb.0-2 auf 'Ausgang', Rest auf 'Eingang' schalten
Config Porta = &B10001011                                   'Pina.0+1+3+7 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0                                                   'Ausgänge auf Low setzen
Porta = 0
Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen

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

Const Schwelle = 100                                        '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 Sekundenzaehler As Byte                                 'sekundenzähler
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
Waitms 1
Ldr = Getadc(2)                                             'Helligkeitswert einlesen
Waitms 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 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:
Wdtcsr = &B11110001                                         'Watchdog auf 8 Sekunden stellen
Reset Watchdog
Powerdown
Wdtcsr = &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
'Porta.5 = 1
Reset Watchdog
Powerdown
'Porta.5 = 0
Schlafzaehler = 0
End If
Return

Morsen:
Restore Daten                                               'Am Beginn der Daten anfangen
Alt = 1023                                                  'Doppelauslösung verhindern
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown

Do
Reset Watchdog
Powerdown
Read Zeichen
Wdtcsr = &B11010101                                         'Watchdog auf 0,5s stellen
If Zeichen = "0" Then Gosub P0                              'schreibt 0 ins Display
If Zeichen = "1" Then Gosub P1                              'schreibt 1 ins Display
If Zeichen = "2" Then Gosub P2                              'schreibt 2 ins Display
If Zeichen = "3" Then Gosub P3                              'schreibt 3 ins Display
If Zeichen = "4" Then Gosub P4                              'schreibt 4 ins Display
If Zeichen = "5" Then Gosub P5                              'schreibt 5 ins Display
If Zeichen = "6" Then Gosub P6                              'schreibt 6 ins Display
If Zeichen = "7" Then Gosub P7                              'schreibt 7 ins Display
If Zeichen = "8" Then Gosub P8                              'schreibt 8 ins Display
If Zeichen = "9" Then Gosub P9                              'schreibt 9 ins Display
If Zeichen = " " Then Gosub Leer                            'Pause = Leerzeichen
If Zeichen = "Start" Then Gosub Pstart                      'startet das Intro
If Zeichen = "C" Then Gosub C                               'schreibt C ins Display
Wdtcsr = &B11010011                                         'Watchdog wieder auf 125ms stellen
If Zeichen = "S" Then Gosub Schleife                        'spring in die Schleife
If Zeichen = "X" Then Return
Loop

Schleife:                                                   '60 sek Schleife
Wdtcsr = &B11010101                                         'Watchdog auf 0,5s stellen
Do                                                          'do schleife
   Start Adc                                                'A/D-Wandler starten
   Waitms 1
   Ldr = Getadc(2)                                          'Helligkeitswert einlesen
   Waitms 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 Morsen2                  'Bei großer Änderung Dunkel->Hell:morsen2
   Reset Watchdog
   Powerdown
   Sekundenzaehler = Sekundenzaehler + 1                    'zählt alle halbe sekunde
   If Sekundenzaehler < 120 Then Return                     'nach 60sekunden ist schluss
   Loop
Wdtcsr = &B11010011                                         'Watchdog wieder auf 125ms stellen
Return

Morsen2:
Restore Daten2                                              'Am Beginn der Daten anfangen
Alt = 1023                                                  'Doppelauslösung verhindern
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown

Do
Reset Watchdog
Powerdown
Read Zeichen
Wdtcsr = &B11010101                                         'Watchdog auf 0,5s stellen
If Zeichen = "0" Then Gosub P0                              'schreibt 0 ins Display
If Zeichen = "1" Then Gosub P1                              'schreibt 1 ins Display
If Zeichen = "2" Then Gosub P2                              'schreibt 2 ins Display
If Zeichen = "3" Then Gosub P3                              'schreibt 3 ins Display
If Zeichen = "4" Then Gosub P4                              'schreibt 4 ins Display
If Zeichen = "5" Then Gosub P5                              'schreibt 5 ins Display
If Zeichen = "6" Then Gosub P6                              'schreibt 6 ins Display
If Zeichen = "7" Then Gosub P7                              'schreibt 7 ins Display
If Zeichen = "8" Then Gosub P8                              'schreibt 8 ins Display
If Zeichen = "9" Then Gosub P9                              'schreibt 9 ins Display
If Zeichen = " " Then Gosub Leer                            'Pause = Leerzeichen
If Zeichen = "Start" Then Gosub Pstart                      'startet das Intro
If Zeichen = "C" Then Gosub C                               'schreibt C ins Display
If Zeichen = "W" Then Gosub Lang                            'lange Pause
Wdtcsr = &B11010011                                         'Watchdog wieder auf 125ms stellen
If Zeichen = "X" Then Return
Loop

P0:
Porta = &B10001011
Portb = &B00000110
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P1:
Porta = &B00001010
Portb = &B00000000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P2:
Porta = &B10000011
Portb = &B00000101
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P3:
Porta = &B10001011
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P4:
Porta = &B00001010
Portb = &B00000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P5:
Porta = &B10001001
Portb = &B00000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P6:
Porta = &B10001001
Portb = &B00000111
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P7:
Porta = &B00001011
Portb = &B00000000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P8:
Porta = &B10001011
Portb = &B00000111
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P9:
Porta = &B10001011
Portb = &B00000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Leer:
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Return

Lang:
Wdtcsr = &B11110001                                         'Watchdog auf 8 Sekunden stellen
Reset Watchdog                                              '1
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog                                              '2
Powerdown
Wdtcsr = &B11010011
Return

Pstart:
Wdtcsr = &B11010011                                         'Watchdog auf 125ms
Porta = &B00000001                                          'schlange umlauf 1x
Portb = &B00000000
Reset Watchdog
Powerdown
Porta = &B00000010
Portb = &B00000000
Reset Watchdog
Powerdown
Porta = &B00000000
Portb = &B00000001
Reset Watchdog
Powerdown
Porta = &B00000000
Portb = &B00000100
Reset Watchdog
Powerdown
Porta = &B10000000
Portb = &B00000000
Reset Watchdog
Powerdown
Porta = &B00001000
Portb = &B00000000
Reset Watchdog
Powerdown
Porta = &B00000000
Portb = &B00000001
Reset Watchdog
Powerdown
Porta = &B00000000
Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

C:
Porta = &B10000001
Portb = &B00000110
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

End

Daten:
Data "Start"
Data "5" , "2" , " " , "1" , "1" , " " , "1" , "2" , "3" , " "
Data "1" , "0" , " " , "1" , "2" , " " , "1" , "2" , "3" , "Start"
Data "S" , "X"

Daten2:
Data "Start"
Data "C" , "1" , "Start" , "W"
Data "C" , "1" , "Start" ,
Data "X"
Ich hoffe ihr könnt ihr mir helfen :roll:
Danke
 

Windi

Geoguru
Also wenn Du bei " If Sekundenzaehler < 120 Then Return " das "<" gegen ein ">" austauschst und vor das do in der schleife noch ein "sekundenzaehler=0" setzt sollte es eigentlich funktionieren.
 

ksbender

Geocacher
Hallo,

langsam verzweifel ich ein wenig :motz: an mir selber.
Folgender Sachverhalt: Ich möchte einen Reedkontakt mit einem Tiny 13 (nur so zum Versuch) verheiraten. Dann will ich abfragen, ob der Reedkontakt geschlossen wurde und es soll eine "Aktion" ausgeführt werden.
Mit beiliegendem Code geht es NICHT, jedenfalls nicht prozeßsicher.
Ist die normal blinkende LED 1 aus und ein Magnet schließt den Reedkontakt, wird der Ausgang geschaltet und LED 1 leuchte für ca. 20 sec.
Ist die normal blinkende LED 1 aber AN un ein Magnet schließt den Reedkontakt, scheint es so zu sein, daß auch in das Unterprogramm gesprungen wird, jedoch bleibt die LED für ca. 20 sec. aus.
Hier der fehlerhafte Code:
Code:
$regfile = "attiny13.dat"
$crystal = 376000
$hwstack = 24
$swstack = 10
$framesize = 24

Config Portb = &00000001                                    'Pinb.0 auf "Ausgang", Rest auf "Eingang"

Portb = 0                                                   'Ausgänge auf Low setzen


Eingang Alias Pinb.1
Ausgang Alias Pinb.0

Waitms 200

Do


Ausgang = 1
If Pinb.1 = 1 Then Gosub Ledan
Waitms 500
If Pinb.1 = 1 Then Gosub Ledan
Waitms 500
Ausgang = 0
If Pinb.1 = 1 Then Gosub Ledan
Waitms 500
If Pinb.1 = 1 Then Gosub Ledan
Waitms 500

Loop

End


Ledan:
Powerdown
Waitms 20
Ausgang = 0
Waitms 500
Ausgang = 1
Wait 20
Ausgang = 0
Waitms 500

Return

Schaltplan anbei.

Kann mir einer der Sachverständigen bitte erklären, wie man sowas RICHTIG macht.
Per interrupt oder debounce soder sonst wie.
Bedanke mich schon mal und hoffe auf baldige Linderung meiner Sorgen.
Gruß
ksbender
 

Anhänge

  • Versuch.jpg
    Versuch.jpg
    81 KB · Aufrufe: 434

stonewood

Geowizard
ksbender schrieb:
Folgender Sachverhalt: Ich möchte einen Reedkontakt mit einem Tiny 13 (nur so zum Versuch) verheiraten. Dann will ich abfragen, ob der Reedkontakt geschlossen wurde und es soll eine "Aktion" ausgeführt werden.

erstens:
Wie sehen die Fuses vom Tiny aus?
Code:
$crystal = 376000
sieht schon recht seltsam aus. Daran berechnet bascom bei waitms wie viele Takte es warten soll.

zweitens:
Die Portpins haben einen internen Pullup der um die 10 KOhm hat. Genauer: 20-50 KOhm laut Datenblatt. Du schaltest also mit dem anderen 10K-Widerstand einen netten Spannungsteiler zusammen. Ob die LED parallel dazu das ganze noch schöner macht ist echt die Frage ...
Ich würde empfehlen den ganzen Kram rundum wegzulassen, und direkt den Reedkontakt an GND und den Portpin zu hängen. Der interne Pullup zieht das auf High, und beim Auslösen des Kontaktes geht der Portpin auf Low.

Übrigens brauchst Du zumindest für Deine Lösung gar kein Debounce - Dich interessiert ja nur ob der Reedkontakt ausgelöst wird. Ob der nun einmal oder 100 mal ganz schnell ausgelöst wird (Prellen des Kontaktes) interessiert das Programm gar nicht mehr. Das sollte also auch mit 'schau mal alle paar millisekunden nach ob der Kontakt ausgelöst wurde' funktionieren.
 

thomas_st

Geowizard
stonewood schrieb:
zweitens:
Die Portpins haben einen internen Pullup der um die 10 KOhm hat. Genauer: 20-50 KOhm laut Datenblatt.
Die PullUps sind aber mit
ksbender schrieb:
Code:
[...]
Portb = 0                                                   'Ausgänge auf Low setzen
[...]
deaktiviert worden. Also zumindest an dieser Stelle ist bei Nutzung der PullUps noch eine Anpassung notwendig (entsprechende Bits auf High). Ob Bascom die PullUps dann noch eventuell global deaktiviert, wäre zu klären.

Viele Grüße,
Thomas(_st)
 
Oben