Forum: Mikrocontroller und Digitale Elektronik USART ich seh den Fehler nicht


von Christian (Gast)


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
}

von Karl H. (kbuchegg)


Lesenswert?

1
volatile unsigned char test;
2
volatile int empfangen;

von Karl H. (kbuchegg)


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.

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.