Forum: Mikrocontroller und Digitale Elektronik Mal wieder UART - Atmega8 vs. Atmega32


von Hans B. (hans_b92)


Lesenswert?

Liebe Alle,

ich komme bei folgendem Problem nicht weiter. Ein Atmega8 (verbaut auf 
einer Platine für eine Motorsteuerung per PWM und diverse LEDs und 
Taster) soll nun noch per UART Daten ausgeben. Code ist wiefolgt:
1
#include <avr/io.h>
2
#include <string.h> 
3
#include <stdlib.h> 
4
5
#define TAKT      8000000UL
6
#define UART_BAUDRATE  4800
7
#define F_CPU      8000000UL
8
9
#include <util/delay.h>
10
11
#define LED_PORT        PORTC
12
#define LED_GRUEN       0
13
#define LED_LILA        1
14
#define LED_GELB        2
15
#define LED_ROT         3
16
17
18
19
// Berechnung der Konfigurationsparameter
20
#define UART_SETTING  ((TAKT/16L/UART_BAUDRATE)-1)
21
22
23
void setup_uart()
24
{
25
26
  UBRRH = (char) (UART_SETTING >> 8);
27
  UBRRL = (char) (UART_SETTING);
28
29
30
  UCSRB = (1<<TXEN);
31
32
  /* Asynchron, 8N1 */
33
  UCSRC = (1<<URSEL) | (3<<UCSZ0);
34
}
35
36
void uart_putchar(char c)
37
{
38
  while (!(UCSRA & (1 << UDRE)))
39
    ;
40
  UDR = c;
41
}
42
43
void uart_putstring(char *str)
44
{
45
  unsigned char i;
46
47
  for (i=0;i<255;i++) 
48
  {
49
    if (str[i] != 0)
50
      uart_putchar(str[i]);
51
    else
52
      break; 
53
  }
54
}
55
56
57
58
int main(void)
59
{
60
61
62
  DDRC=0b00001111;
63
  
64
  PORTC=0xff;
65
66
67
  char kommando[255];
68
  char temp[10];
69
  unsigned char zahl=0;
70
71
  setup_uart();
72
73
  uart_putstring("UART läuft ...\r\n\r\n");
74
75
  while (1)
76
  {
77
  
78
  LED_PORT ^= (1 << LED_GRUEN | 1 << LED_LILA | 1 << LED_GELB | 1 << LED_ROT);
79
  _delay_ms(1000);
80
81
  }
82
83
  return 0;
84
}

Der Atmega8 wird über nen 8 Mhz Quarz getaktet. Zu Testzwecken ist von 
dem Atmega8 auch die gesamte andere Steuerungslogik runtergeflogen - ich 
will lediglich den UART darauf testen. Die Verbindung über die 
Tutorial-RS232 Signalanpassung gibt jedoch auf den PC keinen Mucks aus. 
Gar nichts.

Der gleiche Code (oben habe ich ihn etwas verknappt) funktioniert jedoch 
auf einem Atmega32 (mit gleichem Quarz, der is also funktionstüchtig) 
und sendet das gewünschte Ergebnis.

Gibt es irgendwelche Stolpersteine die ich bei der "Portierung" von 32 
auf 8 beachten muss oder ist der Fehler in der Hardware zu suchen? Die 
RS232 Wandlung erfolgt über die gleichen Bauteile auf nem Testboard.

Viele Grüße und Danke
Hans

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hans B. schrieb:
1
 for (i=0;i<255;i++) 
2
   {
3
     if (str[i] != 0)
4
       uart_putchar(str[i]);
5
     else
6
       break; 
7
   }
Bist du sicher, dass du weißt, was du da machst?
Oder hast du öfter mal nicht terminierte Strings?

>  ist der Fehler in der Hardware zu suchen?
Versetz den uC mal in den Resetzustand und verbinde einfach am uC RX und 
TX. Tipp ein paar Zeichen im Terminalprogramm ein. Bekommst du sie 
zurück?

Hans B. schrieb:
> Gibt es irgendwelche Stolpersteine die ich bei der "Portierung" von 32
> auf 8 beachten muss oder ist der Fehler in der Hardware zu suchen?
Was steht denn zu diesem Thema im Datenblatt?

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.