Absturz beim RS-232 empfang (mega8)

OP #660666
Lesenswert?

Hy

habe folgendes Prog laufen und funktioniert auch wunderbar. nur sobald 
ich 8 Bit (Hterm in Hex) sende bleibt das Prog hängen. Kann mir jemand 
helfen. Finde einfach keinen Fehler!!
1
#define   F_CPU 8000000UL          // MP-Takt
2
#include  <avr/io.h>
3
#include  <stdio.h>
4
#include  <stdlib.h>
5
#include   <inttypes.h>
6
#include   <avr/interrupt.h>
7
#include   <avr/wdt.h>
8

9

10
#define BAUD     19200UL          //Baundrate definieren
11

12
#define UBRR_BAUD  ((F_CPU)/(16*(BAUD))-1)  //Autoberechnung bei Änderung des MP-Takt
13

14

15

16
char         out[15];
17
int     in     =  1;
18
int     Zahl   = 15;
19
long int   i    =  1;
20
int     n     =  1;
21
int     Daten   =100;
22

23

24
// Ausgaberoutinen
25

26
int uart_putc(unsigned char c)
27
{
28
  while (!(UCSRA & (1<<UDRE)));
29

30
  UDR = c;
31
  return 0;
32
}
33

34
int uart_puts( char* str )
35
{
36
  while( *str )
37
    uart_putc( *str++ );
38
  return 0;
39
}
40

41
int wait()
42
{
43
for (i=0;i<200000;)
44
  {
45
  i=i+1;
46
  }
47
}
48

49
//  Main-Funktion
50
int main (void) 
51
{
52

53
//  Programm
54

55
// RS232 aktivieren  
56
  UCSRB   |= (1 << TXEN) | ( 1 << RXEN ) | ( 1 << RXCIE ) ;          // UART TX, RX einschalten
57
   UCSRC   |= ( 1 << URSEL ) | ( 1<<UCSZ1 ) | ( 1<<UCSZ0 ) | ( 1<<UPM1 );    // Asynchron 8N1, Parity even
58
   UBRRH  = (uint8_t) (UBRR_BAUD>>8);        // USART Baud
59
    UBRRL  = (uint8_t) UBRR_BAUD;
60

61
  TCCR1A = (1 << WGM11) | (1 << WGM10) | ( 1 << COM1A1);
62
  TCCR1B =  ( 1 << CS11) ;
63
  OCR1A = 0;
64

65
  sei();   
66
  DDRB  = 0xFF;
67

68
  for (;;) 
69
  {
70
    while (!(UCSRA & (1<<UDRE)));
71
      UDR   = Daten;
72
    OCR1A   = Daten;
73
    wait();
74
    Daten=Daten+20;
75
  }      
76
}
77

78

79

80
ISR(SIG_USART_RECV)
81
{
82
Daten = UDR;
83
}
Gast #661118
Lesenswert?

Ach sorry, hatte den Interrupt-Handler übersehen. Da muss Daten auf 
jeden Fall erstmal als "volatile" deklariert werden, sonst werden dessen 
Zugriffe wohl wegoptimiert.
Besser wär's aber, du würdest OCR1A direkt im Interrupt auf den Wert 
setzen (OCR1A = UDR) und in der Mainloop jeweils erhöhen (OCR1A += 20). 
Dann könntest du noch
#include <util/delay.h>
hinzufügen und anstatt deiner selbstgebastelten Warteschleife (Die 
möglicherweise auch wegoptimiert wird), _delay_ms(10) oder so verwenden.

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