AVR-Input Problem

OP #2767524
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
#2767527
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
}
OP #2767535
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
}
Gast #2767537
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.
#2767546
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)
OP #2767548
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??

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.