mikrocontroller.net

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


Autor: Jörn Ahrens (joerna)
Datum:

Bewertung
0 lesenswert
nicht 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!!
#define   F_CPU 8000000UL          // MP-Takt
#include  <avr/io.h>
#include  <stdio.h>
#include  <stdlib.h>
#include   <inttypes.h>
#include   <avr/interrupt.h>
#include   <avr/wdt.h>


#define BAUD     19200UL          //Baundrate definieren

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



char         out[15];
int     in     =  1;
int     Zahl   = 15;
long int   i    =  1;
int     n     =  1;
int     Daten   =100;


// Ausgaberoutinen

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

  UDR = c;
  return 0;
}

int uart_puts( char* str )
{
  while( *str )
    uart_putc( *str++ );
  return 0;
}

int wait()
{
for (i=0;i<200000;)
  {
  i=i+1;
  }
}

//  Main-Funktion
int main (void) 
{

//  Programm

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

  TCCR1A = (1 << WGM11) | (1 << WGM10) | ( 1 << COM1A1);
  TCCR1B =  ( 1 << CS11) ;
  OCR1A = 0;

  sei();   
  DDRB  = 0xFF;

  for (;;) 
  {
    while (!(UCSRA & (1<<UDRE)));
      UDR   = Daten;
    OCR1A   = Daten;
    wait();
    Daten=Daten+20;
  }      
}



ISR(SIG_USART_RECV)
{
Daten = UDR;
}



Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Jörn Ahrens (joerna)
Datum:

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

Autor: Jörn Ahrens (joerna)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sagt dein Debugger?

Autor: philipp_burch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UDR   = Daten;

Vielleicht solltest du UDR lesen anstatt zu beschreiben?

Autor: philipp_burch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.