Krumeltee

-> Elektronik, Mikrocontroller und Retro-Computing <-

Archive for the ‘I2C’ Category

5V statt 3,3V I²C-Bus an mini2440, NGW100, STK1000, grasshopper, …

Posted by krumeltee - 22. August 2011

Da die meisten der bastlerfreundlichen DIP-I²C-Chips 5V Chips sind, stellt sich die Frage, wie man die an ein 3,3V Board bekommt.

Die Einfachste Lösung ist, nachzusehen ob die Datenleitungen des Prozessors 5V tolerant sind, wenn ja, dann den Bus 1:1 anschliessen, den Prozessor mit 3,3V versorgen, den Chip mit 5V.

Wenn dem nicht so ist, dann kann man einen Widerstand in die SDA Leitung packen oder einen Pegelwandler verwenden.

Ich habe an NGW100, Grasshopper und mini2440 einfach nur einen 51 Ohm Widerstand in die SDA Leitung gepackt und versorge die Chips mit 5V, gibt keine Probleme.

Ein passender Pegelwandler dafür wäre der PCA9515 von NXP.

Posted in ARM, AVR32, Dil NET PC 486, Hardware Hacks, I2C, mini2440, Parallax Propeller | Leave a Comment »

SAA1064 I²C 7-Segment Treiber (4 Digits) am AVR32

Posted by krumeltee - 22. August 2011

Heute habe ich einen alten „Humax“ Receiver geschlachtet und gesehen, dass der Chip, welcher die 7 Segment Anzeigen im Bedienteil ansteuert ein SAA1064 ist.

Der SAA1064 kann bis zu vier  7-Segment Anzeigen mit bis zu 21mA pro Segment treiben, dazu sind nur zwei Transistoren, zwei Widerstände und zwei Kondensatoren extern nötig.

Der Chip ist zwar auch schon etwas älter, aber es gibt ihn in DIP und SMD noch bei Reichelt und anderen für ca. 2 Euro zu kaufen. Also hab ich mich kurz rangesetzt und ein bisschen Code für das Grasshopper Board und den Chip geschrieben. Sollte natürlich genauso auf dem NGW100, STK1000 usw. laufen.

Auf diesem Bild kommt die Zahl vom Grasshopper Board 🙂

Der Code ist relativ einfach und sollte anhand der Aufrufe der SAA1064-Funktionen in der main() selbsterklärend sein, hier findet ihr ihn.

Posted in ARM, AVR32, C, Dil NET PC 486, Embedded Linux, Hardware Hacks, I2C, mini2440, MIPS | Leave a Comment »

LM75 am AVR32 unter Linux

Posted by krumeltee - 15. August 2011

Hier eine kleine C-Lib, welche einen LM75 unter Linux auf dem AVR32 auslies.

Hier findet ihr die Quellcodes.

Der Code sollte auch mit meinem „RAM-I2C-Interface“ an jedem PC laufen.

Posted in ARM, AVR32, C, Dil NET PC 486, Embedded Linux, I2C, mini2440 | Leave a Comment »

PCF8574 am AVR32 unter Linux

Posted by krumeltee - 15. August 2011

Hier eine kleine C-Lib, welche einen MAX127 unter Linux auf dem AVR32 auslies.

Hier findet ihr die Quellcodes.

Der Code sollte auch mit meinem „RAM-I2C-Interface“ an jedem PC laufen.

Posted in ARM, AVR32, C, Dil NET PC 486, Embedded Linux, I2C, mini2440, MIPS | Leave a Comment »

MAX127 am AVR32 unter Linux

Posted by krumeltee - 15. August 2011

Hier eine kleine C-Lib, welche einen MAX127 unter Linux auf dem AVR32 auslies.

Der Code ist mehr oder weniger mein AVR-Code für den MAX127, einfach nur auf Linux angepasst.

Hier findet ihr die Quellcodes.

Der Code sollte auch mit meinem „RAM-I2C-Interface“ an jedem PC laufen.

Posted in AVR32, C, Embedded Linux, I2C, Linux, mini2440 | Leave a Comment »

MAX127 I²C-AD-Wandler am AVR

Posted by krumeltee - 27. Juli 2011

Ich bin vor kurzem durch Zufall an zwei MAX127 im DIP-Gehäuse gekommen, sehr praktische ADCs.

Hier ein kurzer Überblick:

  • I²C Interface
  • 8 Channels
  • 12Bit Auflösung
  • einzelne 5V Versorgungsspannung, ausreichend genaue Referenz mit 2 Kondesatoren möglich
  • 0-5V, 0-10V, -5V – +5V, -10V – +10V Input Range
  • -16,5V – +16,5V Überspannungsschutz auf den Eingängen
  • Bis zu 9 Chips am Bus verwendbar (72 Analoge Eingänge max.)

Durch die sehr starke Input Protection von +-16,5V ist dieser ADC nahezu Idioten- und Steckbrettsicher. Die Kommunikation ist extrem einfach gehalten, auch die Einstellmöglichkeiten sind nicht allzu aufgebläht, sodass man das Datenblatt in 10 Minuten auswendig kann.

Die Auflösung von 12Bit ist auch sehr gut, das reicht für Basteleien, Roboter, Akkuladegeräte, als Eingangs-ADC für analog gesteuerte Lichttechnik, …, … dicke aus.

Die Kommunikation benötigt für eine AD-Wandlung 4 Byte, also lasst uns mal rechnen:

100kHz Bus: 1/(32bit/100.000bit pro sekunde) = 3125 Messungen pro Sekunde

400kHz Bus: 1/(32bit/400.000bt pro sekunde)=12500 Messungen pro Sekunde

Soviel zur Theorie, die Start- und Stopbits, der Protokolloverhead, noch nicht mitgerechnet. Dies macht allerdings nicht allzuviel aus. Das Datenblatt gibt 8000 Samples Per Second an, das entspricht 125µS pro Messung. Um nun alle 8 Channels einmal abzufragen benötigt man also eine Millisekunde.

Nun genug der Rechnerei, hier zur Hardware, welche SEHR SEHR einfach ist.

Bei mir hing der ADC zum Testen an einem atmega32, sollte aber mit jedem AVR mit I²C funktionieren, wahrscheinlich schon auf einem attiny2313 oder ähnliche mit 2kb Flash.

Die Adresse des Chips lässt sich über die Pins A0, A1, A2 einstellen. Sind alle drei Pins auf GND, so ist die Adresse 0x50. Will man eine andere Adresse, sollte man sich das Datenblatt durchlesen.

Die Software ist ebenso einfach wie die Hardware. Mein Beispielcode für den ADC baut auf der Fleury I²C-Library auf. Die Display-Ausgaben in den weiteren Beispielen bauen auf der Fleury LCD-Library für ein HD44780 Display auf.

Hier erstmal der Quellcode:

/* get_max127()
*
* address - I2C Bus Addresse des Chips
* channel - Der Kanal, von 0 bis 7
* mode - 0 = 0-5V messung, 1 = 0-10V messung
* 2 = +-5V messung, 3 = +-10V messung
*
*/ 
unsigned short get_max127(unsigned char address, unsigned char channel,unsigned char mode) {
    unsigned char high, low, ret, config_byte;
    unsigned short value;
    if(channel > 7) return 0;

     ret = i2c_start(address);                                      // start communication
    if(ret == 0) {                                                // chip found
        if(mode == 3) config_byte = (0x8c | (channel<<4));        // configuration byte, for information see datasheet
        else if(mode == 2) config_byte = (0x84 | (channel<<4));
        else if(mode == 1) config_byte = (0x88 | (channel<<4)); 
        else config_byte = (0x80 | (channel<<4));
         i2c_write(config_byte);
        i2c_stop();

        i2c_start(address+1);
        high = i2c_readAck();
        low = i2c_readNak();
        i2c_stop();
        value = ((high<<8)|low);
        value >>= 4;
    } else {
        return 0;
    }
    return value;
}

Hier dann noch ein paar Beispiele zum verwenden der Funktion:

/* Channel 0, Wert in Hex, Dezimal, Volt von 0-5V Messung per RS232 rausschicken */
char buffer[64];
unsigned short ad_value = get_max127(0x50, 0, 0);
sprintf(buffer, "hex:%03x dez:%d volt:%1.4fV", ad_value, ad_value, ((5.0/0xfff)*ad_value));
uart_puts(buffer);

/* Channel 3, Wert in Volt auf HD44780 LCD mit Fleury LCD Lib ausgeben */
char buffer[17];    // buffer ist 17 bytes gross, fuer 16 zeichen LCD + ''
unsigned short ad_value = get_max127(0x50, 3, 1);
sprintf(buffer, "%1.4fV", ((10.0/0xfff)*ad_value));
rs232_send(buffer);

 

Sollten noch Fragen sein, könnt ihr mir schreiben oder aber auch das Datenblatt lesen. Zum Schluss natürlich noch ein Foto:

 

Posted in AVR, C, I2C | 2 Comments »

I2C an jedem PC mit SDRAM DIMMs

Posted by krumeltee - 5. Dezember 2010

Für meinen „Multimedia-TV-Computer“ habe ich einen Celeron 1,1Ghz ausgewählt. Da ich auch ein wenig Elektronik dran anschliessen will, brauche ich natürlich auch I/O Ports.

In frage kommen:

  • LPT-Port -> Da kommt ein Display dran
  • Serielle Ports -> einer von zweien belegt mit einem einfachen LIRC-Receiver, der zweite Konsole
  • I2C hat jeder PC welche SDRAM als Arbeitsspeicher verwendet…

… und da wären wir. Jedes SDRAM-Module hat ein SPD-EEPROM welches Informationen zum Speicher enthält. Es ist vom Typ 24C02 bei den meisten Speichermodulen, was aber irrelevant ist, da jedes SPD-EEPROM auf SDRAM ein 24xx ist und jedes 24xx ist ein I2C EEPROM. Hier mal ein Bild wie ich die Signale SDA, SCL und VCC sowie GND „abgegriffen“ habe. Die Spannung, die anliegt ist 3,3V und ich hole ca. 50mA da raus mit meinen LEDs, wieviel da drin ist, weiss ich leider nicht, daher würde ich die Betriebsspannung für Elektronik an diesem I2C Bus doch lieber von Netzteil direkt holen.

i2c vom SDRAM Modul klauen

i2c vom SDRAM Modul klauen

Ich habe dann einen 8 Bit Port Expander vom Typ PCF8574A angeschlossen und eine LED Bar mit 4 LEDs angeschlossen.

Ich habe alle Adresspins des PCF8574 auf 1 gelegt und bekomme somit die Adresse 0x3f. Wen es interessiert wie die Adressvergabe genau aussieht, der sei hierdrauf http://www.mikrocontroller.net/articles/Port-Expander_PCF8574 verwiesen. Wer nur einen PCF8574 verwenden will, braucht sich das nicht antun.

Hier noch der Schaltplan für meine kleine Elektronik:

pcf8574a circuit

pcf8574a circuit

Damit die nächsten Schritte funktionieren muss I2C im Kernel aktiviert sein, bei den Standardkerneln der grossen Distributionen ist das normalerweise immer der Fall. Man kann davon ausgehen, wenn „lm-sensors“ funktioniert, dann funktioniert auch der I2C Bus.

Nun installiert man im Linux das Paket „i2c-tools“ und schaut sich erstmal die Ausgabe von i2cdetect an. Zuerst muss man herausfinden, an welchem I2C Adapter der Chip hängt:

i2cdetect -l

i2cdetect -l

Ich habe von meiner Geforce2 her 3 I2C-Adapter und mein Chipsatz ist von VIA. Also ist mein gesuchter I2C Adapter der vierte („3“), der SMBus Via Pro Adapter.

Nun lassen wir die I2C Devices auf dem Adapter suchen:

i2cdetect -y 3

i2cdetect -y 3

Juhuu, 0x3f wurde gefunden 🙂

Nun können wir einfach mal sämtliche Bitkombinationen von 0 bis 255 ausgeben lassen, dann flackern die LEDs wild umher:

i2cdump -y 3 0x3f b

i2cdump -y 3 0x3f b

Wenn das nun schön geblinkt hat funktioniert der Portexpander am I2C Bus.

Nun ergeben sich folgende möglichkeiten:

z.B. einzelne Pins setzen mit i2cset -y 3 0x3f 0x00 DATEN

DATEN ist ein Hexwert von 0x00 bis 0xff. Drandenken, da die LEDs gegen 0 geschalten werden, muss der Wert invertiert werden, heisst bei 0xFF sind alle LEDs aus, bei 0x00 sind alle LEDs an.

Hier noch ein Foto von meinem Aufbau und ein kleines Video…

SDRAMIO

SDRAMIO

Und hier das Script, welches mit i2cset die LEDs so blinken lässt:

Posted in C, I2C, PC-Schrott-Verwertung | Leave a Comment »