Hallo Leute, ich will mit einem PIC18F4550 (20MHz) ASCII-Codes in einen EEPROM Speicher (ST24C02) schreiben auslesen. Ich habe ein Beispiel Programm gefunden, welches ich nicht verstehe: ------------------------------------------------------------------------ #include <18f4550.h> #fuses HS,NOPROTECT,NOWDT,NOLVP #use delay(clock=20000000) #include <lcd.c> #use i2c(master,sda=pin_b0,scl=pin_b1) // i2c-Bus einbinden int8 Schreibwert,Lesewert; int1 ack=0; // Acknowledge-Bit für i2c-Bus int i = 0; main() // Beginn des Hauptprogrammes { lcd_init(); // Initialisierung des LCDs Schreibwert=0; while(true) { printf(lcd_putc,"\fSchreibwert: %u",Schreibwert); delay_ms(1000); i2c_start(); // externen Speicher beschreiben i2c_write(0xa0); // Adresse des externen Speichers+"write" i2c_write(0); // Speicheradresse 8 beschreiben i2c_write(Schreibwert); // die Variable "Schreibwert" schreiben i2c_stop(); delay_ms(50); i2c_start(); // externen Speicher auslesen i2c_write(0xa0); // Adresse des externen Speichers+"write" i2c_write(0); // Speicheradresse 8 auslesen i2c_start(); // laut Datenblatt nocheinmal starten i2c_write(0xa1); // Adresse des externen Speichers+"read" Lesewert=i2c_read(ack); // Speicherinhalt auslesen i2c_stop(); printf(lcd_putc,"\nLesewert: %u",Lesewert); delay_ms(500); Schreibwert++; // Variable "Schreibwert" um 1 erhöhen } } ------------------------------------------------------------------------ Ich habe es getestet, es funktioniert. Doch warum muss man zuerst i2c_write(0); schreiben und kann erst dann die eigentlichen Daten schreiben? Schreibt man einen Wert in den Speicher, wird die Speicheradresse automatisch um 1 erhöht. Wie zu einer bestimmten Stelle springen und dort zu lesen/ schreiben beginnen? Danke für eure Hilfe
> Ich habe es getestet, es funktioniert. Doch warum muss man zuerst > i2c_write(0); schreiben und kann erst dann die eigentlichen Daten > schreiben? Die (0) ist in diesem Beispielfall die Startadresse. > Schreibt man einen Wert in den Speicher, wird die Speicheradresse > automatisch um 1 erhöht. Wie zu einer bestimmten Stelle springen und > dort zu lesen/ schreiben beginnen? Indem man statt der (0) die Adresse einsetzt ab der der geschrieben bzw. gelesen werden soll. > Danke für eure Hilfe Gerne geschehen
Danke für deine Hilfe, jetzt verstehe ich das Programm. Ich habe es umgeschrieben, dass es einen Wert in den EEPROM speichert, wieder ausliest. Das wird so oft wiederholt bis der richtige Wert gespeichert wurde und eine Meldung über RS232 zum PC sendet. ------------------------------------------------------------------------ int cma = 0x00; void SaveToEEPROM(int valuetosave) { int read = 0x00; while(read != valuetosave) { printf("\n\n\n\rversuche 0x%X nach 0x%X zu speichern",valuetosave,cma); i2c_start(); i2c_write(0xa0); i2c_write(cma); i2c_write(valuetosave); i2c_stop(); delay_ms(50); i2c_start(); i2c_write(0xa0); i2c_write(cma); i2c_start(); i2c_write(0xa1); read = i2c_read(ack); i2c_stop(); delay_ms(50); printf("\n\rsoll:0x%X ist:0x%X",valuetosave,read); } printf("\n\rwert 0x%X erfolgreich nach 0x%X gespeichert",valuetosave,cma); cma++; // AKTUELLE SPEICHERADRESSE UM 1 ERHÖHEN } ------------------------------------------------------------------------ Die Ausgabe am PC sieht folgend aus (wenn es funktioniert hat): versuche 0x61 nach 0x0A zu speichern soll:0x61 ist:0x61 wert 0x61 erfolgreich nach 0x0A gespeichert Jedoch funktioniert es fast nie, und es wird nicht der Wert ausgelesen der geschrieben wurde, sondern meistens 0x63. Woran kann das liegen?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.