Forum: Mikrocontroller und Digitale Elektronik PIC16F628 EEPROM, Beenden von Write feststellen


von Ottmar K. (wil1)


Lesenswert?

Hallo Freunde,
Beim Beschreiben des EEPROM mit einer Zeichenfolge möchte ich erreichen, 
dass nur dann auf das beenden des hardwaremäßigen Schreibvorgang 
gewartet werden muss, wenn beim erneuten Aufruf der Write-Routine, 
dieser Vorgang, welcher ja unabhängig von der weiteren 
Programmausführung hardwaremäßig abläuft, noch nicht beendet ist. Dies 
funktioniert bis jetzt nicht.

Allerdings funktionieren die nachstehenden Abfragen (natürlich ist nur 
jeweils eine davon aktiviert) nur NACH Beendigung der vorgeschriebenen 
Sequenz zum Beschreiben des EEPROM.

Setze ich diese VOR die "requiered Sequences" wird nur fehlerhaft oder 
auch nur das zuletzt zu schreibende Zeichen im EEPROM abgelegt.
Führe ich dagegen ohne eine Abfrage, ein Delay von wenigstens 5ms vor 
oder nach der Sequenz aus, werden die Zeichen in Abfolge korrekt 
geschrieben. Unnötiges Warten möchte ich aber vermeiden.
1
EE_Write
2
;-----------------Required Sequence - Start   vgl. Datenblatt S.93
3
  movlw  0x55      ;55h must be written 
4
  movwf  EECON2    ;  to EECON2 to start write sequence
5
  movlw  0xAA      ;0xAA must be written
6
  movwf  EECON2    ;  to EECON2, to beginn
7
  bsf  EECON1,WR   ;b1=1 Write Control bit initiates a write cycle
8
                   ;  bit is cleared by hardware once write is complete. 
9
;-----------------Required Sequence - Ende   
10
;   Abfrage des WriteControl-Bit
11
    banksel  EECON1
12
    btfsc  EECON1,WR    ;=1? Write beendet? 
13
    GOTO  $-1           ;Nein weiter warten
14
;
15
;  Abfrage des EEPROM-Write Interruptflags
16
    ;bsf  PIE1,EEIE    ;=1, Interrupt-enable Bit in "Init" gesetzt
17
;        
18
     banksel  PIR1,EEIF
19
     btfss  PIR1,EEIF   ;=1? EE-Write Interrupt gesetzt? 
20
     GOTO  $-1          ;Nein, weiter warten
21
;    bcf  PIR1,EEIF     ;=0, wird nach Abschluss Write=1

Kann mir jemand sagen was ich da falsch mache, bzw nicht beachtet habe?

mfG Ottmar

von DirkF (Gast)


Lesenswert?

Hallo, also in C sieht mein Ding so aus:
Hast Du evtl vergessen, die Interrupts vor dem schreiben auszuschalten ?

void EEwrite(unsigned char adr, unsigned char dat) // write a byte of 
data to EEPROM
{
 EEADR=adr;
 EEDATA = dat;
 GIE=0;      // disable interrupts
 EEPGD = 0;
 CFGS = 0;
 WREN=1;      // enable writes
 EECON2=0x55;    // required sequence for EEPROM update
 EECON2=0xAA;
 WR=1;
 while(WR)continue;
 EEIF=0;
 WREN=0;
 GIE=1;      // re-enable interrupts
}

von Ottmar K. (wil1)


Lesenswert?

Hallo,

danke für die Rückmeldung. Klar sind die Interrupts ausgeschaltet, bin 
exakt nach Datenblatt S. 93 vorgegangen. Grundsätzlich geht das 
Schreiben ja auch problemlos, nur muss ich immer NACH dem Schreiben 
abfragen ob der Schreibvorgang beendet ist. Ich möchte aber VOR dem 
Schreiben abfragen ob der letzte Schreibvorgang abgeschlossen ist und 
dann in einer Schleife die notwendige Zeit abwarten, bis wieder 
geschrieben werden kann. Dann kann ich nämlich eine Menge anderen Code 
abarbeiten, bis der nächste Schreibvorgang wieder fällig wird.
Du wartest ja in Deinem Code "while(WR)continue" auch NACH dem 
Schreibvorgang auf dessen Abschluss.

mfg Ottmar

von Dirk F (Gast)


Lesenswert?

Hallo,
ja stimmt, ich mache die Abfrage ja auch nach dem schreiben, habe es 
andersherum noch nicht probiert.
Vielleicht geht es ja so:

- EEPROM schreiben
- WR=1;
- sonstiger code
- while(WR)continue;
- schreiben
- WR=1;
- sonstiger code
......

von Sam P. (Gast)


Lesenswert?

Und was ist mit

while (WR) mach_was_sinnvolles();

?

von Ottmar K. (wil1)


Lesenswert?

Hallo,

Danke nochmals für Eure Hinweise.
Ok, wie man das Programm NACH dem Schreiben weiter laufen lässt ist mir 
schon klar. Allerdings will ich aber auch keine Schleife welche das Ende 
des Schreibvorganges pollt und dabei in der Schleife weiteren Code 
abarbeitet.
Das Schreiben ins EEPROM ist nur ein Unterprogramm und die Hauptarbeit 
wird in Main geleistet. Wenn ich aus dem Unterprgroamm zu tief 
verschachtele laufe ich Gefahr dass der Stack überläuft. Ich habe mir 
jetzt schon die Finger im Netz wund gesucht entweder gibt es keine 
Lösung oder es hat sich noch niemand mit der von mir angestrebten 
(problematischen?) Abfragemöglichkeit befasst.

mfG Ottmar

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.