hmm, ist ja komisch, bei mir wird es immer rot, wenn ich den jumper rausziehe.
Druckbare Version
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???
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
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?
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?
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
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
und so sieht meine aus änderung ausCode:#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
Code:#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
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?
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.
Die Device Adresse und den Programmcode ändert man nur in der test_i2cmaster.c Datei.Code:;***** 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
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
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ß
habe jetzt die beiden widerstände r14 und r15 entfernt. jetzt passiert folgendes:Zitat:
Zitat von damaltor
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:
Code:#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;
}
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.
Ansonsten zur Hardware noch den Tip, am Kontrastregler drehen. Die Kontrastspannung VEE sollte ca 1V oder darunter betragen.Code:#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;
}
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
Code:#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(;;);
}
Zitat:
Zitat von m.a.r.v.i.n
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)
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
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)
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