www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega128 beide UART benutzen


Autor: Jan Förster (eisbaer)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Clifford (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du das Mega103 Kompatibilitäts-Fusebit umprogrammiert?
http://www.wiki.elektronik-projekt.de/index.php/AV...

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

Autor: Jan Förster (eisbaer)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und?
klappt?

Autor: Jan Förster (eisbaer)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.