Anfangsprobleme mit Soft PWM und Tasterabfrage

Gast #1704016
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 :)  )
Angehängte Dateien:
Gast #1704075
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
#1704089
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.
Gast #1704095
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 ?
Gast #1704131
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
#1704168
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.
Gast #1704172
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.
#1704178
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 :(
Gast #1704185
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.
Gast #1704213
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.
#1704214
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.
Gast #1704224
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 ?
#1704257
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren