Forum: Mikrocontroller und Digitale Elektronik Atmega32 seltsames Verhalten bei einfachem Code (1 Taster, 2 LEDs)


von slashbrain (Gast)


Lesenswert?

Hallo,

hab mir neulich einen Atmel Atmega32 gekauft, um mal einen Einblick in 
die Welt der µCs zu bekommen. Als ISP nutze ich Usbprog. Allerdings 
hänge ich jetzt an einem seltsamen Problem, dass ich bei besten Willen 
und viel nachdenken nich erklären kann.

Die Beschaltung:
LEDG an D6
LEDR an D7
Taster an A7

Funktion sollte klar sein: immer eine LED an, je nach dem ob der Taster 
gedrückt ist.
1
#include <avr/io.h>
2
#define LEDG_OUTPUT()  DDRD|=~(1<<6)
3
#define LEDR_OUTPUT()  DDRD|=~(1<<7)
4
#define LEDG_ON()  PORTD&=~(1<<6)
5
#define LEDG_OFF()  PORTD|=~(1<<6)
6
#define LEDR_ON()  PORTD&=~(1<<7)
7
#define LEDR_OFF()  PORTD|=~(1<<7)
8
9
int main(void) {
10
  LEDG_OUTPUT();
11
  LEDR_OUTPUT();
12
  while (1) {
13
    if ((PINA & (1 << PINA7))) {
14
      LEDG_ON();
15
      LEDR_OFF();
16
    } else {
17
      LEDG_OFF();
18
      LEDR_ON();
19
    }
20
  }
21
}

Das Ergebnis ist allerdings, dass die rote LED alles richtig macht, die 
grüne jedoch immer an ist, und in dem Fall wo sie eiglt aus sein sollte, 
noch Heller wird (nicht viel).

Steh ich da jetzt einfach programmiertechnisch total auf dem Schlauch 
oder was geht da ab?

Gruß slashbrain

von Stefan E. (sternst)


Lesenswert?

Hier http://www.mikrocontroller.net/articles/Bitmanipulation
nochmal nachlesen, warum deine "|=~"-Zeilen nicht das machen, was du 
denkst.

von Falk B. (falk)


Lesenswert?

@  slashbrain (Gast)

Eher so.

1
#include <avr/io.h>
2
#define LEDG_OUTPUT()  DDRD |= (1<<6)
3
#define LEDR_OUTPUT()  DDRD |= (1<<7)
4
#define LEDG_ON()   PORTD &= ~(1<<6)
5
#define LEDG_OFF()  PORTD |= (1<<6)
6
#define LEDR_ON()   PORTD &= ~(1<<7)
7
#define LEDR_OFF()  PORTD |= (1<<7)

Siehe Bitmanipulation

MFG
Falk

von slashbrain (Gast)


Lesenswert?

vielen Dank für die Antworten. Leider muss ich sagen, dass sich die 
Fehler in meiner Bitmanipulation sich erst im Laufe meiner 
Fehlerbehebung eingeschlichen haben. Der Code ist nun korrekt, 
allerdings tritt der besagte Fehler immer noch auf.

Um alle Fehler in der Bitmaske auszulöschen hab ich den Code so 
geschrieben:
1
#include <avr/io.h>
2
3
int main(void) {
4
  DDRD = 192;
5
  while (1) {
6
    if ((PINA & (1 << PINA7))) {
7
      PORTD = 64;
8
    } else {
9
      PORTD = 128;
10
    }
11
  }
12
}

Der Fehler tritt jedoch immernoch auf. Wo ist mein Fehler?

von Thomas E. (thomase)


Lesenswert?

slashbrain schrieb:
> if ((PINA & (1 << PINA7)))

Das ist immer 0, da der Pullup nicht gesetzt ist: PORTA |= (1 << 7);

mfg.

von slashbrain (Gast)


Lesenswert?

Okay, so funktionierts. Vielen Dank für die Antwort.
Aber zum Verständnis: warum spinnen die LEDs wenn ich vergessen habe den 
Pullup des Tasters zu setzen. Und an sich hat der Taster ja 
funktioniert. Also es wurde immer der richtige Teil des if/else 
ausgeführt.

von Karl H. (kbuchegg)


Lesenswert?

slashbrain schrieb:
> Okay, so funktionierts. Vielen Dank für die Antwort.
> Aber zum Verständnis: warum spinnen die LEDs wenn ich vergessen habe den
> Pullup des Tasters zu setzen.

Es sind nicht die LEDs die spinnen. Du hast, wenn der Taster nicht 
gedrückt ist, einen offenen Eingang, der sich jedes dahergelaufene 
elektromagnetische Feld aus der näheren Umgebung einfängt und wahlweise 
als 0 oder 1 interpretiert.

von slashbrain (Gast)


Lesenswert?

so langsam versteh ich das ganze mit den Pullups usw...

aber jetzt hängts an der Übertragung, ich bekomme kein neues Prog auf 
den Atmel.
1
avrdude: stk500v2_command(): command failed
2
avrdude: stk500v2_recv_mk2: error in USB receive
3
avrdude: stk500v2_program_enable(): bad STK600 connection status: Unknown (0x64)
4
avrdude: initialization failed, rc=-1
5
avrdude: AVR device initialized and ready to accept instructions
6
avrdude: Device signature = 0x000000
7
avrdude: Yikes!  Invalid device signature.
8
avrdude: Expected signature for ATMEGA32 is 1E 95 02
9
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
10
         To disable this feature, specify the -D option.

-F hat nicht geholfen, und die Verbindungen hab ich 3 mal gecheckt...

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.