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


von hans-jakob (Gast)


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

von Wolfgang-G (Gast)


Lesenswert?

ist Deine Umschalttaste defekt?

von STK500-Besitzer (Gast)


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?

von hans-jakob (Gast)


Angehängte Dateien:

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.

von hans-jakob (Gast)


Lesenswert?

auch beim Compilieren funktioniert alles eiwandfrei!

von Timmo H. (masterfx)


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-Tutorial#Array_aus_Zeichenketten_im_Flash-Speicher 
). Ich persönlich verzichte auch immer auf printf etc. weils einfach den 
ganzen code so aufbläht.

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


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.

von Timmo H. (masterfx)


Lesenswert?

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

von hans-jakob (Gast)


Angehängte Dateien:

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

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


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.

von hans-jakob (Gast)


Lesenswert?

Also hier mal der komplette Code!
wie gesagt 
http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio
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;
}

von hans-jakob (Gast)


Angehängte Dateien:

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

von hans-jakob (Gast)


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

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


Lesenswert?

Achso, jetzt weiß ich, worauf sich deine Mail bezog...

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.