Hello
ik zit met volgend probleem en echt alle hulp is welkom: ik ga een digitale pid-regelaar maken (voor temperatuur)en ben vertrokken van een schakeling die gebruik maakt van een pic16C71 in combinatie met een uitwendig EEPROM zijnde een 24C01 (die schakeling van op Elektuur dus),
in die code moet er dan een apart stuk zijn dat het lezen uit en het schrijven in dat EEPROM omschrijft, ik zal direct dit stuk code eronder zetten
het zit zo dat ik uiteindelijk ben overgestapt op een pic16f870 (dan kan die 24C01 weggelaten worden), ik ben eigenlijk geen krak in assembler en ik weet niet hoe ik nu de code zou moeten aanpassen om het lezen en schrijven in het EEPROM van de pic16f870 te installeren (of moet dit niet???)
als de volledige code nodig is zal ik ze wel posten op één of andere manier maar ze is behoorlijk lang (1219 regels) en in't Duits, dus ik hoop dat het stuk voor het eeprom alleen genoeg zal zijn 
alvast bedankt
ah ja, 24C01 : 8 poorten --> A0,A1,A2,WP, SDA, SCL, + en gnd
de SDA en SCL waren respectievelijk aan poort RB7 en RB6 van de pic aangesloten
;********************************************************************************
; Die folgenden 8 Unterprogramme dienen dem Lesen aus dem bzw. Schreiben in das EEPROM
;********************************************************************************
bstart bsf PORTB,SDA
bsf STAT,RP0 ; S. 1
movlw 3F ; RB6/7 = Ausgaenge
movwf TRISB
bcf STAT, RP0 ; S. 0
bcf PORTB,SCL
nop
bsf PORTB,SCL ; Takt = 1
nop
nop
nop
nop
nop
bcf PORTB,SDA ; SDA = 0 bei SCL = 1, Startbedingung
nop
nop
nop ; Setup-Zeit
nop
nop
bcf PORTB,SCL ; Takt = 0
nop
nop
retlw 0
;********************************************************************************
bstop bsf STAT,RP0 ; S. 1
movlw 3F ; RB6/7 = Ausgaenge
movwf TRISB
bcf STAT,RP0 ; S. 0
bcf PORTB,SDA ; zur Sicherheit, dass SDA auch wirklich LOW ist
nop
nop
nop
bsf PORTB,SCL ; Takt = 1
nop
nop
nop
bsf PORTB,SDA
nop
nop
bcf PORTB,SCL ; Takt = 0
nop
nop
nop
retlw 0
;********************************************************************************
bitein bsf EEPROM,DI
bsf STAT,RP0 ; S. 1
movlw 0BF ; 1011 1111b, SDA = Eingang, SCL = Ausgang
movwf TRISB
bcf STAT,RP0 ; S. 0
bsf PORTB,SDA ; SDA = 1 (?)
bsf PORTB,SCL ; Takt = 1
nop
nop
nop
nop
nop
btfss PORTB,SDA ; SDA-pin lesen
bcf EEPROM,DI
bcf PORTB,SCL ; Takt = 0
retlw 0
;********************************************************************************
bitaus bsf STAT,RP0 ; S. 1
movlw 3F ; RB6/7 = Ausgaenge
movwf TRISB
bcf STAT,RP0 ; S. 0
btfss EEPROM,DO
goto bit0
bsf PORTB,SDA ; Ausgabe: SDA = 1
goto takt1 ;
bit0 bcf PORTB,SDA ; Ausgabe: SDA = 0
takt1 bsf PORTB,SCL ; Takt = 1
nop
nop
nop
nop
bcf PORTB,SCL ; Takt = 0
retlw 0
;********************************************************************************
lies clrf DATEIN
bcf STAT,C ; damit Carry beim Linksschieben keinen Unfug macht!
movlw 08
movwf ZAEHL
wdh6 rlf DATEIN,f
call bitein
btfsc EEPROM,DI
bsf DATEIN,0 ; Eingabe bit = 1, wenn noetig
decfsz ZAEHL,f
goto wdh6
bsf EEPROM,DO ; Quittierbit = 1 setzen
call bitaus ; um Stop zu erlauben
retlw 0
;********************************************************************************
schreib movlw 08
movwf ZAEHL
wdh8 bcf EEPROM,DO ; Ausgabebit in EEPROM loeschen
btfsc ZWISCH1,7 ; bit 7 von ZWISCH1 lesen
bsf EEPROM,DO ; ist es = 1, wird Ausgabebit in EEPROM gesetzt
call bitaus ; sonst bleibt es 0
rlf ZWISCH1,f
decfsz ZAEHL,f
goto wdh8
call bitein ; ACKnowledge abfragen
btfsc EEPROM,DI
nop ; (hier steht im Original: bsf portA,3)
retlw 0
;*********************************************************************************
; Programmteil "Schreiben " schreibt jeweils 1 Byte aus DATAUS in den EEPROM-Speicher
;*********************************************************************************
schrb nop
call bstart
movlw teiladrs
movwf ZWISCH1
call schreib
movf WORTADR,w
movwf ZWISCH1
call schreib
movf DATAUS,w
movwf ZWISCH1
call schreib
call bstop
call pause1 ; 5 ms Schreibpause
clrwdt
return
;********************************************************************************
liesepr clrf DATEIN ; aus EEPROM lesen
clrf EEPROM
clrf ZWISCH1
call bstart
movlw teiladrs
movwf ZWISCH1
call schreib
movf WORTADR,w
movwf ZWISCH1
call schreib
call bstart
movlw teiladrs
movwf ZWISCH1
bsf ZWISCH1,0 ; bit 0 = 1: fuer lesen
call schreib
call lies ; aus dem EEPROM nach DATEIN
call bstop
clrwdt
return
;****************************************************************************************************************************
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
geen idee,
dat is al efkes geleden
het is alleszins de juiste want de printplaat die erbij zat was net die dat ik nodig had
Hallo Willem,
In de datasheet PIC16F87X staan in hoofdstuk 4 voorbeelden van lezen en schrijven naar EEPROM. Als je "liesepr" en "schrb" vervangt door deze voorbeelden ben je al een heel eind.
Let wel op dat er met literals gewerkt wordt (MOVLW DATA_EE_ADDR) terwijl jij registers gebruikt (WORTADR,DATEIN en DATAUS). Je moet dan MOVWF gebruiken en een keer extra van bank switchen. Denk er ook aan om aan het eind van de routine terug te switchen naar bank0, dat gebeurd niet in de voorbeelden.