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.