Forum: Mikrocontroller und Digitale Elektronik Fehler in UART-Routine gesucht (C)


von pacer (Gast)


Lesenswert?

Hallo Leute,

ich versuche gerade meine Assemblerroutinen in C umzusetzen.
Leider bisher ohne Erfolg. Speziell geht es um die Initialisierung der 
UART.
Wahrscheinlich ein einfacher Anfängerfehler
1
#define F_CPU 8000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <string.h>
6
#include <inttypes.h>
7
8
9
//------------------------------------------------------------------------
10
//   Definitionen
11
//------------------------------------------------------------------------
12
#define BAUD 9600                               // definiert Baudrate
13
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)  // berechnet Wert für Baudratenregister (Wert gerundet)
14
15
16
//------------------------------------------------------
17
//   Deklaration der Funktionen
18
//------------------------------------------------------
19
void initUART (void);        // Befehl an Display
20
21
22
//------------------------------------------------------
23
//   Mainfunktion
24
//------------------------------------------------------
25
int main (void) 
26
{            
27
28
   while(1);                 
29
}
30
31
32
33
//------------------------------------------------------
34
//  
35
//------------------------------------------------------
36
void initUART(void)  
37
{   
38
39
  UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);   // Empfang aktivieren
40
  UCSRC |= (3<<UCSZ0);             // Frame Format: Asynchron 8N1
41
42
  UBRRH = UBRR_VAL >> 8;        // Baudrate übergeben
43
  UBRRL = UBRR_VAL;
44
}

Kann mir jemand sagen warum die I/O-Register alle als undeclared geführt 
werden?

von Karl H. (kbuchegg)


Lesenswert?

pacer schrieb:

> Kann mir jemand sagen warum die I/O-Register alle als undeclared geführt
> werden?

Falscher Prozessor in den Project Options eingestellt?

von pacer (Gast)


Lesenswert?

stimmt, ich hab zwar Mega8 und auch mal Mega88 eingestellt,
aber ich hab wohl trotzdem einiges durcheinander geworfen.
1
void initUART(void)  
2
{   
3
4
 #if defined Mega8
5
  UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);   // Empfang aktivieren
6
  UCSRC |= (3<<UCSZ0);             // Frame Format: Asynchron 8N1
7
8
  UBRRH = UBRR_VAL >> 8;        // Baudrate übergeben
9
  UBRRL = UBRR_VAL;
10
 #endif
11
12
13
 #if defined Mega88
14
  UBRR0H = UBRR_VAL >>8;
15
  UBRR0L = UBRR_VAL;
16
17
  UCSR0C |= (3<<UCSZ00);
18
  UCSR0B |= (1<<TXEN0) | (1<<RXEN0);       
19
 #endif
20
21
}
Das hier sollte funktionieren, oder?
Der Compiler bringt jetzt keinen Fehler mehr.

von pacer (Gast)


Lesenswert?

Jetzt kommen zwar Zeichen an, aber leider nicht lesbar.
1
#define F_CPU 7372800
2
#define Mega88
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <string.h>
6
#include <inttypes.h>
7
#include <stdlib.h>
8
9
10
11
//------------------------------------------------------------------------
12
//   Definitionen
13
//------------------------------------------------------------------------
14
#define BAUD 9600UL                             // definiert Baudrate
15
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)  // berechnet Wert für Baudratenregister (Wert gerundet)
16
17
18
//------------------------------------------------------
19
//   Deklaration der Funktionen
20
//------------------------------------------------------
21
void initUART (void);        // Befehl an Display
22
int uart_putc(unsigned char c);    // Sendet Zeichen an RS232
23
void uart_puts (char *s);      // übergibt einzelne Zeichen einer Zeichenkette an uart_putc
24
25
//------------------------------------------------------
26
//   Mainfunktion
27
//------------------------------------------------------
28
int main (void) 
29
{  
30
   char s[7];
31
   int16_t i = -12345;
32
33
34
   initUART();  
35
   
36
   itoa( i, s, 10 ); // 10 fuer radix -> Dezimalsystem
37
   uart_puts( s );
38
        
39
40
   while(1);                 
41
}
42
43
44
45
//------------------------------------------------------
46
//  
47
//------------------------------------------------------
48
void initUART(void)  
49
{   
50
51
 #if defined Mega8
52
  UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);   // Empfang aktivieren
53
  UCSRC |= (3<<UCSZ0);             // Frame Format: Asynchron 8N1
54
55
  UBRRH = UBRR_VAL >> 8;        // Baudrate übergeben
56
  UBRRL = UBRR_VAL;
57
 #endif
58
59
60
 #if defined Mega88
61
  UBRR0H = UBRR_VAL >>8;
62
  UBRR0L = UBRR_VAL;
63
64
65
  UCSR0C |= (3<<UCSZ00);
66
  UCSR0B |= (1<<TXEN0) | (1<<RXEN0);       
67
 #endif
68
69
}
70
71
72
73
int uart_putc(unsigned char c)
74
{
75
76
 #if defined Mega88
77
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
78
    {
79
    }                             
80
 
81
    UDR0 = c;                      /* sende Zeichen */
82
    return 0;
83
 #endif
84
85
 #if defined Mega8
86
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
87
    {
88
    }                             
89
 
90
    UDR = c;                      /* sende Zeichen */
91
    return 0;
92
 #endif
93
 }
94
95
96
void uart_puts (char *s)
97
{
98
    while (*s)
99
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
100
        uart_putc(*s);
101
        s++;
102
    }
103
}

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.