Zeig einmal dein Programm. Dann kann man helfen.
MfG Hannes
Druckbare Version
Zeig einmal dein Programm. Dann kann man helfen.
MfG Hannes
Code:#include "asuro.h"
#include "i2c.h"
#include "myasuro.h"
#define pcf8591_address 0x90 // I2C Adresse des PCF8574
//liest einen ADC Wert vom PCF8591
unsigned char read_pcf8591_adc(unsigned char adc)
{
unsigned char ret;
unsigned char byte = 0;
ret = StartI2C(pcf8591_address+WriteI2C); // Sende Start Condition
if (ret == 0)
ret = WriteI2C(adc); // Senden des Control Bytes startet die A/D Wandlung
StopI2C(); // Sende Stop Condition, Bus freigeben
Sleep(10); // Warten bis A/D Wandlung benedet (mind. 90µs)
ret = StartI2C(pcf8591_address+ReadI2C); // Sende Start Condition
if (ret == 0)
{
// Mehrmaliges Lesen um alte A/D Werte zu ignorieren
byte = ReadI2C(1); // Lese Byte + acknowledge
byte = ReadI2C(0); // Lese Byte + no acknowledge
}
else ret = 3;
StopI2C(); // Sende Stop Condition, Bus freigeben
return byte;
}
int main(void)
{
unsigned char rled;
unsigned char lled;
Init();
InitI2C();
FrontLED(ON);
while(1)
{
rled = read_pcf8591_adc(0);
lled = read_pcf8591_adc(1);
SerPrint("\r\n Port 1: ");
SerWrite(rled,3);
SerPrint("\r\n Port 2: ");
SerWrite(lled,3);
Msleep(500);
}
return 0;
}
Vielleicht hast du SDA und SCL vom I2C Bus vertauscht. Laut der myasuro.h muss SDA mit ADC2 und SCL mit ADC3 verbunden werden.
Geht das im Programm einfach zu ändern?
Laut meiner myasuro.h ist es anders rum.
Ich habe aber auch schon nachgesehen und meiner Meinung nach stimmt der Anschluss. Ich habe aber auch die myasuro.h geändert und mein Prog neu erstellt und es werden auch keine richtigen Daten und auch keine Änderrungen übertragen.Code:/* I2C Bus Definitionen */
//#define MY_I2C_SDA PC3
//#define MY_I2C_SCL PC2
/* Fuer das LCD Modul aus dem Asuro Buch gilt folgende Pinbelegung */
#define MY_I2C_SDA PC3
#define MY_I2C_SCL PC2
Muss ich eigentlich die originalen Pulldown Widerstände auf der Asuroplatine entfernen, oder kann man diese eingelötet lassen? (diese 20kOhm)
Die 20kOhm PullDown sind bei meinem Asuro auch drin. Die stören nicht weiter.
Normalerweise muss die AsuroLib neu übersetzt werden, wenn Werte in der myasuro.h geändert werden. Vielleicht hilft das ja. Ansonsten würde ich die read_pcf8591_adc Funktion so ändern, das der Rückgabewert im Fehlerfall eindeutig ist. Z.B. so:
Was hast du mit den nicht benutzten A/D Eingängen gemacht? Nicht benutze Eingänge müssen laut Datenblatt auf GND gelegt werden.Code:if(ret) byte = 0xFF;
return byte;
Bis jetzt sind die zwei noch offenen Eingänge nicht belegt. Es soll aber noch ein US-Modul aus dem Buch "Mehr Spaß mit ASURO" auf einen Eingang gelegt werden.
Ist der Befehl eigentlich dazu geeignet den byte Wert zu senden?
SerWrite(rled,3);
Oder hat jemand einen besseren?
Ups, deine Ausgabe Funktion habe ich mir ja gar nicht so richtig angeschaut.
Sollte man hier verwenden, nicht SerWrite. Dann sollte es auch endlich funktionieren.Code:PrintInt(rled)
So ich habe den Code geändert und die 2 offenen Eingänge auf Masse gezogen. Über das Terminal bekomme ich immer den Wert 255 gesendet, obwohl sich die Spannung an den Eingänger ändert.
Wer hat da ne Idee?
Code:#include "asuro.h"
#include "i2c.h"
#include "myasuro.h"
#define pcf8591_address 0x90 // I2C Adresse des PCF8574
//liest einen ADC Wert vom PCF8591
unsigned char read_pcf8591_adc(unsigned char adc)
{
unsigned char ret;
unsigned char byte = 0;
ret = StartI2C(pcf8591_address+WriteI2C); // Sende Start Condition
if (ret == 0)
ret = WriteI2C(adc); // Senden des Control Bytes startet die A/D Wandlung
StopI2C(); // Sende Stop Condition, Bus freigeben
Sleep(10); // Warten bis A/D Wandlung benedet (mind. 90µs)
ret = StartI2C(pcf8591_address+ReadI2C); // Sende Start Condition
if (ret == 0)
{
// Mehrmaliges Lesen um alte A/D Werte zu ignorieren
byte = ReadI2C(1); // Lese Byte + acknowledge
byte = ReadI2C(0); // Lese Byte + no acknowledge
}
else ret = 3;
if(ret) byte = 0xEE;
StopI2C(); // Sende Stop Condition, Bus freigeben
return byte;
}
int main(void)
{
unsigned int rled;
unsigned char lled;
Init();
InitI2C();
FrontLED(ON);
while(1)
{
rled = read_pcf8591_adc(0);
lled = read_pcf8591_adc(1);
SerPrint("\r\n Port 1: ");
PrintInt(rled);
SerPrint("\r\n Port 2: ");
PrintInt(lled);
Msleep(500);
}
return 0;
}