Forum: Mikrocontroller und Digitale Elektronik Input If abfrage


von stevomaniac (Gast)


Lesenswert?

Hallo,
Ich habe eine einfache Iff Input, dann Output (LED) programiert.
Allerdings macht der Mikrocontroller genau das umgekehrte von dem was 
ich will. Ich möchte, wenn Input low, dann schalte Led ein wenn input 
high dann Led aus; er machts jedoch genau umgekehrt. Button habe ich 
keinen ich halte einfach Masse und Input zusammen oder nicht. controler 
ist ein Atmega8a. Hier das Programm::
1
int main(void)
2
{
3
  DDRB =0b00000000;      //Input Pint
4
  DDRD = 0b00000010;    //Output Pin
5
  PORTB = 0b00000100;   //Input Pint
6
  
7
  while(1){
8
    
9
  if (bit_is_clear (PINB , 2)) {
10
        PORTD = 0b00000010;}    // Das müsste doch eig true seien wenn low   
11
                                   ist oder?
12
  
13
    else { PORTD = 0b00000000;   }
14
  }
15
16
}

: Bearbeitet durch User
von ich (Gast)


Lesenswert?

Hi,
um leichter zu antworten wäre es nett, wenn du deinen Code in einen 
Code-block hängst.
Dann natürlich welche Sprache du Programmierst.
Und Schaltplan + Aufbau anhängen. Sonst glüht jetzt schon wider meine 
Glaskugel, die Kristalene ist gerade noch in der Wartung (das war das 
Modell das noch alle 100h zur Inspektion muss)

Ich glaub die LED geht von VCC zum µC über den Vorwiderstand statt wie 
im Code angedeutet µC LED R ->GND.
MfG
ich

von Karl H. (kbuchegg)


Lesenswert?

stevomaniac schrieb:

> ich will. Ich möchte, wenn Input low, dann schalte Led ein

Die Frage ist: Was musst du am Ausgabepin ausgeben, damit die LED 
leuchtet?

In den meisten Fällen verschaltet man (historisch bedingt) die LED so, 
dass sie leuchtet, wenn man die Ausgabeleitung auf 0 schaltet. D.h. die 
LED brennt NICHT, wenn der Pin auf 1 geschaltet wird.

von stevomaniac (Gast)


Lesenswert?

Hallo, danke für die Antwort, ich habe leider kein Prog zum Schaltplan 
erstellen und weiß nicht was du mit Code block meinst (bin Neuling).

Ich programmiere in C mit Atmel Studio .
Ich habe InPut PinB2 an Masse, also Pin als+;
Beid er LED folgendes: Output Pint D1 (+) Widerstand, Led Masse.

Ich dachte man müssen die Pins an Masse hängen, also Pins = +?

Die Led leuchtet wenn PinB2 an Masse hängt (also high ist) und geht aus 
wenn Pin2 von Masse getrennt wird (low ist). Aber eigentlich will ich es 
umgekehrt. bit_is_clear (PINB , 2) gibt doch true zurück wenn keine 
Spannung am Pin alniegt oder?


danke
mfg

von Max H. (hartl192)


Lesenswert?

stevomaniac schrieb:
> Hallo, danke für die Antwort, ich habe leider kein Prog zum Schaltplan
> erstellen
Ich hatte schon Stift,Papier und einen Scanner bzw. Digitalkammera bevor 
ich überhaupt wusste was ein µC ist...
> und weiß nicht was du mit Code block meinst (bin Neuling).
1
[c]C-Code[/c]


Wenn du einfach die LED invertiert habe willst:
1
int main(void)
2
{
3
  DDRB =0b00000000;      //Input Pint
4
  DDRD = 0b00000010;    //Output Pin
5
  PORTB = 0b00000100;   //Input Pint
6
  
7
  while(1){
8
    
9
  if (bit_is_clear (PINB , 2)) {
10
        PORTD = 0b00000000;}    // Das müsste doch eig true seien wenn low ist oder?
11
  
12
    else { PORTD = 0b00000010;   }
13
  }
14
}

BTW: Ich würde nicht um ein einzelnes bit zu ändern den gesamten Port 
überschireiben. Einzelne bits würde ich so setzen
1
PORTB|=(1<<1)
und löschen
1
PORTB&=~(1<<1)

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

stevomaniac schrieb:
> Die Led leuchtet wenn PinB2 an Masse hängt (also high ist) und geht aus
> wenn Pin2 von Masse getrennt wird (low ist).

Genau umgekehrt.
Draht an Pin: Masse = 0V = GND = LOW

Kein Draht an Pin: HIGH
Dafür hast du den Pullup an PB2 gesetzt:
1
PORTB = 0b00000100;   //Input Pint

Damit wird Vcc intern über einen Widerstand an den Pin gelegt und du 
hast 2 eindeutige Zustände, die du nur noch richtig auswerten musst. 
Deine Auswertung bisher ist genau falsch rum.



mfg.

von Amateur (Gast)


Lesenswert?

Es ist prinzipiell egal, ob die Reihenfolge
(1) Vcc(+) - Widerstand - LED - Output
oder
(2) Output - Widerstand - LED - GND(0) ist.

Traditionell wird oft die erste Möglichkeit gewählt.

Der einzige Unterschied ist:
(1) LED leuchtet bei Ausgabe von 0 (low)
(2) LED leuchtet bei Ausgabe von 1 (high)

Zum "richtigen" Arbeiten müsstest Du ins Schaltbild schauen - Du also 
wissen was Du tust
oder die
Geht-so-besser-methode anwenden.

von stevomaniac (Gast)


Lesenswert?

Hallo, danke
hab ich richtig verstanden?:
mit Pin 1, bzw Pin 0 setze ich den Pin entweder auf + Phase oder - 
Masse?

dachte bisher 1 bedeuted es fließt strom, 0 es fließt keiner lol .

mfg

von Thomas E. (thomase)


Lesenswert?

stevomaniac schrieb:
> Hallo, danke
> hab ich richtig verstanden?:
> mit Pin 1, bzw Pin 0 setze ich den Pin entweder auf + Phase oder -
> Masse?
Das kommt drauf an, ob der Pin Ausgang oder Eingang ist.
Beim Ausgang trifft das zu.
Beim Eingang wird mit 1 der Pullup eingeschaltet. Mit 0 liegt gar nichts 
am Pin. Das ist aber ein undefinierter Zustand, bei dem meistens das 
passiert, was man nicht erwartet. In diesem Fall muss der Pin von aussen 
beschaltet sein. Z.B. durch ein IC, das mit seinem Ausgang auf den Pin 
geht.

> dachte bisher 1 bedeuted es fließt strom, 0 es fließt keiner lol .
Strom fliesst nur, wenn etwas angeschlossen ist. Z.B eine LED. Dabei 
kommt es aber darauf an, ob die andere Seite der LED an Vcc oder GND 
hängt.

mfg.

von Karl H. (kbuchegg)


Lesenswert?

stevomaniac schrieb:
> Hallo, danke
> hab ich richtig verstanden?:
> mit Pin 1, bzw Pin 0 setze ich den Pin entweder auf + Phase oder -
> Masse?
>
> dachte bisher 1 bedeuted es fließt strom, 0 es fließt keiner lol .

Ob Strom fliesst oder nicht, hängt ganz wesentlich davon ab, wie die 
Aussenbeschaltung ist.

Einen Pin auf 1 (oder 0 zu setzen) bedeutet erst mal nicht mehr oder 
weniger, als ihm ein Potential zuzuordnen und damit das 'eine Ende der 
Aussenbeschaltung' einem Potential zuzuordnen. Ob dann Strom fliesst 
hänge davon ab, wie das andere Ende der Aussenbeschaltung an die 
Spannungen angeschlossen ist. Strom fliesst immer nur von einem höheren 
Potential zu einem niedrigerem Potential.

Hast du deine Aussenbeschaltung so
1
  +5V -------------------------------- +5V
2
3
4
5
   Pin -----------+
6
                  |
7
                 ---
8
                 \ /     LED
9
                 ---
10
                  |
11
                 +-+
12
                 | |   Widerstand
13
                 +-+
14
                  |
15
     GND ---------+-------- GND
dann muss man den Pin auf 1 setzen (also auf +5V), damit ein Strom vom 
Pin durch die LED nach GND (also 0V) fliessen kann.

Hast du deine Aussenbeschaltung so
1
            +5V ----------+---------- +5V
2
                          |
3
                         +-+
4
                         | |  Widerstand
5
                         +-+
6
                          |
7
                         ---
8
                         \ /   LED
9
                         --- 
10
                          |
11
          Pin  -----------+
12
13
14
15
16
          GND ------------------------- GND

dann muss man den Pin auf 0 (also 0V) setzen, damit der Strom von +5V 
aus durch die LED in den Pin hinein fliessen kann.

Beide Beschaltungen sind möglich.

Und du solltest Anfangen zwischen Spannung und Strom zu unterscheiden. 
Spannung, das ist die Höhendifferenz der beiden Enden eines 
Gartenschlauches. Strom, das ist die Wassermenge, die dann durch diesen 
Schlauch (in die eine oder andere Richtung) rinnt. Ohne Höhendifferenz 
(Spannung) kommt es auch zu keinem Wassertransport (Stromfluss).
Wenn du einen (Output-) Pin auf 1 oder 0 setzt, denn hebst oder senkst 
du nur dieses Ende des Schlauches. Ob und in welche Richtung das Wasser 
dann tatsächlich rinnt, hängt davon ab, auf welcher Höhe das andere Ende 
des Schlauches ist.

: Bearbeitet durch User
von stevomaniac (Gast)


Lesenswert?

Super Beiträge hier,
Vielen Dank euch allen, besonders @Karl Heinz, du kannst echt gut 
erklären :)

mfg

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.