PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmier Fragen



bloodyDragon
06.03.2007, 22:00
Hallo!

Ich habe mir erst vor kurzem den Asuro gekauft und eine erweiterungsplatine erstellt die ich über I²C ansteuere

-> ein A/D Übersetzer
-> eine Porterweiterung die eine LED dimmfunktion hat

ich möchte damit
2 taster
3-4 LEDs
einen mini Lautsprecher

die zwei ausgebauten licht transistoren ( für den I²C bus )
und einen licht transistor mit über 2 widerstände( von porterw. gest.) verstellbaren arbeitspunkt zum auffinden einer lichtquelle

ansteuern

und da haben sich einige Fragen ergeben :

-> was genau ist Clock Stretching und was muss ich dabei berücksichtigen ( das macht mein A/D beim T/H )

kann ich die I²C Master-Bibilothek einfach dazuincluden... oder?

kann ich mir Go() und Turn() wie poilingbetrieb vorstellen bis der asuro z.B
400mm gefahren ist oder rufe ich die funktion auf und kann dann z.B daten vom I²C bus einlesen?

welcher Timer ist eigentlich noch zur interruptprogrammierung frei ?

Ich bin in Punkto Mikrokontroller programmierung noch nicht sehr eingearbeitet ( habe zwar C programmierung an der Schule aber erst seit einem semester Microcontroller Programmierung in C )
und bin deshalb umso mehr für jede Hilfe dankbar!

m.a.r.v.i.n
07.03.2007, 19:11
Hi,


was genau ist Clock Stretching und was muss ich dabei berücksichtigen ( das macht mein A/D beim T/H )

Spielt wahrscheinlich keine Rolle, da die I2C Emulation sowieso langsam ist. Ansonsten siehe im RN-Wissen
https://www.roboternetz.de/wissen/index.php/Clock_Stretching


kann ich die I²C Master-Bibilothek einfach dazuincluden... oder?

Wenn du die Lib von P.Fleury meinst, ja. Einfach im Makefile die folgende Zeile enfügen


ASRC = i2cmaster.S


kann ich mir Go() und Turn() wie poilingbetrieb vorstellen bis der asuro z.B
400mm gefahren ist oder rufe ich die funktion auf und kann dann z.B daten vom I²C bus einlesen?

Go und Turn arbeiten im Pollingbetrieb. Die Funktionen werden erst beendet, wenn der Asuro die entsprechende Strecke gefahren ist.


welcher Timer ist eigentlich noch zur interruptprogrammierung frei ?

Timer0 wäre noch frei. Ist aber nur ein 8-Bit Timer.
Timer1 läuft mit 36kHz für serielle Kommunikation und Zeitschleifen.
Timer2 wird für die PWM der Motoren benötigt.

bloodyDragon
09.03.2007, 00:50
mhm ich habs wirklich nicht mit dem einbinden :(


# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
# will not be considered source files but generated files (assembler
# output from the compiler), and will be deleted upon "make clean"!
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = i2cmaster.S
ich verwende die dateien von FirstTry und habe die letze zeile eingefügt
im selben ordner befindet sich die assembler source
aber ich bekomme beim make trotzdem ein implicit function declaration

könnte es daran liegen dass die datei <avr/io.h> die die assembler datei einbindet am falschen platz ist ?

m.a.r.v.i.n
09.03.2007, 08:53
Hi hast die I2C Header Datei auch in deinem C-Programm included?



#include "asuro.h"
#include "i2cmaster.h"

bloodyDragon
09.03.2007, 11:54
Wow unglaublich ich habe es tatsächlich geschafft Compilierbaren Code zu Produzieren :D

Danke!

bloodyDragon
09.03.2007, 19:37
Hmm ich hab mich etwas durch die beschreibung des ATmega8 gelesen

wenn ich den INT0 Pin als falling Edge Interrupt verwenden möchte
und Den Timer 0 prescaled mit 256 dann müsste ich das schreiben oder.. ?

INT0 aktivierung



sei();
MCUCR|=0x03;
MCUCR&=0xF7;
SREG|=0x80;
GICR|=0x40;


Timer 0


TCCR0|=0x07;
TCCR0=0xFC;
TIMSK|=0x01;


wenn ich mir jetzt ausrechnen möchte in welchem Zeitabstand der Interrupt
ausgelöst wird muss ich
Dauer eines Clock Zyklusses ( wie schnell ist der Clock takt ? )
mal 256 ( Prescaler )
mal 1..256 (TCNT0)
richtig ?

nebenbei ist Encoder aktiviert
und INT0 sowie Timer0 sind höherrangiger als der Encoder Interrupt....
kann ich es riskieren eine I2C Abfrage in den Timer Interrupt zu geben ?

Ich habe die Go funktion kopiert und so umgeschrieben dass sie immer nachdem die variable driveEnable in einem Interrupt gesetzt wird einmal ausgeführt wird
.. es wird zwar dadurch erheblich seltener aufgerufen aber immernoch mehrmals pro sekunde .. das dürfte reichen oder ?

was bedeutet dieser Error?



make: [test.eep] Error 1 (ignored)
avr-objdump -h -S test.elf > test.lss
/usr/bin/sh: test.lss: Permission denied
make: *** [test.lss] Error 1


Wenn ich compiliere kommt folgende Fehlermeldung:

Windows - Kein Datenträger
X Es befindet sich kein Datenträger im Laufwerk. Legen Sie einen Datenträger in Laufwerk ein.

wenn ich sie ca 60 mal abbreche verschwindet sie ...
dann geht auch das compilieren ... es werden eine errors angezeigt

dafür aber Processed Exit Code 1

NACHTRAG Wenn ich Syntaxfehler habe werden diese angezeigt und natürlich nicht zu ende compiliert
wenn ich sie behoben habe kommt wieder die komische Fehlermeldung

was benötigt weniger Speicher
5 elseif's
oder Switch case ?

bloodyDragon
10.03.2007, 01:59
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



#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 ?!?

bloodyDragon
10.03.2007, 04:04
mhm falls ich wirklich so viel speicher benötige.. gibt es möglichst unaufwändige möglichkeiten den speicher zu erweitern ?

m.a.r.v.i.n
10.03.2007, 16:22
Hi,

8kB Hex File Größe ist überhaupt kein Problem. In dem File sind die Binärdaten ASCII kodiert. Dazu kommen noch Adress, Längen Angaben und CRCs. Im Speicher des Asuro sind dadurch weniger als die Hälfte belegt.
In der Asuro Lib bis zur Version 2.6.1 wurde zudem jede Menge Speicherplatz vergeudet, weil immer alle Funktionen mit eingebunden wurden, egal ob sie benötigt wurden oder nicht. Mit der neuen Lib V2.7 kriegt man wesentlich kleinere Hex-Files zustande.

Bei der Timer Programmierung kann ich dir leider nicht helfen.

bloodyDragon
13.03.2007, 00:03
ok das ist beruhigend ^^



ich komme momentan überhaupt nicht weiter ...
ihr habt doch für eure libary auch timer konfugurieren müssen oder ?
das einzige das ich bis jetzt gefunden habe ist 8Mhz .... könnte das der Takt
der CLK I/O sein ?

außerdem habe ich das hier zu Gcc 4 gefunden....

ISR (INT0_vect)
{
/* Interrupt Code */
}

void TIMER0_OVF_vect (void) __attribute__((interrupt));
void TIMER0_OVF_vect (void)
{
/* Interrupt Code */
}
-> leider war es nicht erklärt..
die definition des interrupts ok .. einfach umschreiben
aber die des timers .. auch einfach umschreiben ?

und irgendwie waren bei diesen beispielen immer irgendwelche avr\include\interrupt etc. included
wenn ich die asuro libary verwende brauche ich das nichtmehr oder ?

bloodyDragon
13.03.2007, 16:16
.. es dauert zwar länger aber irgendwann findet man was man sucht
https://www.roboternetz.de/wissen/index.php/Timer/Counter_%28Avr%29

ich werde den i2c bus einfach mal verwenden und wenn probleme auftauchen.. naja irgendwie wirds schon gehen

bleibt nurnoch die syntaxfrage ...
hat jemand vl einen link der mir vl weiterhilft ?

damaltor
13.03.2007, 18:57
das kommt darauf an... wo steckst du denn fest?

der i2c-bus wurde schon mehrfach erfolgreich auf dem asuro implementiert.

8 mhz ist der systemtakt, kein counter.

bloodyDragon
13.03.2007, 22:12
wie schnell ist der i2c bus ?
-> welche frequenz hat er ?
bzw. würde mir schon reichen ..ist der i2c bus schnell genug um in einem timer ohne größere bedenken eine i2c_read zu verwenden?

d.h. ohne prescaler (und ohne vorladen) würde z.b. timer 0 Overflow
mit 8MHz/256 ausgelöst werden ?




sollte ich vor jeder i2c bus kommunikation die interrupts aus und danach wieder einschalten ?

damaltor
14.03.2007, 08:59
der i2c-bus hat maximal 100 kHz.
8MHz/265=31,25kHz. aber: wahrscheinlich liegt die clock/taktleitung auf maximal 100kHz, dann werden einzelne bits mit dieser geschwindigkeit übertragen. dann sind es 31,25*8(bits pro byte) plus startbedingung und stopbedingung... dann wirds doch zu knapp. müsstest du wohl doch entweder einzeln abfragen. oder du nutzt die i2cmaster lib von peter fleury, wie die meisten hier im forum. die ist
1. schon fertig
2. in assembler, und braucht wenig speicher im flash
3. gut anpassbar
4. alle verzögerungen für den störungsfreien betrieb (inkl. clock stretching und begrenzung auf 100kHz) sind implementiert.

genauere infos zum i2c-bus sind hier:
http://www.robot-electronics.co.uk/htm/using_the_i2c_bus.htm

und such mal im forum nach i2c, da findest du einiges.
ich lasse die interrupts meist an, wobei es an sich nicht schaden könnte die abzuschalten. der interrupt für die sleep-funktion wird 36000mal pro sekunde ausgelöst, und stört die kommunikation trotzdem nicht.

denk dran: ohne interrupts keine sleep/msleep/SerWrite/SerRead/... also immer ans einschalten denken!!
probiers mit eingeschaltet lassen, wenns nicht geht dann mach sie aus.

m.a.r.v.i.n
14.03.2007, 10:48
Hi bloodyDragon,

ich würde für dein Problem (Go und Turn Funktion benutzen und zusätzlich I2C Abfragen) anders vorgehen. Die I2C Abfrage nicht timergesteuert starten , sondern eher die Go und Turn Funktion umschreiben (bzw. neuschreiben) in ein Verhalten.

Das ganze wäre eine von Art Quasi Multitasking. In der Hauptschleife werden nacheinander folgende Funktionen aufgerufen.



Init();
InitI2C();
InitBehaviour(); // Verhalten initialisieren
while(1)
{
ReadSensors(); // einlesen der Sensoren und I2C
RunBehaviour(); // Verhalten ausfuehren
SetActors(); // Aktoren setzen
SendState(); // evtl. Status an PC senden
}


Das ganze setzt voraus, dass alle aufgerufenen Funktionen auch in endlicher Zeit fertig werden. Längere Msleep Aufrufe in Funktionen sind deshalb pfui. Wenn eine Funktion in der vorgegeben Zeit nicht fertig wird, muß daraus ein Verhalten programmiert werden.

Ein Verhalten ist auch eine Funktion, die aber:
* mehrmals aufgerufen wird,
* ein wenig Verarbeitung macht,
* sich den Verarbeitungsstand merkt,
* und dann mit einer Statusmeldung zurückkehrt .
Programmtechnisch löst man so etwas mit State Machines.
In einer Verhaltensfunktion werden keine Sensoren direkt abgefragt und auch die Aktoren (Motoren) werden nicht direkt gesteuert. Alles geht nur über globale Variablen.

Die ReadSensors Funktion liest die Sensoren und speichert die Werte in den Sensor Variablen.

Die RunBehaviour Funktion verarbeitet die Sensor Variablen ruft die gewünschten Verhaltensfunktionen auf (Go, Turn, FollowLine etc.) und erzeugt die Aktor Variablen.

Die SetActors schließlich nimmt die Aktor Variablen und steuert die Motoren.

Wird diese Hauptschleife in 10-40ms durchlaufen, kann man von Quasi Echtzeit sprechen. Für einen kleinen Roboter ist das aber schnell genug, um auf Ereignisse zu reagieren.

Klingt nach viel Arbeit :wink:

bloodyDragon
17.03.2007, 09:02
ok klingt gut
dann werde ich versuchen dieses prinzip umzusetzen ^^

leider hänge ich momentan bei einer viel einfacheren frage...

ich habe das forum durchsucht aber scheinbar bin ich der einzige der die libary von p.fluery nicht richtig implementieren kann

ich habe die Assembler datei eingebunden
die i2cmaster.h includiert
die ports eingestellt
aber wenn ich meine i2c pins mit einem oszilloskop messe dann sieht keiner der beiden pins wie eine SCL aus !??!

ich weis nicht was

an application can be linked either against the software I2C implementation or the hardware I2C implementation.

and

Eventually adapt the delay routine in the module i2cmaster.S to your target when using the software I2C implementation !

bedeutet ... vl liegts daran ?

m.a.r.v.i.n
17.03.2007, 10:50
Hi,

Hast du die PullUp Widerstände am I2C Bus angeschlossen?
Ansonsten kannst du ja mal das Beispielprojekt aus dem AsuroWiki für die I2CPorterweiterung (http://www.asurowiki.de/pmwiki/pmwiki.php/Main/I2CPorterweiterung) ausprobieren. Dort wird ADC2 als SCL und ADC3 als SDA verwendet.
http://www.asurowiki.de/pmwiki/uploads/Main/i2cmaster.zip

Das Funktioniert bei mir und allen anderen, die die LCD Erweiterung (http://www.asurowiki.de/pmwiki/pmwiki.php/Main/LCDErweiterung) darüber betreiben, ganz gut. In der I2C Lib mußten lediglich die Ports angepaßt werden.

damaltor
17.03.2007, 17:53
genau. du brauchst die pullup widerstände.

ausserdem ist auf der scl nicht immer ein taktsignal, sondern nur, wenn auch daten übertragen werden. du kannst zB das beispielprogramm aus der zip-datei von asurowiki.de mal flashen, dann solltest du einen takt beobachten können.

bloodyDragon
20.03.2007, 12:42
Ok also der i2c funzt jetzt entlich ^^
bei mir sind die SDA und SCL pins genau umgekehrt wie bei der i2c.S
naja .. hat mich etwas nerven gekostet aber ich habs gefunden ^^

jetzt hab ich leider gleich ein anderes problem...

ich möchte ja int0 verwenden um einen tastendruck zu erkennen
und habe mir dazu ein ganz einfaches programm geschrieben..

das problem..
irgendwie wird der interrupt ständig und über 1000 mal ausgelößt
( hab eine variable die hochzählt und dann FrontLED auf ON setzt eingebaut )
( eine statische )
oder funzt das nur mit volatile ?

naja das seltsamste daran ..
obwohl ich die front led nur auf on schalte leuchtet sie nicht mit voller Leuchtkraft ???

radbruch
20.03.2007, 13:09
volatile bedeutet nur, dass sich der Wert unvorhergesehen, z.b. per Interrupt, ändern kann.

damaltor
20.03.2007, 13:38
die frontled... wirde der port nicht von der erweiterung verwendet?? dann kann das alles auch nciht so funktionieren...

der interrupt wird eigentlich immer dann ausgelöst, wenn an einem der ports des pcf8574 eine flanke erkannt wird. sende dem baustein mal eine "00000000" bzw 0 bzw 0x00, dass also alle ports auf masse liegen. dann verbinde die ports physikalisch mit der masse. wird der interrupt dann immer noch ausgelöst?

bloodyDragon
28.03.2007, 10:55
Bei mir wird die FontLED nicht verwendet

nein dann nichtmehr ^^
ich hab jetzt einfach auf die interrupterkennung des tastendrucks verzichtet...

zur zeit komme ich einigermaßen gut voran aber ...

wenn ich ein ganz simples versuchsprogramm schreibe bei dem der asuro mittels Go(100,200);
ein stück vorwärts fahren soll dann fährt mein asuro einen bogen ????

DGS
28.03.2007, 12:18
Was macht denn die Funktion Go() ?
Also die beiden Parameter.
Wenn es für linken und rechten Motor sind, ist es klar wieso Bogen macht. Glaub aber eher, dass ein Wert an beide Motoren geht, der andere die Zeit ist, richtig?
In dem Fall musst du beachten, dass selten beide Motoren gleich stark funktionieren. Wirst also Go so anpassen, dass der stärkere Motor zB nur 90% bekommt von dem, was der schwächere bekommt.

_HP_
28.03.2007, 14:20
Hi bloodyDragon,

Dein ASURO kann nur dann geradeaus fahren, wenn die Odometriesignale korrekt ausgelesen werden. Wenn Du Deine Odometer prüfst, dann solltes Du etwa ein Sinussignal pro Odometer erhalten. Das Signal wird mit dem AD-Wandler des Prozessors gemessen. Störungen durch die Motoren und ein Hin-und-Her-Wackeln des Odometrierades können dafür sorgen, dass Du keine sauberen Odometersignale bekommst. Suche mal im Forum - es gibt für alles schon Lösungen.
Dann musst Du festlegen, ab welchem AD-Spannungswert das Signal als "weißes Feld" erkannt wird und unter welchem Spannungwert als "schwarzes Feld". Der Wechsel von weiß nach schwarz und schwarz nach weiß wird gezählt. Die Library nimmt Dir die ganze Arbeit schon ab - aber nur dann, wenn die Odometersignale auch sauber ermittelt werden.
In der Go() Funktion ist dann noch eine Kopplung der Odometer eingebaut, die den Gleichlauf beider Motoren fördert.

Diese Gleichlaufregelung führt dazu, dass Dein ASURO unter Umständen sogar besser geradeaus fährt, wenn Du den ASURO einfach nur mit Geschwindigkeit 200 vorwärts fahren läßt:

MotorDir(FWD,FWD);
MotorSpeed(200,200);

- also nicht die Go() Funktion verwendest. Sollte das so sein, so ist das ein sicheres Zeichen, dass Dein Problem in den Odometersignalen zu suchen ist.

Gruß,

_HP_

damaltor
28.03.2007, 16:45
dann musst du vorher zwei befehle ausführen:

Encoder_Init();
Encoder_Set(0,0);

kann auch sein dass ein ; zwischen die beiden nulen muss, weiss grad nicht.

bloodyDragon
30.03.2007, 12:21
Ok Danke Das werde ich heute versuchen
ich bin jetzt bei ca 630 zeilen code
und beim übertragen überträgt das flash programm 52 zeilen
.. wieviele haben denn maximal im asuro platz ?
70?

ok den i2c teil habe ich entlich vollständig implementiert ^^
jetzt kommt "nurnoch" die sensoren verarbetung und die funktionalitäten der stateMachines

ich habe für jeden meiner 9 Betriebszustandsmodis eine andere Led konfiguration programmiert ^^
wenn ich wieder traffic habe werde ich ein video machen und posten ^^

Dann auf in die Odiometrie ^^

damaltor
30.03.2007, 12:49
das klingt doch gut. der selbsttest ist schon fast 90 zeilen (du meinst wohl pages, also seiten) groß. ich habe bereits erfolgreich 130 seiten geflasht, ich glaube das limit liegt bei etwa 140 oder 150.

bloodyDragon
30.03.2007, 19:24
Ok .. sehr gut
dann brauch ich mir dahingehend keine sorgen machen ^^

Mittlerweile habe ich schon eine frage:
meine Motoren verhalten sich äußerst seltsam...

scheinbar haben sie eine willkürlich ( mal schon mal nicht oO ) hohe StartReibung was dazu führt dass der asuro bei turn oder go mal startet aber nicht gerade ( weil die 2 motoren nicht gleichzeitig diese reibung überwinden) oder einer der beiden schafft es gleich garnicht loszulegen ???

ich bräuchte eine einfache lösung dieses problems weil ich ja stateMachines habe die nicht lange brauchen sollten ...

aber eigentlich wäre ich schon glücklich wenn jemand weiß woran dass liegt ?

stochri
30.03.2007, 19:27
Drücken die Motoren eventuel zu fest auf das Odometriezahnrad?

bloodyDragon
30.03.2007, 20:09
Das könnte sein
... ich werde versuchen sie wieder abzubekommen und etwas weiter hinen zu befestigen ..
weiß jemad womit man superkleber auflöst ?

oder empfiehlt sich hier einfach die "brachiale" methode ?


ansonsten ...
ich habe mich schon etwas umgeschaut
zum thema motoren gibt es ja einige sehr sehr interessante projekte

wenn ich das pech habe und meine motoren haben einfach eine sehr große haftreibung dann müßte ich so eine art PI .. PID regler einbauen der am anfang zur überwindung eben dieser sorgt ?
das problem wäre dann dass ich dafür evt. genauigkeit bei den funktionen go und turn verliere oder ?

naja .. vorerst kümmere ich mich mal um die Odometriezahnräder...

achja .. es wird ja empfohlen die Getrieberäder einzuölen..
was empfiehlt sich dazu ?
ich habe zur zeit einfach etwas rapsöl (zum kochen *g* ) verwendet
aber dass ist vermutlich nicht die optimal lösung oder ?

bloodyDragon
30.03.2007, 20:25
seltsamerweise geht es bei go(x,150); noch wesentlich besser als bei go(x,200); oder go(x,250); ????
da müsste sich mein asuro doch eigentlich leichter tun oder ??

stochri
30.03.2007, 20:46
ich habe zur zeit einfach etwas rapsöl (zum kochen *g* ) verwendet

lieber ncht, das läuft am Anfang ganz gut, aber irgendwann wird es ranzig.


seltsamerweise geht es bei go(x,150); noch wesentlich besser als bei go(x,200); oder go(x,250); ????

Ich würd auf ein Problem Deiner Motorbrücken tippen. Wird ein Transistor warm? Können die Motoren rückwärts laufen?

radbruch
30.03.2007, 21:10
weiß jemand womit man superkleber auflöst ?

Achse heismachen mit dem Lötkolben könnte funktionieren. Und dann gleich wieder festlöten..

DGS
30.03.2007, 23:02
weiß jemand womit man superkleber auflöst ?

Achse heismachen mit dem Lötkolben könnte funktionieren. Und dann gleich wieder festlöten..

Sowas funktioniert aber nur bei den Achsen.

So wie ich das verstehe, will er die MOTOREN entfernen und neu drankleben. Die Motoren sollte man aber besser nicht bis zum siedepunkt erhitzen.
btw: Meine Motoren hab ich auch mit Sekunderkleber drangeklebt. Überlege, ob das klug war. Zumindest scheint da noch genug spielraum zwischen Motor und Zahnrad zu sein.

bloodyDragon
31.03.2007, 01:33
Die Transistoren bleiben kühl
und rückwärtsfahren geht genauso gut/schlecht :(

ich werde es irgendwie schaffen die Motoren mit etwas mehr abstand zu befestigen.

Ich musste bei den kürzeren achsen etwas schleifen weil mir ein bisschen lötzinn an die falschen stellen kam...
und wenn der Motor wiedereinmal Sperrt dann kann man auch im abgeschalteten modus nur schwer das getriebe bewegen .. anfangs..
könnte es sein dass sich durch das spiel des getrieberades und dem geringen abstand der Motoren die getrieberäder verkeilen ?

es ist generell auf einer seite schlimmer.... das würde doch zur theorie passen oder ( auf einer seite habe ich mehr geschliffen und vl habe ich dort auch den motor noch näher ) ?

noch eine frage : wie heisst der kunststoff aus dem die Platine des Asuros gemacht ist ..
ich will keinen superkleberentferner kaufen ( sofern es sowas gibt )
der dann auch die platine angreift ?

was für ein öl soll mann denn zum asuro ölen verwenden ?

bloodyDragon
31.03.2007, 01:49
*gg* habe gerade einen versuch gemacht der glaube ich ebenfalls gut zur theorie passt :

ich habe meinen asuro in die hand genommen und ihn während das quadratprogramm gelaufen ist dauernd geschüttelt ( 2 min lang )
-> kein einziges mal stecken geblieben !

( davor ist es auch beim in der hand halten zum steckenbleiben gekommen )

stochri
31.03.2007, 07:08
wenn der Motor wiedereinmal Sperrt dann kann man auch im abgeschalteten modus nur schwer das getriebe bewegen .

Damit dürfte es ziemlich eindeutig sein, dass es sich um ein mechanisches Problem handelt. Die Motoren müssen sich sehr leichtgängig bewegen lassen.

Also:
- die Zahnräder müssen genügend Abstand haben und dürfen nicht klemmen
- Die Achsen müssen glatt sein

Für Kunsstoffgetriebe nimmt man normlerweise kein Öl sondern ein bestimmtes, weißlich aussehendes
http://shop.lindinger.at/product_info.php?products_id=49802

Gruss,
stochri

radbruch
31.03.2007, 10:30
Ups, sorry, ich dachte bei klemmenden Ritzel automatisch an schräge Achsen. Wer lesen kann ist eben eindeutig im Vorteil.

Meine Motoren sind btw. nur mit den Kabelbindern befestigt. Ich muss sie zwar ab und zu neu ausrichten, aber so habe ich quasi eine Sollbruchstelle, falls es mal zu heftig wird drehen die Motoren die Ritzel aus dem Eingriff.

damaltor
31.03.2007, 11:55
hoi, ich habe einfach etwas billiges feinmechaniköl auf die achsen gegeben und dann mit den zahnrädern etwas verteilt. mein asuro fährt bei etwa MotorSpeed(30,30) schon los.

könnte es daran liegen, dass die batteriespannung beim losfahren etwas abfällt, und darum nur der leichtere motor etwas bewegt?

bloodyDragon
01.04.2007, 22:36
Ok also ich hab mich mal umgeschaut ...
es gibt klebstoffentferner der angeblich auch sekundenkleber eliminiert ...
hoffentlich zerstört der die platine nicht ...

wenn ich die motoren ausgeschaltet habe und die zahnräder drehe fühlt man gans genau wenn wie zahnräder vollständig ineinandergreifen


Drücken die Motoren eventuel zu fest auf das Odometriezahnrad?
--> exakt :(


... ich bräuchte nur minimal kleinere zahnräder und ich hätte keine probleme ...
weis jemand wo man die die beim asuro verwendet werden und andere kaufen kann ?



das mit dem motoren zurücksetzen dürfte lustig werden wenn der klebstoffentferner nicht verwendbar ist...

hält die platine aceton aus ?

^^ ich werd mir das spezial zeugs kaufen ^^ kostet ja eh nicht viel

damaltor
01.04.2007, 22:54
sekundenkleber löst sich recht leicht mit heisswasser was mit etwas spüli versetzt ist. vorsichtig sein, batterien raus, und dann mit nem wattestäbchen probieren. hat bei mir gut geholfen.

aceton wird wahrscheinlich den lack der platine wegätzen und die leiterbahnen angreifen. würd ich nicht unbedingt probieren.

DGS
02.04.2007, 16:31
Ich hab den Sekunderkleber auf Unterseite des Motors angebracht und den so auf die Platine gedrückt. Ob da heißes Wasser drankommen kann?

Hab jedenfalls das Glück die Motoren richtig positioniert zu haben.

damaltor
02.04.2007, 21:39
hmm.. das dürfte schwer werden. allerdings ist die chance bei klebstofflösern und aceton ungefähr genauso groß.

bloodyDragon
03.04.2007, 08:28
Ich bin zwar zur zeit noch mit dem " Asuro wieder voll funktionstüchtig machen " beschäftigt

aber mir ist ein problem eingefallen das mich beschäftigt ...

ich habe bei meiner erweiterungsplatine einen piezo lautsprecherchen
und das produziert dank oberwellen sogar rechteckig fast ein schöneres signal als sinusförmig ..
und dieser piezo ist an meine porterweiterung angeschlossen ..

-> wenn ich ein gleichmässiges signal möchte muss ich regelmäßig den i2c bus verwenden ..
aber ich verwende im hauptprogramm auch i2c ...

setze ich im timer interrupt nur ein flag und wechsle im hauptprogramm dann den pegel habe ich vermutlich immer unterschiedliche zeiten ...


nunja da mein asuro zur zeit ziemlich demontiert ist
-- batteriekabel sind mir abgerissen und die löte ich erst wieder an wenn ich die motoren "gefixt" habe
werde ich es dann einfach mal mit der hauptprogramm variante probieren

--> schalte ich die interrupts vor und nach jeder i2c kommunikation ein/aus rufe ich vermutlich mehr teufel als ich damit banne ?

habe ich vl irgendeine möglichkeit übersehen ?

( bin am überlegen ob ich die INT0 Leitung nicht mit dem piezo verbinde aber da es eine smd platine ist wäre das vermutlich ziemlich auffälliges gemurkse )
aber dann wären dafür die softwareprobs schnee von gestern...

damaltor
03.04.2007, 16:05
hmm dann probiere doch die leitung mit dem piezo zu verbinden. es muss in erster linie funktionieren, und nicht unbedingt schön aussehen ;)

bloodyDragon
03.04.2007, 21:21
ok der asuro ist wieder einsatzbereit ^^

jep das werd ich wohl machen .. aber der kommt ganz nach hinten in der liste ... ist verdammt leise :(

ab jetzt ist mein hauptproblem die genauigkeit...
( mein asuro dreht sich z.B um die eigene achse und ermittelt den größten lichteinfall und dann dreht er sich auf diese position ) ...

und irgendiwie macht er das immer nochnicht exakt ( 360° sind != 360° aber auch nich immer der selbe wert anders oO ? )

dazu gibts sicher schon einige threads oder ?
ich werd herumsuchen aber wenn jemand einen besonders hilfreichen thread oder sonstiges weis .. her damit ^^

damaltor
03.04.2007, 21:48
ja such mal.. die beste möglichkeit ist mehrfach zu messen und den mittelwert zu bilden. lass ihn 10mal drehen und dann drehen, so wirds genauer. je öfter du misst, desto geringer der fehler

bloodyDragon
04.04.2007, 01:54
ok ich hab zu dem thema einiges gefunden .. eigentlich zuviel *g*

jetzt kenn ich mich zwar besser aber unterm strich wieder garnicht aus

... mein asuro wird vermutlich immer nur eher kurze strecken fahren und blöderweise habe ich ähnlich wie sternthaler einen etwas lahmeren motor
und deshalb fährt mein asuro mit go und turn eher weniger zufriedenstellend weg...

leider habe ich den überblick verloren .. mit welchem prinzip kann ich dass jetzt am einfachsten unterbinden ?

naja werd mich morgen nochmal durch die codebeispiele lesen dass geht heute nichtmehr so gut...

bloodyDragon
04.04.2007, 19:36
also ich habe zwar von reglern bis jetzt so gut wie garnichts gehört aber

mein plan sieht momentan so aus :

einen PI regler programmieren der mir am ende die motor pwm werte für eine schöne geradeausfahrt liefert

und dann einen PID regler proggen der mit diesen werten startet ?

EDIT : jaja ... irgendein wort aufgeschnappt und damit rumgeworfen .. *g*

als erstest mache ich einen I regler um die standard einstellung meiner motoren zu finden für 100 und 200 speed ( die geschwindigkeiten werden per taster einstellbar sein )
und dann programmiere ich einen P regler oder so ...

mal sehen was die nächsten 100 odometriethreads seiten so erzählen ^^

bloodyDragon
05.04.2007, 02:17
diff = encoder[LEFT] - encoder[RIGHT];
if (diff > 0) { //Left faster than right
if ((l_speed > speed) || (r_speed > 244)) l_speed -= 1;
else r_speed += 1;
}
if (diff < 0) { //Right faster than left
if ((r_speed > speed) || (l_speed > 244)) r_speed -= 1;
else l_speed += 1;
}
Msleep(1);
MotorSpeed(l_speed,r_speed);
}


das bewirkt bei meinem asuro dass er zuerst halbwegs gleichmäßig
dann einen bogen bis mehrere kreise
dann auf einem rad stehenbleibt
dann plötzlich wieder ganz schnell mit beiden wegfährt und das ganze widerholt

???

warum wird bei der go() funktion EncoderSet(0,0) verwendet ?

damaltor
05.04.2007, 16:27
damit der encoder am anfang zurückgesetzt wird. mit encoder_set werden die werte eingetragen, und zu beginn sollten beide 0 sein.

bloodyDragon
09.04.2007, 23:21
an welchem bautleil liegt folgendes problem :
mein asuro fährt bei konstanter 200,200 PWM FWD
zuerst einen größeren dann einen immer engerwerdenden kreis dann
fast geradeaus und anschließend einen kreis in die andere richtung ??

bei KONSTANTER PWM ?!?!?!?!
rückwärts fährt er etwas langsamer und genausowenig sinnvoll ???

beim Lichtfinden das mittlerweile schon funktioniert ^^ ( auf 2 meter )
ist es nicht so schlimm weil der asuro wenn das licht zu dunkel / wenig wird
einfach nochmal nach dem hellsten punkt sucht ( dabei verwende ich nur den normalen motor der nicht herumpowert ) und wieder etwas näher fährt
bevor er wieder in die falsche richtung schaut...
aber beim linienfolgen dürfte das schwieriger werden
.. zumindest wenn ich flüssig folgen können will ?

.. in der schule könnte ich eventuell mit einem oszilloskop signale messen
welche wären denn dann interessant ?

damaltor
11.04.2007, 15:39
miss mal die spannung die am motor anliegt. das müsste theoretisch ein rechtecksignal sein. wenn die frequenz oder die maximalspannung nicht konstant sind, dann liegts an der elektronik. wenn die werte fein sind, dann liegts wohl irgendwie am motor.

ansonsten: ausgleichen durch odometrie... =)

bloodyDragon
12.04.2007, 12:24
bei dem verhalten ist nichtmal garantiert dass grössere pwm auch mehr leistung bedeutet oO

naja in ca 2h werd ich mal messen und dann hoffentlich feststellen dass es am motor liegt.

bloodyDragon
16.04.2007, 10:00
ok also das PWM funktioniert einwandfrei .... liegts wohl an den motoren ? oO

damaltor
16.04.2007, 13:24
sieht so aus. du kannst mal probieren, die einige zeit lang laufen zu lassen, also den asuro aufbocken (wenn du raucher bist: eine kippenschachtel ist prima) und die motoren 5-10 minuten auf halber kraft oder auf 200 etwa laufen lassen. vielleicht ist das öl fest geworden oder sie müssen sich einfach etwas einlaufen.

bloodyDragon
19.04.2007, 21:14
ok warum auch immer die motoren nicht funktioniert haben ... sie funktionieren momentan wieder ^^


StartSwitch();
while(1) {
PrintInt(switched);
if(switched == TRUE) { // Tastendruck

t1 = PollSwitch();
t2 = PollSwitch();

StartSwitch();
switched = FALSE;
PrintInt(t1);
PrintInt(switched);
SerPrint ("\n\r");
}
}


warum wird hier nur einmal t1 ausgegeben ???
ich komm nicht dahinter ?

damaltor
20.04.2007, 09:24
wofür ist die if-abfrage am ende da? da ist nix drin... in deinem code werden 3 {} geöffnet, aber nur 2 geschlossen. da stimmt was nicht.

bloodyDragon
20.04.2007, 17:17
rauskopiert ... die if hat zur zeit keine verwendung

zwischen letzter } und fehlehlender } steht noch redSensors und runBehaviour }


korrigiert.

damaltor
20.04.2007, 18:31
liegt es daran dass du switched auf null setzt? die interruptroutine wird wohl nur einmal ausgeführt, also muss der taster erst losgelassen werden und dann wieder gedrückt werden.

bloodyDragon
21.04.2007, 00:06
ja genau dass will ich ja !
aber nach einem mal aufrufen ist sense !
und wenn ich es anders mache wird es immer aufgerufen !?!?!?!?!

gibt es irgendwelche andere funktionen die switch beeinflussen könnten ?
ich hab schön langsam alle mir erdenklichen varianten durch ?!?!

Sternthaler
21.04.2007, 01:16
@bloodyDragon
Dein Programm wartet nicht auf das loslassen des Tasters um dann wieder auf das Drücken zu warten.
Eventuell hilft folgendes:


StartSwitch();
while(1) {
PrintInt(switched);
if(switched == TRUE) { // Tastendruck

t1 = PollSwitch();
t2 = PollSwitch();

PrintInt(t1);
PrintInt(switched);
SerPrint ("\n\r");

while (switched == TRUE) {
switched = FALSE;
StartSwitch();
Sleep (10); // muesste ueberfluessig sein
}
}
}

oder 'logisch' lesbarer:


switched = FALSE;
StartSwitch();
while(1) {

while (switched == FALSE)
; // warte auf druecken

t1 = PollSwitch();
t2 = PollSwitch();

PrintInt(t1);
SerPrint ("\n\r");

while (switched == TRUE) { // warte auf loslassen
switched = FALSE;
StartSwitch();
Sleep (10); // muesste ueberfluessig sein
}
}


Der sleep in der inneren while-Schleife hat nichts mit dem oben angesprochenen warten zu tun. Hab ich nur mal vorsichtshalber da hingeschrieben, da ja auch der Interrupt Zeit braucht bis er die switched-Variable gesetzt hat.
Das 'PrintInt(switched);' habe ich mal entfernt, da ich glaube, dass du das nur zum testen eingebaut hast.

bloodyDragon
22.04.2007, 18:44
ahh danke !

eine frage noch ..
gibt es eine möglichkeit das ganze ohne poiling zu realisieren ?
( ich habe alles in state machines realisiert )
und wenn mein asuro an die wand gefahren ist sollte er sofort wieder zurückfahren oder ? )

bloodyDragon
22.04.2007, 19:33
0switched 4
0switched 1 // nach dem einschalten
0switched 4
0switched 1
11switched 2 // taste eins gedrückt
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1 // schon seit langem taste ausgelassen ..
1switched 3
1switched 1
1switched 3 // wtf ?
1switched 1




void tastenCheck(void)
{
static unsigned char pressed = 0;
unsigned int t1,t2;
PrintInt(switched);
SerPrint("switched 1 \n\r");
if(switched == TRUE && pressed == 0) { // Tastendruck
pressed = 1;
t1 = PollSwitch();
t2 = PollSwitch();
taste = (t1+t2+1)/2;
PrintInt(taste);


PrintInt(switched);
SerPrint("switched 2 \n\r");
}

if(pressed == 1 && switched == TRUE) {
StopSwitch();
switched == 0;
PrintInt(switched);
SerPrint("switched 3 \n\r");
}

if(switched == 0) {
pressed = 0;
StartSwitch();
PrintInt(switched);
SerPrint("switched 4 \n\r");
}

}


kann mir jemand erklären wo der fehler liegt ?

es ist nichtmehr meine ursprüngliche static versuchsvariante da ich herumprobiert habe

.. das ergebnis war immer das selbe ?!?!

whats wrong ?

Nepi
23.04.2007, 00:18
Hab den Code nur Überflogen, glaube es ist die Zeile:
if(pressed == 1 && switched == TRUE) {
StopSwitch();
switched == 0; <---------------------------------da

bloodyDragon
23.04.2007, 00:59
thx ^^
immer wieder die noobie fehler oO


yehaaaa das GEHT :D:D:D
ich hab die letzte if jetzt noch an den anfang gestellt
ändert eigentlich nix und es gibt fix keine probs mit startswitch()

0switched 1
0switched 4
0switched 1
0switched 4
0switched 1
0switched 4
321switched 2
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1
0switched 3
0switched 1
0switched 4
0switched 1


void tastenCheck(void)
{
// Switched 1
static unsigned char pressed = 0;
unsigned int t1,t2;
if(switched == FALSE) {
pressed = 0;
StartSwitch();
// Switched 4
}
if(switched == TRUE && pressed == 0) { // Tastendruck
pressed = 1;
t1 = PollSwitch();
t2 = PollSwitch();
taste = (t1 > t2) ? t1:t2;
// Switched 2
}
if(pressed == 1 && switched == TRUE) {
// Switched 3
switched = FALSE;
StartSwitch();
}
}



ich kann mich täuschen aber es wäre vl praktisch eine leserlichere version hiervon bei der dokumentation von der asurolibary zuzufügen...

( als anfänger ( wie ich *g* ) vergisst mann schnell mal dass eine taste auch bei einem mal drücken mehrmals abgefragt wird )

naja .. nur ein vorschlag =)

Sternthaler
23.04.2007, 01:12
@bloodyDragon: Freut mich, dass das Prinzip funktioniert.
Nepi hat deinen Fehler ja schon gefunden. (Und ich sehe gerade, dass du es schon umgebaut hast)

Mit dem Polling ist das so eine Sache.
Zum einen wird dein Hauptprogramm ja immer die berühmte while(1)-Schleife haben in der alles zum leben des Asuros getan wird.

Innerhalb dieser Haupt-Schleife prüfst du mit deiner Funktion tastenCheck() die Tasten. Das Ergebnis steht dir ja danach in der globalen Variable taste zur verfügung. (Bestimmt startes du darüber die Motoren um mal ein Stück geradeaus zu fahren.)
Wenn du zum Fahren z.B. die Funktion Go() aus der Lib (dank an stochri für die Funktion) benutzt, wirst du jetzt Pech haben mit den Tasten.
Die Go()-Funktion kommt nämlich erst dann in deine Haupt-Schleife zum nächsten Tastenlesen zurück, wenn die komplette Strecke gefahren wurde.

Hier wäre es nun deine Aufgabe die Go()-Funktion auch noch in eine Status-Maschine umzubauen, so dass auch sie zurückkommt nachdem sie sich z.B. 'nur' mal eben um das Geradeausfahren gekümmert hat. Ein weiterer Status in der Funktion müsste dann natürlich auch noch das erfolgreiche Abfahren der gewünschten Strecke anzeigen und bearbeiten.

Wäre bestimmt eine interessante Lösung für die Lib. Dann aber bitte auch gleich für die Turn()-Funktion ;-)

Falls du nicht Go() und/oder Turn() benutzt, würde es mich (und die anderen Helfer bestimmt auch) sehr stark interessieren was du bis jetzt komplett programmiert hast. Da bekommt man dann doch eher eine Übersicht was du so treibst und wo dann evl. geholfen werden kann.

bloodyDragon
24.04.2007, 17:22
Die Go() funktion habe ich kopiert und in eine state machine umgewandelt
wenn meine drive funkion das 1. mal aufgerufen wird wird sie mit den benötigten werten initialisiert ( hat auchnoch den vorteil dass ich die standardabweichung der motoren von anfang an großteils korrigiert habe ) und fährt solange gerade aus bis eine andere funktion aufgerufen wird

turn habe ich auch in einer state machine variante aber bei mir dreht sich nur ein rad

^^ ich erkläre mich gerne bereit die turn und go umzubauen

vermutlich mache ich dann eine LoadGo und eine LoadTurn
mit der man die distanz und speed bestimmen kann .

naja ich bin momentan bei 1120 zeilen code :D
iss schon einiges mittlerweile und da ich am samstag fertig sein sollte und momentan meine i2c_modis aus irgendeinem grund nicht genau so machen wie ich möchte hab ich etwas stress -> wenn ich das machen soll/kann/darf mach ichs nächste woche

eine frage noch
position = (i2c_lLine>i2c_rLine) ? OFF_RIGHT : OFF_LEFT;
wenn true ist positon = OFF_RIGHT wenn FALSE ist position = OFF_LEFT oder ?

bloodyDragon
24.04.2007, 18:38
test.c:449: error: 'for' loop initial declaration used outside C99 mode

(was heisst das ?? )
die for ist in einer if in einer state machine ... ?

EDIT: scheinbar darf man in einer for(
kein for(int i = 0; etc. machen

damaltor
24.04.2007, 18:59
richtig, das darf nur in einer schleife der obersten ebene gemacht werden. also musst du die variablen vorher deklarieren...

Sternthaler
24.04.2007, 19:03
Ich gehe mal (wieder) davon aus, dass OFF_... beides defines sind.
Wenn da mehr als nur eine Zahl hinter steckt, ohne das das Ganze in { }-Klammern steht, dann glaube ich, dass die Syntax hier nicht mitspielt.

Evl. mal mit einen normalen if-statement probieren.

bloodyDragon
24.04.2007, 20:08
WOHOOOO ^^
ich bin fertig ^^
mein linienfolgemodus lässt sich entlich durch nichts mehr aus der ruhe bringen ^^

yeah !!

jetzt hab ich quasi keine probleme mehr ^^
quasi weil der i2c modus immernochnicht funzt..
aber nur einer und der fällt nicht auf.. ^^

jetzt noch einen herumfahrmodus hinzugefügt und den Go modifizierten Code in eine funktion gefasst und ich bins . zu 99% yehaaaaa

( so ich hab ja schon viel davon geredet ein video zu machen aber jetzt mach ich eines ^^

bloodyDragon
24.04.2007, 20:08
*gg* jep die OFF's sind defines

Sternthaler
25.04.2007, 18:04
Schön, dass du es geschafft hast.
Video ist toll,
(Kompletter) Code auch. Wenn es nicht zu viele Betriebsgeheimisse verrät ;-)

bloodyDragon
26.04.2007, 23:46
kk ^^

eine frage noch ( möchte mir meine timer zeit mal gnau ausrechnen )

die zeit die der prescaler teilt ist das der oszi takt oder oszi takt /12 ?

-> 8 mhz oder halt .. 8/12 ?

Sternthaler
27.04.2007, 09:45
Der schnellste Takt ist der CLKio. Dieser entspricht dem CLKcpu, also 8Mhz.
Durch Prescaler kannst du den Takt redutzieren. Im Handbuch (ATmega8) werden die möglichen Prescaler beschrieben.

8 Bit-Timer/Counter 0 Seite 67:
8 Mhz durch Prescaler (Prescaler Seite 72 CS02:0 Faktor 8, 64, 256, 1024)

16 Bit-Timer/Counter 1 Seite 74:
8 Mhz durch Prescaler (Prescaler Seite 72 CS12:0 Faktor 8, 64, 256, 1024)

8 Bit-Timer/Counter 2 Seite 104:
8 Mhz durch Prescaler (Prescaler Seite 121 CS22:0 Faktor 8, 32, 64, 128, 256, und 1024)

Ich hoffe, nicht alzu viele falsche Seite aufgeführt zu haben.

bloodyDragon
26.06.2007, 21:38
Ich habe ja vor einiger zeit die erweiterungsplatine von BOAS elecronics programmiert was mir ohne eure hilfe niemals gelungen wäre
VIELEN DANK !!!!!!!

und da die firma noch ca. 10 erweiterungsplatinen über hat gibt sie diese für eine Spende an das jugendzentrum lengau her ( mind. 10€ )

die ersten die spenden werden eine platine zugesendet bekommen und von mir supportet werden...
ich stelle meinen code / den von BOAS unter gnu zu verfügung
und stelle ein paar bilder der platine online + videos von asuro in action


Bankverbindung für Spenden für's Jugendzentrum Lengau:

Volksbank Lengau, BLZ 44 020, Kto-Nr. 32036010700 - Empfänger Ninja Habietinek

- für Spenden für ASURO-PIEPS

- ASURO PIEPS name und adresse unter Betreff eintragen und mir schreiben dass ihr gespendet habt
( michael.maie@gmail.com )

bloodyDragon
26.06.2007, 22:32
Die I2c simulation .. Daten und Takt genau andersrum der rest ist gleich.
Die Pics & movies wollen sich einfach nicht onlinestellen lassen ....
http://www.bilder-hochladen.net/files/thumbs/35w6-1.jpg (http://www.bilder-hochladen.net/files/35w6-1-jpg.html)
http://www.bilder-hochladen.net/files/thumbs/35w6-2.jpg (http://www.bilder-hochladen.net/files/35w6-2-jpg.html)
http://www.bilder-hochladen.net/files/thumbs/35w6-3.jpg (http://www.bilder-hochladen.net/files/35w6-3-jpg.html)
http://www.bilder-hochladen.net/files/thumbs/35w6-4.jpg (http://www.bilder-hochladen.net/files/35w6-4-jpg.html)
http://www.bilder-hochladen.net/files/thumbs/35w6-5.jpg (http://www.bilder-hochladen.net/files/35w6-5-jpg.html)
http://www.bilder-hochladen.net/files/thumbs/35w6-6.jpg (http://www.bilder-hochladen.net/files/35w6-6-jpg.html)
http://www.bilder-hochladen.net/files/thumbs/35w6-7.jpg (http://www.bilder-hochladen.net/files/35w6-7-jpg.html)