USART ich seh den Fehler nicht

Gast #2006557
Lesenswert?

HAllo Leute
ich versuch grad ein Zeichen das ich sende mir wieder vom Controller 
zurück senden zu lassen.
Aber irgendwie funktioniert meine Routine nicht und ich seh den Fehler 
nicht.
Interrupts sind aktiviert.
Es soll mit 9600 und 8N1 kommuniziert werden.
Die Bits UCSZ! und UCSZ0 habe als initialvalue ja bereits 1.
Also sollte das stimmen. Abe weis trotzdem nicht weiter.
Die CPU ist ein Amtega 32.
Wo steckt der Fehler? KAnn eigentlich nur was an den Registern sein aber 
hab nix gefunden beim Durchgehen.
1
#include <stdint.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
#include <stdlib.h>
5
#include <string.h> // Für "strcmp"
6

7
#define Takt 8000000
8
#define BAUD1 9600        // Baudrate
9

10
#define UBRR_VAL1 ((Takt/16/BAUD1)-1)   // Schnittstelle BUS
11

12
unsigned char test;
13
int empfangen;
14
ISR(USART_RXC_vect)
15
{
16
  test = UDR;
17
  empfangen = 1;
18
}
19

20

21

22
ISR (TIMER0_OVF_vect)
23
{
24
  PORTB |= (1 << PB0);
25
}
26

27
ISR (TIMER0_COMP_vect)
28
{
29
  PORTB &= ~(1<< PB0);
30
}
31

32
int main(void)
33
{
34

35
  UCSRB |= (1<<RXEN);
36
  UCSRB |= (1<<TXEN);                // USART1 TX einschalten
37
  UCSRB |= (1<<RXCIE);
38

39
  UCSRC |= (1<<URSEL);    // USART1 Asynchron 8N1
40
  UBRRH = UBRR_VAL1 >> 8;
41
  UBRRL = UBRR_VAL1;
42

43

44
  sei();
45
  UDR ='g';
46
/*
47
  DDRB = 0xFF;
48
  TIMSK |= (1 << TOIE0) | (1 << OCIE0);
49
  OCR0 = 0x80;
50

51
  PORTB |= (1 <<PB0);
52
  TCCR0 |= (1 << CS00)| (1 << CS02);
53
  */
54
  if (empfangen == 1 )
55
  {
56
    while ( !( UCSRA & (1<<UDRE)) )
57
        ;
58
    UDR = test;
59
    UDR = 'f';
60
    empfangen = 0;
61
  }
62
  while (1);
63
  return 0;
64
}
#2006562
Lesenswert?

Ähm
1
  if (empfangen == 1 )
2
  {
3
    while ( !( UCSRA & (1<<UDRE)) )
4
        ;
5
    UDR = test;
6
    UDR = 'f';
7
    empfangen = 0;
8
  }
9
  while (1);

Du solltest das Abfragen, ob ein Zeichen eingetroffen ist, innerhalb der 
Hauptschleife machen. So schnell kannst du ein Zeichen gar nicht 
schicken, dass es in den paar µs detektiert wird, die du dem programm 
Zeit gibst, ehe es sich in der Endlosschleife fängt und nichts mehr tut.

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