Codigo:
////////////////////////////////////// PREPROCESADO ///////////////////////////////////
#include <16F876A.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT
#include "lcd.c"
#ORG 0x1D00,0x1EFF {} // 512 bytes reservados para el buffer
/////////////////////////////// REGISTROS Y GLOBALES ////////////////////////////////
#byte STATUS = 0x03
#byte INDF = 0x100
#byte FSR = 0x104
#byte EEDATA = 0x10C
#byte EEADR = 0x10D
#byte EEDATH = 0x10E
#byte EEADRH = 0x10F
#byte INTCON = 0x18B
#byte EECON1 = 0x18C
#byte EECON2 = 0x18D
#byte ADDRH = 0x70
#byte ADDRL = 0x71
#byte DATADDR = 0x72
/////////////////////////////////////// RUTINAS //////////////////////////////////////
void escribe_buffer(unsigned int dato,dir_H,dir_L)
{
unsigned int contador = 0;
DATADDR = &dato; // Ubicación en memoria del dato de origen
ADDRH = dir_H;
ADDRL = dir_L;
#ASM
BSF STATUS,6 //
BCF STATUS,5 // Banco 2
MOVF ADDRH,W // Byte más significativo de la dirección de destino
MOVWF EEADRH
MOVF ADDRL,W // Byte menos significativo de la dirección de destino
MOVWF EEADR
MOVF DATADDR,W // Dirección inicial de los 4 bytes de origen
MOVWF FSR // Apuntamos a dicha dirección inicial
LOOP: INCF contador,F // Añadido para comprobar si se ejecuta las 4 veces
MOVF INDF,W //
MOVWF EEDATA // Cargamos el dato en el byte menos significativo
MOVLW 0x00
MOVWF EEDATH // Deshechamos (todos a 0) los 6 bits restantes de la WORD
INCF FSR,F // Apuntamos a la siguiente dirección de origen
BSF STATUS,5 // Banco 3
BSF EECON1,7 // Accedemos a la memoria de programa
BSF EECON1,2 // Habilitamos escritura
BCF INTCON,7 // Deshabilitamos interrupciones
MOVLW 0x55 // Secuencia de escritura
MOVWF EECON2 //
MOVLW 0xAA //
MOVWF EECON2 //
BSF EECON1,1 //
NOP //
NOP //
BCF EECON1,2 // Deshabilitamos escritura
BSF INTCON,7 // Habilitamos interrupciones
BCF STATUS,5 // Banco 2
INCF EEADR,F // Incrementamos la dirección de destino...
MOVF EEADR,W
ANDLW 0x03
XORLW 0x03
BTFSC STATUS,2 // ...y comprobamos si ya se escribió todo el bloque...
GOTO LOOP // NO! Aún no se escribieron los 4 datos
#ENDASM
printf(lcd_putc,"cont->%u ",contador);
}
unsigned int lee_buffer(unsigned int dir_H,dir_L)
{
unsigned int numero;
#ASM
BSF STATUS,6 //
BCF STATUS,5 // Banco 2
MOVF dir_H,W
MOVWF EEADRH // Byte más significativo de la dirección de lectura
MOVF dir_L,W
MOVWF EEADR // Byte menos significativo
BSF STATUS,5 // Banco 3
BSF EECON1,7 // Acceso a memoria de programa
BSF EECON1,0 // Lectura
NOP
NOP
BCF STATUS,5 // Banco 2
MOVF EEDATA,W // Tomamos el dato útil del byte menos significativo de la WORD
MOVWF numero // Lo devolvemos
#ENDASM
return(numero);
}
////////////////////////////////////// PRINCIPAL /////////////////////////////////////
void main()
{
unsigned int dato[4],dato2;
dato[0] = 8;
dato[1] = 9;
dato[2] = 10;
dato[3] = 11;
lcd_init();
escribe_buffer(dato[0],0x1D,0x00); // Escribimos dato[0] en la dirección 0x1D00
printf(lcd_putc,"Escr->%u",dato[0]);
lcd_gotoxy(1,2);
dato2 = lee_buffer(0x1D,0x00); // Leemos la dirección 0x1D00
printf(lcd_putc,"Leido -> %u",dato2);
}
Codigo:
////////////////////////////////////// PREPROCESADO ///////////////////////////////////
#include <16F876A.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT
#include "lcd.c"
#ORG 0x1D00,0x1EFF {} // 512 bytes reservados para el buffer
/////////////////////////////// REGISTROS Y GLOBALES ////////////////////////////////
#byte STATUS = 0x03
#byte INDF = 0x100
#byte FSR = 0x104
#byte EEDATA = 0x10C
#byte EEADR = 0x10D
#byte EEDATH = 0x10E
#byte EEADRH = 0x10F
#byte INTCON = 0x18B
#byte EECON1 = 0x18C
#byte EECON2 = 0x18D
#byte ADDRH = 0x79
#byte ADDRL = 0x7A
#byte DATADDR = 0x7B
/////////////////////////////////////// RUTINAS //////////////////////////////////////
void escribe_buffer(char *ptr,unsigned int dir_H,dir_L)
{
DATADDR = ptr;
EEADRH = dir_H;
EEADR = dir_L;
#ASM
INICIO: BSF STATUS,6 ;
BCF STATUS,5 ; Banco 2
MOVF DATADDR,W ; Dirección inicial de los 4 bytes de origen
MOVWF FSR ; Apuntamos a dicha dirección inicial
LOOP: MOVF INDF,W
MOVWF EEDATA ; Cargamos el dato en el byte menos significativo
MOVLW 0x00
MOVWF EEDATH ; Deshechamos (todos a 0) los 6 bits restantes de la WORD
INCF FSR,1 ; Apuntamos a la siguiente dirección de origen
BSF STATUS,5 ; Banco 3
BSF EECON1,7 ; Accedemos a la memoria de programa
BSF EECON1,2 ; Habilitamos escritura
BCF INTCON,7 ; Deshabilitamos interrupciones
MOVLW 0x55 ; Secuencia de escritura
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,1
NOP
NOP
BCF EECON1,2 ; Deshabilitamos escritura
BSF INTCON,7 ; Habilitamos interrupciones
BCF STATUS,5 ; Banco 2
INCF EEADR,1 ; Incrementamos la dirección de destino...
MOVF EEADR,W
ANDLW 0x04
XORLW 0x04
BTFSS STATUS,2 ; ...y comprobamos si ya se escribió todo el bloque...
GOTO LOOP ; NO! Aún no se escribieron los 4 datos
#ENDASM
}
char lee_buffer(unsigned int dir_H,dir_L)
{
EEADRH=dir_H;
EEADR=dir_L;
#ASM
BSF STATUS,6 //
BSF STATUS,5 // Banco 3
BSF EECON1,7 // Acceso a memoria de programa
BSF EECON1,0 // Lectura
NOP
NOP
#ENDASM
return(EEDATA);
}
////////////////////////////////////// PRINCIPAL /////////////////////////////////////
void main()
{
char DATO[4],dat,*ptr;
DATO[0] = "A";
DATO[1] = "B";
DATO[2] = "C";
DATO[3] = "D";
ptr = &DATO[0];
lcd_init();
escribe_buffer(ptr,0x1D,0x00); // Escribimos en la dirección 0x1D00
printf(lcd_putc,"Escrito-> %c%c%c%c",DATO[0],DATO[1],DATO[2],DATO[3]);
lcd_gotoxy(1,2);
dat = lee_buffer(0x1D,0x00); // Leemos la dirección 0x1D00
printf(lcd_putc,"Leido -> %c",dat);
dat = lee_buffer(0x1D,0x01); // Leemos la dirección 0x1D01
printf(lcd_putc,",%c",dat);
dat = lee_buffer(0x1D,0x02); // Leemos la dirección 0x1D02
printf(lcd_putc,",%c",dat);
dat = lee_buffer(0x1D,0x03); // Leemos la dirección 0x1D03
printf(lcd_putc,",%c",dat);
}