mikrocontroller.net

Forum: Compiler & IDEs printf mit Atmega128 über uart0


Autor: Heiko Weinmann (Gast)
Datum:
Angehängte Dateien:

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

Autor: Joerg Wunsch (Gast)
Datum:

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

Autor: Heiko Weinmann (Gast)
Datum:

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

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe auch kleine Probleme mit meinem Uart am Mega128 - ist das oben
der komplette Quelltext? - kann ich das zum Test auch benutzen.

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.