TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: manex_1987 en 10 de Enero de 2005, 15:38:00

Título: HD con PIC
Publicado por: manex_1987 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.
Título: RE: HD con PIC
Publicado por: juno303 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
Título: RE: HD con PIC
Publicado por: manex_1987 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!
Título: RE: HD con PIC
Publicado por: Nocturno 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
Título: RE: HD con PIC
Publicado por: juno303 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;


   }




}







Título: RE: HD con PIC
Publicado por: manex_1987 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!
Título: RE: HD con PIC
Publicado por: juno303 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
Título: RE: HD con PIC
Publicado por: manex_1987 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!


Título: RE: HD con PIC
Publicado por: pendexgabo 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
Título: RE: HD con PIC
Publicado por: manex_1987 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.
Título: RE: HD con PIC
Publicado por: pendexgabo 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!!!!
Título: RE: HD con PIC
Publicado por: manex_1987 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
Título: RE: HD con PIC
Publicado por: Abago 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.
Título: RE: HD con PIC
Publicado por: J1M 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
Título: RE: HD con PIC
Publicado por: manex_1987 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
Título: RE: HD con PIC
Publicado por: pendexgabo en 19 de Enero de 2005, 14:21:00
bueno voy a estar esperando esas rutinas...por otro lado mi mula camino y caminó y no encontro nada.... me podrias decir por privado donde "usmear" el proteus (paro aca antes de que esto se ponga ileg....)

otra cosa cual fue la conexion que utilizaron..., la de la primer pag o alguna otra... tengo ganas de utilizar un 16f877 o kisas un 18fXX y por ahi me puedo ahorar la compuerta del medio que tiene el primer esquema.

bueno saludos...
Título: RE: HD con PIC
Publicado por: Gokuden en 19 de Enero de 2005, 19:32:00
manex_1987, quiero preguntarte algo fuera de este tema!! veo que tas usando un pic18f458, y yo me compre uno para comenzar a programar en el, no programo en C y deseo aprender, pero se mucho de asm..

no he podido hacer funcionar ese micro bien! pos lo he programado con unas simples instrucciones e hice un delay de 1 segundos con una rutina propia y tambien con un programa generador de delays en asm y  y apagar y prender un led solo para comprobar que funciona bien! y el delay lo hace de 13 segundos! no se que estaré ahciendo mal pero creo que es las config de registros (fuses) al programar..


me gustaria a ver como le pones la config tu!!.. si sabes asm, a ver si tambien me dices como se le pone la configuracion dentro del mismo programa y no estar poniendosela cada vez qe vayas a programar en el programa de programacion del pic.

porqe tiene como  7 registros de configuracion! y no he podido dar con la cosa. uso un oscilador xt
Título: RE: HD con PIC
Publicado por: Modulay en 20 de Enero de 2005, 03:13:00
Pues ánimo Manex,que aunque se hace larga la época esa no es eterna!!
Y que sepas que ya tienes tu huequito reservado en la carpeta de ejemplos C para tu manejo del HD FumadorFlashFlashFlashFlash
Título: RE: HD con PIC
Publicado por: manex_1987 en 20 de Enero de 2005, 10:20:00
Yo uso el ejemplo del proteus para trastear, hasta que me curre pcb. Para los q no lo veais...

18F458@20mhz
PORTB=D0...7
PORTD=D8...15
PORTC=Lineas de control (A0,A1,A2,/CS0,/CS1,IORDY)
PORTE=/RD,/WR,INTRQ

Sobran portc.6 y portc.7 (aunque se usarán para transmision serial) y el PORTA entero (por lo que tenemos un ADC entero a nuestra disposicion).
El ejemplo de proteus incluye el ASM comentado, que no estaría de mas mirar, para hacerse una idea de todo el embrollo. Porque la aplicación en sí está muy currada, una señal analogica que es recogida y guardada en el HD, con una interface serial muy buena.

salu2

PD: aargh gokuden casi me olvido! Pues en el C lo unico que pongo:
#include <18f458.h>
#fuses HS,NOWDT
#use delay(clock=20000000)
y luego va el codigo...
Título: RE: HD con PIC
Publicado por: manex_1987 en 24 de Enero de 2005, 14:14:00
No, en ASM no tengo ni idea de como se configuran los fuses... pregunta en el almacen de asm, o en el foro general.

salu2
Título: RE: HD con PIC
Publicado por: wqtrp en 24 de Enero de 2005, 15:13:00
hola, la verdad q ya mucho no use MPasm pero ve al help "MPasm assembler help" y alli en index pon la palabra "config",

revisa por el lado de "__config - Set Processor Configuration Bits "

yo usaba algo asi..... para un 452 q imagino es lo mismo ....

    ; setea oscilador de cristal XT_osc
    __CONFIG    _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
;    __CONFIG    _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H

;    __CONFIG    _CONFIG2H, _WDT_OFF_2H   ; sin WDT
    __CONFIG    _CONFIG2H, _WDT_ON_2H

Suerte...
Título: RE: HD con PIC
Publicado por: Gokuden en 28 de Enero de 2005, 17:30:00
la verdad nunca he puesto las configuraciones en la cabecera del programa sino que las pongo en el software para programar, en mi caso el icprog.. pero aun sigo sin poder programar sin problemas ese pic....

comenzando con lo más basico.. prender y apagar un led con un intervalo de 1 segundo dado con una rutina basica de retardo de 1seg y dura 13 segundos.... el problema parece ser de tiempo, como si el tiempo de procesamiento pos instruccion no fuera 1microsegundo sino otro aunque le estoy poniendo el resonador de 4mhz..
Título: RE: HD con PIC
Publicado por: Modulay en 28 de Enero de 2005, 19:17:00
Gokuden eso me suena a problema en la configuracion del oscilador.Si dices que en tu código no configuras ni un solo FUSE seguramente ahí esta el problema.Aunque icprog te permita configurar el tipo de oscilador (XT en tu caso) hay que especificar en el código la velocidad de dicho oscilador,que sería 4 MHz
Título: RE: HD con PIC
Publicado por: Gokuden en 30 de Enero de 2005, 15:30:00
que mal vale! , he programador pic 16f877, 84a, otros inferiores y el 12f675, 89c51/52,8051 y nunca he programado con config en las cabeceras! , configuro los fuses con el icprog. y en ningun lado he especificado la velocidad del micro!. pero con este 18f458 si he tenido problemas!, lo programo bien! y funciona pero al parecer el tiempo por instruccion no es de 1micro segundo como en los otro pics a 4mhz!  y eso es lo que me esta dando problemas, me consegui un ejemplo en ASM de un programa con el 458 y tenia config en la cabecera pero no especifican el tipo de oscilador ni velocidad! lo programé asi y da el mismo problema y ya no se que hacer
Título: RE: HD con PIC
Publicado por: MGLSOFT en 31 de Enero de 2005, 06:13:00
Ojo al piojo !!!
La nueva serie de micros tiene mas opciones de configuracion de reloj, entre ellos incluye un PLL programable, que permite tener un reloj determinado externo y usar otra frecuencia interna !!!Sonrisa GiganteSonrisa Gigante
Título: RE: HD con PIC
Publicado por: manex_1987 en 31 de Enero de 2005, 08:09:00
Claro... el 16F88 (que tabarra doy con este pic) tiene un registro donde puedes elegir la frecuencia interna, desde 8mhz hasta 32khz... y poder cambiarla mientras esta en funcionamiento.

salu2
Título: RE: HD con PIC
Publicado por: juno303 en 01 de Febrero de 2005, 19:07:00
lo tuyo es muy simple....    el 452 tiene un timer de 16bits por  eso te da 14 segundos en vez de un segundo....  a mi ya me paso eso... y la forma de configurar los fuses en el ASM es asi:
y los distintos fuses lo podes encontrar en la cabecer 18f452.inc

   __CONFIG _CONFIG1H, _OSCS_ON_1H & _XT_OSC_1H
   __CONFIG _CONFIG2L, _BOR_OFF_2L & _PWRT_ON_2L
   __CONFIG _CONFIG2H, _WDT_OFF_2H
   __CONFIG _CONFIG3H, _CCP2MX_OFF_3H
   __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
   __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L
   __CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_ON_5H
   __CONFIG _CONFIG6L, _WRT0_ON_6L & _WRT1_ON_6L & _WRT2_ON_6L & _WRT3_ON_6L
   __CONFIG _CONFIG6H, _WRTC_ON_6H & _WRTB_ON_6H & _WRTD_ON_6H
   __CONFIG _CONFIG7L, _EBTR0_ON_7L & _EBTR1_ON_7L & _EBTR2_ON_7L & _EBTR3_ON_7L
   __CONFIG _CONFIG7H, _EBTRB_ON_7H


esto uso yo para 4mhz y sin proteccion de codigo...

en Asm no necsitas ponerle la velocidad del pic, eso lo haces vos calculando tooodooo, por eso el C es mas comodo... aunque podes definir una constante de tiempo modificable...
Título: RE: HD con PIC
Publicado por: Gokuden en 02 de Febrero de 2005, 07:15:00
gracias juno! eas config las puedo pner tal cual como estàn en la cabecera de mi pic? no sabia eso del pll ni que el timer de 16bit cambiaba la velocidad interna.. lo que me di cuenta es que al parecer mi programador no configuraba los fuses. uso el icprog y un programador jdm. y cuando programo y leo el pic. me da otros valores de fuses al que le programé. sino me sirve como tu me dijistes, voy a probar con el programador de la universidad a ver..