Forum: Mikrocontroller und Digitale Elektronik ATmega128 beide UART benutzen


von Jan F. (eisbaer)


Lesenswert?

Hallo,

ich versuche beide seriellen Schnittstellen meines ATmega128(L) zu 
benutzen. Ich entwickele den C-Code unter CodeVisionAVR Version 1.25.2. 
Bei der Erstellung des Projektes wurden schon viele Funktionen von der 
Entwicklungsumgebung vordefiniert unter anderem auch diese drei:

//********************************************************************** 
*************************
// Get a character from the USART0 Receiver buffer
#ifndef DEBUG_TERMINAL_IO
#define ALTERNATE_GETCHAR
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif
//********************************************************************** 
*************************
// Get a character from the USART1 Receiver buffer
#pragma used+
char getchar1(void)
{
char data;
while (rx_counter1==0);
data=rx_buffer1[rx_rd_index1];
if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
#asm("cli")
--rx_counter1;
#asm("sei")
return data;
}
#pragma used-
//********************************************************************** 
*************************
// Write a character to the USART1 Transmitter
#pragma used+
void putchar1(char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}
#pragma used-


Ausgabe und Empfang von Daten über die erste serielle Schnittstelle 
funktioniert sehr gut. Ich verwende printf() für die Ausgabe und 
getchar() zum Empfangen. Nun weiß ich allerdings nicht, wie ich Daten 
auf der zweiten seriellen Schnitstelle empfangen bzw. senden kann. Hatte 
da folgendes versucht:

//Bei der Deklaration der globalen Variablen:
FILE* dev_uart1;

//Bei der Initialisierung des Microcontrollers bevor das Hauptprogramm 
//in die while-Schleife geht:
dev_uart1 = fdevopen((void *) putchar1,(void *) getchar1);

//und dann später im Hauptprogramm:
fprintf(dev_uart1, "Hello World!\r\n");

Leider läßt sich das ganze nicht einmal kompilieren, da die Funktion 
fprintf() nicht bekannt ist. Bei meinem Compiler für den PC ist die in 
der stdio.h mit drin, aber in der stdio.h von CodeVisionAVR steht die 
nicht drin. Hat da jemand einen Tipp, wo ich die finden kann? Oder hat 
jemand einen Tipp, wie man auf einem anderen (eventuell auch 
eleganteren) Weg, wie man sowohl auf der ersten als auch auf der zweiten 
seriellen Schnittstelle senden und empfangen kann?

Vielen Dank, Jan!

von Clifford (Gast)


Lesenswert?

Hast du das Mega103 Kompatibilitäts-Fusebit umprogrammiert?
http://www.wiki.elektronik-projekt.de/index.php/AVR_Fusebits_Tutorial#Compatibility_Bits

Ein neuer Mega128 läuft als Mega103 und kennt nur einen UART

von Jan F. (eisbaer)


Lesenswert?

Danke für den Tipp,

aber ich habe die Fuses so gesetzt, dass der AVR nicht im ATmega103 
Compatibity Mode betrieben wird.
Ein Kollege meinte, dass ich besser, eine Routine schreiben soll, die 
char für char mit putchar1() auf der zweiten seriellen Schnittstelle 
ausgibt. Werde ich jetzt mal probieren und Bescheid geben, wenn es dann 
klappt!

Jan!

von Dietmar (Gast)


Lesenswert?

und?
klappt?

von Jan F. (eisbaer)


Lesenswert?

Es klappt, wenn auch nur bedingt zufrieden stellend. Die bequeme 
Funktion des printf()-Befehls, bei der man Strings, Integers usw. 
beliebig aneinander reihen kann, habe ich nicht implementieren können, 
sondern nur ein einfach Ausgabe eines Strings. ich muss also vorher "von 
Hand" den String mit Integers kombinieren, wenn ich diese ausgeben 
lassen will.

Was ich gemacht habe? Ich habe nun eine Funktion definiert:

printf_uart1(char *str)
{
   int i, j;
   i = strlen(str);
   for(j=0; j< i; j++)
   {
      putchar1(str[j]);
   }
}

Immerhin reicht es für Debug-Ausgaben auf der zweiten seriellen 
Schnittstelle, damit man auch ohne Oszilloskop sehen kann, was zwischen 
Microcontroller und GSM-Modul passiert.

Jan!

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.