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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.