Bascom BASCOM ; Erste Schritte zum Ausprobieren

Schau mal nochmal in den Code in #304. Dort hattest Du ab Zeile 53 etwas auskommentiert.
Dort solltest Du jedes empangene Zeichen, das kein vorher behandeltes Kommando ist PWM1B zuweisen um damit die Intensität von KanalB festzulegen.

Jetzt sollst Du jedes empangene Zeichen, das kein vorher behandeltes Kommando ist der Zählvariable Countdown zuweisen um damit die Leuchtdauer der Kerze festzulegen.
(hatte ich in #317)
Außerdem soll dann auch die Kerze angezündet werden.

Da das ein Countdown ist, zählst Du im zweiten Teilprogramm runter statt hoch (decr statt incr), und prüfst dann, ob Countdown null geworden ist, und bläst danach die Kerze aus.
 
Diesen Block hab ich jetzt so geändert. Der Countdown wird also, mit dem Config-Befehl gestartet, wenn er das Zeichen (60) erhält.
Else
Countdown = Zeichen
If Zeichen = 60 Then
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
End If

Der Countdown befindet sich im zweiten Teil und zählt die (60) herunter und löscht die Kerze mit dem betreffenden Config Befehl.
Decr Countdown
If Countdown = 0 Then
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
End If

Habe ich das jetzt richtig verstanden?
 
Ähm... nö.
Wozu das If Zeichen = 60?
Das Else (also nicht ElseIf) ist schon richtig, nur bringt es nichts wenn danach noch eine If kommt.
So könntest du ja nur 60 Sekunden einstellen, aber keine 30 oder 25, außer du bastelst n brutalen Rattenschwanz mit If Abfragen, was komplett unnötig ist.
Countdown wird auch nicht gesetzt.
Jetzt sollst Du jedes empfangene Zeichen, das kein vorher behandeltes Kommando ist der Zählvariable Countdown zuweisen um damit die Leuchtdauer der Kerze festzulegen.

Also die Zeile If...=60 raus, und Countdown setzen.

Der 2. Teil sieht auf den ersten Blick richtig aus.
 
Das hatte ich auch schon gehabt, leider passiert da nichts. Ich soll doch eine Countdown Zeit festlegen und das habe ich dann mit der If Anwendung gemacht.
 
Nein, da startest du nur das PWM. Also wenn Zeichen = 60 dann starte PWM. Vermutlich wird Countdown bereits auf 0 sein, also (je nachdem wie du es umgesetzt hast) entweder sofort wieder ausgeschaltet oder läuft 256 Sekunden (Byte Überlauf). 0 - 1 = 255

Codefragmente aus #320:


CodeBox BascomAVR
Do                                      'Hauptschleife Begin
    'erstes Teilprogramm - UART Empfang und auswerten
   If Ischarwaiting() = 1 Then          'Wenn Zeichen Empfangen
      Zeichen = Inkey()                 'dann Zeichen aus Puffer lesen
      If Zeichen = "1" Then             'Wenn Zeichen = "1"
         Rot = 1                        '...
         Print "Led An"
      Elseif Zeichen = "0" Then         'Wenn Zeichen = "0"
         Rot = 0                        '...
         Print "Led Aus"
      Elseif Zeichen = "t" Then         'Wenn Zeichen = "t"
         Toggle Rot                     '...
         Print "Toggle Led"
      Elseif Zeichen = "?" Then         'Wenn Zeichen = "?"
         If Rot = 0 Then                'Dann wenn Led aus ist...
            Print "Led ist aus"
         Elseif Rot = 1 Then            'sonst wenn Led an ist...
            Print "Led ist an"
         End If
 
      Elseif Zeichen = 0 Then           'bei 0x00 PWM deaktivieren
         Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
      Elseif Zeichen = 255 Then         'bei 0xFF PWM aktivieren
         Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
 
      Else ''if Zeichen = 217 Then         '0xD9 ---- JEDES andere Zeichen als Zeit interpretieren, kein spezifisches.
         ''Countdown = 217                'belädst Deinen Countdown (die Zählvariable) mit dem wert des empfangenen Zeichens
         Countdown = Zeichen ' ---- Hier die Zeit setzen, also den Countdown
         Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down '' ---- PWM aktivieren
      End If
   End If

Streng genommen müsste die Config Timer Zeile in der Else nicht drin stehen, dann musst du aber PWM von Hand aktivieren, also 2 Bytes senden, erst die Zeit, dann 255 / &HFF zum aktivieren.
 
Else ''if Zeichen = 217 Then '0xD9 ---- JEDES andere Zeichen als Zeit interpretieren, kein spezifisches. ''Countdown = 217 'belädst Deinen Countdown (die Zählvariable) mit dem wert des empfangenen Zeichens Countdown = Zeichen ' ---- Hier die Zeit setzen, also den Countdown
Else
Countdown = Zeichen = 60 '0x3C
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
End If

zweitesTeilprogramm
Decr Countdown
If Countdown = 0 Then
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
End If

Die Pwm geht ganz kurz an und gleich wieder aus.
 
Zuletzt bearbeitet:
Wieso zweifache Zuweisung und wieso hängst du so an der 60 fest? Es soll doch flexibel sein.
Ich weiß noch nicht mal wie Bascom "Variable1 = Variable2 = Wert" interpretiert.
Nur Countdown = Zeichen. Nichts mehr, das war's (für die Zeile).
Dann da wo du die grüne Led toggelst decrement und prüfen ob countdown 0 ist. wenn ja pwm deaktivieren.
 
Das hatte ich auch schon mal. Jetzt der ganze Code.

CodeBox BascomAVR
$regfile = "m8def.dat"                  'Controllerdefinitionsdatei einbinden
$crystal = 8000000                      'Systemtakt angeben (Baudrate)
$hwstack = 40                           'Stacks
$swstack = 16
$framesize = 32
$baud = 19200                           'Baudrate UART
Dim Zeichen As Byte                     'UART-Empfang
Dim Z As Byte
Dim Fla As Byte
Dim Pause As Byte
Dim Pausex2 As Byte
Dim Tov1cnt As Byte
Dim Countdown As Byte

Rot Alias Portd.7                       'Namen für LED-Beine
Gruen Alias Portc.3
Config Rot = Output                     'Ausgänge
Config Gruen = Output
Rot = 0                                 'LEDs erstmal an
Gruen = 0
'Phasenkorrekter 8-Bit-PWM, PWM-Frequenz=245Hz
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1b = 100
'ADC aktivieren (single conversion, Prescaler Auto, AVcc (INTERN!!!)
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Do                                      'Hauptschleife Begin
    'erstes Teilprogramm - UART Empfang und auswerten
   If Ischarwaiting() = 1 Then          'Wenn Zeichen Empfangen
      Zeichen = Inkey()                 'dann Zeichen aus Puffer lesen
      If Zeichen = "1" Then             'Wenn Zeichen = "1"
         Rot = 1                        '...
         Print "Led An"
      Elseif Zeichen = "0" Then         'Wenn Zeichen = "0"
         Rot = 0                        '...
         Print "Led Aus"
      Elseif Zeichen = "t" Then         'Wenn Zeichen = "t"
         Toggle Rot                     '...
         Print "Toggle Led"
      Elseif Zeichen = "?" Then         'Wenn Zeichen = "?"
         If Rot = 0 Then                'Dann wenn Led aus ist...
            Print "Led ist aus"
         Elseif Rot = 1 Then            'sonst wenn Led an ist...
            Print "Led ist an"
         End If
      Elseif Zeichen = 0 Then           'bei 0x00 PWM deaktivieren
         Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
      Elseif Zeichen = 255 Then         'bei 0xFF PWM aktivieren
         Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
      Else
         Countdown = Zeichen
      End If
   End If
   'zweites Teilprogramm - LED durch timer blinken lassen
   If Tifr.tov1 = 1 Then                'wenn Timer übergelaufen ist
      Set Tifr.tov1                     'Überlaufflag zurücksetzen
      Incr Tov1cnt                      'überlaufzähler inkrementieren
      If Pause = Tov1cnt Then           'entspricht dem 2ten "waitms pause"
         Fla = Rnd(200)
         Fla = Fla + 55
         Pwm1a = Fla
      End If
      If Pausex2 = Tov1cnt Then         'entspricht dem ersten "waitms pause"
         Pwm1b = 255 - Fla
         Pause = Rnd(10)
         Pause = Pause * 6
         Pausex2 = Pause
         Shift Pausex2 , Left           'pausex2=pause*2
         Tov1cnt = 0
      End If
      Incr Z
      If Z = 245 Then                   'Überläufe zählen (245)
         Z = 0                          'Zähler zurücksetzen
         Toggle Gruen                   'LED toggeln
         Decr Countdown
         If Countdown = 0 Then
            Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
         End If
      End If
   End If
Loop

Aber woher weiß jetzt das Programm, wie lange der Countdown laufen soll und mit was für ein Zeichen soll es starten?
 
Hm, müsste eigentlich so gehen, aber 2x Vorsicht:
Bei empfangenem Wert startest du das PWM nicht, nur bei &HFF. Du müsstest also erst den Wert senden (von mir aus 60) und danach 255 (=&HFF) um es zu aktivieren. Oder du packst eine Kopie von Zeile 48 zwischen 50 und 51.
Und, du dekrementierst jedes Mal. Idealerweise sollte das nur dann gemacht werden wenn der Wert > ist. Also Zeile 74..77 in:


CodeBox BascomAVR
         ' Decr Countdown ' ---- hier weg
         If Countdown = 0 Then
            Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
         Else
            Decr Countdown ' ---- Nur verringern wenn nicht 0
         End If

Vielleicht findet @LotadaC ja noch einen Fehler, falls es immer noch nicht gehen sollte. Ich hab grad kein Bascom zur Hand worin ich es simulieren könnte.
 
Aber woher weiß jetzt das Programm, wie lange der Countdown laufen soll und mit was für ein Zeichen soll es starten?
Diese Frage ist noch offen.
Den Code habe ich so geändert,

CodeBox BascomAVR
         If Countdown = 0 Then
            Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
         Else
            Decr Countdown
         End If
aber das scheint nicht das Richtige zu sein oder ich habe noch etwas falsch gemacht.
Jetzt hab ich noch die config Zeile unter der
Else
Countdown = Zeichen

eingefügt. Wenn ich jetzt ein Zeichen eingebe zB. 10, dann ist Kerze auch nur für 10 Sek. an. Aber wie starte ich einen Countdown, wenn der PC nicht verbunden ist?
Warum schreibt mir keiner die Lösung und erklärt dann, was der genaue Ablauf im code bedeutet.
 
Zuletzt bearbeitet:
Deine Frage hast du dir selber beantwortet. Zeichen 10 -> 10 Sekunden.
Zeichen 20 -> 20 Sekunden. etc...

Aber wie starte ich einen Countdown, wenn der PC nicht verbunden ist?
Das wäre schon noch gekommen.

Warum schreibt mir keiner die Lösung und erklärt dann, was der genaue Ablauf im code bedeutet.
Weil du lernen wolltest. Daher haben wir dir Aufgaben gegeben und dich an die Materie ran geführt, dir Schritt für Schritt alles erklärt..
Anhand von fertigem Code lernt man überhaupt nichts. Ganz im Gegenteil, Zusammenhänge werden nicht erkannt und man selbst ist geneigt zu sagen "scheiß drauf, funktioniert ja jetzt". Davon ab wird sowas auch gerne mal schnell erwartet, ala "kann mir jemand meine Hausaufgaben machen". Rent-a-coder, nur halt für gratis und ohne weiteren Erfolg. Nicht so prickelnd.
 
Jetzt kann ich allerdings den Countdown nur für 4 Minuten laufen lassen. wenn ich Dim Zeichen As Word schreibe kommt Fehlermeldung Variable nicht dimensoniert. Und zwar in den Zeilen 3 und 6 (vorerst).


CodeBox BascomAVR
If Ischarwaiting() = 1 Then          'Wenn Zeichen Empfangen
      Zeichen = Inkey()                 'dann Zeichen aus Puffer lesen
      If Zeichen = "1" Then             'Wenn Zeichen = "1"
         Rot = 1                        '...
         Print "Led An"
      Elseif Zeichen = "0" Then         'Wenn Zeichen = "0"
         Rot = 0                        '...
         Print "Led Aus"
 
Prinzipiell gute Idee, aber Zeichen ist immer ein Byte, mehr empfängst du nicht. Muss also so bleiben.
Wie wäre es stattdessen den Countdown zu vergrößern und beim Zuweisen (Countdown = Zähler) einfach ein bissl zu multiplizieren? ;)
*60 wäre der Wert nicht in Sekunden sondern Minuten.

Edit: Korrigiere: Du empfängst immer nur ein Byte, daher sollte Zeichen auch Byte bleiben. Eine Änderung auf Word würde nichts bewirken. So war's gemeint.
 
Ja, so etwas ähnliches hab ich mir auch schon überlegt. Da die Grüne Led nicht so oft zu blinken braucht, hatte ich gedacht, diese auf 10 Sek. einzustellen.
Die ist aber auf Sekundentakt eingestellt. Vielleicht könnte da auch etwas verändert werden.
Große Frage: Aber wie?
 
Nene, lass ma den Sekundentakt, das ist eine gute Basis.

Ich meine... Jetzt bekommst du ja den "Timeout", also den Wert für Countdown als Sekunden.
Du empfängst z.B. 10. Countdown = 10. Nach 10 Sekunden ist aus.
Wie wäre es mit Countdown = 10*60. Nach 10 Minuten ist aus.
Zeile 50 in #330

Countdown muss dann definitiv Word sein. Oder wie auch immer Bascom ein UInt16 nennt.
 
Bisher gebe ich das Countdown Zeichen im Terminal ein (Send ASCII character) zB, 10 oder max. 240. Ich gebe jetzt mal 10*60 ein.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)