Autor |
Atmega TWI 24c04 lesen / beschreiben Suche nach: atmega (404) |
|
|
|
|
BID = 838429
erasure Gerade angekommen
Beiträge: 4 Wohnort: Worbis
|
|
Hallo
Ich wollte Daten auf ein 24C04 per twi speichern und auslesen.
Nur leider finde ich im Internet keinen gescheiten Code.
Bin dabei einen Kosmos Computer ( CP1 ) auf einen
Atmega8535 nachzubauen / progamieren. Soweit geht alles,nur möchte ich
die Daten ( das Programm ) auf einen Ser. EErom speichern / auslesen
Hier meine Daten:
Pollin board
den Atmega8535 hab ich auf 4 mhz intern laufen.
Ich schreibe in Assembler. Mit C oder Bascom hab ich mich leider noch nicht beschäftigt.
Es sollen 512 Byte gespeichert werden.
256 Byte Befehle und 256 Byte Daten in zwei Blocks.
Wäre nett wenn mir einer einen Code zukommen lassen würde. |
|
BID = 838430
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
|
Hallo und herzlich willkommen im Forum!
Fertigen Code habe ich nicht, schon gar nicht in Assembler.
In C kann ich dir die Routinen zum Ansprechen der TWI geben, das ist aber im Datenblatt des µCs wunderbar dokumentiert, sogar mit Beispielen in C und Assembler.
Wie die Abfolge der I²C-Zugriffe ausseht, um das EEPROM zu schreiben/lesen ist dem entsprechenden Datenblatt zu entnehmen, auch dort habe ich nur C-Code vorrätig, der aber leicht auf Assembler umgeschrieben werden kann.
Zitat :
|
256 Byte Befehle und 256 Byte Daten in zwei Blocks.
|
Wo ist der Unterschied zwischen Befehlen und Daten?
Oder warum machst du einen Unterschied?
_________________
|
|
BID = 838643
erasure Gerade angekommen
Beiträge: 4 Wohnort: Worbis
|
Hallo Donconi
Vielen dank erst mal
für die rasche Antwort. Leider kann ich mit C gar
nix anfangen. Müsst ich vieleicht umtüfteln, wenn es kein Assembler Code gibt.
Kennst du den Kosmos Computer?
Kannst ja mal Googeln. Ich hab mir den nachprogamiert , nur mit einen
LCD Display. Ein Befehl sah z.B so aus: 03 255
Die 03 war der Befehl. In diesem Fall eine Verzögerung.
die 255 war eine Date von 0 - 255. In den Fall oben verzögerte der Computer 255 Millisekunden.
Im 8535 hab ich die EErom Bänke so aufgeeilt . Untere Bank für die
Befehle ; obere Bank für die Daten zu den Befehlen. So kann ich 255 befehle mit demendsprechend den Daten speichern.
Deswegen wollte ich 512 Daten auf den 24 C 02 speichern. Vorher natürlich löschen , Damit bei den Daten wirklich nur 0 steht.
Es gab auch befehle ohne Daten natürlich: zb: 01 000
01 000 unterbrach das Programm.
02 000 zeigte den Akku an ; und so weiter....
21 befehle hatte der Computer. Voll retro. Ich nehme ihn um im Keller keine Bastelprogramme zu schreibe. Deswegen brauch ich nicht immer den Schlepptop runter zu tragen um mal eine Led blinken zu lassen.
Irgendwo gibt es auch einen link da kann man den Kosmos Computer auf den PC simulieren.
|
BID = 838651
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Nur leider finde ich im Internet keinen gescheiten Code. |
Dann schreib ihn dir doch selbst.
Mehr als einen PC mit dem alten MSDOS zu starten und den dazugehörgen Basic-Interpreter brauchst du dazu nicht.
Mit den neueren Betriebssystemen ist das wesentlich schwieriger, da sie es nicht erlauben, daß ein Programm direkt mit den Portpins herumfiddelt.
Der EEPROM wird dann direkt mit ein paar Leitungen vom Parallelport versorgt und programmiert. Wie das geht, steht im Datenblatt.
Zitat :
| Vorher natürlich löschen , Damit bei den Daten wirklich nur 0 steht. |
Das sollte nicht nötig sein und man sollte sich darauf auch nicht verlassen.
Ein Programm darf keine offenen Enden haben, sondern es muß prinzipiell korrekt beendet werden.
Entweder, in dem es die Kontrolle an das Betriebsprogramm zurückgibt, oder, indem es eine ewige Schleife ausführt.
Prozessorabhängig kannst du dich nämlich nicht darauf verlassen, dass 00 ein NOP ist, auch weisst du nicht, welche Daten der Prozessor bekommt, wenn er den Bereich physisch existenten aber dennoch adressierbaren Speichers verlässt, und schliesslich enthalten viele Speicher in gelöschtem Zustand nicht etwa 00, sondern FF.
In solchen Fällen würde dein "Löschen" genau das Gegenteil bewirken, nämlich verhindern, das ein 0 Bit auf 1 programmiert werden kann.
Umgekehrt, also 1 --> 0 geht schon.
[ Diese Nachricht wurde geändert von: perl am 16 Jul 2012 20:59 ]
|
BID = 838694
Brizz Stammposter
Beiträge: 386 Wohnort: Rheine
|
Wenn es hilft, kann ich Dir den Assemblercode für einen 80C32 geben.
|
BID = 838697
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Das setzt aber voraus, dass eine Instruktion und das passende Argument immer 8 Bit groß sind bzw. nicht größer sein dürfen (es sei denn, man kodiert die Instruktionen entsprechend).
Ein 24C02 kann aber nur 256 Byte speichern und nicht 512.
@perl
Ein AVR kann aus externen ROMs kein Programm ausführen.
Nur der Interpreter für diese 21 Befehle würde, sofern schlecht programmiert, bei ungültigen Instruktionen Mist bauen.
Edit: denn ich habe erasure so verstanden, dass er diesen Kosmos-Computer mit einem AVR emulieren will.
Das Programm in form dieser 21 Instruktionen soll von einem seriellen EEPROM ausgelesen und ausgeführt werden.
Den Sinn verstehe ich zwar nicht ganz, kann man doch mit dem AVR direkt Programme ausführen, allerdings erkenne ich den akademischen Anreiz
_________________
[ Diese Nachricht wurde geändert von: DonComi am 17 Jul 2012 0:43 ]
|
BID = 838698
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Aufbauend auf der einfachen TWI-API aus dem Thread hier.
#define WRITE 0
#define READ 1
uint8_t const EEPROM_ADDR = 0xac;
uint8_t read_eeprom(uint16_t address)
{
uint8_t upperbyte = EEPROM_ADDR;
upperbyte |= ( (uint8_t) (address >> 7) ) & 0xFE;
i2c_start();
i2c_transmit(upperbyte + WRITE);
i2c_transmit( (uint8_t) address );
i2c_start();
i2c_transmit(upperbyte + READ);
register uint8_t data = i2c_receive(NACK);
i2c_stop();
return data;
}
void write_eeprom(uint16_t addr, char byte)
{
i2c_start();
register uint8_t upperbyte = EEPROM_ADDR;
upperbyte |= ( (uint8_t) (addr >> 7) ) & 0xFE;
i2c_transmit(upperbyte + WRITE);
i2c_transmit((uint8_t)(addr));
i2c_transmit(byte);
i2c_stop();
}
Das kann man sehr einfach in Assembler umschreiben, da braucht man nicht mal Ahnung von C zu haben.
Vorsichtshalber das Datenblatt parat halten, aber solltest du WINAVR btw. avr-gcc benutzen, dann sind die Registerbezeichnungen identisch.
Der Source läuft übrigens irgendwo bei mir in abgewandelter Form für einen *C08, also für 1kByte.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 17 Jul 2012 0:51 ]
|
BID = 838702
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Ein AVR kann aus externen ROMs kein Programm ausführen. |
ist mir bekannt, aber ich hatte angenommen, dass der EEPROM lediglich programmiert werden soll, mit dem AVR als Option.
Daß der Chip als Programmspeicher für den Prozessor dienen sollte, hatte ich überlesen und ich kann auch keinen Sinn darin erkennen.
Zitat :
| Ein 24C02 kann aber nur 256 Byte speichern und nicht 512. |
Deshalb steht ja im ersten Posting, daß er einen 24C04 programmieren will.
|
BID = 838710
Brizz Stammposter
Beiträge: 386 Wohnort: Rheine
|
Anbei der Assemblercode für den 8032.
Auch wenn die Mnemonics anders sind, kann man doch erkennen, wie
SDC und SDA gesetzt und gelesen werden müssen, um einen I2C-Chip anzusteuern (einen 24C02 und einen I2C-Uhren-Chip).
Die Zahl der NOPs habe ich jeweils auf 1 reduziert. Die Anzahl aufeinander folgender NOPs, hängt von der Taktfrequenz Deines Prozessors ab. In meinem Fall waren es jeweils 10 NOPs (80C32 mit 22,.. MHz).
[ Diese Nachricht wurde geändert von: Brizz am 17 Jul 2012 8:48 ]
|
BID = 838842
erasure Gerade angekommen
Beiträge: 4 Wohnort: Worbis
|
Hallo
Wegen den Speicherlöschen. Ich nehme die 0 als leeren speicher , weil
wegen Anzeigetechnisch einfacher.
Hatte ich 24C02 geschrieben. Ups Natürlich einer von der Baureihe wo sich mindestens 512 Byte speichern lassen. Aber wenn ich nen 20c02 befiedeln könnte wird es mit nen 24 C 04 /8 /16 auch funktionieren.
Das mit den selberschreiben ist meine letzte Option. Nur leider wegen 11 Wöchigen Tochter erst mal auf Eis gelegt. Dachte Irgendeiner hat nen brauchbaren Assemblercode den ich nur für meine Zwecke umstricken müsste.
Danke noch mal der Code auf C. Wenn alle Stricke reißen werd ich mich wohl damit mal beschäftigen .
Ich hab auch schon mal nen Code auf Bascom gesehen. Vieleicht mach ich was damit.
|
BID = 838849
erasure Gerade angekommen
Beiträge: 4 Wohnort: Worbis
|
|