подключение к USB

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

SBIT - это не то, что Вам надо для настройки пора. SBIT объявляет имя бита в области памяти с побитовым доступом. Она определена в файле compiler_defs.h.

Настройка портов у меня в программе производится в функции Port_Init(). Код там совершенно аналогичем АСМовскому, вместо оператора "mov" используется "=" и это вся разница. У Гладштейна все разжевано и в ДШ тоже. Помимо них, скачайте с сайта Силлабов программу конфигуратора системы Config2. С помощью ее графического интерфейса порты настроить просто. Упомяну лишь, что в отличии от других МК, в C8051 имеется коммутатор ресурсов (XBar) и специальный регистр PхSKIP, где нужно поставить единицы в пинах отведенных по I/O, т.к. иначе они будут подключены к перферийным модулям. Вообще я очень советую начать с программы мигания светодиодом и управления ими от кнопок для хорошего понимания конфигурации портов. Посмотрите здесь мои демонстрашки.
http://mcs.uwsuper.edu/sb/327/Projects/2011/Demo/
Реклама
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Прошу прощения, видимо я не так объяснил. Порты я настроил, я не могу найти, как подать 0 или 1 на ногу порта или считать из нее :oops:
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Для записи 1 в порт P0 пин 0 (P0.0) используйте конструкцию
P0 |= 0x01;
Для записи 0 туда-же,
P0 &= 0xFE;
Для чтения с того-же пина используйте условный оператор
if (P0 & 0x01)
...
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Ser60, прошу прощения, если уже надоел :oops: , но у меня опять проблема:
СпойлерInvoking project defined compiler.
C:\SiLabs\MCU\Keil\C51\BIN\C51.exe "USB_MAIN.c" DB OE BR INCDIR(C:\SiLabs\MCU\Inc)


C51 COMPILER V8.06 - SN: Eval Version
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2007
*** ERROR C202 IN LINE 192 OF USB_MAIN.C: 'USB_MfrStr': undefined identifier
*** ERROR C141 IN LINE 220 OF USB_MAIN.C: syntax error near ';'
*** ERROR C141 IN LINE 220 OF USB_MAIN.C: syntax error near ')'


C51 COMPILATION COMPLETE. 0 WARNING(S), 3 ERROR(S)
Link in progress...
C:\SiLabs\MCU\Keil\C51\BIN\BL51.EXE @"C:\Users\Petr\Desktop\USBXpress\MK\cyglink.txt"


BL51 BANKED LINKER/LOCATER V6.05 - SN: Eval Version
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2007
"C:\Users\Petr\Desktop\USBXpress\MK\USBX_F38X.LIB",
"C:\Users\Petr\Desktop\USBXpress\MK\USB_MAIN.obj" TO "C:\Users\Petr\Desktop\USBXpress\MK\USB" RS(256) PL(68) PW(78)

*** FATAL ERROR L210: I/O ERROR ON INPUT FILE:
EXCEPTION 0021H: PATH OR FILE NOT FOUND
FILE: C:\Users\Petr\Desktop\USBXpress\MK\USB_MAIN.obj
Generating hex file...
C:\SiLabs\MCU\Keil\C51\BIN\oh51.EXE "C:\Users\Petr\Desktop\USBXpress\MK\USB"


OBJECT TO HEX FILE CONVERTER OH51 V2.6
COPYRIGHT KEIL ELEKTRONIK GmbH 1991 - 2001

GENERATING INTEL HEX FILE: C:\Users\Petr\Desktop\USBXpress\MK\USB.hex

*** ERROR: PREMATURE END OF FILE ON 'C:\Users\Petr\Desktop\USBXpress\MK\USB'
*** OH51 ABORTED.
Вложения
USB_MAIN.c
(7.78 КБ) 303 скачивания
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Коррекция в attachment. Насчет остальных ошибок - у F340 нет порта P5.
test.c
(7.78 КБ) 198 скачиваний
Реклама
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Большое спасибо! про порт 5 я понял уже когда написал. К вечеру голова плохо соображает, имел в виду 5 пин, а написал 5 порт :)
Контактная информация:
Реклама
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Ser60, Вы не могли бы объяснить конструкцию с двумя таймерами? Я так понял, что на выходе первого таймера генерируется частота 50Гц, а второй, в соответствии со значением байта, ответственного за значение кода, выдает его "порциями" на соответствующую ногу МК. А не проще будет сделать внешний генератор типа такого: http://radiokot.ru/forum/viewtopic.php?f=22&t=32512 и от него выводить частоту через транзистор, управляемый МК?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Точнее, выход первого таймера идет наружу, а второй таймер включает и выключает первый. Можно, конечно, и как Вы предлагаете сделать, но это решение будет избыточным в плане лишних деталей (генератор и ключевой транзистор), т.к. весь этот функционал уже присутствует в МК. Я понимаю, что у Вас сжатые сроки, но ...

Начите с настройки первого таймера на 50 гц и добейтесь зыдачи этой частоты на ногу МК (см. книгу Гладштейна). Когда с этим разберетесь, напишите код как-бы Вы управляли внешним ключевым транзистором и выведите соответствующие сигналы на другую ногу МК. После этого пришлите код для дальнейшего обсуждения.
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

У Гладштейна приведена формула для расчета кода перезагрузки таймера T=256-SYSCLK/12*2*F где SYSCLK - частота синхронизации МК, F - требуемая частота. У меня получилось: 256-48000000/12*2*50=256-400000000=-399999744 :shock: . Нашел, что можно частоту SYSCLK делить на 48 но все равно получается гигантское число 99999744. Я правильно понимаю что надо будет использовать 16 битный таймер и флаг переполнения?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Даже если использовать USB частоту 48 мгц для system clock, то после ее деления на 48 прескейлером таймера олучите 1 мгц на выходе. Чтобы получить из нее требуемые 50 гц, таймер должен будет делить ее на 20000, что реально сделать 16-битным тамером. Кроме того, зачем Вам така большая тактовая частота процессора для данного приложения? Можно для генерации USB частоты использовать внутренний генератор на 12 мгц с PLL х4, а процессор питать от этого-же генератора с предделителем на 8, т.е. тактовая чатота CPU будет всего 1.5 мгц и из ее можно будет сразу получить 50 гц с помощью 16-битного таймера даже без прескейлера. Короче, вариантов много. И да - нужно использовать 16-битный таймер.
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Да, прошу прощения, не туда посмотрел в ДШ :oops: а для 1,5МГц получается частота таймера будет 31250Гц (SYSCLK/48)?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Да, 1500000 / 48 = 31250 гц.
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Вы не могли бы объяснить, как в Си указываются прерывания? Я в коде вне цикла запустил таймер, установил значения, как дальше разрешить прерывания (нашел у Гладштейна что прерывание по переполнению таймера0 разрешается битом TF0, это то, что мне надо?) и указать что делать при прерывании (если я правильно понял, то это вектор прерывания)?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

По поводу синтаксиса прерываний в С компиляторе от Keil см. туториал
http://www.keil.com/support/man/docs/c5 ... tfuncs.htm
Настроить работу таймеров, включая настройку прерываний можно при помощи Config2. В архитектуре С8051 выход таймера не имеет прямого выхода на выводы корпуса. Поэтому для генерации частоты с помошью таймеров следует в прерывании изменять состояние соответствующего пина корпуса (0 на 1 и 1 на 0). При этом период переполнения таймера должен соответствовать полупериоду генерируемой частоты. Используйте 16-битный режима таймера 2 с автозагрузкой и будет Вам счастье.
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Доброго времени суток! Прочитал ту статью, что Вы прислали, но к сожалению я не очень силен в техническом английском, по этому Вы не могли бы посмотреть обработчик прерывания, который я написал и указать если что то не так

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

void timer3isr (void) interrupt 14
{
if (alsn1=0)
    {P0 |=0x80;
	 alsn1=1;}
	 else {
	 P0 &=0x7F;
	 alsn1=0;}
}
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Похоже, верно. Иднако, если единственной целью обработчика прерываний является инвертирование пина P0.7, я-бы вместо IF-оператора написал
P0 ^= 0x80;
где ^ это логический оператор XOR. В этом случает вспомогательная переменная alsn1 не нужна.
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Спасибо! Еще возник вопрос: у Гладштейна в таблице прерываний указан бит разрешения прерывания по переполнению таймера3 ET3, однако когда я пытаюсь туда поставить единицу, то компилятор выдает ошибку. При этом таймер2 (бит ET2) работает. И еще: можно ли применять оператор switch - case с переменными и можно ли в нем использовать вложенное условие?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Это потому, что у этих таймеров биты разрешения прерываний находятся в разных регистрах:
у Timer2 в регистре IE с побитовым доступом
у Timer3 в регистре EIE1 без побитного доступа
Кроме того, флаги прерываний у Timer3 находятся в регистре TMR3CN без побитного доступа. Поэтому, если хотите погасить флаг прерывания (а это обязательно надо делать в теле ISR), используйте конструкцию
TMR3CN &= 0x3F;
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Понял. А его (флаг прерывания) надо гасить в конце обработчика?
Вот я написал два обработчика, один для генерирования частоты 50Гц, второй для управления транзисторным ключом. делал по этой картинке: http://ukrtranssignal.com.ua/wp-content ... TSHC_3.jpg Переменная alsn хранит значение кода (З, Ж, КЖ, или отсутствие кода) alsn1 хранит номер блока передачи (от которого зависит наличие частоты на рельсах и длительность) и alsn2 хранит время, в течении которого уже передается данный блок.
получилось 155 строк, поэтому прикладываю файл
Вложения
прерывания.txt
(1.8 КБ) 211 скачиваний
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Насчет прерываний, на стр. 90 ДШ в таблице 9.4 указано какие флаги гасить надо, какие нет. Согласно ей, флаги таймеров 2 и 3 гасить надо.

Насчет последовательностей, подключите осциллограф на ногу МК и посмотрите что там творится. В любом случае мне не ясно какой тип кода генерируете - 5 или 7 или оба? И что такое номер блока? Что такое блок вообще? В каких единицах выражены длительности интервалов на картинке? Какой частотой питаются таймеры 2 и 3? Я-бы сначала написал код для одного цвета, скажем ЗЕЛ а потом по аналогии дальше. Иначе в программе, да еще и без комментариев Ч ногу сломит. И вообще, в чем состоит Ваш вопрос связанный с присылкой этого кода?
Ответить

Вернуться в «Интеграция с ПК»