U(S)ART empfängt nicht

Gast #420371
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
Gast #420373
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren