TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: JCAK en 11 de Octubre de 2010, 21:55:58
-
Amigos ...
Me he pasado el fin de seman largo mirando el sol por la ventana, envidiando a quienes lo ha podido disfrutar mientras yo, de puro capricho por querer verlo funcionar, hacia pruebas con mi memoria SD/MMC
El resultado no es del todo lo que esperaba ... pude hacer andar bien estos dos ejemplos, especialmente el segundo me parece menos pretencioso pero mas interesante.
http://www.dharmanitech.com/
http://www.roland-riegel.de/sd-reader/index.html
Ocurre que yo no necesito TODO ese despliegue de funciones y chiches, yo solo quiero leer el contenido de un archivo TXT, tomar caracter por caracter, compararlo contra una tabla y mandarlo a un display. Es decir, el display escribe lo que contiene el TXT
Con estas pruebas pude leer el contenido, pero la pregunta es si alguien tiene los pasos basicos, los minimos que hacen falta para lograr esto sin tener que ponerme a recortar el codigo que les he mencionado. Estoy usando un Atmega32
Agradecido como siempre
Julio
-
La verdad que esos ejemplos son de lo mejor que hay en la red ...lo mejor va ser que adaptes los códigos a tus necesidades...algo que no veo demasiado complejo con algo de paciencia :-/
-
yo ya probe un atmega32 leyendo SD fat32/16 pero lo ise con las librerias de "chan" con iar avr.
Con bascom es mas facil pero un atmega32 le queda corto en memoria ("2KB") pero en flash solo consume 6KB.
-
jonathanPIC888
Hoy me dipongo con paciencia a ver si recorto estos codigos, pero antes quiero ver si puedo hacer andar el PetitFAT que es una maravilla china super compacto, pero bue ... parece escrito en chino por lo complicado de entender.
Si alguien quiere acercar una mano con alguna otra sugerencia siempre es bienvenido.
Saludos y gracias
-
Hola mirá el usuario Suky de este foro escribió una librería para el manejo de FAT16 muy optimizada para consumir lo menos posible de RAM y ROM. La librería está hecha para CCS...pero con un poco de maña la podés portar a GCC o el compilador de C para AVR que sepás usar.
Saludos !
-
jonathanPIC888
Hoy me dipongo con paciencia a ver si recorto estos codigos, pero antes quiero ver si puedo hacer andar el PetitFAT que es una maravilla china super compacto, pero bue ... parece escrito en chino por lo complicado de entender.
Si alguien quiere acercar una mano con alguna otra sugerencia siempre es bienvenido.
Saludos y gracias
¿Es la Petit Fat de elm-chan?
Si es así para probar la librería hice un pequeño reproductor de wav con un mega16, espero que te sirva de referencia.
http://www.4shared.com/file/inWA1-uN/MEGA16_PB_AUDIO_sb_tdp20101014.html (http://www.4shared.com/file/inWA1-uN/MEGA16_PB_AUDIO_sb_tdp20101014.html)
Saludos,
ma4826
-
Las librerias de Suky tiene errores de en C. El CCS es muy tolerante no da error pero en iar, winavr, icc sale una lista larga errores y eso que una libreria para C. No se si mejoro ultimamente pero ya que lo deje de usar.
-
Las librerias de Suky tiene errores de en C. El CCS es muy tolerante no da error pero en iar, winavr, icc sale una lista larga errores y eso que una libreria para C. No se si mejoro ultimamente pero ya que lo deje de usar.
Buenas! :mrgreen: La compile en CSS, C18 y C32. En avr no la he probado ;-) Yo le voy a echar un ojo a las Petit FAT para ver que consumo de recursos tiene. :)
-
Hola,
Las librerias de Suky tiene errores de en C. El CCS es muy tolerante no da error pero en iar, winavr, icc sale una lista larga errores y eso que una libreria para C. No se si mejoro ultimamente pero ya que lo deje de usar.
También cabria la posibilidad de que mejoren IAR, WINAVR e ICC, muchos compiladores dicen ser ANSI C pero no lo son. Valoro el esfuerzo de Suky que desarrollo algo que no es trivial y lo publico para que todo el mundo lo pueda usar. Hubiese sido muy interesante que publiques los errores, de esta manera se podría llegar a corregir para que sea mas universal y compilador independiente.
Saludos !
-
HOLA y GRACIAS por todo lo que aportan ...
Estoy probando y recortando una mezcla de cosas, lo utlimo es agarrar algo hecho con lo de CHAN, debaguearlo por RS232, entenderlo, arreglarlo y creo que para este fin de semana lo tengo.
Pero encontré algo que quiero compartir con ustedes, que si bien esta basado en PIC, todo lo que tiene que ver con el C para leer las SD/MMC es exactametne lo mismo. Usa la libreria de CHAN y está bastante clarito.
El foro con todo el paso a paso es el siguiente
http://www.electronicslab.ph/forum/index.php/topic,17055
El link para bajar el Source es:
http://www.4shared.com/file/4yzVDyrd/PIC18_Petit_FAT_File_System.html
Saludos
Julio
-
Hola, también tenes esta ( que hice yo :P ) te paso el link, si el AVR es little endian tendrias que ajustar una macro.
https://sourceforge.net/projects/microfs/
Saludos !
-
Buen enlace ese ejemplo esta bien "Chan", se le agregaría una pequeña modificación para leer archivos txt mas grandes.
Ya lo probe en un atmega8 con proteus.
-
No logro hacer andar este ni otro codigo similar .... ¿quien me ayuda?
Ya probé varios códigos, pero vengo mal ... un par de ellos he logrado que lean la memoria, por lo que supongo que está bien conectada.
Estoy trabajando con un Atmegha32 a 16MHz, no se si la velocidad influye en mi problema, pero por las dudas les comento.
Las memorias que pruebo son de 512Mb y de 4Gb. Para conectarla uso los pines 5,6,7,8 del Atemga
Y estoy tratando de utilizar la libreria de CHAN porque pareceria ser la mas optimizada y desarrollada. En mi caso con la Petit FAT es suficiente.
Adapté todo al siguiente codigo para hacer un debug por el RS232, pero cuando llego a pf_opendir da error FR_NOT_ENABLED, aparentemente no encuentra nada y me manda el mensaje por el RS232 avisando que se quedó en ese paso ¿que es lo que esta mal, si es igual a los pasos que supuestamente funciona en otros ejemplos?
Alguien me ayuda a destrabarme ... ????
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdlib.h>
#include <util/delay.h>
#include "diskio.h"
#include "pff.h"
#include "UART_routines.h"
FATFS Fs; /* File system object */
DIR Dir; /* Directory object */
FILINFO Fno; /* File information */
WORD rb; /* Return value. */
BYTE buff[100];
void PORTS_Init(void)
{
// Set MOSI y SCK output
DDRB |= (1<<7)|(1<<5)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
DDRD |= (1<<5)|(1<<4);
PORTB = 0x00;
SPCR = (1<<6)|(1<<4)|(1<<0);
//Inicializa Ports para la UART
PORTD = 0x00;
DDRD = 0xFE;
}
int main (void)
{
BYTE i;
PORTS_Init();
//Inicializa UART para comunicación via RS232
uart0_init();
TX_NEWLINE;
TX_NEWLINE;
while(1){
_delay_ms(10);
TX_NEWLINE; //JK
transmitString_F(PSTR("Inserte Tarjeta"));
if (pf_mount(&Fs) ) continue; /* Initialize FS */
TX_NEWLINE; //JK
transmitString_F(PSTR("Inicializado"));
while(1){
if (pf_opendir(&Dir, ""))
TX_NEWLINE;
transmitString_F(PSTR("Error Opendir"));
break;
while (!pf_readdir(&Dir, &Fno) && Fno.fname[0]) {
_delay_ms(100);
if( strstr(Fno.fname, ".txt") ){ // TXT file
TX_NEWLINE; //JK
transmitString_F(PSTR("listando archivos ..."));
//TX_NEWLINE;
//transmitString_F(PSTR(Fno.fname));
if(pf_open(Fno.fname)) continue; // open file
if( strstr(Fno.fname, "BLANK") ){
codigo .....
}
else{
codigo .....
}
_delay_ms(5000);
}
}
}
}
}
-
Primero tiene que funcionar la iniciacion de SD. Una prueba solamente disk_initialize() par ver si la configuracion del spi esta bien o el cableado falta algo.
Dependiendo del compilador FATFS, DIR se le declara como static.
-
Hola Cristian_elect
Acabo de encontrar en la libreria, una parte en donde se definen los pines del SPI, me he pasado horas de horas buscando un error en el código porque nunca vi estas lineas. Cuanto más miro el codigo mas me sorprende los disperso que estan los settings de algunas cosas. Que chino loco ... pero bue, lo quiero igual.
Ya por la hora que es voy a probar las modificaciones recién mañana, y obviamente luego les cuento.
Saludos
-
Primero tiene que funcionar la iniciacion de SD. Una prueba solamente disk_initialize() par ver si la configuracion del spi esta bien o el cableado falta algo.
Dependiendo del compilador FATFS, DIR se le declara como static.
He probado por horas y no logro hacer andar esto .... ya los ojos se me achicharran...
POR FAVOR AYUDA !!!!!
Siguiendo con el codigo de Chan, por favor alguien que me ayude y me diga si para un Atmega32 este codigo dentro del mmc.h esta bien modificado.
No entiendo la diferencia que hace entre SS y CS, además solo definie MOSI pero no define MISO. Juro que me estoy volviendo loco frente a la compu. :5]
#ifndef _MMC_H__
#define _MMC_H__
//SPI configuration (Platform dependent)
#define SPI_PORT PORTB
#define SPI_DDR DDRB
#define DD_MOSI 5
#define DD_SCK 7
#define DD_SS 6
// Defines for SD card SPI access
#define SD_CS_PORT PORTB
#define SD_CS_DDR DDRB
#define SD_CS_PIN 4
// Port Controls (Platform dependent)
#define SELECT() SD_CS_PORT &= ~(1<<SD_CS_PIN) /* MMC CS = L */
#define DESELECT() SD_CS_PORT |= (1<<SD_CS_PIN) /* MMC CS = H */
/*-----------------------------------------------------------------------*/
/* SPI interface */
/*-----------------------------------------------------------------------*/
void init_spi (void)
{
DESELECT(); // set default CS pin
SPI_DDR = (1<<DD_MOSI) | (1<<DD_SCK); // set spi direction
// SPI_DDR = (1<<DD_MOSI) | (1<<DD_SCK)| (1<<DD_SS); // set spi direction
SD_CS_DDR |= (1<<SD_CS_PIN); // Turns on CS pin as output
if (!(SPI_DDR & (1<<DD_SS))) // if SS is input
SPI_PORT |= (1<<DD_SS); // set internal pull up SS for spi master mode
SPCR = (1<<SPE)|(1<<MSTR); // Initialize SPI port (Mode 0)
SPSR = (1<<SPI2X); // SPI double speed settings
}
BYTE rcv_spi (void)
{
SPDR = 0xFF;
loop_until_bit_is_set(SPSR, SPIF);
return SPDR;
}
/* Alternative macro to receive data fast */
#define rcv_spi_m(dst) SPDR=0xFF; loop_until_bit_is_set(SPSR,SPIF); *(dst)=SPDR
#define xmit_spi(dat) SPDR=(dat); loop_until_bit_is_set(SPSR,SPIF)
#endif
-
En tu caso has conectado al CS de la SD en el Pin SS del mega por lo que coinciden.
#define DD_SS 4
Pero ese cambio no afecta al funcionamiento del trozo de código que has puesto.
Puedes probar a bajar la velocidad del SPI que ahora está al máximo (Fosc/2).
Saludos,
ma4826.
-
En tu caso has conectado al CS de la SD en el Pin SS del mega por lo que coinciden.
#define DD_SS 4
Pero ese cambio no afecta al funcionamiento del trozo de código que has puesto.
Puedes probar a bajar la velocidad del SPI que ahora está al máximo (Fosc/2).
Gracias ma4826
Sigue sin quedarme claro algo, a ver si me podes aclarar …
//SPI configuration (Platform dependent)
#define DD_MOSI 5
#define DD_SCK 7
#define DD_SS 6
// Defines for SD card SPI access
#define SD_CS_PIN 4
Vos me confirmes que SD_CS_PIN va a PB4 (/SS del Atmel), pero mi duda es con DD_SS que yo asigne a PB6 (MISO)
Yo interpreto DD_SS como Slave Select, pero si lo interpreto así el MISO no tiene nada que hacer en ese lugar y para peor me quedaría sin asignar. Que significa DD_SS?
Algo más que debo probar como vos sugerís es lo de la velocidad. Estoy usando el micro a 16MHz, voy a cambiar la velocidad del SPI. ¿qué valor máximo soportan estas memorias?
-
Hola, en la incialización la tarjeta debe ser servida con un clock por SPI de 100 a 400 Khz, una vez inicializada podes aumentar la velocidad. Hasta 8 Mhz a mi me funciono bien. Una de la cosas que nunca pude entender es que la frecuencia del SPI siempre debía ser potencia de 2, en otros valores la cosa se ponía inestable, nunca pude investigar a fondo por donde venia el problema si era problema del driver con la tarjeta o algun problema de hard.
Saludos !
-
Los pines del SPI vienen fijados por hardware no los puedes elegir. Le dices que pines son el MOSI y SCK para ponerlos como salida en la inicialización, el MISO no hace falta porque por defecto arranca configurado como entrada. El único pin que puedes elegir es el que va conectado al CS de la SD, en este caso has cogido el PIN SS del mega.
if (!(SPI_DDR & (1<<DD_SS))) // if SS is input
SPI_PORT |= (1<<DD_SS); // set internal pull up SS for spi master mode
Para trabajar como maestro único tienes que poner el pin SS como salida o al menos asegurarte de que si está como entrada va a tener un nivel alto por eso la librería comprueba si el PIN_SS está configurado como salida y sino no lo está activa la pull-up, es para lo único que utiliza el valor de DD_SS. Porque si está configurado como entrada un nivel bajo en este pin interrumpe la transmisión, esto se usa cuando hay más de un maestro.
Respecto a las velocidades es cierto lo que dice RICHI777, de hecho en la versión completa de la librería hace el cambio de velocidad.
Saludos,
ma4826.
-
No es nesesario definir mosi, miso, sck por que el hardware lo controla, solo defines el pin selector "SS" por que se activa por el programa.
SS atemega32 pin PB4.
#define SELECT() PORTB &= ~16 /* MMC CS = L */
#define DESELECT() PORTB |= 16 /* MMC CS = H */
Pero si se configura SS, MOSI, SCK como salidas y MISO como entrada en DDRB=176 para atmega32.
-
Hola ma4826
Para trabajar como maestro único tienes que poner el pin SS como salida o al menos asegurarte de que si está como entrada va a tener un nivel alto por eso la librería comprueba si el PIN_SS está configurado como salida y sino no lo está activa la pull-up, es para lo único que utiliza el valor de DD_SS. Porque si está configurado como entrada un nivel bajo en este pin interrumpe la transmisión, esto se usa cuando hay más de un maestro.
A ver si entiendo ... Vos me queres decir que si pongo esto asi para el Atmega32, debería andar sin importar lo que ponga en DD_SS?
//SPI configuration
#define DD_MOSI 5
#define DD_SCK 7
#define DD_SS 1 ------------------------- ¿acá puedo poner cualquier pin si solo tengo un Master? ¿puedo usar PB1 y no conectarle nada, queda en el aire?
// Defines for SD card SPI access
#define SD_CS_PIN 4
Y por ultimo hago como vos decis y el MISO teniendo en cuenta que esta en Master y queda como entrada, lo mando directo al pin 7 del SD/MMC
¿es asi?
Porque si es asi a mi no me anda. Cambie el cristal por uno de 8MHz y también dividi la velocidad del SPI para que no sea mayor a 400KHz.
Algo que me este comiendo??? ¿que proponen?
Si tienen algo que me puedan enviar por privado por si no lo quieren postear, mil gracias. Como verán estoy haciendo mi mejor esfuerzo y leyendo de todo, pero no hay caso. Gracias, muchas gracias.
-
cristian_elect
No entiendo qué has querido explicar pero gracias igual.
-
Pon tu codigo para ver cual es el error.
-
Pon tu codigo para ver cual es el error.
Aqui va completo. Estoy compilando con Studio 4
-
A ver si entiendo ... Vos me queres decir que si pongo esto asi para el Atmega32, debería andar sin importar lo que ponga en DD_SS?
No SS esta fijo en el micro es el PB4
#define DD_SS 4El que puedes elegir el pin al que conectas el CS de la SD. En tu caso has conectado SS del mega al CS de la SD, por lo que el pin SS va estar configurado como salida.
¿Dónde falla? ¿Que devuelve disk_initialize()?
¿Cuál es el tamaño de la SD? ¿Es SDHC?
Saludos,
ma4826.
-
MA4826, por favor decime ¿esto deberia quedar así o como debe quedar?
Si alguien me dice como deben quedar, al menos no sigo pensando que el error puede estar en el cableado. Lo cual no creo pero todo es posible.
¿Cómo quedaría?
//SPI configuration
#define DD_MOSI 5
#define DD_SCK 7
#define DD_SS 4
// Defines for SD card SPI access
#define SD_CS_PIN 4
Las memorias que tengo para probar son:
SanDisk SD 512Mb
Kingston SDHD 4Gb
-
Si, está bien.
¿Dónde falla? ¿Que devuelve disk_initialize()?
Saludos,
ma4826.
-
Ya bueno para dar una ayuda aqui dejo un ejemplo para atmega32.
Pero respondan siempre que doy una ayuda hay termina todo, no se comenta si a servido o hay un error o falto algo.
Por que en el otro forodeelectronica me parece cuando estan cerca de fin de ciclo todos preguntan como apurados esperando que le resuelvan la tarea ni se toman el tiempo de usar el buscador del foro.
-
Ya bueno para dar una ayuda aqui dejo un ejemplo para atmega32.
Pero respondan siempre que doy una ayuda hay termina todo, no se comenta si a servido o hay un error o falto algo.
Por que en el otro forodeelectronica me parece cuando estan cerca de fin de ciclo todos preguntan como apurados esperando que le resuelvan la tarea ni se toman el tiempo de usar el buscador del foro.
:-/ :-/ :-/ :-/ :-/ :-/ :-/ :mrgreen: :mrgreen:
Estoy infinitamente agradecido porque FUNCIONA !!!!
Lee la SanDisk 512Mb en FAT16 y también la Kingston 4Gb en FAT32
Lo he probado con el micro a 8MHz y con el terminal RS232 en Windows a 9600bps
Te comento un par de Warnings que arroja con el compilardor AVR Studio 4:
1) ../mmc_mega32.c:95: warning: pointer targets in passing argument 1 of 'mimprimir' differ in signedness
2) ../config_mmc_mega32.c:220: warning: implicit declaration of function 'putchar'
La ultima linea de Warning solo la arroja una vez, si vuelvo a compilar solo aparece la 1era.
Mil mil gracias Cristian
-
Para crear archivo se usa la libreria full de chan.
-
Buscando otra cosa hoy encontré esta libreira para SD/MMC y para muchas otras cosas mas.
Quiero compartirla con ustedes:
Para SD/MMC
http://www.mil.ufl.edu/~chrisarnold/components/microcontrollerBoard/AVR/avrlib/docs/html/group__mmc.html
Para otros dispositivos externos (LCD, Ethernet, EEPROM, I2C, etc.)
http://www.mil.ufl.edu/~chrisarnold/components/microcontrollerBoard/AVR/avrlib/docs/html/modules.html
Si alguien ha experimentado con ellas y puede agregar algun comentario, seguro es util para todos.
¿Alguien comparó esta libreria para SD/MMC hecha por Pascal Stang vs. la de Chan?
Saludos
-
Yo ya tengo esa libreria lo baje hace mas de un año funciona para winavr pero yo uso IAR, asi que no lo uso.
Tambien tiene mmc y fat pero esta tan completa como que tiene Chan.
-
Para crear archivo se usa la libreria full de chan.
Cristian, una consulta:
¿Tenés idea o probaste si se puede recortar de la libreria full la parte que permite crear archivos y agregarla a la liberia Petit?
La idea es no ocupar la memoria con la liberia full y solo agregar esa función que me resultaría muy util.
Gracias
-
Atmega32 si alcanza para la libreria full, en la RAM si le queda poco.
-
Aquí tienes el consumo de flash y de memoria de la librería FatFS (Versión completa)
http://elm-chan.org/fsw/ff/en/appnote.html (http://elm-chan.org/fsw/ff/en/appnote.html)
El consumo de memoria con la opción (_FS_TINY = 1) no llega a 600 bytes con un archivo abierto y el ATMEGA32 tiene 2 KB. Y la librería te permite ajustar las funciones que quieres usar para ajustar en lo posible el consumo de flash.
Saludos,
ma4826.
-
Ise un programa para grabar los valores ADC en SD en formato exel y me comsume 1750 Bytes, para hacer otras cosas le queda muy poca ram, agregre unas funciones de string y ya paso la ram. El compilador ya no permite.
-
hola cristian_elect soy medio nuevo en el foro y estoy diseñando un equipo que necesita una sd y yo queria desde el micro tomar lecturas del adc y armar un TXT en la sd para luego leerlo en cualquier pc.....cual es la libreria full de chan que decias mas arriba? podrias subir esa libreria o con la que subiste con el nombre de fat_chico_mega32 puedo hacerlo?
"Para crear archivo se usa la libreria full de chan."
desde ya muchas gracias!
saludos
-
Ya no veo eso, seria buscar en mis archivos.
-
Por favor si pudieras hacerte un tiempo para subir las rutinas completas en algún momento seria genial! :)
desde ya muchas gracias.
saludos