www.mikrocontroller.net

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

Autor: hans-jakob (Gast)
Datum: 06.05.2008 19:05

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: 06.05.2008 22:23

ist Deine Umschalttaste defekt?
Autor: STK500-Besitzer (Gast)
Datum: 07.05.2008 09:17

>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: 07.05.2008 10:10
Dateianhang: Terminal.JPG (42,6 KB, 99 Downloads)
preview image for Terminal.JPG

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: 07.05.2008 10:11

auch beim Compilieren funktioniert alles eiwandfrei!
Autor: Timmo H. (masterfx)
Datum: 07.05.2008 10:22

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: 07.05.2008 10:36

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: 07.05.2008 10:48

>Das ist keine 3, sondern ein <ETX>.
g stimmt natürlich gegenkopfhau
Autor: hans-jakob (Gast)
Datum: 07.05.2008 12:00
Dateianhang: linkeroptions.PNG (18,1 KB, 30 Downloads)
preview image for linkeroptions.PNG

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: 07.05.2008 12:58

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: 07.05.2008 18:57

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: 07.05.2008 19:16
Dateianhang: Makefile (2 KB, 14 Downloads)

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: 15.05.2008 16:15

***********************************************************************
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: 15.05.2008 19:28

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

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net