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!
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.