Специалист
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
![]() ![]() ![]() ![]() |
Безусловно Вы правы. Другие МК брать незачем.
Но лишний кругозор ТС не помешает, и я лишь добавил, что программная реализация USB описана самим производителем МК в appnote, а значит есть и «примерочный» код :-) (example code) где-то на сайте Atmel, и стартовые проекты ПО под Windows, рекомендованные самим производителем для изучения. Причём исходники для МК скорее всего есть на Си безотносительно среды разработки (или даже платформы). Я уже молчу про форумы техподдержки (правда, англоязычные), где такие вопросы регулярно поднимаются. И раз уж поднята тема USB, решил я, не упомянуть всего многообразия кремниевого «животного» мира МК было бы предосудительным. Также в теме ни разу не прозвучало заманчивое слово Arduino. Гигантское количество кода, написанного для данной аппаратной платформы, может существенно помочь ТС избежать изнурительных чтений документации. Вот и бегущую строку упомянули, а ведь стоило это сделать раньше, но как мне кажется, проблемы вырастут не со стороны МК. Выбор решения всегда за ТС и текущая задача, в данной постановке ТС, показать многовекторность в выборе направления движения. Я прав? Ведь не сразу поймешь, начиная новую работу, где искать и что придётся по душе. Более конкретных вопросов пока не последовало. Интересное устройство должно получится. Необычное. Всегда приятно поучаствовать в создании нового (по назначению), хоть и совсем косвенно – в обсуждении. |
||
Оценка
|
Новичок
Регистрация: 12.03.2014
Сообщений: 11
Репутация: 10
![]() |
Если писать ПО для компьютера, тогда нужно учесть особенности работы регистра 74HC595. И вот здесь у меня ступор: получается, что нужно делать так: 0 на MR, 1 на ST; 1 на MR (до конца цикла записи), биты идут в DS, a 1 на SH их "выпускает". Затем защёлкнуть 1-цей на ST и повторить тот же цикл с другими переменными.
Правильно ли я понимаю, что данный алгоритм нужно прописать в программе на компьютере, или же подачей 0 и 1 на такие ноги, как ST, SH, MR займётся мк, а от компьютера требуется лишь сформировать нужные переменные для ноги DS? P.S. Задумался об adruino. |
||
Оценка
|
Специалист
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
![]() ![]() ![]() ![]() |
Не думайте о регистрах, об этом позаботится МК.
Задача ПО на компьютере – передать массив из 11 байт (пускай для простоты у Вас только 88 светодиодов), причем каждая клавиша из полных 7 октав инструмента занимает какое-то место в этом «потоке» бит, как-то так: 10101000, 10000100, … , 00000000, 00000000 (1 - нажата, 0 - не нажата). В программе МК (не важно как получены данные – UART, USB) заведён массив из 11 однобайтовых элементов. Как только данные получены и массив заполнен свежими данными (скажем, выставлен какой-то флаг-переменная), вызывается функция вывода данных в регистры. Вот быстрый набросок, чтобы не бать голословным, используем COM-порт: Код:
#include <avr/io.h> #include <avr/interrupt.h> void hardware_init(void); void interrupts_init(void); void hc595_light(uint8_t digits_mas[]); volatile char v_new_data_flag = 0x00; volatile int v_i = 0; uint8_t data_mas[11]; int main() { hardware_init(); // Настраиваете всё нужным образом interrupts_init(); sei(); while(1) { if(v_new_data_flag == 0x01) // Если пришли новые данные { hc595_light(data_mas); // Вывод данных v_new_data_flag = 0x00; // Cброс флага } } } void hardware_init(void) { // Инициализация всего, что может понадобится } void interrupts_init(void) { // Аналогично } // Обработчик прерывания при приёме данных по UART ISR(USART_RX_vect) { data_mas[v_i] = USART_receive(); // Принимаем байт, считываем UDR v_i++; // Наращиваем счётчик, он же - индекс массива if(v_i>=11) // Если приняты все 11 байт { v_new_data_flag = 0x01; // Выставляем флаг и возвращаемся к нулевому индексу, v_i = 0; // так что следующий принятый байт запишется в data_mas[0] } } void hc595_light(uint8_t digits_mas[]) { for(int k=0; k<=10; k++) // 11 байт в массиве, все выводятся друг за другом { uint8_t mask = 0x80; for(int i=7; i>=0; i--) // Побитный вывод каждого байта в массиве { // Порядок вывода зависит от того, как формировали данные, как распаяны регист регистры if(digits_mas[k] & mask) sbi(SDI_PORT, SDI_PIN); // Если 1, то линию данных в 1 else cbi(SDI_PORT, SDI_PIN); // Если 0, то линию данных в 0 mask = mask >> 1; sbi(CLK_PORT, CLK_PIN); // Подняли тактовый _delay_us(2); cbi(CLK_PORT, CLK_PIN); // Опустили тактовый (запись по спадающему фронту) _delay_us(2); } } sbi(LE_PORT, LE_PIN); // Разрешаем запись в выходной буфер всех регистров hc595 _delay_us(2); cbi(LE_PORT, LE_PIN); // Запрет записи в выходной буфер до следующего обновления _delay_us(2); }
Последний раз редактировалось antonydublin; 29.03.2014 в 17:30.
|
||
Оценка
|
Новичок
Регистрация: 29.03.2014
Сообщений: 1
Репутация: 10
![]() |
Цитата:
Если писать ПО для компьютера, тогда нужно учесть особенности работы регистра 74HC595.
Но можно отказаться от МК подключив 74HC595 к COM порту. Но порт должен быть не в виде переходника, а не материнской плате компа, в крайнем случае на PCI плате расширения. На чем пишите кстати для ПК и МК? Цитата:
Задумался об adruino.
Использование МК более рационально и дешевле выйдет. А adruino это навязанная конфигурация, которая мало того что получится дороже, так и возможно что по некоторым параметрам будет недостаточна или наоборот, слишком избыточна. И кроме того, adruino ide, не торт и ей ищут аналоги. http://habrahabr.ru/post/151544/ Цитата:
А на сладкое — код, компилируемый в bascom значительно меньше по размеру и выполняется часто быстрее, чем код от Arduino IDE.
|
||
Оценка
|
Специалист
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
![]() ![]() ![]() ![]() |
Спасибо большое за замечание по Arduino. Сам весьма скептически отношусь к этой платформе. Но... ведь многим легче стартовать с конкретных примеров, обсуждаемых на http://arduino.ru/ - там много картинок :-), что само по себе хорошо. Многих может заинтересовать возможность работы с платой через Matlab (мне, к примеру, была интересна связка с Simulink - только как пример) и многое другое. А о скорости выполнения кода, очевидно, речь не идёт. Какая избыточность и недостаточность, к чему разговоры о рациональности... Более того, Паятель, посмотрите ветку с начала и Вы поймёте, что задаёте риторические вопросы:
Цитата:
На чем пишите кстати для ПК и МК?
С паяльником не дружите что ли? Думаю, к этому моменту ТС определился со средой для МК. Кстати, загляните вот на этот ресурс по Atmel - www.avrfreaks.net. Более "живой" базы знаний по AVR, наверное, не существует. Там тысячи проектов с исходными кодами, большинство под WinAVR (GCC компилятор) в связке с AVR Studio.
Последний раз редактировалось antonydublin; 29.03.2014 в 22:28.
|
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |