/* 20 10 SH8 13 14 8 */ #define #define #define #define #define PTA0 PTC2 PTB3 PTB2 PTB4 --> LED ----------> ----------> ----------> <---------- CS SK DI DO 1 2 3 4 8 93C66 7 6 5 VCC -> 5V NC ORG -> GND GND -> GND :) CS PTCD_PTCD2 SK PTBD_PTBD3 DO PTBD_PTBD2 DI PTBD_PTBD4 DELY 50 #include <hidef.h> /* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declarations */ void MCU_init ( void ); //inicializa MCU void CLCK_init(void); //inicializa clock interno void PORT_init(void); //inicializa ports /* ----------- prototipos funciones EEPROM -- */ void manda_bit(unsigned char bit); unsigned char trae_bit(void); void ee_wr(unsigned int, unsigned char); void espera_ee(void); void EE_WEN(void); void EE_WDS(void); void EE_WRALL(unsigned char); unsigned char EE_READ(unsigned int); void EE_WRITE(unsigned int, unsigned int); /* ----------- fin prototipos funciones EEPROM -- */ void delay(unsigned int); /* ----------- programa de prueba -- */ void main(void) { unsigned char test[28]; unsigned int i; unsigned int base; /* ------- inicialización MCU -- */ MCU_init(); CLCK_init(); PORT_init(); /* ------- CS y SK a 0V -- */ CS = 0; SK = 0; /* ------- LED apagado -- */ PTAD_PTAD0 = 0; /* ------- habilitación escritura / borrado -- */ EE_WEN(); /* ------- escribe toda la memoria con 0xDC -- */ EE_WRALL(0xDC); /* ------- escribe 26 caracteres ASCII desde A -- */ /* ------- en posición 0x100 y siguientes -- */ base = 0x100; for (i = 0; i < 26; i++) { EE_WRITE(base + i, 'A' + i); } /* ------- lee 26 posiciones desde 0x100 -- */ for (i = 0; i < 26; i++) { test[i] = EE_READ(base + i); } /* ------- deshabilita escritura / borrado -- */ EE_WDS(); /* ------- intenta escribir '*' en 0x40 debería fallar -- */ EE_WRITE(0x40, '*'); /* ------- lee la posición 0x00 debería ser 0xDC -- */ test[26] = EE_READ(0x40); /* ------- lee la posición 0x199 -- */ test[27] = EE_READ(0x199); /* ------- enciende LED para indicar fin -- */ PTAD_PTAD0 = 1; while (1); } /* ----------- fin programa de prueba -- */ /* --------------------------------------------------- retardo --- */ void delay(unsigned int n) { /* 5 + ( 2 + 3 + 3 ) * n = 5 + 8 * n */ asm { LDHX n _seguir: AIX #-1 CPHX #0 BNE _seguir } } void manda_bit(unsigned char bit) { SK = 0; if (bit == 1) DO = 1; else DO = 0; delay(DELY); SK = 1; } unsigned char trae_bit(void) { SK = 0; delay(DELY); SK = 1; delay(DELY); return DI; } void espera_ee(void) { CS = 1; delay(DELY); while ( (DI == 0) ); delay(DELY); CS = 0; } void ee_wr(unsigned int addr, unsigned char i) { while (i > 0) { if ((addr & 0x80) != 0) manda_bit(1); else manda_bit(0); addr = addr << 1; i--; } } void EE_WEN(void) { CS = 1; manda_bit(1); manda_bit(0); manda_bit(0); ee_wr(0xC0, 9); CS = 0; } void EE_WDS(void) { CS = 1; manda_bit(1); manda_bit(0); manda_bit(0); ee_wr(0x00, 9); CS = 0; } void EE_WRALL(unsigned char dato) { CS = 1; manda_bit(1); manda_bit(0); manda_bit(0); ee_wr(0x40, 9); ee_wr(dato, 8); CS = 0; espera_ee(); } void EE_WRITE(unsigned int addr, unsigned int dato) { CS = 1; manda_bit(1); manda_bit(0); manda_bit(1); ee_wr(addr, 9); ee_wr(dato, 8); CS = 0; espera_ee(); } unsigned char EE_READ(unsigned int addr) { unsigned char i, aux, valor; CS = 1; manda_bit(1); manda_bit(1); manda_bit(0); ee_wr(addr, 9); valor = 0; for (i = 8; i > 0; i--) { aux = trae_bit(); valor = valor | (aux << (i - 1)); } CS = 0; return (valor); } /* --------------------------------------------------- inicializa SOPT --- */ void MCU_init(void) { SOPT1 = SOPT1 & 0x3F; //deshabilito COP } /* ---------------------------------------------- configura osc interno --- */ void CLCK_init(void) { asm { LDA $FFAF;-- inicializa osc. interno STA ICSTRM } while (!ICSSC_IREFST) ; } /* --------------------------------------------------- configura ports --- */ void PORT_init(void) { /* -- GPIOs en 0 -- */ PTAD = 0; PTBD = 0; PTCD = 0; /* -- Configuración E-S de GPIO -- */ PTADD = 0b00000001; PTBDD = 0b00001100; PTCDD = 0b00000100; }