Mahlzeit! Ich befasse mich seit Kurzem mit dem Atmega8-Controller und programmiere diesen in BASCOM. Zurzeit baue ich eine Schaltung, die es mir ermöglicht ein Pwm-Signal mithilfe zweier Taster stufig zu verstellen. Nun stehe ich vor dem Problem, dass der Mikrocontroller in der "Grundstellung" verharrt und sich die Pulsweite nicht verändern lässt. Die Grundstellung liegt in dem Fall bei 500 (etwa 50% Puls-Pausen-Verhältniss, weil der maximal einstellbare Wert bei 1023 liegt) $regfile = "m8def.dat" $crystal = 1000000 $hwstack = 100 $swstack = 100 $framesize = 100 Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1 Config Portc = Input Config Portb.1 = Output Config Portb.2 = Output Config Portb.3 = Output Config Portb.4 = Input Config Portb.5 = Input Dim Zahl As Word Zahl = 500 Do If Portb.4 = 1 Then Zahl = Zahl + 50 Elseif Portb.5 = 1 Then Zahl = Zahl - 50 End If Compare1a = Zahl Loop End Danke im Vorraus! Gruß
ElektronikEckart schrieb: > Danke im Vorraus! Erstens:
1 | If Portb.4 = 1 Then |
Sollte sein:
1 | If Pinb.4 = 1 Then |
Abfragen tut man mit PinX, nicht mit PortX. Und deine Taster sind verkehrt herum angeschlossen. Taster zwischen PinB.x und GND anschliessen, Pins so initialisieren:
1 | Config Portb.4 = Input |
2 | Config Portb.5 = Input |
3 | Set Portb.4 ' Pullup einschalten |
4 | Set Portb.5 |
Und dann mit:
1 | If Pinb.4 = 0 Then |
abfragen oder mit:
1 | Bitwait Pinb.4 , Reset |
warten, bis Taster gedrueckt ist.
:
Bearbeitet durch User
Ich muss zugeben, das ich keine große Ahnung von Bascom habe, aber wie sind denn die Taster verschaltet? Wie sehen DDRB und PortB aus? Sind an den Eingänge Pullup oder Pulldown Widerstände? Sind die Taster gegen Vcc oder gegen Masse geschaltet? Wie hast Du festgestellt, das sich an den Ausgängen nichts tut? Mit einer LED am PWM-Ausgang? Dann könnte es sein, das man Änderungen nicht sofort sieht, weil man für Helligkeitsänderungen im unteren Bereich nicht so gut sieht. Außerdem wird die Variable "Zahl" wohl nicht nur um 50 erhöht, wenn man eine Taste drückt sondern so lange die Taste gedrückt wird, bei jedem Durchlauf von Loop. Da müsste eine Flankenabfrage mit rein. Zudem sehe ich nirgend wo eine Begrenzung, die "Zahl" gegen Überlauf schützt. Aber das löst erst mal nicht das eigentliche Problem, das sich nix tut. Ich würde zuerst einmal zwei LEDs an je einen Ausgang anschließen und zusehen ob die sich mit den Tastern einschalten lassen. Frank Edit: Marc V. schrieb: > If Pinb.4 = 1 Then Daran hab ich gerade mal überhaupt nicht gedacht... Vielleicht sollte ich es besser lassen, über sowas um diese Uhrzeit nachzudenken...
:
Bearbeitet durch User
Danke für die schnellen Antworten. Die genannten Fehler habe ich jetzt verbessert, kann aber nicht nachvollziehen warum man die Eingänge auf Masse ziehen sollte. Die Leuchtdiode flackert jetzt. Beim Betätigen von PINB.4 hört das flackern auf - beim Betätigen von PINB.5 nicht. Frank B. schrieb: > Sind an den Eingänge Pullup oder Pulldown Widerstände? Sind die Taster > gegen Vcc oder gegen Masse geschaltet? Die Eingänge sind zurzeit (nach der Verbesserung) Taster, der den Eingang auf Masse zieht. Vorher waren sie an einem Pulldown, der mit dem Taster auf 5V gelegt wurde. Frank B. schrieb: > Außerdem wird die Variable "Zahl" wohl nicht nur um 50 erhöht, wenn man > eine Taste drückt sondern so lange die Taste gedrückt wird, bei jedem > Durchlauf von Loop. Da müsste eine Flankenabfrage mit rein. Das Problem sollte mit dem von Marc Vesely angesprochenen Bitwait-Befehl zu lösen sein, oder?
ElektronikEckart schrieb: > Das Problem sollte mit dem von Marc Vesely angesprochenen Bitwait-Befehl > zu lösen sein, oder? Nein, denn da wartest du ewig bis genau dieser Pin auf Null geht. In der Zwischenzeit kannst du den anderen Taster kaputtdrücken, passiert nichts. ElektronikEckart schrieb: > Die genannten Fehler habe ich jetzt verbessert, kann aber nicht > nachvollziehen warum man die Eingänge auf Masse ziehen sollte. Weil die AVRs eingebaute Pullup Widerstände haben, brauchst keine externen Widerstände einzulöten. ElektronikEckart schrieb: > Die Leuchtdiode flackert jetzt. Beim Betätigen von PINB.4 hört das > flackern auf - beim Betätigen von PINB.5 nicht. > verharrt und sich die Pulsweite nicht verändern lässt. Die Grundstellung > liegt in dem Fall bei 500 (etwa 50% Puls-Pausen-Verhältniss, weil der > maximal einstellbare Wert bei 1023 liegt) Wie kommst du auf 1023 ? 1024 ist der maximale Wert, aber für den Vorteiler. Max. Wert für OC1A ist immer noch 65535. Und deine 500 sind weniger als 1% davon. Was und wie da bei Bascom eingestellt wird, weiss ich nicht, da wirst du schon selber nachschauen müssen. EDIT: Atmel sagt:
1 | If OCR1A is used to define the TOP value (WGM13:0 = 9) and COM1A1:0 = 1, the OC1A output |
2 | will toggle with a 50% duty cycle. |
:
Bearbeitet durch User
Marc V. schrieb: > Wie kommst du auf 1023 ? > 1024 ist der maximale Wert, aber für den Vorteiler. Wenn ich das richtig verstanden habe ,kommt die 1023 wegen dem "pwm 10" zustande. Dies Bedeutet ,dass er den Tastgrad in 10bit anzeigt. (0-1023) Marc V. schrieb: > Was und wie da bei Bascom eingestellt wird, weiss ich nicht, da wirst > du schon selber nachschauen müssen. Ich weiß es auch nicht. Was genau ist gemeint?
Marc V. schrieb: > Wie kommst du auf 1023 ? > 1024 ist der maximale Wert, aber für den Vorteiler. 10 bit PWM zählt 1024 Werte, von 0 bis 1023 ;) Marc V. schrieb: > Max. Wert für OC1A ist immer noch 65535. > Und deine 500 sind weniger als 1% davon. Nö, OC1A ist maximal 1. Du meinst wahrscheinlich OCR1A. Hier kommt es dann auf den PWM-Modus an. Bei ner 10 bit PWM macht 65535 keinen Sinn.
M. K. schrieb: >> 1024 ist der maximale Wert, aber für den Vorteiler. > > 10 bit PWM zählt 1024 Werte, von 0 bis 1023 ;) Wenn du schon Korinthen kacken willst, dann lese den Beitrag wenigstens richtig. Vorteiler mit Werten 255 oder 1023 gibt es bei AVR nicht. M. K. schrieb: > Nö, OC1A ist maximal 1. Du meinst wahrscheinlich OCR1A. Hier kommt es Ach, nein. Ich dachte wirklich OC1A kann von 0 bis 65535 Zustände annehmen. Vielen, vielen Dank !!!
ElektronikEckart schrieb: > Das Problem sollte mit dem von Marc Vesely angesprochenen Bitwait-Befehl > zu lösen sein, oder? nein, man braucht eine Flankenerkennung. Ich mache das einfach mit zwei Abfragen: wert : word; a : bit; input : bit; if (input) and (not(a)) then a := true; increment(wert); endif; if (a) and (not(input)) then a := false; endif; Hierbei wird bei steigender Flanke von 'input' ein Hilfsmerker gesetzt und die gewünschte Operation ausgeführt (hier das incrementieren). Wenn der Eingang beim nächsten Durchlauf immer noch ansteht, passiert durch den gesetzten Hilfsmerker nichts. Wenn der Hilfsmerker gesetzt ist und der Eingang nicht mehr ansteht (zweite Abfrage) dann wird der Hilfsmerker einfach gelöscht. Das Ganze muss natürlich auf die vorhandenen Pegel (Low-aktiv oder High-aktiv) angepasst werden. Und es ist eine vernünftige Tastenentprellung zwingend notwendig, sonst bekommt man bei jedem Tastendruck mehrere Ereignisse. Frank
Frank B. schrieb: > wert : word; > a : bit; > input : bit; Dies soll wahrscheinlich als "config" reingeschrieben werden, oder? Das wesentliche Problem war ja, dass sich bei meiner Lösung garnichts getan hat. Ohne Flankenerkennung oder Entprellung würde ich nach meinem Verständnis trotzdem bei Tastendruck auf andere Werte des PWM kommen. Frank B. schrieb: > increment(wert); wäre es möglich statt "increment" : wert = wert + (beliebige Zahl) zu verwenden?
Marc V. schrieb: > Wenn du schon Korinthen kacken willst, dann lese den Beitrag wenigstens > richtig. Vorteiler mit Werten 255 oder 1023 gibt es bei AVR nicht. "Werte zählen" ist was anderes als "Vorteiler" und hier ist eindeutig davon geschrieben worden wie weit die PWM zählt und eine 8 bit PWM zählt nun mal bis 255 und eine 10 bit PWM zählt bis 1023. Das mit dem Lesen darfst auch du gerne beherzigen.
M. K. schrieb: > "Werte zählen" ist was anderes als "Vorteiler" und hier ist eindeutig > davon geschrieben worden wie weit die PWM zählt und eine 8 bit PWM zählt > nun mal bis 255 und eine 10 bit PWM zählt bis 1023. Das mit dem Lesen > darfst auch du gerne beherzigen. Ja, stimmt, war schon etwas voreilig.
ElektronikEckart schrieb: > Dies soll wahrscheinlich als "config" reingeschrieben werden, oder? > > Das wesentliche Problem war ja, dass sich bei meiner Lösung garnichts > getan hat. Ohne Flankenerkennung oder Entprellung würde ich nach meinem > Verständnis trotzdem bei Tastendruck auf andere Werte des PWM kommen. > > Frank B. schrieb: >> increment(wert); > > wäre es möglich statt "increment" : wert = wert + (beliebige Zahl) zu > verwenden? Ich habe das einfach mal als Pseudocode geschrieben. Das muss natürlich noch entsprechend an Bascom angepasst werden. Incrementieren heißt einfach eine Variable erhöhen. Um wie viel, hängt vom Anwendungsfall ab. Wie das genau in die Config gehört, kann ich mangels genauere Kenntnis von Bascom nicht sagen. Aber das eigentliche Problem war ja anscheinend auch, anstatt die PWM den Vorteiler zu ändern, wenn ich das richtig gelesen habe. Frank
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.