ja das ist wahr. auf jeden fall einen versuch wert.
Druckbare Version
ja das ist wahr. auf jeden fall einen versuch wert.
Jo habe das gleiche bestellt aber schon gestern sorry. Aber es funktioniert ja soweit waren wir ja schonZitat:
Zitat von raid_ox
Hi das neue zusammen gebaute Display funktioniert jetzt (endlich). Habe die lib von dir ausprobiert es lässt sich zwar compilieren abe aufen asuro passiert leider garnicht das display schaltet sich leider nicht ein.Zitat:
Zitat von raid_ox
Gruss Danjo
Hattest du mir nicht im icq gesagt dass alles geht, bis auf zeilenwechsel?
Macht es doch Damaltor raid_ox hatte versucht mir eine neue und eigene LIB zu schreiben mit dem namen LCD dritt letzter oder vorletzter text auf der seite 7. Display funktioniert gut habe es hin bekommen das er eine zeile runter geht allerdings fängt er bei der 2ten Zeile rechts an.
EDIT: Habe garnichts hinbekommen hatte ein andres display geingegeben
löl...
naja such mal im datenblatt, du kannst irgendwie senden an welcher stelle er schreiben soll.
JO irgendwie muss man das bei 3 sachen ändern nur blicke ich da nicht ganz durch verliere irgenwie den faden und wenn ich meine das ichs habe geht das display aus irgendwie mache ich da was falsch nur was weiss ich leider nichtZitat:
Zitat von damaltor
hm na du musst das alles wenn überhaupt dann ans ende des programms anfügen, um sicherzustellen dass das display bereits initialisiert wurde.
was muss denn geändert werden? hab das datenblatt grad net da...
Also habe Folgendes schreiben wollen und geändert
Davon schreibt er mir Genau I Love You den unteren teil lässt er voll kommen weg (leider) Damaltor hattest du ICQ geschaut?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(0x3E);
Msleep(200);
i2c_write(0x0F);
Msleep(1000);
i2c_write(0x07);
Msleep(200);
i2c_write(0x19);
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(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(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);
while(1);
return 0;
}
ändern muss ich S auf 1, S/C auf 1 und RL auf 0 denke ich mal bin mir aber net 100% sicher soweit wie ich lesen kann
hmm du schreibst einfach den text. also versucht er immer weiter zu schreiben. versuch mal, zwischen erster und zweiter zeile (also da wo du den zeilensprung haben willst) 10 leerzeichen einzufügen (!) also 10x den befehl für ein leerzeichen. ich glaub das war i2c_write(0xA0);.
soweit ich das verstanden habe, wird bei jedem geschriebenen zeichen ein zähler um 1 erhöht, um festzustellen wo das nächste zeichen hinkommt. und zwischen den zeilen sind einige zeichen, die nicht angezeigt werden. es könnte also sein, dass wenn du viele zeichen schreibst (dafür die 10 leerzeichen) du irgendwann in die nächste zeile rutscht, weil der counter bis zu dieser stelle weiter gelaufen ist. dann könnte man experimentell bestimmen, wie viele leerzeichen man schreiben muss um in die nächste zeile zu kommen. ist keine besonders elegante lösung, aber dürfte evtl gehen.
später kann man dann mal schauen, ich denke man kann auch direkt einfluss auf diesen adresscounter nehmen. aber probiers erstmal, mal sehn was passiert.
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^^
so funktioniert alles. war nur für test zweckeCode:#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;
}
Hi Dalmator,
kannst du vllt die Library die ich für danjoo geschrieben habe korrigieren, sodass es funktioniert? Ich kann nämlich nicht testen
ich kanns probieren, bin allerdings die nächste woche nicht online. schick ihm doch mal ne pn und frag ihn nach seiner icq nummer, dann könnt ihr euch direkt kurzschliessen =)
Hi wir können auch hier machen wenn du willst habe nur wennig zeit wegen dem kind bin aber jeden tag mal online kann nur nicht sagen wann genau
Hallo Leute (schon ein bisschen alt der Thread..)
Schön das ihr über das gleiche Display schreibt..
Wollte so eines jetzt auch zum Laufen bringen.
(habe aber keinen Asuro)
Habe dazu i2cmaster.s eingebunden und die i2cmaster.h
Mein Testcode geht jetzt so:
Jetzt habe ich mich den ganzen Tag geärgert und jetzt endlich doch hinbekommen.Code:cli();
i2c_init(); // initialize I2C library
i2c_start(0x74);
i2c_write(0x00);
i2c_write(0x01);
i2c_write(0x2E);
i2c_write(0x0F);
i2c_write(0x06);
i2c_stop();
i2c_start(0x74);
i2c_write(0x40); // RS auf 1
i2c_write(0x54);
i2c_write(0x65);
i2c_write(0x73);
i2c_write(0x74);
i2c_stop();
sei();
Leider erst, als ich den Takt vom Mega32 auf 1Mhz intern RC-Oscilator runtergedreht habe.
Aber 2 Mhz läuft das Display leider nicht mehr 8-[
Möchte aber mit 10 oder 16Mhz fahren..
Habt ihr ein Ahnung, was man da machen könnte..?
Arbeite da mit AVR_Studio und habe bei den Projekt-Optionen die Mhz schon runtergedreht.... wirkt aber leider nicht... :-(
Habe statt eurem "Msleep(3); " eine normale Verzögerung reingemacht, geht aber auch nicht..
Mit wie viel MHz fährt ihr eigentlich beim AVR?
Die Anbindung an das Display habe ich über ein ca. 2m Kabel...
Die Signale müssten aber eigentlich passen...
Vielleicht probiere ich mal kürzere Kabel oder einen Treiber..?
Habt Ihr vielleicht einen Tipp?
l.G. Roberto
Nochmal:
Hat sich erledigt:
Habe jetzt probiert:
Funktioniert jetzt mit 10Mhz Quarz :-)Code:i2c_start(0x74);
_delay_ms(5);
i2c_write(0x00);
_delay_ms(5);
i2c_write(0x01);
_delay_ms(5);
i2c_write(0x2E);
_delay_ms(5);
i2c_write(0x0F);
_delay_ms(5);
i2c_write(0x06);
_delay_ms(5);
i2c_stop();
_delay_ms(5);
//----------------------
i2c_start(0x74);
_delay_ms(5);
i2c_write(0x40); // RS auf 1
_delay_ms(5);
i2c_write(0x54);
_delay_ms(5);
i2c_write(0x65);
_delay_ms(5);
i2c_write(0x73);
_delay_ms(5);
i2c_write(0x74);
_delay_ms(5);
i2c_stop(); /
_delay_ms(5);
sei();
Komisch ist aber, wenn ich die Delay auf 10ms erhöhe, liegt der Kontrast vom Display ganz wo anders..
Bei 5ms muss ich fast auf 0V drehen, bei 10ms sehe ich keine Anzeige. Erst wenn ich den Kontratsregler auf Mitte drehe (ca.2,5V) sehe ich wieder den Text.. .........komisch... 8-[
bis dann...