Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Evtl. Fehler im Modul eeprom.c2 Kategorie: I²C-Bus (von Rolf - 15.07.2003 2:57)
Als Antwort auf Re: Evtl. Fehler im Modul eeprom.c2 von André H. - 14.07.2003 15:48

Hallo André,
 
> > Hallo Andrè,
> Jetzt merk ich's erst. :-)
> Das hei�t André nicht Andrè !

KompromiÃ?vorschlag: " Andrê "         *grins*
...aber ich halt mich demnächst dran :-)
 
> > Ja...
> > if i2c.cstart(eepromaddr) break;
> >         ^ da... wenn die Proportionalschrift mir da nicht den Satz zerbröselt...
> Hier wird nichts "rebröselt". Dafür werden automatisch   erstellt.
> Au�erdem, für was habe ich eine Vorschau im Forum ? :-)
> �brigens, nächste Frage: Mal sehen, ob Du es findest. *g*
> Wo ist das Release beim neuem Capture ?  :-)

Ich bin mir nicht sicher... entweder schraubst Du in asm am Stack rum, der vom return;
aufgeräumt wird oder das normale release; übernimmt dies. ich denke eher zweites.
Innerhalb des i2c.stop wäre es auch noch möglich... dann hättest Du aber sowas wie
i2c.cstop einführen müssen. ich müste mir dazu den asm-Code ansehen..
dazu hab ich aber jetzt keine Zeit. (soll keine Ausflucht sein... wenn Du willst,
verschieben wir das nur. Dann kannste auch ne genaue Antwort kriegen)
cstart ruft ja nur wait capture auf und macht dann das altbekannte start.
Wobei "nur" ist relativ... ich hab noch nicht nachgesehen was Capture macht.. ausser
ein paar VM-Instruktionen.. das dürfte dann in Capture.hex versteckt sein... und cap.c2 hab
ich mir auch noch nicht angesehen... da werde ich wohl schlauer werden :-)

> > function writeabyte(byte eepromaddr,int addr,byte data)
> > {
> >   capture i2c.flag;
> > //evtl. HW-watchdog oder Timer starten....
> >   wait i2c.start(160 or (eepromaddr shl 1));
> >   i2c.write(addr shr 8);
> >   i2c.write(addr);
> >   i2c.write(data);
> >   i2c.stop();
> > //hier dann noch mal eine Lesefunktion ähnlicher Bauart und vergleich ob Daten identisch sind.
> >   release;
> > }
> Hier gibt es jedoch ein kleines Problem:
> Um da wieder rauszukommen hilft nur folgendes:
> Entweder ein Neustart des Programms oder ein Zurücksetzen des betreffenden Threads
> mit der Anweisung "reset" .

Das hab ich auch überlegt.. gehen wir mal zum Beispiel mit der Steuerung für den Aufzug.
Ich würde nie so eine Steuerung ohne HW-watchdog betreiben. Wenn ich aber nen
HW-watchdog habe, kann ich den auch zum überwachen des Schreibvorgangs benutzen.
Beim Starten könnte die CC2 z.b. die Lastkurven im eeprom mit crc überprüfen und so feststellen,
ob vor dem letzten Reset ein Schreibfehler auftauchte. Wenn ja, muÃ? ein Notfallprogramm
gefahren werden... Bremsen ... Türen auf... SMS an Service... Notbetrieb mit 2.tem eeprom..
Ohne crc-Fehler wars nur eine normale Inbetriebname und die CC2 kann das Standartprogramm fahren.
Das ist noch sicherer als mit Thread reset obwohl man damit evtl. auch was machen könnte.

So.. zum aktuellen..
Ich beziehe mich auf Deine Mail.

den vermeintlichen Fehler mit for i=0 ... len-2 in readintarray habe ich nun verstanden. Es ist kein Fehler.
Du liest einen weniger weil ein abschlieÃ?endes i2c.read() und i2c.readlast() noch hinterher geschickt wird.
Im Fall von len=1 wird aus for i=0 ... len-2 aber for i=0 ... -1 , die CC2 geht also nicht in die for-schleife.
Die CC2 prüft also vor dem entern der for - Schleife die Bedingung... ich meine das auch schon anders
gesehen zu haben. Gut zu wissen.

Naja... bei readintarray kann noch ein if len < 1 return 0; an den Anfang... ist bei writeintarray schon
drin gewesen und soll wohl verhindern das len=0 übergeben wird. Bei den Bytearrayfunktionen ebenso.

Das Paging wird durch:
    if ((addr+i) % Pagewrite)==0 and i
      {i2c.stop();
       if not write(eepromaddr,addr+i) return i;
      }
gehandelt. Die Funktionen, die viele Bytes schreiben können, hast Du auch damit ausgestattet.
readstring braucht natürlich kein Paging, writestring hat es.. habs wohl überlesen.. sorry.
Nur warum in     if ((addr+i) % Pagewrite)==0 and i
das "and i" am Ende? Der Term 0 and i  dürfte immer 0 ergeben. Die Bedingung "Pagegrenze" ist doch mit
(addr+i) % Pagewrite)==0 erfüllt, oder? Wenn ja, reicht ja auch ein "if ((addr+i) % Pagewrite)"

Das  return s[31]; in readstring leuchtet mir aber immer noch nicht ein.
Auch das    return i; in writestr leuchtet mir nicht ein. Es werden ja immer 31 Byte geschrieben.

Was es noch nicht gibt, ist ein Longarray-Funktionspärchen und Floatfunktionen. Float weis ich nicht
ob das überhaupt gefragt ist aber Longarray fänd ich ja schon ... angebracht.

Wo ich mir noch Sorgen drum mache ist, wenn jemand Pagegrenzen überschreibt..
Also so etwa... writelong(eeprom1,30,wert); bei einer Pagesize von 32
die ersten 2 Byte des Longwertes müsten dann in der ersten Page, die zweiten zwo Byte in der zweiten
Page landen. Dem 24c512 mit 128er Pagegrenzen soll das angeblich nichts ausmachen...
auch wenn man das mit writelong(eeprom1,126,wert); versucht. Ich weis aber nicht wie's bei kleineren
Bausteinen ist.. 24c64 und so.. evtl müste man daher auch bei writelong und writeint eine Pageprüfung
einbauen. Oder zumindest müste man solche Schreibversuche abfangen... da sonst wieder Datenverlust
droht. Bei Int müste man nur einmal den Pagebreak prüfen.... bei Long gleich 3 mal...

GruÃ? Rolf








    Antwort schreiben


Antworten:

Re: Modul eeprom.c2 (von André H. - 15.07.2003 8:25)
    Re: Modul eeprom.c2 (von Rolf - 15.07.2003 10:47)
        Re: Modul eeprom.c2 (von 89984984/8 - 7.04.2005 10:32)
        Re: Modul eeprom.c2 (von André H. - 15.07.2003 11:50)
            Re: Modul eeprom.c2 (von Rolf - 15.07.2003 19:31)
                Re: Modul eeprom.c2 (von André H. - 15.07.2003 20:26)
                    Re: Modul eeprom.c2 (von Rolf - 15.07.2003 22:48)
                       Re: Modul eeprom.c2 (von Rolf - 18.07.2003 0:43)
                          Re: Modul eeprom.c2 (von André H. - 18.07.2003 18:19)
                             Re: Modul eeprom.c2 (von Rolf - 18.07.2003 18:35)
                                Re: Modul eeprom.c2 (von André H. - 18.07.2003 19:24)
                                   Re: Modul eeprom.c2 (von Rolf - 18.07.2003 21:38)
                                     Re: Modul eeprom.c2 (von Rolf - 18.07.2003 22:53)
                                       Re: Modul eeprom.c2 (von Rolf - 18.07.2003 22:55)
                                         Re: Modul eeprom.c2 (von Rolf - 19.07.2003 1:36)
                                           Re: Modul eeprom.c2 (von André H. - 19.07.2003 8:41)
                                             Re: Modul eeprom.c2 (von Rolf - 19.07.2003 13:02)
                                               Re: Modul eeprom.c2 (von André H. - 22.07.2003 10:18)
                                                 Re: Modul eeprom.c2 (von Rolf - 22.07.2003 14:04)
                                                   Re: Modul eeprom.c2 (von André H. - 22.07.2003 14:42)
                                               Re: Modul eeprom.c2 (von Rolf - 19.07.2003 16:39)
                                                 Re: Modul eeprom.c2 (von André H. - 22.07.2003 10:24)
                                                   Re: Modul eeprom.c2 (von Rolf - 22.07.2003 11:26)
                                                     Re: Modul eeprom.c2 (von André H. - 22.07.2003 14:13)
                                                       Re: Modul eeprom.c2 (von Rolf - 22.07.2003 15:04)
                                                         Re: Modul eeprom.c2 (von André H. - 23.07.2003 16:42)
                                                           Re: Modul eeprom.c2 (von Rolf - 23.07.2003 21:28)
                                                         Re: Modul eeprom.c2 (von Rolf - 23.07.2003 12:16)
                                                           Re: Modul eeprom.c2 (von André H. - 23.07.2003 16:28)
                                     Re: Modul eeprom.c2 (von André H. - 18.07.2003 22:43)