Hallo Com, hier mein erster Beitrag. Baord: MyAvr mk2 Problem: Ich habe ein ganz einfaches Programm in den Flash geschrieben nur es tut nur bedingt was ich möchte bzw. was ich erwarte. Quellcode: .include "m8def.inc" ldi r16, 0xFF out DDRB, r16 ; Richtungsregister DDRB als Ausgang ldi r16, 0x00 out DDRD, r16 ; Richtungsregister DDRD als Eingang ldi r16,0xFF ;Alle LEDs aus out PORTB,r16 loop: in r16, PIND ; an Port D anliegende Werte(Taster) nach r16 com r16 ; Bits umdrehen -> LEDs an out PORTB, r16 ; Inhalt von r16 an Port B ausgeben rjmp loop ; Sprung zu "loop:" -> Endlosschleife Meine Erwartung: Wenn der Taster gedrückt wird "schickt" er eine 0 an den Pin wo er angeschlossen wurde. Taser sagen wir bei Pin2 angeschlossen. PORTD jetzt also: 00100000 jetzt wird "com" angewendet und in PORTB geschrieben. PORTB : 11011111 Lampe an PIN3 von PORTB müsste jetzt ausgehen. Sie geht aber an. Meine Vermutung: Ich bringe 0 und 1 durcheinander. Bin mir unsicher wenn ich Taster drücke was dann an dem Pin passiert, auch was passiert wenn wenn eine 1 an einer LED ist. Oder liegt es an Pull-Up-Widerständen? Gruß, AllForOne
Jan R. schrieb: > Quellcode: > > .include "m8def.inc" > > ldi r16, 0xFF > out DDRB, r16 ; Richtungsregister DDRB als Ausgang > > ldi r16, 0x00 > out DDRD, r16 ; Richtungsregister DDRD als Eingang ldi r16, 0xFF out PORTD, r16 ; Pull-Up-Widerstände einschalten
Hi Nun zuerst einmal solltest du wissen, ob die Taster gegen GND geschaltet sind. In der Regel wird das so gemacht, weil dann die internen Pull-p-Widerstände benutzt werdenkönnen. Zur Erklärung: Ein Taster hat einen Kontakt. Wird dieser geschlossen, so wird auch das Potential durchgeschaltet. Ist er aber offen, so gibt es kein Potential, also, keine 5V aber auch kein GND. Damit nun der Eingang weiß, es ist der Kontakt offen, wird über einen Widerstand das "andere" Potential auf den Eingang geleitet. Intern hat ein Controller nun Widerstände, die diese Aufgabe übernehmen können. Manche haben sogar die Möglichkeit, die Widerstände auch nach GND zu schalten. geleitet. Nun zu deinem Code
1 | Quellcode: |
2 | .include "m8def.inc" ; der Mega8 hat intern nur Pull-Up-Widerstände |
3 | |
4 | ldi r16, 0xFF |
5 | out DDRB, r16 |
6 | ; Richtungsregister DDRB als Ausgang (ok) |
7 | ldi r16, 0x00 |
8 | out DDRD, r16 |
9 | ; Richtungsregister DDRD als Eingang (ok) |
10 | ;---------------------------------------------------------------------- |
11 | ; nun sollten aber die Pull-Up-Widerstände eingeschaltet werden, |
12 | ; wenn keine externen verbaut sind und die Taster gegen GND schalten. |
13 | ;ldi r16, 0xFF |
14 | ; OUT PortD, r16 |
15 | ;---------------------------------------------------------------------- |
16 | |
17 | ldi r16,0xFF ;Alle LEDs aus |
18 | out PORTB,r16 |
19 | ;------------------------------------------------------------------- |
20 | ; stimmt nur, wenn die LED gegen VCC geschaltet sind, |
21 | ; also der Port ein "0"-Signal ausgibt. |
22 | ; das ist der Fall, wenn die Taster nach VCC geschalet sind und ein |
23 | ; externer Pull-Down Widerstand verbaut ist (Widerstand gegen GND) |
24 | ;------------------------------------------------------------------- |
25 | loop: |
26 | in r16, PIND ; an Port D anliegende Werte(Taster) nach r16 |
27 | com r16 ; Bits umdrehen -> LEDs an |
28 | out PORTB, r16 ; Inhalt von r16 an Port B ausgeben |
29 | rjmp loop ; Sprung zu "loop:" -> Endlosschleife |
Ich habe mal einwenig kommentiert. Vielleicht wird es so etwas verständlich. Gruß oldmax
Jan R. schrieb: Neben den Pullups > Ich bringe 0 und 1 durcheinander. Bin mir unsicher wenn ich Taster > drücke was dann an dem Pin passiert, auch was passiert wenn wenn eine 1 > an einer LED ist. Dann solltest du diese Unsicherheit erst mal beseitigen: Was bewirkt eine 1 an einem Portpin: Led an oder Led aus? Was es tatsächlich bewirkt hängt davon, ab wie die LED angeschlossen ist. Und wenn du das nicht aus dem Schaltplan ersehen kannst, dann probiers halt einfach aus:
1 | ldi r16, 0xFF |
2 | out DDRB, r16 |
3 | |
4 | loop: |
5 | ldi r16, 0b00000100 |
6 | out PORTB, r16 |
7 | rjmp loop |
leuchtet die LED am Pin 2 oder leuchtet sie nicht? Und schon weißt du es und hast zumindest in diesem Punkt deine Unsicherheit in Gewissheit verwandelt. (Auch den Gegentest machen! 0-Bit ausgeben, dann muss die LED das Gegenteil tun)
Herzlichen Dank für die hilfreichen Antworten. Ich habe es nun getestet und es funktioniert wie ich es wollte. Es kann weiter gehen. Viele Grüße, allforone
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.