Forum: Mikrocontroller und Digitale Elektronik UART, Testprogramm aus Buch läuft nicht


von tester (Gast)


Lesenswert?

Moin,

ich wollte nachfolgendes Testprogramm aus einem Buch mal testen. Dabei 
spuckt der Compiler einige Fehlermeldungen aus:

Programm:
1
/**************************************************************
2
*                                                              *
3
*                         UART.c                                *
4
*                                                              *
5
***************************************************************/
6
7
/* Include-Dateien   
8
   -----------------*/
9
#include <io8515.h>    // Register Definition fuer AT90S8515
10
#include <ina90.h>     // Intrinsic Funktionen fuer ICCA90 
11
12
 
13
/* UCR - UART Control Register: Bit Definitionen 
14
   -----------------------------------------------------------*/
15
#define     RXCIE    0x80    // Bit 7 
16
#define     TXCIE    0x40    // Bit 6 
17
#define     UDRIE    0x20    // Bit 5 
18
#define     RXEN     0x10    // Bit 4 
19
#define     TXEN     0x08    // Bit 3 
20
#define     CHR9     0x04    // Bit 2 
21
#define     RXB8     0x02    // Bit 1 
22
#define     TXB8     0x01    // Bit 0 
23
24
/* USR - UART Status Register: Bit Definitionen 
25
    ---------------------------------------------------------*/
26
#define     RXC     0x80    // Bit 7 
27
#define     TXC     0x40    // Bit 6 
28
#define     UDRE    0x20    // Bit 5 
29
#define     FE      0x10    // Bit 4 
30
#define     OVR     0x08    // Bit 3 
31
32
/* UBRR - UART Baudrate Register: Baud Definitionen fuer 4MHz
33
    ---------------------------------------------------------*/
34
#define     BAUD_1200     208
35
#define     BAUD_2400     103
36
#define     BAUD_9600     25
37
#define     BAUD_19200    12
38
39
/* UART Daten-Puffer Definitionen 
40
    ------------------------------*/
41
#define BUFFER_SIZE     8     // Modulo 2 Groesse: nur 2,4,8,16,32 Bytes 
42
#define BUFFER_MASK     (BUFFER_SIZE-1)
43
44
/* Allgemeine typ-Definitionen 
45
    -----------------------------------------------------------*/
46
typedef enum{ FALSE=0, TRUE=1} Boolean_t ;
47
 
48
typedef struct{ unsigned char UartData[ BUFFER_SIZE ];
49
                unsigned char NumberOfBytes;
50
                unsigned char UartStatus; } Uart_t; 
51
52
/* Static Variables 
53
   -------------------*/
54
static unsigned char                RxBuf[ BUFFER_SIZE ];
55
static volatile unsigned char       RxProducer;  // Empfang: Int-Service ist der Producer
56
static volatile unsigned char       RxConsumer;  // Empfang: Hauptprogramm ist Consumer
57
static unsigned char                TxBuf[ BUFFER_SIZE ];
58
static volatile unsigned char       TxProducer;  // Senden: Hauptprogramm ist der Producer
59
static volatile unsigned char       TxConsumer;  // Senden: Int-Service ist Consumer
60
61
/* Funktion-Prototypen
62
   ----------------------------*/
63
void InitUart( unsigned char baudrate );
64
Boolean_t ReceiveData( Uart_t * Data );
65
Boolean_t TransmitData( Uart_t * Data );
66
void Delay( void ); 
67
 
68
/* Input Pins, Port B:               sfrb PINB    = 0x16; 
69
   Data Direction Register, Port B:  sfrb DDRB    = 0x17; 
70
   Data Register, Port B:            sfrb PORTB   = 0x18; */
71
void Delay( void )
72
{
73
  unsigned int i= 0x7FFF;
74
  while(--i);
75
}
76
77
78
/* Main - ein einfaches Anwendungsbeispiel fuer UART und Timer 
79
   -------------------------------------------------------------*/
80
void C_task main( void )
81
{
82
    Uart_t UartData;
83
    
84
    DDRB  = 0xFF ; // Konfiguriert Port B als Ausgang
85
    PORTB = 0xAA;
86
      
87
    InitUart( BAUD_9600 );     // Baudrate = 9600 Baud bei 4MHz Quarz
88
    _SEI();                      // Freigabe aller Interrupts => Enable UART Interrupts 
89
    
90
    for( ;; )                  // Endlos-Schleife 
91
    {
92
        if( ReceiveData( & UartData ) )
93
        {  
94
          TransmitData( & UartData );     // Echo der empfangenen Bytes
95
         }
96
97
        PORTB++; // led switch
98
        Delay();
99
    }
100
}
101
102
/* Initialisierung der UART 
103
    ------------------------------*/
104
void InitUart( unsigned char baudrate )
105
{
106
    UBRR = baudrate;               // Baudrate setzen 
107
108
                                  // Freigabe der UART Interrupts
109
    UCR =  TXEN | RXEN | RXCIE;   // ==> Senden/Empfangen/Empf.INT
110
111
    RxConsumer     = 0;            // Ruecksetzen der Puffer-Index 
112
    RxProducer     = 0;
113
    TxConsumer     = 0;
114
    TxProducer     = 0;
115
}
116
117
/*  Empfangs-Interrupt Handler
118
    --------------------------- */
119
interrupt [UART_RX_vect] void UartRxIntHandler( void )
120
{
121
    unsigned char data;
122
    
123
    data = UDR;                 // Lesen der Empfangsdaten 
124
    RxBuf[RxProducer] = data;   // Empfangenes Byte in Puffer ablegen  
125
    RxProducer++;               // Bufferindex setzen
126
    RxProducer &=BUFFER_MASK;   // Index begrenzen und evtl. auf Puffer-Anfang
127
     
128
    if (RxProducer == RxConsumer )
129
    {
130
        // Fehler! Ueberlauf Empfangspuffer 
131
    }
132
}
133
134
/*  Sende-Interrupt Handler
135
    --------------------------- */
136
interrupt [UART_UDRE_vect] void UART_TX_interrupt( void )
137
{
138
    // Test ob noch nicht fertig mit Senden  
139
    if ( TxConsumer != TxProducer )
140
    {
141
        ++TxConsumer;               // Pufferindex aktualisieren 
142
        TxConsumer &=BUFFER_MASK;   // Index begrenzen und evtl. auf Puffer-Anfang
143
        UDR = TxBuf[TxConsumer];    // Uebergabe eines Bytes 
144
      }
145
    else
146
    {
147
        UCR &= ~UDRIE; // Disable UDRE interrupt
148
    }
149
} 
150
151
 
152
/* UART Empfangsfunktion 
153
   --------------------- */
154
Boolean_t ReceiveData( Uart_t * Data )
155
{
156
    unsigned char i=0;
157
158
    // Schleife zur Uebergabe der empfangenen Daten
159
    while (( RxConsumer != RxProducer ) && ( i < BUFFER_SIZE ) ) 
160
    {
161
       Data->UartData[i++] = RxBuf[RxConsumer++];
162
       
163
       RxConsumer &=BUFFER_MASK;   // Consumer-Index begrenzen und evtl. auf Puffer-Anfang                          
164
    }
165
166
    Data->NumberOfBytes = i ;
167
168
    if( i ) return TRUE ;
169
     else return FALSE ;
170
}
171
172
/* Sendefunktion 
173
   --------------------- */
174
Boolean_t TransmitData( Uart_t * Data )
175
{
176
    unsigned char i=0;
177
178
    while (( i < Data->NumberOfBytes ) && ( i < BUFFER_SIZE ) )// Uebergabe Empfangsdaten 
179
    {
180
       TxBuf[TxProducer++] = Data->UartData[i++] ;
181
182
       TxProducer &=BUFFER_MASK;   // Producer-Index begrenzen und evtl. auf Puffer-Anfang                          
183
    }
184
185
    UDR = TxBuf[TxConsumer];        // Senden Anstossen
186
    ++TxConsumer; 
187
    TxConsumer &=BUFFER_MASK;   // Consumer-Index begrenzen
188
    
189
    UCR |=  UDRIE ;
190
    Data->NumberOfBytes = 0;
191
    return TRUE ;
192
}



Fehlermeldungen:
(ohne Warnings)

C:\Meine Programme\WinAVR-20071221\avr\include\avr/io8515.h:41:4: error: 
#error "Include <avr/io.h> instead of this file."
In file included from c:/meine 
programme/winavr-20071221/bin/../avr/include/avr/io.h:233,
                 from c:/meine 
programme/winavr-20071221/bin/../avr/include/avr/pgmspace.h:81,
                 from C:\Meine 
Programme\WinAVR-20071221\avr\include\compat/ina90.h:64,
                 from ../UART_Ringpuffer_Interruptgesteuert.c:10:


c:/meine 
programme/winavr-20071221/bin/../avr/include/avr/iom8515.h:47:4: error: 
#error "Attempt to include more than one <avr/ioXXX.h> file."


../UART_Ringpuffer_Interruptgesteuert.c:80: error: expected '=', ',', 
';', 'asm' or '__attribute__' before 'main'

../UART_Ringpuffer_Interruptgesteuert.c:119: error: '__vector_9' 
undeclared here (not in a function)

../UART_Ringpuffer_Interruptgesteuert.c:119: error: expected '=', ',', 
';', 'asm' or '__attribute__' before 'void'

../UART_Ringpuffer_Interruptgesteuert.c:136: error: '__vector_10' 
undeclared here (not in a function)

../UART_Ringpuffer_Interruptgesteuert.c:136: error: expected '=', ',', 
';', 'asm' or '__attribute__' before 'void'


Eigentlich wollte ich es mit einem ATm8515 testen, aber nachdem das 
Compilieren so schon nicht funktioniert.....

Ich verwende die neueste WinAVR Version mit neuestem AVR-Studio

Danke

von Falk B. (falk)


Lesenswert?

@ tester (Gast)

>ich wollte nachfolgendes Testprogramm aus einem Buch mal testen. Dabei
>spuckt der Compiler einige Fehlermeldungen aus:

Aus welchem Buch? Ist das für den AVR und den WinAVR geschrieben?
Nein, den ICCA90.

>#include <io8515.h>    // Register Definition fuer AT90S8515

Heisst beim WinAVR

1
#include <avr/io.h>    // Register Definition fuer AT90S8515


>#include <ina90.h>     // Intrinsic Funktionen fuer ICCA90

Gibts beim WinAVR nicht.


>void C_task main( void )

Ist auch nicht standardkonform.


>interrupt [UART_RX_vect] void UartRxIntHandler( void )

Interrupts werden beim WInAVR anders geschrieben.

>Ich verwende die neueste WinAVR Version mit neuestem AVR-Studio

Welche sind das? Zahlen? Ist aber egal, der Qulltext ist für einen 
anderen Compiler. Beispiele für den WinAVR gibts hier

AVR-GCC-Tutorial
Interrupt

MfG
Falk

von tester (Gast)


Lesenswert?

Das Buch heißt: "C für Mikrocontroller" von Burkhard Mann

Wer lesen kann ist klar im Vorteil, hat zwar mit AVR's zutun aber eben 
nicht mit WinAVR. Hab einfach nur durchgeblättert und wollt gleich 
loslegen ;-)

Was kannst du für ein Buch empfehlen? Speziell für WinAVR + AVR-Studio.
So gut wie keine Grundkenntnisse vorhanden.


thx

von STK500-Besitzer (Gast)


Lesenswert?


von Falk B. (falk)


Lesenswert?

@ STK500-Besitzer (Gast)

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

>Buch muß nicht unbedingt sein...

DOCH! Für die Grundlagen von C. Die werden hier nämlich nicht erklärt.

@ tester (Gast)

>Was kannst du für ein Buch empfehlen? Speziell für WinAVR + AVR-Studio.

Gibts keins, aber das Tutorial hier ist sehr gut und zu 99% ausreichend. 
Das restlich 1% klärt das Forum.

>So gut wie keine Grundkenntnisse vorhanden.

Dann besorg dir auf JEDEN Fall ein Grundlagenbuch zu C. "Programmieren 
lernen mit C", oder der klassische Kernigham & Ritchie.


MfG
Falk

von STK500-Besitzer (Gast)


Lesenswert?

>DOCH! Für die Grundlagen von C. Die werden hier nämlich nicht erklärt.

"Es muß kein spezielles AVR-Buch sein." (war der Sinn hinter der 
Aussage)

von tester (Gast)


Lesenswert?

Ok, danke erstmal

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.