Forum: Mikrocontroller und Digitale Elektronik ATmega32 (16PU): Mit C Pin an PORTD periodisch schalten, komische Probleme


von Lisa (Gast)


Lesenswert?

Hallo zusammen

Ich habe ein problem, daran beteiligt ist folgender Code:
1
#include <avr/io.h>
2
#define F_CPU 8000000
3
#include <util/delay.h>
4
5
int main(void)
6
{
7
  
8
  DDRC=0xFF;
9
  DDRD=0xFF;
10
  DDRB=0xFF;
11
  
12
  /*
13
  PORTD = PORTD & (0<<PD5);  //Reset
14
  PORTD = PORTD & (0<<PD4);  //Sleep
15
  
16
  PORTD = PORTD | (1<<PD5);  //Reset
17
  PORTD = PORTD | (1<<PD4);  //Sleep
18
  */
19
  
20
  PORTD = PORTD | (1<<2);  //Dir  
21
  PORTB = PORTB | (1 << PB4);  
22
  
23
  /*  
24
  while(1)
25
  {
26
    PORTD = PORTD & (0<<PD3);  //Step
27
    _delay_ms(1);
28
    PORTD = PORTD | (1<<PD3);  //Step
29
    _delay_ms(1);
30
  }  
31
  */
32
}

Wenn ich wie hier dargestellt den Inhalt der while-Schleife 
auskommentiere, dann wird der Pin 2 an PORTD wie "befohlen" auf 5 Volt 
gesetzt.
Wenn ich aber die while-Schleife nicht auskommentiere (also auch auf den 
uC übertrage) dann wird der PORTD.2 nicht gesetzt (bzw. wahrscheinlich 
nur ganz kurz und dann wieder zurück auf 0).

Wer kann mir erklären, wie das kommt? Ich setze in meiner Schleife ja 
nur PD3 und mache gar nichts mit PD2?!

Ich habe:

-Zwei verschiedene Controller probiert
-JTAG auf den uC's deaktiviert (ich brauche später u.A. auch den PORTC)
-den internen Oszi auf 8MHz gestellt

Liebe Grüsse

Lisa

von Lisa (Gast)


Lesenswert?

Sorry, um das noch zu erwähnen:

Den oberen auskommentierten Block habe ich auskommentiert, weil ich 
dachte das könnte mir bei der Fehlersuche helfen (weniger potentielle 
Fehler).

Das hat aber (logischerweise) keinen Unterschied gemacht.

von Felix G. (felixg)


Lesenswert?

Hallo Lisa,

mit dieser Anweisung
1
PORTD = PORTD & (0<<PD3);

setzt du den gesamten Port auf 0. Irgendwas geundet mit 0 wird immer 0 
sein.

Wenn du einzelne Portpins löschen und aktivieren willst, dann wird das 
so gemacht:
1
PORTB &= ~(1<<PB2); // Löschen eines Portpins
2
PORTB |= (1<<PB2); // Setzen eines Portpins

Lies dir bitte das Tutorial durch, da steht alles drin, was du wissen 
musst.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von guest (Gast)


Lesenswert?

HW Aufbau? PD2 wird von außen durch Schalten von PD3 auf 0 gezogen. Wie 
ist die Schaltung?

von Lisa (Gast)


Lesenswert?

Hallo Felix G

Vielen Dank für deine Antwort.
Du hast natürlich ins Schwarze getroffen, die Sache funktioniert nun 
auch ausserhalb des Tastprogrammes (Schrittmotor drehen lassen).

Für Leute mit ähnlichen Problemen:

http://www.mikrocontroller.net/articles/Bitmanipulation#Standard_C_2

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.