Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem Beim Programmieren vom LCD
Hallo
Habe mir ja das LCD vom connrad gekauft
DatenBlatt : http://www2.produktinfo.conrad.com/datenblaetter/175000-199999/181891-da-01-de-DISPLAY_M_I2C-BUS_INTERF_3X12_4_7_MM.pdf
Habe alles genauso aufgebaut wie es im daten blatt steht Pin 5 SDA geht an ADC 3 und Pin 6 an ADC2.
#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(0x3C);
Msleep(200);
i2c_write(0x0E);
Msleep(200);
i2c_write(0x06);
Msleep(200);
while(1);
return 0;
}
Da kommt allerding exitcode:
C:\ASURO_src\FirstTry/test.c:12: undefined reference to `i2c_init'
C:\ASURO_src\FirstTry/test.c:14: undefined reference to `i2c_start'
C:\ASURO_src\FirstTry/test.c:17: undefined reference to `i2c_stop'
C:\ASURO_src\FirstTry/test.c:22: undefined reference to `i2c_write'
C:\ASURO_src\FirstTry/test.c:24: undefined reference to `i2c_write'
C:\ASURO_src\FirstTry/test.c:26: undefined reference to `i2c_write'
C:\ASURO_src\FirstTry/test.c:28: undefined reference to `i2c_write'
So da war eine Hex file dabei die hatte ich geflasht aber beim anmachen war das gleiche bild (keins) allerdings wenn ich den kontrast ganz dunkel mache erscheind mir das das ganze gering blinkt allerdings nicht viel sondern gerade so das man es nur sehr schwer errkennen kann.
Kann mir da einer helfen???
EDIT: OK das mit dem fehler habe ich wohl behoben es funktioniert aber leider immer noch nicht
Soweit ich weiß gib es schon eine fertige library dafür. i2clcd oder so.
damaltor
09.02.2007, 19:20
leider geht diese library nicht mit dem im display verwendeten i2c-baustein, sondern nur mit einem pcf wie dem im asurowiki, an den dann ein display ohne i2c anschluss angeschlossen wurde.
wie ist das eigendlich mit den anschlüssen INT0 und OC2 kann man da nichts mit machen oder sind die genauso wie adc3 und 2?
OC2 ist doch wichtig für infrarot oder? int null ist für das ein und auschalten von statusled
ah dann lige ich da totallllll verkert sorry
öhm shit ich habe glaub falsch gelötet durch ein gedanken fehler poste noch mal wenn ich es geändert habe
damaltor
09.02.2007, 20:14
du kannst theoretisch alle pins nutzen, weil am atmega die meisten pins als eingang und ausgang genutzt werden können. aber es könnte sein, dass du mit den falschen ports dauerhaft einen interrupt auslöst oder die statusled ausser gefecht setzt... nimm adc2 und adc3, das sollte gehen.
adc2 und 3? ich glaube die pins sind ja mit pulldown resistoren verbunden, man muss dann noch ne pullup resistoren extra einbauen.
adc2 und 3? ich glaube die pins sind ja mit pulldown resistoren verbunden, man muss dann noch ne pullup resistoren extra einbauen.
was soll das bedeuten pullup?
edit: habe allerdings nichts falsch gelötet ist alles genauso wie es vorher war leider
damaltor
09.02.2007, 20:41
der prozessor hat interne pullups... meine ich mal gehört zu haben. ausserdem geht ja i2c auch mit dem baustein aus dem asurowiki perfekt, und da ja die gleiche bibliothek genutzt wird... und da es ja ansonsten eigentlich auch das gleiche ist, halt dass nicht ausgänge geschaltet werden sonder der displaycontroller angesprochen wird, scheint das kein problem darzustellen.
hier ist der aktuelle programmcode, den ich mir überlegt habe. zum compilieren ist die i2cmaster lib von peter fleury zu benutzen, auch im asurowiki zu finden. leider scheint das ganze noch nicht so ganz zu funktionieren.
#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();
Msleep(500);
ret = i2c_start(Display+I2C_WRITE); //hier wird der i2c bus gestartet und die adresse
if ( ret ) //geschrieben
{
i2c_stop(); //sollte das nicht gehn, wird das programm hier eingefangen
StatusLED(RED);
while(1);
}
Msleep(200);
i2c_write(0x00); //controll byte (muss gesendet werden laut datenblatt)
Msleep(200);
i2c_write(0x2C); //die nächsten bitfolgen bzw werte sind aus dem daten-
Msleep(200); //blatt kopiert. sollte eigentlich das display
i2c_write(0x0E); //einschalten und den corsur nach oben
Msleep(200); //links setzen.
i2c_write(0x06); //einzige änderung: da nicht dual power sondern
Msleep(200); //single supply genutzt wird (also nur +5V und gnd und nicht
//+5V und -5V) habe ich das G-bit auf 1 geändert.
while(1); //weitere infos im datenblatt.
return 0;
}
nur funktionieren tuts leider nich... die langen pausen sind nur vorsichtsmassnamen, können wahrscheinlich auch deutlich kürzer gewählt werden.
m.a.r.v.i.n
09.02.2007, 23:25
Hi,
die internen Pullups müssen allerdings auch aktiviert werden (indem man den Port auf Eingang schalte, und dann eine 1 an dem Port ausgibt). Ich glaube aber nicht, dass die internen Pullups für den I2C Bus funktionieren.
(weil die Ports aöls Ein-und Ausgänge benutzt werden). Man sollte also externe Pullups an den I2C Bus anschließen (2 Widerstände 4,7k..10kOhm von SCL und SDA gegen VCC).
Noch was zur Hardware. Wenn man ADC2 und 3 verwendet, müssen die Fototransistoren des Liniensensor entfernt werden.
Die Initialisierung des Display Controllers von damaltor sieht erst mal OK aus. Das sollte so klappen.
Hier gibt es eine Befehlsfolge für die Ansteuerung des PCF2116 Controllers. Das ist zwar ein anderes Display aber derselbe Controller wie im EAT123.
http://www.woe.onlinehome.de/lcd.htm#i2clcd
Dort sieht man auch, wie man einen Text zum LCD über I2C senden kann.
damaltor
09.02.2007, 23:46
wo genau sollten die widerstände dann hin? sollten diese nicht schon im display bzw in dessen controller verbaut sein?
Hast du in der i2cmaster.S angegeben, wo SCL und SDA angeschlossen sind?
Die twimaster darf nicht verwendet werden. Im Makefil muss "ASRC = i2cmaster.S" stehen.
Die Widerstände kommen zwischen SCL bzw SDA und VCC.
damaltor
10.02.2007, 00:15
im makefile habe ich nix geändert, schliesslich ist ja die i2cmaster.h eingebunden. die entsprechenden ports sind angegeben.
zusätzlich zur i2cmaster.h muss man entweder die i2cmaster.S oder die twimaster.c einbinden! In diesem Fall die i2cmaster.S (sonst kommen die Fehlermeldungen aus dem ersten beitrag...)
damaltor
10.02.2007, 00:31
wird nicht die .s in der .h eingebunden? bei mir klappt das kompilieren einwandfrei...
Hallo
Danke zuerst mal für die guten antworten allerdings hätte ich da noch ne frage
(2 Widerstände 4,7k..10kOhm von SCL und SDA gegen VCC).
Also brauche ich ein wiederstand von 4,7k ohm und einen von 10kOhm oder sollen die punkte bis heissen 2x 4,7 bis 10k ohm????
Noch was zur Hardware. Wenn man ADC2 und 3 verwendet, müssen die Fototransistoren des Liniensensor entfernt werden.
habe ich mit zittriger hand geschafft ohne etwas kaputt zu machen (man hatte ich geschwitzt es zu versauen^^).
Die Widerstände kommen zwischen SCL bzw SDA und VCC.
VCC soll das VDD sein??? Und SCL bzw SDA zwischen beide oder entweder das eine oder das andere???
MFG Danjo
Wer die Anschlüsse ADC2 und ADC3 für einen I2C-Bus verwenden will, sollte sich mal das Schaltbild des ASURO genauer ansehen! Die beiden ADC-Kanäle liegen über 20KOhm Widerstände (R14 und R15) auf Masse (GND). Wenn man, wie es der I2C-Bus erfordert, die Leitungen SDA und SCL über 10KOhm nach VCC (4,8V Versorgungsspannung) legt, baut man damit einen Spannungsteiler auf der die 4,8V an den Leitungen SDA und SCL auf 3,2V reduziert. Damit funktionieren dort angeschlossene Slave-Module nur in Ausnahmefällen! Also R14 und R15 auslöten und dann die Leitungen über 10KOhm mit Vcc verbinden! Ein preisgünstiges LCD mit I2C-Bus gibt es bei roboterteile.de PICAXE-LCD mit RTC (Uhrenbaustein).
http://roboter-teile.de/Shop/themes/kategorie/detail.php?artikelid=54&source=2
Das funktioniert 100%tig (verwende ich selbst). Bei diesem Modul sind die Pull-Up-Widerstände für den I2C-Bus schon eingebaut.
Gruß, Peter (Ronny10)
Danke für die skizze geh jetzt mal duschen und danach staubsaugen danach schaue ich ob ich es hin bekomme so
damaltor
10.02.2007, 16:17
super, vielleicht war das dann schon alles und es geht.... das display was du da beschrieben hast (LCD03) hat ja einen unglaublich einfach strukturierten befehlssatz. ich glaub da werd ich mal nach suchen =) aber gibt es davon schon eine zeichensatztabelle? oder wird die mitgeliefert? ich vermute einfach mal dass du das grüne lcd mit möglichkeit des anschlusses einer matrixtastatur meinst, denn bei dem mit dem uhrenbaustein steht schon im datenblatt man solle es auf keinen fall per i2c anschliessen, dann würden die meisten funktionen nicht verfügbar sein, und es wäre (zitat) nur ein dummes i2c-slave-device.
Ok habe es zusammen gelötet aber r 14 und 15 noch drin jetzt geht das Display aus nach dem ich die .hex von damaltor drauf gemacht habe und neu gestartet ist (allerdings gehts wieder an wenn der bootloader gestartet wird direkt nach anschalten) soll ich wirklich die wiederstände raus machen und wenn welsche wirkungen könnte es haben im schlimmsten fall???
Edit: Das problem ist wenn ich das display mit den 10kohm wiederständen betreiben möchte und die .hex datei (siehe quelltext seite 1) betreiben möchte erkennt er nicht mehr das display also die status LED wird Rot mache ich die wiederstände wieder ab leuchtet die status led wieder grün
funktioniert immer noch net :-( sorry @ Ronny10 wegen vorher ich bin frustriert weil nichts klappt und dann das noch ich hoffe das du meine endschuldigung annimmst
damaltor
10.02.2007, 21:23
*lach*
nu werd mal nicht frech, das hilft dir auch nicht. r14 und r15 sind ausschliesslich an den adc2 und 3 angeschlossen und haben mit dem ir-teil nichts zu tun.
Sorry, aber ich dachte ihr verwendet die für die Erweiterungsplatine modifizierte ASURO-Platine (Seite 113 im ASURO Band1).
Gruß Peter(Ronny10)
damaltor
10.02.2007, 21:24
genau das tun wir, nichts anderes. du hattest schion recht.
ich glaube du hast irgendeine leiterbahn kaputtgemacht. poste mal ne foto von deine Asuro (closeup, von beide seiten)
<--- (falsch Roboter anfänger)
@Ronny bitte schau mal oben habe mein txt korigiert sorry
Ich verstehe deine Frustation, sowas passiert auch manchmal bei mir, aber sag mal, wie ist jetzt mit deinem Asuro?
<----(falsch Roboter anfänger)
Funktioniert wieder hatte ca.4 mal timeout und 4-5 mal keine verbindung
edit selbst die Minimallösung: IR-Abstandsmessung von radbruch funktioniert wieder zuerst nicht so gut immer wieder zuerst gegen die wand aber jetzt scho nicht mehr
Hi,
Hast du eigentlich schonmal getestet, ob die i2c überhaupt funktioniert?
Probiere mal den i2cmaster_test von m.a.r.v.i.n, und siehe ob es überhaupt funktioniert. Wenn ja, kann ich vielleicht dir mit dem programmierung helfen. (Ich hab gerade auch ne LCD für asuro fertig gebastelt ^^)
welscher test ist das den?
edit ah den https://www.roboternetz.de/phpBB2/viewtopic.php?t=27163
jo habe drauf gemacht die status LED wird rot und er schreibt lauter einsen
http://www.asurowiki.de/pmwiki/uploads/Main/i2cmaster.zip
btw. wenn du r14 und r15 ausgelötet hast, löte sie wieder ein. es funktioniert bei mir einwandfrei damit. Die pullup resistoren kannst du erstmal vergessen. Du muss nur die verbindung recht neben "con2" (von außen gesehen) mit dem SDA verbinden, und recht neben R23 mit dem SCL. Du muss auch sicher stellen dass keine leiterbahn kaputt ist, sonst muss du fotos davon machen, um das problem zu lösen.
Und teste es mit i2cmaster_test. Probiere bei Device_address irgend ein address. und richtige address.
Wenn bei falsche address rot und bei richtige address grün, dann ist funktioniert es, und du kannst mit dem programmieren schon anfangen.
Ich wollte eigentlich gestern das sagen, aber ich war gestern selbst beim LCD-Basteln. hehe, Ich war gestern so frustriert wie du ^^, aber endlich hab ich es geschafft ohne etwas beim Asuro zu verändern
damaltor
11.02.2007, 15:10
na so wie der test ist, kann er nicht funktionieren. die adresse des displays ist 0x74, das muss recht weit am anfang eingetragen werden.
allerdings bleibt bei meinem asuro die led grün, völlig unabhängig davon ob die erweiterungsplatine eingesteckt ist, oder welche adresse ich angebe. kann das daran liegen dass ich r15 und r14 noch drinne hab? der portbaustein tut seine arbeit...
hi dalmator,
hast du auch diese lcd?
ich habe pcf8574p, wenn ich die addresse falscheingegeben habe wird wird es rot, wenn richtig ist es grün. Ich habe nix bei dem Asuro verändert
damaltor
11.02.2007, 15:30
ich habe den gleichen pcf-baustein. der i2cmaster-test funktioniert einwandfrei. die angeschlossenen leds (http://www.youtube.com/watch?v=_pnDtQdcKis) funktionieren perfekt. allerdings wird die led nicht rot, auch nicht wenn ich die erweiterungsplatine mit dem pcf rausziehe.
aso, nee ich meine wenn du andere addresse nimmst, oder einfach den jumper rausziehest
m.a.r.v.i.n
11.02.2007, 16:03
Hi,
allerdings wird die led nicht rot, auch nicht wenn ich die erweiterungsplatine mit dem pcf rausziehe.
Das sollte nicht sein. Man kann allerdings jeden i2c_write Befehl überprüfen. Der Rückgabewert der Funktion sollte bei korrekt angesprochenem I2C Device immer 0 sein. Wenn nicht ist das ein Fehler.
damaltor
11.02.2007, 16:05
wenn ich die jumper (einen oder mehrere) ziehe, scheint das ne reine glückssache zu sein. habe den selbsttest wieder geflasht, und mal gehts, mal nicht. die led blinkt unregelmässig rot und grün.
hmm, ist ja komisch, bei mir wird es immer rot, wenn ich den jumper rausziehe.
HEy, das problem mit dem spannung... kann man es kösen indem man kleinere widerstände nehmen? z.B. 4.7k oder so???
damaltor
11.02.2007, 16:15
entferne die widerstände r14 und r15. kannst ja probeweise das eine längere beinchen durch kneifen, und wenns nicht besser wird, dann lötest du es halt wieder zusammen.
wenn du nicht vorhast, etwas anderes anzuschliessen als den pcf, dann lass es einfach so, es geht ja einwandfrei.
kann das mit dem unregelmäßigen blinken der led an der zu niedrigen spannung liegen, ich habe r14 und 15 nicht entfernt?
also irgendwas stimmt mit der adresse nicht glaube ich wo sieht man den ide adresse im datenblatt? ich kann nichts finden nur slave adresse ...
das ist das ja ^^, da steht 01110100 oder 0x74
damaltor
11.02.2007, 16:25
das ist die richtige.
du musst dir das datenblatt recht genau durchlesen. irgendwo steht die adresse als hex-zahl, für den pcf8574 ist es 0x40, für das display 0x74.
jo da steht 011101001 das ist die slave adresse und wie macht man jetzt daraus eine HexDezi??? verstehe da nur bahnhof
oder ist die adresse gemeint 011101 SAO?
damaltor
11.02.2007, 16:36
naja... 01110100 ist binär, in dezimal 116, hexadezimal 0x74. die letzte ziffer gehört nicht zur adresse, sondern bedutet nur dass der slave eine bestätigung sendet.
omg binär??? ich sehe nur einsen und nullen^^
also doch das display kaputt?
damaltor
11.02.2007, 16:41
naj... einsen und nullen sind binärzahlen. ich verstehe leider dein problem nicht.
die dezimalzahl 116 lässt sich hexadezimal als 0x74 und binär als 0b01110100 darstellen.
lol habe kein problem verstehe das nur net so ganz das da bei 116 74 raus kommen habe ich im buch gesehen aber das mit dem binär *gg* ist ja auch egal ich schreibe mal connrad an und sage das das lcd nicht ansprechbar ist mit der adresse und das ich denke das es kaputt ist und lasse mir ein neues schicken. Das einzigste wäre noch die test hex von m.a.r.v.i.n zu ändern mit meiner adresse und noch mal zu probieren
damaltor
11.02.2007, 16:50
na mach das doch... =)
umrechnung von dezimal in binär und hex erklär ich dir irgend wann mal im icq
ok danke. =) "das ist mal wieder das ich die 15 zeichen zusammen bekomme^^"
so habe es geändert aber die status led ist immer noch rot und es kommen einser. jetzt habe ich mal I2CMASTER.H auf gemacht kann es vllt sein das es daran ligt das die code darin falsch sind???
also folgene änderung habe ich gemacht so sah die alte i2cmaster.h aus
#ifndef _I2CMASTER_H
#define _I2CMASTER_H 1
/************************************************** ***********************
* Title: C include file for the I2C master interface
* (i2cmaster.S or twimaster.c)
* Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
* File: $Id: i2cmaster.h,v 1.10 2005/03/06 22:39:57 Peter Exp $
* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
* Target: any AVR device
* Usage: see Doxygen manual
************************************************** ************************/
#ifdef DOXYGEN
/**
@defgroup pfleury_ic2master I2C Master library
@code #include <i2cmaster.h> @endcode
@brief I2C (TWI) Master Software Library
Basic routines for communicating with I2C slave devices. This single master
implementation is limited to one bus master on the I2C bus.
This I2c library is implemented as a compact assembler software implementation of the I2C protocol
which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c).
Since the API for these two implementations is exactly the same, an application can be linked either against the
software I2C implementation or the hardware I2C implementation.
Use 4.7k pull-up resistor on the SDA and SCL pin.
Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module
i2cmaster.S to your target when using the software I2C implementation !
Adjust the CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion.
@note
The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted
to GNU assembler and AVR-GCC C call interface.
Replaced the incorrect quarter period delays found in AVR300 with
half period delays.
@author Peter Fleury pfleury@gmx.ch http://jump.to/fleury
@par API Usage Example
The following code shows typical usage of this library, see example test_i2cmaster.c
@code
#include <i2cmaster.h>
#define Dev24C02 0xA2 // device address of EEPROM 24C02, see datasheet
int main(void)
{
unsigned char ret;
i2c_init(); // initialize I2C library
// write 0x75 to EEPROM address 5 (Byte Write)
i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
i2c_write(0x05); // write address = 5
i2c_write(0x75); // write value 0x75 to EEPROM
i2c_stop(); // set stop conditon = release bus
// read previously written value back from EEPROM address 5
i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
i2c_write(0x05); // write address = 5
i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode
ret = i2c_readNak(); // read one byte from EEPROM
i2c_stop();
for(;;);
}
@endcode
*/
#endif /* DOXYGEN */
/**@{*/
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
#endif
#include <avr/io.h>
/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */
#define I2C_READ 1
/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */
#define I2C_WRITE 0
/**
@brief initialize the I2C master interace. Need to be called only once
@param void
@return none
*/
extern void i2c_init(void);
/**
@brief Terminates the data transfer and releases the I2C bus
@param void
@return none
*/
extern void i2c_stop(void);
/**
@brief Issues a start condition and sends address and transfer direction
@param addr address and transfer direction of I2C device
@retval 0 device accessible
@retval 1 failed to access device
*/
extern unsigned char i2c_start(unsigned char addr);
/**
@brief Issues a repeated start condition and sends address and transfer direction
@param addr address and transfer direction of I2C device
@retval 0 device accessible
@retval 1 failed to access device
*/
extern unsigned char i2c_rep_start(unsigned char addr);
/**
@brief Issues a start condition and sends address and transfer direction
If device is busy, use ack polling to wait until device ready
@param addr address and transfer direction of I2C device
@return none
*/
extern void i2c_start_wait(unsigned char addr);
/**
@brief Send one byte to I2C device
@param data byte to be transfered
@retval 0 write successful
@retval 1 write failed
*/
extern unsigned char i2c_write(unsigned char data);
/**
@brief read one byte from the I2C device, request more data from device
@return byte read from I2C device
*/
extern unsigned char i2c_readAck(void);
/**
@brief read one byte from the I2C device, read is followed by a stop condition
@return byte read from I2C device
*/
extern unsigned char i2c_readNak(void);
/**
@brief read one byte from the I2C device
Implemented as a macro, which calls either i2c_readAck or i2c_readNak
@param ack 1 send ack, request more data from device
0 send nak, read is followed by a stop condition
@return byte read from I2C device
*/
extern unsigned char i2c_read(unsigned char ack);
#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak();
/**@}*/
#endif
und so sieht meine aus änderung aus
#ifndef _I2CMASTER_H
#define _I2CMASTER_H 1
/************************************************** ***********************
* Title: C include file for the I2C master interface
* (i2cmaster.S or twimaster.c)
* Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
* File: $Id: i2cmaster.h,v 1.10 2005/03/06 22:39:57 Peter Exp $
* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
* Target: any AVR device
* Usage: see Doxygen manual
************************************************** ************************/
#ifdef DOXYGEN
/**
@defgroup pfleury_ic2master I2C Master library
@code #include <i2cmaster.h> @endcode
@brief I2C (TWI) Master Software Library
Basic routines for communicating with I2C slave devices. This single master
implementation is limited to one bus master on the I2C bus.
This I2c library is implemented as a compact assembler software implementation of the I2C protocol
which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c).
Since the API for these two implementations is exactly the same, an application can be linked either against the
software I2C implementation or the hardware I2C implementation.
Use 4.7k pull-up resistor on the SDA and SCL pin.
Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module
i2cmaster.S to your target when using the software I2C implementation !
Adjust the CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion.
@note
The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted
to GNU assembler and AVR-GCC C call interface.
Replaced the incorrect quarter period delays found in AVR300 with
half period delays.
@author Peter Fleury pfleury@gmx.ch http://jump.to/fleury
@par API Usage Example
The following code shows typical usage of this library, see example test_i2cmaster.c
@code
#include <i2cmaster.h>
#define 0x74 // device address of 0x74, see datasheet
int main(void)
{
unsigned char ret;
i2c_init(); // initialize I2C library
// write 0x75 to EEPROM address 5 (Byte Write)
i2c_start_wait(0x74+I2C_WRITE); // set device address and write mode
i2c_write(0x05); // write address = 5
i2c_write(0x75); // write value 0x75 to EEPROM
i2c_stop(); // set stop conditon = release bus
// read previously written value back from EEPROM address 5
i2c_start_wait(0x74+I2C_WRITE); // set device address and write mode
i2c_write(0x05); // write address = 5
i2c_rep_start(0x74+I2C_READ); // set device address and read mode
ret = i2c_readNak(); // read one byte from EEPROM
i2c_stop();
for(;;);
}
@endcode
*/
#endif /* DOXYGEN */
/**@{*/
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
#endif
#include <avr/io.h>
/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */
#define I2C_READ 1
/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */
#define I2C_WRITE 0
/**
@brief initialize the I2C master interace. Need to be called only once
@param void
@return none
*/
extern void i2c_init(void);
/**
@brief Terminates the data transfer and releases the I2C bus
@param void
@return none
*/
extern void i2c_stop(void);
/**
@brief Issues a start condition and sends address and transfer direction
@param addr address and transfer direction of I2C device
@retval 0 device accessible
@retval 1 failed to access device
*/
extern unsigned char i2c_start(unsigned char addr);
/**
@brief Issues a repeated start condition and sends address and transfer direction
@param addr address and transfer direction of I2C device
@retval 0 device accessible
@retval 1 failed to access device
*/
extern unsigned char i2c_rep_start(unsigned char addr);
/**
@brief Issues a start condition and sends address and transfer direction
If device is busy, use ack polling to wait until device ready
@param addr address and transfer direction of I2C device
@return none
*/
extern void i2c_start_wait(unsigned char addr);
/**
@brief Send one byte to I2C device
@param data byte to be transfered
@retval 0 write successful
@retval 1 write failed
*/
extern unsigned char i2c_write(unsigned char data);
/**
@brief read one byte from the I2C device, request more data from device
@return byte read from I2C device
*/
extern unsigned char i2c_readAck(void);
/**
@brief read one byte from the I2C device, read is followed by a stop condition
@return byte read from I2C device
*/
extern unsigned char i2c_readNak(void);
/**
@brief read one byte from the I2C device
Implemented as a macro, which calls either i2c_readAck or i2c_readNak
@param ack 1 send ack, request more data from device
0 send nak, read is followed by a stop condition
@return byte read from I2C device
*/
extern unsigned char i2c_read(unsigned char ack);
#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak();
/**@}*/
#endif
damaltor
11.02.2007, 17:34
naja so habe ich die lib auch angepasst bei dem code im ersten post...
jetzt läuft der Test von m.a.r.v.i.n die status LED wird grün und er zählt 1.2.23.4.5.6.7.8.... weiss ja nicht ob das so richtig ist
jetzt das
i2c_write(0x05); // write address = 5
im daten blatt von mir
010xxxxxx1 weiss aber nicht was das für ne zahl ist vllt 0x01?
m.a.r.v.i.n
11.02.2007, 17:58
In der i2cmaster.h Datei braucht man überhaupt nichts ändern. Die Änderung die du dort gemacht hast, betrifft doch nur das Beispiel, das für die doxygen Dokumentation verwendet wird. Am erzeugten Code ändert das gar nichts, weil dieser Bereich als Kommentar angesehen wird.
In der i2cmaster.S Datei wird eingestellt, welche Ports man für den I2C Bus verwendet.
;***** Adapt these SCA and SCL port and pin definition to your target !!
;
#define SDA 3 // SDA Port C, Pin 3 ADC3
#define SCL 2 // SCL Port C, Pin 2 ADC2
#define SDA_PORT PORTC // SDA Port C
#define SCL_PORT PORTC // SCL Port C
Die Device Adresse und den Programmcode ändert man nur in der test_i2cmaster.c Datei.
ah ja da habe ich es auch geändert stimmt
edit: m.a.r.v.i.n hat vollkommen recht habe die h wieder überschrieben mit der die ich geändert habe jetzt funktionierts immer noch
damaltor
11.02.2007, 18:25
ok, kurzes umrechnungs-howto:
im datenblatt stehen 9stellige zahlen. die letzte stelle, ACK, wird ignoriert. bleiben 8 stellen.
beispiel:
01101101
diese zahl teilst du in zwei hälften:
0110 1101
jetzt nimmst du die erste hälfte: 0110
von RECHTS NACH LINKS ist der wert der ziffern
1,2,4,8
alo rechnest du jetzt von rechts nach links:
0*1 + 1*2 + 1*4 + 0*8
also (ziffer an der stelle)*(wert der stelle)
0*1 + 1*2 + 1*4 + 0*8 = 6
diese 6 merkst du dir.
zweite hälfte: 1101
von rechts nach links:
1*1+0*2+1*4+1*8=13
jetzt hast du zwei zahlen:
6 13
das musst du jetzt nur noch umrechnen in folgendem muster:
0->0
1->1
...
8->8
9->9
10->A
11->B
12->C
13->D
14->E
15->F
also schreibst du anstatt 6 13 jetzt 6D. damit der compiler die zahl versteht, schreibst du noch 0x davor. das bedeutet also nur "dies ist eine hexzahl"
binäre zahl -> hexzahl
01101101 -> 6D
noch ein beispiel: die adresse ds displays.
01110100
zwei hälften:
0111 0100
erste hälfte:
1*1+1*2+1*4+0*8=7
zweite hälfte:
0*1+0*2+1*4+0*8=4
also ist die hex-zahl 0x74
wenn im datenblatt an einer bitstelle ein X steht, dann ist es egal was hier übertragen wird. vorzugsweise eine null, ist leicher zu rechnen.
also für dein beispiel 010xxxxx1:
die eins am ende fällt weg. übertragen wird 01000000
zwei hälften: 0100 0000
erste hälfte: 0*1+0*2+1*4+0*8=4
zweite hälfte: 0*1+0*2+0*4+0*8=0
zusammen:0x40
mehr ist es nicht...
such doch im google hex to binary oder so ^^.
Also jetzt geht das teil doch ^^. Du kannst jetzt mit dem programmierung anfangen, viel spaß
damaltor
11.02.2007, 22:49
wenn ich die jumper (einen oder mehrere) ziehe, scheint das ne reine glückssache zu sein. habe den selbsttest wieder geflasht, und mal gehts, mal nicht. die led blinkt unregelmässig rot und grün.
habe jetzt die beiden widerstände r14 und r15 entfernt. jetzt passiert folgendes:
der pcf arbeitet weiterhin einwandfrei.
wenn die flaschen jumper gesetzt werden, dann ist die led zuerst mal rot, und die an den pcf angeschlossenen leds bleiben aus. allerdings: sowie man den asuro, spezielle die jumper (bzw deren pins) berührt oder in die nähe kommt, spricht der baustein an und macht das, was er bei gesetzten jumpern auch mache sollte. die led wird grün, und der portbaustein setzt die ports entsprechend so dass die an ihn angeschlossenen leds leuchten.
wenn alle jumper entfernt wurden wird es ein wenig komplexer, dann passiert das nur noch seehr selten.
wenn ich die ganze erweiterungsplatine entferne, also NICHTS an die leitungen SDA und SCL angeschlossen ist (auch keine pullups, die sind auf der erweiterungsplatine), dann ist die led zuerst grün, und wird dan rot, gelegentlich wieder grün... wechelhaft eben =) scheint so, als wenn bei undefiniertem zustand der leitungen nix halbes und nix ganzes passiert.
meine frage: hat der atmega nicht eigene, integrierte pullups? wie werden die aktiviert (also für adc3 und adc2)? wie vertragen die sich mit den pullups die auf der erweiterungsplatine drauf sind? und vor allem: werden die evtl schon in der i2cmaster library angesprochen?
Hey, in der datenblatt von deiner LCD steht, dass die Pullups möglichst klein sein soll: 1k8...10K, vllt, wenn du z.B: 4.7k nimmst passiert es seltener....
problem habe nur noch einen leider
edit: ich esel habe doch 2 beim alten asuro ist noch einer drin ich werde e heute mittag versuchen
So jetzt habe ich hin bekommen das er sich nemmer ausschaltet sobald die statusLED grün wird ich glaube es hängt mit der i2cmaster.S datei zusammen ich komme immer ein stückchen näher habe ich das gefühl nur jetzt weiss ich leider nicht mehr weiter habe alles in hexdez ausgerechnet und auf ein blatt geschrieben dann habe ich von m.a.r.v.i.n den link noch mal angeschaut und es so eingetragen (alles) wie es auch da stand nur leider sehe ich immer noch kein curser und kein text
Hi probiere dies mal:
#include "asuro.h"
#include "i2cmaster.h"
#define DEVICE 0x74 // LCD i2c Address
int main(void)
{
Init();
i2c_init();
// LCD Init
i2c_start_wait(DEVICE+I2C_WRITE);
i2c_write(0x00);
i2c_write(0x2C);
i2c_write(0x0E);
i2c_write(0x06);
i2c_stop();
// Write P
i2c_start_wait(DEVICE+I2C_WRITE);
i2c_write(0x40);
i2c_write(0x50);
i2c_stop();
while(1);
return 0;
}
m.a.r.v.i.n
12.02.2007, 13:29
Hi,
ich hab mir auch noch mal das Datenblatt angeschaut und komme auf das gleiche Ergebnis wie damaltor und raid_ox.
Hier noch mal mein Beispielcode für das EA T123. Initialisierung und Textausgabe in Subroutinen. Delay auf 1ms reduziert. Status LED sollte eine halbe Sekunde gelb leuchten, wenn Init erfolgreich war, dann grün. Rot bei Fehler.
#include <avr/io.h>
#include "i2cmaster.h"
#include "asuro.h"
#define Display 0x74 // device address of Display, see datasheet
int lcd_init(void)
{
int ret=0;
Msleep(500);
ret = i2c_start(Display+I2C_WRITE); //hier wird der i2c bus gestartet und die adresse
if ( ret ) //geschrieben
{
i2c_stop(); //sollte das nicht gehn, abbrechen
return -1;
}
i2c_write(0x00); //controll byte (muss gesendet werden laut datenblatt)
Msleep(1);
i2c_write(0x2C); //die nächsten bitfolgen bzw werte sind aus dem daten-
Msleep(1); //blatt kopiert. sollte eigentlich das display
i2c_write(0x0E); //einschalten und den corsur nach oben
Msleep(1); //links setzen.
i2c_write(0x06); //einzige änderung: da nicht dual power sondern
nicht
//+5V und -5V) habe ich das G-bit auf 1 geändert.
//single supply genutzt wird (also nur +5V und gnd und
i2c_stop();
Msleep(10);
return 0;
}
int lcd_write(char *text)
{
int ret=0;
unsigned char i = 0;
ret = i2c_start(Display+I2C_WRITE); //hier wird der i2c bus gestartet und die adresse
if ( ret ) //geschrieben
{
i2c_stop(); //sollte das nicht gehn, abbrechen
return -1;
}
i2c_write(0x40); //controll byte (muss gesendet werden laut datenblatt)
while(text[i] != 0)
{
i2c_write(text[i++]);
Msleep(1);
}
i2c_stop();
return 0;
}
int main(void)
{
int ret;
Init();
i2c_init();
ret = lcd_init(); // LCD Initialisieren
if (ret == 0)
{
StatusLED(YELLOW);
ret = lcd_write("Test"); // LCD Textausgabe
if (ret == 0)
{
Msleep(500);
StatusLED(GREEN);
}
else
StatusLED(RED); // Fehler beim LCD schreiben
}
else
StatusLED(RED); // Fehler beim LCD init
while(1);
return 0;
}
Ansonsten zur Hardware noch den Tip, am Kontrastregler drehen. Die Kontrastspannung VEE sollte ca 1V oder darunter betragen.
Jo ich komme auch immer auf das ergebniss ich glaube auch ganz erlich nicht daran das es daran ligt irgendwo irgend wie übersehe ich (wir) was ich weiss nur net was vllt ligt es wirklich an den 10k ohm was ich mir allerdings nicht vorstellen kann ich besorge mir auf der arbeit noch ein 4,7k ohm wiederstand beim asuro war der wiederstand nur noch 4 k ohm also denke ich das der kaputt ist in der zeit suche ich was das zeug hält um den fehler zu finden werde vllt mal mit dem schreiben von m.a.r.v.i.n´s link der hat es ja offensichtlich hin bekommen
Irgendwie glaube ich das es daran hängt ob die codes richtig sind
#define EAT123A-I2C 0x74 // device address of PFC 2116-C, see datasheet
int main(void)
{
unsigned char ret;
i2c_init(); // initialize I2C library
// write 0x75 to EEPROM address 5 (Byte Write)
i2c_start_wait(EAT123A-i2c+I2C_WRITE); // set device address and write mode
i2c_write(0x05); // write address = 5
i2c_write(0x75); // write value 0x75 to EEPROM
i2c_stop(); // set stop conditon = release bus
// read previously written value back from PFC address 5
i2c_start_wait(EAT123A-i2c+I2C_WRITE); // set device address and write mode
i2c_write(0x05); // write address = 5
i2c_rep_start(EAT123A-i2c+I2C_READ); // set device address and read mode
ret = i2c_readNak(); // read one byte from EEPROM
i2c_stop();
for(;;);
}
Hi,
ich hab mir auch noch mal das Datenblatt angeschaut und komme auf das gleiche Ergebnis wie damaltor und raid_ox.
Hier noch mal mein Beispielcode für das EA T123. Initialisierung und Textausgabe in Subroutinen. Delay auf 1ms reduziert. Status LED sollte eine halbe Sekunde gelb leuchten, wenn Init erfolgreich war, dann grün. Rot bei Fehler.
#include <avr/io.h>
#include "i2cmaster.h"
#include "asuro.h"
#define Display 0x74 // device address of Display, see datasheet
int lcd_init(void)
{
int ret=0;
Msleep(500);
ret = i2c_start(Display+I2C_WRITE); //hier wird der i2c bus gestartet und die adresse
if ( ret ) //geschrieben
{
i2c_stop(); //sollte das nicht gehn, abbrechen
return -1;
}
i2c_write(0x00); //controll byte (muss gesendet werden laut datenblatt)
Msleep(1);
i2c_write(0x2C); //die nächsten bitfolgen bzw werte sind aus dem daten-
Msleep(1); //blatt kopiert. sollte eigentlich das display
i2c_write(0x0E); //einschalten und den corsur nach oben
Msleep(1); //links setzen.
i2c_write(0x06); //einzige änderung: da nicht dual power sondern
nicht
//+5V und -5V) habe ich das G-bit auf 1 geändert.
//single supply genutzt wird (also nur +5V und gnd und
i2c_stop();
Msleep(10);
return 0;
}
int lcd_write(char *text)
{
int ret=0;
unsigned char i = 0;
ret = i2c_start(Display+I2C_WRITE); //hier wird der i2c bus gestartet und die adresse
if ( ret ) //geschrieben
{
i2c_stop(); //sollte das nicht gehn, abbrechen
return -1;
}
i2c_write(0x40); //controll byte (muss gesendet werden laut datenblatt)
while(text[i] != 0)
{
i2c_write(text[i++]);
Msleep(1);
}
i2c_stop();
return 0;
}
int main(void)
{
int ret;
Init();
i2c_init();
ret = lcd_init(); // LCD Initialisieren
if (ret == 0)
{
StatusLED(YELLOW);
ret = lcd_write("Test"); // LCD Textausgabe
if (ret == 0)
{
Msleep(500);
StatusLED(GREEN);
}
else
StatusLED(RED); // Fehler beim LCD schreiben
}
else
StatusLED(RED); // Fehler beim LCD init
while(1);
return 0;
}
Ansonsten zur Hardware noch den Tip, am Kontrastregler drehen. Die Kontrastspannung VEE sollte ca 1V oder darunter betragen.
So weit kommt er nicht die LED wird grün und das wars die status LED wird nur gelb wenn ich den asuro an mache (leider)
damaltor
12.02.2007, 19:12
dann scheint wirklich irgend etwas falsch angeschlossen zu sein oder das display ist wirklich defekt.
jo ich weiss ja auch net ich versuche es jetzt zuerst mal mit den 4,7k ohm wiederständen weil überall lese ich das es 4,7k ohm sein sollten und wenn das dann immer noch nichts bringt ruf ich bei connrad an und lasse mir ein neuen schicken. Ich poste dann morgen wieder was draus geworden ist mit den wiederständen
vielleicht hast du irgend eine Leiterbahn kaputtgemacht. Schick doch endlich ein closeup bild von deinem Asuro mit LCD, aufdem man die verbindung etc. sehen kann
ok aber die bilder werden nicht so gut weil der makro nicht so gut ist
hier die bilder
http://s6.bilder-hosting.de/tbnl/YK1JJ.jpg (http://www.bilder-hosting.de/show/YK1JJ.html)
http://s6.bilder-hosting.de/tbnl/YK8MH.jpg (http://www.bilder-hosting.de/show/YK8MH.html)
http://s6.bilder-hosting.de/tbnl/YKCPU.jpg (http://www.bilder-hosting.de/show/YKCPU.html)
http://s6.bilder-hosting.de/tbnl/YKIH3.jpg (http://www.bilder-hosting.de/show/YKIH3.html)
http://s6.bilder-hosting.de/tbnl/YL2CB.jpg (http://www.bilder-hosting.de/show/YL2CB.html)
http://s6.bilder-hosting.de/tbnl/YKOV0.jpg (http://www.bilder-hosting.de/show/YKOV0.html)
http://s6.bilder-hosting.de/tbnl/YKUL0.jpg (http://www.bilder-hosting.de/show/YKUL0.html)
http://s6.bilder-hosting.de/tbnl/YKXT4.jpg (http://www.bilder-hosting.de/show/YKXT4.html)
Mach mal größere bilder von der erweiterungsplatine, vllt liegt das problem daran...
sorry das ist das gröpsste alles andere ist verschwommen
allerding habe ich die platine 10 mal nach geschaut und gemessen soweit stimmt eigendlich alles
edit du kannst auch die bilder anklicken dann sind sie grösser
aso, sag einfach mit welchem pin ist SDA und SCL verbunden? (von links aus aufzählen)
SCL SDA
| | | : | | |
LED
So soll es sein
hm... es wird nicht richtig angezeigt...
..SCL............ ............SDA..
.....|.....|...... : ......|......|.....
..................LED..................
| = Pins
: = LED pins
(Von außen gesehen)
damaltor
12.02.2007, 22:31
die erweiterungsplatine hat links und rechts von der led jeweils 3 pins... die mittleren sollten es glaube ich sein.
bei bild 5 die oberen die 2 ganz linken pin5 SDA und pin 6 SCL
upps sorry
..SCL................. ..........SDA.........
.....|.....|.....|..... : .....|.....|......|.....
.......................LED.......................
es soll so sein, wie ich da gezeichnet habe
jo so soll es sein und es ist so oder?
Aso, ich habe nicht richtig verstanden, was du mit pin 5 und 6 meinst.
Aufjedenfall: die erste pin von links soll SCL sein und die 2. pin von recht SDA. (von mir gesehen)
damaltor
12.02.2007, 22:42
das wollen wir von dir wissen... =)
Wenn das schon richtig rum ist, weiß ich nicht mehr, woran es liegen könnte, deine platine siehst gut aus...
damaltor
12.02.2007, 22:50
also der code scheint ja zu stimmen. die verlötung auch. melde dich mal bei conrad.
danke fürs zweite mal löten^^
Ich rufe morgen den technichen kundencenter von connrad an dann müssen sie mir ja helfen können bzw neuen schicken
Muss jetzt leider arbeiten gehen bis dann morgen
damaltor
12.02.2007, 23:12
alles klar, mach das... kannst ja mal ein bild vom display-connector machen, und auf dem foto dranschreiben was wo angeschlossen ist. das wäre evtl noch hilfreich, vielleicht ist da ja der fehler.
damaltor
12.02.2007, 23:34
Hier ist nochmal ein anschlussplan, hab alles nochmal gecheckt aber bitte kontrolliert auch nochmal und verbessert mich.
wenn zwei leitungen sich kreuzen, ist dort KEINE verbindung. nur an "T-kreuzungen" ist eine verbindung.
rechts unten an GROUND sind 3 leiungen angeschlossen, die beiden teile der kontrastversorgung und der pin 1.
perfect alles richtig. =)
Öhm ist es eigendlich normal das bei mir kein amper drüber läuft bei out + und -????
edit: ach das ligt ein meinem multimeter irgendwie kann ich kein amper messen ohne ein kurtzen zu erzeugen keine ahnung warum
uff da kommen mehr als 250 mA an wie bekomme ich die wenniger? mein display will nur 700µA und es schwangt zwischen 4.98 und 5,1 volt.
Beim alten asuro war das auch sonen problem da hatte ich allerdings zu viel volt gehabt und es ist nicht gegangen und war fast am verzweifeln. könnte das das problem sein? Habe 4 Accus drin mit je 650mA
Die Device Adresse und den Programmcode ändert man nur in der test_i2cmaster.c Datei.
Achja was meinst du eigendlich mit programmcode? Ich habe da nur Device geändert
m.a.r.v.i.n
13.02.2007, 09:47
Hi
ach das ligt ein meinem multimeter irgendwie kann ich kein amper messen ohne ein kurtzen zu erzeugen keine ahnung warum
Wenn du das Multimeter auf Strommessung stellst, und an out+ und out- anschließt, mißt du den Kurzschlußstrom deiner Akkus. Bei Strommessung ist der Innenwiderstand des Messgerätes sehr niedrig.
Deshalb sollte man den Strom nur in Reihenschaltung zu einem Verbraucher messen.
Gibt deine Schaltung und den Schaltplan jemand anderen zum nachprüfen. Oftmals ist es so, das man zwar selbst alles mehrmals und 100% durchgeprüft hat und den Fehler nicht findet. Wenn dann ein Aussenstehender die Sache nochmal überprüft, findet der den Fehler sofort.
Im Schaltplan von Damaltor fehlen nur die beiden Pullup Widerstände, sonst ist alles in Ordnung.
Achja was meinst du eigendlich mit programmcode? Ich habe da nur Device geändert
damit meinte ich den Original Programmcode für die I2C Erweiterung aus der I2Cmaster Lib.
Hallo
thx. wenn ich das mit dem digitalen multimeter mache mache ich entweder nen kurzen oder er zeigt 0,00 an wenn ich es aber mit dem analogen mache zeigt er mir ne Ampere zahl die über 250mA sind da schlägt die nadel voll aus und knallt an. jo ich werde es mit auf die arbeit holen und den elektrieker schauen lassen (haben ja nachtschicht^^).
Jetzt ist halt noch die frage wo kann man das display noch an schlissen um zu überprüfen obs funktioniert???
damaltor
13.02.2007, 15:45
ein amperemeter darf NIE direkt an plus und minus angeschlossen werden. das ist dann ein klassischer kurzschluss. bei den analogen zeigermessgeräten ist das nicht soooo schlimm, die nadel wird durch eine magnetspule bewegt. das messergebnis was angezeigt wird, ist der strom der über die spule fliesst, hat aber nichts mit der schaltung zu tun. deshalb muss man die angezeigten werte, die man von einem analogen multi bekommt, immer in realwerte umrechnen, weil die spule eben auch strom braucht. deshalb empfehle ich ganz klar digitale multis. diese haben allerdings keine spule, und deshalb einen extrem niedrigen innenwiderstand. also ist das ungefähr so, als wenn du ein stück draht zwischen + und - hältst.
so wird richtig gemessen:
Spannung (in Volt): PARALLEL zum verbraucher
+_______(Messgerät)___________-
.......|...................................|
.......____(Verbraucher)____
Strom (in Ampere): IN REIHE zum verbraucher
+_____(Messgerät)_______(Verbraucher)_____-
du musst also ein kabel der stromversorgung abtrennen, und dann das messgerät DAZWISCHEN halten um den strom zu messen. um beispielsweise den gesamten stromverbrauch des asuro zu messen, könntest du zum beispiel ein kabel des batteriehalters durchtrennen, und dann die testkabel des multimeters mit den beiden enden verbinden.
ah jetzt verstehe ich thx ich glaube wenn ich hier fertig bin bin ich ein ausgelehrter elektriker^^ thx
edit: Ich habe mal etwas gegooglet und habe da vllt was gefunden zwar verwenden die einen at32 aber das ist ja nicht soweit endvernt die meisten berichten das sie irgendwo hängen bleiben und das irgendwas gesperrt wid vlt könnte das ja mal einer lesen bitte wenns geht ich versteh da nur Bahnhof und abfahrt. zuerst noch den link dabei schreiben^^
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=37841&highlight=twi
Edit: Der elektrieker hat drüber geschaut und meinte das soweit alles in ordnung wäre mit den verbindungen allerdings hätte er davon keine ahnung
Was muss ich eigendlich ändern das er nicht mehr die i2cmaster sachen haben will aber das er trotzdem i2c erkennt??? Ich will jetzt einfach nur noch die neue Lib verwenden wo er halt auch das i2c_init(); mit erkennt aber alles andere nicht mehr.Weil meine meinung das er das alles nicht braucht das sind bestimmt alles wiedersprüche in sich selber.Meistens ist das einfachste das richtige es wird ja schon alles kommentiert durch die eingabe bzw was ich eingebe, soll er ja machen, also verstehe ich nicht das ich dann noch ....(alles andere) brauch.
Mit dem TWI, geht nicht wie es in avrfreaks zu sehen ist, weil die verbindungen sind ja von Batterie und Taster verwendet. Deshalb geht es bei asuro so nicht, sondern nur mit i2cmaster von peter fleury.
probiere das hier bitte:
#include <avr/io.h>
#include "i2cmaster.h"
#include "asuro.h"
int main(void)
{
unsigned char ret;
unsigned char val;
Init(); // init Asuro
i2c_init(); // init I2C interface
val = 0;
StatusLED(RED);
while(1)
{
ret = i2c_start(0x40+I2C_WRITE);
if ( ret )
{
i2c_stop();
StatusLED(GREEN);
Msleep(500);
}
else
{
i2c_write(0x00);
i2c_stop();
StatusLED(RED);
Msleep(500);
}
ret = i2c_start(0x74+I2C_WRITE);
if ( ret )
{
i2c_stop();
StatusLED(RED);
Msleep(500);
}
else
{
i2c_write(0x00);
i2c_stop();
StatusLED(GREEN);
Msleep(500);
}
}
return 0;
}
wenn es immer grün wird, dann ist es in ordnung. wenn es immer rot ist, dann ist die addresse falsch, wenn rot-grün funktioniert es überhaupt nicht
Hi
Das funktioniert leider auch nicht. Das mit dem TWI ist schade das es nicht funktioniert habe gedacht.
damaltor
14.02.2007, 16:53
ändere mal in der zeile
ret = i2c_start(0x40+I2C_WRITE);
die zahl 0x40 in 0x74. das ist die adresse deines displays. nochmal kompilieren, und dann testen. auf dem display wird nicht viel zu sehen sein, aber erzähl uns dann mal ob die statusled grün ist.
nein, ich habe es so gemach, dass einmal 0x40 und ein mal 0x74 als device gewählt um zu überprüfen
also die statusLED ist immer grün egal wie rum ich das mache
was meinst du mit "wie rum ich das mache"
Einmal mit deinem text und einmal wie damaltor sagte
wenn du so gemacht hätte, wie dalmator es sagte, soll es eigentlich rot-grun-rot-grün...
mom ich mache nochmal
edit: Nee sie wird grün und bleibt grün
damaltor
14.02.2007, 17:40
na löl... was passiert wenn du die erweiterungsplatine mit dem dsiplay enfernst, also nichts an den i2c bus angeschlossen ist?
das ist unmöglich! ich hab extra am anfang statusled rot gemacht.
Probiere mal noch mal zu flashen und probiere noch mal
das einzigste mal wo die LED Rot wird ist wenn ich bei der test_i2cmaster.c das
#define Dev8574 0x40 // device address of PCF 8574, see datasheet
lasse dann ist es aber auch rot wenn das display drauf ist und egal was für texte ich schreibe.
wenn ich das aber in
#define EAT 0x74 // device address of PCF 2116_C , see datasheet
ändere bleibt die statusLED grün egal wann und was.
omg ich sehe gerade shit irgendwas ist da oberfaul
ich denke ich installiere mal alles neu und spiele alles neu auf mal schauen was dann passiert
Hi,
Ich verstehe nicht was du da schreibt. In mein code gibt Devxxx nicht, warum kopierst du nicht mein code auf test_i2cmaster.c und kompiliere das.
Hier die hex datei davon:
lol hätte ich das die ganze zeit in test_i2cmaster.c kopierensollen? habe immer in test.c kopiert.. UUUUPPPPSSSSS
edit: meine frau hat glaub blasen sprung (dann kommt mein kind ja bald *freu*)
WOW, ich hoffe dass deiner Frau gut geht, und dem Kind auch.
in mom noch ja sie war nass unten das ist meistens ein zeichen für blasen sprung mal schauen ob sie noch mal nass wird
also wenn ich die hex von dir flashe wird die statusLED grün und sonst eigendlich nichts mehr
ok, wenn du das module raus nimmst und asuro anmachst?
wenn rot --> dein LCD ist ansprechbar und funktioniert
wenn grün --> leider nicht
ok jetzt ist es rot wenn ich es drausen habe. Hatte vorhin es drin gehabt deswegen
Letzte Überprüfung:
Das LED soll rot-grün-rot-grün sein
EDIT:
1. Test war schon richtig --> LED immer grün
2. Test war schon richtig --> LED rot. wenn du als das module wieder anschließen als er rot ist, soll es grün werden.
3. Test "i2ctest2.hex" ---> LED wir rot-grün abwechseln
wenns draussen ist ist es rot
wenns drinn ist grün rot grün rot .....
edit: wenn ich den text eigebe geht das display aus.
#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(0x74+I2C_WRITE); //hier wird der i2c bus gestartet und die adresse
if ( ret ) //geschrieben
{
i2c_stop(); //sollte das nicht gehn, wird das programm hier eingefangen
StatusLED(RED);
while(1);
}
Msleep(200);
i2c_write(0x00); //controll byte (muss gesendet werden laut datenblatt)
Msleep(200);
i2c_write(0x2C); //die nächsten bitfolgen bzw werte sind aus dem daten-
Msleep(200); //blatt kopiert. sollte eigentlich das display
i2c_write(0x0E); //einschalten und den corsur nach oben
Msleep(200); //links setzen.
i2c_write(0x06); //einzige änderung: da nicht dual power sondern
Msleep(200); //single supply genutzt wird (also nur +5V und gnd und nicht
i2c_start(0x74+I2C_WRITE);
i2c_write(0x40);
Msleep(200);
i2c_write(0x54);
Msleep(200);
i2c_write(0x65);
Msleep(200);
i2c_write(0x73);
Msleep(200);
i2c_write(0x74);
Msleep(200);
while(1);
return 0;
}
Cool, es scheint doch dass dein LCD eigentlich in ordnung ist. Wahrscheinlich war die fehler beim programmieren ;)
Probiere mal marvin's code oder mein code...
der fehler war das ich alle quelltexte in test.c gemacht habe statt in test_i2cmaster.c das war ein gedanken fehler von mir sorry ich hatte den letzten quelltext von m.a.v.i.n in test_i2cmaster.c gemacht und da hatte er mir immer fehler angezeigt und bei test.c nicht daher kahm das
habe deinen ersten genommen da geht auch das display aus
was meinst du mit "aus" ??
Ich habe die hex geflasht gewartet da ist nichts passiert dann habe ich am kontrasst poti rungedreht da ist nichts gegangen dann habe ich den kontrast ganz hoch gemacht und asuro neu gestartet dann geht das display an sobald die status LED grün wird geht das display ca. ne halbe sec später aus.
edit: wenn ich deine test2 nehme geht das display nicht aus
damaltor
14.02.2007, 21:11
Sooo ich habe neuigkeiten. habe Danjo soeben diesen Code geschickt:
# #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(0x2E);
Msleep(200);
i2c_write(0x0E);
Msleep(200);
i2c_write(0x06);
Msleep(200);
while(1);
return 0;
}
und das display ist an. einige zeichen sollen sichtbar sein, allerdings wohl etwas komisch... mal sehn, danjo will fotos liefern evtl.
mal sehn, werd jetzt mal display clear senden und so weiter, evtl ein paar zeichen.
das problem bis jetzt war zum einen dass danjo den quellcode ins falsche file gepackt hat, und dass bei der initialisierung das bit "G" null war, was aber bedeuten würde dass das Display an +6 und -5 Volt angeschlossen wäre. wenn das bit 1 gesetzt wird, dann passt es auf die schaltung von danjo.
wir werden sehn was als nächstes kommt =)
http://img57.imageshack.us/img57/5204/bildea5.th.jpg (http://img57.imageshack.us/my.php?image=bildea5.jpg)
so gannz rechts oben in der ecke und ganz links in der ecke die zeichen sind dazu gekommen und den kontrast musste ich fast ganz zurück machen
OK Vielen vielen lieben Dank für eure hilfe und gedullt es war einzig und allein mein Fehler jetzt funktionierts und sorry wegen meinem unwissen
damaltor
14.02.2007, 22:15
Soo und wieder Gibts ein update.
dieser 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(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);
Msleep(200);
i2c_write(0x50);
Msleep(200);
i2c_write(0x48);
Msleep(200);
i2c_write(0x48);
Msleep(200);
i2c_write(0x48);
Msleep(200);
i2c_write(0x48);
Msleep(200);
i2c_write(0x48);
Msleep(200);
while(1);
return 0;
}
sollte theoretisch PHHHHH anzeigen. angezeigt wird aber HdHHHH. naja wenisgtens so ähnlich... und der cursor ist dahinter zu sehen, blinkend.
drückt uns die daumen!
oh jo das kann allerding ein verkehrterummes p sein und manchmal kommt nur dHHHHH
edit: das er HdHHHH geschrieben hat war ein fehler wieder von mir ich hatte von ner tempo packung unter der platiene gehabt zur isolierung jetzt habe ich isolier band drunter jetzt kommt nur noch dHHHH
Zeigt er jetzt schon was? cool.
Ich werde ein bibliothek speziell für dich schreiben danjo00 ^^.
das problem mit dem P: probiere mal msleep zu verkürzern. 1ms reicht schon
Edit:: falsch gesehen ^^[/code]
damaltor
14.02.2007, 23:02
So un noch nen update...
DAS DING GEHT EINWANDFREI!
der vollhorst der das datenblatt verfasst hat, in dem als beispiel der text PHILIPS ausgegeben werden soll, den ich mit PHHHHH vereinfacht habe, den UMGEKEHRTEN ZEICHENSATZ benutzt, der dazu da ist dass man das display überkopf lesen kann...
es wird also korrekt PHHH angezeigt, nur dass alle buchstaben auf dem kopf stehen...
Danjo, bitte probier mal dieses Programm... und wenn du es schaffst, dann schau dir vorher den code NICHT an, in den kommentaren steht was ausgegeben wird (werden sollte)
#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(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(0xC8); //H
Msleep(200);
i2c_write(0xE1); //a
Msleep(200);
i2c_write(0xEC); //l
Msleep(200);
i2c_write(0xEC); //l
Msleep(200);
i2c_write(0xEF); //o
Msleep(200);
i2c_write(0xA0); //Leerzeichen
Msleep(200);
i2c_write(0xC4); //D
Msleep(200);
i2c_write(0xE1); //a
Msleep(200);
i2c_write(0xEE); //n
Msleep(200);
i2c_write(0xEA); //j
Msleep(200);
i2c_write(0xEF); //o
Msleep(200);
i2c_write(0xA1); //!
Msleep(200);
while(1);
return 0;
}
viel glück...
raid_ox: die bibliothek bau ich gerad auf, lass dann später mal deine (für die DOG- und HD44780 Displays) und meine (die für dieses komische ding von Danjo =) zusammentragen, dann machen wir eine große LCD Library.
edit: Danjo mach ein FOTO!!
Vllt, können wir ja eine Essential LCD library und Spezifische machen.
Hast du mein library schon angeguckt? man muss eigentlich nur bei SetDataWrite ändern und SetIOLCD wegmachen
damaltor
14.02.2007, 23:11
ja stimmt. aber die komplette initialisierung ist anders, und auch der zeichensatz unterscheidet sich komplett.
Hast du die v0.2 gesehen? die initialisierung ist jetzt im define veränderbar
damaltor
14.02.2007, 23:14
hmm das ist nicht schlecht. aber lass mich erstmal bissl damit experimentiren =)
muss erstmal son paar sachen austesten, dann machen wir das. aber jetzt geh ich erstmal pennen, muss morgen früh raus.
Wenn du dein (noch kömischer) LCD kaufst, wäre ja lustiger, dass wir 3 verschiedene typ von lcd haben ^^.
Btw. hast du mit Danjo00 privat gechattet, oder wie hast du es ihm geholfen?
damaltor
14.02.2007, 23:18
ja hab mit ihm per icq gesprochen. lange nächte =)
so, bis morgen, ich fall fast um vor müdigkeit. aber son kleines erfolgserlebnis hilft beim einschlafen
Zeigt er jetzt schon was? cool.
Ich werde ein bibliothek speziell für dich schreiben danjo00 ^^.
das problem mit dem P: probiere mal msleep zu verkürzern. 1ms reicht schon
Hi thx sehr nett von dir das lcd funktioniert einwandfrei bis auf kleinere zeichen die er manschmal vertauscht.^^
So un noch nen update...
DAS DING GEHT EINWANDFREI!
der vollhorst der das datenblatt verfasst hat, in dem als beispiel der text PHILIPS ausgegeben werden soll, den ich mit PHHHHH vereinfacht habe, den UMGEKEHRTEN ZEICHENSATZ benutzt, der dazu da ist dass man das display überkopf lesen kann...
es wird also korrekt PHHH angezeigt, nur dass alle buchstaben auf dem kopf stehen...
Danjo, bitte probier mal dieses Programm... und wenn du es schaffst, dann schau dir vorher den code NICHT an, in den kommentaren steht was ausgegeben wird (werden sollte)
#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(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(0xC8); //H
Msleep(200);
i2c_write(0xE1); //a
Msleep(200);
i2c_write(0xEC); //l
Msleep(200);
i2c_write(0xEC); //l
Msleep(200);
i2c_write(0xEF); //o
Msleep(200);
i2c_write(0xA0); //Leerzeichen
Msleep(200);
i2c_write(0xC4); //D
Msleep(200);
i2c_write(0xE1); //a
Msleep(200);
i2c_write(0xEE); //n
Msleep(200);
i2c_write(0xEA); //j
Msleep(200);
i2c_write(0xEF); //o
Msleep(200);
i2c_write(0xA1); //!
Msleep(200);
while(1);
return 0;
}
viel glück...
raid_ox: die bibliothek bau ich gerad auf, lass dann später mal deine (für die DOG- und HD44780 Displays) und meine (die für dieses komische ding von Danjo =) zusammentragen, dann machen wir eine große LCD Library.
edit: Danjo mach ein FOTO!!
*gg* zuerst kam Hallo Danjo nach neu start kam !Hallo Danjo^^ er hat wohl ein bisschen schwirigkeiten das kann bestimmt am pullup ligen oder? Habe heute die zwei 4,7k ohm wiederstände bekommen
ok muss mich korrigieren wenn ich 36 buchstaben inc leerzeilen schreiben will kommt sowas bei raus
http://img247.imageshack.us/img247/9259/bild002uu2.th.jpg (http://img247.imageshack.us/my.php?image=bild002uu2.jpg)
der überspringt eine komplette zeile und zwar die zweite die jetzt zwar dargestellt wird aber wenn ich schreibe *Hallo* AE b Danjo schreibt er nur
http://img149.imageshack.us/img149/1979/bild001if4.th.jpg (http://img149.imageshack.us/my.php?image=bild001if4.jpg)
Trotz mehr maligen neustart. Kann das am Pullup ligen?
Eine blaue LED als hinter grund würde bestimmt nicht schlecht ausehen^^ mache das dann über die front led das wird ja so oder so nicht genutzt oder?
damaltor
15.02.2007, 10:50
ja das mit der led kannst du machen. ich vermute, dass diese fehler an den zeilensprüngen liegen: "Hallo Danjo!" hat 12 zeichen, +corsur = 13. da das display nur 12 zeichen anzeigen kann, könnte es sein dass es nicht geht, wiel ich NO SHIFT eingestellt hab. versuch mal, den letzten i2c_write-befehl zu entfernen, und probiers dann nochmal.
könnte sein, dass es hilft, wenn du den asuro ausschaltest und dann das display kurz entfernst und wieder aufsteckst, so dass es komplett von der stromversorgung getrennt wird (ich glaub out+ und out- stehen unter dauerstrom, oder?)
aber wir nähern uns...
dann funktionierts auch nicht so ganz ich denke wenn man ein leerzeichen noch hinter danjo machen würde gehts jop so funktionierts. Er macht halt öfters das letzte zeichen als erste hin und wenn das letzte zeichen ein leerzeiche ist ist das ja net sooo schlimm
Das erste bild ist wie er es richtig schreibt
http://s6.bilder-hosting.de/tbnl/ZBANR.jpg (http://www.bilder-hosting.de/show/ZBANR.html)
das zeigt halt wie er das leerzeichen als erstes macht
http://s6.bilder-hosting.de/tbnl/ZD5VX.jpg (http://www.bilder-hosting.de/show/ZD5VX.html)
wenn ich das display raus nehme und 10 sec warte dann noch mal rein mache und asuro starte schreibt er es immer richtig
Hi, zieg mal die letzte zustand von deinem code, ich will es gerne wissen, was ihr bisher gemacht habt
damaltor
15.02.2007, 16:27
den letzten code siehst du 5 posts über diesem, der einzige unterscheid ist dass der letzte i2c_write befehl entfernt wurde um ein fehlerhaftes scrollen des displays zu verhindern.
Sieht so aus als wenn das mit dem leerzeichen wirklich an irgend einer restspannung liegt. schalte den asuro mal ab, und warte 10-20 sekunden, um sicherzugehen dass alle kondensatoren und elkos leer sind. wird es dann auch richtig geschreiben?
Jop wenn ich das display ab mache und 10 sec warte und wieder rein mache schreibt er es richtig. obwohl er in mom nichts schreibt :-( habe irgendwas falsch gelötet
Hi, ich hab ne [test] library gemacht für dein LCD, probiere mal.
Das c-programm heißt lcd_test.c öffne das und compilieren.
Ich bin aber nicht ganz sicher ob es geht
sorry irgend wo habe ich ein kurtzen drin habe alles neu gelötet weil die verkabelung eigendlich nur provesorich war aber jetzt funktionierts nemmer ich habe gedacht das es an den batterien hing aber das display ist direkt an sobald ich auch den asuro an mache und die status led noch gelb ist wenn ich am kontrast potie drehe kann ich es mit aus machen irgendwie komich ich wechsel morgen mal das potie vllt ist es mir ja durchs löten kaputt gegangen
damaltor
15.02.2007, 23:54
da würd ich aber spontan eher auf das display tippen...
sei bloß vorsichtig dass du nix verschmorst...
jo ich poste noch mal wenn ich alles geprüft habe
ich glaube es ligt an den pins vom lcd wenn ich dran wakel passiert was
damaltor
16.02.2007, 20:00
hmm... vorsichtig (!) nachlöten? was passiert denn?
mal ne doofe frage: das poti hast du nicht aus versehen verdreht oder?
???wie verdreht falschrum eingelötet oder zu viel dran gedreht? es geht damit an und aus und es ligt jetzt difinitiv am pin 1 der ist mit jetzt abgerissen
hast du dein LCD immer noch nicht wieder zusammengelötet?
doch aber es funktioniert nicht mehr habe mir jetzt ein Neues Display und erweiterungs plantinen bestellt ich schicke es damaltor es ist ein pin abgerissen und wenn ich dran wackel geht das display an und aus irgendwas stimmt da nicht ich finde nur nichts der elektriker auf meiner schicht auch nicht vllt mal auf ne neue Platine löten aber egal wenns damaltor es wieder zum laufen bekommt brauch er sich dann wennigstens kein neues mehr zu kaufen^^ ( Erlich gesagt ist mir das jetzt zu dumm noch weiter daran rum zu basteln und zu schauen ich will das es endlich funktioniert und verliere bald die nerven und das mache ich ja bald schon bei der arbeit weil es leute gibt die vor mir schaffen, 31-35 jahre diesen beuf machen und zu dumm sind es richtig zu machen und ich der der gerade mal 1/2 jahr da schafft muss dann alles ausbügeln und das für 8 euros/h (die bekommen ca. 16eu.) ich müsste eher Km geld bekommen wegen der ganzen renne rei als für die spulen die wir produsieren(Pirelli reifen cord) )
hast du wieder das gleiche bestellt?
damaltor
17.02.2007, 15:00
genau das hab ich auch grad gedacht... =)
Ich empfehle mal ein HD447xx kompatiblere LCD, sonst können wir wieder wenig helfen. Außerdem bei dem Teil muss du ja dein fototransistoren auslöten. bei pcf8574 muss du es nicht machen
damaltor
17.02.2007, 15:05
naja, wie gesagt, ob die transistoren dann noch brauchbare werte liefern ist die frage (brücke ber pullup widerstände)
Nein, ich meine, er könnte immer noch die fototransistoren benutzen wenn er den lcd nicht an hat
damaltor
17.02.2007, 16:42
ja das ist wahr. auf jeden fall einen versuch wert.
hast du wieder das gleiche bestellt?
Jo habe das gleiche bestellt aber schon gestern sorry. Aber es funktioniert ja soweit waren wir ja schon
Hi, ich hab ne [test] library gemacht für dein LCD, probiere mal.
Das c-programm heißt lcd_test.c öffne das und compilieren.
Ich bin aber nicht ganz sicher ob es geht
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.
Gruss Danjo
damaltor
24.02.2007, 23:54
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
damaltor
25.02.2007, 16:21
löl...
naja such mal im datenblatt, du kannst irgendwie senden an welcher stelle er schreiben soll.
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 nicht
damaltor
25.02.2007, 20:49
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
#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;
}
Davon schreibt er mir Genau I Love You den unteren teil lässt er voll kommen weg (leider) Damaltor hattest du ICQ geschaut?
ä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
damaltor
25.02.2007, 21:45
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
#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;
}
damaltor
26.02.2007, 01:00
wie richtig? in 2 zeilen?
jo in 2 zeilen
---------------------------------
15 zeichen schreiben^^
damaltor
26.02.2007, 13:32
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^^
damaltor
27.02.2007, 23:10
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?
damaltor
27.02.2007, 23:43
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^^
#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
damaltor
01.03.2007, 15:53
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:
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();
Jetzt habe ich mich den ganzen Tag geärgert und jetzt endlich doch hinbekommen.
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:
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();
Funktioniert jetzt mit 10Mhz Quarz :-)
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...
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.