Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Fragen zur Software

Basteleien analog und digital mit Strom und Spannung.

Moderator: radioscout

Benutzeravatar
upigors
Geowizard
Beiträge: 2359
Registriert: Mo 24. Sep 2007, 15:52
Wohnort: 39326 Hohenwarsleben
Kontaktdaten:

Re: Fragen zur Software

Beitrag von upigors »

: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.
Bild..Bild..[
Benutzeravatar
Windi
Geoguru
Beiträge: 6338
Registriert: Fr 16. Jan 2004, 23:57
Kontaktdaten:

Re: Fragen zur Software

Beitrag von Windi »

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
Bild
rumo&rala
Geocacher
Beiträge: 179
Registriert: Di 12. Jun 2007, 22:21
Wohnort: 38100 Braunschweig

Re: Fragen zur Software

Beitrag von rumo&rala »

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: Alles auswählen

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.
Benutzeravatar
Windi
Geoguru
Beiträge: 6338
Registriert: Fr 16. Jan 2004, 23:57
Kontaktdaten:

Re: Fragen zur Software

Beitrag von Windi »

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.
Bild
rumo&rala
Geocacher
Beiträge: 179
Registriert: Di 12. Jun 2007, 22:21
Wohnort: 38100 Braunschweig

Re: Fragen zur Software

Beitrag von rumo&rala »

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: Alles auswählen

$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
Benutzeravatar
Windi
Geoguru
Beiträge: 6338
Registriert: Fr 16. Jan 2004, 23:57
Kontaktdaten:

Re: Fragen zur Software

Beitrag von Windi »

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.
Bild
rumo&rala
Geocacher
Beiträge: 179
Registriert: Di 12. Jun 2007, 22:21
Wohnort: 38100 Braunschweig

Re: Fragen zur Software

Beitrag von rumo&rala »

danke das war es !!!

man man, hätte mir auch selbst auffallen können...

jedenfalls vielen dank für die schnelle hilfe
ksbender
Geocacher
Beiträge: 76
Registriert: Do 15. Nov 2007, 23:26
Wohnort: Parsau - Niedersachsen

Re: Fragen zur Software

Beitrag von ksbender »

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: Alles auswählen

$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
Dateianhänge
Versuch.jpg
Versuch.jpg (81 KiB) 369 mal betrachtet
Cache gefunden, Füße stinken, höchste Zeit, ein Bier zu trinken.
stonewood
Geowizard
Beiträge: 1062
Registriert: Mo 3. Apr 2006, 10:15
Kontaktdaten:

Re: Fragen zur Software

Beitrag von stonewood »

ksbender hat geschrieben: 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: Alles auswählen

$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
Beiträge: 1643
Registriert: Fr 18. Nov 2005, 16:30
Wohnort: ~ N 51°21' E 12°00'

Re: Fragen zur Software

Beitrag von thomas_st »

stonewood hat geschrieben: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 hat geschrieben:

Code: Alles auswählen

[...]
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)
Antworten