TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Slalen en 12 de Septiembre de 2007, 07:38:51

Título: MMC en CCS
Publicado por: Slalen en 12 de Septiembre de 2007, 07:38:51
Hola!!!

Estoy probando las tarjetas MMC con los PICs y, para ello, me he basado en el post de RedPic MMC Card: Hardware & Firmware (http://www.todopic.com.ar/foros/index.php?topic=15553.0).
El problema es que no se que tengo mal, si la placa o el programa.

En lo relativo a la placa he medido y da valores correctos en los distintos terminales.

¿¿¿¿Me podéis decir si veis algo mal en el código????
Código: [Seleccionar]
#include <18f4550.h>

#Fuses HS,NOWDT,NOPUT,NODEBUG,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NOPUT,PLL1
#Fuses NOSTVREN,NODEBUG,NOWRTD,NOIESO,NOFCMEN,NOPBADEN,,NOWRTC,NOWRTB,NOEBTR
#Fuses NOEBTRB,NOCPB,NOMCLR,NOLPT1OSC,NOXINST,NOUSBDIV,NOVREGEN,NOICPRT,CCP2C1

#use delay(clock=4000000)

#byte   portb=0xf81
#byte   portd=0xf83

 int32 direccion=0;
 int8  datos[512];
 int   contador=0;
 int8  valores[10];
 int16 i=0;
 int16 size=512;

#define MMC_CS PIN_D4
#define MMC_CLK PIN_D6
#define MMC_DI PIN_D5
#define MMC_DO PIN_D7

#include <mmc_spi.c>


void main()
{
   set_tris_a(0x00);
   set_tris_b(0x00);
   set_tris_c(0x00);
   set_tris_e(0x00);


   disable_interrupts(global);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi2(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(VREF_LOW|-2);
   setup_low_volt_detect(FALSE);
   setup_oscillator(False);
   port_b_pullups(false);

   do{
      portd=mmc_init();
      delay_ms(500);
   }while(mmc_init()!=0);

   do{
 
           for (i=0;i<=511;i++)
         {
            datos[i]=0;
         }

         if (mmc_read_block(direccion,size,&datos[0])==0)
         {
            portb=0x33;
            delay_ms(500);
            for (contador=0; contador<=511; contador++)
               if (datos[contador]=='G')
            {
               portb=0x3F;
               delay_ms(500);
               contador=contador+1;
               if (datos[contador]=='H')
               {
                  portb=0x0F;
                  delay_ms(500);
                  contador=contador+1;
                  if (datos[contador]=='G')
                  {
                     portb=0x03;
                     delay_ms(500);
                     contador=contador+1;
                     if (datos[contador]=='p')
                     {
                        portb=0x00;
                        delay_ms(500);
                        contador=contador+1;
                        if (datos[contador]=='r')
                        {
                           portb=0xFF;
                           delay_ms(500);
                           contador=contador+1;
                           for(i=0;i<=10;++i)
                           {
                              valores[i]=datos[contador];
                              contador=contador+1;
                           }
                        }
                     }
                  }
              }
            }
         }
         direccion+=512;
   }while(mmc_read_block(direccion,size,&datos[0])!=0);
  for(i=0;i<=10;++i)
  {
     portb=valores[i];
     delay_ms(1000);
  }
}

Mi idea es tener un archivo txt con datos en la MMC que comiencen con "GHGpr" y cada dato lo saque el micro por el puerto b.

El problema es que no me inicia la MMC y no se si esta bien el resto.


Gracias!!
Título: Re: MMC en CCS
Publicado por: maunix en 12 de Septiembre de 2007, 08:40:18
Más allá de que no conozco el código y de que otro que lo haya implementado te pueda dar un mejor vistazo, te puedo ayudar a plantear tu problema, ya que no aclaras qué tipo de problema tienes.

Hablas de medir tensiones y demás, para comenzar ¿el pic anda o no anda? digo, como para ir descartando cosas y luego enfocarse en tu problema particular.
Título: Re: MMC en CCS
Publicado por: c4_esp_VR en 12 de Septiembre de 2007, 09:22:40
Me gustaría mucho poder ayudarte ya que me quiero meter con ese tema...pero tendrás que esperar una semana para que me ponga con ello, de todas maneras intentaré ayudarte en todo lo que pueda.

En principio yo me aseguraría si la inicialización de la mmc es correcta, como...

Código: [Seleccionar]
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// mmc_init()     Initializes the unit.
//
// Paramaters:    <none>
//
// Returns:       0 if initiated correctly
//                Non-zero if initiation failed
//
// Special Info:  This should be called immediately to initialize
//                the multi media card.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Pon sólo el código de inicialización y iguala una salida del PIC a la función mmc_init() de esta forma:

Código: [Seleccionar]
#include <18f4550.h>
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVRE
#use delay(clock=4000000)

#define LED PIN_C0

#define MMC_CS PIN_D4
#define MMC_CLK PIN_D6
#define MMC_DI PIN_D5
#define MMC_DO PIN_D7

#include "mmc_spi.c"

void main() {
    while (TRUE)
   {
        if(mmc_init()==0)
        LED PIN = 1;
        else
        LED PIN = 0;
    }
}

Empieza poco a poco no quieras llegar y que todo funcione, esta es mi recomendación ya me diras si esto te funciona, ya que si tienes todo bien conectado con sólo este código se debería de iniciar tu MMC o SD card por spi.

Veo que tienes un cristal de sólo 4Mhz no sé si eso es suficiente para el funcionamiento de la MMC...ahí ando pez...
Título: Re: MMC en CCS
Publicado por: PalitroqueZ en 12 de Septiembre de 2007, 15:34:04
uff Slalen leyendote, sueño cuando será el dia en que pueda hacer mis primeros ensayos con la tarjeta  :?

te cuento a manera de especulación que en el proteus no logro iniciar la mmc con ese driver, la función mmc_init() me devuelve un valor distinto de cero, entonces me doy cuenta que el pic hace muchos reintentos y no logra comunicarse.

Título: Re: MMC en CCS
Publicado por: c4_esp_VR en 12 de Septiembre de 2007, 16:42:57
¿¿¿Has probado el código que he puesto yo PalitroqueZ???..¿¿¿.estas seguro que el Proteus puede simular una MMC???...tampoco me fiaría mucho del proteus ya que muchas cosas que funcionan con el proteus luego no funciona en el PIC ya que he visto muchos post por aqui pidiendo ayuda sobre dicho tema  :shock: :shock: :shock: :shock:
Título: Re: MMC en CCS
Publicado por: PalitroqueZ en 12 de Septiembre de 2007, 16:55:46
¿¿¿Has probado el código que he puesto yo PalitroqueZ???..¿¿¿.estas seguro que el Proteus puede simular una MMC???...tampoco me fiaría mucho del proteus ya que muchas cosas que funcionan con el proteus luego no funciona en el PIC ya que he visto muchos post por aqui pidiendo ayuda sobre dicho tema  :shock: :shock: :shock: :shock:

sip, he realizado unos ensayos, pero me extraña porque he probado con otros programas y funcionan muy bien, incluso hay uno por ahí que usa la FAT (no me acuerdo si es tuyo) y trabaja mas que bien, te aparece los caracteres en el virtual terminal y puedes guardar información por bloques de 512 bytes. en estos programas si se inicia la mmc. por eso es la confución que tengo con el mmc_spi.c
Título: Re: MMC en CCS
Publicado por: c4_esp_VR en 12 de Septiembre de 2007, 17:32:45
Desgraciadamente PalitroqueZ yo no he realizado el programa de la FAT que comentas, el único programa que he visto de este tipo es el que tiene hecho red pic que por falta de tiempo no he podido probar...vamos a esperar que nos dice Slalen sobre la funcionalidad del programa que he hecho o si ha conseguido ya algún avance sobre el tema.
Título: Re: MMC en CCS
Publicado por: LABmouse en 12 de Septiembre de 2007, 20:56:10
Hola, yo tambien quiero decir que estoy trabajando con la SD Card con este (http://www.todopic.com.ar/foros/index.php?topic=18383.msg130038#msg130038) entrenador, y el driver de CCS para SD Card, a mi tampoco me corre.  Intente de varias forma y nada, Recopile varios drivers y nada, siempre regresa otra cosa, antes de inicializarla, es por eso que creo que lo mejor sera crear el propio driver.  Ahorita ando agarrado del tiempo, pero este Domingo me metere a programarlo. Estoy mirando una información sobre SD Card.. ES Bastante complejo eso.
Título: Re: MMC en CCS
Publicado por: J1M en 12 de Septiembre de 2007, 22:01:02
Hola, quizá los hayais visto ya, pero por si acaso aquí os dejo el código en CCS para MMC/SD FAT32 y FAT16 que hay en los foros de CCS:

MMC FAT32
http://www.ccsinfo.com/forum/viewtopic.php?t=31532

MMC FAT16
http://www.ccsinfo.com/forum/viewtopic.php?t=21721


Suerte!!



Teclado no encontrado - Piense F1 para continuar
Título: Re: MMC en CCS
Publicado por: c4_esp_VR en 13 de Septiembre de 2007, 04:59:30
Me imaginaba que al tener CCS una libreria sobre MMC/SD sería muy fácil manejarlo...pero veo que me estoy engañando a mi mismo porque menudos cachos de código pone la gente en el foro de CCS...y si a eso le unimos que a PICmouse no le ha funcionado teniendo una placa entrenadora...bueno pues avisarme cuando os pongais en serio con ello, ya que en mi caso primero tengo que hacerme la placa y luego programar pero quiero ayudar en todo lo posible ya que me parece un buen proyecto.

Un saludete a todos.
Título: Re: MMC en CCS
Publicado por: c4_esp_VR en 13 de Septiembre de 2007, 06:21:04
Bueno a ver si alguien puede simular o probar este código:

Código: [Seleccionar]

#include<18F4550>
#use delay (clock=20000000)
#use rs232(baud=19200, xmit=pin_c6, rcv=pin_c7)
#fuses HS, NOLVP, NOWDT, PUT, BROWNOUT

#define MMC_CS    PIN_D0
#define MMC_CLK   PIN_D1
#define MMC_DI    PIN_D2
#define MMC_DO    PIN_D3

#include <mmc_spi.c>

main()
{
printf("\n\rTeste MMC drivers\n\r");

if(mmc_init()==0)
   printf("\n\rmmc init ok\n\r");
else
   printf("\n\rmmc init fault\n\r");
}

Creo que este código debería de funcionar correctamente o por lo menos eso creo...
Título: Re: MMC en CCS
Publicado por: Slalen en 14 de Septiembre de 2007, 12:25:33
Hola de nuevo!!!
Más allá de que no conozco el código y de que otro que lo haya implementado te pueda dar un mejor vistazo, te puedo ayudar a plantear tu problema, ya que no aclaras qué tipo de problema tienes.

Hablas de medir tensiones y demás, para comenzar ¿el pic anda o no anda? digo, como para ir descartando cosas y luego enfocarse en tu problema particular.

El problema es que al iniciar la mmc me da un uno en vez de cero, según la descripción tiene que dar cero.

En el código de RedPic sólo la inicia con mmc_init() y comprueba que valga cero.

Si según PalitroqueZ, no funciona en Proteus es que tiene que haber algo mal en el código (a parte del circuito)

Lo que comentáis del tipo de formato, se supone que no importa ya que el micro reconoce todos los caracteres y datos en hexadecimal (como al abrir la tarjeta con el winhex).

Esto me tiene loco!!!!

PD: he traducido el funcionamiento de las funciones de la librería mmc_spi. El archivo está en mi web en la sección de PICs
Título: Re: MMC en CCS
Publicado por: PalitroqueZ en 15 de Septiembre de 2007, 15:43:19
aquí hay dos adjuntos.

452 mmc - Isis 6.9.rar (http://rapidshare.com/files/55960287/452_mmc_Isis_6.9.rar.html)
el primero funciona bien en el proteus, se supone que ocurre la inicialización, pués hace lo demás (lectura, escritura) y no usa el driver del ccs. no le  conozco su autoría.

mmc_spi_probando.rar (http://rapidshare.com/files/55960536/mmc_spi_probando.rar.html)
el segundo es un ejemplo que monté parecido al prgrama de c4_esp_VR, y nada, no funciona

Título: Re: MMC en CCS
Publicado por: Slalen en 16 de Septiembre de 2007, 12:30:44
Hola de nuevo!!!

Veo que tienes un cristal de sólo 4Mhz no sé si eso es suficiente para el funcionamiento de la MMC...ahí ando pez...

No es cosa del cristal ya que (mirando el código de la librería) he visto que los retardos son de ms.

PalitroqueZ, la librería que funciona ya la había visto, es una librería para MMCs con formato FAT16.

RedPic ensu web y en el post que comenté anteriormente lo logró con la librería de CCS

Un saludo
Título: Re: MMC en CCS
Publicado por: Slalen en 26 de Septiembre de 2007, 08:34:24
Hola de nuevo!!!

Sigo empeñado en hacer funcionar las MMC!!! Pero se queda en el empeño :mrgreen:
He estado leyendo el foro de ccs y como dice PalitroqueZ:


te cuento a manera de especulación que en el proteus no logro iniciar la mmc con ese driver, la función mmc_init() me devuelve un valor distinto de cero, entonces me doy cuenta que el pic hace muchos reintentos y no logra comunicarse.

Parece que nadie ha conseguido hacer funcionar esta librería con el ISIS, debe ser algún fallo del simulador

Los avances son mínimos, pero....
Título: Re: MMC en CCS
Publicado por: jhonastad en 27 de Noviembre de 2007, 17:33:59
Hola slalen, estoy tratando de escribir y leer una sd, pero no he encontrado informacion sobre los comandos que hay que mandarle al mmc, si tu pudieras enviarme estos comandos, o facilitarme el driver te lo agradeceria
Título: Re: MMC en CCS
Publicado por: jhonastad en 27 de Noviembre de 2007, 17:51:28
OK!! SORRY INSTALE UNA VERSION MAS NUEVA DE CCS Y  BENIA CON EL DRIVER, DISCULPEN EL LAPSUS
Título: MMC en CCS
Publicado por: bily en 06 de Diciembre de 2007, 14:36:35
hola a todos estoy trabajando con la memoria mmc y el pic 18f452. tengo el programa de prueba de CCS compiler pero el problema mmc no arranca nada  y en el programa de fat de CCs compiler en los ejemplos tampoco y tengo problema de llevar del pic del demo a mi pic 18f452 espero que me ayuden... saludos a todos
Título: Re: MMC en CCS
Publicado por: PalitroqueZ en 16 de Abril de 2008, 14:35:28
uff Slalen leyendote, sueño cuando será el dia en que pueda hacer mis primeros ensayos con la tarjeta  :?

....

bueno, finalmente ese dia llegó, y lo lógico es primero hacer las simulaciones.

les comento que la MMC del ISIS funciona, no quise usar los programas que trae el ccs (siempre he desconfiado de las funciones spi built-in)

así que me puse a leer un rato documentaciones de varias fuentes y armé los codigos correspondientes a escribir/leer un byte, iniciar la tarjeta, leer la CID y la CSD (que si se puede leer según la MMCA)

esto es un primer intento, el código todavía le falta, pero la idea es que vean que es mejor entender y escribir el programa uno mismo, a fin de evitar sorpresitas  :D

Código: C
  1. #byte SSPCON1 = 0xFC6
  2. #byte SSPSTAT = 0xFC7
  3. #byte SSPBUF= 0xFC9
  4. #byte PIR1=0xF9E
  5.  
  6. int const cmd[]={0x40,0x41,0xff,0x4A,0x49,0x51,0x58,0x50};
  7. int const lTimeout=0x2fff;
  8.  
  9. #inline
  10. int Leer_1Byte_SPI(){
  11.    SSPBUF=0xff;  // envia puros unos en dataout
  12.    while(!bit_test(PIR1,3)){};
  13.    // mientras SSPIF=0 la transmisión contínua
  14.    // si SSPIF=1, terminó la transmisión. SSPIF-> PIR1,3
  15.    bit_clear(PIR1,3); // borro el flag SSPIF
  16.    return(SSPBUF);
  17. }
  18. //--------------------------------------------------------------
  19. #inline
  20. int Escribir_1Byte_SPI(int dato){
  21.    SSPBUF=dato;
  22.    if(SSPCON1 & 0x80){
  23.       return(0xff);
  24.    }
  25.    else{
  26.       while(!bit_test(PIR1,3)){};
  27.       // mientras SSPIF=0 la transmisión contínua
  28.       // si SSPIF=1, terminó la transmisión. SSPIF-> PIR1,3
  29.       bit_clear(PIR1,3); // borro el flag SSPIF
  30.    }
  31.    return(0);
  32. }
  33. //--------------------------------------------------------------
  34. #inline
  35. int Comando_MMC(int _cmd){
  36.    int iRespuesta=cmd[2];//0xff;
  37.    long lTiempo_fuera=0;
  38.  
  39.    output_low(MMC_CS);
  40.    Leer_1Byte_SPI();
  41.  
  42.    Escribir_1Byte_SPI(cmd[_cmd]);
  43.    Escribir_1Byte_SPI(0);
  44.    Escribir_1Byte_SPI(0);
  45.    Escribir_1Byte_SPI(0);  
  46.    Escribir_1Byte_SPI(0);
  47.    Escribir_1Byte_SPI(0x95);
  48.    
  49.    
  50.    while(iRespuesta==cmd[2]){//0xff){
  51.       iRespuesta=Leer_1Byte_SPI();
  52.       if(lTiempo_fuera++>500){ break;}
  53.    }
  54.    return(iRespuesta);
  55. }
  56. //------------------------------------------------------------------------
  57.  
  58. #inline
  59. int Iniciar_MMC(){
  60.    int t;
  61.    long lTiempo_fuera=0;
  62.  
  63.    SSPCON1=0b00110010;
  64.    // activa spi por hardware, maestro en Fosc/64, reloj idle en alto (CKP=1)
  65.    SSPSTAT=0;
  66.    //transmisión ocurre en flanco bajada (CKE=0)
  67.  
  68.    output_high(MMC_CS);
  69.    delay_us(100); // una especie de power-up timer para la MMC
  70.    
  71.    for(t=0;t<12;t++){
  72.       Leer_1Byte_SPI();
  73.    }
  74.    
  75.    while(Comando_MMC(0)!=1){
  76.      delay_us(100);
  77.      if(lTiempo_fuera++>lTimeout){ return(1);}
  78.    }
  79.    
  80.    lTiempo_fuera=0;
  81.    while(Comando_MMC(1)!=0){
  82.      delay_us(100);
  83.      if(lTiempo_fuera++>lTimeout){ return(2);}
  84.    }
  85.    
  86.    SSPCON1=0b00110010;
  87.    // activa spi por hardware, maestro en Fosc/4, reloj idle en alto (CKP=1)  
  88.    SSPSTAT = 0;
  89.    //transmisión ocurre en flanco bajada (CKE=0
  90.  
  91.    output_high(MMC_CS);
  92.    return 0;
  93. }
  94. //------------------------------------------------------------
  95. #inline
  96. int Leer_CID(char *sCID){
  97.    int t;
  98.    long lTiempo_fuera=0;
  99.    
  100.    output_low(MMC_CS);
  101.    while(Comando_MMC(3)!=0){
  102.       delay_us(100);
  103.       if(lTiempo_fuera++>lTimeout){
  104.          output_high(MMC_CS);
  105.          return(2);
  106.       }
  107.    }
  108.    while(Leer_1Byte_SPI()!=0xFE){};
  109.    
  110.    for(t=0;t<18;t++){
  111.       sCID[t]=Leer_1Byte_SPI();
  112.    }
  113.    
  114.    output_high(MMC_CS);
  115.    Leer_1Byte_SPI();
  116.    return 0;
  117. }
  118.  
  119. //----------------------------------------------------------------
  120. #inline
  121. int Leer_CSD(char *sCSD){
  122.    int t;
  123.    long lTiempo_fuera=0;
  124.    
  125.    output_low(MMC_CS);
  126.    while(Comando_MMC(4)!=0){
  127.       delay_us(100);
  128.       if(lTiempo_fuera++>lTimeout){
  129.          output_high(MMC_CS);
  130.          return(2);
  131.       }
  132.    }
  133.    while(Leer_1Byte_SPI()!=0xFE){};
  134.    
  135.    for(t=0;t<18;t++){
  136.       sCSD[t]=Leer_1Byte_SPI();
  137.    }
  138.    
  139.    output_high(MMC_CS);
  140.    Leer_1Byte_SPI();
  141.    return 0;
  142. }

como verán el programa está personalizado, no voy a entrar en detalle si es mejor el asm o el c, pero ahora pienso que con estas limitaciones que tienen los pics, lo mejor es pensar en ambos lenguajes (adios portabilidad, bienvenido la velocidad y las optimizaciones)

hay un hilo bastante instructivo en el forum ccs, donde discuten como optimizar el acceso a una sd, y dan unas ideas muy interesantes.

Título: Re: MMC en CCS
Publicado por: Slalen en 16 de Abril de 2008, 15:21:37
Pffffffffffffffff.....

Ya te adelantaste.... :x

Eres una máquina!!!!

Yo lo quería retomar ahora que he acabado un nuevo robot (a ver si lo cuelgo) y que tengo más tiempo.

Voy a buscar mi placa de pruebas y ver que tal va tu librería.

Muchas gracias!!!!!!!
Título: Re: MMC en CCS
Publicado por: PalitroqueZ en 16 de Abril de 2008, 15:27:25
En la modificación que estoy trabajando, quiero hacer del código lo mas veloz posible, (estoy revisando que es mas rapido, si punteros ó variables globales)

es que si vieras guillermo, probando en el osciloscopio, solamente la rutina de escribir, me tardo mas de 2 uS entre datos, ¡el overhead es una vaina seria! :D

yo me pregunto a que velocidad de escritura trabajaran los pendriver, allí debe ser todo por hardware, porque sino imaginate...




Título: Re: MMC en CCS
Publicado por: Slalen en 16 de Abril de 2008, 16:20:16
Conociéndote se que lo lograrás en unos días....

Suerte!!!!
Título: Re:MMC en CCS
Publicado por: daniel_ac32_venezuela en 21 de Octubre de 2017, 21:12:08
buenas tengo una pregunta!! alguien sabe de una libreria para sd card en ccs que me permita leer los archivos de la misma?