Bascom BASCOM ; Erste Schritte zum Ausprobieren

Zur Codebox aus #259:
Erstmal gilt, was Thomas bereits sagte:
Ich zerlege den Befehl mal:
Config Timer1 = Pwm
Der Timer1 läuft also im PWM Betriebsmodi
Prescale = 64
Mit einem 64tel der Systemfrequenz
Compare A Pwm = Clear Down
Compare B Pwm = Clear Down
Also alle Zeilen versetzen den Timer in den phasenkorrekten 8-Bit-PWM-Mode (dual slope - er zählt zwischen 0 und 255 hin und her), außerdem wird er immer mit Vorteiler 64 an den Systemtakt gekoppelt.
In der ersten Zeile werden aber beide PWM-Beine vom Timer abgekoppelt (disconnected) - die funktionieren als normale Beine.
In der zweiten Zeile wird das B-Bein (OC1B) an den Timer gekoppelt (und liefert 'ne PWM), das A-Bein (OC1A) wird abgekoppelt.
In der dritten Zeile wird B abgekoppelt, und A angekoppelt.
In der Vierten werden wieder beide abgekoppelt.
Beide Beine ankoppeln würdest Du wie gehabt mit Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Jede dieser Zeilen konfiguriert den Timer entsprechend neu (rekonfiguriert).

Ok, Du müßtest Dir also den derzeitigen Zustand in einer Bit-Variable merken. Nach erkannter Tasterbetätigung läßt Du an Abhängigkeit dieser Variable (If) entweder die eine oder die andere (re)Konfiguration ausführen, anschließend toggelst Du die Bit-Variable.
 
Variable (If) entweder die eine oder die andere (re)Konfiguration ausführen
Wie soll ich eine oder mehrere Variablen erstellen, die zu einer Timer Konfiguration gehören, wenn sie alle Time1 und Pwm heißen. Ich habe vier Zeilen mit Timer Konfiguration drei davon sind unterschiedlich.
Ich kann doch nicht "If erste Zeile Then zweite Zeile Else erste oder dritte Zeile" schreiben.
Irgendwie muss ich doch Variablen benennen können, die eine entsprechende Zeile zugewiesen ist.
 
Zuletzt bearbeitet:
Huh?
Ich versteh grad nicht was du meinst...
Aus #234:


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"
      Elseif Zeichen = "t" Then         'Wenn Zeichen = "t"
         Toggle Rot                     '...
         Print "Toggle Led"
      Elseif Zeichen = "?" Then         'Wenn Zeichen = "?"
         If Rot = 0 Then                'sonst wenn Led aus ist...
            Print "Led ist aus"
         Elseif Rot = 1 Then            'Dann wenn Led an ist...
            Print "Led ist an"
         End If
      Else
         If Zeichen = 0 Then ' PWM abkoppeln, LED setzen
            Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
            PORTx.y = 0
         Elseif Zeichen = 255 Then ' PWM abkoppeln, LED setzen
            Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
            PORTx.y = 1
         Else ' PWM ankoppeln
            Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 
         End If
      End If
   End If


Wegen der Linie, viele IDEs machen das automatisch, korrektes Einrücken vorausgesetzt. Bascom konnte es zu meiner Zeit nicht, heute kA.
Beispiel Visual Studio 2017:
1559161622533.png
 
Wie bekommt man bei den Bascom Einstellungen diesen senkrechten Strich siehe Bild hin?
Hauptmenü → Optionen → Umgebung → Editor → Draw Indention Lines → Häkchen setzen
Wie soll ich eine oder mehrere Variablen erstellen, die zu einer Timer Konfiguration gehören, wenn sie alle Time1 und Pwm heißen. Ich habe vier Zeilen mit Timer Konfiguration drei davon sind unterschiedlich.
beide Kanäle aus, nur der eine an, nur der andere an, und vorher hatten wir beide an. Dich interessieren nur die beiden Möglichkeiten "beide an" und "beide aus".

Im Programm haben wir bereits einen Teil, der zweimal pro Sekunde ausgeführt wird (blinken der einen LED). Dort könntest Du den Taster prüfen lassen - ist er betätigt, dann...
...soll die Timerkonfiguration gewechselt werden (bzw einfach rekonfiguriert werden). Dazu gibt es aber keinen einfachen "toggle"-Befehl; Du kannst eben entweder beide Kanäle aktivieren (mit clear down) oder deaktivieren (mit disconnect).
Also legst Du global 'ne Bitvariable an (die Du meinetwegen PWM_ist_an nennst), und die nach der initialen Konfiguration auf eins gesetzt wird.
Nach erkannter Tasterbetätigung toggelst Du diese Bitvariable und prüfst sie:
Ist sie gleich null, führst Du die Konfiguration mit disconnect aus.
sonst führst Du die Konfiguration mit clear down aus...
 
Zuletzt bearbeitet:
Wegen der Linie, viele IDEs machen das automatisch, korrektes Einrücken vorausgesetzt. Bascom konnte es zu meiner Zeit nicht, heute kA.
Ob die Linie zu sehen sein soll oder nicht, kannst Du bei Bascom einstellen (siehe oben). BAscom rückt während des schreibens nicht automatisch ein, aber Du kannst das auf Wunsch "zurechtrücken" lassen.

Bascom unterstützt aber im Gegensatz zu zB Visual Studio nicht das "einklappen" von Codeblöcken ("Folding" ? )
 
Naja, bei Microcontrollern werden die Quelltexte ja auch nicht mal eben über Nacht 1000 Zeilen lang, daher ist das da nicht so wichtig, schätze ich.
Grade wenn die Dokumentation da ist wo sie hin gehört, nämlich im Quelltext, wird die Datei doch schon etwas länger.
Im Deutschen heißt es Gliederung, im Englischen meine ich Folding, bin mir aber auch nicht sicher.
 
:drinks:
Zu Himmelfahrt zeigen die Männer Schwung
als wären sie alle mehr als jung.

If Zeichen = 0 Then ' PWM abkoppeln, LED setzen Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect PORTx.y = 0 Elseif Zeichen = 255 Then ' PWM abkoppeln, LED setzen Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect PORTx.y = 1 Else ' PWM ankoppeln Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down End If
Also muss ich doch die ganze Config Zeile in die If Anweisung schreiben. Hätte man doch gleich sagen können.
Aber, die vier Konfigurationen im Kopfteil müssen drin bleiben. Sehe ich das richtig?

Hauptmenü → Optionen → Umgebung → Editor → Draw Indention Lines → Häkchen setzen
Haken ist gesetzt, jetzt geht's. Okay, war ja nur ne optische Sache für nen besseren Überblick. Danke!
 
Zuletzt bearbeitet:
Bei Bascom ja, da musst du die komplette Config Zeile schreiben.
LotadaC und ich programmieren die Käfer ja eher in Assembler, da gibt es kein Config. Da muss man die Hardware über Register steuern, daher kennen wir die auch. Und für den Zweck wäre es halt nur ein Register was bearbeitet werden müsste. Aber wenn schon Bascom, dann da auch bleiben, also dessen Befehle nutzen (außer anders nicht möglich).

Der Code ist übrigens freihand und ungetestet, aber ich denke mal du kommst klar.
 
Ähm... Nein, grade wenn man nicht so konform mit der englischen Sprache ist.
Aber es hat deutliche Vorteile wenn man es zumindest mal probiert hat, man muss es ja nachher nicht nutzen.
Ich selber schreibe meist in Assembler, außer die Programme werden sehr komplex, dann in LunaAVR (ist Bascom ähnlich).

Der Vorteil bei Assembler ist halt, du lernst dabei bis in's Detail wie der Controller (und selbst heutige CPUs sind nicht unähnlich) wirklich arbeitet, er ist also keine "Black Box" mehr. Hilft oft beim Debuggen. Und die Befehle sind nicht grade selbsterklärend, weil fast alle nur aus 2-4 Zeichen bestehen. Klar, hat man irgendwann auch drauf, genau wie die Registernamen. Dauert halt nur etwas.
 
Ich habe schon Assembler Code's gesehen. Mein Vermieter schreibt in Assembler, hatte ja auch bis Ende 2018 auch die Firma APEX-Laser", die nun endlich verkauft hat. Er wird dieses Jahr mittlerweile schon 80 und möchte ihn nicht ständig auf den Geist gehen.
Allerdings habe ich beim Assembler gesehen, dass dort alle Port-Anweisungen auf diese Art
Ddrb = &B_1111_1011
Portb = &B0000_0100
geschrieben werden.
Deshalb versuche ich auch manchmal so zu scheiben.
 
Och, es gibt viele Schreibweisen, manche sind hier besser, manche dort.
&B10101010 wäre binär, so siehst du jedes Bit, bei PC Entwicklung nur noch selten unterstützt
&HAA wäre Hex. Gewöhnt man sich dran, sind ja nur 16 Zustände die man behalten muss um es zu binär umzuwandeln.
170 wäre normales dezimal. Sinnvoll für Zähler- Mininal- oder Maximalwerte.
1<<1 würde Bit 1 setzen (=00000010), also 1 um 1 nach links geschoben. Häufig in Kooperation mit AND, OR und NOT verwendet um einzelne Bits zu setzen oder löschen.
 
Da geht es schon wieder ins Eingemachte und dabei fällt mir gerade etwas ein, was ich noch wissen möchte.
LotadaC hatte mich die TIFR Anweisung


CodeBox BascomAVR
   'zweites Teilprogramm - LED durch timer blinken lassen
   If Tifr.tov1 = 1 Then                'wenn Timer übergelaufen ist
      Tifr.tov1 = 1                     'Überlaufflag zurücksetzen
      Incr Z
      If Z = 245 Then                   'Überläufe zählen (245)
         Z = 0                          'Zähler zurücksetzen
         Toggle Gruen                   'LED toggeln
      End If
   End If

beigebracht.
Meine Frage: Kann diese Anwendung (Timer Interrupts Flag Register) auch auf mehrere Ausgangs-Pin bzw. auf andere Pin angewendet werden? Diese Grüne Led wurde an Pin PC3 angeschlossen.
 
Klar, musst nur Zeile 7 doppeln, dann halt nicht mit Gruen sondern (NameDeinerWahl, oben definiert, wie Gruen) oder direkt Toggle PORTC.3
Der Port sollte vorher auch auf Output konfiguriert sein.
 
Ja okay, aber ich meinte mit einer anderen Frequenz. Dieser läuft mit

CodeBox BascomAVR
'Phasenkorrekter 8-Bit-PWM, PWM-Frequenz=245Hz
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down

Könnte ich einen anderen Timer0 oder Timer2 nehmen, mir eine Frequenz ausrechnen und somit zwei unterschiedlich blinkenden Led's auf einen µC zu haben.
 
Grundsätzlich ja, aber damit "belegst" Du diesen Timer.
Zur Erinnerung:
Timer1 ist mit Vorteiler=64 an den Systemtakt=8MHz gekoppelt, macht also 8MHz/64=125kHz-Schritte.
Timer1 läuft im phasenkorrekten 8-Bit-PWM, läuft also alle 510 Schritte über die Null (was jedesmal automatisch TIFR.TOV1 setzt) - also mit einer Frequenz von 125kHz/510=245Hz.
Zeile 2 im Code-Schnipsel aus #273 prüft also ständig (deutlich öfter als mit 245Hz) ob TOV1 gesetzt ist - ist es gesetzt (245Hz), wird der Block zwischen den Zeilen 2 und 9 abgearbeitet.
In den Zeilen 4..8 ist ein Software-Zähler realisiert, der die 245Hz-Ereignisse hochzählt, bei 245 zurückgesetzt wird und dann die LED toggelt. Die LED wechselt also mit 245Hz/245=1Hz. Blinkt also mit 0,5Hz.

Mit anderen Worten:
Timer1 liefert uns 'ne Zeitbasis von 245Hz, aus der wir (wie in einem Uhrwerk) andere Zeiten ableiten können (Die Unruh in der Uhr liefert Sekunden, daraus werden Minuten und Stunden abgeleitet).
Wenn die Zeiten nicht aufeinander aufbauen, kannst Du neben Z einen zweiten Zähler verwenden.
Wenn die gewünschten Frequenzen nicht durch 245 getroffen werden können, muß ein anderer Vorteiler gewählt werden, und dann natürlich der Endwert von Z angepaßt werden.

Hmm... andere Frage:
Eigentlich haben wir jetzt alles zusammen, um Dein eigentliches Problem (LEDs soundso lange flackern lassen) zu lösen.
Vorschlag für eine zu lösende Aufgabe:
Ein über den UART empfangenes Byte startet das Flackern für soviele Sekunden, wie sein Wert ist (0..255 Sekunden)
Also:
Den von mir mal irgendwo angepaßten Flackercode von Dir einbauen (sollte hier irgendwo im Thread sein), den Timer aber erstmal mit "disconnected PWMs" initialisieren.
per UART ein "Zeichen" empfangen (dazu haben wir auch Codeschnipsel)
Das Zeichen dem Z-Zähler zuweisen. In Abhängigkeit von Zeichen den Timer entweder mit "disconnected PWMs" oder connected (clear down) rekonfigurieren
Mit Z einen Softwarezähler realisieren, der Sekunden runterzählt.
Wenn der Zähler null erreicht, Timer disconnected rekonfigurieren.

Die nötigen Codeschnipsel sind eigentlich alle bereits da, müssen nur ggf angepaßt werden...

Nachtrag: Z würde so mit 245stel Sekunden dekrementieren - für Sekunden müßte man also entweder 'ne zweite Stufe dazwischen schalten, oder das empfangene Zeichen mit 245 multiplizieren (Bascom verwendet die, beim Mega8 vorhandene Multiplikationsinstruktion - beim Tiny13 muß Bascom die Multiplikation in Software umsetzen - da wäre die Zwischenstufe wahrscheinlich effizienter)
 
Zuletzt bearbeitet:
Hallo LotadaC, bevor ich Deinen Letzten Beitrag weiter lese, muss ich noch etwas klären.
Es geht um das eigentliche Ziel. Eine oder zwei flackernde Led's nach einer bestimmten Zeit auszuschalten und entweder durch Tastendruck oder durch Software wieder anzuschalten.
In dem Code #11 auf Seite 1 ist eine blinkende Led. Du hattest mir beigebracht, wie man drei unterschiedliche Anwendungen auf einem µC erstellt. Ich muss nur zur Richtigstellung bemerken, dass die Led in der For Schleife nur für mich eine optische Darstellung für den laufenden Prozess ist. Wie bei mir, habe ich For I = 1 to 3567 und wait 10 im Programm Code stehen. Die Led geht ziehmlich genau nach 10 Std. aus. Die Led, die im 10 Sek. Takt blinkt, könnte man auch weg lassen.
Das wollte ich nur gesagt haben. Es war natürlich sehr Lehrreich, zu wissen, was der µC alles auf dem Kasten hat. Wie ich schon sagte, hatte ich vorher keine Ahnung davon.
Meine Frage: Kann diese Anwendung (Timer Interrupts Flag Register) auch auf mehrere Ausgangs-Pin bzw. auf andere Pin angewendet werden? Diese Grüne Led wurde an Pin PC3 angeschlossen.
Dabei wollte ich nur wissen, ob ich mit meinen Vermutungen richtig liege. Somit kann ich ein paar praktische Übungen ausprobieren.
Vorschlag für eine zu lösende Aufgabe:
Dafür werde ich bestimmt noch ein paar Hilfestellungen bzw. Nachfragen haben. Bis jetzt ist das gelernte noch nicht sicher im Kasten. Ich werde erst einmal noch praktische Varianten austesten, um zu verstehen, was eigentlich im Prozessor passiert.
 
habe ich For I = 1 to 3567 und wait 10 im Programm Code stehen. Die Led geht ziehmlich genau nach 10 Std. aus.
Ja, aber mit dem wait 10 steht der Prozessor eben jeweils 10 Sekunden - Deine flackernden LEDs würden also immer für die 10 Sekunden einfrieren, um dann einmal die Helligkeit zu ändern.
Genau deswegen hab ich Dir ja
beigebracht, wie man drei unterschiedliche Anwendungen auf einem µC erstellt.
Von denen keine wait verwenden soll - die dann quasi nebeneinander laufen. Statt 10 Sekunden zu warten, braucht der Prozess dann halt 'ne 10 Sekunden-Zeitbasis - jedesmal wenn er dran ist prüft er, ob seine 10 Sekunden schon rum sind und reagiert dann, sonst reagiert er nicht. Aber er wartet eben nicht und blockiert die anderen Prozesse, sondern prüft nur kurz, und gibt die Rechenzeit dann an die anderen Prozesse weiter.

Welche Prozesse brauchst Du?
Der Taster, der die Zeit starten soll (oder in meinem Vorschlag der UART) muß regelmäßig abgefragt werden (könnte man auch mit Interrupts realisieren, aber das will ich Dir noch nicht antun)
Das pseudo-zufällige manipulieren der LED-Pulsweiten des Flackereffekts.
Das herunterzählen der Leuchtzeit bis zum abschalten.
Dabei wollte ich nur wissen, ob ich mit meinen Vermutungen richtig liege.
Könnte ich einen anderen Timer0 oder Timer2 nehmen, mir eine Frequenz ausrechnen und somit zwei unterschiedlich blinkenden Led's auf einen µC zu haben.
Meine Antwort war "ja, aber damit belegst Du den anderen Timer".
Ich habe nur hinterher erläutert, daß Du auch mit Timer1 allein unterschiedliche Zeitbasen generieren kannst, und erst recht unterschiedliche LEDs mit unterschiedlichen Frequenzen blinken lassen kannst.

Timer0 und Timer2 sind beim Mega8 8-Bit-Timer, und wesentlich weniger potent. Aber grundsätzlich kannst Du natürlich die beiden natürlich mit Config Timer0 bzw Config Timer2 ähnlich konfigurieren, und mit einem eigenen Vorteiler eigene Frequenzen aus dem Systemtakt ableiten lassen.
 
Timer0 und Timer2 sind beim Mega8 8-Bit-Timer...
Das wollte ich doch grundsätzlich auch nur wissen, wissen ob ich das Prinzip richtig erkannt habe.
Welche Prozesse brauchst Du?
Eigentlich den Flacker Prozess für eine bestimmte Zeit mit Taster starten.
jeweils 10 Sekunden
Okay, hat ein bisschen lange gedauert (war irgendwo eine Blockade). Ist vollkommen klar, wenn der Timer 10 Sekunden wartet, dass der Prozess still steht. In meinem Programm (eigentlich von Cassio) soll ja auch nur die gelbe Led nach 10 Stunden ausgehen und dann passiert auch nichts mehr.
 
Ich habe das jetzt so gemacht.

CodeBox BascomAVR
$regfile = "m8def.dat"                  'Controllerdefinitionsdatei einbinden
$crystal = 8000000                      'Systemtakt angeben (Baudrate)
$hwstack = 40                           'Stacks
$swstack = 16
$framesize = 32
$baud = 19200                           'Baudrate UART

'Phasenkorrekter 8-Bit-PWM, PWM-Frequenz=245Hz
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Clear Down
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect

Dim Zeichen As Bit

Input Zeichen
If Zeichen = 0 Then                     ' PWM abkoppeln, LED setzen
   Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
   Portb.1 = 0
Elseif Zeichen = 255 Then               ' PWM abkoppeln, LED setzen
   Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
   Portb.1 = 1
Else ' PWM ankoppeln
   Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
End If

Wenn ich
in '263
If Ischarwaiting() = 1 Then 'Wenn Zeichen Empfangen Zeichen = Inkey() 'dann Zeichen aus Puffer lesen
schreibe, funktioniert es auch, aber nur mit ASCII-Zeichen.
Macht das einen Unterschied? Wenn ja, warum?
 

Ü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)