Forum: Mikrocontroller und Digitale Elektronik Anfängerproblem mit PullUp Widerstand


von Phil (Gast)


Lesenswert?

Hallo,
ich habe ein kleines Problem mit einem Schalter, dieser ist über einen 
PullUp-Widerstand an die MCU geschaltet. Also für Bit = 0 gedrückt. Dann 
soll ein anderer Pin an dem sich eine Diode gegen Vcc befindet auf 
Ausgang "low" geschaltet werden. Irgendwie komm ich da nicht wirklich 
weiter ich weiß nicht warum die Led nicht aus geht wenn ich die Taste 
betätige, vielleicht kann mir ja jemand weiterhelfen. PORTC soll Ausgang 
und PORTD Eingang sein.
Danke.
Hier der Code:
         ldi r16, 0xFF
         out DDRC, r16
     out PORTD,r16

         ldi r16, 0x00
         out DDRD, r16
     sbi PINC,2

main:   sbic PIND,2
     rjmp main
     cbi PINC,2
     rjmp main

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Zur Hardware/Schaltung mag ich nichts sagen, weil mir der Schaltplan 
oder eine Skizze fehlt. Zur Software:
1
     ; Port C als Ausgang einrichten
2
     ldi r16, 0xFF
3
     out DDRC, r16 ; 0xff => alle Pins an Port C auf Ausgang
4
5
     ; Port D als Eingang einrichten
6
     out PORTD,r16 ; Port D ist noch vom Reset her Eingang, 
7
     ; diese Zeile schaltet also die internen Pullups ein
8
     ; möglicherweise Schreibfehler sinnvoller z.B.
9
     out PORTC,r16 ; alle Pins an Port C HIGH
10
11
     ldi r16, 0x00 
12
     out DDRD, r16 ; 0x00 Port D auf Eingang 
13
14
     sbi PINC,2    ; ??? Sinnvoll könnte sein sbi PORTC,2
15
     ; um Ausgang PC2 HIGH zu setzen
16
17
main:   
18
     sbic PIND,2   ; PD2 abfragen, wenn LOW, dann nächsten
19
     ; Befehl überspringen
20
     rjmp main
21
     cbi PINC,2    ; ??? Sinnvoll könnte sein cbi PORTC,2
22
     ; um Ausgang PC2 LOW zu setzen
23
     rjmp main
24
25
; Alternative:
26
main:   
27
     sbis PIND,2   ; PD2 abfragen, wenn HIGH, dann 
28
     cbi PORTC,2   ; diese Zeile überspringen
29
     rjmp main

von Dennis U. (atmegadennis)


Lesenswert?

Hallo Phil,

sortiere doch ersteinmal deinen Code, dann wird das ganze vllt auch 
etwas leichter zu lesen

Versuch es einmal mit diesem Code und du wirst mehr erfolg haben:

         ldi r16, 0xFF
         out DDRC, r16

         ldi r16, 0x00
         out DDRD, r16

main:
     sbic PIND,2
     rjmp main
an:
     ldi r16, 0xff
     out PORTC,r16
     sbis PIND,2
     rjmp an
aus:
     sbic PIND,2
     rjmp aus
     ldi r16, 0x00
     out PORTC,r16
loop:
     sbis PIND,2
     rjmp loop
     rjmp main


mit dieser Version solltest du mehr Erfolg haben

Gruß

Dennis

von Phil (Gast)


Lesenswert?

Vielen Dank für die schnellen Antworten. Hat so weit geklappt, glaube 
auch dass ich das mit der Zuweisung der Ports jetzt begriffen habe, wird 
sich noch zeigen ;-).
Kann mich nur nochmal bedanken ;-)

Gruß Phil

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Nimm lieber den Code von Dennis. Bei meinem Code (und deinem) wird der 
Portzustand ja nie zurückgesetzt, auch wenn die Taste losgelassen wird!

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.