PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit C-Programm für den Asuro



Fortuna
24.01.2006, 15:02
Hallo,

Ich hab mich mal an das C-Programmieren rangewagt und hab noch so einige Probleme damit.
Folgendes Programm geht nicht mit dem Asuro.


#include "asuro.h"

int main(void)
{


Init();
while (1){ //programm soll endlos laufen
while (PollSwitch()==0) //soll die funktion so lange ausführen bis ein taster gedrückt wird
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
SerWrite("fahre..\n",8);
}
int a; //...dann sollte er hier weitermachen.. nämlich kurz wenden
for (a=1; a==100; a++) {
MotorDir(RWD,FWD);
MotorSpeed(120,120);
SerWrite("schnell weg...\n",15);
} //.. und alles von oben wieder....
}
while (1)
return 0;
}

Wenn ich den Asuro damit anmache schreibt er an mein pc "fahre..." und er fährt auch. Das Problem ist wenn ich einen Taster drücke passiert nichts.
Würde mich freuen, wenn mir jemand nen Tipp geben würde. :)

Thorsten
24.01.2006, 15:36
Kenn mich mit dem Asuro zwar nicht aus, aber
die for - Schleife wird nie ausgeführt:
a=1 und schleife ausführen solange a == 100
geht ja net weil a eins ist.
Ich denke mal du meinst:
for(a=1; a < 100; a++)

mfg
Thorsten

argentan
24.01.2006, 15:42
Moin!

Auf den ersten Blick sieht mein Hühnerauge drei Dinge die mir nicht gefallen.

1. Bei C werden Variablen am Anfang deklariert.
Die Deklaration mitten im Code ist eine Sache von Java.
Also int a=0; bitte gleich nach main { setzen.
2. Die For Schleife. Wenn mich nicht alles täuscht, müsste da for (a=0;a<=100;a++) stehen.
Die Forschleife wird ausgeführt solange die Bedingung wahr ist.
mit a==100 ist die von Anfang an falsch.
Dies dürfte der Hauptfehler sein.
3. Am Ende steht da noch ein unmotiviertes while(1) for dem return.
Keiner weiss wohin das soll oder woher das kommt. Also weg damit.

Ich möchte darum bitten, künftig darauf zu achten, dass man bei geschweiften Klammern vernünftig einrückt. Das macht den Code sehr viel lesbarer. Bei grösseren Projekten empfiehlt es sich hinter geschlossenen Klammern einen Kommentar zu setzen, woher diese Klammer kommt.

while (1)
{
__for (a=0;a<=100;a++)
__{
____delay(200);
__}//for (a=0;a<=100;a++)
}//while (1)

Es macht Arbeit, aber wenn man später 5 oder mehr verschachtelte Klammerebenen hat, ist es Gold wert, wenn man die Klammern genau zuordnen kann.

MfG Argentan

Fortuna
24.01.2006, 15:51
ahja... Es geht... Vielen Danl :)

Fortuna
21.02.2006, 17:13
Hallo,

kann mir jmd sagen was da los ist:

#include "asuro.h"

int main(void)
{

Init();
int b;
int c;
int d;

b=50;
c=50;
b+c=d;

while(1)


return 0;
}

Fehlermeldung: test.c:14: error: invalid lvalue in assignment (er scheitert an a+b=d; )

Es kann doch nicht sein, dass der asuro nich rechnen kann :).. für Hilfe wäre ich dankbar :)

Superhirn
21.02.2006, 17:34
Hi,
kannst uns mal die Asuro.h geben. Hätt sie auch selber mal gerne. Ich verwende nie int b; oder so. versuchs mal mit:

#include <stdint.h> //Oder #include <inttypes.h> wenns nicht geht!
uint8_t b; //für b den variablennamen einsetzen, statt int b; !!!!

Und verwende nicht so große zahlen. Vielleicht passen sie mit den Datentyp nicht zusammen. :-k

Fortuna
21.02.2006, 17:39
int geht von -32768 bis 32767... falls ich das richtig kapiert habe...

Die asuro.h hab ich asuro-wiki... also nicht mehr die originale:
/*!
* \file asuro.h
* \brief Definitionen und Funktionen der ASURO Bibliothek
*
* $Revision: 2.60 $
* $Date: 27. September 2005 $
* $Author: Jan Grewe, Robotrixer, Waste, Stochri, Andun, m.a.r.v.i.n $
*
*
*/

/************************************************** **************************
*
* File Name: asuro.c
*
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* 1.00 14.08.2003 Jan Grewe build
* 2.00 14.10.2003 Jan Grewe RIGHT_VEL -> MotorSpeed(unsigned char left_speed, unsigned char right_speed);
* LeftRwd(),LeftFwd(),RightRwd(), LEFT_VEL,
* RigthFwd() -> MotorDir(unsigned char left_dir, unsigned char right_dir);
* GREEN_ON,GREEN_OFF,RED_ON,RED_OFF -> StatusLED(unsigned char color);
* LED_RED_ON, LED_RED_OFF -> FrontLED(unsigned char color);
* Blink(unsigned char left, unsigned char right) ->
* BackLED(unsigned char left, unsigned char right);
* Alles in Funktionen gefasst => leichter verständlich ?!?!
* 2.10 17.10.2003 Jan Grewe new Timer funktion void Sleep(unsigned char time36kHz)
*
*
* Copyright (c) 2003 DLR Robotics & Mechatronics
************************************************** ***************************/
/************************************************** **************************
*
* File Name: asuro.c
* Project : asuro library "Robotrixer Buxtehude"
*
* Description: This file contains additional functions:
*
* signal (SIG_ADC) interrupt/signal routine for encoder-counter
* signal (SIG_INTERRUPT1) signal for switches
* Encoder_Init() initializing encoder-counter
* Encoder_Start() start autoencoding
* Encoder_Stop() stop autoencoding
* Encoder_Set(int,int) set encodervalue
* Msleep(int delay) wait for delay in milliseconds
* Gettime() get systemtime in milliseconds
* PrintInt(int)
*
* modifications in Sleep, SIG_OUTPUT_COMPARE2, PollSwitch, LineData
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* beta1 31.03.2005 Robotrixer asuro library
* ------- ---------- -------------- ------------------------------
* the encoder source is based on RechteckDemo.c ver 2.0 by Jan Grewe 22.10.2003
* Copyright (c) 2003 DLR Robotics & Mechatronics

************************************************** ***************************/
/************************************************** **************************
*
* File Name: asuro.c
* Project : asuro library modified for IR collision detector
*
* Description: modifications made in following functions:
*
* SIGNAL (SIG_OUTPUT_COMPARE2) -> SIGNAL (SIG_OVERFLOW2)
* Gettime() counts now 36kHz
* Init() timer2 modified for adjustable duty cycle
* Batterie() bug fixed
* Sleep() counts now 36kHz
* Msleep() counts now 36kHz
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* beta2 11.06.2005 Waste asuro library
* ------- ---------- -------------- ------------------------------
************************************************** ***************************/
/************************************************** **************************
*
* File Name: asuro.c
* Project : asuro library
*
* Description: This file contains additional functions:
*
* motor control functions 29.7.2005 stochri
* void Go(int distance)
* void Turn(int degree)
*
* unsigned char Wheelspeed[2] measured Wheelspeed by interupt
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------------------
* sto1 29.07.2005 stochri asuro library with motor control functions
* ------- ---------- -------------- ------------------------------------------
************************************************** ***************************/
/************************************************** **************************
*
* File Name: asuro.c
* Project : asuro library "Robotrixer Buxtehude"
*
* Description: modifications made in following function:
*
* Go (int distance, int speed) Added Speed and Odometrie
* Turn (int degree, int speed) Added Speed and Odometrie
*
* modifications in Sleep, SIG_OUTPUT_COMPARE2, PollSwitch, LineData
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* And1 31.07.2005 Andun See above
* ------- ---------- -------------- ------------------------------
*
************************************************** ***************************/
/************************************************** **************************
*
* File Name: asuro.c
* Project : asuro library
*
* Description: modifications made in following functions:
*
* void PrintInt(int wert)
*
* unsigned char Wheelspeed[2] removed
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------------------
* 2.60 28.09.2005 m.a.r.v.i.n doxygen comments
* ------- ---------- -------------- ------------------------------------------
************************************************** ***************************/

/************************************************** *************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
************************************************** *************************/

#ifndef ASURO_H
#define ASURO_H

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdlib.h>

#define FALSE 0
#define TRUE 1

#define OFF 0
#define ON 1

#define GREEN 1
#define RED 2
#define YELLOW 3

/* neue Funktionen und Variablen*/
#define LEFT 0
#define RIGHT 1

/* --- Globale Variablen -----------------------------------*/
/*!
* Tastsensor Wert bei Interrupt Betrieb. 0=keine Taste, 1= Taste gedrueckt
*/
int switched;
/*!
* Odometriesensor Werte bei Interrupt Betrieb. encoder[0] links, encoder[1] = rechts. (Wertebereich 0..1023)
*/
int encoder[2];

// Wheelspeed variables 29.7.2005 stochri
// removed not referenced 29.09.2005 m.a.r.v.i.n
//unsigned char Wheelspeed[2];

// motor control functions 29.7.2005 stochri
// motor control functions 31.7.2005 edited by Andun
/*!
* Faehrt eine bestimmte Strecke mit einer bestimmten Geschwindigkeit.
* Benutzt die Odometrie Sensoren im Interrupt Betrieb.
* \param distance Distanz (- rueckwaerts, + = vorwaerts)
* \param speed Geschwindigkeit (Wertebereich 0...255)
*/
void Go(int distance, int speed);

/*!
* Dreht um einen bestimmten Winkel mit einer bestimmten Geschwindigkeit.
* Benutzt die Odometrie Sensoren im Interrupt Betrieb.
* \param degree Winkel (- rechts, + links)
* \param speed Geschwindigkeit (Wertebereich 0...255)
*/
void Turn(int degree, int speed);

/*!
* gibt die aktuelle Zeit zurueck
* \return aktuelle Zeit in Millisekunden
*/
unsigned long Gettime(void);

/*!
* Wartefunktion. Delay
* \param dauer Wartezeit in Millisekunden. \see Sleep
*
* Beispiel: Warte 500ms
* \verbatim
Msleep(500);
\endverbatim
*/
/*
*/
void Msleep(int dauer);

/*!
* Initialisiert und startet die Odometriesensor Messung im Interrupt Betrieb.
* \see encoder
*/
void Encoder_Init(void);

/*!
* Odometriesensoren Werte zuruecksetzen für Interrupt Betrieb.
* \param setl Wert für links
* \param setr Wert für rechts
* \see encoder
*/
void Encoder_Set(int setl,int setr);

/*!
* Odometriesensoren Messung Interrupt Betrieb anhalten
*/
void Encoder_Stop(void);

/*!
* Odometriesensoren Messung Interrupt Betrieb starten
*/
void Encoder_Start(void);

/*!
* Ausgabe eines Integer Wertes als String ueber die serielle Schnittstelle.
*/
void PrintInt(int wert);

/*!
* gibt den Wert der Batteriespannung zurueck
* \return A/D Wandler Wert (Wertebereich 0..1023)
*/
int Batterie(void);


/*! Initialisiert die Hardware (Ports, A/D Wandler, Serielle Schnittstelle, PWM)
* Die Init Funktion, muss von jeden Programm beim Start aufgerufen werden */
void Init(void);

/*!
* Setzen der Status LED.\n
* \param color Farbe (OFF,GREEN,RED,YELLOW)
*
* Beispiel: setze Status LED GREEN
\verbatim
StatusLED(GREEN);
\endverbatim
*/
inline void StatusLED(unsigned char color);

/*!
* Setzen der Front LED\n
* \param status Zustand (OFF,ON)
*
* Beispiel: Front LED On
\verbatim
FrontLED(ON);
\endverbatim
*/
inline void FrontLED(unsigned char status);

/*!
* Setzen der Back LEDs\n
* \param left linke Back LED (OFF,ON)
* \param right rechte Back LED (OFF,ON)
*
* Beispiel: Rechte LED an, linke LED aus
* \verbatim
BackLED(OFF,ON);
\endverbatim
*/
void BackLED(unsigned char left, unsigned char right);

/*!
* Setze Motor Richtung\n
* \param left_dir Richtung linker Motor (FWD,RWD,BREAK,FREE)
* \param right_dir Richtung rechter Motor (FWD,RWD,BREAK,FREE)
*
* Beispiel: setze Richtung fuer rechten Motor auf Rueckwaerts
\verbatim
MotorDir(BREAK,RWD);
\endverbatim
*/
inline void MotorDir(unsigned char left_dir, unsigned char right_dir);

/*!
* Setze Motor Geschwindigkeit. 0= Stop, 255=Vollgas\n
* \param left_speed Geschwindigkeit linker Motor (Wertebereich 0..255)
* \param right_speed Geschwindigkeit rechter Motor (Wertebereich 0..255)
*
* Beispiel: setzt Geschwindigkeit fuer linken Motor auf 150
\verbatim
MotorSpeed(150,0);
\endverbatim
*/
inline void MotorSpeed(unsigned char left_speed, unsigned char right_speed);

/*!
* Ausgabe von Zeichen ueber die serielle Schnittstelle
* \param data Zeiger auf die auszugebenden Daten
* \param length Anzahl der Zeichen
*/
void SerWrite(unsigned char *data,unsigned char length);
/*!
* Einlesen von Zeichen ueber die serielle Schnittstelle
* \param data Zeiger auf die einzulesenden Daten
* \param length Anzahl der Zeichen
* \param timeout 0 = blockierender Mode
*/
void SerRead(unsigned char *data, unsigned char length, unsigned int timeout);

/*!
* Linienfolger Daten auslesen. Photosensoren links und rechts
* \param data Zeiger auf die zu lesenden Daten data[0] links, data[1] rechts (Wertebereich 0..1023)
*/
void LineData(unsigned int *data);

/*!
* Odometrie Daten auslesen Polling Betrieb. Photosensoren links und rechts
* \param data Zeiger auf die zu lesenden Daten data[0] links, data[1] rechts (Wertebereich 0..1023)
*/
void OdometrieData(unsigned int *data);

/*!
* Tastsensor Abfrage Polling Betrieb
* \return Tastenwert bitorientiert, K1 = Bit5, K2 = Bit4, K3 = Bit3, K4 = Bit2, K5 = Bit1, K6 = Bit0
*/
unsigned char PollSwitch (void);

/*!
* Tastsensor Abfrage Interrupt Betrieb starten.
* \see switched
*/
void StartSwitch(void);

/*!
* Tastsensor Abfrage Interrupt Betrieb anhalten.
* \see switched
*/
void StopSwitch(void);

/*!
* Wartefunktion\n
* \param time36kHz Wartezeit x/36kHz (sec)
*
* Beispiel: 1 Millisekunde warten
\verbatim
Sleep(36);
\endverbatim
* \see Sleep
*/
/*
*/
void Sleep(unsigned char time36kHz);
/* ----------- END ------------ */


/* --------------- INTERNAL ------------- */
#define GREEN_LED_ON PORTB |= GREEN_LED /*!< Gruene Status LED an */
#define GREEN_LED_OFF PORTB &= ~GREEN_LED /*!< Gruene Status LED aus */
#define RED_LED_ON PORTD |= RED_LED /*!< Rote Status LED an */
#define RED_LED_OFF PORTD &= ~RED_LED /*!< Rote Status LED aus */

#define FWD (1 << PB5) /*!< Motor vorwaerts */
#define RWD (1 << PB4) /*!< Motor rueckwaerts */
#define BREAK 0x00 /*!< Motor bremsen */
#define FREE (1 << PB4) | (1 << PB5) /*!< Motor freilaufend */

#define IRTX (1 << PB3) /*!< PB3 Port fuer Infrarot Transmitter LED */
#define GREEN_LED (1 << PB0) /*!< PB0 Port fuer Gruene Status LED */
#define RED_LED (1 << PD2) /*!< PD2 Port fuer Rote Status LED */

#define PWM (1 << PB1) | (1 << PB2) /*!< PB1, PB2 Ports fuer Pulsweitenmodulation der Motor Geschwindigkeit */
#define RIGHT_DIR (1 << PB4) | (1 << PB5) /*!< PB4, PB5 Ports fuer Drehrichtung rechter Motor */
#define LEFT_DIR (1 << PD4) | (1 << PD5) /*!< PD4, PD5 Ports fuer Drehrichtung linker Motor */

#define SWITCHES (1 << PD3) /* PD3 Port fuer Tastsensor */
#define SWITCH_ON PORTD |= SWITCHES /* Tastsensor an */
#define SWITCH_OFF PORTD &= ~SWITCHES /* Tastsensor aus */

#define BATTERIE (1 << MUX0) | (1 << MUX2) /*!< ADC5 A/D Wandler Port fuer Batterie Abfrage */
#define SWITCH (1 << MUX2) /*!< ADC4 A/D Wandler Port fuer Tastsensor */
#define IR_LEFT (1 << MUX0) | (1 << MUX1) /*!< ADC3 A/D Wandler Port fuer Linienfolger Fototransistor links */
#define IR_RIGHT (1 << MUX1) /*!< ADC2 A/D Wandler Port fuer Linienfolger Fototransistor rechts */
#define FRONT_LED (1 << PD6) /*!< PD6 Port fuer Front LED */

#define ODOMETRIE_LED (1 << PD7) /*!< PD7 Port fuer Odometrie LED */
#define ODOMETRIE_LED_ON PORTD |= ODOMETRIE_LED /*!< Odometrie LED an */
#define ODOMETRIE_LED_OFF PORTD &= ~ODOMETRIE_LED /*!< Odometrie LED aus */

#define WHEEL_LEFT (1 << MUX0) /*!< ADC1 A/D Wandler Port fuer Odometrie Sensor links*/
#define WHEEL_RIGHT 0 /*!< ADC0 A/D Wandler Port fuer Odometrie Sensor rechts */

#endif /* ASURO_H */

ogni42
21.02.2006, 17:46
Hallo,

verwendet bitte mal die code Tags. Das sieht so zwar schön symmetrisch - quasi tannenbaumig - aus, ist aber kaum zu lesen.

super_castle
21.02.2006, 17:46
am besten du setzt int amit in die for-schleife

super_castle
21.02.2006, 17:49
.....1. Bei C werden Variablen am Anfang deklariert.
Die Deklaration mitten im Code ist eine Sache von Java. .....

stimmt nicht, ist schwachsinn...du kannst "int a" auch in der for-schleife von c deklarieren.

ogni42
21.02.2006, 17:57
Die Deklaration der Variablen muss bei Ansi-C am Anfang eines Blockes stehen. Bei gnu99 können Variablen auch im Kopf einer Schleife deklariert werden. Welcher Standard verwendet wird, stellt man beim Compileraufruf per option ein (z.B. gcc -std=gnu99 ...)

BTW: Danke für die code-Tags :D

Fortuna
21.02.2006, 17:59
Vielleicht hätt ich doch einen neuen Thread aufmachen solln.

Das ganz oben hat sich erledigt, es geht mir nur darum, dass mein WIN_AVR bei a+b=c; diese Fehlermeldung rauswirft: test.c:14: error: invalid lvalue in assignment

Ich glaube nicht dass es am Deklarieren der einzelnen Variablen liegt.. sonder ganz alleine an "a+b=c;

ogni42
21.02.2006, 17:59
@Fortuna: Es heist d=a+b; etc. Das ist grundlegende C-Syntax.

Bitte besorge Dir ein C-Buch, es gibt auch sehr gute, freie Online-Kurse.

Fortuna
21.02.2006, 18:07
hab mir zwei tutorials angeschaut... mir ist das nicht aufgefallen :(

ogni42
21.02.2006, 18:23
Keine Panik. Übung macht den Meister. Wir haben alle mal angefangen und Fehler gemacht. Und nur aus denen lernen wir was!