Forum: Compiler & IDEs Printf über uART 128 Resettet


von Marcus (Gast)


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???

von Peter (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> UCSR1B= ((1<<RXCIE)|(1<<RXEN) | (1<<TXEN));

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Marcus (Gast)


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

von Peter (Gast)


Lesenswert?

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

MfG Peter

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.