mikrocontroller.net

Forum: Compiler & IDEs printf (" \n"); geht printf (" %s, %d \n", string, int); geht nicht


Autor: hans-jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!


ich versuche in den letzten tagen das programm von manni 
TWI_Master-Slave_C_Functions
Beitrag "AVR TWI Master und Slave Funtionen in C" zum laufen zu bringen!

ich benutzte einen atmega16 als slave und einen atmega 2561 als master!
ich habe die statusbytes entsprechend umbenannt, compilieren und flashen 
funktioniert.

zum deguggen lasse ich mir über printf funktion texte ausgeben!
printf ("jetzt kommt die zahl\n"); funktioniert eiwandfrei!

Allerdings streikt bei mir die printf-funktion, sobald ich werte 
ausgeben möchte zbsp: int test1=3; printf ("jetzt kommt die zahl:  %d 
\n", test1);

mein programm bzw meine terminals für die com schnittstelle hängen sich 
dann immer auf!

------------------------------------------------------------------------ 
--
ich verwende die aktuelle avr studio 4.14 version und das im moment 
neuesete winavr.

in anderen foren habe ich gelesen dass ich über die configurtion options 
noch die bibliotheken lbprintf_flt.a und libprintf_min.a

und bei den custom options beim linker die -Wl,-u,vfprintf und 
-lprintf_flt miteinfügen soll.

allerdings keine verbesserung oder verschlechterung!

kennst jemand  den Fehler?

vielen dank
hans-jakob

Autor: Wolfgang-G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist Deine Umschalttaste defekt?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Allerdings streikt bei mir die printf-funktion, sobald ich werte
>ausgeben möchte

Wie äussert sich das? Irgendwie mußt du das ja feststellen.
Wird bei der printf-Zeiel überhaupt etwas ausgegeben, oder lässt sie 
sich schon nicht compilieren?

Autor: hans-jakob (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
also ich habe nun mal einen screen shot des terminals gemacht! unten der 
dazugehörige Quellcode:

char help='a';
RS232_Init ();
  printf ("RS232_Init  -press a \n");

  while(help != RS232_GetByte() )
  { }

  printf ("Textausgabe funktioniert \n");

  while(help != RS232_GetByte() )
  { }

  printf ("Werteausgabe funktioniert nicht %d  \n" , test1);

  while(help != RS232_GetByte() )
  { }


------------------------------------------------------------------------ 
---
ich habe mal meine Umstelltaste geprüft, allerdinge keinen Fehler 
gefunden.

Autor: hans-jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch beim Compilieren funktioniert alles eiwandfrei!

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die "3" aus test1 scheint er ja auszugeben, nur den Text nicht, der 
davor steht. Kann es sein, dass dein RAM irgendwie voll ist mit text? 
Also wenn dein Programm sehr viel Text hat, solltest du diesen im 
Flash-Speicher lassen und auch von dort ausgeben (siehe 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu... 
). Ich persönlich verzichte auch immer auf printf etc. weils einfach den 
ganzen code so aufbläht.

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

Bewertung
0 lesenswert
nicht lesenswert
Timmo H. wrote:

> Also die "3" aus test1 scheint er ja auszugeben

Das ist keine 3, sondern ein <ETX>.

Irgendwie scheint das printf() in der benutzten Bibliothek kaputt zu
sein, oder falsche Bibliothek, weiß der Geier.  Die ersten beiden
printf()s wird der Compiler vermutlich in puts() umwandeln (was aus
seiner Sicht eine Optimierung ist, da puts() ja schneller geht als
printf()).

Wie sehen denn die genauen Compiler- und Linker-Kommandozeilen aus?

Übrigens: Bildformate  Screenshot als JPG sieht einfach grässlich
aus.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das ist keine 3, sondern ein <ETX>.
g stimmt natürlich gegenkopfhau

Autor: hans-jakob (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
im Quellcode der main funktion werden folgende Funktionen eingebunden:

#include <stdio.h>
#include <avr/interrupt.h>

#include "General.h" // cpu usw..

#include "RS232.h"   // RS232_Init(), RS232_putchar(),...

#include "Delay.h"   // zeitverzögerung für die verlangsammung des HPT 
prog

#include "TWI_Master.h" //twi master funktioen

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

Bewertung
0 lesenswert
nicht lesenswert
Nee, bitte gib mir mal die Kommandozeilen, die wirklich aufgerufen
werden.  Muss doch irgendwo in einem Message-Fenster zu finden sein.

Lieber auch als Text statt als Bildschirmschüsse.

Alternativ das generierte Makefile, dann kann ich es auch 
nachvollziehen.

Autor: hans-jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also hier mal der komplette Code!
wie gesagt 
http://www.mikrocontroller.net/articles/FAQ#Aktivi...
ist auch beachtet worden!!

#include <avr/io.h>
#include <stdio.h>

void uart_init(void);
int uart_putchar(char c, FILE *stream);

static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, 
_FDEV_SETUP_WRITE );

void uart_init(void)
{

#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 
16.000.000"
#define F_CPU 16000000L    //! Systemtakt in Hz, das L am Ende ist 
wichtig, NICHT UL verwenden!
#endif

#define BAUD 9600L          //! BAUDrate, das L am Ende ist wichtig, 
NICHT UL verwenden!

//! Berechnungen für BAUDrate
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale BAUDrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille

#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
  #error Systematischer Fehler der BAUDrate grösser 1% und damit zu 
hoch!
#endif

// Hilfsmakro zur UBRR-Berechnung ("Formel" laut Datenblatt)
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)

    UCSR1B |= (1<<TXEN1) | (1<<RXEN1);    // UART TX und RX einschalten
    UCSR1C |= (1<<UMSEL11)|(3<<UCSZ10);    // Asynchron 8N1

    UBRR1H = (uint8_t)( UART_UBRR_CALC( BAUD, F_CPU ) >> 8 );
    UBRR1L = (uint8_t)UART_UBRR_CALC( BAUD, F_CPU );
}

int uart_putchar( char c, FILE *stream )
{
    if( c == '\n' )
        uart_putchar( '\r', stream );

    //loop_until_bit_is_set( UCSR1A, UDRE1 );

  do
  {}
  while (!(UCSR1A & (1 << UDRE1 ) ) );

    UDR1 = c;
    return 0;
}

int main(void)
{
    uart_init();
    stdout = &mystdout;
  //char help='a';
  int Test = 666;



    for(int i=0; i<20; i++)
    {
        printf( "Hello, world!\n" );
      printf( "Testzahl ist %d\n", i);
    }

  while(1)
  {}
    return 0;
}

Autor: hans-jakob (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
diese Fehlermeldungen beziehen sich auf den obigen Quellcode und sind 
die abgespeckte Version, von ganz oben. ffprintff- ist der Name des 
Projektes und der main-Datei. Also von den Namen bitte nicht abschrecken 
lassen.

so und hier die compiler meldungen:

avr-gcc.exe  -mmcu=atmega1281 -Wall -gdwarf-2 -std=gnu99 -Os 
-funsigned-char

-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT ffprintff.o 
-MF

dep/ffprintff.o.d  -c  ../ffprintff.c
Build succeeded with 0 Warnings...

und die strg+F7 Bemerkungen:

Build started 7.5.2008 at 19:11:30
avr-gcc.exe -mmcu=atmega1281 -Wl,-u,vfprintf -Wl,-Map=ffprintff.map 
ffprintff.o    -lm

-lprintf_flt  -o ffprintff.elf
avr-objcopy -O ihex -R .eeprom  ffprintff.elf ffprintff.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma

.eeprom=0 --no-change-warnings -O ihex ffprintff.elf ffprintff.eep || 
exit 0
avr-objdump -h -S ffprintff.elf > ffprintff.lss

AVR Memory Usage
----------------
Device: atmega1281

Program:    3598 bytes (2.7% Full)
(.text + .data + .bootloader)

Data:         52 bytes (0.6% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...

Autor: hans-jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
***********************************************************************
LÖSUNG LÖSUNG LÖSUNG LÖSUNG LÖSUNG LÖSUNG LÖSUNG LÖSUNG LÖSUNG LÖSUNG

Über den Disassembler bin ich das Programm nochmals im Simulationsmodus 
durchgeangen! hier habe ich dann festgestellt, dass im Assebmlercode 
falsche Sprünge waren.

Bsp. eine While schleife sollte nur um eins zurückspringen, anstatt 
wieder die while schleife zu wieder holen, wurde ein sprung von 0x21 
gemacht - und somit habe ich mich dann in eine anderen Funktion gefunden 
die eine Eingabe erwartet hat.

Hierbei wurde die Optimization: -Os verwendet!

Bei der Optimization: -O0 ist der Sprungbefehlfehler nicht aufgetaucht!

ich hatte die WinAVR version 20080402 und die AVR Studio 4.13 mit den 
SP2 , später dann die 4.14 verwendet.

------------------------------------------------------------------------ 
---

Mittlerweile ist die WinAvr version 20080512 veröffentlicht und eine 
Neuinstallation von AVR Studio 4.14 und WinAvr version 20080512
hat die ganze Sche ins Laufen gebracht!

vielen Dank für eure Mithilfe

Hans-Jakob

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

Bewertung
0 lesenswert
nicht lesenswert
Achso, jetzt weiß ich, worauf sich deine Mail bezog...

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.