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ß
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:
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...
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:
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