mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kann PINs nicht einlesen :(


Autor: Toby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich bin am Verzweifeln.
Am Pin D3 messe ich normal 0V, mit gedrücktem Button 5V.
Alles nett soweit, ist n PullDown dran, soll ja so sein.
Leider kriegt der Atmega32-16AU das garnicht mit!!!

Folgender Code bringt die LED dazu durchgehend zu leuchten, egal wie 
sehr ich auf dem Button rumdrücke.
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

#define LED_PIN PD6
#define LED_PORT PORTD

#define BUTTON_PIN PD3
#define BUTTON_PORT PORTD

int main (void) {  
  // Jetzt die Ports richtig beschalten:

  DDRA = 0b11111111; // PA7 - PA0 als Ausgang (1)
  PORTA = 0b00000000; // PA7 - PA0 auf LOW schalten (0)

  DDRB = 0b11100011; // PB7 - PB5 und PB1 - PB0 als Ausgang (1), PB4 - PB2 als Eingang (0)
  PORTB = 0b00000000; // PB7 - PB0 auf LOW schalten (0), erstmal keinen Internen PullUps (Wäre 1)

  DDRC = 0b11111111; // PC7 - PC0 als Ausgang (1)
  PORTC = 0b00000000; // PC7 - PC0 auf LOW schalten (0)

  DDRD = 0b11110000; // PD7 - PD4 als Ausgang (1), PD3 - PD0 als Eingang (0)
  PORTD = 0b00000011; // PD7 - PD4 auf LOW schalten (0), Interne PullUps für PD1 - PD0 anschalten (1)
  // ACHTUNG! PD0 ist RXD, PD1 ist TXD!

  LED_PORT |= (1<<LED_PIN);
  _delay_ms(500);
  LED_PORT &= ~(1<<LED_PIN);

  while (1) {
    if ((BUTTON_PORT & (1<<BUTTON_PIN))) {
      LED_PORT &= ~(1<<LED_PIN);
    } else {
      LED_PORT |= (1<<LED_PIN);
    }
    _delay_ms(5);
  }
}

Hat jemand ne Idee? JTAG habe ich schon zig mal ausgeschaltet, das 
sollte an dem Port aber eh nichts machen, oder?

Danke, Toby

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define LED_PIN PD6

Vielleicht PIND6?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Toby schrieb:

> Hat jemand ne Idee?

Ja.
Schalte mal den Pullup an PD3 ein.

Und wenns das war, dann hast du auch die Begründung, warum du die 
Initalisierung besser so schreibst
  DDRD = ( 1 << LED_PIN );       // Led auf Ausgang
  PORTD = ( 1 << BUTTON_PIN );   // dafür am Button den Pullup ein

so kannst du, solange du den Port nicht insgesamt wechselst, nicht 
vergessen, den Led-Pin auf Ausgang und den Pullup auf "ein" zu schalten. 
Egal auf welchem Pin die LED bzw. der Taster liegt. Du musst nur auf 
deine #define aufpassen, dass es zu keinen Konflikte kommt. Alles andere 
regelt dann der Compiler.

Edit: gerade gesehen
Eingelesen wird vom PIN Register, nicht vom Port
#define BUTTON_PORT   PIND

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define BUTTON_PIN PD3

PIND3 natürlich

Autor: HN-ES (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du fragst mit BUTTON_PORT PORTD ab.
Vllt solltest du eher PIND abfragen.

grüßle

Autor: Toby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach mann!
VIELEN DANK!
Ich hatte ganz vergessen, dass es einen Unterschied zwischen PORTD und 
PIND gibt!!!
Jetzt gehts wunderbar!

Autor: ME (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob PD3 oder PIND3 da steht, ändert überhaupt nichts. Beides sind 
Konstanten für 3.

Dies verrät ein Blick ins Header-File iom32.h, welches von avr/io.h 
eingebunden wird:
/* PORTD */
#define PD7     7
#define PD6     6
#define PD5     5
#define PD4     4
#define PD3     3
#define PD2     2
#define PD1     1
#define PD0     0

...

/* PIND */
#define PIND7   7
#define PIND6   6
#define PIND5   5
#define PIND4   4
#define PIND3   3
#define PIND2   2
#define PIND1   1
#define PIND0   0

Evtl. ist es etwas eleganter diejenigen Konstanten zu verwenden, die für 
den entsprechenden Port definiert wurden, funktional macht das aber 
nicht den geringsten Unterschied.

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.