Forum: Mikrocontroller und Digitale Elektronik PWM mit Tastern Regeln


von ElektronikEckart (Gast)


Lesenswert?

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ß

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Frank B. (frank501)


Lesenswert?

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
von ElektronikEckart (Gast)


Lesenswert?

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?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von ElektronikEckart (Gast)


Lesenswert?

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?

von M. K. (sylaina)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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 !!!

von Frank B. (frank501)


Lesenswert?

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

von ElektronikEckart (Gast)


Lesenswert?

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?

von M. K. (sylaina)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Frank B. (frank501)


Lesenswert?

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
Noch kein Account? Hier anmelden.