Forum: Mikrocontroller und Digitale Elektronik Taster-LED an statt aus


von Peter M. (allforone)


Lesenswert?

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

von Grübler (Gast)


Lesenswert?

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

von oldmax (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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)

von Peter M. (allforone)


Lesenswert?

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