printf mit Atmega128 über uart0

Gast #75609
Lesenswert?
• ▲
▼
Ich versuche mit Printf_P Strings über den Uart auszugeben, hatte damit
aber bislang nur wenig Erfolg.
Das Ganze soll interruptgesteuert und gepuffert ablaufen.
Hoffentlich kann mir hier jemand noch einen Rat geben wo der Fehler
steckt...

Ich benutze WinAVR-20030913 und AVR Studio 4.07 und folgenden Code:


#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <avr/pgmspace.h>

#define UART_BUF_SIZE    40

char character = 'H';
char string[]  = "ello World!";

/* uart globals */
volatile unsigned char uart_txd_buf_cnt;
volatile unsigned char *uart_txd_in_ptr, *uart_txd_out_ptr;
volatile unsigned char uart_txd_buffer[UART_BUF_SIZE];



SIGNAL(SIG_UART0_DATA)
/* signal handler for uart data buffer empty interrupt */
{
    if (uart_txd_buf_cnt > 0) {
        outp(*uart_txd_out_ptr, UDR0);          /* write byte to data
buffer */
        if (++uart_txd_out_ptr >= uart_txd_buffer + UART_BUF_SIZE) /*
Pointer wrapping */
            uart_txd_out_ptr = uart_txd_buffer;
        if(--uart_txd_buf_cnt == 0)             /* if buffer is empty:
*/
            cbi(UCSR0B, UDRIE0);                /* disable UDRIE int
*/
    }
}

int uart_putchar(char c)
{
    if (uart_txd_buf_cnt<UART_BUF_SIZE) {
        cli();
        uart_txd_buf_cnt++;
        *uart_txd_in_ptr = c;                   /* put character into
buffer */
        if (++uart_txd_in_ptr >= uart_txd_buffer + UART_BUF_SIZE) /*
pointer wrapping */
            uart_txd_in_ptr = uart_txd_buffer;
        sbi(UCSR0B, UDRIE0);                    /* enable UDRIE int */
        sei();
        return 0;
    }
    else
        return 1;                             /* buffer is full */
}

unsigned char uart_putstr(char s[])
{
    char  *c  = s;

  while (PRG_RDB(c))
        if (0 == uart_putchar(PRG_RDB(c)))
            c++;

    return 0;
}

int main(void)
{

/* initialize uart */
  // USART initialization
  // Communication Parameters: 8 Data, 1 Stop, No Parity
  // USART Receiver: On
  // USART Transmitter: On
  // USART Baud rate: 38400
  UCSR0A=0x00;
  UCSR0B=((1<<RXCIE) | (1<<RXEN) | (1<<TXEN));
  // USART Mode: Asynchronous
  UCSR0C=0x86;
  UBRR0L=0x19;
  UBRR0H=0x00;

    uart_txd_in_ptr  = uart_txd_out_ptr = uart_txd_buffer;
    uart_txd_buf_cnt = 0;


fdevopen(uart_putchar,NULL,0);
sei();

printf_P(character);
printf_P(string);


while (1) { };

return 0;
}
Angehängte Dateien:
Gast #75610
Lesenswert?
• ▲
▼
Ähem, was ist eigentlich Dein Problem dabei?

Und: a) simulierst Du nur, oder b) testest Du an echter Hardware?

Wenn a), womit dann?  Falls AVR Studio 4.07, dann bitte upgrade auf
4.08beta.

Wenn b), hast Du daran gedacht, daß USART0 auf dem ATmega128 mit der
ISP-Schnittstelle kollidiert?
Gast #75611
Lesenswert?
• ▲
▼
Ich arbeite jetzt mit AVR Studio Version 4.08 Build 291 auf Win2000. Mit
dem JTAG ICE lade ich das Programm in den Flash Speicher und lasse es
dort mit dem JTAG ICE laufen.

Seit ich das neue AVR Studio verwende funktioniert die Stringausgabe
aus dem Flash Speicher. Ich musste nur noch diese Zeilen ändern:

char character PROGMEM = 'H';
char string[] PROGMEM = "ello World!";
...
printf_P(PSTR("%c"),character);

Vielen Dank
Heiko

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.