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???
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
> UCSR1B= ((1<<RXCIE)|(1<<RXEN) | (1<<TXEN));
Und du hast auch wirklich einen Interrupthandler für
USART0_UDRE_vect in deinem Code?
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.