# MMC/SD como Memoria en Pic Basic Pro



## papirrin (Abr 19, 2014)

Amigos me gustaria compartir con la comunidad este programa que hice para utilizar las MMC/SD, como memoria para pics, haciendo la aclaracion de que es mas bien como una eeprom externa, no como disco, o sea que *no tiene formato* (FAT12/16, FAT32,NTSF) esto quiere decir que no tiene directorios ni subdirectorios ni archivos, para hacer eso se necesitan otros algoritmos, *quien busque como grabar archivos este no es el tema correcto OK.*

El compilador que use fue Microcode studio 5.0.0.0, PBPL 3.0 y MPASM 5.48. y el pic es un 18f2550, la razon de usar esos compiladores es porque se requiere de usar una variable tipo long de 32bits y versiones anteriores no lo soportan, y el utilizar el pic 18f2550 fue porque ese pic tiene una memoria SRAM de 2048 bytes y un sector de la micro SD tiene 512bytes, para ser funcional se requiere de un pic con mas de 512bytes en memoria SRAM. 

con algo de esfuerzo se puede migrar a otro compilador anterior y a otros pics con menos memoria, pero asi eran mis requerimientos al hacer el proyecto.

si al compilar :
- marca un error con algo respecto al ICPRT necesitan reemplazar un archivo llamado P18f2550.inc dentro de la carpeta del MPASM suite.
esto se debe a que tiene un bug el archivo. 
- marca un error referente a que se duplico el registro de configuracion se necesita reemplazar un archivo llamado Pic18f2550.PBPINC dentro de la carpeta del PBP3.0
esto se debe a un bug del PBP3 
(ambos archivos estan anexados en el archivo rar.)

anexo la simulacion en proteus 8.0 y codigos fuente.






El funcionamiento es mas o menos simple:

se inicializa la memoria con:
Gosub init

*despues de llamar la subrutina init retorna en la variable error 1 si hubo error, y 0 si no lo hubo,

para graba datos:
sector=1                            'se define el sector a grabar
SDData[0]=1                      ' se pasan los valores a un arreglo con longitud de 512 
.
.
.
SDDAta[511]=20
gosub write_sd                   'se llama rutina de grabacion

*despues de llamar la subrutina retorna en la variable error 1 si hubo error, y 0 si no lo hubo,

para leer datos:
sector=1                           'se define el sector a leer
gosub read_sd                    'se llama rutina de lectura
en el arreglo SDData se colocan los valores del sector.

*despues de llamar la subrutina retorna en la variable error 1 si hubo error, y 0 si no lo hubo,

PD. para los que no estan familiarizados con MPASM deben de descomprimir el directorio del rar y ponerlo en el directorio raiz, porque MPASM no acepta rutas de mas de 32 caracteres.

PD1: esta recien echo asi que puede tener algun bug por ahi, si encuentro alguno seguire subiendo el rar con las correcciones.

PD2: si tienen alguna duda al respecto y se la respuesta intentare aclararla.


----------



## D@rkbytes (Abr 20, 2014)

papirrin dijo:


> El compilador que usé fue Microstudio 5.0.0.0, PBPL 3.0 y MPASM 5.48. y el pic es un 18f2550
> 
> Si al compilar :
> - Marca un error con algo respecto al ICPRT, necesitan reemplazar un archivo llamado P18f2550.inc dentro de la carpeta del MPASM suite.
> ...


Si estás usando MicroCode Studio 5 y PBP3, ¿por qué no agregas los fuses dentro del código?
Te evitas crear el archivo de los fuses, reemplazar otros y el "bug".

En MCS5 y conforme a los fuses que necesitas para usar el oscilador interno, sería así el encabezado:

```
[B][COLOR=Blue]#Config[/COLOR][/B]
    Config FOSC = INTOSCIO_EC, MCLRE = OFF
    Config PWRT = ON, WDT = OFF, PBADEN = OFF, LVP = OFF, BOR = OFF
[COLOR=Blue][B]#EndConfig[/B][/COLOR]

[COLOR=Blue][B]Define[/B][/COLOR] OSC Mi_Frecuencia ;(4 ú 8MHz.)
```
Para trabajar a 4MHz, configuras el registro OSCCON de esta forma: 
*OSCCON* = %01100100

Si quieres trabajar con los 8MHz máximo del oscilador interno, lo configuras de esta forma:
*OSCCON* = %01110100

Así seleccionas a que frecuencia quieres trabajar con el oscilador interno, porque por defecto está a 500KHz.
Como no configuraste el registro OSCCON, el LED testigo no estará parpadeando cada 200Ms.
Por lo tanto tu programa no está corriendo a los 4MHz que declaraste. (FOSC por defecto cuando no se establece.)

Nota:
El error que te muestra, es porque en el PIC18F2550 el fuse ICPRT no existe y lo tienes declarado.
Si compilas de la forma como te menciono, no tendrás problemas.

Saludos.


----------



## papirrin (Abr 20, 2014)

De antemano gracias por participar Darkbytes 



> ¿por qué no agregas los fuses dentro del código?



Si estan dentro del codigo nada mas que en un archivo include, en el  "18f2550.Inc"
en elarchivo de PBP  Pic18f2550.PBPINC, lo que elimine fueron las lineas de configarion para precisamente tener el control desde el codigo. (eso ya lo habia echo desde antes XD)



> Para trabajar a 4MHz, configuras el registro OSCCON de esta forma:
> OSCCON = %01100100
> 
> Si quieres trabajar con los 8MHz máximo del oscilador interno, lo configuras de esta forma:
> ...



se agradece  la corrección, eso si se me olvido especificarlo XD.



> Nota:
> El error que te muestra, es porque en el PIC18F2550 el fuse ICPRT no existe y lo tienes declarado.
> Si compilas de la forma como te menciono, no tendrás problemas.



exactamente en el archivo que anexo en el rar P18f2550 lo unico que agrege son estas dos lineas:

_ICPRT_OFF_4L        EQU  H'DF'    
_ICPRT_ON_4L         EQU  H'FF'

en otra version del MPASM tambien tiene un error lo tiene asi:

_ICPRT_OFF_4L        EQU  H'DF'    
_ICPRT_ON_4L         EQU  H'DF' <------ esto esta mal deberia ser FF


----------

