/* 20 PTA0 --> LED 10 PTC2 ----------> CS 1 8 VCC

Anuncio
/*
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;
}
Descargar