Hallo, bin ein µC - Neuling, möchte ASCII zeichen an ein Terminalprogramm am PC mit Hilfe der UART schicken. Wäre Hilfreich, wenn jemand ein kurzes Beispiel, wenn möglich in C bringen könnte. Habe schoin verschiedenste Beispiele ausprobiert, doch ohne Erfolg. Das letzte Beispiel war folgendes: ______________________________________________________________________ #include <avr/io.h> #include <avr/interrupt.h> #define FOSC 1843200// Clock Speed #define BAUD 9600 #define MYUBRR FOSC/16/BAUD-1 const int baud = 51; //wegen 8MhZ Clock const char* data = "Hallo\0"; //Char-Pointer int main() { //test DDRC = 0x01; --Kontrollregister //PORTC = 0xFF; USART_Init (baud); while(1) { USART_Transmit(data); } //USART_receive(); sei(); //... die Interrupts abfangen } void USART_Init(int baud) { /* Set baud rate */ UBRRL = (char)baud; /* Enable transmitter */ UCSRB = (1<<TXEN); UCSRB = (1<<UDRIE); //KO: entweder UDRIE oder TXIE /* Set frame format: asynchron, 1 stop - bit, 8 data - bit */ UCSRC = (0<<URSEL)|(0<<USBS)|(2<<UCSZ0); //KO: Frameformat im Prinzip egal, muss aber mit Gegenseite übereinstimmen } // transmit void USART_Transmit(const char* data ) { /* Wait for empty transmit buffer */ while ( !( UCSRA & (1<<UDRE)) ); /* Put data into buffer, sends the data */ UDR = data[0]; } // C:\WinAVR-20100110\avr\include\avr\iom64.h ISR(USART0_TX_vect) { } // receive void USART_receive() { //init receive UCSRB = (1<<RXEN); //wait for unread data in the register while(!(UCSRA & (1<<RXC))); return UDR; } __________________________________________________________________ Komme nicht weiter, wäre echt super, wenn mir jemand helfen könnte, danke. MfG Vali1991
Sepp Horst schrieb: > Habe schoin verschiedenste > Beispiele ausprobiert, doch ohne Erfolg. Das letzte Beispiel war > folgendes: Da hilft nur noch "Alles markieren" und Strg + x. Dann löten wir einen Draht am RS232-Stecker zwischen Pin 2 und Pin 3 und du kannst mit dem Terminal schreiben und die Zeichen werden gleich wieder empfangen. Schon mal das erste Erfolgserlebnis. Zuerst nimmt man sich das Datenblatt vor und guckt sich an, welche Register eingestellt werden müssen. Das ist beim 644 gar nicht so dramatisch: #ifndef F_CPU #define F_CPU 8000000UL //(!)wichtig ist das UL(!) //sonst verrechnet sich der Compiler #endif #define Baud 19200 UCSR0B |= (1 << RXCIE0) | (1 << TXCIE0) | (1 <<RXEN0) | (1 << TXEN0); UBR0 = (F_CPU+_Baud*8)/(_Baud*16)-1; sei(); Jetzt bauchen wir noch 2 Interrupt-Handler: ISR(USART0_RX_vect) { //Und hier löten wir jetzt den Draht ein char nUdr = UDR0; UDR0 = nUdr; } ISR(USART0_TX_vect) { //Die macht erstmal gar nichts } Wenn du jetzt mit dem Terminal deines Vertrauens, ohne lokales Echo, schreiben kannst, steht deine Verbindung. Das ist schon mal die halbe Miete. Wenn das funktioniert, lässt du ihn selber was senden: void Senddata(char* data) { int nInd=0; while(data[nInd]) { while (UCSR0A & (1 << TXC0)){} UDR0 = data[nInd++]; } } Senddata("Hello World"); mfg.
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.