PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere Fragen zum Thema Programmieren



Adriano
26.12.2012, 23:12
Hallo,

bin heute gerade mit dem Zusammenbau von meinem Asuro fertig geworden. Selbsttest etc. ist alles ohne Probleme gelaufen.
Da ich mich also zum Programmieren wendete bemerkte ich das es doch einige Hürden für mich zu überwindet gibt.


#include "asuro.h"

int main(void)
{
unsigned char fs;
Init();
fs=PollSwitch();
MotorSpeed (120,120);

if (fs==0)
{MotorDir(FWD,FWD);}
else
{MotorDir(RWD,RWD);
SerWrite("Fahre zurück",12); //Fehlermeldung : asuro.c:160: error: conflicting types for 'SerWrite'
BackLED(ON,ON);
Sleep (21600); //Anmerkung: 216=3ms -> 21600= 3 sec ? Resultat: Funktioniert nicht?!
SerWrite("Drehen",6);
MotorDir(FWD,RWD);
Sleep (21600);}

while (1);
return 0;
}

Dieses Programm wollte ich zunächst einfach kompilieren lassen, jedoch mäckert da das Programmer's Notepad am SerWrite rum.
Hab daraufhin versucht (wie es bei der standartmäßigen Anleitung zu lesen war) nur den SerWrite Befehl in einem seperaten Quellcode kompilieren zu lassen, wodurch sich aber nichts änderte.
Hinzu kommt noch das ich bereits in meinem vorherigen Programm am Befehl Sleep() scheiterte.
Hatte dort versucht die StatusLED von Gelb auf rot wechseln zu lassen --> Die LED bleibt auf Gelb.:confused:

Hier nochmal die komplette Fehlermeldung:

avr-gcc --version
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
In file included from asuro.h:34,
from test.c:1:
c:/winavr-20100110/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
test.c: In function 'main':
test.c:14: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
test.c:16: warning: large integer implicitly truncated to unsigned type
test.c:17: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
test.c:19: warning: large integer implicitly truncated to unsigned type
avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c -o asuro.o
In file included from asuro.h:34,
from asuro.c:29:
c:/winavr-20100110/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
asuro.c:160: error: conflicting types for 'SerWrite'
asuro.h:74: error: previous declaration of 'SerWrite' was here
make: *** [asuro.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:00


Hoffe ihr könnt mir weiterhelfen und bedanke mich im vorraus für eure Hilfe.

radbruch
26.12.2012, 23:38
Hallo

Der größte Wert für Sleep() ist 255. Für längere Wartezeiten mußt du eine Schleife verwenden und Sleep() mehrfach aufrufen.

SerWrite() könnte so funktionieren:

char text[]="Fahre zurück\n";
SerWrite(text,13); //Fehlermeldung : asuro.c:160: error: conflicting types for 'SerWrite'
Allerdings wird bei mir auch deine Version fehlerfrei übersetzt. (Es könnte aber auch am "ü" hängen. ascii>127?)

Gegen das SerWrite()-Problem mit den Vorzeichen (wohl eine neuere AVR-GCC-Version) half bei mir eine Änderung in asuro.h und asuro.c.

asuro.h:

/* function for serial communication */
void SerWrite(char *data, unsigned char length); // edit by mic 1.4.2011
/* timeout = 0 => bloking mode !!! */
void SerRead(char *data, unsigned char length, unsigned int timeout); // edit by mic 7.6.2012

asuro.c:

/* function for serial communication */
void SerWrite(char *data, unsigned char length) // edit by mic 1.4.2011
{

void SerRead(char *data, unsigned char length,unsigned int timeout) // edit by mic 7.6.2012
{



Gruß

mic

Adriano
27.12.2012, 11:42
Danke!

//Edit: Programm ist jetzt erfolgreich erstellt worden. Nun aber ein neues Problem: Die Variable fs ist anscheinend immer 0, obwohl ich wie ein wilder die K1-K6 betätige...
//Edit2: Bin im Forum fündig geworden ^^.

Johnny ARX
29.12.2013, 14:16
Das mit dem Sleep() kann man mit folgendem "Vorprogramm" in den Griff bekommen

#include <asuro.h>

void sleep_ms(int ms)
{
while(ms>0)
{
Sleep(72);
ms=ms-1;
}
}
void main(void) {
...


Dann muss man für z.B. Sleep(72); nur noch sleep_ms(1); einfügen, und die Höhe der Zahl ist egal.
Nur bedenken:
1000 ms = 1 s = sleep_ms(1000)

Das SerWrite könnte sich dadurch erübrigen (bei mir wars so).

Valen
30.12.2013, 20:30
Danke!

//Edit: Programm ist jetzt erfolgreich erstellt worden. Nun aber ein neues Problem: Die Variable fs ist anscheinend immer 0, obwohl ich wie ein wilder die K1-K6 betätige...
//Edit2: Bin im Forum fündig geworden ^^.Stimmt laut deine Programm. Du verwendest die While-schleife nicht richtig. Es steht hinter den ganzen fs=PollSwitch(); und if (fs==0) Test. Das dadurch nicht wiederholt wird. Dabei macht es auch "nichts fuhr immer" weil da nur ein Punkt-Komma hinter steht. Was es wiederholen soll muss dort zwischen {}-Klammern stehen.

- - - Aktualisiert - - -


...

...
void sleep_ms(int ms)
...
Dann muss man für z.B. Sleep(72); nur noch sleep_ms(1); einfügen, und die Höhe der Zahl ist egal.
Nur bedenken:
1000 ms = 1 s = sleep_ms(1000)
...
Nicht ganz egal. Int (signed 16bit integer) geht bis auf 32.767