Einen einzelnen Pin abfragen

Gast #917971
Lesenswert?

Hallo,

ich versuche mich gerade daran mit C und einem Atmega32 einen Taster 
abzufragen.

ich habe einen Ausgangs PORT, PORTA und einen EIngangs PIN nämlich PIN7 
von PORTB.

Also ich lege an PORTA 0x02 an (also der zweite PIN ist eins) und der is 
über den Taster mit PINB7 verbunden. Wie kann ich jetzt fragen ob PINB7 
1 ist?
Hab irgendwie allesmögliche versucht aber nix klappt...
1
#include <avr/io.h>
2
int main (void) {  
3
    DDRA  = 0xff;
4
    DDRB  = 0x7f;
5
    DDRC  = 0xff;
6
  int bla = 0;
7
    while(bla != 1) { 
8
    PORTB = 0xff;
9
    PORTC = 0x00;
10
    PORTA = 0x02;
11
    if(PINB & (1<<PINB7)){
12
      bla = 1;
13
    }
14
    }  
15
  while(1){
16
    PORTC = 0xff;
17
  }
18
    return 0;
19
}

Das funktioniert aber nicht :(
Gast #917974
Lesenswert?

>Also ich lege an PORTA 0x02 an (also der zweite PIN ist eins) und der is
>über den Taster mit PINB7 verbunden. Wie kann ich jetzt fragen ob PINB7
>1 ist?
1
void main ( void )
2
{
3
  DDRA  |= (1<<PA2);
4
  PORTA |= (1<<PA2);
5
  while (1)
6
  {
7
    if ( PINB & (1<<PB7) )
8
    {
9
      // pin ist high
10
    }
11
    else
12
    {
13
      // pin ist low
14
    }
15
  }
16
}
Gast #917985
Lesenswert?

void main ( void )
{
  DDRC = 0xff;
  DDRA  |= (1<<PA2);
  PORTA |= (1<<PA2);
  while (1)
  {
    if ( PINB & (1<<PB7) )
    {
    PORTC = 0xff;
    }
    else
    {
    PORTC = 0x00;
    }
  }
}

Damit gehts nicht :(
ALso an PORTC liegt auch ohne gedrückten Taster schon 1 an... :/
Gast #917993
Lesenswert?

1.) was heisst eigentlich |=
2.) was ist ein Pulldown wiederstand?
3.) ich mach doch nix weiter als sozusagen die beiden PINS 
kurzzuschliessen mit nem Taster an dem halt 1 anliegt.

Das heisst solange man den Taster nicht drückt dürfte am Eingang 0 
anliegen, und nur wenn ich den Taster drücke liegt am Eingang 1 an was 
is nutze um eine Funktion aufzurufen. Oder stimmt da jetzt was nicht? oO
Gast #918003
Lesenswert?

>Das heisst solange man den Taster nicht drückt dürfte am Eingang 0
>anliegen

Du denkst zu "Elektrikermäßig".
Ein offener Eingang (wenn Taster nicht betätigt) heißt in der Elektronik 
nicht (unbedingt) das dort auch NULL Volt anliegen. Sondern irgendwas!

Deshalb müssen offene Eingänge (sogenannte flowting inputs) IMMER 
vermieden werden. Also brauchst du einen Widerstand, der den Eingang 
definiert auf MASSE zieht. Das nennt man Pull-Down-Widerstand. Betätigst 
du jetzt den Taster, fließt Strom durch den Widerstand, Spannung fällt 
ab und der Pin "sieht" diese Spannung. Lässt du den Taster los, fließt 
kein Strom mehr.
Kein Strom DURCH den Widerstand bedeutet keine Spannung ÜBER dem 
Widerstand. Also "sieht" der Pin NULL Volt.

>was heisst eigentlich |=
1
x |=  4;
2
// ist identisch mit
3
x = x | 4;
4

5
x += 4;
6
// ist identisch mit
7
x = x + 4;
8

9
...
Gast #918012
Lesenswert?

Ok ich bin mit C noch nich soo bewandert, was heisst x = x | 4?

und ausserdem: das problem ist das wir jetzt keine Widerstände hier 
rumfliegen haben :P

kann man das theoretisch auch mit den Internen Pullup widerständen 
machen? ich mein wir können ja an den Ausgangspin auch 0 legen (ihn also 
sozusagen auf Masse ziehen) oder is da wieder n denkfehler drin -.-
Gast #918019
Lesenswert?

>was heisst x = x | 4?

|   bitweises ODER
&   bitweises UND
||  logisches ODER
&&  logisches UND
..

siehe C-Handbuch/Tutorial

>kann man das theoretisch auch mit den Internen Pullup widerständen
>machen? ich mein wir können ja an den Ausgangspin auch 0 legen (ihn also
>sozusagen auf Masse ziehen) oder is da wieder n denkfehler drin -.-

Das geht und wird auch üblicherweise gemacht.
=>
>EIngangs PIN nämlich PIN7
Ausgangsport auf NULL setzen, oder Taster zwischen PB7 und Masse 
anklemmen und Pullup einschalten:
1
void main ( void )
2
{
3
  DDRA  |= (1<<PA2);     // auf Ausgang schalten
4
  PORTB |= (1<<PB7);     // PullUp einschalten
5
  while (1)
6
  {
7
    if ( PINB & (1<<PB7) )
8
    {
9
      // pin ist high (Taster NICHT betätigt)
10
    }
11
    else
12
    {
13
      // pin ist low (Taster betätigt)
14
    }
15
  }
16
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren