mikrocontroller.net

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


Autor: Kielkarl (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 :)  )

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ronny Wand (kielkarl)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

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

Autor: Ronny Wand (kielkarl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ziehmlich viel nicht bedacht. :)

ich werd das kurz mal testen

Autor: Ronny Wand (kielkarl)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !
        ldi     temp, 1<<CS00         ; CS00 setzen: Teiler 1
        out     TCCR0, temp
 
        ldi     temp, 1<<TOIE0        ; TOIE0: Interrupt bei Timer Overflow
        out     TIMSK, temp
 
        sei
 

Autor: Ronny Wand (kielkarl)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ronny Wand (kielkarl)
Datum:

Bewertung
0 lesenswert
nicht 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 :(

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ronny Wand (kielkarl)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ronny Wand (kielkarl)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Ronny Wand (kielkarl)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da geht, weil Du jetzt "PIND" verwendest.

Autor: Ronny Wand (kielkarl)
Datum:

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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und was passiert, wenn Du keinen Taster betätigst ?

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

Autor: Ronny Wand (kielkarl)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.