-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: AVR Studio - SerWrite Problem - Fehlermeldung

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    21.03.2004
    Ort
    73061 Ebersbach
    Alter
    48
    Beiträge
    52

    AVR Studio - SerWrite Problem - Fehlermeldung

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    hallo,

    nachdem ich nun gestern meinen asuro zum hausbau gebracht habe, hatte ich heute mal versucht das gestrige programm unter AVR Studio zu kompilieren.

    die fehlermeldung mit der signal.h hab ich gelöst.
    aber

    in meinem Code stehen immer mal SerWrite aufrufe, damit der kleine mir auch sagen kann was er tut

    nun das!

    ../nicolaushaus.c:16: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness

    hier die passenden Zeilen code dazu:
    Code:
    #include "asuro.h"
    #include <string.h>
    #include <math.h>
    
    
    //prototypen
    void Haus(int iStil, unsigned char iSpeed);
    void MyTurn ( int winkel, unsigned char iSpeed);
    
    int main(void)
    {
      Init();
      Encoder_Init();
      
    /////dieser SErWrite ist zeile 16!!!!
      SerWrite("\n\r",2); <----DAS IST ZEILE 16
      //        123456789012345678901234567890123456789012
      SerWrite("Hallo Chef, ich beginne mit dem Programm! ",42);
      SerWrite("\n\r",2);  
      SerWrite("Taster 1: Go 100",16);
      SerWrite("\n\r",2); 
      SerWrite("Taster 2: Turn 90",17);
      SerWrite("\n\r",2); 
      SerWrite("Taster 3: Haus1",15);
      SerWrite("\n\r",2); 
      SerWrite("Taster 4: Haus2",15);
      SerWrite("\n\r",2); 
      SerWrite("Taster 5: Haus3",15);
      SerWrite("\n\r",2); 
      SerWrite("Taster 6: Haus4",15);
      SerWrite("\n\r",2); 
    ----->SCHNIPP <---
    alle SerWrite aufrufe im programm haben dieselbe fehlermeldung....

    woran könnte das liegen?

    gruß
    downad
    Das, was immer von jedermann und überall als richtig akzeptiert wurde, ist mit ziemlicher Gewißheit das Falsche.
    Paul Valéry (1871-1945), frz. Dichter

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    das bedeutet dass die länge (der zweite parameter der serwrite funktion) ein unsigned int ist aber du einen signed int über geben hast, oder genau anders herum. dem GCC ist das offenslichtlich egal... arbeitest du mit SerWrite oder mit PrintInt an der Stelle? poste mal den code (codebox!)
    kleinschreibung ist cool!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    21.03.2004
    Ort
    73061 Ebersbach
    Alter
    48
    Beiträge
    52
    hallo damaltor,
    hallo alle anderen leser,

    also an der stelle benutze ich die SerWrite, die macht das problem
    die PrintInt (ab z. 140) die geht ohne probleme.

    hier der ganze code
    Code:
    #include "asuro.h"
    #include <string.h>
    #include <math.h>
    
    
    //prototypen
    void Haus(int iStil, unsigned char iSpeed);
    void MyTurn ( int winkel, unsigned char iSpeed);
    
    int main(void)
    {
      Init();
      Encoder_Init();
      //Senden von ICH beginne!
    
      SerWrite("\n\r",2);
      //        123456789012345678901234567890123456789012
      SerWrite("Hallo Chef, ich beginne mit dem Programm! ",42);
      SerWrite("\n\r",2); 
      SerWrite("Taster 1: Go 100",16);
      SerWrite("\n\r",2); 
      SerWrite("Taster 2: Turn 90",17);
      SerWrite("\n\r",2); 
      SerWrite("Taster 3: Haus1",15);
      SerWrite("\n\r",2); 
      SerWrite("Taster 4: Haus2",15);
      SerWrite("\n\r",2); 
      SerWrite("Taster 5: Haus3",15);
      SerWrite("\n\r",2); 
      SerWrite("Taster 6: Haus4",15);
      SerWrite("\n\r",2); 
      
      
      //in sw_pressed ist der gedrückte Schalter hinterlegt
      //dazu wird PollSwitch abgefragt  
      int sw_pressed;
      
      
      while (1) {
    	
    	//solange keine Taste gedrückt wird
    	while((sw_pressed = PollSwitch()) == 0x00); 
        
    	//korrektur für die großen Tasternummern
    	if (sw_pressed >4) sw_pressed++;
    	//Tastenabfrage
    	switch(sw_pressed) {
    		case 1: 
    			//         1 234567890
    			SerWrite("\n\rTaster 1", 10); 
    			Go (100, 150);
    			break;				  
    		case 2: 
    			//         1 234567890
    			SerWrite("\n\rTaster 2", 10); 
    			MyTurn (90, 150);
    			break;	 
    		case 4: 
    			//         1 234567890123456
    			SerWrite("\n\rTaster 4: Haus1", 17);
    			//Haus(Größe-1..4,Speed)
    			Haus(1,150); 
    			break;			  
    	    case 8:  
    			//         1 234567890123456
    			SerWrite("\n\rTaster 4: Haus2", 17);
    			//Haus(Größe-1..4,Speed)
    			Haus(2,150);
    			break;		
    		case 16:
    			//         1 234567890123456
    			SerWrite("\n\rTaster 4: Haus3", 17);
    			//Haus(Größe-1..4,Speed)
    			Haus(3,150);
    			break;		
    		case 32:
    			//         1 234567890123456
    			SerWrite("\n\rTaster 4: Haus4", 17);
    			//Haus(Größe-1..4,Speed)
    			Haus(4,150);
    			break;		  } //end switch
    	
    	
    	//mal 300 ms warten
    	Msleep(300);
    	sw_pressed=0;
    	
    } //end while (1)
      
    
    // Nie vergessen, reine Vorsichtsmassnahme..
      while(1){}
      return 0;
    } // end int main()
    
    
    void Haus(int iStil, unsigned char iSpeed)
    {
    //Definition der Seitenlänge und Winkel (DEFAULT)
    int iSeite=30;
    int iWinkel_Dach1=45;
    	switch(iStil) {
    		case 1: 
    			//         1 234567890
    			SerWrite("\n\rForm 1", 8);
    			iSeite=100;
    			iWinkel_Dach1= 45;
    			break;
    		case 2: 
    			//         1 234567890
    			SerWrite("\n\rForm 2", 8);
    			iSeite=150;
    			iWinkel_Dach1= 45;
    			break;
    		case 3: 
    			//         1 234567890
    			SerWrite("\n\rForm 3", 8);
    			iSeite=100;
    			iWinkel_Dach1= 30;
    			break;	
    		case 4: 
    			//         1 234567890
    			SerWrite("\n\rForm 4", 8);
    			iSeite=200;
    			iWinkel_Dach1= 30;
    			break;				
    	} //end switch
    
    
    float Diagonale=sqrt(2)*iSeite;
    int iDiagonale= (int)Diagonale;
    
    int iWinkel_Dach2= 2* (90-iWinkel_Dach1);
    int iWinkel_Dach3= 90-iWinkel_Dach1;
    int iDach=(iSeite/2)/cos(iWinkel_Dach1/180*3.1415926535);
    
    SerWrite("\n\r",2);
    //        12345678901234567890
    SerWrite("Seite: ",7);
    PrintInt(iSeite);
    SerWrite("\n\r",2);
    //SerWrite("Diagonale: ",12);
    //PrintInt(Diagonale);
    //SerWrite("\n\r",2);
    SerWrite("int Diagonale: ",16);
    PrintInt(iDiagonale);
    SerWrite("\n\r",2);
    SerWrite("Dach: ",6);
    PrintInt(iDach);
    SerWrite("\n\r",2);
    SerWrite("Winkel1: ",9);
    PrintInt(iWinkel_Dach1);
    SerWrite("\n\r",2);
    SerWrite("Winkel2: ",9);
    PrintInt(iWinkel_Dach2);
    SerWrite("\n\r",2);
    SerWrite("Winkel3: ",9);
    PrintInt(iWinkel_Dach3);
    SerWrite("\n\r",2);
    
    	//solange keine Taste gedrückt wird
    	//         1 234567890123
    	SerWrite("\n\rpress a key",13);
    	SerWrite("\n\r",2);	
    	while((PollSwitch()) == 0x00); 
    
    
    // es geht los (Seite 1)
    Go(iSeite, iSpeed);
    // drehen und Dach (Seite 2)
    MyTurn(iWinkel_Dach1, iSpeed);
    Go(iDach, iSpeed);
    // drehen und Dach (Seite 3)
    MyTurn(iWinkel_Dach2, iSpeed);
    Go(iDach, iSpeed);
    // drehen und Seite 4
    MyTurn((90-iWinkel_Dach1+90), iSpeed);
    Go(iSeite,iSpeed);
    //drehen und Seite 5
    //Linksdrehung 45- 180
    MyTurn(-135, iSpeed);
    Go(iDiagonale,iSpeed);
    //drehen und Seite 6
    //Rechtsdrehung 90+45
    MyTurn(135, iSpeed);
    Go(iSeite,iSpeed);
    //drehen und Seite 7
    //Rechtdrehung
    MyTurn(135, iSpeed);
    Go(iDiagonale,iSpeed);
    //drehen und Seite 8
    //Rechtsdrehung
    MyTurn(135, iSpeed);
    Go(iSeite,iSpeed);
    
    
    } //end Void (Haus)
    
    void MyTurn ( int iWinkel, unsigned char iSpeed)
    {
    int iStep=1;
    int iRest=0;
    int iLauf=0;
    	if (iWinkel>80)
    	{
    		iStep=iWinkel/60;
    		iRest=iWinkel - iStep*60;
    		for (iLauf; iLauf<iStep; iLauf++)
    		{
    			Turn(60,iSpeed);
    		}
    		Turn (iRest, iSpeed);
    	} //endif (abs(winkel)>80)
    	else
    	{
    		Turn(iWinkel, iSpeed);
    	}
    	
    }
    gruß
    downad

    edit:
    so nachdem ich nun etwas rumgespielt und experimentiert habe...
    Lösungs aber sehr ----SEHR unbefriedigend

    unsigned char length =5;
    unsigned char data[]="Hallo";
    SerWrite(data,length);
    dann geht die SerWrite


    eine elegantere lösung wäre mir lieber.
    Das, was immer von jedermann und überall als richtig akzeptiert wurde, ist mit ziemlicher Gewißheit das Falsche.
    Paul Valéry (1871-1945), frz. Dichter

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    kein problem. ändere in der asuro.c die zeile
    void SerWrite(....
    um. wenn da unsigned steht, dann mach es weg. wenn es nicht da steht, dann schreibe es vor das int.
    kleinschreibung ist cool!

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    21.03.2004
    Ort
    73061 Ebersbach
    Alter
    48
    Beiträge
    52
    in der asuro.c steht:

    void SerWrite(unsigned char *data,unsigned char length)
    wenn ich das zu

    void SerWrite(unsigned char data[],unsigned char length)
    ändere klappt das kompilieren

    aber....
    dann klappt die PrintInt nicht mehr.

    ausserdem muss ich bein kompilieren auf -Os stellen.
    andernfalls bringt er eine fehlermeldung
    c:\winavr\bin\..\lib\gcc\avr\4.1.1\..\..\..\..\avr \bin\ld.exe: region text is full (SecondTry.elf section .text)
    ich hatte es auch schon getestet mit einer "eigenen" SerWrite - aber auch das ging nicht.

    ich glaube ich muss mir den Warnings leben oder
    KEIN Ser Write benutzen oder
    nicht in AVR-Studio arbeiten.
    Das, was immer von jedermann und überall als richtig akzeptiert wurde, ist mit ziemlicher Gewißheit das Falsche.
    Paul Valéry (1871-1945), frz. Dichter

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hi,

    eine elegantere Lösung wäre eine SerWrite Funktion ohne Längenangabe. Da Strings in C null-terminiert sind, benötigt man den extra Parameter dann nicht. Diese Funktion stammt von RN-User stochri und wird in der neuesten Asuro Lib enthalten sein (wenn ich es schaffe erscheint diese noch heute).

    Code:
    void uart_putc(unsigned char ch)
    {
      UCSRB = 0x08; // enable transmitter
      UCSRA|=0x40; // clear transmitter flag
      while (!(UCSRA & 0x20)); // wait for empty transmit buffer
      UDR = ch;
      while (!(UCSRA & 0x40)); // Wait for transmit complete flag (TXC)
    } 
    
    void SerPrint(unsigned char *data)
    {
      unsigned char i = 0;
      while(data[i]!=0x00) uart_putc(data[i++]);
    }

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    30.12.2006
    Beiträge
    19
    Also könnte man dann auch in der PrintInt() das strlen() löschen und somit müsste man die string.h nicht mehr einbinden. Das wäre eine schöne Lösung. =D>

    Nur muss man jetzt dann genau aufpassen, dass die strings auch wirklich mit "\0" beendet werden, denn sonst gibts Probleme...

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hi,

    richtig. Das werde ich in der PrintInt Funktion auch gleich mit korrigieren. Die Funktion itoa liefert auf alle Fälle einen null-terminierten String zurück.

  9. #9
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    geile idee eigentlich... ich arbeite immer mit
    SerWrite(string,strlen(string));

    dabei muss man nur auf ascii 0 achten -.- =)
    kleinschreibung ist cool!

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    20.01.2007
    Ort
    Diessen/Ammersee
    Alter
    63
    Beiträge
    6
    Hallo,

    ich hatte das gleiche Problem im AVR Studio.
    Zuerst habe ich in allen Routinen der IR-Schnittstelle "char" satt "unsigned char" verwendet. Dies hat zwar funktioniert, war aber unbefriedigend.
    Dann habe ich gesehen, dass bei den "AVR-Custom-Optionen" automatisch ein "-fsigned-char" reinkommt. Um das zu verhindern, muss man unter "General" den Haken bei "Unsigned Chars" anschalten. Dann klappts auch mit "unsigned char"s.

    Peter

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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