Bascom BASCOM ; Erste Schritte zum Ausprobieren

Die 4 Config Zeiln als Block, das war nur was zwischen LotadaC und mir, so wie du es vorher hattest war es schon ok.
War nur die Frage wie Bascom es umsetzt.

Wegen nur Ascii, da muss ich grad passen. Könnte sein dass Bascom nicht-Ascii raus filtert?!
Sollte dem so sein musst du tatsächlich über Register gehen. @LotadaC?
 
Input wartet aber wieder, nicht nur auf irgendein empfangenes Byte, sondern (zusätzlich) auf ein Carriage Return (ASCII Code 0x0D bzw 13 dezimal).
Deswegen hatten wir ja mit Ischarwaiting geprüft usw.
Aber Zeichen soll ein Byte aufnehmen, also sollte es nicht als Bit dimensioniert werden;).
Wegen nur Ascii, da muss ich grad passen. Könnte sein dass Bascom nicht-Ascii raus filtert?!
Ursprünglich hatten wir Zeichen ja als normales Byte; inkey kopiert einfach den Inhalt vom UDR.
Beim Vergleich hatten wir einmal If Zeichen = "1" Then und einmal If Zeichen = 1 Then.
Es wird immer eine konstante mit einem Byte verglichen, also nirgends ASCII.
Beim zweiten ist's klar, das Byte in Zeichen wird mit der Konstante &B00000001 verglichen.
Beim ersten interpretiert Bascom die "1" als ASCII-Code von 1, das ist die 49 dezimal bzw &B00110001. Hier wird Zeichen also mit der Konstante &B00110001 verglichen. Der Kompiler ersetzt das Zeichen "1" durch die Konstante 49, und verwendet die im Vergleich. ASCII kennt der Controller gar nicht.
 
Ja das stimmt. Wie gesagt habe ich beide Varianten ausprobiert und habe den Unterschied gemerkt. Wenn dann aber noch das Print...dazugebe kann ich das Terminal nicht mehr stoppen, also weg das Print.
 
Im Code aus #280 ist keine Hauptschleife mehr zu sehen - der Controller würde also den gesamten restlichen Flash durchlaufen, und von vorn anfangen. Da steht nichts; er würde also je einen Takt aussetzen. Der Mega8 besitzt 8kb Flash - das wären, wenn man den vorhandenen Code vernachlässigt etwa 4k NOPs (No Operation Instruktionen) mit 8MHz, das Programm würde also mit etwa 2kHz wiederholt werden - Dein Print wäre also 2000 mal pro Sekunde dran.
Also nur um 'ne Dimension zu haben - auch wenns nur tausend Prints pro Sekunde sind...
Wegen solcher Sachen hatte ich Dir ja die Sekunden-Zeitbasis mit der blinkenden LED erläutert.
 
Ich habe das gar nicht mitbekommen, dass ich die Hauptschleife vergessen habe. Muss ich später gleich mal ausprobieren, was sich dann ändert.
 
Input wartet wie gesagt auf ein <CR>, inkey wartet gar nicht, sondern liest einfach den Empfangspuffer aus. wenn der leer ist, wird 'ne null (&B00000000) gelesen.
Deswegen hatten wir ja vorher mit Ischarwaiting überprüft, ob was empfangen wurde, und nur dann mit inkey gelesen und weiterverarbeitet...
 
Ich habe das jetzt hoffentlich korrekt gemacht.
  • Sende ASCII (1) dann Pwm1a und Pwm1b an
  • Sende ASCII (0) dann beide aus
  • Sende ASCII (255) nur Pwm1a an


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 = Clear Down , Compare B Pwm = Clear Down

Dim Zeichen As Byte

Do
   If Ischarwaiting() = 1 Then          'Wenn Zeichen Empfangen
      Zeichen = Inkey()                 'dann Zeichen aus Puffer lesen
      If Zeichen = 0 Then
         Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
         Portb.1 = 0
      Elseif Zeichen = 255 Then
         Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
         Portb.1 = 1
      Else
         Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
      End If
   End If
Loop
 
Sieht zumindest richtig aus.
Tut's denn das was es soll?
 
Das wollte ich eigentlich von Euch wissen, od das richtig ist, was es tut
  • Sende ASCII (1) dann Pwm1a und Pwm1b an
  • Sende ASCII (0) dann beide aus
  • Sende ASCII (255) nur Pwm1a an
obwohl bei sende 255 als config "Compare A Pwm = Disconnect , Compare B Pwm = Disconnect" geschrieben steht.
 
Die Ursprünglich von mir gestellte Aufgabe war, bei einem empfangenen &B00000000 die Outputs abzukoppeln (=disconnect), und bei einem empfangenen &B11111111 die Outputs anzukoppeln (=clear up/down).
Zusätzlich zu den ganzen anderen Überprüfungen die die rote(?) LED schalteten und die Intensität des einen Kanals festlegen.
Und zusätzlich zur blinkenden LED.
Die Intensität des anderen Kanales wurde durch ein Poti festgelegt.
Auch bei abgeschalteten Outputs kann eine neue Intensität vorgegeben werden (ein Kanal über UART, einer über das Poti) - sehen tust Du das aber erst, wenn die Outputs wieder angekoppelt werden, klar?

Jetzt wird bei &B00000000 disconnected und außerdem der Pegel eines(!!) der beiden Outputs auf 0 gesetzt (warum nicht beide?),
bei &B11111111 auch disconnected und außerdem der Pegel eines(!!) der beiden Outputs auf 1 gesetzt (der sollte also leuchten, ohne PWM),
sonst connected.
Einer Deiner der beiden Kanäle wird also zusätzlich bei 0 bzw 255 ab bzw angeschaltet.
Was ist letztendlich das Ziel?
Den Flackercode durchlaufen zu lassen (auf beiden Kanälen), aber zusätzlich 'ne Möglichkeit zu haben, die Ausgabe komplett abzuschalten oder eben zu erlauben.
Erstmal gesteuert über den UART, man könnte auch einen Taster nehmen.
Später soll 'ne Möglichkeit dazukommen, die Ausgabe durch irgendwas zu aktivieren (UART, Taster), die Abschaltung soll dann nach einer festen/wählbaren Zeit erfolgen.
Ebenso könnte man auch die Zeit des automatischen Anschaltens festlegen/umsetzen (an für 8h, aus für 12h im Wechsel oder sowas).
(als Alternative hab ich noch 'ne Variante, die anhand der Umgebungshelligkeit selbständig die Ausgabe aktiviert/deaktiviert. Und 'ne ganz simple Variante, die nach einem Reset (zB mittels Reset-Taster oder eben nach dem PowerUp) lediglich 'ne festgelegte Zeit lang PWM ausgiebt, und dann abschaltet und den Controller schlafen schickt. Beide eignen sich für sehr kleine (Beinzahl und Programmspeicher) Controller - Bascom unterstützt leider keine TPI-Tinies, also auch nicht den Tiny10 (die haben nur 16 Rechenregister). Aber Dein Tiny13 wär 'ne Überlegung wert. Vorerst experimentieren wir aber noch mit dem großen Mega8...)

Wenn der Timer in diesem Modus verwendet wird und ein Bein als PWM-Output aktiviert wird, übersteuert der Timer den Pegel des Beines - das entsprechende Bit im Port-Register wird ignoriert, aber nicht(!) geändert. Wenn der Output also disconnected wird, gilt wieder der Wert im Port-Register.
 
Mit dem Code aus #287 habe ich nur ein bisschen rum experimentiert. Ich sage mir immer "probieren geht über studieren".
Jetzt will ich aber wieder zur Sache kommen um mein Ziel zu erreichen. Deine Überlegungen mit den Zeitvorgaben und/oder Helligkeitssteuerungen interessieren mich sehr.
Die Ursprünglich von mir gestellte Aufgabe war, bei einem empfangenen &B00000000 die Outputs abzukoppeln (=disconnect)
Dieses habe ich doch aber in #287 erreicht. Allerdings habe ich alles andere aus dem Code raus genommen, aber nicht verschwunden.
Wie lautet jetzt genau die nächste Aufgabe. Bitte in kleinen Schritten, da ich sonst wieder alles durcheinander haue.
 
Dieses habe ich doch aber in #287 erreicht.
Ja, aber nicht das:
und bei einem empfangenen &B11111111 die Outputs anzukoppeln (=clear up/down).
Außerdem fehlt der Rest, also die Ansteuerung der Intensitäten (UART und Poti).
'0' und '255' sollen nur die Kopplung an den Timer verändern - nicht das was das Bein sonst macht.

Dann solltest Du das feststellen können:
Auch bei abgeschalteten Outputs kann eine neue Intensität vorgegeben werden (ein Kanal über UART, einer über das Poti) - sehen tust Du das aber erst, wenn die Outputs wieder angekoppelt werden, klar?

Was Du aus diesem Teil gelernt haben solltest ist, wie Du die PWM-Ausgabe abtrennen und ankoppeln kannst ohne den Timer selbst zu veränderm/starten/stoppen. Die grüne LED soll unverändert weiter blinken, die rote schaltbar bleiben...
 
Ok, Ausgangscode war folgender:


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                                               'Timerüberlaufzähler
Dim Poti As Word                                            'ADC-Messung

Rot Alias Portd.7                                           'Namen für LED-Beine
Gruen Alias Portc.3
Config Rot = Output                                         'Ausgänge
Config Gruen = Output
Rot = 1                                                     'LEDs erstmal an
Gruen = 1

'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
      Else
         Pwm1b = Zeichen                                    'sonst PWM1B zuweisen
      End If
   End If

   'zweites Teilprogramm - LED durch timer blinken lassen
   If Tifr.tov1 = 1 Then                                    'wenn Timer übergelaufen ist
      Tifr.tov1 = 1                                         'Überlaufflag zurücksetzen
      Poti = Getadc(0)
      Pwm1a = Poti / 4
      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
Loop

Wir haben geprüft ob das empfangene Zeichen "1", "0", "t" oder "?" war. Jetzt fügen wir noch hinzu, ob Zeichen=0 (dann sollen die Ausgaben disconnected werden) oder Zeichen=255 (dann sollen sie connected also mit clear down werden) ist. Bei jedem anderen Wert soll das ganze weiterhin die Intensität von Kanal B festlegen.
Also:


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                                               'Timerüberlaufzähler
Dim Poti As Word                                            'ADC-Messung

Rot Alias Portd.7                                           'Namen für LED-Beine
Gruen Alias Portc.3
Config Rot = Output                                         'Ausgänge
Config Gruen = Output
Rot = 1                                                     'LEDs erstmal an
Gruen = 1

'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
         Pwm1b = Zeichen                                    'sonst PWM1B zuweisen
      End If
   End If

   'zweites Teilprogramm - LED durch timer blinken lassen
   If Tifr.tov1 = 1 Then                                    'wenn Timer übergelaufen ist
      Tifr.tov1 = 1                                         'Überlaufflag zurücksetzen
      Poti = Getadc(0)
      Pwm1a = Poti / 4
      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
Loop


Nachvollziehen und ausprobieren!!
 
Bis auf den Poti haut alles hin. Ich habe vergessen, wie Poti angeschlossen werden muss.
Vom logischen her habe links und recht des Poti an Vcc und GND angeschlossen. Den Schleifer an PC0. Irgend etwas habe ich falsch gemacht.
 
Zuletzt bearbeitet:
Oh Oh. ich habe wieder mal geschlafen. Im Code steht ja auch kein "Print Poti" und kann somit auch nichts im Terminal sehen.
Also Pwm1a verändert sich.
Im übrigen habe ich jetzt ein "ATmega8 ATmega48 ATMEGA88 Development Board AVR". Damit habe ich weniger Kabelsalat und mehr Platz auf dem Steckboard.
 

Anhänge

  • ATmega8 ATmega48 ATMEGA88 Development Board AVR.jpg
    ATmega8 ATmega48 ATMEGA88 Development Board AVR.jpg
    219,1 KB · Aufrufe: 12
Das Ding scheint ja zu Preisen verfügbar zu sein, zu dem man sonst nicht mal den Nullkraft-Sockel bekommt - was mir fehlt ist der Schaltplan - dazu findet sich irgendwie nichts...
Die üblichen Fragen bei solchen Boards:
  1. wie ist der Aref-Pin verdrahtet?
  2. wie kann der Quarz an-/abgekoppelt werden (insbesondere auch wegen der Bürdekondensatoren dran)
Der hier verwendete Quarz scheint ein 8Mhz-Quarz zu sein - ist der wenigstens gesockelt? (der M8 kann ja auch 16MHz, die neueren Controller sogar bis 20MHz)

So, in #21 hatte ich ja quasi Deinen Flackercode "Multitasking-fähig" umgeschrieben. Der sollte jetzt in den Code aus #293 integriert werden - damit müßte dann natürlich die Ansteuerung von KanalB in Zeile 50 und KanalA in Zeile 58 auskommentiert werden - das soll ja der Flackercode übernehmen.

Denk mal selbst drüber nach, wie Du beides zusammenbekommst...
 
  1. wie ist der Aref-Pin verdrahtet?
  2. wie kann der Quarz an-/abgekoppelt werden (insbesondere auch wegen der Bürdekondensatoren dran)
Es ist eine zweiseitige Patiene. Einen Bauplan habe ich schon gesucht, ohne Erfolg.
Ich könnte ein paar Großaufnahmen machen, wenn es Dir etwas nützt.
Denk mal selbst drüber nach, wie Du beides zusammenbekommst...
Ich werde mir Mühe geben. Heute Nachmittag war Ausflug angesagt.
 

Anhänge

  • 2019-06-02 20.03.55.jpg
    2019-06-02 20.03.55.jpg
    2,1 MB · Aufrufe: 8
KanalA in Zeile 58 auskommentiert werden - das soll ja der Flackercode übernehmen
Das habe ich hinbekommen. Nur mit KanalB bzw. Pwm1b hab ich noch Schwierigkeiten.


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                           'Timerüberlaufzähler
Dim Poti As Word                        'ADC-Messung
Dim Fla As Byte
Dim Pause As Byte
Dim Pausex2 As Byte
Dim Tov1cnt As Byte


Rot Alias Portd.7                       'Namen für LED-Beine
Gruen Alias Portc.3
Config Rot = Output                     'Ausgänge
Config Gruen = Output
Rot = 1                                 'LEDs erstmal an
Gruen = 1

'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
         Pwm1b = Zeichen                'sonst PWM1B zuweisen
      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 Pause = Tov1cnt Then           'entspricht dem 2ten "waitms pause"
         Fla = Rnd(200)
         Fla = Fla + 55
         Pwm1a = Fla
      End If
   End If
Loop
 

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