Bascom BASCOM ; Erste Schritte zum Ausprobieren

Ehhh, seh ich jetzt erst. Du musst natürlich den Wert von deiner Poti Variable shiften ;)
Die Variable "Wert" wird zwar definiert aber nie zugewiesen oder ausgelesen, du schiebst also 0, bleibt 0 und ignorierst das Ergebnis.
Shift Poti , Right , 2 wäre richtig.
 
Danke! So haut es hin.
Die Zeile 11 hab ich auch auskommentiert, da eine Variable "Wert" nicht gebraucht wird und Variable "Poti" ist schon drin.
 
Schön. Denn fehlt ja nur noch das Zuweisen zu der LED / PWM und die Aufgabe ist gelöst :)
Pwm1a = Poti müsste gehen.
 
Poti erhält das 10-Bit-Ergebnis des ADC zugewiesen und wird ausgegeben.
Wert hat initial den Wert 0, der sich durch das Schieben nie ändert. Wert wird sonst nie verwendet.

Streiche Wert.
Schiene Poti.
(Weise Poti PWM1A zu.)

UPS... hat Thomas ja schon alles geklärt...
 
Und was soll mit der LED an Pwm1b passieren? Diese ist immer noch am Startwert.
Sicherlich gibt es dann noch eine andere Variante. Ich lass mich mal überraschen.


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
'Dim Wert 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

Config Adc = Single , Prescaler = Auto , Reference = Avcc
'Phasenkorrekter 8-Bit-PWM, PWM-Frequenz=245Hz
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1a = 250
Pwm1b = 100

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                '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
         Pwm1a = Zeichen
      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
      Incr Z
      If Z = 245 Then                   'Überläufe zählen (245)
         Z = 0                          'Zähler zurücksetzen
         Toggle Gruen                   'LED toggeln
         Poti = Getadc(0)
         Shift Poti , Right , 2
         Pwm1a = Poti
      End If
   End If

Loop                                    'Hauptschleife Ende
 
Zuletzt bearbeitet:
Eigentlich wurde Kanal B durch den UART gesteuert - war zumindest bis etwa #185 noch so. Zeile 46 im derzeitigen Code müßte angepasst werden.
Kanal A soll jetzt z usätzlich über das Poti angesteuert werden. Zeile 59.
 
Ja da stimmt auch.
Ich meinte aber ein Beispiel-Code aus früherer Zeit, als ich nur mit Strg+C und Strg+V experimentiert habe.
Besser gesagt, habe ich meine Experimente aus Beispielen mit unterschiedlichen Code aber selben Ergebnis verglichen, die Bascom Befehle mir etwas näher angesehen um danach ein eigenes Projekt zu fertigen. Ich hatte bis zu diesen Forum keine Ahnung, was in so einem µC alles drin steckt.
Also muss ich mir einen Code zusammen basteln, um das "Shift Poti , Right , 2 " besser zu verstehen. So mach ich das immer.
Dieses hab ich nur halbwegs begriffen #196
0 0 0 0 = 0 0 0 0 1 = 1 0 0 1 0 = 2 0 0 1 1 = 3 0 1 0 0 = 4 0 1 0 1 = 5 0 1 1 0 = 6 0 1 1 1 = 7
Hat das etwas zählen von rechts nach links zu tun? also 0=1, 1=2, 2=4, 3=8, 4=64, 5=1024... usw.?
 
Ja, nur anders herum.
Jedes Bit hat eine Wertigkeit.
Jetzt mal mit 8 Bits:
Code:
  7   6   5   4   3   2   1   0 (Bit-Nummer)
128  64  32  16   8   4   2   1 (Dezimalwert)
-------------------------------
  1   0   1   0   1   0   1   0 = 128 + 32 + 8 + 2 = 170

Um 1 nach rechts geschoben:

  0   1   0   1   0   1   0   1 = 64 + 16 + 4 + 1 = 85

Die letzte 0 (=der Rest) fällt raus, vorne kommen immer 0 rein.
Fazit: Teilung durch 2.
Respektive anders herum beim links schieben.

Daher auch diese "krummen" Werte wie 0..255, weil:

  1   1   1   1   1   1   1   1 = 255

also der maximal representierbare Wert. Übrigens, daher ist 1KB auch nicht 1000
Bytes, sondern 1024. Wenn man das Byte jetzt um 2 Bits erweitern würde, wie dein
ADC Wert, ist man recht nah an 1000 dran. Reichte damals aus, dividieren durch 1000 war "zu teuer".
Wenn du dir die Wertigkeit der Bits anschaust siehst du, es ist immer nur *2.

(Vorsicht bei Bit-Nummer: Ich bin es gewöhnt mit 0 anzufangen beim Zählen. Wenn ich mich richtig erinner ist es bei Bascom aber 1)
 
Zuletzt bearbeitet:
Richtig :)
 
Guten Morgen alle zusammen.
Die Aufgabe müsste nun gelöst sein, mit Unterstützung von TommyB, der mir auch noch einmal die Verschiebung der Bit's klar machte.
Nun regle ich OC1A mit Potentiometer, OC1B bleibt konstant beim Startwert, die Rote LED an PD7 steuere ich per Tastatur über das Terminal und die Grüne LED blinkt im Sekundentakt über Timer1.
Im Prinzip wird alles noch per Hand gesteuert (außer der Grünen LED).
Wie geht es weiter?
 
Vielleicht könnte man jetzt mal mit Interrupts rum spielen.
Weißt du vom Grundprinzip was das ist? (Nicht schlimm wenn nicht)
 
Interrupts sind Unterbrechungen, die an einer bestimmten Stelle ausgeführt werden um ein anderes Programm durchzuführen. Nachdem dieses abgelaufen ist, wird genau an der Stelle weiter gemacht, wo die Unterbrechung stattgefunden hat.
Ich selber habe noch kein Code damit geschrieben, wobei es mich sehr Interessieren würde, denn überall kommen diese Interrupts vor und ich kenne mich mit dem Ablauf und der Schreibweise nicht aus.
 
Denn hast du das Grundwissen ja schon :)
Ich würde nur nicht sagen "an einer bestimmten Stelle" sondern "bei einem bestimmten Ereignis".
So könntest du dein Hauptprogramm unterbrechen *lassen* wenn z.B. der ADC einen neuen Wert hat, oder dein Timer überläuft. Es gibt viele mögliche Quellen, auch die serielle Schnittstelle.

Aber hierzu könnte @LotadaC oder einer der anderen fähigen Leute hier besser äußern, ich bin aus Bascom zu lange raus.

Grundprinzip ist aber:
Interrupts sind generell deaktiviert. Willst du sie verwenden musst du sie vorher aktivieren, und das 2x. Einmal definierst du dass du den Interrupt für Ereignis xyz empfangen möchtest. Dann dass sie generell aktiviert werden.
Bascom muss dann natürlich noch wissen wohin es in deinem Programm hin springen muss.
 
Aber hierzu könnte @LotadaC oder einer der anderen fähigen Leute hier besser äußern, ich bin aus Bascom zu lange raus.
Ich weiß nicht, ob LotadaC noch Lust hat, mir etwas beizubringen, da Du mir geholfen hast. Das war aber auch besser so, denn wenn ich nicht gleich den richtigen Weg finde, komme ich auch nicht von der Spur runter. Ich verharre dann bei meinen ersten Gedanken und kann nicht wieder los lassen.
Ich hoffe LotadaC, das ist Okay für Dich, wenn mir TommyB ein wenig hilft. Für Ihn scheint es auch ein bisschen Auffrischung zu sein.
 
Bestimmt, wenn er Zeit findet.
Außerdem ist er der Lehrer, ich nur der, der in der Klasse neben dir sitzt und mal kurz über die Schulter schaut ;)
Konkurrenzkampf gibt es in dieser Community nicht. Hier hilft jeder jeden wo und wann er kann.
 
Ich habe das auch nicht als Konkurrenzkampf angesehen bzw. gemeint. Ist schöner Vergleich mit dem Lehrer und Schüler. Es ist auch ein guter Vorteil für mich, einen Schüler aus der höheren Klasse als Nachbar zu haben.
 
Nun regle ich OC1A mit Potentiometer, OC1B bleibt konstant beim Startwert,
Nein...
Eigentlich wurde Kanal B durch den UART gesteuert - war zumindest bis etwa #185 noch so. Zeile 46 im derzeitigen Code müßte angepasst werden.
Hatte die letzten Tage und wahrscheinlich auch am kommenden WE wenig Zeit.

Was Du bis hier mitgenommen haben solltest ist, wie man mehrere Aufgaben nebeneinander realisieren kann.
Eine LED blinkt,
Eine wird über den UART gesteuert.
Eine über ADC-Auswertung.

Die nächste Aufgabe wäre, die extremsten Werte (0 und 255) zu verwenden, um die PWM-Ausgabe komplett ab-/anzuschalten.
(also der Timer soll weiterlaufen, die entsprechende LED blinken, aber die PWM-Ausgabe an den beiden Kanälen soll deaktiviert werden. Ursprünglich wollte ich das mit "Configurations" machen, aber Bascom will nicht so wie ich.

Auf lange Sicht war ja das Ziel, Deinen Kerzen-Flimmer-Code zu verwenden - das Abschalten nach einer bestimmten Zeit solltest Du nach dieser Aufgabe selbst hinbekommen können. Ebenso, daß über den UART 'ne Laufzeit vorgegeben werden kann ("Starte Kerzenflackern für siebenundfünfzig Jahre" oder sowas…)

Unter Ausnutzung des ADC könnte man stattdessen/zusätzlich auch auf die Helligkeit reagieren...

Was zuerst??
 
Zeile 46 habe ich jetzt auf "Pwm1b" geändert. Ist mir klar geworden. 1a über Poti und 1b über UART.
("Starte Kerzenflackern für siebenundfünfzig Jahre" oder sowas…)
Das wollte ich erreichen (für ca. 8 Stunden, also Nachts). Aber über UART muss doch immer der PC verbunden sein?
 

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