mikrocontroller.net

Forum: Compiler & IDEs Printf über uART 128 Resettet


Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ein eigenartiges Problem bei meinen 128 iger.

wenn ich mit printf("hallo");
an die Uart sende stürt er beim zweiten senden ab resettet sich.

in der main am anfang mache ich folgendes

fdevopen (uart_putchar, NULL);
int baud;
baud=cpuclock/((4800*16L)-1);
cli();
init_rs232(baud);
sei();
printf("test1");


dann initialisiere ich meine zwei UARTS.

void init_rs232(unsigned int baud)
{
UBRR1H= (unsigned char)(baud>>8);
UBRR1L = (unsigned char) baud;


UCSR1B= ((1<<RXCIE)|(1<<RXEN) | (1<<TXEN));
CSR0C = ((0<<UMSEL) |(0<<UPM1) |(0<<UPM0)
|(0<<USBS)|(1<<UCSZ1)|  (1<<UCSZ0));

}

int uart_putchar (char c)
{
        //Warten solange bis Zeichen gesendet wurde
  loop_until_bit_is_set(UCSR1A, UDRE);
  UDR1 = c;
  return (0);
}


Das test 1 wird übertragen aber alles danach stürtz mir der 128 iger
ab.

Habe ich einen fehler drin???

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nehme mal an, Du initialisierst die UART und fdevopen() bevor Du
printf() verwendest..!?

Wäre sicherlich hilfreich, wenn Du den gesammten Code postest!

Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> UCSR1B= ((1<<RXCIE)|(1<<RXEN) | (1<<TXEN));

Und du hast auch wirklich einen Interrupthandler für
USART0_UDRE_vect in deinem Code?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, USART1_RX_vect natürlich.  Der muss auch zwingend UDR1
lesen, sonst wird er nach Verlassen sofort wieder gerufen und
legt damit effektiv die CPU lahm.

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja habe ich

SIGNAL(SIG_UART1_RECV)
{
pcbuffer = UDR1;
if(pcgoflag==1)
{
if(pcbuffer!=13)
{
frompc[pt]=pcbuffer;
pt++;
}
else
{
frompc[pt]='\0';
pt=0;
auswerten_pckommando(&frompc[0]);
}
}
}

Ich habe es jetzt anders gemacht

so

void send_UART(char *s)
{
 while (*s)
    {   /* so lange *s != '\0' also ungleich dem
"String-Endezeichen" */
      loop_until_bit_is_set(UCSR1A, UDRE);
 UDR1=(*s);
        s++;
    }


}

so gehts auf jeden fall prima.

Danke

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit der aktuellen avr_libc-1.4.4 solltest Du ISR(USART1_RX_vect)anstelle
von SIGNAL(SIG_UART1_RECV) verwenden!

MfG Peter

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.