I2C und iow24

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

fitzi
Posts: 4
Joined: Sat Feb 26, 2005 3:16 am

I2C und iow24

Post by fitzi »

Hallo

ich habe eine iow24 und versuche jetzt schon seit ein paar Tagen die I2C Funktionalität des iow24 vollständig zum laufen zu bekommen. Das Schreiben auf verschiedene I2C Slaves (PCF8574AT, Matrix Orbital LK202-25) funktioniert soweit sehr gut.

Nun aber zu meinem Problem dem Lesen!

Ich habe folgenden Code (Ausschnitt):
i2c Funktionalität über Report_id 1 wird aktiviert
und dann möchte ich lesen

Code: Select all

int i2c_read(char addr, char *buffer, int size) {
	IOW24Report rep;
	ULONG nw = 0; //amount of written bytes
	//report_id read mode
	rep[0] = 3;	//report_id 3
	rep[1] = size;	//count of to read data
	rep[2] = addr;	//addr of i2c device 
	rep[3] = 0;
	rep[4] = 0;
	rep[5] = 0;
	rep[6] = 0;
	rep[7] = 0;
	nw = iows[0].Write(1, (PCHAR) &rep, 8);
	
	IOW24Report res_rep;
	res_rep[0] = 3;
	res_rep[1] = 0;
	res_rep[2] = 0;
	res_rep[3] = 0;
	res_rep[4] = 0;
	res_rep[5] = 0;
	res_rep[6] = 0;
	res_rep[7] = 0;

	nw = iows[0].Read(1, (PCHAR) &res_rep, 8);
	//check report_id
	if(res_rep[0] == 3) {
		printf("read from %X: %X bytes\n",addr, res_rep[1]);
	}//endif

	printf("read from %X:[0] %X\n",addr, res_rep[2]);
	printf("read from %X:[1] %X\n",addr, res_rep[3]);
	printf("read from %X:[2] %X\n",addr, res_rep[4]);
	printf("read from %X:[3] %X\n",addr, res_rep[5]);
	printf("read from %X:[4] %X\n",addr, res_rep[6]);
	printf("read from %X:[5] %X\n",addr, res_rep[7]);
	
	return 0;
}//endfunction i2c_read

Es ist ein PCF8574AT angeschlossen und P0 ist auf Masse gelegt.
Wenn ich mein Programm nun starte bekomme ich immer die untere Ausgabe => Es wird 1 Byte gelesen und der Wert der gelesen wird ist immer 0xFF =>Das kann nicht sein, es muesste ein kleinerer Wert rauskommen z.B 0xFE

read from 71: 1 bytes
read from 71:[0] FFFFFFFF
read from 71:[1] 0
read from 71:[2] 0
read from 71:[3] 0
read from 71:[4] 0

Ich weiß jetzt nicht ob ich einen Fehler mache oder ob beim IOW24 oder in der Lib was nicht stimmt.

Gruß

PS: Würde mich freuen, wenn mir einer weiterhelfen kann. Sonst mache ich noch Wochen damit herum.
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: I2C und iow24

Post by Guido Körber »

Was geht denn als IIC Adresse raus? Da muss dann natürlich das Bit 0 für Lesen auf 1 gesetzt werden.
fitzi
Posts: 4
Joined: Sat Feb 26, 2005 3:16 am

I2C und iow24

Post by fitzi »

Beim PCF8574AP habe ich die Adresse 0x70. Diese Adresse verwende ich beim schreiben. Die Adresse 0x71 verwende ich zum lesen und dabei kommt nix gescheites raus.

Code: Select all


 printf("read from %X:[0] %X\n",addr, res_rep[2]); 
//addr ist die Adresse von der gelesen werden soll

//ausgabe
read from 71: 1 bytes
..
//71 war die Adresse von der 1 Byte gelsen wurde (Schrott gelsen)

Gruß
Michael[/code]
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Wie ist denn der Datentyp IOW24Report den du verwendest definiert?

Eberhard
fitzi
Posts: 4
Joined: Sat Feb 26, 2005 3:16 am

Post by fitzi »

Ich verwende fuer den Typ IOW24Report ein char Vector

Code: Select all

typedef char IOW24Report[8];
Michael
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

fitzi wrote:Ich verwende fuer den Typ IOW24Report ein char Vector
Ich dachte nur das könnte aus versehen ein nicht initialisierter Zeiger sein.

Und schreiben geht, wenn du z.B. an den 8574 eine Led anschließt?

Im Datenblatt zum 8574 steht
The I/Os should be HIGH before being used as inputs.
Das geschieht wohl automatisch beim Power-Up. Schreibts du vielleicht irgendwo eine 0 auf den Port bevor der Wert zurückgelesen wird?

Und (nur wegen eigenen Erfahrungen) noch mal genau nachgesehen ob P0 wirklich an Masse liegt?

ich fische da auch ein wenig im Trüben...
Eberhard
fitzi
Posts: 4
Joined: Sat Feb 26, 2005 3:16 am

Post by fitzi »

Hallo

schreiben hat die ganze Zeit schon funktioniert und nun geht das Lesen vom PCF8574AP auch. Ich habe an die ersten paar Port Pins pull up Widerstaende gehaengt und es dann noch einmal versucht. Und siehe da er hat die Pins eingelesen die ich auf Masse gezogen habe.

Jetzt weiß ich zumindest das der iow im Zusammenhang mit dem PCF8574AP keinen Schuss hat.

Bin jetzt noch an der Sache mit dem Matrix Orbital Modul LK202-25 dran. Denn da funktioniert das einlesen des Keypads mittels i2c auch noch nicht so richtig. Mal schauen was die Matrix Oribtal Seite hergibt.

Danke

Gruß
Michael
Henning
Posts: 11
Joined: Mon Apr 18, 2005 9:42 pm

Post by Henning »

Hallo,

wie sieht denn die genaue Befehlsfolge nun aus, mit der Du den PCF8574AP auslesen kannst. Bei mir klappt zur Zeit nämlich auch nur das Schreiben.
spyro
Posts: 23
Joined: Fri Apr 14, 2006 8:13 pm

Post by spyro »

hallo fitzi,

ich verwende auch den pcf8574 und bekomme auch nur 0xFF zurück, also -1. kannst mir bitte schreiben,
ob und wie du dein problem lösen konntest??


fals jemand anders es weiß oder vielleicht mein code durchsieht wäre ich sehr dankbar.
entwicklung auf osx 10.3.9.
mein verständniss wie ich es aus der doku zum iow und der doku zum pcf8574 erlesen konnte,

1. enable iic id=1
2. write initialisierung des pcf8574 id=2
3. read acknowledge id=2
4. write lese-anforderung id=3
5. read lesen id=3

die ausgaben des programms stehen unten. ich hoffe mir kann jemand helfen.

danke spyro

Code: Select all

int main (int argc, const char * argv[])
{
char iic_buffer[8]={0,0,0,0,0,0,0},outdata[8]={0,0,0,0,0,0,0,0};

if(!IOWarriorInit())          printf("\n\nInitialisierung erfolgreich\n\n");	

printf("\n enable iic");
iic_buffer[0]=0x01;		// enable iic special funktion
iic_buffer[1]=0x00;
iic_buffer[2]=0x00;
iic_buffer[3]=0x00;
iic_buffer[4]=0x00;
iic_buffer[5]=0x00;
iic_buffer[6]=0x00;
iic_buffer[7]=0x00;

if (!IOWarriorWriteInterface1( 1 ,(void*)iic_buffer))	printf("\nschreiben int1 erfolgreich");
else printf("\nschreiben int1 nicht erfolgreich");

printf("\ninitialisiere adc, adresse read");


iic_buffer[0]=0xC3;		//flags generate start+stop, 3 Bytes to write  
iic_buffer[1]=0x90;		//adressbyte write
iic_buffer[2]=0xC3;		//controlbyte 

if (!IOWarriorWriteInterface1( 2 ,(void*)iic_buffer))	printf("\nschreiben int1 erfolgreich");//write request
else printf("\nschreiben int1 nicht erfolgreich");

if(!IOWarriorReadInterface1 (2,(void*) outdata))   printf("\nlesen von acknowledge int1 erfolgreich");		//write acknowledge
else	printf("\nlesen int1 nicht erfolgreich");


printf("\nacknowledge:\n");
printf("werte = %d, %d, %d, %d, %d, %d, %d, %d\n",(unsigned int)outdata[0],(unsigned int)outdata[1],(unsigned int)outdata[2],
												(unsigned int)outdata[3],(unsigned int)outdata[4],(unsigned int)outdata[5],
												(unsigned int)outdata[6], (unsigned int)outdata[7]);


outdata[0]=0x03;		//report id
outdata[1]=0x01;		//count=1 byte
outdata[2]=0x91;		//commando adress read
outdata[3]=0x00;		
outdata[4]=0x00;
outdata[5]=0x00;
outdata[6]=0x00;
outdata[7]=0x00;

if (!IOWarriorWriteInterface1( 3 ,(void*)iic_buffer))	printf("\nschreiben id=3 int=1 erfolgreich");
	else printf("\nschreiben int=1 nicht erfolgreich");


outdata[0]=0x00;
outdata[1]=0x00;
outdata[2]=0x00;
outdata[3]=0x00;		
outdata[4]=0x00;
outdata[5]=0x00;
outdata[6]=0x00;
outdata[7]=0x00;

if(!IOWarriorReadInterface1 (3,(void*) outdata))   printf("\nlesen von 1 wert id3 int1 erfolgreich");		
else	printf("\nlesen von 1 wert int1 nicht erfolgreich");


printf("\nwerte:\n");
printf("werte = %d, %d, %d, %d, %d, %d, %d, %d\n",(unsigned int)outdata[0],(unsigned int)outdata[1],(unsigned int)outdata[2],
													(unsigned int)outdata[3],(unsigned int)outdata[4],(unsigned int)outdata[5],
													(unsigned int)outdata[6], (unsigned int)outdata[7]);
												
return 0;
}


Initialisierung erfolgreich


enable iic
schreiben int1 erfolgreich
initialisiere adc, adresse read
schreiben int1 erfolgreich
lesen von acknowledge int1 erfolgreich
acknowledge:
werte = 2, 3, 0, 0, 0, 0, 0, 0

schreiben id=3 int=1 erfolgreich
lesen von 1 wert id3 int1 erfolgreich
werte:
werte = 3, 3, -1, -1, -1, -1, -1, 0
logout
10.3.9 iow40 enthusiasmus
spyro
Posts: 23
Joined: Fri Apr 14, 2006 8:13 pm

Post by spyro »

noch eine frage am rande:

wenn ich mit der funktion IOWarriorWriteInterface1 an das interface 1 des ersten gefundenen iowarriors schreibe,

wie mache ich es mit einem bestimmten iowarrior zum interface 1??

IOWarriorWriteToInterface(Listnode_info->nextNode->ioWarriorHIDInterface, 4,(void*) port);

klappt nicht...
10.3.9 iow40 enthusiasmus
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

iic_buffer[0]=0xC3; //flags generate start+stop, 3 Bytes to write
iic_buffer[1]=0x90; //adressbyte write
iic_buffer[2]=0xC3; //controlbyte


3 Bytes als Count angeben und nur 2 Bytes wirklich sinnvoll setzen, geht das gut?
spyro
Posts: 23
Joined: Fri Apr 14, 2006 8:13 pm

Post by spyro »

hallo,

gesehen und berichtigt. leider gehts noch immer nicht.
adresse ist 0,
analog output disable,
vier einzelne ad-inputs,
autoincrement off,
ich nutze nur Ain0,
der sensor geht, hab ich getestet,
der pcf müsste ganz sein, ist neu.





Code: Select all

int main (int argc, const char * argv[]) 
{ 
char iic_buffer[7]={0,0,0,0,0,0,0},outdata[7]={0,0,0,0,0,0,0}; 

if(!IOWarriorInit())          printf("\n\nInitialisierung erfolgreich\n\n");    

printf("\n enable iic"); 
iic_buffer[0]=0x01;      // enable iic special funktion 
iic_buffer[1]=0x00; 
iic_buffer[2]=0x00; 
iic_buffer[3]=0x00; 
iic_buffer[4]=0x00; 
iic_buffer[5]=0x00; 
iic_buffer[6]=0x00; 


if (!IOWarriorWriteInterface1( 1 ,(void*)iic_buffer))   printf("\ninitialisierung int1 erfolgreich"); 
else printf("\ninitialisierung int1 nicht erfolgreich"); 

printf("\ninitialisiere adc, adresse read"); 

iic_buffer[0]=0xC2;      //flags generate start+stop, 2 Bytes to write  
iic_buffer[1]=0x90;      //adressbyte write 
iic_buffer[2]=0x00;      //controlbyte 


if (!IOWarriorWriteInterface1( 2 ,(void*)iic_buffer))   printf("\nschreiben int1 erfolgreich");//write request 
else printf("\nschreiben int1 nicht erfolgreich"); 

if(!IOWarriorReadInterface1 (2,(void*) outdata))   printf("\nlesen von acknowledge int1 erfolgreich");      //write acknowledge 
else   printf("\nlesen int1 nicht erfolgreich"); 


printf("\nacknowledge:\n"); 
printf("werte = %0x, %0x, %0x, %0x, %0x, %0x, %0x \n",(unsigned char)outdata[0],(unsigned char)outdata[1],(unsigned char)outdata[2], 
                                    (unsigned char)outdata[3],(unsigned char)outdata[4],(unsigned char)outdata[5], 
                                    (unsigned char)outdata[6]); 

while (1)
{
sleep(1);

outdata[0]=0x01;        //count=1 byte  
outdata[1]=0x91;        //commando adress read
outdata[2]=0x00;       
outdata[3]=0x00; 
outdata[4]=0x00; 
outdata[5]=0x00; 
outdata[6]=0x00; 
if (!IOWarriorWriteInterface1( 3 ,(void*)iic_buffer))   printf("\nschreiben id=3 int=1 erfolgreich"); 
else printf("\nschreiben int=1 nicht erfolgreich"); 


outdata[0]=0x00; 
outdata[1]=0x00; 
outdata[2]=0x00; 
outdata[3]=0x00;       
outdata[4]=0x00; 
outdata[5]=0x00; 
outdata[6]=0x00; 


if(!IOWarriorReadInterface1 (3,(void*) outdata))   printf("\nlesen von 1 wert id3 int1 erfolgreich");       
else   printf("\nlesen von 1 wert int1 nicht erfolgreich"); 


printf("\nwerte:\n"); 
printf("werte = %0x, %0x, %0x, %0x, %0x, %0x, %0x \n",(unsigned char)outdata[0],(unsigned char)outdata[1],(unsigned char)outdata[2], 
                                       (unsigned char)outdata[3],(unsigned char)outdata[4],(unsigned char)outdata[5], 
                                       (unsigned char)outdata[6]); 
}
                                     
return 0; 
}
ich verstehe auch die ausgaben nicht.
wenn datatcount in der empfangenen reports 3 ist, warum empfange ich dann 3 2 ff ff ff ff ff ??

enable iic
initialisierung int1 erfolgreich
initialisiere adc, adresse read
schreiben int1 erfolgreich
lesen von acknowledge int1 erfolgreich
acknowledge:
werte = 2, 2, 0, 0, 0, 0, 0

schreiben id=3 int=1 erfolgreich
lesen von 1 wert id3 int1 erfolgreich
werte:
werte = 3, 2, ff, ff, ff, ff, ff

schreiben id=3 int=1 erfolgreich
lesen von 1 wert id3 int1 erfolgreich
werte:
werte = 3, 2, ff, ff, ff, ff, ff

ich find den fehler nicht, müssen die tomaten sein...
10.3.9 iow40 enthusiasmus
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Was kommt denn raus wenn Sie die gleichen Daten mit dem IOW-Prober an den Chip schicken?
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Ich weiss leider nicht was die Funktion IOWarriorWriteInterface1 genau macht, aber der Code zum Einschalten des IIC-Mode scheint mir nicht richtig zu sein.

Um den IIC-Mode einzuschalten schickt man 8 bytes an das Interface 1 :
Byte 0 : 0x01 - ReportId
Byte 1 : 0x01 - IIC-mode enable
Byte 2-7 : 0x00 Diese Byte sind 0

Am Anfang des Codes sehe ich aber folgendes:

Code: Select all

int main (int argc, const char * argv[]) 
 { 
 char iic_buffer[7]={0,0,0,0,0,0,0},outdata[7]={0,0,0,0,0,0,0}; 
iic_buffer und outdata sollten 8 bytes lang sein

Code: Select all

 
 if(!IOWarriorInit())          printf("\n\nInitialisierung erfolgreich\n\n");    
 printf("\n enable iic"); 
 iic_buffer[0]=0x01;      // enable iic special funktion 
 iic_buffer[1]=0x00; 
 iic_buffer[2]=0x00; 
 iic_buffer[3]=0x00; 
 iic_buffer[4]=0x00; 
 iic_buffer[5]=0x00; 
 iic_buffer[6]=0x00; 
 if (!IOWarriorWriteInterface1( 1 ,(void*)iic_buffer))   printf("\ninitialisierung int1 erfolgreich"); 
 else printf("\ninitialisierung int1 nicht erfolgreich"); 
iic_buffer enthält aber das Kommando IIC-Mode disable !
Byte 0 = ReportId-IIC-Mode
aber
Byte 1 = 0x00 das wäre enable=false.

Wenn ich das richtig sehe wird der IIC-Mode im Programm gar nicht eingeschaltet!

Code: Select all

 printf("\ninitialisiere adc, adresse read"); 
 
 iic_buffer[0]=0xC2;      //flags generate start+stop, 2 Bytes to write  
 iic_buffer[1]=0x90;      //adressbyte write 
 iic_buffer[2]=0x00;      //controlbyte 
 
  if (!IOWarriorWriteInterface1( 2 ,(void*)iic_buffer))   printf("\nschreiben int1 erfolgreich");//write request 
 else printf("\nschreiben int1 nicht erfolgreich"); 

Auch hier fehlt die Report-Id im iic_buffer.
Richtiger wäre wohl
iic_buffer[0]=0x02 //ReportId IIC-Write-Out
iic_buffer[1]=0xC2; //flags generate start+stop, 2 Bytes to write
iic_buffer[2]=0x90; //adressbyte write
iic_buffer[3]=0x00; //controlbyte

Die Argument für Adresse und Control-Byte sehen richtig aus.

Jetzt kommen allerdings vom IOWarrior 8 Bytes zurück!
0x02 - ReportId IIC-Write ACK
0x?? - Die Flags für das ACK
und noch 6 0x00-Bytes

Nun ist der PCF8591 (wegen analog output/input gehe ich mal davon aus, dass dieser Chip gemeint ist) konfiguriert.

Um nun den Wert an Analog-Input 0 zu lesen wäre nun folgendes zu schreiben:
0x03 //ReportId IIC-Lesen
0x01 //wir lesen nur 1 Byte
0x91 //Chipadresse und Lesebit gesetzt

Jetzt sollten vom IOWarrior 8 Bytes zurückkommen:
0x03 //ReportId IIC-Lesen
0x?1 //möglicherweise Fehlerflag im höchsten bit, 1 Byte Daten gelesen.
0x?? //Wert am AnalogInput 0
weitere 5 bytes die nicht interessieren.

Hier noch mal Aufpassen beim PCF8591:
Jedes Lese-Kommando startet die A/D-Wandlung aber liefert als Ergebniss den Wert der vorherigen Messung. Der allererste Lesebefehl liefert daher IMMER den Wert 0x80, denn es wurde bisher
noch keine Messung gestartet. Erst der nächste Lesebefehl liefert den tatsächlichen Wert am Eingang.

Eberhard
spyro
Posts: 23
Joined: Fri Apr 14, 2006 8:13 pm

Post by spyro »

hallo wayoda,

also erstmal ein dickes dankeschön für das lesen meines codes und auch finden der vielen ungereimtheiten.
ich hab s jetzt wieder zurückgebastelt auf 8 byte. so hatte ich das nämlich, bevor bevor herr körber meinte, 7 byte reichen.
mein ursprünglicher fehler (hab meinen alten code durchforstet) war nämlich controlbyte=c3, soll aber sein 0x00. typischer copy-paste-fehler, siehe oben.
per iowarriorprobber, den id's und meinen hex anweisungen liesst der iow endlich die seit tagen erwünschte 80 und danach andere werte, beeinflußt von der bewegung an meinem sensor.
leider liest mein programm nur die 80, immer wieder ??? hä?? ich hab das iic-protokoll angesehen, das acknowledge des masters ist eine bestimmter zustand von den beiden iic-leitungen, also nichts was ich selbst veranlassen könnte.
das macht doch der iow selbst, nachdem die daten empfangen wurden, aber hier passiert nach der 0x80 nichts, obwohl ich durch den iowprobber weiß, daß es geht.

ich finde hier aber vieles mißverständlich:
die geschichte mit den 7 byte ist irgendwie komisch.
in der doku steht, daß ein report an oder von interface1
immer 8 byte hat, inclusive der id.
in den funktionen die ich nutze muß ich die id und den void* angeben, wo die daten hinsollen/herkommen.
da fragt mann sich doch, wie die schreib/lesefunktion implementiert ist.
was der iow will/gibt ist klar, 8byte, aber daß die id in den buffer soll und der funktion als erstes argument übergeben wird ist doch doppelt gemoppelt, oder doch nicht??
der code unten funktioniert mit 8 byte buffergröße und der id im ersten byte.
ich habe aber auch ein zweizeiliges display an meinem iow für das ich eine funktion
void printlcd( char* lcd_buffer, char* lcd_buffer2); //deklaration
geschrieben habe.
aufruf: printlcd(" hier 16 zeichen"," hier auch");
es wird komplett mit 7 byte gearbeitet, also ohne id, die wird nur der funktion übergeben. es funktioniert perfekt, darauf gekommen bin ich durch einen zufall, vorher hab ich nämlich mit id in den 8 byte gearbeitet und nix ging. hier arbeite ich genau so und es geht, naja bis zur 0x80 :-)

also ich denke herr iwas ist der richtige mann für diese fragen.

ich weiß nicht warum ich nur den ersten wert auslesen kann, müßten doch die anderen kommen, da der lesezugriff richtig ist.

anbei noch eine frage zum display:
meine funktion muß für jedes schreiben das display neu initialisieren, einmalige initialisierung und dann neue daten nach clear display und cursor home geht nicht, sollte aber doch.
kennt das wer? ich hoffe daß mir trotz dieser "schweren vorwürfe" ;-) noch geholfen wird.
ich wünsche einen schönen abend und danke allen die hier so fleißig helfen.

bei interesse poste ich gerne meine komplette schreib-funktion für ein zweizeiliges display nach dem 16.6.

Code: Select all


#include <stdio.h>	
#include <unistd.h>	
#include "IOWarriorLib.h"
#include <CoreFoundation/CoreFoundation.h>


#define kIOWarrior40Interface0 0
#define kIOWarrior40Interface1 1


int main (int argc, const char * argv[]) 
{ 
char iic_buffer[8]={0,0,0,0,0,0,0,0},outdata[8]={0,0,0,0,0,0,0,0}; 

if(!IOWarriorInit())          printf("\n\nInitialisierung erfolgreich\n\n");    

printf("\n enable iic"); 
iic_buffer[0]=0x01;      // enable iic special funktion 
iic_buffer[1]=0x01; 
iic_buffer[2]=0x00; 
iic_buffer[3]=0x00; 
iic_buffer[4]=0x00; 
iic_buffer[5]=0x00; 
iic_buffer[6]=0x00; 
iic_buffer[7]=0x00; 

if (!IOWarriorWriteInterface1( 1 ,(void*)iic_buffer))   printf("\ninitialisierung int1 erfolgreich"); 
else printf("\ninitialisierung int1 nicht erfolgreich"); 

printf("\ninitialisiere adc, adresse read"); 

iic_buffer[0]=0x02;		 //id 2 out
iic_buffer[1]=0xC2;      //flags generate start+stop, 2 Bytes to write  
iic_buffer[0]=0x90;      //adressbyte write 
iic_buffer[1]=0x00;      //controlbyte 


if (!IOWarriorWriteInterface1( 2 ,(void*)iic_buffer))   printf("\nschreiben int1 erfolgreich");//write request 
else printf("\nschreiben int1 nicht erfolgreich"); 

if(!IOWarriorReadInterface1 (2,(void*) outdata))   printf("\nlesen von acknowledge int1 erfolgreich");      //write acknowledge 
else   printf("\nlesen int1 nicht erfolgreich"); 


printf("\nacknowledge:\n"); 
printf("werte = %0x, %0x, %0x, %0x, %0x, %0x, %0x, %0x \n",(unsigned char)outdata[0],(unsigned char)outdata[1],(unsigned char)outdata[2], 
                                    (unsigned char)outdata[3],(unsigned char)outdata[4],(unsigned char)outdata[5], 
                                    (unsigned char)outdata[6],(unsigned char)outdata[7]); 




while (1)
{



sleep(1);

outdata[0]=0x03;       // id 3 out   
outdata[1]=0x01;       //count=1 byte 
outdata[2]=0x91;       //commando adress read
outdata[3]=0x00; 
outdata[4]=0x00; 
outdata[5]=0x00; 
outdata[6]=0x00; 
outdata[7]=0x00;
if (!IOWarriorWriteInterface1( 3 ,(void*)iic_buffer))   printf("\nschreiben id=3 int=1 erfolgreich"); 
else printf("\nschreiben int=1 nicht erfolgreich"); 
sleep(1);

outdata[0]=0x00; 
outdata[1]=0x00; 
outdata[2]=0x00; 
outdata[3]=0x00;       
outdata[4]=0x00; 
outdata[5]=0x00; 
outdata[6]=0x00; 
outdata[7]=0x00; 

if(!IOWarriorReadInterface1 (3,(void*) outdata))   printf("\nlesen von 1 wert id3 int1 erfolgreich");       
else   printf("\nlesen von 1 wert int1 nicht erfolgreich"); 


printf("\nwerte:\n"); 
printf("werte = %0x, %0x, %0x, %0x, %0x, %0x, %0x, %0x \n",(unsigned char)outdata[0],(unsigned char)outdata[1],(unsigned char)outdata[2], 
                                       (unsigned char)outdata[3],(unsigned char)outdata[4],(unsigned char)outdata[5], 
                                       (unsigned char)outdata[6],(unsigned char)outdata[7]); 
									   
}
                                     
return 0; 
}

Initialisierung erfolgreich


enable iic
initialisierung int1 erfolgreich
initialisiere adc, adresse read
schreiben int1 erfolgreich
lesen von acknowledge int1 erfolgreich
acknowledge:
werte = 2, ff, 0, 0, 0, 0, 0, 0

schreiben id=3 int=1 erfolgreich
lesen von 1 wert id3 int1 erfolgreich
werte:
werte = 3, 80, 0, 0, 0, 0, 0, 0

schreiben id=3 int=1 erfolgreich
lesen von 1 wert id3 int1 erfolgreich
werte:
werte = 3, 80, 0, 0, 0, 0, 0, 0
10.3.9 iow40 enthusiasmus
Post Reply