Forum: Mikrocontroller und Digitale Elektronik Programm von Pic16F628 für Pic16F88 ändern


von PICerer (Gast)


Lesenswert?

Hallo Forengemeinde,

habe ein "kleines" Problem.
Wir haben die Aufgabe, ein bestehendes, funktionierendes Programm für 
den 16F628 so zu ändern, dass es auf dem 16F88 läuft.
Das meiste läuft schon, lediglich mit den Daten im EEPROM hab ich noch 
ein Problem.
Zum einen gibt es beim 16F88 mehr Register für die Adressierung etc., 
zum anderen sind diese auch noch auf zwei Bänke verteilt.
Die entsprechenden Code-Ausschnitte sehen wie folgt aus:

.
.
.
ORG     0x2100           ; Start off EEPROM
de      "Test"
de      0x00
.
.
.
PrintDisp
    call  ClearDisplay    ; clear display content
    bsf    STATUS, RP0    ; Bank1
    clrf  EEADR      ; start of EE-memory
    movlw  0xE4      ; Start for first char a 7 o'clock
    movwf  FSR      ;
    movlw  .14      ; 14 char to display
    movwf  Scratch3    ;
pdisp_1
    bsf    EECON1, RD    ; read character from EEProm
    incf  EEADR,f      ; inc address for next read
    movf  EEDATA,w    ;
    bsf    STATUS,RP1    ; goto Bank2
    bcf    STATUS,RP0    ;

    call  CharOffset    ; call character data
pdisp_2
    call  LoadChrData    ; load pixel data from CharGen
    movwf  INDF      ; store char pixel data in display memory
    incf  FSR,w    ; increment FSR
    call   CheckIncrement  ;
    movwf  FSR    ;

    decfsz  ch_dot_index,f    ; 6 dot's in one character, all displayed 
?
    goto  pdisp_2      ;

    bcf    STATUS,RP1    ; leave bank 2, back to bank1
    bsf    STATUS,RP0    ;

    decfsz  Scratch3,f    ;
    goto  pdisp_1

    bcf    STATUS,RP0    ; go back to bank 0
    return

;--------
ScrollText
    bsf    STATUS,RP1    ; goto Bank2
    bcf    STATUS,RP0    ;

        movf  ch_dot_index,w    ;
    btfss  STATUS,Z    ; dot_index == 0 ?
    goto  Scroll_0

    movf  ch_blanking,w    ;
    btfsc  STATUS,Z    ;
    goto  Scroll_read_ee    ;
    decfsz  ch_blanking,f    ;
    goto  Scroll_2    ; insert one more " "
    btfss  fDemo      ; in demo mode?
    goto  Scroll_read_ee    ; re-read char

    bcf    STATUS,RP1    ; to bank 0
    call  TextON_OFF    ; at end of line, turn text off!
    return        ; stop scrolling


Scroll_read_ee
    bcf    STATUS,RP1    ; leave bank 2, to bank1 ;
    bsf    STATUS,RP0    ;
    bsf    EECON1, RD    ; read character from EEProm
    incf  EEADR,f      ; inc address for next read
    bcf    EEADR,7      ; roll over after 0x80 => 0x00
    movf  EEDATA,w    ;

    btfsc  STATUS,Z    ; Chr$(0) indicates end of line
    clrf  EEADR      ; start of EE-memory
    bsf    STATUS,RP1    ; go back to Bank2
    bcf    STATUS,RP0    ;

    btfss  STATUS,Z    ; if Z was 1, it wil still be 1 here
    goto  Scroll_1    ;
    movlw  0x0F      ; insert 15 " " at end of string to clear display
    movwf  ch_blanking    ;
.
.
.


Könnt ihr mir evtl. helfen?

Gruß

von Meister E. (edson)


Lesenswert?

PICerer schrieb:
> Wir haben die Aufgabe, ein bestehendes, funktionierendes Programm für
> den 16F628 so zu ändern, dass es auf dem 16F88 läuft.

Du schreibst "wir", also bist du nicht alleine. Wieso suchst du hier 
jemanden, der eure Aufgabe übernimmt? Zu Faul?

PICerer schrieb:
> Die entsprechenden Code-Ausschnitte sehen wie folgt aus:

Der Code, den du da gepostet hast, ist ja wohl unvollständig. Es zeugt 
auch nicht gerade von großem Verständnis der Materie, dass du 
Programmcode einfach ins EEPROM-Segment kopierst.

PICerer schrieb:
> Könnt ihr mir evtl. helfen?

Klar, aber ich werde es erst tun wenn du selbst ein wenig Einsatz 
zeigst. Hier einfach ein paar Zeilen Code rein zu kopieren und zu warten 
bis jemand eure Aufgabe löst - daraus wird nichts.

Gruß,
Edson

von PICerer (Gast)


Lesenswert?

Ja, WIR sind zwei.
Zwei Anfänger, was die Materie betrifft, möchte ich dazu sagen.
Deshalb vermögen wir auch nicht einzuschätzen, was von großem 
Verständnis zeugt, und was nicht.

Zum unserem "Einsatz":
es wäre uns auch lieber, wenn wir keine Hilfe benötigen würden, und ganz 
"faul" waren wir nicht:
wir haben die Datenblätter der beiden Controller miteinander verglichen 
und festgestellt,
dass die entsprechenden Register (EEADR, EECON1) im 16F88 auf anderen 
Bänken und somit Adresen sind als beim 16F628. Wohl auch, weil der 16F88 
so einiges mehr an SFR's mitbringt, mehr Flash und ein doppelt so großes 
EEPROM hat, usw.
Die entsprechende Bankwechsel haben wir also im code mit integriert, das 
Problem blieb aber bestehen.
Und jetzt stehen wir ein wenig auf dem Schlauch...

Bekommen wir nun einen Tip?

von PIC (Gast)


Lesenswert?

PICerer schrieb:
> Bekommen wir nun einen Tip?

Ja, von mir. Ich habe mir zwar den Code nicht genau angeschaut, aber:

der Leseaufruf:    bsf    EECON1, RD    ; read character from EEProm

erfolgt bei Euch von Bank 1 aus.

Die EECON Register liegen aber in Bank 3 !

und direkt vor dieser Zeile fehlt z.B. die Auswahl des Datenspeichers:

bcf  EECON1,EEPGD

bei einem 16F690er sieht das z.B. so aus (Auslesen der ersten EE-Zelle):

EElesen
  bcf    STATUS,RP0
  bsf    STATUS,RP1    ; Bank 2
; adressieren
  movlw  0x00          ; EEprom Zelle 0x00 auswählen
  movwf  EEADR         ; ins EE Adress Register schreiben
; auslesen
  bsf    STATUS,RP0    ; Bank 3
  bcf    EECON1,EEPGD  ; Lesezugriff auf den Datenspeicher
  bsf    EECON1,RD     ; Leseprozess starten
  bcf    STATUS,RP0    ; Bank 2
  movf   EEDATA,0      ; gelesenes Byte ins w-Register
  bcf    STATUS,RP1    ; Bank 0
return

von PICerer (Gast)


Lesenswert?

Danke für den Tip.
Soweit waren wir aber schon. Der oben stehende Code war der "Ur"-Code, 
deshalb war das dort noch nicht implementiert.
Was wir bereits versucht haben sieht so aus:
(wie Meister Eder schon richtig angemerkt hat ist das aber bei weitem 
nicht der vollständige code...)

.
.
.
PrintDisp
    call  ClearDisplay    ; clear display content
;    bsf    STATUS, RP0    ; Bank1
    banksel EEADR      ;  !!! necessary for PIC16F88 !!!
    clrf  EEADR      ; start of EE-memory
    movlw  0xE4      ; Start for first char a 7 o'clock
    movwf  FSR      ;
    movlw  .14      ; 14 char to display
    movwf  Scratch3    ;

pdisp_1
    banksel  EECON1      ; !!! necessary for PIC16F88 !!!
    bcf   EECON1,EEPGD  ; !!! necessary for PIC16F88 !!!
    bsf    EECON1, RD    ; read character from EEProm
    banksel EEADR      ; !!! necessary for PIC16F88 !!!
    incf  EEADR,f      ; inc address for next read
    movf  EEDATA,w    ;
    bsf    STATUS,RP1    ; goto Bank2
    bcf    STATUS,RP0    ;
    call  CharOffset    ; call character data

pdisp_2
    call  LoadChrData    ; load pixel data from CharGen
    movwf  INDF      ; store char pixel data in display memory
    incf  FSR,w    ; increment FSR
    call   CheckIncrement  ;
    movwf  FSR    ;

    decfsz  ch_dot_index,f    ; 6 dot's in one character, all displayed?
    goto  pdisp_2      ;

    bcf    STATUS,RP1    ; leave bank 2, back to bank1
    bsf    STATUS,RP0    ;

    decfsz  Scratch3,f    ;
    goto  pdisp_1

    bcf    STATUS,RP0    ; go back to bank 0
    return

;--------
ScrollText
    bsf    STATUS,RP1    ; goto Bank2
    bcf    STATUS,RP0    ;

    movf  ch_dot_index,w    ;
    btfss  STATUS,Z    ; dot_index == 0 ?
    goto  Scroll_0

    movf  ch_blanking,w    ;
    btfsc  STATUS,Z    ;
    goto  Scroll_read_ee    ;
    decfsz  ch_blanking,f    ;
    goto  Scroll_2    ; insert one more " "
    btfss  fDemo      ; in demo mode?
    goto  Scroll_read_ee    ; re-read char

    bcf    STATUS,RP1    ; to bank 0
    call  TextON_OFF    ; at end of line, turn text off!
    return        ; stop scrolling


Scroll_read_ee
;    bcf    STATUS,RP1    ; !!! comment for PIC16F88 !!!; else: leave 
bank 2, to bank1 ;
;    bsf    STATUS,RP0    ; !!! comment for PIC16F88 !!!
    banksel EECON1      ; !!! necessary for PIC16F88 !!!
    bcf    EECON1, EEPGD  ; !!! necessary for PIC16F88 !!!
    bsf    EECON1, RD    ; read character from EEProm
    banksel EEADR      ; !!! necessary for PIC16F88 !!!
    incf  EEADR,f      ; inc address for next read
    bcf    EEADR,7      ; roll over after 0x80 => 0x00
    movf  EEDATA,w    ;

    btfsc  STATUS,Z    ; Chr$(0) indicates end of line
    clrf  EEADR      ; start of EE-memory
    bsf    STATUS,RP1    ; go back to Bank2
    bcf    STATUS,RP0    ;

    btfss  STATUS,Z    ; if Z was 1, it wil still be 1 here
    goto  Scroll_1    ;
    movlw  0x0F      ; insert 15 " " at end of string to clear display
    movwf  ch_blanking    ;
.
.
.

MPLAB straft uns aber leider mit der Meldung:

The following memory regions failed to program correctly:
EEData Memory
Address: 00000000 Expected Value: 00000020 Received Value: 00000000
Programming failed

Noch eine Idee, wo wir mal nachsehen könnten?

GRuß

von Meister E. (edson)


Lesenswert?

PICerer schrieb:
> Noch eine Idee, wo wir mal nachsehen könnten?

Kannst du nicht den vollständigen Code in einen Anhang packen? Dann 
könnte man leichter nachvollziehen, wo es hakt.

Gruß,
Edson

von PICerer (Gast)


Angehängte Dateien:

Lesenswert?

...das sind an die 2000 Zeilen Code...
aber o.k.... ;-)

Gruß

von PIC (Gast)


Lesenswert?

PICerer schrieb:
> Danke für den Tip.
>
> Soweit waren wir aber schon. Der oben stehende Code war der "Ur"-Code

da macht das Helfen doch richtig Spass.

Naja, ihr seid ja wenigstens halbwegs auf dem richtigen Weg.

Viel Vergnügen noch bei den weiteren Fallen

:-)

von Erich (Gast)


Lesenswert?

Ein klassisches Beispiel,
warum man besser C als Programmiersprache verwenden sollte:

Die Lesbarkeit
Die Übertragbarkeit (Portierbarkeit) von einem uC zum anderen
Bei Pic: Kein kümmerern um dämliche Bankregister

von PICerer (Gast)


Lesenswert?

...hilft nur nichts, weil wir wegen der Prüfungsrelevanz Assembler 
lernen müssen und nicht C...

Gruß

von PICerer (Gast)


Lesenswert?

Neue Erkenntnisse!
Bin nur nicht sicher, ob ich darüber wirklich glücklich bin...
Weil wir nicht mehr weiter wußten haben wir mal folgendes versucht:
- neues Projekt in MPLAB angelegt
- Template für den 16F88 eingefügt und außer den Config-bits für unsere 
Anforderungen NICHTS daran geändert
- build all -> succeeded
- program Pic

und siehe da: auch da bekommen wir eine Fehlermeldung:
The following memory regions failed to program correctly:
EEData Memory
Address: 00000000 Expected Value: 0000004d Received Value: 00000000
Programming failed

Und das, obwohl wir im Template am Beispiel-Code für das EEPROM 
überhaupt NICHTS geändert haben... ???
Zusatzinfo: wir nutzen PicKit 3

Hat jemand eine Idee, warum das auch nicht funktioniert? Müssen wir in 
MPLAB / beim PicKit 3 irgendwas besonderes einstellen?

Gruß

von PIC (Gast)


Lesenswert?

PICerer schrieb:

> The following memory regions failed to program correctly

diesen Satz in Google eingegeben führt zu etlichen Antworten, die zur 
Lösung führen könnten.

Da wir aber nicht wissen, wie eure Hardware aussieht, vor Allem die 
Beschaltung von MCLR und der Programmierschnittstelle, lässt sich kaum 
sagen, welches Problem hier vorliegt.

Außer dass der PIKKit 3 garnicht mit dem PIC kommuniziert.

Kommt z.B. bei der Auswahl des PICKits die Meldung dass er einen 16F88 
gefunden hat?

Wird vor der Programmierung der Speicher gelöscht?

Ist LVP aktiv? und falls ja, wird der Pin PGM dann richtig benutz?

usw...

von PICerer (Gast)


Lesenswert?

also,...

Controller wird über ICSP-Schnittstelle programmiert.

Config-Bits (config1 passt hier leider nicht in eine Zeile):

__CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & 
_WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & 
_PWRTE_ON & _WDT_OFF & _HS_OSC

__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

LVP ist also off, genau so wie MCLR. Bei MCLR ist trotzdem noch ein 22k 
Pullup + Schottky-Diode (wegen Trennung zu VDD während des 
Programmierens)verschalten.
Überhaupt ist die ICSP-Beschaltung so, wie im ICSP-Guide von Microchip 
beschrieben.

PicKit und Target werden in MPLAB einwandfrei erkannt.

Sobald wir im code die ganze EEPROM-Geschichte auskommentieren läßt sich 
der PIC problemlos programmieren und funktioniert einwandfrei (natürlich 
mit Ausnahme des Parts, wo das EEPROM genutzt würde...).

Daher denke ich, dass wir kein Kommunikationsproblem haben, lass' mich 
da ber gern eines besseren belehren..

Gruß

von Peter D. (peda)


Lesenswert?

Die Frage ist, muß der EEPROM überhaupt vorbelegt werden?

Bei meinen Anwendungen mache ich das nicht.
Die Anwendung prüft, ob im EEPROM gültige Daten sind, z.B. durch ein 
Magic an einer bestimmten Adresse und durch eine CRC.
Und wenn sie feststellt, die Daten sind ungültig, dann lädt sie die 
default Daten hinein.

Damit ist auch abgesichert, wenn die Daten anderweitig zerstört werden. 
Z.B. wenn gerade beim Schreiben der Strom ausfällt und der EEPROM einen 
Teil neue und alte Daten enthält.


Peter

von PICerer (Gast)


Lesenswert?

...leider ja, weil dort ein Text steht, der als Laufschrift ausgegeben 
werden soll (was beim 16F628 auch funzt).
Ich füge mal den wesentlichen Teil des Schaltplans an. PortB geht auf 
LEDs,
außer RB6 und RB7. Diese Pins gehen über R22 und R23 auf je auf ein Gate 
eines MOSFETs.
Was "grundsätzlich" falsches finde ich in dem Plan aber nicht...

Mehrere Controller und einen weiteren "Brenner" haben wir auch schon 
versucht,.... leider alles ohne Erfolg.
Sobald diese Zeilen code
1
DATAEE    
2
    ORG  0x2100
3
    DE    "MCHP"  ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3

nicht auskommentiert sind, bekommen wir die Fehlermeldung...:-/

Gruß

von PICerer (Gast)


Angehängte Dateien:

Lesenswert?

...hoppla, Schaltplan vergessen...

von PIC (Gast)


Lesenswert?

und was passiert, wenn ihr nur die erste Zelle vordefiniert?

org   H'2100'
de    0x00

von PICerer (Gast)


Lesenswert?

...keine Fehlermeldung!
Mit mehreren "de 0x00" hintereinander kann ich auch problemlos mehrere 
Zellen des EEPROMs "betanken", aber sobald ich was anderes als 0h 
hineinschreiben möchte, bekomme ich wieder die Fehlermeldung... :-/

Gruß

von Chris B. (dekatz)


Lesenswert?

Habe jetzt mal das Template für den F88 genommen und mit MPLAB 8.83 
assembliert. Läuft ohne Fehlermeldung durch und das Listfile zeigt 
korrekt die erzeugten Werte an

                      00097 ;
                      00098 
;----------------------------------------------------------------------- 
-------
                      00099
2100                  00100 DATAEE    ORG  0x2100
2100   004D 0043 0048 00101     DE    "MCHP"  ; Place 'M' 'C' 'H' 'P' at 
address 0,1,2,3
       0050
2104   0088 00F8 0097 00102         DE        0x88, 0xF8, 0x97

von PICerer (Gast)


Lesenswert?

nutze ebenfalls MPLAB 8.83.
Beim Assemblieren bekomme ich auch keine Fehlermeldung, erst, wenn ich 
das Programm auf den Controller "überspielen" möchte...

Wenn ich das "jungfräuliche" Template nehme sieht mein Listfile so aus:

                     00097 ;
                      00098 
;----------------------------------------------------------------------- 
-------
                      00099
2100                  00100 DATAEE    ORG  0x2100
2100   004D 0043 0048 00101     DE    "MCHP"  ; Place 'M' 'C' 'H' 'P' at 
address 0,1,2,3
       0050
                      00102
                      00103 
;----------------------------------------------------------------------- 
-------


Geringfügig anders als bei Ihnen, aber die Daten scheinen schon an der 
richtigen Stelle zu sein...

Sehr suspekt, das Alles....

von Meister E. (edson)


Lesenswert?

PICerer schrieb:
> ...das sind an die 2000 Zeilen Code...
> aber o.k.... ;-)

Ok, was ist daran so ungewöhnlich? Bei Assembler-Programmen mache ich 
mir frühestens im 5-stelligen Bereich sorgen über das Ausmaß.

Peter Dannegger schrieb:
> Die Frage ist, muß der EEPROM überhaupt vorbelegt werden?

Sorry, aber das ist nicht die Frage in diesem Thread. Die beiden TE 
haben sich dieses Programm wohl nicht ausgesucht, also bringt es nichts 
jetzt eine weitere Baustelle aufzureissen.

Der Code lässt sich fehlerfrei übersetzen und die IDE wirft eine 
Fehlermeldung:

PICerer schrieb:
> The following memory regions failed to program correctly:
> EEData Memory
> Address: 00000000 Expected Value: 0000004d Received Value: 00000000
> Programming failed

@PICerer

Schau mal nach, ob unter Programmer>Settings>Program Options der Haken 
bei "Preserve EEPROM on Program" gesetzt ist. Ansonsten würde ich das 
Problem bei der Hardware vermuten. Die Fehlermeldung entsteht ja aus 
einem fehlerhaften Vergleich des EEPROM mit dem Hex-File (oder dem Ort, 
wo MPLAB die 'expected value' holt).

Gruß,
Edson

von PICerer (Gast)


Lesenswert?

o.k., zumindest eine Hürde ist genommen!
Der Haken bei "Preserve EEPROM" sorgt zumindest schon mal dafür,
dass die Fehlermeldung ausbleibt.
VIELEN DANK für diesen Tip.

Die Ausgabe der Daten auf unserem "Display" funktioniert aber leider 
noch nicht, obwohl ich (denke ich) die ganze Bank-hin-und-her-Schalterei 
angepasst habe...

Zum Code-Umfang: auch wenn es "nur" 2000 Zeilen Assembler sind hatte ich 
doch einige Hemmungen, das hier zu posten.
Ist ja nicht selbstverständlich, dass sich jemand diese Menge Text 
"freiwillig" antut,
um jemand fremden zu helfen...

BTW: der Brenner8 von Sprut bringt nach wie vor die Meldung "Start write 
EEPROM## 4 error(s)", wenn ich das hex-file übertragen möchte...(?)

Gruß

von Meister E. (edson)


Lesenswert?

PICerer schrieb:
> Ist ja nicht selbstverständlich, dass sich jemand diese Menge Text
> "freiwillig" antut,
> um jemand fremden zu helfen...

Wow, danke für diese Einsicht. Ich möchte mich für meinen provokanten 
ersten Beitrag bei dir entschuldigen.

Ich habe aber kaum etwas vom Quelltext gelesen. Es hilft schon sehr viel 
wenn man den Übersetzungs-Vorgang selbst nachvollziehen, also den 
Assembler mit vollständigen Daten füttern, kann.

PICerer schrieb:
> Die Ausgabe der Daten auf unserem "Display" funktioniert aber leider
> noch nicht, obwohl ich (denke ich) die ganze Bank-hin-und-her-Schalterei
> angepasst habe...

Gut, dann lohnt es sich jetzt das Programm genauer unter die Lupe zu 
nehmen.

Gruß,
Edson

von Peter D. (peda)


Lesenswert?

PICerer schrieb:
> ...leider ja, weil dort ein Text steht, der als Laufschrift ausgegeben
> werden soll (was beim 16F628 auch funzt).

Dann wäre noch eine Frage, ob dieser Text zur Laufzeit geändert werden 
muß oder konstant ist.

Konstanten Text legt man üblicher Weise im Flash ab, nicht im EEPROM.
Bei den einfachen PIC geht das mittels DT, welches RETLW-Anweisungen 
erzeugt.
Ist zwar etwas umständlich (PCLATH berechnen), aber man findet reichlich 
Beispiele dazu.
Das hat auch den Vorteil, daß der Flash deutlich größer ist als der 
EEPROM. Es paßt also mehr Text rein.

Man kann aber auch beides machen.
Ist der EEPROM leer (0xFF), wird der Text aus dem Flash gelesen. 
Ansonsten aus dem EEPROM.


Peter

von PICerer (Gast)


Lesenswert?

@Meister Eder
Kein Problem, so wie ich in meiner Verzweiflung schnell, schnell den 
Eröffnungsthread formuliert habe, hat man schon auf die Idee kommen 
können.
Ich war aber trotzdem fast ein wenig beleidigt, weil ich mich schon zu 
den Tüftlern zähle, die nicht so schnell aufgeben... ;-)
Allerdings ist mein Gebiet zugegebenermaßen eher die Hardware...

@Peter Dannegger
Text bleibt über die ganze Zeit konstant.
DT und PCLATH berechnen ist mir bekannt. Wird in dem von mir geposteten 
Programm sogar an andere Stelle angewendet.


Vielleicht noch folgende Info:
Das ganze basiert auf einer "Propeller-Uhr", die um die Möglichkeit 
einer Laufschrift erweitert wurde.
Uhr funzt wunderbar, die Laufschrift bisher leider nur beim 628er...

Gruß

von W.S. (Gast)


Lesenswert?

Erich schrieb:
> Ein klassisches Beispiel,
> warum man besser C als Programmiersprache verwenden sollte:
>
> Die Lesbarkeit
> Die Übertragbarkeit (Portierbarkeit) von einem uC zum anderen
> Bei Pic: Kein kümmerern um dämliche Bankregister

Eben nicht!
Wer nicht lernt, in Assembler gut strukturiert zu schreiben, der lernt 
es auch in C oder sonst einer Sprache auch bloß nicht.

Aber ich bin ja nett, also hier ein Ausschnitt aus einer meiner Quellen:
(war ein 16F871)

; eingebauter EEPROM
; ==================
ReadNextEE:
      INCF   FSR,F

; ein Byte vom EEPROM[FSR] lesen
ReadEE:
      MOVF   FSR,W
      BSF    RP1
      BCF    RP0
      MOVWF  EEADR
      BSF    RP0
      BCF    EE_PGD
      BSF    EE_RD
      BCF    RP0
      MOVF   EEDATA,W
      BCF    RP1
      RETURN

WriteNextEE:
      INCF   FSR,F

; EEPROM[FSR] schreiben, Daten in Hudl
WriteEE:
      BSF    RP0
      BCF    EEIE
      BCF    RP0
      BCF    EEIF
      BSF    rgie
      SKIP   GIE
      BCF    rgie
      MOVF   FSR,W
      BSF    RP1
      BCF    RP0
      MOVWF  EEADR
      BCF    RP1
      MOVF   Hudl,W
      BSF    RP1
      MOVWF  EEDATA
      BSF    RP0
      BCF    EE_PGD
      BSF    EE_WREN
      BCF    GIE
      CLRWDT
   MOVLW  55h
   MOVWF  EECON2
   MOVLW  0AAh
   MOVWF  EECON2
   BSF    EE_WR
      SKIP   NOT rgie
      BSF    GIE
      BCF    EE_WREN
      BCF    RP0
      BCF    RP1
_eew: SKIP   EEIF
      GOTO   _eew
      RETURN



; Text aus EEPROM auf senden, Position in W
TextOutEE:
         MOVWF    EEpos
_toz:    MOVF     EEpos,W
         MOVWF    FSR
         CALL     ReadEE
         SKIP     NZ
         RETURN
         CALL     SayIt
         INCF     EEpos,F
         GOTO     _toz

Dieser Ausschnitt verwendet einige Rettungszellen, um z.B. den Zustand 
von GIE zu retten. Ach ja: bei mir sind die Bitbezeichnungen mit den 
zugehörigen Registern verknüpft, deswegen braucht es z.B. nur ein BSF 
RP1 und nicht BSF STATUS,RP1

W.S.

von PICerer (Gast)


Lesenswert?

W.S. schrieb:
> Ach ja: bei mir sind die Bitbezeichnungen mit den
>
> zugehörigen Registern verknüpft, deswegen braucht es z.B. nur ein BSF
>
> RP1 und nicht BSF STATUS,RP1

Ja, hab ich mir schon gedacht, weil z.B. das Bit EEPGD ja 
"normalerweise" ohne Unterstrich geschrieben wird...

von PICerer (Gast)


Lesenswert?

...nachdem ich nun auf keinen grünen Zweig mehr komme, bin ich kurz 
davor aufzugeben (was mein Kollege bereits gestern schon tat).
Ich sollte wohl auch zukünftig lieber auf der Hardwareschiene bleiben... 
:-/

So wie es aussieht ist aus irgendeinem Grund mein EEPROM komplett mit 
"00" gefüllt. Ganz egal was ich mache.
Ich übertrage mein Programm auf den Pic, es kommt keine Fehlermeldung. 
Lese ich jetzt den PIC aus und gehe auf View->EEPROM steht wieder/immer 
noch in jedem Byte "00".
Probiert habe ich das ganze jetzt mit fünf (!) Controllern, weshalb ich 
das Problem jetzt mal nicht auf einen defekten Controller schiebe.
Lese ich das EEPROM beim 628er aus, sehe ich dort tatsächlich das, was 
ich hinein geschrieben habe. In den nicht benutzten Bytes steht "FF", 
nicht wie beim 88er "00".
Ganz schön frustrierend... :-(

Gibt es evtl. in MPLAB noch irgendeinen Haken den ich setzen/entfernen 
muss, oder irgendeine Option, die ich aktivieren/deaktivieren muss, um 
mit dem EEPROM zu arbeiten?

Gruß

von PIC (Gast)


Lesenswert?

Ich werde mal versuchen, deinen Code per PICKit3 in einen 16F88 zu 
bekommen und dann prüfen, was im EEProm steht.
Kann ich aber erst Anfang nächste Woche machen.

Ach ja, die 0815 Antworten im Microchip Forum kannst du vergessen. Die 
lesen noch nichtmal durch was für ein Problem vorliegt sondern antworten 
gleich mit Standard Phrasen wie: "benutze den Code wie im Datenblatt..."

:-)

von PICerer (Gast)


Lesenswert?

...ja, hab ich gemerkt...
Danke für deine Unterstützung. Bin gespannt, was bei dir rauskommt.

Gruß

von PICerer (Gast)


Lesenswert?

...steht Dein Angebot noch?

Gruß

von PIC (Gast)


Angehängte Dateien:

Lesenswert?

Nicht so ungeduldig,
bin gerade eben erst dazu gekommen.

Den 16F88 (18pin DIP) habe ich einfach auf dem Steckbrett mit den 5 Pins 
des PICKit3 verbunden (Vpp 5V Gnd Dat Clk)

Beim Auslesen des EE Inhalts des jungfräulichen Chips bekomme ich lauter 
Nullen. Nachdem ich deinen Code (siehe oben) hineingeschrieben habe, 
lese ich den gewünschten Inhalt aus dem EEProm !

D.h. es funktioniert.

Vielleicht ist deine Beschaltung mit den diversen passiven Bauteilen um 
den PIC herum die Ursache des Problems.

von PICerer (Gast)


Lesenswert?

Danke für deinen Versuch!
Wollte bestimmt nicht ungeduldig erscheinen, nur das Thema nicht in 
Vergessenheit geraten lassen.
Jedenfalls: EEPROM beschreiben und auslesen klappt jetzt auch bei mir.
Offensichtlich hat der PicKit 3 ein Problem, wenn er mit einer Kapazität 
von 24pF belastet wird.
Diesen Umstand habe ich beseitigt.
Das Dumme jedoch: irgendwo habe ich noch einen Bug im Code. Angezeigt 
wird mir der Inhalt des EEPROMs nämlich leider noch nicht... :-(
Das werde ich jetzt mal unter die Lupe nehmen.
Gut möglich, dass ich euch hier dann noch mal um Hilfe bitten muss...

Bis dahin aber noch mal vielen Dank an alle, die mir bis hierher 
geholfen haben.

Gruß

von PICerer (Gast)


Lesenswert?

räusper
Hab den Rest jetzt hingekriegt :-)
Danke noch mal für Eure Hilfe!

Gruß

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.