www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einen einzelnen Pin abfragen


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
#include <avr/io.h>
int main (void) {  
    DDRA  = 0xff;
    DDRB  = 0x7f;
    DDRC  = 0xff;
  int bla = 0;
    while(bla != 1) { 
    PORTB = 0xff;
    PORTC = 0x00;
    PORTA = 0x02;
    if(PINB & (1<<PINB7)){
      bla = 1;
    }
    }  
  while(1){
    PORTC = 0xff;
  }
    return 0;
} 

Das funktioniert aber nicht :(

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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?

void main ( void )
{
  DDRA  |= (1<<PA2);
  PORTA |= (1<<PA2);
  while (1)
  {
    if ( PINB & (1<<PB7) )
    {
      // pin ist high
    }
    else
    {
      // pin ist low
    }
  }
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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... :/

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> AVR-GCC-Tutorial

Autor: Nils (Gast)
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>der is über den Taster mit PINB7 verbunden

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

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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 |=
x |=  4;
// ist identisch mit
x = x | 4;

x += 4;
// ist identisch mit
x = x + 4;

...

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 -.-

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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:
void main ( void )
{
  DDRA  |= (1<<PA2);     // auf Ausgang schalten
  PORTB |= (1<<PB7);     // PullUp einschalten
  while (1)
  {
    if ( PINB & (1<<PB7) )
    {
      // pin ist high (Taster NICHT betätigt)
    }
    else
    {
      // pin ist low (Taster betätigt)
    }
  }
}

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank, taster abfrage klappt jetzt :)
grüße jan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.