ich habe zwar seit einem weilchen nichtmehr erfolgreich kompiliert aber
mir ist aufgefallen dass meine HEX datei 8kB groß ist .....
das beunruhigt mich...
das hier ist mein programm...
es ist mit vielen globalen variablen und ohne zeiger programmiert
.. da wäre vermutlich noch etwas komprimiermöglichkeit
außerdem habe ich einige INT's wo chars reichen würden..
aber ist dieses programm wirklich schon fast zu groß für den ASURO
Code:
#include <asuro.h>
#include <i2cmaster.h>
#define I2C_PORTERW 0x40
#define I2C_ADC 0xC8
#define TASTE1 0x01
#define TASTE2 0x02
#define BOTH 0x00
#define NONE 0x03
#define SEC2 0xFF
/* MODUS :
0... Stop
1... Folge Linie
2... Suche Lichtquelle
3... Freestyle zur zeit STOP
4... Langsame Geschwindigkeit
5... Schnelle Geschwindigkeit
*/
void i2c_startConfig(void);
void i2c_setPorterw(unsigned char chooseRegister,unsigned char wert);
unsigned char i2c_readPorterw(void);
void Drive (void); // is set by global Speed
volatile int driveEnable=0;
volatile int measure;
volatile int checkTasten=0;
volatile int modus=0;
volatile int speed=200;
int main(void)
{
Init();
i2c_init(); // initialize I2C library
sei();
MCUCR|=0x03;
MCUCR&=0xF7;
SREG|=0x80;
GICR|=0x40;
TCCR0|=0x07;
TCCR0=0xFC;
TIMSK|=0x01;
EncoderInit();
i2c_startConfig();
//unsigned char ret;
while (1)
{
if(modus==0 || modus==3)
{ MotorDir(BREAK,BREAK);
}
else if(modus==1)
{ //Linienfolge
}
else if(modus==2)
{ //Lichtsuche
if(driveEnable)
{ Drive();
}
}
else if(modus==4)
{ //Geschwindigkeit Langsam
speed=100;
modus=0;
}
else if(modus==5)
{ //Geschwindigkeit Schnell
speed=200;
modus=0;
}
return 0;
}
}
SIGNAL (SIG_INTERRUPT0)
{ checkTasten=1;
}
SIGNAL(SIG_OVERFLOW0)
{
if(checkTasten==1)
{
static int time; // Zählt die vergangene Zeit nach dem Tastendruck
static unsigned char wert1=0; // wert1 ist nötig um das drücken Beider Tasten richtig zu erkennen
unsigned char wert;
wert=i2c_readPorterw();
wert1&=wert;
if(wert1!=NONE) // Wenn checkTasten zurecht gestetzt wurde beginnt die messung der Tastendruckdauer
{ time++;
}
else if(wert==NONE && time) // Da das Auslassen der Tasten keinen Einfluss auf wert1 hat wird wert überprüft
{
if(time<SEC2)
{
modus=wert1;
}
else // Wurde länger als 2 Sekunden gedrückt werden 3 andere Modis verwendet.
{
modus=wert1+3;
}
checkTasten=0;
time=0;
wert1=0;
}
}
driveEnable=1;
}
void i2c_startConfig(void)
{
unsigned char data1=0,data2=0;
// Porterweiterungs Initialisierung
data1=0x0F; // Configuration Register
data2=0x0B; // xxxx1011
// Interrupt Enabled,Global Intensity Off, Blink Flip On, Blink Enable
i2c_setPorterw(data1,data2);
data1=0x03; // Input/Output Configuration Register
data2=0x03; // Port 1 und 2 Inputs
i2c_setPorterw(data1,data2);
// intensity //interrupt configured as interrupt -> goes low if change is detected
data1=0x0E; //Master and Global Intensity Register
data2=0x10; //PWM On ,Interrupt is not used as General Puropse Output
i2c_setPorterw(data1,data2);
// intensity leds
data1=0x12; // P5,P4 //Blaue Leds.. Helligkeit Signalisiert Geschwindigkeit
data2=0xEE; // High Intensity
i2c_setPorterw(data1,data2);
data1=0x13; // P6 und Tonausgabe // Gelbe Led Reagiert auf Tastendruck
data2=0x77; // Tonausgabe Rechtecksignal
i2c_setPorterw(data1,data2);
data1=0x11;
data2=0xFF; // Widerstände statisch High
i2c_setPorterw(data1,data2);
// Blink Phasen initialisierung
data1=0x01; // Blink Phase 1
data2=0xBC; // 1011 1100
//
i2c_setPorterw(data1,data2);
data1=0x09; // Blink Phase 2
data2=0xCC; // 1100 1100
i2c_setPorterw(data1,data2);
// ADC Initialisierung
//Setup Byte // AIN3/ REF = Ref output, SingleEnded, Clockstretching sampling activated
//Configuration Byte
i2c_start(I2C_ADC+I2C_WRITE);
i2c_write(0xF2);
i2c_write(0x05);
i2c_stop();
}
void i2c_setPorterw(unsigned char chooseRegister, unsigned char wert)
{
unsigned char data=0;
i2c_start(I2C_PORTERW+I2C_WRITE);
data=chooseRegister;
i2c_write(data);
data=wert;
i2c_write(data);
i2c_stop();
}
void Drive ()
{
int diff = 0;
int l_speed = speed, r_speed = speed;
MotorSpeed(l_speed,r_speed);
MotorDir(FWD,FWD);
driveEnable=0;
diff = encoder[LEFT] - encoder[RIGHT];
if (diff > 0)
{ //Left faster than right
if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
else r_speed += 10;
}
if (diff < 0)
{ //Right faster than left
if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
else l_speed += 10;
}
EncoderSet(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
}
unsigned char i2c_readPorterw()
{
unsigned char data=0x00,wert=0;
i2c_start(I2C_PORTERW+I2C_READ);
i2c_write(data);
wert=i2c_readNak();
wert&=0x03;
return wert;
}
wenn ja ist das ... verdammt schlecht....
ich habe bis jetzt nicht viel mehr als die tastenabfrage und die initialisierung programmiert ?!?
Lesezeichen