Forum: Mikrocontroller und Digitale Elektronik Absturz beim RS-232 empfang (mega8)


von Jörn A. (joerna)


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
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Hast du Daten schon mal volatile definiert? Was soll das Programm machen 
bzw. woran stellst du "funktioniert wunderbar"/"bleibt hängt" fest?

von Jörn A. (joerna)


Lesenswert?

also am PMW hängt ne LED. per RS-232 soll ein Startwert immer neu 
definiert werden und dann jeweils pro durchlauf gesteigert...

von Jörn A. (joerna)


Lesenswert?

das Problem ist, das er einfach stehen bleibt, wenn was an Daten 
rübergeht.

von Gast (Gast)


Lesenswert?

Was sagt dein Debugger?

von philipp_burch (Gast)


Lesenswert?

UDR   = Daten;

Vielleicht solltest du UDR lesen anstatt zu beschreiben?

von philipp_burch (Gast)


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.

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.