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.
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 ?
Hab ziehmlich viel nicht bedacht. :) ich werd das kurz mal testen
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
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 |
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 :)
wenn ich bei deinem kleinen programm denn ersten taster auf meinem pollin board drücke leuten zwei led :(
und was passiert, wenn Du keinen Taster betätigst ? Evtl. hat Dein Board ja einen kleinen Hardware-Bug.....
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.