Forum: Mikrocontroller und Digitale Elektronik Einen einzelnen Pin abfragen


von Jan (Gast)


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 :(

von Matthias L. (Gast)


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
}

von Johannes M. (johnny-m)


Lesenswert?


von Jan (Gast)


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... :/

von Johannes M. (johnny-m)


Lesenswert?

Johannes M. wrote:
> AVR-GCC-Tutorial

von Nils (Gast)


Lesenswert?

Du ziehst ja den PORTC auf 1 und mit dem Taster auf 0, "umgekehrt" ;)

von Matthias L. (Gast)


Lesenswert?

>der is über den Taster mit PINB7 verbunden

Dann schließe mal einen Pulldown-Widerstand (mind. 1k) an den Taster an.

von Jan (Gast)


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

von Matthias L. (Gast)


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
...

von Jan (Gast)


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 -.-

von Matthias L. (Gast)


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
}

von Jan (Gast)


Lesenswert?

vielen dank, taster abfrage klappt jetzt :)
grüße jan

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.