Guten Abend, ich spiele mich jetzt den zeiten tag mit meinem atmega, doch komme ich nun nicht weiter. http://pastebin.com/a5JxGkMH (Ich weiß, man könnte dies auch sehr verkürzt schreiben doch möchte ich mich mit den befehlen vertraut machen). Mit der Zeile ldi r18, 0b0.... lege ich fest welche LEDs ich durch tastendruck zum leuchten bringe und welche ohne drücken an sind. Mein Problem ist nun, dass sobald ich einer die ziffer 0 zuordne (in diesem fall PB0) leucht diese wie gewollt von anfang an, doch wenn ich nun PD0 drücke, schaltet sich diese nicht aus obwohl meines erachtens "AND" nicht mehr gegeben ist. Liebe Grüße Philipp
Hi Ohne die Hardware(Beschaltung LED/Taster) zu kennen, kann man auch nichts zum Programm sagen. Dein Programm kannst du auch als Anhang mitschicken. MfG Spess
Vor PD0-3 jeweils ein Taster mit 10 k Pullup Widerstand PB0-5 LEDs wobei die letzen beiden zu vernachlässigen sind
LEDs sind nach vcc verbunden, hardware ist komplett richtig angeschlossen, das problem liegt im in den befehlen
wenn ich "or" benutze, negiere ich sozusagen die jetztige schaltung, das problem bleibt dennoch bestehen, da ich so die anderen LEDs nicht einschalten kann
Meine frage konkretisiert: http://pastebin.com/QFUZJDk1 warum geht die LED PB0, wenn ich den taster PD0 drücke nicht aus?
ldi r18, 0b01111110 ; setzt r18 Edit (Musst kurz wech): Endlich darf ich auch mal jemanden bei Assembler helfen und bin nicht der welcher die Hilfe braucht. mit deinem "and" Befehl setzt du (aufgrund des Wertes in r18) Bit 7 und 0 auf 0, wodurch dein Ausgang PORTB0 dauerhaft auf Low ist. ... einfach mal das 0b01111110 durch ob01111111 ersetzen und testen. ggf würde ich noch mit ldi r16, 0xFF out PORTD, r16 die Pull Up Widerstände einschalten, um keine externen zu benötigen, wenn du auf Masse ziehst so wie ich das mitbekommen habe. Zudem kannst du durch versetzen der Marke Loop verhindern das er immer die Eingänge neu Konfiguriert:
1 | |
2 | .include "m8def.inc" |
3 | |
4 | |
5 | |
6 | ldi r16, 0x00 ; setzt r16 als Eingang |
7 | out DDRD, r16 |
8 | ; |
9 | ldi r17, 0xFF ; |
10 | out DDRB, r17 ; setzt r17 als Ausgang |
11 | |
12 | loop: |
13 | in r16, PIND ; eingabe der Taster |
14 | |
15 | |
16 | mov r17, r16 ; lädt r16 nach r17 |
17 | ldi r18, 0b01111110 ; setzt r18 |
18 | |
19 | and r17, r18 ; verknüfpft r17 und r18, speichert ergebnis nach r17 |
20 | out PORTB, r17 ; gibt r17 an die LEDs aus |
21 | |
22 | rjmp loop |
Grad noch ein zweites Mal gelesen. Wenn du mit r18 bestimmen willst welche LED`s bei Tasterdruck an und welche aus sein sollen musst du anstatt "and" "eor" nehmen. eor r16, r17 Die beiden Operanden werden miteinander XOR verknüpft, wobei jeweils die jeweils gleichwertigen Bits der Operanden laut Wahrheitstabelle unabhängig voneinander verknüpft werden. Sei der Inhalt des Registers r16 = 0b11001100 und der Inhalt des Registers r17 = 0b01011010, so lautet die Verknüpfung eor r16, r17 0b11001100 0b01011010 xor ----------- 0b10010110 Das Ergebnis wird im ersten Operanden (r16) abgelegt. Im Ergebnis werden diejenigen Bits umgedreht, an deren Bitposition in der Maske eine 1 vorhanden ist. Da in der Maske 0b01011010 an den Bitpositionen 1, 3, 4, 6 jeweils eine 1 steht, enthält das Ergebnis an eben diesen Bitpositionen die umgedrehten Bits aus der Ursprungszahl. Alle anderen Bits werden so wie sie sind aus der Ursprungszahl übernommen. Quelle: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Logik
so kann ich die eine zwar ausmachen, doch die anderen leuchten auch, doch die sollen aus sein, um sie mit tastern anschalten zu können ;-)
deine antwort passt jetzt mit der meiner, auch wenn viele mitgewirkt haben überein ;-). http://pastebin.com/f8zMpFNR (LEDbelegung ist eine andere)
Nun stellt sich mir noch eine weitere frage, wenn ich PD0 drücke, geht PB0 aus, warum gehen PB5 und Pb6 zeitlich mit aus und warum gehen sie obwohl ich den taster weiter gedrückt habe wieder an(schwächer), PB0 bleibt aus solange wie ich den Taster drücke.
Gewöhn dir eines an: Wenn du Fragen zu einem Programm hast, dann ist es das mindeste, dass du das Programm auch herzeigst. Wir sitzen auf der anderen Seite deines Bildschirms und sehen nur die scharze Rückwand deines Monitors :-)
Und warum kannst du deinen 7-Zeiler nicht einfach hier posten? DU brauchst Hilfe. Also mach DU es den Helfern so einfach wie möglich an deinen Code zu kommen. Nimm dein Assembler File und hänge es als Attachment im Posting an. Fertig. Dann brauchst du keinen externen Webspace und musst auch keinen Link per Copy Paste einfügen. So einfach kann die Welt sein. PS: das ...
1 | .include "m8def.inc" |
2 | |
3 | ldi r16, 0x00 ; setzt r16 als Eingang |
4 | out DDRD, r16 |
5 | ; |
6 | ldi r17, 0xFF ; |
7 | out DDRB, r17 ; setzt r17 als Ausgang |
8 | |
9 | loop: |
10 | ldi r17, 0b01011101 |
11 | in r16, PIND ; eingabe der Taster |
12 | eor r16, r17 |
13 | out PORTB, r16 ; gibt r17 an die LEDs aus |
... kann nicht der vollständige Code sein. Da ist keine einzige Schleife drinn zu finden. Und selbst wenn ich mir da jetzt zum SChluss noch einen rjmp dazudenke, wundert es mich nicht, dass da LEDs auf Halbmast gehen. Du schaltest sie in rasend schneller Folge ein und aus.
Werde ich das nächste mal tun ;-), stimmt, rjmp loop fehlt in dem link. Inwiefern muss ich das umändern, das es nicht so schnell schaltet? Nops dazwischen setzen?
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.