PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR Studio - SerWrite Problem - Fehlermeldung



Downad
06.01.2007, 13:42
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:

#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

damaltor
06.01.2007, 16:37
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!)

Downad
06.01.2007, 17:38
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

#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 :-s


eine elegantere lösung wäre mir lieber.

damaltor
06.01.2007, 22:42
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.

Downad
07.01.2007, 09:42
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.

m.a.r.v.i.n
07.01.2007, 11:42
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).



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++]);
}

Stallion
07.01.2007, 12:03
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...

m.a.r.v.i.n
07.01.2007, 12:24
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.

damaltor
07.01.2007, 13:53
geile idee eigentlich... ich arbeite immer mit
SerWrite(string,strlen(string));

dabei muss man nur auf ascii 0 achten -.- =)

miraculix
27.01.2007, 22:22
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

miraculix
28.01.2007, 16:58
Hallo,

den oben beschriebenen Tipp, "Unsigned Chars" zu aktivieren, funktioniert nur, wenn man die "avrgccplugin.exe" auch noch installiert (obwohl diese im AVR Studio bereits enthalten sind). Ansonsten hat diese Option (zumindest auf einem von mir neu installierten Rechner) keine Wirkung!

Peter