Forum: Mikrocontroller und Digitale Elektronik U(S)ART empfängt nicht


von gast (Gast)


Lesenswert?

Hallo! Hier mal ein simples U(S)ART-Programm zum testen. Seitdem ich es
auf RX-Seite auf Interrupts umgebaut habe, empfängt es nichts mehr, es
geht ja noch nicht mal in die ISR. vorher mit "Warten auf
erfolgreichen Empfang" ging es.

mc ist atmega8.
1
#include <avr\io.h>
2
#include <avr\interrupt.h>
3
#define F_CPU 3686400
4
#define UART_BAUD_RATE 9600
5
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
6
7
void cominit(void);
8
void send(char val);
9
10
int main(void) {
11
sei();
12
DDRC=0xff;
13
PORTC=0x00;
14
15
16
cominit();
17
18
send('s');
19
20
  
21
PORTC++;
22
23
24
  for(;;) {
25
  
26
27
  
28
  
29
  }
30
31
}
32
33
34
35
void cominit() {
36
37
38
  UCSRB |= (1<<TXEN);      // UART TX einschalten
39
  UCSRC |= (1<<URSEL)|(3<<UCSZ0);  // Asynchron 8N1 
40
  UCSRB |= ( 1 << RXEN ); //rx anschalten
41
42
  UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
43
  UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );
44
45
}
46
47
void send(char val) {
48
49
50
  UDR = val; 
51
  while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich           
52
       */
53
                       /* schreibt das Zeichen x auf die Schnittstelle
54
*/
55
  
56
}
57
58
59
ISR (USART_RXC_vect) {
60
  cli();
61
  unsigned char recv;
62
  
63
  recv=UDR;         //Zeichen vom Register holen
64
  send(recv);         //Zeichen zurücksenden
65
  PORTC++;
66
  sei();
67
}

danke im voraus

von A.K. (Gast)


Lesenswert?

Könnte sich lohnen, den RX Interrupt in der UART freizugeben.

Die cli/sei in der Interrupt Routine sind nicht nur überflüssig,
sondern nachgerade gefährlich.

von gast (Gast)


Lesenswert?

Oh, wusste gar nicht dass man das machen muss =).

Okay,
1
UCSRB |=(1<<TXCIE); //interrupt
, hinzugefügt

aber noch immer keine funktion des programms, er sendet nur lauter
"s" weil er anscheinend immer wieder in main() reingeht.

von gast (Gast)


Lesenswert?

ich sollte schlafen gehen, mit RX... gehts natürlich

von A.K. (Gast)


Lesenswert?

Welcher µC? Nicht zufällig ein Mega128 mit 103-er Fuse?

von gast (Gast)


Lesenswert?

mega 8;).

Ne, fehler war: ich hatte versehentlich den TXI aktiviert, anstelle des
RXI..

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
Noch kein Account? Hier anmelden.