PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro I2C Porterweiterung (abgespeckt)



Mattze96
17.02.2012, 14:49
Hallo an alle,

heute möchte ich meine abgespeckte Version der I2C-Portexpander von Asuro-wiki vorstellen.
(In der myasuro.h - Datei musste ich die sda und scl ports tauschen, weil in der einleitung der i2c.h und im code die ports für lcd irgendwie vertauscht waren.) aber danach hats funktioniert.
ich habe aber noch ein paar fragen:

1) sind 10kOhm pullupwiderstände an sda und scl angemessen?
2) was für einen zweck erfüllen die INT0 oder INT1 Leitungen?
3) welche genauen werte muss man beim write befehl eingeben, damit die einzelnen Ports geschaltet werden? (Ich habe nur port 3 und 6 mit dem wert "182" geschaltet bekommen.(wert aus einem anderen code))

Was haltet ihr davon?

http://www.youtube.com/watch?v=XaXyawsnACU&context=C3a01ca8ADOEgsToPDskInbpMQXnjIkp8CkAdgF26S

danke

LG
Mattze96

Mein bisheriger code aus der c-Datei:


#include "asuro.h"
#include "myasuro.h"
#include "i2c.h"

#define Dev8574 0x40 // Adresse PCF8574 alle auf Masse

int main(void)
{


Init(); // initialisiere Asuro
InitI2C(); // initialisiere I2C-Interface

FrontLED(ON);
StatusLED(GREEN);

StartI2C(Dev8574 + WRITE);
WriteI2C(182);
StopI2C();

while (1);
return 0;
}

ePyx
17.02.2012, 19:13
1) 10k ist schon ok. Normalerweise werden 2k bis 5k genommen, aber mit 10k sollte es auch gehen.

2) die dienen dazu, dem µC zu signalisieren, dass sich ein Portzustandgeändert hat. Als wenn man die IOs der 8574 als Input nutzen möchte.

3) 182 dezimal = 10110110 binär. Eigentlich entspricht ein bit in der 8Bit-Maske einem IO-Pin. Also deine Pins die du geschaltet hast sind in der Maske 0

Mattze96
17.02.2012, 20:36
Hallo daniel,

vielen dank für die schnelle antwort. Mit den Interupts muss ich mich noch ein bisschen genauer beschäftigen.

gruß
Matthias

ePyx
17.02.2012, 21:36
Also die sollten beim µC an einen iterruptfähigen Pin INTX oder bei neueren AVRs PCINTXX. Die Pins am PCF8574 wecheln dann ihren Zustand. Auf den kannst du dann in der ISR reagieren und den Portzustand per I²C abfragen.

Mattze96
18.02.2012, 12:13
Hallo,

danke bei mir funktioniert jetzt alles!


Ich möchte nur meinen Ersten Fehler posten, welcher anderen möglicherweise auch Kopfzerbrechen verursacht hat.

Es betrifft zwar nur die welche nicht das LCD nutzen, aber egal.

Falls ich mich irre, bitte verbessern.


Wenn man laut i2c.h Datei-"Einleitung" ADC2 für SCL und ADC3 für SDA nimmt muss man es in der myasuro.h Datei umändern, weil es als Standard vertauscht ist. Ich habe nach der "Einleitung" der i2c.h Datei verbunden und es mich 3 Stunden gekostet, weil ich immer den Fehler woanders gesucht habe.

i2c.h Datei

\par I2C am ASURO
Die Hardware TWI (I2C) Ports sind beim ASURO leider durch den Batterie Abfrage
A/D Port und dem Tastsensor A/D Port belegt. Um die I2C Schnittstelle ohne
Umbau des ASUROs zu realisieren, wird der I2C BUs mit Software emuliert.
Dabei werden füer den I2C Bus die Ports der ASURO Erweiterungsplatine verwendet.
Dies sind ADC2 fuer die I2C Taktleitung (SCL) und ADC3 fuer die I2C Datenleitung (SDA).
Leider geht dadurch die Funktion des Liniensensors verloren.
Da die beiden Fototransistoren ebenfalls die Ports ADC2 und ADC3 belegen.
Ausloeten braucht man die Fototransistoren zum Glueck nicht.


myasuro.h Datei:

/* I2C Bus Definitionen */

#define MY_I2C_SDA PC3 /*jetzt ist es richtig, den ich habe es geändert, weil als Standard das LCD ausgewählt ist und es nicht mit der Einleitung der i2c Datei zusammenpasst.*/
#define MY_I2C_SCL PC2

/* Fuer das LCD Modul aus dem Asuro Buch gilt folgende Pinbelegung */
//#define MY_I2C_SDA PC2
//#define MY_I2C_SCL PC3


Grüße

Matthias