PIC-Lernbeispiel: Lesen aus dem EEPROM

mit PIC16F628


zurück zu Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage


alle Flash-PICs außer den PIC16F7x besitzen einen EEPROM-Bereich, in dem das Programm Daten ablegen kann, die auch bei abgeschalteter Spannung erhalten bleiben.
Die Grundlagen des EEPROM-Zugriffs sind bereits an anderer Stelle erläuter worden. In diesem Beispiel werden Daten aus dem EEPROM gelesen und mit LEDs dargestellt.

Schaltung
Schaltbild zum EEPROM-Lesen-Beispiel Die Schaltung besteht lediglich aus einem PIC16F628 (oder 16F84 oder 16F87x) und einer 10-MHz Taktquelle für den PIC. Am Port B sind 8 Leuchtdioden angeschlossen.. 

Zum Aufbau eignet sich z.B. die 16F84-Testplatine. oder die 16F84-Minitestplatine mit einer LED-Platine

Beim Brennen des PIC ist der HS-Oszillator auszuwählen. Bitte darauf achten, das beim Brennen LV-Programming-Enable nicht aktiv ist.


Programmablauf



Ich habe aber einen anderen Prozessor

Das Programm lässt sich natürlich an andere PICs mit EEPROM anpassen. Dabei ist darauf zu achten, das die Register EEADR, EECON1 und EEDATA nicht bei allen Prozessoren in der Bank 1 liegen.Die EEPROM-Leseroutine 'EERead' (genauer gesagt die Bankumschaltung in der Routine) muss deshalb an andere Prozessoren angepasst werden.


Programmlisting

;**************************************************************
;*
;* Pinbelegung
;* ---------------------------------- 
;* PORTA: 0 
;*        1 
;*        2 
;*        3 
;*        4 
;* PORTB: 0 LED 
;*        1 LED 
;*        2 LED 
;*        3 LED 
;*        4 LED 
;*        5 LED 
;*        6 LED 
;*        7 LED 
;*
;**************************************************************
;
;sprut (zero) Bredendiek 10/2002 
;
; PIC Lernbeispiel EEPROM auslesen
;
; Prozessor 16F628 
;
; Prozessor-Takt 10 MHz
;
; LEDs am Port B
;
;**********************************************************

; Includedatei für den 16F628 einbinden
        #include <P16f628.INC>

        ERRORLEVEL      -302    ;SUPPRESS BANK SELECTION MESSAGES

; Configuration festlegen:
; Power on Timer, kein Watchdog, HS-Oscillator
        __CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC 

; Variablen festlegen
loops    equ 0x20              ; timer für wait
loops2   equ 0x21              ; timer für wait
Adresse  equ 0x22              ; Zeiger auf EEPROM-Zelle

; Werte für OPTION_REG und STATUS
Ini_con Equ B'00000000'        ; TMR0 -> Interrupt disable
Ini_opt Equ B'00000000'        ; pull-up aus

;voreingestellte Muster
        org H'2100'            ; Adresse des EEPROM für den Brenner
        de B'00000001'         ; 0
        de B'00000011'         ; 1
        de B'00000111'         ; 2
        de B'00001111'         ; 3
        de B'00011111'         ; 4
        de B'00111111'         ; 5
        de B'01111111'         ; 6
        de B'11111111'         ; 7
        de B'00011000'         ; 8
        de B'00100100'         ; 9
        de B'01000010'         ; 10
        de B'10000001'         ; 11
        de B'01000010'         ; 12
        de B'00100100'         ; 13
        de B'00011000'         ; 14
        de B'00000000'         ; 15

 org 0

;********************************************************
; Das Programm beginnt mit der Initialisierung

Init
        bsf     STATUS, RP0   ; Bank 1
        movlw   Ini_opt       ; pull-up aus
        movwf   OPTION_REG 
        movlw   B'00000000'   ; PortB alle outputs 
        movwf   TRISB
        bcf     STATUS, RP0   ; Bank 0
        clrf    PORTB 
        movlw   Ini_con       ; Interrupt disable
        movwf   INTCON 

        clrf    Adresse       ; Starten mit EEPROM-Zelle 0
mainloop
        movfw   Adresse
        call    EERead        ; EEEPROM Zelle lesen
        movwf   PORTB         ; Muster anzeigen

        incf    Adresse, f    ; Adresse erhöhen
        btfsc   Adresse, 4    ; Adresse = '00010000' = 16 ??
        clrf    Adresse       ; zurück zur Adresse 0

        movlw   D'250'
        movwf   loops
        call    WAIT          ; 1/4 Sekunde warten
        goto    mainloop
 

;***************************************************** 
;Zeitverzögerung um loops * 1 ms
; 10 MHz externer Takt bedeutet 2,5 MHz interner Takt
; also dauert 1 ms genau 2500 Befehle
; 250 Schleifen a 10 Befehle sind 2500 Befehle = 1 ms
;*****************************************************

WAIT
top     movlw   .250           ; timing adjustment variable (1ms)
        movwf   loops2
top2    nop                    ; sit and wait
        nop
        nop
        nop
 nop
        nop
        nop
        decfsz  loops2, F      ; inner loops complete?
        goto    top2           ; no, go again
                               ;
        decfsz  loops, F       ; outer loops complete?
        goto    top            ; no, go again
        retlw   0              ; yes, return from subWAIT
 

;*****************************************************
;+++EEPROM-Routine für 16F628*************************
;*****************************************************
; 16F628 hat 128 EEPROM-Zellen

; lesen der Zelle deren Adresse in W stehtW nach W
EERead
        BSF    STATUS, RP0     ; EEADR liegt in der Bank 1 
        MOVWF  EEADR           ; schreibe die Adresse in EEADR 
        BSF    EECON1, RD      ; EEPROM Leseprozess starten 
        MOVF   EEDATA, W       ; Die Daten der EEPROM Zelle nach W kopieren 
        BCF    STATUS, RP0     ; Bank 0 
        return
 

        end 
 

;**********************************************************


zurück zu Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt : 10.10.2002