Hi,
ich habe noch keine besonders große Erfahrung mit AVRs. Jedoch hab ich
mir vorgenommen die Basics zu lernen und nachher ein X-Ufo zu komplett
selbst basteln.
PWM habe ich schon hingekriegt. Jetzt hänge ich aber im Moment am USART:
Der AVR kann Daten an den PC senden und diese kann ich mit Minicom unter
Linux empfangen.
Jedoch kann ich keine Daten mit dem PC an den AVR senden, ich drücke
Tasten, minicom zeigt mir die Zeichen im Terminal an, aber der AVR
empfängt nichts :?
Als Format habe ich 57600 8N2 eingestellt.
Ich verwende 2 verschiedene Funktionen zum Senden u.A. aus dem Tutorial
und aus den Atmel Datenblättern übernommen.
1 | void USART_Init( unsigned int ubrr)
|
2 | {
|
3 | /*Set baud rate */
|
4 | UBRR0H = (unsigned char)(ubrr>>8);
|
5 | UBRR0L = (unsigned char)ubrr;
|
6 | /*Enable receiver and transmitter */
|
7 | UCSR0B = (1<<RXEN0)|(1<<TXEN0) | (1<<RXCIE0);
|
8 | /* Set frame format: 8data, 2stop bit */
|
9 | UCSR0C = (1<<USBS0)|(3<<UCSZ00);
|
10 | }
|
11 |
|
12 | void USART_Transmit( unsigned char data )
|
13 | {
|
14 | /* Wait for empty transmit buffer */
|
15 | while ( !( UCSR0A & (1<<UDRE0)) );
|
16 | /* Put data into buffer, sends the data */
|
17 | UDR0 = data;
|
18 | }
|
19 |
|
20 | void sendUart(char* cmd)
|
21 | {
|
22 | do
|
23 | {
|
24 | while (!(UCSR0A & (1<<UDRE0))) {} // Warten bis man senden kann
|
25 | UDR0 = *cmd++; // senden und zum nächsten zeichen wechseln
|
26 | }
|
27 | while(*cmd); // so lange bis das ende erreicht ist
|
28 | }
|
Interrupts habe ich global aktiviert mit sei();
Hier der Interruptvektor, jedoch wird er scheibar gar nicht aufgerufen:
1 | ISR(USART_RX_vect) // rx interrupt
|
2 | {
|
3 | char data = UDR0;
|
4 | sendUart("Zeichen empfangen : ");
|
5 | USART_Transmit(data);
|
6 | sendUart("\n\r");
|
7 | }
|
Hat jemand vielleicht eine Idee was noch fehlt oder was ich generell mit
minicom falsch mache ?
Conker