Forum: Mikrocontroller und Digitale Elektronik [PIC] EEPROM benutzen 16F84A


von Thomas M. (xt-fahrer)


Lesenswert?

Hallo,
in meinem aktuellen Programm auf dem 16F84A ist es notwendig, während 
des Betriebs eine Speicherzelle auszulesen und sie so zu speichern, daß 
ich sie nachher mit dem Programmiergerät aus dem PIC auslesen kann. Dazu 
scheint mir der EEPROM geeignet. Im Datenblatt gibt es zwar ein 
Codebeispiel, was mir aber noch nicht ganz klar ist. Es gibt ja EEDATA, 
EEADR, EECON1 und 2. Die CONs sind wohl die Kontrollregister, nur sehe 
ich in dem Codebeispiel nirgends, daß EEDATA und EEADR benutzt wird. Man 
sollte doch wissen, wo man was hinschreibt. Hier das Beispiel:

BSF STATUS, RP0 ; Bank 1
das ist klar

BCF INTCON, GIE ; Disable INTs.
das auch

BSF EECON1, WREN ; Enable Write
und das ebenfalls

MOVLW 55h ;
was soll das jetzt? Ist 55h der zu speichernde Wert?

MOVWF EECON2 ; Write 55h
MOVLW AAh ;
MOVWF EECON2 ; Write AAh
Würde damit der Wert 55AAh geschrieben, oder AA55h? und vor allem, an 
welche Adresse wird geschrieben?

BSF EECON1,WR ; Set WR bit
das ist wieder klar

; begin write
BSF INTCON, GIE ; Enable INTs.
und auch das

Bitte um Erklärung
T.

von Michael S. (rbs_phoenix)


Lesenswert?

Du schreibst die Adresse und die Daten in das jeweilige Register 
EEDATA&EEADR. Um die Daten in die Adresse zu schreiben, muss eine 
Codefolge in das EECON2-Register geschrieben werden. Also übernimmt das 
EEPROM die Daten vom RAM-Register, wenn erst 55h(01010101) in EECON2 
steht und danach AAh(10101010). Wenn dieser Wechsel von 55 auf AA kommt, 
beschreibt er den EEPROM.

edit:
Man kann es sich auch in etwa so vorstellen, als hätte man 16 Eingänge 
bei einem 16bit Speicher, die übernommen werden, wenn eine High-Flanke 
am Clockeingang kommt. Die 16 bit sind dein EEDATA und EEADR und der 
Clock geht von 0 (55h in EECON2) auf 1 (AAh in EECON2). Ich weiß nicht, 
ob das daruch klarer wird;)

von Michael S. (rbs_phoenix)


Lesenswert?

Ich hab mir jetzt nochmal das DB angeguckt, da stehts doch ansich auch 
drinne:

>>3.2 Writing to the EEPROM Data Memory
>>
>>To write an EEPROM data location, the user must first
>>write the address to the EEADR register and the data
>>to the EEDATA register. Then the user must follow a
>>specific sequence to initiate the write for each byte.
>>(Codebeispiel)
>>The write will not initiate if the above sequence is not
>>exactly followed (write 55h to EECON2, write AAh to
>>EECON2, then set WR bit) for each byte. We strongly
>>recommend that interrupts be disabled during this
>>code segment.

Wegen den Interrups weißt du ja bescheid.


Abgesehen davon, wenn es darum geht, Daten vom µC auf den Rechner zu 
bekommen, dann könnte folgendes auch interessant sein: RS232, 
Parallel(Drucker-)Port, SD-Karte via SPI, USB. Zugegeben es wird nach 
hinten hin immer komplizierter von der Software und kann teils nicht mit 
dem 16f84 (übrigens ein Jahrzehnte-alter nichtskönner;) ) gemacht 
werden. Wollte es trotzdem mal erwähnt haben.

von Thomas M. (xt-fahrer)


Lesenswert?

Stimmt, ich hatte die Stelle auch gefunden, ich fand's nur komisch, eine 
bestimmte Bitfolge zum Schreiben durchführen zu benutzen.
Du hast natürlich recht, ich könnte auch eine RS232- oder USB-ausgabe 
machen, mein Board kanns, aber mit dem EEPROM denke ich ist es am 
einfachsten. Ich brauche lediglich diesen einen Wert aus der 
Programmausführung.
Zum 16F84: wenn ich das Programm zufriedenstellend zum Laufen bekommen 
habe, wird upgedated auf den 16f88 oder 16f887

T.

von Michael S. (rbs_phoenix)


Lesenswert?

Thomas M. schrieb:
> Zum 16F84: wenn ich das Programm zufriedenstellend zum Laufen bekommen
> habe, wird upgedated auf den 16f88 oder 16f887

Gut^^ Ist halt n kleines Ding. Die neuen 16F1xxx bekommt man garnicht 
bei Reichelt, sehe ich grade. Bei Microchip kosten die aber gleich viel 
oder sind billiger als die "alten" PICs obwohl die mehr können. Naja. 
Wenn du dann den 16F887 hast und dich in C einarbeiten willst kannst du 
ja auch als nächst besseren Chip nen 18F nehmen. Ich bin keinesfalls ein 
16F-hasser, doch da die Config bzw Peripherie ein bisschen anders ist, 
kannst du dich mit denen da schonmal eingewöhnen, wenn du später C auch 
ausnutzen willst, wie z.B. Ethernet oder USB (gibts bei <=16F nämlich 
nicht). Wenn du denn soweit gehen willst;)

von Thomas M. (xt-fahrer)


Lesenswert?

Weiß nicht, ob ich C wirklich will. Das scheint etwas komplizierter zu 
sein. Der C-Compiler, der mit meinem Board(EasyPIC6) mitgliefert wurde, 
hat Einschränkungen, und die Vollversion ist schweineteuer. Außerdem hat 
wohl jeder C-Compiler für µController seine eigenen Befehle, wenn ich 
also einen Compiler kann, heißt das nicht, daß ich auch mit anderen 
klarkomme.
Die Assembleranweisungen hingegen sind immer diesselben, und MPLAB IDE 
ist kostenlos :-)

T.

von Michael S. (rbs_phoenix)


Lesenswert?

Thomas M. schrieb:
> Weiß nicht, ob ich C wirklich will.

Bei USB und und Ethernet WILLST du das, glaub mir;) Abgesehen davon ist 
C SEHR viel angenehmer zu programmieren, was auch der Sinn von 
Hochsprachen ist;) Solange es nicht wirklich eng mit dem 
Programmspeicher wird, bleib ich auch bei C. Wenn der Speicher grade so 
nicht reicht, nehme ich eher einen größeren PIC. Selbst die kleinen 12F 
programmiere ich in C.

Thomas M. schrieb:
> Der C-Compiler, der mit meinem Board(EasyPIC6) mitgliefert wurde,
> hat Einschränkungen, und die Vollversion ist schweineteuer.

Die Einschränkung vom MPLAB C-Compiler C18 oder C30, sowie vom mikroC 
Compiler, den ich nehme, sind nur Optimierungseinschränkungen. Keine 
Zeitbegrenzung und mit der "gedrosselten" Optimierung kommt man gut 
klar.

Thomas M. schrieb:
> Außerdem hat
> wohl jeder C-Compiler für µController seine eigenen Befehle, wenn ich
> also einen Compiler kann, heißt das nicht, daß ich auch mit anderen
> klarkomme.
> Die Assembleranweisungen hingegen sind immer diesselben

Andersrum wird n Schuh draus. C ist C, das ist eine Programmiersprache. 
Das einzige, was anders ist, sind die Hardware-bezogenen Funktionen und 
Variablen. Wenn es beim PIC z.B. ein OSCCON-Register gibt und beim AVR 
nicht bzw anders heißt. Genauso, wenn es beim PIC18F4550 ein PORTC gibt 
und beim PIC16F84 nicht;)
Doch wenn man ein Lauflicht für einen PIC in C programmiert, das mit 
einem Taster in der Richtung geändert wird, kann man das nach Anpassung 
der "Hardware-Variablen" und µC-Config auch auf einem AVR laufen lassen.
Wenn du ASM für PIC programmierst und dir dann mal ein ASM-Code für den 
AVR anguckst, stehste vorm Wald! ;)
Du musst halt nur gucken, dass der C-Compiler für ein PIC ist. Denn wie 
gesagt, C ist zwar von sich aus gleich, der ASM-Code und Maschinencode 
sind es aber nicht.

von Thomas M. (xt-fahrer)


Lesenswert?

Michael Skropski schrieb:
> Die Einschränkung vom MPLAB C-Compiler C18 oder C30, sowie vom mikroC
> Compiler, den ich nehme, sind nur Optimierungseinschränkungen. Keine
> Zeitbegrenzung und mit der "gedrosselten" Optimierung kommt man gut
> klar.

Interessant! Ich habe nämlich den mikroC, und der ist beschränkt auf 
eine HEX-Größe von 2kB. Mittelprächtiger Witz! Aber kommen wir nochmal 
zu MPLAB-kompatiblem C-Compiler: welchen empfiehlst du mir? Ich finde 
MPLAB eigentlich ganz gut...

T.

von Michael S. (rbs_phoenix)


Lesenswert?

Thomas M. schrieb:
> Interessant! Ich habe nämlich den mikroC, und der ist beschränkt auf
> eine HEX-Größe von 2kB.

Oh ich hab nochmal nachgeguckt.. die 5.0Version ist auf 4kB begrenzt.


Thomas M. schrieb:
> Aber kommen wir nochmal
> zu MPLAB-kompatiblem C-Compiler: welchen empfiehlst du mir? Ich finde
> MPLAB eigentlich ganz gut...

den von Microchip direkt, ist der nicht direkt bei MPLab dabei?? Heißt 
C18 für 8bitµC, C30 für 16bit und C32 für 32bit. Da bin ich mir aber 
nicht sicher. Es gibt sie auf jedenfall. Einfach mal googlen

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
Noch kein Account? Hier anmelden.