- 12V Akku mit 280 Ah bauen         
Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte
Ergebnis 31 bis 40 von 59

Thema: ASURO-Lottozahlen

  1. #31
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Anzeige

    LiFePo4 Akku selber bauen - Video
    So M1.R, nun habe ich den Fehler nachstellen können.

    Es fehlt tatsächlich die Mathe-Funktion fmod().

    Obwohl wir ja schon den Hinweis mit #include <math.h> gegeben hatten, reicht es aber noch nicht aus.
    Der Compiler mag das #include.
    Der Linker mag ein -lm und -L.... <--- Das fehlt in deinem Makefile

    So kannst du das im AVR-Studio einstellen:
    - Menü 'Project', Punkt 'Configuration Options'
    - Im folgenden Fenster links das Bildchen 'Libraries' anklicken
    - Oben rechts im Kasten 'Library Search Path' den Pfad zu deiner Win-AVR-Installation und weiter zu den Lib's einstellen.
    -- Bei dir ist das "C:\winavr-20070525\avr\lib"
    - Unten links im Kasten 'Available Link Objects' die Datei libm.a markieren
    - Und zum Schluß den Button 'Add Library-->' drücken.

    Das Fenster mit OK schließen.
    Aus dem Menü 'Build' den Punkt 'Rebuild All' aufrufen. Es kommen wieder deine Warnings, die du im 2.ten compile-Lauf ja vermisst hattest. (Die kommen immer, wenn du die Datei lottozahlen_v051.c speicherst. Die Taste F7 (Build|Build) übersetzt nur die Dateien, die neuer sind als im Verzeichnis default liegenden *.o-Dateien. Deshalb keine Warnings im 2.ten Lauf.)

    So funktioniert nun das erzeugte HEX-File auch bei mir. Und bestimmt auch bei dir und überhaupt bei allen weltweit verstreuten Asurianern.
    Und wenn nicht, dann nochmal fragen.

    Gruß Sternthaler

    Schon wieder ein P.S.: Die Warnings kannst du in diesem Fall vergessen.
    Liegt an deiner AVR-Compilerversion 4.1.2.
    Ich habe noch die 3.8.1-Version. Da scheint die Unterscheidung zwischen 'unsigned char' und 'signed char' noch kein Warning zu sein.

    Gute Nacht
    Lieber Asuro programieren als arbeiten gehen.

  2. #32
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213
    Hallo Sternthaler,
    Vielen Dank für deine ausführlichen Erklärungen.
    Eigentlich dachte ich, ich hätte jetzt alles kapiert, nur hier verwirrst du mich:
    Hier sollte eigendlich auch bei dir immer 0 als Ergebnis kommen, wenn i den Wert 7, 14, 21, 28, ... annimmt.
    Und genau das passiert bei deinem Hex-File ja leider nicht, sondern nur bei 0 / 7.
    if ( ! fmod (i, 7)) bedeutet doch: wenn i/7 = 0
    dann mach return und waagrechten strich

    bei der fehlerhaften Ausgabe scheint doch ab 8 bei jeder Zahl 0 rauszukommen, da jedesmal eine neue Zeile anfängt?

    So kannst du das im AVR-Studio einstellen:
    - Menü 'Project', Punkt 'Configuration Options'
    - Im folgenden Fenster links das Bildchen 'Libraries' anklicken
    - Oben rechts im Kasten 'Library Search Path' den Pfad zu deiner Win-AVR-Installation und weiter zu den Lib's einstellen.
    -- Bei dir ist das "C:\winavr-20070525\avr\lib"
    - Unten links im Kasten 'Available Link Objects' die Datei libm.a markieren
    - Und zum Schluß den Button 'Add Library-->' drücken.
    Das habe ich gemacht mit folgendem Ergebnis:

    C:\WinAVR-20070525\avr\lib\libc.a(vfprintf_std.o): In function `vfprintf':
    (.text+0x6: undefined reference to `__mulhi3'
    make: *** [lottozahlen.elf] Error 1
    Build failed with 1 errors and 11 warnings...

    Daraufhin habe ich den Pfad wieder entfernt, und die schon vorhandene libm.a nach rechts geschickt.
    (Screenshot im Anhang)
    Jetzt gehts!

    Wo kommen denn die Available Link Objects her, wenn kein Pfad angegeben ist?
    Sollten die anderen Available Link Objects auch hinzugefügt werden?

    Gruss
    M.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken libraries.gif  

  3. #33
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Zitat Zitat von M1.R
    Vielen Dank für deine ausführlichen Erklärungen.
    Gern geschehen.

    Da habe ich mich wohl schlecht ausgedrückt. Ich hätte besser schreiben sollen:
    "Hier sollte eigendlich auch bei dir immer nur dann eine 0 als Ergebnis kommen, wenn i ohne Rest durch 7 teilbar ist."

    Du hast es richtig gesehen, dass erst dann eine neue Zeile mit Trennlinie zu zeichnen ist.
    Also ist deine Frage: "bei der fehlerhaften Ausgabe scheint doch ab 8 bei jeder Zahl 0 rauszukommen, da jedesmal eine neue Zeile anfängt?" auf alle Fälle mit JA zu beantworten.

    Genau dies hat mich auf die Fährte der fehlenden Mathe-Lib gebracht, da die fmod()-Funktion ja scheinbar durch irgendetwas anderes beim compilieren ersetzt wurde. Die 'Ersatzfunktion' hat da aber diesen Blödsinn gemacht. (Bitte zu einer 'Ersatzfunktion' keine Frage. So einen Schwachsinn habe ich bis jetzt noch nie in meiner C-Laufbahn gesehen.)


    Schön, dass du es mit geänderten AVR-Studio-Einstellungen auch hinbekommen hast.
    Aber auch hier habe ich keine Ahnung, warum du die Pfadangabe weglassen musst. Und vor allem weiß ich auch nicht warum die verfügbaren Lib's bei dir ohne Pfadangabe überhaupt angezeigt werden. (Ich muss aber gestehen, dass ich das Studio zum rausfummeln dieses Problem's, erst zum ersten mal benutzt habe.)
    Ich habe die AVR-Version 4.13 Buld 557
    Du müsstest eine andere Version haben, da in deinem geposteten Bild noch ein Pfeil-Runter-Kästchen unten rechts von 'Custom Options' ist. Den habe ich nicht. Liegt bestimmt daran.

    Zitat Zitat von M1.R
    Sollten die anderen Available Link Objects auch hinzugefügt werden?
    Es ist keinesfalls falsch. Werden keine Funktionen aus den Lib's benötigt, wird dein HEX-Programm auch nicht größer dadurch.

    Gruß Sternthaler

    @damaltor
    Bald kann ich wieder ein Bild posten. Dann kann ich auch ohne Wortmonster eine Lib-Einstellungs-Anweisung posten.
    Lieber Asuro programieren als arbeiten gehen.

  4. #34
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213
    Hallo Sternthaler,
    Zitat Zitat von Sternthaler
    (Bitte zu einer 'Ersatzfunktion' keine Frage. So einen Schwachsinn habe ich bis jetzt noch nie in meiner C-Laufbahn gesehen.)
    ich frag nicht...
    aber interessiert hat mich die "Ersatzfunktion" schon.
    Daher habe ich dieses Programm ausprobiert:
    Code:
    for (i = 0; i <= 49; i++)
    		{
    		k = i/7;
    		l = fmod (i, 7);
    		rest = (i - (k*7));	// restberechnung
    		PrintInt (i); 
    		SerWrite ("/7=", 3);
    		PrintInt (k);
    		SerWrite ("   rest: ", 9);
    		PrintInt (rest);
    		SerWrite ("   fmod: ", 9);  
    		PrintInt (l);
    		SerWrite ("\r\n", 2);       
    		}
    wie erwartet kommt das raus:
    Code:
    0/7=0   rest: 0   fmod: 0                         
    1/7=0   rest: 1   fmod: 1                         
    2/7=0   rest: 2   fmod: 2                         
    3/7=0   rest: 3   fmod: 3                         
    4/7=0   rest: 4   fmod: 4                         
    5/7=0   rest: 5   fmod: 5                         
    6/7=0   rest: 6   fmod: 6                         
    7/7=1   rest: 0   fmod: 0                         
    8/7=1   rest: 1   fmod: 0                         
    9/7=1   rest: 2   fmod: 0                         
    10/7=1   rest: 3   fmod: 0                          
    11/7=1   rest: 4   fmod: 0                          
    12/7=1   rest: 5   fmod: 0                          
    13/7=1   rest: 6   fmod: 0                          
    14/7=2   rest: 0   fmod: 0                          
    15/7=2   rest: 1   fmod: 0                          
    16/7=2   rest: 2   fmod: 0                          
    17/7=2   rest: 3   fmod: 0                          
    18/7=2   rest: 4   fmod: 0                          
    19/7=2   rest: 5   fmod: 0                          
    20/7=2   rest: 6   fmod: 0                          
    21/7=3   rest: 0   fmod: 0                          
    22/7=3   rest: 1   fmod: 0                          
    23/7=3   rest: 2   fmod: 0                          
    24/7=3   rest: 3   fmod: 0                          
    25/7=3   rest: 4   fmod: 0                          
    26/7=3   rest: 5   fmod: 0                          
    27/7=3   rest: 6   fmod: 0
    28/7=4   rest: 0   fmod: 0
    29/7=4   rest: 1   fmod: 0
    30/7=4   rest: 2   fmod: 0
    31/7=4   rest: 3   fmod: 0
    32/7=4   rest: 4   fmod: 0
    33/7=4   rest: 5   fmod: 0
    34/7=4   rest: 6   fmod: 0
    35/7=5   rest: 0   fmod: 0
    36/7=5   rest: 1   fmod: 0
    37/7=5   rest: 2   fmod: 0
    38/7=5   rest: 3   fmod: 0
    39/7=5   rest: 4   fmod: 0
    40/7=5   rest: 5   fmod: 0
    41/7=5   rest: 6   fmod: 0
    42/7=6   rest: 0   fmod: 0
    43/7=6   rest: 1   fmod: 0
    44/7=6   rest: 2   fmod: 0
    45/7=6   rest: 3   fmod: 0
    46/7=6   rest: 4   fmod: 0
    47/7=6   rest: 5   fmod: 0
    48/7=6   rest: 6   fmod: 0
    49/7=7   rest: 0   fmod: 0
    aber jetzt wirds witzig:
    dann habe ich die lbm.a wieder hinzugefügt mit diesem Ergebnis:
    Code:
    0/7=0   rest: 0   fmod: 0                         
    1/7=0   rest: 1   fmod: 1                         
    2/7=0   rest: 2   fmod: 2                         
    3/7=0   rest: 3   fmod: 3                         
    4/7=0   rest: 4   fmod: 4                         
    5/7=0   rest: 5   fmod: 5                         
    6/7=0   rest: 6   fmod: 6                         
    7/7=1   rest: 0   fmod: 0                         
    8/7=1   rest: 1   fmod: 1                         
    9/7=1   rest: 2   fmod: 1              
    10/7=1   rest: 3   fmod: 3                          
    11/7=1   rest: 4   fmod: 3                     
    12/7=1   rest: 5   fmod: 5                          
    13/7=1   rest: 6   fmod: 5                    
    14/7=2   rest: 0   fmod: 0                          
    15/7=2   rest: 1   fmod: 0                          
    16/7=2   rest: 2   fmod: 2                          
    17/7=2   rest: 3   fmod: 3                          
    18/7=2   rest: 4   fmod: 3                          
    19/7=2   rest: 5   fmod: 4                          
    20/7=2   rest: 6   fmod: 6                          
    21/7=3   rest: 0   fmod: 0                          
    22/7=3   rest: 1   fmod: 0                          
    23/7=3   rest: 2   fmod: 2                          
    24/7=3   rest: 3   fmod: 3                          
    25/7=3   rest: 4   fmod: 3                          
    26/7=3   rest: 5   fmod: 4                          
    27/7=3   rest: 6   fmod: 6
    28/7=4   rest: 0   fmod: 0
    29/7=4   rest: 1   fmod: 0
    30/7=4   rest: 2   fmod: 1
    31/7=4   rest: 3   fmod: 2
    32/7=4   rest: 4   fmod: 4
    33/7=4   rest: 5   fmod: 5
    34/7=4   rest: 6   fmod: 6
    35/7=5   rest: 0   fmod: 0
    36/7=5   rest: 1   fmod: 0
    37/7=5   rest: 2   fmod: 1
    38/7=5   rest: 3   fmod: 2
    39/7=5   rest: 4   fmod: 4
    40/7=5   rest: 5   fmod: 5
    41/7=5   rest: 6   fmod: 6
    42/7=6   rest: 0   fmod: 0
    43/7=6   rest: 1   fmod: 0
    44/7=6   rest: 2   fmod: 1
    45/7=6   rest: 3   fmod: 2
    46/7=6   rest: 4   fmod: 4
    47/7=6   rest: 5   fmod: 5
    48/7=6   rest: 6   fmod: 6
    49/7=7   rest: 0   fmod: 0
    es ist mir absolut schleierhaft, warum der Lottoschein trotzdem richtig gemalt wird.
    Aber egal - Hauptsache es funktioniert

    Ich habe die AVR-Version 4.13 Buld 557
    habe ich auch!

    Gruss
    M.

  5. #35
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo M1.R,
    so ganz unverständlich ist das Ergebnis nicht.
    Du hast folgenden Code angegeben:
    Code:
          l = fmod (i, 7);
       .. 
         SerWrite ("   fmod: ", 9); 
          PrintInt (l);
    Folgendes steht zur Auswahl:
    - l ist eine Integer-Variable
    --- Das Ergebnis von fmod() muss nach Int gewandelt werden
    --- PrintInt kann sauber arbeiten

    - l ist eine float-Variable
    --- Das Ergebnis von fmod() kann ohne Wandlung gespeichert werden
    --- PrintInt muss eine Typ-Umwandlung machen.

    Du hast so immer eine Wandlung einer Float-Zahl zurück in eine Int-Zahl. Da sind eigendlich immer Verluste einzurechnen.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  6. #36
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213
    Zitat Zitat von Sternthaler
    - l ist eine float-Variable
    --- Das Ergebnis von fmod() kann ohne Wandlung gespeichert werden
    --- PrintInt muss eine Typ-Umwandlung machen.
    jetzt habe ich l als float definiert.
    Wie kann ich das jetzt ausgeben?
    PrintFloat gibts ja nicht.
    Habe alle möglichen Varianten mit printf und mit sprintf und SerWrite erfolglos probiert.
    Gruss
    M.

  7. #37
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    such mal nach der funktion "ftoa" oder so ähnlich im netz, damit kann man das umwandeln denk ich
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  8. #38
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo damaltor und M1.R

    Klar kann man ftoa() benutzten.
    Aber wäre es nicht für dich M1.R interessant, dass du dir nochmal die fprintf()-Funktion mit den 'Formatierung'-en ansiehst.
    Kleiner Tip: Ich habe 2 Stellen einer Int-Variablen mit %2d formatiert.
    Wir müssen hier eine unbekannte/uninteressante Anzahl Stellen einer double-Zahl formatieren.
    (Man kann auch eine float/double-Zahl mit %n.m? auf eine feste Länge formatieren. Das Fragezeichen must du selber rausbekommen. n und m sind Zahlen. Der . ist ein Punkt)

    Warum ftoa() meiden?
    Schon wieder eine neue Funktion, die dann auch wieder in die HEX-Datei will. fprintf() haben wir schon, dann würde ich sie auch nochmal benutzt.
    That's all
    Im übrigen ist deine Lösung M1.R, die Berechnung des Nachkommaanteil's selber zu machen, aus dem gleichen Grund besser, als die fmod()-Funktion zu nutzen.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  9. #39
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo zusammen,
    nur eine Info zum Unterschied bei der AVR-Studio-Einstellung bei M1.R und mir.
    Unter Asuro und eeprom war ich 'gezwungen' eine neue Version vom avr-gcc zu installieren.
    Da habe ich gleich mal ein paar Test's zum Zusammenspiel zwischen avr-gcc- und AVR-Studio-Installation gemacht.
    Erst avr-gcc und dann AVR-Studio liefert im Studio die Info, wo die Lib's zu finden sind. Es ist nicht gut, eine neue avr-gcc-Version in ein neues Unterverzeichniss zu installieren. Besser ist es die alte Version zu deinstallieren, und die neue Version in das alte Verzeichnis zu schreiben.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  10. #40
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213
    Danke für eure Tipps!

    habe es mittlerweile zumindest mal geschafft eine ganze Zahl (string1) auszugeben und dabei festgestellt, dass das auch ohne Angabe der Stellenzahl geht. Die gleiche Methode mit float geht aber nicht (string2).
    Ich bitte mal wieder um Hilfe!
    Was ist falsch?
    Code:
       int test1;
    	test1 = 11;
    	char string1 [20];
    	sprintf (string1, "%d", test1);
    	SerWrite (string1, 2);
    
    	SerWrite ("\r\n", 2);
    
    	float test2;
    	test2 = 22.33;
    	char string2 [20];
    	sprintf (string2, "%f", test2);
    	SerWrite (string2, 5);
    
    	SerWrite ("\r\n", 2);
    Gruss
    M.

Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad