www.cncmasterkit.ru • Просмотр темы - МК + SD карта

www.cncmasterkit.ru

ЧПУ своими руками

     · ПРАВИЛА ·

Текущее время: 22 ноя 2017, 16:02
Сообщения без ответов | Активные темы

Часовой пояс: UTC + 3 часа [ Летнее время ]


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему  [ Сообщений: 23 ] 
Автор Сообщение
 Заголовок сообщения: МК + SD карта
Сообщение #1  Добавлено: 24 мар 2011, 13:56 
Не в сети
Станкостроитель
Станкостроитель

Зарегистрирован: 27 дек 2009, 01:00
Сообщения: 1140
Откуда: Украина. Харьков
Подскажите как лучше всего связать SD карту и ATmega32
с наименьшими затратами ресурсов.

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

Пробовал использовать драйвер SD + FAT, поставляемый вместе с Codevision (на основе библиотек Chan-а), но пока безуспешно.. Маунтится нормлаьно, но при попытке считывания директории - все виснет :(
Возможно это связано с тем, что у меня кроме карты еще подключен дисплей от телефона к SPI..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #2  Добавлено: 25 мар 2011, 11:47 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #3  Добавлено: 25 мар 2011, 11:49 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 15 мар 2010, 01:00
Сообщения: 424
Откуда: Краснодар
я запускал библиотеку от чана. Полет нормальный.
Работает и с обычными SD и с SHDC.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #4  Добавлено: 25 мар 2011, 12:06 
Не в сети
Смотрящий
Аватара пользователя

Зарегистрирован: 30 авг 2009, 00:00
Сообщения: 1504
Откуда: Омск
SDHC :)

_________________
Автономный контроллер станка с ЧПУ: http://it-en.ru/cnc


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #5  Добавлено: 25 мар 2011, 12:45 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 15 мар 2010, 01:00
Сообщения: 424
Откуда: Краснодар
ну суть это не меняет....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #6  Добавлено: 25 мар 2011, 12:50 
Не в сети
Станкостроитель
Станкостроитель

Зарегистрирован: 28 фев 2011, 01:00
Сообщения: 244
.


Последний раз редактировалось Moonglow 30 ноя 2012, 14:00, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #7  Добавлено: 25 мар 2011, 14:24 
Не в сети
Смотрящий
Аватара пользователя

Зарегистрирован: 29 авг 2009, 00:00
Сообщения: 614
Откуда: Край земли (Камчатка)
Имя: Олег
Цитата:
либо используем MikroC

  Не в тему:
  Ох, koolhatcker ща увидит... :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #8  Добавлено: 25 мар 2011, 17:01 
Не в сети
Смотрящий
Аватара пользователя

Зарегистрирован: 30 авг 2009, 00:00
Сообщения: 1504
Откуда: Омск
  Не в тему:
  life, да я смирился уже :). Пока сами на грабли не наступят - хоть заобъясняйся...:)

_________________
Автономный контроллер станка с ЧПУ: http://it-en.ru/cnc


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #9  Добавлено: 26 мар 2011, 10:39 
Не в сети
Станкостроитель
Станкостроитель

Зарегистрирован: 28 фев 2011, 01:00
Сообщения: 244
  Не в тему:
  данный продукт часто обновляется.... про какие грабли речь ?... знаю много людей кто его использует .... включая большие проекты и вроде всё ОК.... в последних версиях новый оптимизатор кода... вроде даже ничего... может быть тыкните в чем проблема ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #10  Добавлено: 10 апр 2011, 21:38 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 01:00
Сообщения: 58
Откуда: Усть-Лабинск
Привет! А скажите, уважаемые гуру, существуют ли в природе карты памяти? Такого типо-размера как Голд или Силвер, но на борту памяти 8-64 Мб. Куда рыть? Задача стоит такая же как у Кулхацкера с его автономным станком... только применяться будет не в ЧПУ строении.

_________________
Девице - device!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #11  Добавлено: 10 апр 2011, 22:46 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 05 фев 2011, 01:00
Сообщения: 765
Откуда: Красноярск
Имя: Max
koolhatcker писал(а):
  Не в тему:
  life, да я смирился уже :). Пока сами на грабли не наступят - хоть заобъясняйся...:)

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

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


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #12  Добавлено: 10 апр 2011, 23:31 
Не в сети
Станкостроитель
Станкостроитель

Зарегистрирован: 27 дек 2009, 01:00
Сообщения: 1140
Откуда: Украина. Харьков
МК от 5 вольт, SD от 3,3
Карта подключена через резистивные делители.

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

У меня дисплей от сименса общается с МК по SPI на частоте 8 МГц. Придется при переключении с карты на дисплей менять настрйоки SPI каждый раз?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #13  Добавлено: 11 апр 2011, 12:50 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 22 сен 2010, 00:00
Сообщения: 123
Откуда: Москва
xumuk писал(а):
А какие должны быть настройки SPI ?
.. режим 0 или 3, частота 400 кГц
xumuk писал(а):
Придется при переключении с карты на дисплей менять настрйоки SPI каждый раз?
... после инициализации карта должна переваривать и 8 МГц, если нет используйте программный SPI


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #14  Добавлено: 16 апр 2011, 22:28 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 05 фев 2011, 01:00
Сообщения: 765
Откуда: Красноярск
Имя: Max
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 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
Сообщение #15  Добавлено: 16 апр 2011, 22:35 
Не в сети
Станкостроитель
Станкостроитель

Зарегистрирован: 28 фев 2011, 01:00
Сообщения: 244
.


Последний раз редактировалось Moonglow 30 ноя 2012, 13:57, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: МК + SD карта
Сообщение #16  Добавлено: 09 апр 2012, 10:48 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 31 авг 2009, 00:00
Сообщения: 51
Откуда: UA
Нужно считать координаты 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);
}

И всё бы ничего, но если файл превышает по размеру объем считываемого блока то, есстественно, будет ошибка в чении координат.
Как можно побороть данную проблемму? Если есть у кого наработки или соображения - пишите. Желательно с кодом - так мне легче разбираться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: МК + SD карта
Сообщение #17  Добавлено: 09 апр 2012, 11:24 
Не в сети
Смотрящий
Аватара пользователя

Зарегистрирован: 30 авг 2009, 00:00
Сообщения: 1504
Откуда: Омск
ChaiSER писал(а):
Как можно побороть данную проблемму?

Естественно только по окончании одного блока считывать следующий. Типа pf_lseek = pf_lseek+512 :).

_________________
Автономный контроллер станка с ЧПУ: http://it-en.ru/cnc


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: МК + SD карта
Сообщение #18  Добавлено: 09 апр 2012, 12:07 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 31 авг 2009, 00:00
Сообщения: 51
Откуда: UA
koolhatcker, пробовал, только блок не всегда заканчивался концом строки. ИМХО нужно как-то последнюю строку обрабатываемого блока с обрывом и неполную строку следующего блока загонять в отдельный буфер и уже из него считывать координаты. Или есть более правильный метод?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: МК + SD карта
Сообщение #19  Добавлено: 09 апр 2012, 14:20 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

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

_________________
Я не Христос, рыбу не раздаю. Но могу научить, как сделать удочку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: МК + SD карта
Сообщение #20  Добавлено: 09 апр 2012, 14:47 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 31 авг 2009, 00:00
Сообщения: 51
Откуда: UA
s3301, это понятно, осталось только в коде воспроизвести...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: МК + SD карта
Сообщение #21  Добавлено: 09 апр 2012, 15:08 
Не в сети
Смотрящий
Аватара пользователя

Зарегистрирован: 30 авг 2009, 00:00
Сообщения: 1504
Откуда: Омск
ChaiSER, так вам разжевать и положить?:)
Неужели самому не интересно?

_________________
Автономный контроллер станка с ЧПУ: http://it-en.ru/cnc


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: МК + SD карта
Сообщение #22  Добавлено: 09 апр 2012, 15:23 
Не в сети
Станкостроитель
Станкостроитель
Аватара пользователя

Зарегистрирован: 31 авг 2009, 00:00
Сообщения: 51
Откуда: UA
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;              //Чистим буфер
}

Где ошибка?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: МК + SD карта
Сообщение #23  Добавлено: 12 апр 2012, 10:37 
Не в сети
Смотрящий
Аватара пользователя

Зарегистрирован: 30 авг 2009, 00:00
Сообщения: 1504
Откуда: Омск
ChaiSER писал(а):
Где ошибка?

Может тут:
ChaiSER писал(а):
char row[] = {};
...
row[row_counter] = read_buf[i];

Компилятор не всегда думает так, как думаем мы :).
А может и в другом месте...

_________________
Автономный контроллер станка с ЧПУ: http://it-en.ru/cnc


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
Мобильная версия