Forum: Mikrocontroller und Digitale Elektronik LED-Steuerung


von Philipp S. (phibedy)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Philipp S. (phibedy)


Lesenswert?

Vor PD0-3 jeweils ein Taster mit 10 k Pullup Widerstand
PB0-5 LEDs wobei die letzen beiden zu vernachlässigen sind

von spess53 (Gast)


Lesenswert?

Hi

Leds vom Portpin nach Masse oder VCC?

MfG Spess

von Philipp S. (phibedy)


Lesenswert?

LEDs sind nach vcc verbunden, hardware ist komplett richtig 
angeschlossen, das problem liegt im in den befehlen

von spess53 (Gast)


Lesenswert?

Hi

Noch was: Nimm mal ein or statt einem and.

MfG Spess

von Philipp S. (phibedy)


Lesenswert?

wenn ich "or" benutze, negiere ich sozusagen die jetztige schaltung, das 
problem bleibt dennoch bestehen, da ich so die anderen LEDs nicht 
einschalten kann

von Philipp S. (phibedy)


Lesenswert?

Meine frage konkretisiert:
http://pastebin.com/QFUZJDk1 warum geht die LED PB0, wenn ich den taster 
PD0 drücke nicht aus?

von Michael D. (etzen_michi)


Lesenswert?

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

von Michael D. (etzen_michi)


Lesenswert?

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

von Philipp S. (phibedy)


Lesenswert?

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 ;-)

von Philipp S. (phibedy)


Lesenswert?

deine antwort passt jetzt mit der meiner, auch wenn viele mitgewirkt 
haben überein ;-).

http://pastebin.com/f8zMpFNR (LEDbelegung ist eine andere)

von Philipp S. (phibedy)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Philipp S. (phibedy)


Lesenswert?

steht auch im beitrag darüber ;-) http://pastebin.com/f8zMpFNR

von Karl H. (kbuchegg)


Lesenswert?

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.

von Phibedy (Gast)


Lesenswert?

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?

von Philipp S. (phibedy)


Lesenswert?

niemand eine passende lösung? ;-)

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
Noch kein Account? Hier anmelden.