-
Wenn ichs so schreibe schreibt ers richtig
Code:
#include <avr/io.h>
#include "i2cmaster.h"
#include "asuro.h"
#define Display 0x74 // device address of Display, see datasheet
int main(void)
{
int ret=0;
Init();
i2c_init();
ret = i2c_start(Display+I2C_WRITE);
if ( ret )
{
i2c_stop();
StatusLED(RED);
while(1);
}
Msleep(200);
i2c_write(0x00);
Msleep(200);
i2c_write(0x01);
Msleep(200);
i2c_write(0x2E);
Msleep(200);
i2c_write(0x0F);
Msleep(1000);
i2c_write(0x06);
Msleep(200);
i2c_stop();
ret = i2c_start(Display+I2C_WRITE);
if ( ret )
{
i2c_stop();
StatusLED(RED);
while(1);
}
Msleep(200);
i2c_write(0x40); //Kontroll Byte
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xC9); //I
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xEC); //l
Msleep(200);
i2c_write(0xEF); //o
Msleep(200);
i2c_write(0xD6); //V
Msleep(200);
i2c_write(0xC5); //E
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xD9); //Y
Msleep(200);
i2c_write(0xEF); //o
Msleep(200);
i2c_write(0xD5); //U
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xC1); //A
Msleep(200);
i2c_write(0xCE); //N
Msleep(200);
i2c_write(0xC4); //D
Msleep(200);
i2c_write(0xA0); //leer
Msleep(200);
i2c_write(0xCD); //M
Msleep(200);
i2c_write(0xC9); //I
Msleep(200);
i2c_write(0xCB); //K
Msleep(200);
i2c_write(0xC1); //A
Msleep(200);
i2c_write(0xC1); //A
Msleep(200);
while(1);
return 0;
}
-
wie richtig? in 2 zeilen?
-
jo in 2 zeilen
---------------------------------
15 zeichen schreiben^^
-
hmm... naja dann würde ich sagen lass es erstmal so. ich hab noch ein wenig gesucht im datenblatt und hab folgendes gefunden:
das control byte (was nach dem i2c_start gesendet wird) besagt dass ab jetzt nur noch daten kommen, also zeichen die angezeigt werden sollen.
wenn man einen befehl senden will, zB um in die nächste zeile zu springen, dann muss man folgendes tun:
die initialisierung bleibt die gleiche. das control byte wird verändert, es wird dann ein anderer wert gesendet. das display weiss dann, dass ab jetzt immer abwechselnd zwei datenbytes und dann ein neues control byte oder ein befehl kommt. man muss also immer nach 2 zeichen ein entsprechendes control byte senden. das wäre dann so: "I " (control byte) "Lo" (CB) "ve" (CB) " Y" (CB) "ou" (befehl zum zeilenwechsel) (control byte) "An" (CB) "d " und so weiter. es werden also immer zwei bytes die gesendet wurden angezeigt, beim dritten wird geschaut obs ein befehl ist oder wieder ein control byte. sehr umständlich, ich glaube ich würde mit den leerzeichen leben...
falls irgend jemand das aus dem datenblatt anders rausfindet, bitte posten, kann gut sein dass ich mich getäuscht hab. ist schon sehr umständlich so.
-
wenn ich bei jedem die 10 leerzeichen rein mache funktionierts auch mit 3 zeilen ich glaube aber es brauchen nur 9 leere zeilen (sagen wir unterschiedlich kommt halt darauf an wo genau das ende ist schliesst ja nicht immer mit der zeile ab) thx Damaltor. Ich nehme einfach die kürzesete zeit bei den leerzeichen funktioniert dann hervoragend. Hätte ich Meine Digicam würde ich ein bild posten kommt aber erst morgen wieder nach hause^^
-
du kannst allgemein alle msleeps auf 3 millisekunden verkürzen (Msleep(3);).
die längste anweisung des displays dauert glaube ich 2,1 millisekunden (Display clear) und zum "booten" hat das display genug zeit während der bootloader des asuro arbeitet.
-
So habe es auf 3 ms verkürtzt es funktioniert boar hammer soooooo schnell kann ich gar nicht schauen^^. Jetzt ne andere frage den asuro über odometrie laufen zu lassen ist kein problem oder? Es gibt ja noch ne while(1); einfach da die daten rein schreiben und fertig oder?
-
wie jetz... dass er erst was ausgibt und dann fährt? häng einfach alles ans ende dran... sieh einfach alles was zum display gehört als eine funktion und arbeite damit als wenn es nur eine einzelne anweisung wäre.
-
jo stimmt vergass sorry die 3 ms sind ja blitzartig verstrichen das es eigendlich direkt los geht^^
Code:
#include <avr/io.h>
#include "i2cmaster.h"
#include "asuro.h"
#define Display 0x74 // device address of Display, see datasheet
#define aus MotorDir(BREAK,BREAK)
#define go {MotorSpeed(150,150);MotorDir(FWD,FWD);}
#define backturn { MotorSpeed(150,250);MotorDir(RWD,RWD);Msleep(1000);}
int speed()
{
int rightspeed,leftspeed;
int leftold,rightold;
Encoder_Set(0,0); // reset encoder
leftold=encoder[LEFT];
rightold=encoder[RIGHT];
Msleep(300);
leftspeed=encoder[LEFT]-leftold;
rightspeed=encoder[RIGHT]-rightold;
//SerWrite(" speed Left,Right ",19);
//PrintInt(leftspeed);
//PrintInt(rightspeed);
return leftspeed+rightspeed;
}
int main(void)
{
int n,v,nullspeed;
int ret=0;
Init();
BackLED(ON,ON);
i2c_init();
ret = i2c_start(Display+I2C_WRITE);
if ( ret )
{
i2c_stop();
StatusLED(RED);
while(1);
}
Msleep(3);
i2c_write(0x00);
Msleep(3);
i2c_write(0x01);
Msleep(3);
i2c_write(0x2E);
Msleep(3);
i2c_write(0x0F);
Msleep(3);
i2c_write(0x06);
Msleep(3);
i2c_stop();
ret = i2c_start(Display+I2C_WRITE);
if ( ret )
{
i2c_stop();
StatusLED(RED);
while(1);
}
Msleep(3);
i2c_write(0x40); //Kontroll Byte
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xC8); //H
Msleep(3);
i2c_write(0xC5); //E
Msleep(3);
i2c_write(0xCC); //L
Msleep(3);
i2c_write(0xCC); //L
Msleep(3);
i2c_write(0xCF); //O
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xC9); //I
Msleep(3);
i2c_write(0xA7); //´
Msleep(3);
i2c_write(0xCD); //M
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xC1); //A
Msleep(3);
i2c_write(0xD3); //S
Msleep(3);
i2c_write(0xD5); //U
Msleep(3);
i2c_write(0xD2); //R
Msleep(3);
i2c_write(0xCF); //O
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xC3); //C
Msleep(3);
i2c_write(0xD2); //R
Msleep(3);
i2c_write(0xC5); //E
Msleep(3);
i2c_write(0xC1); //A
Msleep(3);
i2c_write(0xD4); //T
Msleep(3);
i2c_write(0xC5); //E
Msleep(3);
i2c_write(0xC4); //D
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xA0); //leer
Msleep(3);
i2c_write(0xC2); //B
Msleep(3);
i2c_write(0xD9); //Y
Msleep(3);
i2c_write(0x2E); //>
Msleep(3);
i2c_write(0xC4); //D
Msleep(3);
i2c_write(0xC1); //A
Msleep(3);
i2c_write(0xCE); //N
Msleep(3);
i2c_write(0xCA); //J
Msleep(3);
i2c_write(0xCF); //O
Msleep(3);
i2c_write(0x2F); //<
Msleep(3);
i2c_write(0x2F); //<
Msleep(3);
Encoder_Init();
StatusLED(OFF);
SerWrite("\n\rASURO OK\n\r",8);
go;
Msleep(500);
nullspeed=speed()-10;
while(1)
{
v=speed();
SerWrite("\n\r speed ",9);
PrintInt(v);
if(v<nullspeed)
{
backturn;
go;
Msleep(500);
}
}
return 0;
}
so funktioniert alles. war nur für test zwecke
-
Hi Dalmator,
kannst du vllt die Library die ich für danjoo geschrieben habe korrigieren, sodass es funktioniert? Ich kann nämlich nicht testen