PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Und wieder I2C am ASURO



falkenroby
28.03.2007, 17:37
ich dacht das lesen der I/O's vom 8574 hätte bei mir geklappt.
fehler !!!
ich hatte zwar werte bekommen aber mich erst einmal nicht
weiter darum gekümmert.
heute wollte ich mich noch einmal mit dem lesen der ports vom 8574P
beschäftigen und habe mich dann doch etwas gewundert!

also erst mal mein code:

#include <stdlib.h>
#include <avr/io.h>
#include "i2cmaster.h"
#include "asuro.h"


#define Dev8574 0x40 // device address of PCF 8574, see datasheet

int main(void)
{

unsigned char wert;

int i;

Init(); // init Asuro
i2c_init(); // init I2C interface


while(1)
{

i2c_rep_start(Dev8574+I2C_READ);
wert=i2c_readNak();
i2c_stop();

char text1[6] =" ";
itoa(wert, text1, 6);
SerWrite(text1, 6);
SerWrite(" x", 6);

SerWrite("\r\n", 2); // Zeilenvorschub

for (i=0; i<200; i++){Sleep(155);}



}
return 0;
}



und damit erhalte ich folgende ausgabe:

alle offen = 1103
P0 auf 0 = 1102
P1 auf 0 = 1101
P2 auf 0 = 1055
P3 auf 0 = 1051
P4 auf 0 = 1035
P5 auf 0 = 1011
P6 auf 0 = 515
P7 auf 0 = 331

wer sieht was was ich nicht sehe (oder verstehe)

damaltor
28.03.2007, 17:51
versuch mal, nicht rep-start in die endlosschleife zu packen.

mach mal

i2c_start(Adresse+I2C_READ);

while(1){

i2c_read(); //ohne NAK

}

(anpassen, hab das grad nur so getippt =)

vielleicht wirds dann besser.

leg mal alle pins gleichzeitig auf masse, was passiert dann?

und versuch mal PrintInt(integerwert); dann kannst du fehler bei der umwandlung in den string ausschliessen.

falkenroby
28.03.2007, 21:55
ok. habe den kampf gewonne. (hoffentlich !!!)

also readnak ist schon ok, da ich ja nur ein byte haben will und den vorgang ja dann immer gleich stoppe.

aber PRINTINT hura dem entwickler sei dank.
mein byte wurde einfach nur falsch übersetzt.

habe mir den teil aus der asuro.c mal rausgenommen und siehe da es geht.
zugegeben ich nehme gerne noch die alte asuro.c da ich wieder einmal
gesehen habe, das der unterschied 11 pages beim übertragen ist.
(30 pages zu 41 pages)

hier mal der kleine feine unterschied zu meiner umwandlung von
int nach ascii und die genie version


// meine version
char text1[6] =" ";
itoa(wert, text1, 6);
SerWrite(text1, 6);


//genie version
char text[6];
itoa(wert,text,10);
SerWrite(text,strlen(text));


also das zauber wort lautet strlen
hier wird die wirklich zeichenkettenlänge ermittelt und nicht wie bei mir
versucht immer 6 zeichen zu wandeln.

aber mal was anderes am rande.
wieviel byte sind eine page im speicher.

falkenroby
28.03.2007, 22:49
dank m.a.r.v.i.n noch eine erleuchtung.

es liegt nicht nur alleine an strlen.
auch bei dem 3. parameter von itoa habe ich mich vertan.
6 steht für hex 10 für dezimal.
und klar das es sich mit dezimal besser rechnen lässt.

DANKE

damaltor
29.03.2007, 12:17
ich glaube 7 kb entsprechen 140 pages, also ein kb 20 pages. so ungefähr wenigstens.