Forum: Mikrocontroller und Digitale Elektronik AVR-Input Problem


von Peter K. (peterka2000)


Lesenswert?

Also ich habe ein Problem mit den Inpu eines AVRs. Erstemal der 
Quelltext:
1
/*
2
 * main.c
3
 *
4
 *  Created on: 24.07.2012
5
 *      Author: Peter
6
 */
7
8
#include <avr/io.h>
9
#include <avr/iom1281.h>
10
11
int main (void){
12
13
  DDRB |= (1 << DDB0);
14
  DDRB &= ~(1 << DDB2);
15
16
  while (1){
17
18
    if (PINB & (1<<PINB2)){
19
      PORTB |= (1 << PB0);
20
    }
21
22
  }
23
24
}
Wenn ich jetzt an PinB2 ein Kabel anschließe, geht die LED an PortB0 
schon an. an diesen Kabel ist nichts. Ich habe uahc schon probiert, 
alles statisch zu entladen - hat auch nichts gebracht.

Ich hoffe ihr könnt mir helfen

von Karl H. (kbuchegg)


Lesenswert?

Peter K. schrieb:

> Wenn ich jetzt an PinB2 ein Kabel anschließe, geht die LED an PortB0
> schon an. an diesen Kabel ist nichts.

Und genau das ist das Problem.
Dein Kabel wirkt wie eine Antenne und fängt sich jedes kleinste 
elektrische Feld in der Umgebung ein.

Man lässt einen Eingang NIEMALS einfach offen in der Luft hängen.
Genau aus dem Grund gibt es Pullup-Widerstände. Damit ein Anschluss auch 
dann ein gesichertes Potential hat, wenn sonst weiter nichts am Eingang 
angeschlossen ist.
1
int main (void){
2
3
  DDRB |= (1 << DDB0);
4
  DDRB &= ~(1 << DDB2);
5
6
  PORTB |= ( 1 << PB2 );    // Pullup Widerstand einschalten
7
                            // jetzt liegt der Eingang gesichert auf 1
8
9
  while (1){
10
11
    if (!( PINB & (1<<PINB2) )){    // daher muss hier die Bedingung
12
                                    // umgedreht werden.
13
                                    // Mit dem Kabel eine Masserverbindung
14
                                    // herstellen führt jetzt zum SChalten
15
      PORTB |= (1 << PB0);
16
    }
17
18
  }
19
20
}

von Peter K. (peterka2000)


Lesenswert?

Das heißt den Quelltext so erweitern??
1
/*
2
 * main.c
3
 *
4
 *  Created on: 24.07.2012
5
 *      Author: Peter
6
 */
7
8
#include <avr/io.h>
9
#include <avr/iom1281.h>
10
11
int main (void){
12
13
  DDRB |= (1 << DDB0);
14
  DDRB &= ~(1 << DDB2);
15
PORTB |= (1 << PB2); //Kann gerade keinen Tab machen
16
17
18
  while (1){
19
20
    if (PINB & (1<<PINB2)){
21
      PORTB |= (1 << PB0);
22
    }
23
24
  }
25
26
}

von Peter II (Gast)


Lesenswert?

diese incldue solltest du nicht selber reinschreiben
1
#include <avr/iom1281.h>

> //Kann gerade keinen Tab machen
ist auch gut so, denn Leerzeichen sind besser.

von Karl H. (kbuchegg)


Lesenswert?

Peter K. schrieb:
> Das heißt den Quelltext so erweitern??

Die Bedingung muss umgedreht werden.
Dein Eingang liefert jetzt defaultmässig eine 1.
Dein Kabel muss nach Masse durchschalten, dann liefert der Eingang dann 
auch eine 0.

(Und jetzt verstehst du auch, warum im Tutorium die Schalter so 
verschaltet sind, wie sie sind)

von Peter K. (peterka2000)


Lesenswert?

SUPER, jetzt funktionierts, ich war schon mal bei den PullUps, ich habe 
aber vergessen die If-Bedingung umzudrehen.

Das mit dem
1
#include <avr/iom1281.h>
habe ich nur gemacht weil ich vorher PORTF verwendet habe und es den 
normal nicht erkennt.

Danke an alle die hier was geschrieben haben.

EDIT:
Kann oder muss man den Thread hier irgendwie schließen??

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.