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 :) )
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
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.
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
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.
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.
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 :(
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.
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 :)
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.
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.
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 ?
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 :)
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 :)