Forum: Mikrocontroller und Digitale Elektronik ATmega644P - Display über UART funktioniert sporadisch. Liegt es am fehlenden Quarz?


von He D. (hedo)


Lesenswert?

Hallo,

ich arbeite gerade an einer Platine, welche an einem Dynamixel-Motor 
(http://www.robotis.com/xe/dynamixel_en) angeschlossen wird, um diesen 
zu
kalibrieren (ID setzen , etc..). Dazu schließe ich den Dynamixel mit 
Hilfe eines Max485 an den zweiten UART eines
ATmega644P an. Am ersten hängt ein Display 
(http://www.sparkfun.com/products/9395). Die Baudrate für den Motor 
beträgt 1000000 BAUD und die für den Display
9600 BAUD. Mein Problem besteht darin, dass mein Programm nur kurz nach 
dem flashen komplett funktioniert. Wenn ich den
Stecker ziehe oder den ISP abbaue, so wird zwar meist die 
Motorkommunikaton ausgeführt und die richtigen LED's angesteuert,
doch bleibt der Display leer.

Meine Frage wäre, ob dies an Fehlern bei der Übertragung liegen könnte, 
da ich keinen externen Quarz benutze. Sollte ich lieber einen nehmen und 
wenn ja, könnt ihr mir einen empfehlen?

Grüße,

HeDo

Bild der Platine: https://dl.dropbox.com/u/1566663/testerplatine.png

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

He Do schrieb:
> Meine Frage wäre, ob dies an Fehlern bei der Übertragung liegen könnte,
> da ich keinen externen Quarz benutze.

Solange du mit 5 V und bei Zimmertemperatur arbeitest, ist es recht
unwahrscheinlich, dass da der Fehler liegt.

> Sollte ich lieber einen nehmen und

Wenn du im laufenden Betrieb damit arbeiten willst, ist zumindest ein
Keramikresonator zu empfehlen.

> wenn ja, könnt ihr mir einen empfehlen?

Praktisch jeder beliebige.  Keramikresonator statt Quarz hatte ich
schon genannt, der braucht keine separaten Last-Kondensatoren und
ist ein wenig billiger und ungenauer.  Dafür schwingt er nach dem
Schlafen schneller an als ein Quarz.

von Pete K. (pete77)


Lesenswert?

- Du verwendest sehr wenig Stützkondensatoren. Ist die Stromversorgung 
stabil?
- AVCC bitte noch beschalten.
- Reg1117 nicht nach DB beschaltet (10µF an beiden Seiten)

von He D. (hedo)


Lesenswert?

Hi,

@Jörg: vielen Dank für die schnelle Antwort.

@Pete: Dafür muss ich mich entschuldigen, denn diese sind nicht auf dem 
Schaltplan verzeichent, weil ich für die Stromversorgung den 
SMPS2Dynamixel(http://www.trossenrobotics.com/store/p/5886-SMPS2Dynamixel-Adapter.aspx) 
benutze.

Es scheint also doch ein Softwarefehler zu sein, da ich keine 
Kommunikation zum Diplay bekomme, sobald ich den 2. UART aktiviere.

Hier der Initialisierungscode für den Motor UART:
1
void usartMotorInit() {
2
  MAX485_PORT_DIR_OUTPUT;
3
4
  //Disables transmitter & receiver
5
  //UART_MOTOR_STATUS_CONFIG_B &= ~(UART_MOTOR_ENABLE_RECEIVER | UART_MOTOR_ENABLE_TRANSMITTER);
6
7
  usartMotorFlushReceiver();
8
  uint16_t baud = (uint16_t)((FREQUENZ_OF_CPU / UART_MOTOR_BAUDRATE / 16) - 1);
9
  UBRR1H =  (uint8_t) (baud >> 8);
10
  UBRR1L = (uint8_t) baud ;
11
12
  // FIXME configure double speed check
13
  // if the setbaud.h macros set USE_2X, we need to enable double speed
14
15
  UCSR1A |= (1 << U2X1);
16
17
  // enable tranmitter & receiver
18
  UCSR1B = ((1 << RXCIE1) | (1 << TXCIE1) |  (1 << RXEN1) |  (1 << TXEN1));
19
20
21
  // set 8n1
22
  UCSR1C = (3<<UCSZ10);
23
24
  // set MAX485 to receive data
25
  MAX485_RECEIVER_ENABLED;
26
}

Die Makros sind wie folgt definiert:
1
#define MAX485_PIN                                  (1 << PC3)
2
#define MAX485_PORT_ADDRESS                         (PORTC)
3
#define MAX485_PORT_DIR_ADDRESS                     (DDRC)
4
#define MAX485_PORT_DIR_OUTPUT                      (MAX485_PORT_DIR_ADDRESS |= MAX485_PIN)
5
#define MAX485_RECEIVER_ENABLED                     (MAX485_PORT_ADDRESS &= ~(MAX485_PIN))
6
#define MAX485_TRANSMITTER_ENABLED                  (MAX485_PORT_ADDRESS |= MAX485_PIN)

Erkennt ihr hierin irgendeinen Fehler?

von Krapao (Gast)


Lesenswert?

Wie ist Display-GND auf der Platine geroutet; vielleicht nur bis 
ISP1-GND ohne Verbindung zu IC3-GND? Analoge Frage zu Display-Vcc.

von He D. (hedo)


Lesenswert?

Hallo an alle,

danke für eure Hilfe. Das Problem lag wohl bei den fehlenden 
Stützkondensatoren. Zudem war der JTAG eingeschaltet. Das dürfte 
erklären, warum es immer nach dem Flashen funtioniert hat.


Viele Grüße,

HeDo

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.