Bascom BASCOM ; Erste Schritte zum Ausprobieren

Die Fuse Bit dürften meines Wissens her richtig eingestellt sein.
Trotzdem geht meine Led auf dem Steckbrett nicht an, auch wenn im Simulator steht "Zeichen eingeben, also 1, danach Enter, weiter step bis "Print "LED an" im UART0 steht auch Led An.
8028
 
Die Zeilen 8 und 9 machen dasselbe - sie Konfigurieren das Bein D7 als Ausgang (setzen also das entsprechende Bit im Datenrichtungsregister). Das verursacht zwar kein Problem, die LED sollte aber eigentlich in Zeile 9 aktiviert werden.
Das hätte mir natürlich in #55 bereits auffallen können, in #54 habe ich erst mit Alias den Namen vergeben (Zeile 9), diesen Namen dann sowohl beim Konfigurieren als Ausgang (Zeile 10), als auch beim aktivieren der LED (Zeile11) verwendet.
Mit "Set", da könnte aber ebenso die Zuweisung "Led-rot=1" stehen.
Abgesehen davon, daß die Led vor Begin der Schleife aus ist und nicht an, läuft es so aber, in der Schleife wird die LED dann entsprechend des empfangenen Zeichens an und abgeschaltet.

Sowohl im Simulator (da kann man die Beinzustände übrigens auch mit "Show Hardware emulation" anzeigen lassen), als auch im realen Controller.
Hast Du Deine Led nebst Vorwiderstand denn mal direkt an den 5V vom Steckbrett gestestet?
 
Ich kann machen was ich will, die Led zeigt weder im Hardwaresimulator geschweige denn auf dem Steckbrett eine Reaktion.
Die Led habe ich geprüft, sie ist ok.
Im Simulator kann ich auch
"Run program"
drücken. Danach erscheint im Terminal
"Zeichen eingaben:"
nachdem ich "1"
eingegeben habe erscheint im Terminal
"Led An"
bei "0" erscheint im Terminal "Led Aus"
bei "t" erscheint im Terminal "Led An Aus"
bei "?" erscheint im Terminal "Led Wartet"
und das mit diesem Code.


CodeBox BascomAVR
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200

Config Portd.7 = Output
Config Portd.7 = 1

Dim Zeichen As String * 1

Led_rot Alias Portd.7

Do
   Input "Zeichen eingeben: " , Zeichen
   If Zeichen = "1" Then
      Led_rot = 1
      Print "Led An"
   Elseif Zeichen = "0" Then
      Led_rot = 0
      Print "Led Aus"
   Elseif Zeichen = "t" Then
      Toggle Led_rot
      Print "Led An Aus"
   Elseif Zeichen = "?" Then
      Print "Led Wartet"
   End If
Loop
End

Also der Simulator regiert auf die Input Zeichen, nur auf dem Steckbrett nicht.
 
Zeile 9 ist sinnlos, die macht dasselbe wie Zeile 8.
Um die LED dort anzuschalten mußt Du Led-rot auf "1" setzen ("set led_rot" bzw "led_rot=1"). Der Name muß natürlich vorher bekannt sein (Alias), sonst mußt Du Portd.7 ausschreiben.

Im Simulator scheint jetzt alles zu laufen?

Was ist in der echten Hardware?
Die Led sollte mit der obigen Änderung bereits vor Eintritt in die Schleife aktiviert sein. Also auch dann, wenn die Input-Zeile das erste mal "Zeichen eingeben: " senden läßt.
Statt HTerm kannst Du auch den Bascom Terminal Emulator nutzen (STRG + t). Der sendet Jeden

Was für eine LED und was für einen Vorwiderstand nutzt Du?
ggf entferne mal die LED, und messe mit einem Multimeter die Spannung an D7 gegen Gnd.
 
Guten Morgen,
keine Ahnung, was jetzt passiert ist. Bisher habe ich immer den "Simulate program(F2)" zum testen bemutzt, bei dem die LED nicht reagiert hat.
Bascom Terminal Emulator nutzen (STRG + t).
Jetzt mach ich den "Terminal Emulator (Strg+1) auf und siehe da...
8036
Allerdings funktioniert es auch ohne der Zeile 13. Diese sagt anscheinend nur aus, ob beim Start die Led an oder aus sein soll.
Zeicheneingabe "t" = Toggle, verändert also den vorherigen Zustand der Led. Bisher ging ich immer davon aus, dass das Toggeln ein ständiges aus und anschalten der Led erstellen soll. Deshalb hatte ich auch die Wartezeit verwendet (Lehrbuch Led blinken lassen).
Was die Zeile 26 bewirken soll, hab ich bisher noch nicht herausgefunden.
 
Zeile 13 hast du richtig erkannt, es wird der Startwert definiert.
Zeile 26 und 27 sind eigentlich sinnlos, dienen eher als Feedback um die Hardware zu testen (man bekommt Antwort), mehr machen die nicht.

Irgendwie habe ich das Gefühl, das Basic doch nicht so leicht ist ...
Bascom Code Basic zu nennen ist recht gewagt ;)
Es ist dran angelehnt, ok.
 
Bisher habe ich immer den "Simulate program(F2)" zum testen bemutzt,
Richtig, dabei simuliert der Simulatur einen Controller. Inklusive simulierter UART-Schnittstelle (die Blaue Box im Simulator). In #50 hatte ich ja ein Bild vom Simulator, links neben meiner "1" kannst Du mit dem kleinen LCD-Icon weitere simulierte Hardware-Module des simulierten Controllers anzeigen lassen - unter anderem die Beine (eigentlich nur eine Graphische Darstellung der Port- und DDR-Register) - immer wenn Dein Programm die "LED" ändert sollte sich da auch was tun.
Jetzt mach ich den "Terminal Emulator (Strg+1) auf
Der Terminal-Emulator hingegen sollte ein echtes Terminal sein, also über die echte serielle Schnittstelle über Deinen RS232-Wandler mit dem echten Cotroller kommunizieren.
Wenn Du zB die Stromversorgung des Controllers abschaltest, sollte im Terminal nichts meh kommen.
Die (echte) LED geht jetzt also?

"t" = Toggle, verändert also den vorherigen Zustand der Led. Bisher ging ich immer davon aus, dass das Toggeln ein ständiges aus und anschalten der Led erstellen soll.
Toggle kippt das Bit um.
Genau ein mal.
Wenn Du toggle in einer Schleife endlos wiederholst, wird das bit ständig hin und her gekippt - die LED blinkt (so als wenn Du hier ununterbrochen "t Enter" in die Tastatur hämmerst).
Wenn in der Schleife nicht viel zu tun ist, blinkt die LED halt ... recht schnell (der Controller macht mehrere Millionen Instruktionen pro Sekunde (bis zu 8 - 8MHz)).
Wenn Du den Controller in der Schleife aber beschäftigst, zB 'ne halbe Sekunde auf der Stelle hüpfen läßt (wait), blinkt die LED langsamer.

Zeile 13 hast du richtig erkannt, es wird der Startwert definiert.
Insbesondere um zu sehen, daß der Controller überhaupt läuft/das Programm geflasht wurde/die LED geht, bevor irgendwelche weiteren Probleme mit dem UART etc (oder das vor der Tastatur) angegangen werden können. Jetzt scheinen wir diesen Schritt ja erreicht zu haben...

Zeile 26 und 27 sind eigentlich sinnlos, dienen eher als Feedback um die Hardware zu testen (man bekommt Antwort)
Zeile 27 ist eher ein Platzhalter wegen:
Was die Zeile 26 bewirken soll, hab ich bisher noch nicht herausgefunden.
Ihm ist die Aufgabe nicht ganz klar - oder es fehlt die Lösungsidee...
Aufgabe war, nach einem "?" den tatsächlichen Zustand der LED (bzw des LED-Beines) zurückzusenden.
Wenn die LED gerade an ist, soll der Controller "LED ist an" oder sowas senden, ist sie aus, soll er auch dies kundtun.
Ein Lösungshinweis war "Was manipulierst Du zum an/abschalten der LED?"
Ein weiterer Hinweis, daß man das mit einer weiteren Fallunterscheidung mit IF..Then ..Else auswerten kann.
 
Ich weis nicht, wie ich eine weitere Abfrage erstellen kann.
Ich habe verschiedenes ausprobiert, indem ich die ersten If Anwendungen beendet habe und eine neue gestartet.
Einfach mit Elseif weiter gemacht bzw. auch eine neue Do...Loop Schleife eingefügt, immer weider bekam ich Fehlermeldungen.
Meine letzte Ausführung, die ich vielleicht schon mal am Anfang hatte, sieht so aus.
8037
 
Meine letzte Ausführung, die ich vielleicht schon mal am Anfang hatte, sieht so aus.
Fast, Du mußt beide IF..then..else-Konstrukte ineinander schachteln.
Es fehlt eigentlich nur eine Zeile... (und dann sollten die Einrückungen korrigiert werden, was Bascom aber selbst erledigen kann (Proper Indent).

Es geht ja eigentlich nur um den Bereich zwischen den Zeilen 26 (Wenn Zeichen gleich "?"...) und 31 (Ende dieses IF-Konstruktes).
Nur in diesem Fall willst Du prüfen ob rot 1 oder 0 ist.
Dieser innere "If..then..else"-Block muß auch irgendwo beendet werden...
 
:good2:
In #20 hatte ich ja die von Dir gelieferte Timer1-Konfiguration analysiert. In unserem derzeitigen Programm kommentierst Du erstmal den gesamten IF..Then..Else-Block (also den gesamten Schleifeninhalt) aus.
Das Input natürlich auch, also daß die do..loop erstmal leer ist. Um einen ganzen Code-Block auszukommentieren kannst Du in die Zeile davor ein '( schreiben, und in die Zeile dahinter ein ')
Timer1 lief im Phasenkorrekten PWM, also zwischen 0 und 255 hin und her - die "0" wird alle 510 Schritte erreicht. Der Timer ist mit einem Vorteiler von 64 an den Systemtakt (8MHz) gekoppelt.
Die PWM an den beiden Output Compare Beinen ignorieren wir einfach mal...
Jedesmal, wenn der Timer "0" erreicht, wird das TOV1-Bit im TIFR-Register gesetzt (Das TIFR ist beim Mega8 das Timer Interrupt Flag Register - dort befinden sich die Interrupt-Flags aller Timer. Das Interrupt vergessen wir dabei erstmal, stell es Dir als Statusanzeige vor. Du bist der Rechenkern des Controllers, und sitzt an Deinem Schreibtisch. Neben Dir hast Du ein großes Panel mit Lampen und Schaltern (sind immer bis zu acht zusammengefaßt - Bytes halt), die I/O-Register. Und eines dieser zusammengefaßten Lampen ist das TIFR. Es hat sieben Lampen; vier davon betreffen Timer1, die anderen drei die anderen beiden Timer. Uns interessiert erstmal nur eine Lampe, die wo TOV1 drübersteht. Die geht jedesmal automatisch an, wenn der Timer in irgendeiner Form überläuft, im hier verwendeten Phasenkorrekten Modus (hin und her) ist das beim erreichen der "0" der Fall.
Ein kurzer Blick von Deinem Schreibtisch auf das Panel sagt Dir, ob irgendwann mal so ein "Überlauf" stattfand. Allerdings wird die Lampe nicht selbständig gelöscht - dafür hast Du 'n Taster unter der Lampe, der sie zurücksetzt.
Ziel wäre es jetzt eine andere LED - sagen wir mal an C3 - blinken zu lassen.
In der letzten Aufgabe bestimmt das Empfangene UART-Zeichen Aktionen von Led-rot.
Die Aktionen der C3-Led sollen durch die "Timerüberläufe" ausgelöst werden.

Kannst Du ausrechnen, mit welcher Frequenz der Timer bei dieser Frequenz überläuft, und mit welcher Frequenz die LED blinkt (wenn man sie bei jedem Überlauf toggelt)?
(die nötigen Werte stehen eigentlich alle in Diesem Beitrag)
 
Zuletzt bearbeitet:
Sieht gut aus :)
Kleiner Tipp: Gewöhne dir gleich Liebe zum Detail an, hier das richtige Einrücken. Macht den Code wesentlich lesbarer und (wenn auch in Basic-ähnlichen Sprachen nur Kosmetik) in anderen Sprachen wie Python strikt erforderlich:
8039

Strenggenommen, in Zeile 29... Die If, also Zeile 27, kann ja nur 1 oder 0 sein, daher ist eine weitere Abfrage nicht nötig. Daher würde hier ein simples Else reichen.
 
TaktPeriodendauer = 8MHz / Prescaler64 = 0,125µs
Ein Überlauf ist alle 255 ∙ 8μs = 2,04ms
Die Blinkfrequenz wäre ca. 490 Hz.

Könnte das so hinkommen?
 
TaktPeriodendauer = 8MHz / Prescaler64 = 0,125µs
paßt
Ein Überlauf ist alle 255 ∙ 8μs = 2,04ms
nein, beim single slope wären es alle 256 Schritte (der Überlauf von 200 zu 0) - Wir hatten aber den phasenkorrekten dual slope, also von null hoch zu 255 und dann wieder zurück zu null. Das TOV1 schlägt jedesmal wenn die Null erreicht wird zu, also alle 510 Schritte.
Die Blinkfrequenz wäre ca. 490 Hz.
Bei jedem TOV wird die LED nur einmal(!) umgeschaltet
 
Muss ich den Überlauf x der Periodendauer (0,125) rechnen oder x die 8 mycrosekunden Taktfrequenz?
 
Ok, was macht:
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Es werden in folgenden drei Registern Bits gesetzt:
  • DDRB: &B00000110
  • TCCR1A: &B11110001
  • TCCR1B: &B00000011
Also:
  • B1 und B2 werden Ausgänge (11)
  • Waveform Generation Mode für Timer 1 wird WGM=&B0001
  • Compare Output Mode für beide Kanäle: COM1A[1..0]=&B11, COM1B[1..0]=&B11
  • Clock Select CS=&B011, das entspricht Prescaler=64
Also B1 und B2 sind Ausgänge, WGM=1 entspricht dem phasenkorrektem 8-Bit-PWM (der Timer läuft zwischen 0 und 255 hin und her).
Bei jedem Timer-Schritt wird der eigentliche Zähler mit den beiden Output Compare-Registern verglichen - bei einem Match wird das entsprechende Output-Bein manipuliert: beim Raufzählen wird das Bein gesetzt, beim runterzählen wird es gelöscht.
Der Timer läuft mit Prescaler=64, also 125kHz Schrittfrequenz los.
Dein Controller läuft mit den 8MHz des internen Oszillators.
Der Timer ist mit einem Vorteiler von 64 an den Systemtakt gekoppelt.
Die Schrittfrequenz des Timers liegt also bei 8000000Hz/64=125000Hz.
Der Timer läuft im Phasenkorrekten 8-Bit-PWM. Das PWM ignorieren wir erstmal, bleibt Phasenkorrekt und 8 Bit.
Der Timer zählt also immer zwischen 0 und 255 (=8Bit) hin und her (=phasenkorrekt):
0→1→2→3→4→5→6→...→253→254→255→254→253→252→...→6→5→4→3→2→1→0→1→2→3→...→253→254→255→254→253→252→...
klar?
Das TOV-Flag wird jedesmal automatisch gesetzt, wenn der Timer 0 erreicht. Das ist also alle 510 Schritte der Fall (255 rauf plus 255 runter). Folglich wird das TOV gesetzt mit einer Frequenz von 125000Hz/510=245,1Hz.
Das TOV soll jetzt in der Hauptschleife in Software ausgewertet werden, die neue LED jedesmal getoggelt werden. Eine volle An-Aus-Periode benötigt zweimal tolggeln, folglich würde die LED mit einer Frequenz von 245,1Hz/2=122,55Hz blinken.

Entweder Du hast deutlich flinkere Augen als ich, oder wir müssen was ändern. Am einfachsten wäre es, den Vorteiler (Prescaler) zu ändern.
Timer1 bietet folgende diskrete Vorteiler an:
  • 0 Timer steht (klar, ist kein echter Teiler)
  • 1
  • 8
  • 64
  • 256
  • 1024
Bei Vorteiler 256 hätten wir logischerweise ein viertel der etwa 120Hz, also immerhin noch 30Hz...
Vorteiler 1024 liefert 8000000Hz/1024/510/2=7,6Hz - das sollte als flimmern wahrnehmbar sein

Wir verwenden also Vorteiler 1024 statt 64:
Config Timer1 = Pwm , Prescale = 1024 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down

Du müßtest also diese Zeile im Initialisierungsbereich (also vor der Schleife) einfügen.
Außerdem sollte dort auch C3 für die LED initialisiert werden (wie bei der LED an D7), die LED an C3 sollte initial bereits vor dem Schleifeneintritt leuchten.
Außerdem sollte wie gesagt der gesamte bisherige Code in der Schleife erstmal auskommentiert werden (also funktionstechnisch 'ne leere do..loop.
Wenn Du das Programm soweit erfolgreich compiliert hast testen und hier posten.
Beim Test müßten also beide LEDs dauerleuchten, es sollten keine UART-Ausgaben erfolgen und keine Reaktionen auf UART-Eingaben.

Ausführung...

P.S.: Achtung! Das Timer-Config macht die beiden OC-Beine zu Ausgängen und läßt die zappeln. Stelle als sicher, daß an den beiden Beinen (B1 und B2) nichts weiter angeschlossen ist/berührt wird.
 
Zuletzt bearbeitet:
Wenn ich den Inhalt der Do...Loop Schleife auskommentiere kommt unten eine Fehlermeldung.
8040

Ansonsten wird es übertragen und beide Led's sind an.
 
hab ich letztens auch gesehen. Bascom verschluckt sich an seinen eigenen Blockkommemtaren. Setz das " ') " mal in 'ne eigene Zeile.
 

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