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