МК + SD карта

помощь начинающим осваивать программирование МК (PIC, AVR) на Си.

Модератор: koolhatcker

Ответить
xumuk
Станкостроитель
Станкостроитель
Сообщения: 1140
Зарегистрирован: 27 дек 2009, 01:00
Откуда: Украина. Харьков

МК + SD карта

Сообщение xumuk »

Подскажите как лучше всего связать SD карту и ATmega32
с наименьшими затратами ресурсов.

Задача - раз в несколько секунд дописывать в конец файла информацию, полученную с GPS модуля.

Пробовал использовать драйвер SD + FAT, поставляемый вместе с Codevision (на основе библиотек Chan-а), но пока безуспешно.. Маунтится нормлаьно, но при попытке считывания директории - все виснет :(
Возможно это связано с тем, что у меня кроме карты еще подключен дисплей от телефона к SPI..
Аватара пользователя
TK-15
Станкостроитель
Станкостроитель
Сообщения: 123
Зарегистрирован: 22 сен 2010, 00:00
Откуда: Москва
Контактная информация:

Сообщение TK-15 »

xumuk писал(а):как лучше всего связать SD карту и ATmega32
с наименьшими затратами ресурсов.
по SPI.
xumuk писал(а):попытке считывания директории - все виснет :( Возможно это связано с тем, что у меня кроме карты еще подключен дисплей от телефона к SPI..
..можно "организовать" программный SPI на любых свободных выводах
at90
Станкостроитель
Станкостроитель
Сообщения: 424
Зарегистрирован: 15 мар 2010, 01:00
Откуда: Краснодар
Контактная информация:

Сообщение at90 »

я запускал библиотеку от чана. Полет нормальный.
Работает и с обычными SD и с SHDC.
koolhatcker
Смотрящий
Сообщения: 1504
Зарегистрирован: 30 авг 2009, 00:00
Откуда: Омск
Контактная информация:

Сообщение koolhatcker »

SDHC :)
Автономный контроллер станка с ЧПУ: http://it-en.ru/cnc
at90
Станкостроитель
Станкостроитель
Сообщения: 424
Зарегистрирован: 15 мар 2010, 01:00
Откуда: Краснодар
Контактная информация:

Сообщение at90 »

ну суть это не меняет....
Moonglow
Станкостроитель
Станкостроитель
Сообщения: 244
Зарегистрирован: 28 фев 2011, 01:00

Сообщение Moonglow »

.
Последний раз редактировалось Moonglow 30 ноя 2012, 14:00, всего редактировалось 1 раз.
life
Смотрящий
Сообщения: 614
Зарегистрирован: 29 авг 2009, 00:00
Имя: Олег
Откуда: Край земли (Камчатка)

Сообщение life »

либо используем MikroC
  Не в тему:   Ох, koolhatcker ща увидит... :)
koolhatcker
Смотрящий
Сообщения: 1504
Зарегистрирован: 30 авг 2009, 00:00
Откуда: Омск
Контактная информация:

Сообщение koolhatcker »

  Не в тему:   life, да я смирился уже :). Пока сами на грабли не наступят - хоть заобъясняйся...:)
Автономный контроллер станка с ЧПУ: http://it-en.ru/cnc
Moonglow
Станкостроитель
Станкостроитель
Сообщения: 244
Зарегистрирован: 28 фев 2011, 01:00

Сообщение Moonglow »

  Не в тему:   данный продукт часто обновляется.... про какие грабли речь ?... знаю много людей кто его использует .... включая большие проекты и вроде всё ОК.... в последних версиях новый оптимизатор кода... вроде даже ничего... может быть тыкните в чем проблема ?
Аватара пользователя
maxlab
Станкостроитель
Станкостроитель
Сообщения: 58
Зарегистрирован: 23 ноя 2010, 01:00
Откуда: Усть-Лабинск

Сообщение maxlab »

Привет! А скажите, уважаемые гуру, существуют ли в природе карты памяти? Такого типо-размера как Голд или Силвер, но на борту памяти 8-64 Мб. Куда рыть? Задача стоит такая же как у Кулхацкера с его автономным станком... только применяться будет не в ЧПУ строении.
Девице - device!
Аватара пользователя
kernel
Станкостроитель
Станкостроитель
Сообщения: 765
Зарегистрирован: 05 фев 2011, 01:00
Имя: Max
Откуда: Красноярск

Сообщение kernel »

koolhatcker писал(а):
  Не в тему:   life, да я смирился уже :). Пока сами на грабли не наступят - хоть заобъясняйся...:)
  Не в тему:   +1. Когда-то уже наступил на эти грабли -- пользовался "MikroPascal for AVR". В то время в их примерах (схемные примеры "спаривания" компонентов) были ну настолько глупые ошибки %) Причем не работало, пока уже сам не разберешься в чем дело. Для примера, в старой версии (по-моему 4-я) был пример работы с UART, так там Rx&Tx были так перепутаны на MAX232, что отправленный байт со стороны контроллера приходил ему же обратно и связи с компом не было. Потом еще один баг, из-за которого в то время даже проект заморозился на год (просто на столько запутал их пример, что даже через большой промежуток времени, когда уже и этим микропаскалем не пользовался никто из нас, не могли понять в чем дело) -- было показано неверное согласование уровней с использованием 74HCT08N. В общем, когда перешли на WinAVR -- границы АВРостроения значительно расширились и зависимость от "дозы" примеров быстро исчезла.

Ну в общем-то тема то и не про компиляторы и т.п. :)


По теме хочу добавить, что лучше библиотеки от Чана ничего не попадалось мне. Там около года-полтора назад даже появилась поддержка LFN в FAT. Все работает очень хорошо.

xumuk, а уровни МК и SD нормально согласованы (если, конечно, МК от 5В питается)? Точно не могу вспомнить, но у меня проблема вроде бы наблюдалась до тех пор, пока я с инициализацией SPI не намудрил чего-то (и еще помню DDR для портов как-то по особому делал, вроде с SS (SPI) связано было что-то). Еще рекомендуют (по-хорошему) питание на SD подавать через полевик для нормального сброса SD в начале запуска МК.
xumuk
Станкостроитель
Станкостроитель
Сообщения: 1140
Зарегистрирован: 27 дек 2009, 01:00
Откуда: Украина. Харьков

Сообщение xumuk »

МК от 5 вольт, SD от 3,3
Карта подключена через резистивные делители.

А какие должны быть настройки SPI ?

У меня дисплей от сименса общается с МК по SPI на частоте 8 МГц. Придется при переключении с карты на дисплей менять настрйоки SPI каждый раз?
Аватара пользователя
TK-15
Станкостроитель
Станкостроитель
Сообщения: 123
Зарегистрирован: 22 сен 2010, 00:00
Откуда: Москва
Контактная информация:

Сообщение TK-15 »

xumuk писал(а):А какие должны быть настройки SPI ?
.. режим 0 или 3, частота 400 кГц
xumuk писал(а):Придется при переключении с карты на дисплей менять настрйоки SPI каждый раз?
... после инициализации карта должна переваривать и 8 МГц, если нет используйте программный SPI
Аватара пользователя
kernel
Станкостроитель
Станкостроитель
Сообщения: 765
Зарегистрирован: 05 фев 2011, 01:00
Имя: Max
Откуда: Красноярск

Сообщение kernel »

2 xumuk. У меня инициализация самого SPI такая (asm):

Код: Выделить всё

    cbi     PORTB, LCD_RESET        ; display reset
    sbi     DDRB, LCD_RESET         ; set reset as output

    cbi     DDRB, LCD_MISO          ; MISO is always input in SPI
    sbi     PORTB, LCD_MISO          ; MISO is always input in SPI

    sbi     DDRB, LCD_MOSI          ; MOSI must be set as output for SPI

    sbi     DDRB, 4          ; SS

    sbi     PORTB, LCD_CS           ; deselect display 
    sbi     DDRB, LCD_CS            ; SS must be output for Master mode to work


    cbi     PORTB, LCD_SCK          ; set SCK lo
    sbi     DDRB,  LCD_SCK          ; set SCK as output

    sbi     PORTB, LCD_RS           ; start with RS=high
    sbi     DDRB, LCD_RS            ; RS signal is output

    ldi     r24,(1<<MSTR) | (1<<SPE);
    out     SPCR,r24

;    ldi     r24,0
    ldi     r24,(1<<SPI2X)           ; double speed bit
    out     SPSR,r24

    ldi     r24,1
;    ldi     r24,0
    ldi     r25,0
    rcall   mswait          ; wait one ms to have a nice reset
    sbi     PORTB, LCD_RESET    ; release reset
    in      r24,SPSR        ; clear status
    ret
Такая инициализация работает для 3-х устройств, повешенных на SPI.

И, кстати, для гарантии нужно уровень выхода DATA OUT у флэшки поднимать.

Добавлено позже:

Moonglow (ответ на сообщение ниже), в то время багов было на сколько много, что для их "отписывания" разработчикам можно было целую жизнь потратить -) А вообще, мне было проще уйти на WinAVR, тем более бесплатная.
Последний раз редактировалось kernel 16 апр 2011, 22:39, всего редактировалось 2 раза.
Moonglow
Станкостроитель
Станкостроитель
Сообщения: 244
Зарегистрирован: 28 фев 2011, 01:00

Сообщение Moonglow »

.
Последний раз редактировалось Moonglow 30 ноя 2012, 13:57, всего редактировалось 1 раз.
ChaiSER
Станкостроитель
Станкостроитель
Сообщения: 51
Зарегистрирован: 31 авг 2009, 00:00
Откуда: UA

Re: МК + SD карта

Сообщение ChaiSER »

Нужно считать координаты X и Y из файла *.drl для сверловки.Исспользую библиотеку Petit FatFs от Чана.
Считываю блоком (512 байт) перебирая побайтно вхождения X и Y так:
Показать/Спрятать

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#include <util/delay.h>

#include "pff.h"
#include "diskio.h"
#include "integer.h"


#define BUFFER	512		/* Количество байт для чтения */

char read_buf[BUFFER] = {};	/* Указатель на буфер чтения данных */

/****************************************************************************/
/*                                            Функции для работы UART                                                     */
/****************************************************************************/

//инициализация UART`a
void uart_init(void)
{
   UBRRH = 0;
   UBRRL = 103; //скорость обмена 9600 бод при Fcpu = 16MГц
   UCSRA = 0;
   UCSRB = (1<<TXEN); // разр передачи.
   UCSRC = (1<<UCSZ1) | (1<<UCSZ0) | (1<<URSEL); //размер слова 8 разрядов
}

//Передача символа по UART
void uart_transmit(char data)
{
    while ( !( UCSRA & (1<<UDRE)) ); 
    UDR = data;
}

//Передача массива символов - строки msg
void uart_transmit_message(char* msg)
{
    unsigned char sym = 0;

    while ( *msg )
    {
        sym = *msg++;
        uart_transmit(sym);
    }
}

/****************************************************************************/
/*                                                   MAIN FUNCTION                                                             */
/****************************************************************************/

int main (void)
{
    FATFS   fs;			//FatFs объект
    FRESULT res;			//Результат выполнения
    WORD    s1, i, k, n;

    //Инициализация UART
    uart_init();
 
    //Монтируем FAT
    res=pf_mount(&fs);
    uart_transmit_message("Mounting FAT ");

    //Если FAT успешно смонтирован
    if (res==0x00) 
    {
           uart_transmit_message("OK\r\n");
		
 	//Открываем файл
	res=pf_open("/PROGRAMM.drl");
 	uart_transmit_message("Open PROGRAMM.drl ");
  	if (res==0x00) uart_transmit_message("OK\r\n");
           	    else uart_transmit_message("FAIL\r\n");
		
 	//Установим курсор чтения на 0
	res=pf_lseek (0);
   	uart_transmit_message("Set 0 to pointer into PROGRAMM.drl ");
  	if (res==0x00) uart_transmit_message("OK\r\n");
  	    else uart_transmit_message("FAIL\r\n");
		
	uart_transmit_message("Data in PROGRAMM.drl:\r\n");
 	uart_transmit_message("\r\n");
		
	//Читаем файл поблочно
	for (;;) 
	{
		res = pf_read(read_buf, BUFFER, &s1);
		if (res || !s1) break;			//Ошибка или достигнут конец файла
			
		for (i = 0; i < s1; i++)
		{
			switch (read_buf[i]) {
				case 'X': {
					for (k = 0; k < 6; k++) {
						uart_transmit(read_buf[++i]);
					}
					uart_transmit_message("   ");
					break;
				}
				case 'Y': {
					for (n = 0; n < 6; n++) {
						uart_transmit(read_buf[++i]);
					}
					uart_transmit_message("\r\n");
					break;
				}
			}
		}
                      read_buf[0]=0;								//Чистим буфер
	}
	//Демонтируемt FAT
	res=pf_mount(0x00);
 	uart_transmit_message("\r\n");
 	uart_transmit_message("Unmounting FAT ");
     
	if (res==0x00) uart_transmit_message("OK\r\n");
        		else uart_transmit_message("FAIL\r\n");
 	}
           else 
	{
		uart_transmit_message("FAIL\r\n");
	}

    while (1);
}
И всё бы ничего, но если файл превышает по размеру объем считываемого блока то, есстественно, будет ошибка в чении координат.
Как можно побороть данную проблемму? Если есть у кого наработки или соображения - пишите. Желательно с кодом - так мне легче разбираться.
koolhatcker
Смотрящий
Сообщения: 1504
Зарегистрирован: 30 авг 2009, 00:00
Откуда: Омск
Контактная информация:

Re: МК + SD карта

Сообщение koolhatcker »

ChaiSER писал(а):Как можно побороть данную проблемму?
Естественно только по окончании одного блока считывать следующий. Типа pf_lseek = pf_lseek+512 :).
Автономный контроллер станка с ЧПУ: http://it-en.ru/cnc
ChaiSER
Станкостроитель
Станкостроитель
Сообщения: 51
Зарегистрирован: 31 авг 2009, 00:00
Откуда: UA

Re: МК + SD карта

Сообщение ChaiSER »

koolhatcker, пробовал, только блок не всегда заканчивался концом строки. ИМХО нужно как-то последнюю строку обрабатываемого блока с обрывом и неполную строку следующего блока загонять в отдельный буфер и уже из него считывать координаты. Или есть более правильный метод?
UAVpilot
Станкостроитель
Станкостроитель
Сообщения: 1198
Зарегистрирован: 07 ноя 2011, 16:01
Откуда: Москва

Re: МК + SD карта

Сообщение UAVpilot »

Стандартный приём: функция читающая из буфера байты пока не встретит конец строки. Если быйты в буфере кончаются раньше, то она загружает в буфер след. порцию из файла.
Я не Христос, рыбу не раздаю. Но могу научить, как сделать удочку.
ChaiSER
Станкостроитель
Станкостроитель
Сообщения: 51
Зарегистрирован: 31 авг 2009, 00:00
Откуда: UA

Re: МК + SD карта

Сообщение ChaiSER »

s3301, это понятно, осталось только в коде воспроизвести...
koolhatcker
Смотрящий
Сообщения: 1504
Зарегистрирован: 30 авг 2009, 00:00
Откуда: Омск
Контактная информация:

Re: МК + SD карта

Сообщение koolhatcker »

ChaiSER, так вам разжевать и положить?:)
Неужели самому не интересно?
Автономный контроллер станка с ЧПУ: http://it-en.ru/cnc
ChaiSER
Станкостроитель
Станкостроитель
Сообщения: 51
Зарегистрирован: 31 авг 2009, 00:00
Откуда: UA

Re: МК + SD карта

Сообщение ChaiSER »

koolhatcker, очень интерессно, иначе-бы и не занимался этим. Дело в том, что кодить МК это моё хоби, которым могу заниматься месяц-два в году, поэтому и знания на таком уровне...

Продолжаю. Для начала проверяю считываеться ли поблочно файл больше блока (512 байт). Всё работает, код ниже:
Показать/Спрятать

Код: Выделить всё

//Читаем файл поблочно
for (;;) 
{
    res = pf_read(read_buf, BUFFER, &s1);

    if (res || !s1) break;      //Ошибка или достигнут конец файла

    for (i = 0; i < s1; i++)
    {
        uart_transmit(read_buf[i]);
    }

    read_buf[0]=0;              //Чистим буфер
}
Далее, пробую читать файл построчно. Компилиться, но не работает. Вот код:
Показать/Спрятать

Код: Выделить всё

char row[] = {};
unsigned char row_counter = 0;
...

//Читаем файл поблочно
for (;;) 
{
    res = pf_read(read_buf, BUFFER, &s1);

    if (res || !s1) break;      //Ошибка или достигнут конец файла

    for (i = 0; i < s1; i++)
    {
        row[row_counter] = read_buf[i];
        row_counter++;

        if (read_buf[i] == '\n')
        {
            uart_transmit_message(row);
            row_counter = 0;
            row[0] = 0;
        }
    }

    read_buf[0]=0;              //Чистим буфер
}
Где ошибка?
koolhatcker
Смотрящий
Сообщения: 1504
Зарегистрирован: 30 авг 2009, 00:00
Откуда: Омск
Контактная информация:

Re: МК + SD карта

Сообщение koolhatcker »

ChaiSER писал(а):Где ошибка?
Может тут:
ChaiSER писал(а):char row[] = {};
...
row[row_counter] = read_buf;

Компилятор не всегда думает так, как думаем мы :).
А может и в другом месте...
Автономный контроллер станка с ЧПУ: http://it-en.ru/cnc
Ответить