Forum: Mikrocontroller und Digitale Elektronik Anfangsprobleme mit Soft PWM und Tasterabfrage


von Kielkarl (Gast)


Angehängte Dateien:

Lesenswert?

Moin Moin,

Versuche jetzt schon seit ein paar Stunden und etlichen gelesenen 
Beiträgen + Tutorial und auch diversen Beispielprogrammen eine LED durch 
PWM anzusteuern und mit einem Tstendruck das Register ocr_1 in meinem 
Bastelprogramm zu decrementieren.

ich habe main2 dazugebastelt.

ich verstehe nicht wie ich eine schleife so eingebaut bekomme das:
erst der taster abgefragt wird
dann led angesteuert mit dem jeweiligen Wert aus ocr_1
danach wieder zur Abfrage vom Taster.

Wenn ich das Programm ohne meine Modifikation laufen lasse ist die Led 
relativ dunkel (Was ich schon mal ein Super Ergebnis finde).

Bitte um Hilfe und (die Suchfunktion hat mir nicht wirklich geholfen 
weil mein Problem wohl ein Dummi Problem ist :)  )

von Otto (Gast)


Lesenswert?

Hallo,

indem Du die Taste nicht nur einmal abfragst - Dein "main2" wird nur 
genau einmal ausgeführt - danach befindet sich das Programm in der 
Endlos-Schleife und bearneitet nur noch die Interrupt-Routinen.

Ebenfalls ist das "brne main2" sinnfrei- was möchtest Du damit erreichen 
?

Mit Tastendruck soll doch sicher die PWM-verändert werden ?

Otto

von Ronny W. (kielkarl)


Lesenswert?

Stimmt ich laufe immer in der Endlosschleife.

Mein Problem ist ja das ich nicht weiß wo ich hinspringen soll.

Damit der Timer vernünftig läuft. Oder damit dieser nicht gestört wird.

brne damit wollte ich das Zero abfragen damit ich den Taster auswerten 
kann.

Ja PWM soll durch den Tastendruck geregelt werden, erst einmal nur in 
einer Richtung.

ocr_1 decrementieren.

von Otto (Gast)


Lesenswert?

1
loop: in    temp, PD0        ;Pin D0 einlesen
2
      andi  temp, 0b00000001 ;Ergebniss mit 01 Und Verknüpfen
3
      breq  ndec             ;wenn taster nicht gedrückt
4
    
5
      dec    ocr_1           :ocr decremementieren
6
7
ndec: rjmp loop

Du hast aber bedacht, dass das Dekrementieren so schnell geht, dass Du 
dies nicht mittels Tastendruck gezielt beeinflussen kannst ?

von Ronny W. (kielkarl)


Lesenswert?

Hab ziehmlich viel nicht bedacht. :)

ich werd das kurz mal testen

von Ronny W. (kielkarl)


Angehängte Dateien:

Lesenswert?

Fertig

So Ergebnis ist das das nicht läuft.

Währe nett wenn du dir das Ende der Main nochmal anschaust.

Da ist ja dann immer noch die Dauerschleife

von Otto (Gast)


Lesenswert?

ja nee - das ist dann ja wieder fast genau das, was Du hattest !

Die "loop2" entfällt erstzlos - dafür kommt der von mir gepostete Tel 
anstelle "loop" in Deinem ersten Programm.


und dies kommt nach oben an das Ende von Main !
1
        ldi     temp, 1<<CS00         ; CS00 setzen: Teiler 1
2
        out     TCCR0, temp
3
 
4
        ldi     temp, 1<<TOIE0        ; TOIE0: Interrupt bei Timer Overflow
5
        out     TIMSK, temp
6
 
7
        sei

von Ronny W. (kielkarl)


Lesenswert?

Hab das jetzt so zusammengebaut:

ldi     temp, 1<<CS00         ; CS00 setzen: Teiler 1
        out     TCCR0, temp

        ldi     temp, 1<<TOIE0        ; TOIE0: Interrupt bei Timer 
Overflow
        out     TIMSK, temp

        sei


loop:   in    temp, PD0        ;Pin D0 einlesen
       andi  temp, 0b00000001 ;Ergebniss mit 01 Und Verknüpfen
        breq  ndec             ;wenn taster nicht gedrückt

        dec    ocr_1           ;ocr decremementieren

ndec:   rjmp loop


Die Led blinkt mit etwa 2Hz.

Läst sich aber nicht regeln. Aber das meintest du ja schon das das so 
super schnell geht oder?
Na dem Reset ist das 2Hz blinken aber sofort schon da mit und ohne 
gedrücktem Taster.

von Otto (Gast)


Lesenswert?

Die Abfrage von Eingängen erfolgt mit PIN:

in r16, PIND      ; an Port D anliegende Werte (Taster) nach r16 
einlesen

Jetzt ist noch die Frage, wie Dein Taster angeschlossen ist:

- schaltet er gegen GND (Pullup verwendet ?) ODER
- schaltet er gegen UB  (Pulldown verwendet ?)

Damit pro Tatsendruck nur ein Decrementieren stattfindet, kannst Du z. 
B. ein weiteres Register abfragen.

Wenn die Taste nicht betätigt ist löscht Du dieses.

Vor dem Decrement kommt eine Abfrage, ob das Register 0 is - wenn nicht, 
entweder überspringen oder "skippen".

Nach dem ersten Decrement setzt Du dieses.

von Ronny W. (kielkarl)


Lesenswert?

Pulldown vom Pollin Addon Board wenn taster gedrückt ist der eingang 5V.

An dieser Sache mit der Tasterabfrage arbeite ich auch schon lange und 
hatte noch nicht einmal erfolg damit.

Ich weiß nicht ob man über PD0 einliest oder PinD?

Ich dachte das währe alles das selbe hauptsache der Eingang wird 
vernünftig ausmaskiert.

Hast du lust mir da auch noch zu helfen??



Grade zu dem entprellen Thema hatte ich die letzten tage echt viel 
gelesen.

Hatte mein projekt vorher in C versucht und hab das alles einigermaßen 
gut hinbekommen außer halt diese einfachen sachen wie taster.

Hab früher 8085 programiert da fand ich das irgendwie alles leichter.

Ich vermisse jetzt schon JZ und JNZ :(

von Otto (Gast)


Lesenswert?

Tu Dir selber den Gefallen und lies das Tutorium (siehe oben links).

Dort findest Du auch, wie man Eingänge bzw. Taster abfragt:

in r16, PIND      ; an Port D anliegende Werte (Taster) nach r16
einlesen

Am Besten ist, etwas auszuprobieren und wenn man damit keinen Erfolg 
hat, im Tutorium nachzulesen oder im Forum nachzufragen.

Bau die Tastenabfrage mal so ein - schalte damit direkt Deine LED ein.

Anschliessend teste damit Deine Version.....

Dann wende Dich wieder dem Decrementieren per Tasterdruck zu und sperre 
dieses mittels eines weiteren Register.

von Ronny W. (kielkarl)


Angehängte Dateien:

Lesenswert?

So schon mal einen Schritt weiter :)

Wenn man jetzt das Programm startet wird die LED langsam immer heller
reagiert aber noch nicht auf den Tasten Druck.

Das läuft jetzt schön im Kreis :)

von Otto (Gast)


Lesenswert?

Oben schreibst Du, dass ein betätigter Taster eine 1 liefert.

Im Programm findet sich aber:

and  temp1, key_now         ; War das ein 1->0 Übergang, wurde der 
Taster
                            ; also betätigt

Wenn Du nur einen Taster auswerten möchtest, sind diese Abfragen etwas 
übertrieben und sicher auch verwirrend.

von Ronny W. (kielkarl)


Lesenswert?

Hab grade auch mal interne Pullups aktiviert und das auch ins programm 
gepackt und mit GND denn Eingang gefüttert aber auch das bringt nichts.

Wenn das Programm läuft werd ich das auch veröffentlichen.

Dachte das währe einfach nach dem ich schon ein bischen assembler 
geprogert hatte.

Bin wohl ein bischen raus.

von Otto (Gast)


Lesenswert?

Erstmal musst Du eine Reaktion auf Deine Taste haben, bevor Du Dich ans 
Entprellen mit einer Routine begibst, welche nicht zu Deinem Programm 
passt.

Schreibe ein einfaches Programm:

LOOP:

in temp, PIND
out portb,temp

rjmp LOOP

reagiert das auf Deine Tasten ?

von Ronny W. (kielkarl)


Lesenswert?

Habe grade nochmal die Tastenabfrage als Einzelnes Programm laufen 
gelassen da läuft der Taster heute zum ersten mal :)

Das kann nur noch ein kleiner Haken sein :)

von Otto (Gast)


Lesenswert?

Da geht, weil Du jetzt "PIND" verwendest.

von Ronny W. (kielkarl)


Lesenswert?

wenn ich bei deinem kleinen programm denn ersten taster auf meinem 
pollin board drücke leuten zwei led :(

von Otto (Gast)


Lesenswert?

und was passiert, wenn Du keinen Taster betätigst ?

Evtl. hat Dein Board ja einen kleinen Hardware-Bug.....

von Ronny W. (kielkarl)


Lesenswert?

Ich kann den fehler grade nicht mehr nachstellen jetzt läuft auf 
jedenfall das miniatur prog habe mal alle leitungen abgezogen und neu 
verdrahtet

jetzt kurz abendbrot und danach gehts weiter nochmal die anderen beiden 
programme testen.

Vieleicht hatten sich zwei von den frickellitzen berührt

Sitze jetzt seit 8,5 stunden davor :)

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.