Autor Tema: HD con PIC  (Leído 10459 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
HD con PIC
« en: 10 de Enero de 2005, 15:38:00 »
Ya hay resultados chavalotes!!

Despues de trabajar en el firmware las navidades (que porcierto aun esta muy pero que muuuuy verde, no me lo pidais jeje), hoy despues de retomarlo, y comerme la cabeza, mas una inspiracion subita, he logrado escribir 1 sector en el HD, y volver a leerlo...

Luego he hecho la prueba con 32 sectores, y me ha escrito 16Kb en... 0.132segundos (y sin usar sectores multiples), lo que da una tasa de 132 Kb/s. Eso si, no espereis que esa sea la definitiva, porque los datos fueron introducidos enplan  VAR=0x2929  ,   Write (VAR)  .  

El problemilla va a surgir en como se va a comunicar el PIC con el exterior... si le pongo serial 9600 8N1... hara bastante cuello de botella... alguna idea?

salu2

PD: Cuando el firmware este presentable, lo cuelgo.

Desconectado juno303

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 103
RE: HD con PIC
« Respuesta #1 en: 10 de Enero de 2005, 15:59:00 »
hola, que bueno que logres eso ! yo aun no pude grabar nada, no se por que no me anda... Ya pude ejecutar comandos como SPIN UP/DOWN RECALIBRATE... pero los datos nada...  que procedimientos seguis para inicializar el hd ???

Postea tu codigo fuente asi lo vemos !

Estaria bueno meterle pata a esto

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: HD con PIC
« Respuesta #2 en: 10 de Enero de 2005, 16:25:00 »
Hola (bis) MI@ hijos de ####!!!

No entiendo que quieres decir con inicializarlo, que tarea quieres hacer en concreto?

El soft lo pondre enterito cuando pueda. En principio son unas rutinas de CCS pero talvez os interesen ejemplos y ejemplos. Yo por ahora no ando fisicamente (antaño tuve experiencias malas con un HD fisico porque ni iba con el spindown), ando con el control ATA-HDD del proteus 6.5 sp5.
Cuidadin con los tiempos, se muy generoso al principio, y cuando funcione, ve limandolos, porque ami me ha sucedido, que al HD no le de tiempo a cargar los registros, y por ello, mi PIC lea ceros y mas ceros... (18f458 a 40mhz, ahora a 20mhz para ahorrarme algunos problemas)


salu2!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: HD con PIC
« Respuesta #3 en: 11 de Enero de 2005, 03:03:00 »
Enhorabuena, amigo Manex, me alegro que ya empieces a ver resultados.

Con respecto a la comunicación de tu micro con el exterior, si no quieres complicarte mucho la vida, puedes poner RS232 a 115200 bps, que al fin y al cabo, es una tasa de transferencia parecida a la que estás consiguiendo con tu disco duro.

La otra alternativa, mucho más atractiva, es que cambies de micro por un 18F4550 y lo enganches vía USB, ahí ya no tendrás cuellos de botella...Giño

Desconectado juno303

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 103
RE: HD con PIC
« Respuesta #4 en: 12 de Enero de 2005, 10:43:00 »
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;


   }




}








Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: HD con PIC
« Respuesta #5 en: 12 de Enero de 2005, 16:40:00 »
Bien, dos fallos.

En la rutina EscribirRegistro (y supongo que en leerRegistro idem), veo que pones los 16 bits de datos, y luego haces un pulso de escritura de anchura casi-nula.

Mi recomendacion. Yo uso un osci de 20mhz, y uso un 18f458 asi que bastante igualicos estamos). Tal y como lo digo. Ponemos WR a 0, esperamos 10 ciclos, ponemos el dato en los puertos, esperamos 10 ciclos, y luego WR a 1.


Segundo fallo. (De este ya dudo un poco, corrijanme si no ha errado). Usas un tal LBA MODE para escribir datos. Documentate un poco sobre el direccionamiento LBA, yo consegui que mi HD rulara solo con eso (con CHS na de na). Es un numero de 32 bits el cual significa el numero de sector. Este, lo escribiremos en cuatro registros diferentes dado que el direccionamiento es de 8 bits. Haces bien, al poner 11100000 en el reg SDH (LBA MODE, MASTER), pero no haces nada mas.

Pon en google "Ide Hard disk experiments" y entre los primeros links q te aparezcan esta una pagina interesantisima que contiene unos txts muy cañeros sobre el funcionamiento del HD.
Por otra parte, Proteus 6.5 SP5 lleva un ejemplo chulisimo (con ASM y todo) sobre el manejo de un discoduro (se puede simular jeje) con un 18f458, el ejemplo esta muuu currao (monitoriza una señal del ADC y la guarda en el discoduro). Se aprende mucho ahi.

Y un consejo, no sigas construyendo la casa sin antes verificar la consistencia de sus cimientos. Veo que has escrito un huevo de codigo, pero que no te funciona. En mi opinion, es mejor, empezar con codigos simples que funcionen bien, hasta dominar un poco el asunto, e ir subiendo de nivel el programa hasta lograr el resultado que queremos.

salu2!

Desconectado juno303

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 103
RE: HD con PIC
« Respuesta #6 en: 14 de Enero de 2005, 22:38:00 »
jajajaja, "huevo de codigo", jaja, mira, lo que pasa es que mi codigo al principio era pequeño, luego se fue agrandando con las pruebas, y como no me funciono, lo hice bien estructurado, o sea, funciones a troche y moche para ver donde esta el problema... voy a probar eso que me dices, pero creo que ya probe eso de los tiempos...

MIra, lo que te pregunto con respecto a la inicializacion, es que registros hay que configurar para que funcione en LBA y demas cosas ? me refiero a eso, yo creo que le puse bien para que trabaje en modo lba, pero no se como puedo saber cuando el disco ya esta listo, me refiero a eso, yo por las dudas hago un delay de 10 segundos antes de leer y escribir, pero no me funciono nada hasta ahora la lectura/escritura del buffer.

Con respecto al proteus, voy a verlo seria interesante eso, y justamente para grabar los datos  del A/D que quiero usar un HD... jeje,  el archivo al que te refieres no es el de Tillman ? o algo asi ? ya lo lei  jeje, y creo que segui al pie de la letra, pero nada...

bueno, gracias por todo, y vamos a meterle al asunto, seria bueno que cuando este bien depurado esto empezemos a ver el tema del sistema de archivos FAT....

saludos

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: HD con PIC
« Respuesta #7 en: 15 de Enero de 2005, 05:29:00 »
Veamos, para currar con LBA...

El LBA es un numero de 28 bits (que representaremos con variable word) que almacenamos en cuatro registros diferentes. Asi, cogemos los cuatro bits superiores del LBA (recuerda que aunque lo almacenemos en 32 bits, lo util son 28 bits, por lo que estamos hablando de los 4 bits inferiores del cuarto byte)

Codigo:

7          6          5          4          3          2            1             0
1          1          1          0         Bit27   Bit26      Bit25        Bit24


Si vas a usar un discoduro en modo esclavo, el bit 4  pasa a ser 1.

Luego, cogemos el tercer byte del LBA y lo metemos integramente en el registro Cylinder High.El segundo byte del LBA lo metemos en Cylinder Low. Y el primer byte en Sector Number.

Asi, ya has introducido la direccion LBA (que empieza desde 0 segun pruebas que he hecho en proteus). A partir de aqui, a elegir:

ESCRIBIR SECTOR:
Metemos el comando WRITE SECTOR.
Esperamos al flag DRQ (statusreg,3).
Nos pasamos al registro DATA
Escribimos 512 bytes y automaticamente DRQ desaparece y aparece BSY.
Esperamos a que BSY desaparezca y voilá!

LEER SECTOR:
Metemos el comando READ SECTOR
Esperamos al flag DRQ (statusreg,3).
Nos pasamos al registro DATA
Leemos 512 bytes, cuando el buffer se vacie, no se si se pone bsy o no, porsiacaso esperamos a que se quite.


salu2!



Desconectado pendexgabo

  • PIC16
  • ***
  • Mensajes: 222
    • www.SosaGabriel.com.ar
RE: HD con PIC
« Respuesta #8 en: 17 de Enero de 2005, 09:42:00 »
buenas... me interesa el asunto.. donde puedo conseguir algo de info sobre el tema...  ¿que posibilidades hay de hacer pedazos un disco ?? muchas??

jeje


tengo que ver que voy a romper...


saludos

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: HD con PIC
« Respuesta #9 en: 17 de Enero de 2005, 10:34:00 »
Las posibilidades son tantas como tus animos de conectar el HD a la red domestica... fuera bromas, si no respetas los flags, o cortocircuitas algun pin, o no alimentas correctamente el HD (te recomiendo que uses una fuente de pc, o algo que de unos 5W creo), tal vez no haga PAF! pero se quedará inutil...

Empieza simulando con el control ATA-HDD que trae proteus 6.5 sp5, es de lo mejor que hay. Luego si quieres pasar a la acción, consigue un pc viejo y quitale el disco duro. Incluso con un miserable disco de 240MB tienes de sobra para practicar. Pon "Ide hard disk experiments" en google, y hay una pagina que explica muy bien el funcionamiento del disco duro, y tiene interesantes links.

Pero ni se te ocurra usar así "depaso" un discoduro con informacion que te valga, porque lo vas a poner perdido de polvo. Quiero decir, que talvez por descuido te puedes comer la tabla FAT y dejar los archivos inutiles.

Pa" lo que sea, preguntais.

Desconectado pendexgabo

  • PIC16
  • ***
  • Mensajes: 222
    • www.SosaGabriel.com.ar
RE: HD con PIC
« Respuesta #10 en: 17 de Enero de 2005, 22:00:00 »
tengo en proteus.. pero de donde puedo sacar esa version???  6.5 sp5..
con respecto a otro tema.. tendrian la conexion basica del disco con el pic??

saludos!!!!

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: HD con PIC
« Respuesta #11 en: 18 de Enero de 2005, 09:31:00 »
En la mula hay muchos protes 6.5 corriendo, seria cosa de mirar.

La conexion basica? Pon en google "ide hard disk experiments" y en uno de esos primeros links, hay una pagina bien documentada (que he mencionado antes) donde tambien hay un esquematico con un 16f.

salu2

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: HD con PIC
« Respuesta #12 en: 18 de Enero de 2005, 22:57:00 »
Enhorabuena manex... Eres un genio... Sonrisa
ahora, sobre el link que comentas, supongo que será este...
http://hem.passagen.se/communication/ide.html

Gran documento.

Un saludo y animo con el proyecto, que es muy interesante.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: HD con PIC
« Respuesta #13 en: 19 de Enero de 2005, 01:10:00 »
mirad este link:

http://web.media.mit.edu/~ladyada/make/minty/index.html

Es un reproductor MP3, pero que utiliza una tarjeta CF para las canciones, y puesto que su sistema de archivos es FAT16 lo mismo os interesa el tema de control, está el codigo fuente en C para un 18LF252

Salu2! Giño

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: HD con PIC
« Respuesta #14 en: 19 de Enero de 2005, 09:25:00 »
Pozi abago, es esa la pagina... tiene unos links fabulosos.

Cuando tenga tiempo sigo retocando el C que estoy currandome alrededor de todo esto, y lo cuelgo cuando pueda. Son rutinas basicas, aunque añadire ejemplos que me han funcionado en proteus. Pero paciencia, que servidor esta a punto de entrar en examenes y hay que empollar q sino no se aprueba.

salu2