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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.