Bueno, este es mi codigo, esta muy feo, pero a ver si lo entiendes....
El tema es que no puedo leer ni escribir en el buffer, cuando leo, leo basura, no sale lo que debe... no se que estaré haciedno mal, ya le puse tiempos altisimos, y lo mismo, si puedes enviame tu codigo, no importa que no este terminado, para ver que estoy haciendo mal...
aqui va el mio:
#include <18F452.h>
#include <18f452puertos.h>
#include "etiquetas.h"
#fuses XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT, nolvp
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)
#use fast_io (A)
#use fast_io (B)
#use fast_io (D)
#define CMD_COMMAND 0b10111
#define CMD_STATUS 0b10111
#define CMD_DATA 0b10000
#define CMD_SECTORCOUNT 0b10010
#define CMD_SECTORNUMBER 0b10011
#define CMD_CYLO 0b10100
#define CMD_CYHI 0b10101
#define CMD_HEAD 0b10110
//#org 0x1F00,0x1FFF {}
char buffer[512];
void PortSetUp();
void SpinDown();
void SpinUp();
void Recalibrar();
unsigned int16 LeerRegistro(unsigned char registro);
void PutHiZ();
void EscribirRegistro(unsigned char registro, unsigned char lobyte, unsigned char hibyte);
void InitHD();
void EjecutarComando(unsigned char cmdlo, unsigned char cmdhi);
void SetControlLines(unsigned char registro);
void LeerMBR();
// Funcion Principal
void main(void)
{
int8 a,b;
int i;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL); // Habilita todas las interrupciones.
printf("IDE 1.0
");
InitHD();
printf("Calibrando...
");
delay_ms(500);
ReCalibrar();
printf("Calibrado
");
while(1);
}
void PortSetUp()
{
set_tris_b(0xff);
set_tris_d(0xff);
set_tris_a(0x00);
set_tris_c(0b10000000); //RC7 RX IN, RC0= CS LCD
setup_adc_ports(NO_ANALOGS);
output_bit(RST,0);
output_b(0x00);
output_d(0x00);
output_bit(RD,1);
output_bit(WR,1);
output_bit(RST,1);
SetControlLines(0); // desclavo todas las señales
}
void InitHD()
{
PortSetUp();
EscribirRegistro(CMD_COMMAND,0b10100000,0); // initialize drive code
}
//E0h = Spins down the drive
//E1h = Spins up the drive
void SpinDown()
{
char puerto;
set_tris_b(0x00);
EscribirRegistro(CMD_COMMAND,0xE0,0);
SetControlLines(0); // desclavo todas las señales
set_tris_b(0xff);
}
void SpinUp()
{
set_tris_b(0x00);
SetControlLines(CMD_COMMAND); // CONTROL comando
EscribirRegistro(CMD_COMMAND,0xE1,0);
SetControlLines(0); // desclavo todas las señales
set_tris_b(0xff);
}
void Recalibrar()
{
set_tris_b(0x00);
output_bit(CS0,0);
output_bit(CS1,1);
output_bit(A0,1);
output_bit(A1,1);
output_bit(A2,1);
SetControlLines(CMD_COMMAND); // CONTROL comando
output_b(0x10); // Instruccion RECALIBRAR
output_bit(WR,0);
output_bit(WR,1);
SetControlLines(0); // desclavo todas las señales
set_tris_b(0x00);
}
unsigned int16 LeerRegistro(unsigned char registro)
{
unsigned char hibyte, lobyte;
unsigned int16 palabra;
set_tris_b(0xff); // puerto b entrada, voy a leer
set_tris_d(0xff);
SetControlLines(registro);
output_bit(RD,0); // strobe en LEER
output_bit(RD,1); // finalizo strobe de lectura
lobyte=PORTB; // retengo data leida
hibyte=PORTD; // retengo data leida
SetControlLines(0); // desclavo todas las señales
palabra=0;
palabra=hibyte;
palabra<<=8;
palabra= palabra | lobyte;
return palabra;
}
void EscribirRegistro(unsigned char registro, unsigned char lobyte, unsigned char hibyte)
{
SetControlLines(registro);
set_tris_b(0x00);
set_tris_d(0x00);
PORTB=lobyte;
PORTD=hibyte;
output_bit(WR,0);
output_bit(WR,1);
SetControlLines(0); // desclavo todas las señales
}
void EjecutarComando(unsigned char cmdlo, unsigned char cmdhi)
{
EscribirRegistro(CMD_COMMAND,cmdlo, cmdhi); // ejecuto comando con los parametros
}
void SetControlLines(unsigned char registro)
{
if( 0b00001 & registro)output_bit(A0,1);
else output_bit(A0,0);
if( 0b00010 & registro)output_bit(A1,1);
else output_bit(A1,0);
if( 0b00100 & registro)output_bit(A2,1);
else output_bit(A2,0);
// INVERTIDOS
if( 0b01000 & registro)output_bit(CS1,0);
else output_bit(CS1,1);
if( 0b10000 & registro)output_bit(CS0,0);
else output_bit(CS0,1);
}
void GetInfo()
{
int16 i;
unsigned char sectornumber;
unsigned int16 prebuffer;
unsigned int16 indexbuffer;
EjecutarComando(0xEC,0); // comando 0xEC=Identify Drive
delay_ms(10); // espero por si las moscas
sectornumber=1;
indexbuffer=0;
printf("empiezo lectura de buffer hd
");
for(i=0; i<256; i++)
{
EscribirRegistro(CMD_SECTORNUMBER,sectornumber,0); // direcciono puntero de buffer
delay_us(10); // delay por si las moscas
prebuffer=LeerRegistro(CMD_DATA); // leo registro data
buffer[indexbuffer]=(prebuffer & 0xff00)>>8;
indexbuffer++;
buffer[indexbuffer]=prebuffer & 0x00ff;
indexbuffer++;
sectornumber++;
}
printf("finalizo lectura de buffer hd
");
printf("Volcado de buffer GETINFO, 512 bytes:
");
for(i=1; i<513; i++)
{
// putc(buffer); // envio char por serial
printf("%x",buffer[i-1]);
if( !( i%2) ) printf(" "); // cada 32 caracteres hago un enter
if( !( i%8) ) printf(" "); // cada 32 caracteres hago un enter
if( !( i%32) ) printf("
"); // cada 32 caracteres hago un enter
}
printf("
Fin volcado de buffer GETINFO
");
printf("Volcado ascii GETINFO, 512 bytes:
");
for(i=1; i<513; i++)
{
// putc(buffer); // envio char por serial
printf("%c ",buffer[i-1]);
}
printf("
Fin volcado ascii GETINFO
");
}
void LeerMBR()
{
int16 i;
unsigned char sectornumber;
unsigned int16 prebuffer;
unsigned int16 indexbuffer;
EscribirRegistro(CMD_DATA,0x3d,0x7f); // Voy a leer de a 1 sector ( no multiread )
delay_ms(10); // delay por si las moscas
prebuffer=LeerRegistro(CMD_DATA); // leo registro data
printf("prebuffer:%lu
",prebuffer);
buffer[0]=prebuffer & 0x00ff;
indexbuffer++;
buffer[1]=(prebuffer & 0xff00)>>8;
printf("Escribi registro 3d7f ahora leo:%x%x
",buffer[0],buffer[1]);
EscribirRegistro(CMD_SECTORNUMBER,1,0); // Voy a leer de a 1 sector ( no multiread )
EscribirRegistro(CMD_CYLO,0,0); // ME POSICIONO EN EL SECTOR 0 LBA MODE
EscribirRegistro(CMD_CYHI,0,0);
EscribirRegistro(CMD_HEAD,0b11100000,0); // LBA MODE y SELECCIONO DRIVE MASTER
EjecutarComando(0x20,0); // Leo sector
delay_ms(100); // espero por si las moscas
sectornumber=1;
indexbuffer=0;
printf("empiezo lectura de buffer hd
");
for(i=0; i<256; i++)
{
EscribirRegistro(CMD_SECTORCOUNT,sectornumber,0); // direcciono puntero de buffer
delay_us(10); // delay por si las moscas
prebuffer=LeerRegistro(CMD_DATA); // leo registro data
buffer[indexbuffer]=(prebuffer & 0xff00)>>8;
indexbuffer++;
buffer[indexbuffer]=prebuffer & 0x00ff;
indexbuffer++;
sectornumber++;
}
printf("finalizo lectura de buffer hd
");
printf("Volcado de buffer sector 0, 512 bytes:
");
for(i=1; i<513; i++)
{
printf("%x ",buffer[i-1]);
if( !( i%8) ) printf(" "); // cada 32 caracteres hago un enter
if( !( i%16) ) printf("
"); // cada 32 caracteres hago un enter
}
printf("
Fin volcado de buffer mbr
");
printf("Volcado ascii mbr, 512 bytes:
");
for(i=1; i<513; i++)
{
printf("%c ",buffer[i-1]);
}
printf("
Fin volcado ascii mbr
");
}
#INT_RDA
void rsis(void)
{
unsigned char get;
char string[20];
unsigned int16 prebuffer;
get=getc();
printf("Caracter recibido: %c Procesamos...
", get);
switch(get)
{
case "1":
SpinUp();
printf("Spin up...
");
break;
case "2":
SpinDown();
printf("Spin down...
");
break;
case "3":
Recalibrar();
printf("Recalibrando...
");
break;
case "4":
EjecutarComando(0xE0,0); // comando spindown
printf("spindown 2...
");
break;
case "a":
LeerRegistro(0b10000);
break;
case "b":
LeerRegistro(0b10001);
break;
case "c":
LeerRegistro(0b10010);
break;
case "d":
LeerRegistro(0b10011);
break;
case "e":
LeerRegistro(0b10100);
break;
case "f":
LeerRegistro(0b10101);
break;
case "g":
LeerRegistro(0b10110);
break;
case "h":
LeerRegistro(0b10111);
break;
case "z":
LeerMBR(); //GetInfo();
break;
case "x":
GetInfo(); //GetInfo();
break;
case "j":
EscribirRegistro(CMD_DATA,0x00,0x37); // Voy a leer de a 1 sector ( no multiread )
delay_ms(10); // delay por si las moscas
prebuffer=LeerRegistro(CMD_DATA); // leo registro data
break;
case "p":
set_tris_b(0xff);
set_tris_d(0xff);
printf("portb: %x
",PORTB);
printf("portd: %x
",PORTD);
break;
}
}