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


von Toby (Gast)


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.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <stdlib.h>
4
5
#define LED_PIN PD6
6
#define LED_PORT PORTD
7
8
#define BUTTON_PIN PD3
9
#define BUTTON_PORT PORTD
10
11
int main (void) {  
12
  // Jetzt die Ports richtig beschalten:
13
14
  DDRA = 0b11111111; // PA7 - PA0 als Ausgang (1)
15
  PORTA = 0b00000000; // PA7 - PA0 auf LOW schalten (0)
16
17
  DDRB = 0b11100011; // PB7 - PB5 und PB1 - PB0 als Ausgang (1), PB4 - PB2 als Eingang (0)
18
  PORTB = 0b00000000; // PB7 - PB0 auf LOW schalten (0), erstmal keinen Internen PullUps (Wäre 1)
19
20
  DDRC = 0b11111111; // PC7 - PC0 als Ausgang (1)
21
  PORTC = 0b00000000; // PC7 - PC0 auf LOW schalten (0)
22
23
  DDRD = 0b11110000; // PD7 - PD4 als Ausgang (1), PD3 - PD0 als Eingang (0)
24
  PORTD = 0b00000011; // PD7 - PD4 auf LOW schalten (0), Interne PullUps für PD1 - PD0 anschalten (1)
25
  // ACHTUNG! PD0 ist RXD, PD1 ist TXD!
26
27
  LED_PORT |= (1<<LED_PIN);
28
  _delay_ms(500);
29
  LED_PORT &= ~(1<<LED_PIN);
30
31
  while (1) {
32
    if ((BUTTON_PORT & (1<<BUTTON_PIN))) {
33
      LED_PORT &= ~(1<<LED_PIN);
34
    } else {
35
      LED_PORT |= (1<<LED_PIN);
36
    }
37
    _delay_ms(5);
38
  }
39
}

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

Danke, Toby

von Lutz (Gast)


Lesenswert?

#define LED_PIN PD6

Vielleicht PIND6?

von Karl H. (kbuchegg)


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
1
  DDRD = ( 1 << LED_PIN );       // Led auf Ausgang
2
  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
1
#define BUTTON_PORT   PIND

von Lutz (Gast)


Lesenswert?

#define BUTTON_PIN PD3

PIND3 natürlich

von HN-ES (Gast)


Lesenswert?

Du fragst mit BUTTON_PORT PORTD ab.
Vllt solltest du eher PIND abfragen.

grüßle

von Toby (Gast)


Lesenswert?

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

von ME (Gast)


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:
1
/* PORTD */
2
#define PD7     7
3
#define PD6     6
4
#define PD5     5
5
#define PD4     4
6
#define PD3     3
7
#define PD2     2
8
#define PD1     1
9
#define PD0     0
10
11
...
12
13
/* PIND */
14
#define PIND7   7
15
#define PIND6   6
16
#define PIND5   5
17
#define PIND4   4
18
#define PIND3   3
19
#define PIND2   2
20
#define PIND1   1
21
#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.

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.