ATmega128 beide UART benutzen

OP #517366
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!
OP #517664
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!
OP #520004
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!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.