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

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

Сообщение PetrB09 »

Да, я про USBXpress, а про ШИМ я имел ввиду что из 63 байтов надо заранее отвести 5 на ШИМ. И Вы не могли бы скинуть ссылку, где почитать об АЦП и о том, как с помощью одного АЦП измерять несколько каналов?
P. S. Огромное спасибо за помощь, прошу прощения, если надоел со своими вопросами :oops:
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Пожалуйста. Про АЦП лучший источник - это ДШ на F340. Однако, если Вы никогда не читали подобной технической литературы, да еще и на английском, почитайте главы про АЦП в книге Гладштейна. По-моему там такая есть. Кто-то из местных Котов приводил ссылки на перевод ДШ на русский, но не помню кто именно и для какого МК, но точно для каких-то силлабовских. Может они откликнутся, прочитав это.

Измерять несколько каналов одновременно нельзя, т.к. в F430 имеется только 1 АЦП. Но можно переключать входы АЦП с помощью встроенного мультиплексора входов для измерений разных величин по очереди.
Реклама
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

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

Сообщение Ser60 »

Вы на правилном пути. Разница между этими МК небольшая. А ДШ положите в сундук Кота, может кому и пригодится.

Добавлено позже: заглянул сейчас в сундук - там уже есть несколько ДШ на другие МК серии C8051. Ваш перевод был-бы неплохим дополнением к той коллекции.
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Доброго времени суток! Возникли вопросы: АЦП 10 битный, то есть надо будет результаты записать в 2 байта и их отправить? и еще я правильно понимаю, что для правильной записи результата опроса кнопок через сдвиговый регистр надо использовать побитовую адресацию? И не могли бы Вы объяснить, что значит ошибка "ERROR: PREMATURE END OF FILE ON 'C:\Users\Petr\Desktop\USBXpress\MK\USB" ?
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Доброго! По поводу АЦП - если нужны все 10 бит, то для пересылки их куда-то, конечно, нужно 2 байта. Я не знаю, что Вы измеряете с АЦП, но может Вам будет достаточно и 8-битной точности. В этом случае просто отбросьте 2 младших бита кода АЦП.

Насчет опроса кнопок не понял вопроса. Нарисуйте схемку как Вы опрашиваете кнопки с помощью регистров сдвига.

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

Сообщение PetrB09 »

Идея со сдвиговыми регистрами отсюда: http://easyelectronics.ru/podklyuchenie ... strax.html
Я использую компилятор Keil, парность скобок проверял в notepad++, все в порядке. Сейчас заметил что там в начале он еще ошибку выдает, она просто вверх улетела, я ее и незаметил :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 C141 IN LINE 94 OF USB_MAIN.C: syntax error near 'void'
*** ERROR C141 IN LINE 188 OF USB_MAIN.C: syntax error near 'void'

C51 COMPILATION COMPLETE. 0 WARNING(S), 2 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.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Очень резонный подход с опросом кнопок. После 8 циклов получите код нажатых кнопок. Далее в программе можно использовать констрикции типа
if (code & 0x01) ...
для определения какая кнопка нажата. Вообще, если пишете на С, никакой адресации там нет. Если на АСМе, то для конструкций типа вышеприведенных побитовая адресация также не используется. Но можно ее и использовать, если сохранить code в области RAM с побитовым доступом.

Компилятор рапортует ошибки в строках 94 и 188 программы - ищите в них или около.
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Да, я на Си пишу. в 94 строке ошибку исправил, там void дважды повторялся, а со 188 не могу понять, она после комментария, дальше кусок вашей программы из статьи, который я еще не трогал, а так я в вашу программу добавил кусок с переменными в начале, и заменил конфигурацию портов ввода/вывода с помощью Configuration wizard 2
Спойлер

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

// Example ISR for USB_API
INTERRUPT(USB_API_TEST_ISR, INTERRUPT_USBXpress)
{
   U8 INTVAL = Get_Interrupt_Source();

   if (INTVAL & RX_COMPLETE)
   {
      	Block_Read(Packet, 3);
		if (Packet[0] == 0)				// receive data
		{
			if (Packet[1] != 0)
			{
				led_status[0] = 1 - led_status[0];
				Led1 = led_status[0];
			}
			if (Packet[2] != 0)
			{
				led_status[1] = 1 - led_status[1];
				Led2 = led_status[1];
			}
		}
		else							// send data
		{
	    	Packet[0] = 0;
			Packet[1] = led_status[0];
			Packet[2] = led_status[1];
			Block_Write(Packet,3);
		}
   }

   if (INTVAL & DEV_SUSPEND)
   {
        USB_Suspend();
   }

   if (INTVAL & DEV_CONFIGURED)
   {
      Port_Init();
   }
}
}
И про конструкцию if (code & 0x01) я не совсем понял, как она работает
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

В конце приведенного кода стоит лишняя скобка "}"

code & 0x01 - это побитовая операция в С. Результат ее трактуется компилятором как логическая величина. Если 0 - то это false, если не 0, то true. Смысл операции - определить бит 0 (самый левый, или lsb) переменной code, соответствующий одной из кнопок.
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

скобку убрал, а все равно ругается :( . Пишет
Спойлер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 C141 IN LINE 188 OF USB_MAIN.C: syntax error near 'void'

C51 COMPILATION COMPLETE. 0 WARNING(S), 1 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, которые я не трогал
СпойлерSBIT(Led1, SFR_P1, 4); // LED='1' means ON
SBIT(Led2, SFR_P1, 5);
U8 Packet[3] = {0,0,0}; // Last packet received from host
U8 led_status[2] = {1,1}; // initially both LEDs are on
char adc0; //положение крана усл№254
char adc1; //датчик давления ГР
char adc2; //датчик давления УР
char adc3; //датчик давления ТМ
char adc4; //датчик давления ТЦ
char kont; //положение кулачков контроллера
char k395; //положение крана усл№395
int cu; //положение автоматов на ПУ
int cu1; //положение автоматов в дизельном помещении
long vu; //положение кнопок/переключателей на ПУ
int sk; //скорость
int v1; //напряжение генератора
int v2; //ток генератора
int v3; //ток батареи
int v4; //напряжение батареи/ЭПТ
char i; //счетчик циклов

//-------------------------
// Port_Init
//-------------------------
// Port Initialization
// - Configure the Crossbar and GPIO ports.
//
void PCA_Init()
{
PCA0MD &= ~0x40;
PCA0MD = 0x00;
PCA0CPM0 = 0x42;
PCA0CPM1 = 0x42;
PCA0CPM2 = 0x42;
PCA0CPM3 = 0x42;
PCA0CPM4 = 0x42;
PCA0CPH0 = 0xFD;
PCA0CPH1 = 0xFD;
PCA0CPH2 = 0xFD;
PCA0CPH3 = 0xFD;
PCA0CPH4 = 0xFD;
}

void ADC_Init()
{
ADC0CN = 0x80;
}

void Port_IO_Init()
{
// P0.0 - CEX0 (PCA), Push-Pull, Digital
// P0.1 - CEX1 (PCA), Push-Pull, Digital
// P0.2 - CEX2 (PCA), Push-Pull, Digital
// P0.3 - CEX3 (PCA), Push-Pull, Digital
// P0.4 - CEX4 (PCA), Push-Pull, Digital
// P0.5 - Unassigned, Open-Drain, Digital
// P0.6 - Unassigned, Open-Drain, Digital
// P0.7 - Unassigned, Open-Drain, Digital

// P1.0 - Unassigned, Open-Drain, Digital
// P1.1 - Unassigned, Open-Drain, Digital
// P1.2 - Unassigned, Open-Drain, Digital
// P1.3 - Unassigned, Open-Drain, Digital
// P1.4 - Unassigned, Open-Drain, Digital
// P1.5 - Unassigned, Open-Drain, Digital
// P1.6 - Unassigned, Open-Drain, Digital
// P1.7 - Unassigned, Open-Drain, Digital

// P2.0 - Unassigned, Open-Drain, Analog
// P2.1 - Unassigned, Open-Drain, Analog
// P2.2 - Unassigned, Open-Drain, Analog
// P2.3 - Unassigned, Open-Drain, Analog
// P2.4 - Unassigned, Open-Drain, Analog
// P2.5 - Unassigned, Open-Drain, Digital
// P2.6 - Unassigned, Open-Drain, Digital
// P2.7 - Unassigned, Open-Drain, Digital

// P3.0 - Unassigned, Open-Drain, Digital
// P3.1 - Unassigned, Open-Drain, Digital
// P3.2 - Unassigned, Open-Drain, Digital
// P3.3 - Unassigned, Open-Drain, Digital
// P3.4 - Unassigned, Open-Drain, Digital
// P3.5 - Unassigned, Open-Drain, Digital
// P3.6 - Unassigned, Open-Drain, Digital
// P3.7 - Unassigned, Open-Drain, Digital

P2MDIN = 0xE0;
P0MDOUT = 0x1F;
XBR1 = 0x45;
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
PCA_Init();
ADC_Init();
Port_IO_Init();
}


//-----------------------------------------------------------------------------
// Main Routine
//-----------------------------------------------------------------------------
void main(void)
{

USB_Clock_Start(); // USB clock *before* calling USB_Init
USB_Init(USB_VID,USB_PID,USB_MfrStr,USB_ProductStr,USB_SerialStr,
USB_MaxPower,USB_PwAttributes,USB_bcdDevice);

CLKSEL |= 0x02;
RSTSRC |= 0x02;

USB_Int_Enable();

while (1)
{ }


// Example ISR for USB_API
INTERRUPT(USB_API_TEST_ISR, INTERRUPT_USBXpress)
{
U8 INTVAL = Get_Interrupt_Source();

if (INTVAL & RX_COMPLETE)
{
Block_Read(Packet, 3);
if (Packet[0] == 0) // receive data
{
if (Packet[1] != 0)
{
led_status[0] = 1 - led_status[0];
Led1 = led_status[0];
}
if (Packet[2] != 0)
{
led_status[1] = 1 - led_status[1];
Led2 = led_status[1];
}
}
else // send data
{
Packet[0] = 0;
Packet[1] = led_status[0];
Packet[2] = led_status[1];
Block_Write(Packet,3);
}
}

if (INTVAL & DEV_SUSPEND)
{
USB_Suspend();
}

if (INTVAL & DEV_CONFIGURED)
{
Port_Init();
}
}
А про конструкцию if (code&0x01) Вы имеете ввиду что на выходе из цикла будет 8 байт, которые потом с помощью ее "загонять" в один?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Скиньте весь исходник полностью, я посмотрю.

Когда Вы получите байт code из регистра сдвига опроса кнопок, что Вы с ним будете делать? Наверное захотите узнать нажата-ли какая-либо кнопка и если да, то какая именно? Если так, можно сначала проверить этот байт на равенство 0xFF. В случае равенства ни одна из кнопок не нажата. В противном случае условие
if (!(code&0x01))
будет выполнено если нажата кнопка соответствующая биту 0 переменной code. Далее, условие
if (!(code&0x02))
будет выполнено если нажата кнопка соответствующая биту 1 переменной code. Далее, условие
if (!(code&0x04))
будет выполнено если нажата кнопка соответствующая биту 2 переменной code. И так далее, условие
if (!(code&0x80))
будет выполнено если нажата кнопка соответствующая биту 7 переменной code. Там где Вы читали про идею разве все это не написано?
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Все, разобрался, спасибо!
Вот исходник
Вложения
USB_MAIN.c
(5.94 КБ) 369 скачиваний
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

В программе нашел 2 ошибки, помеченные ############ на картинке внизу. Функцию для инициализации портов должна называться Port_Init() и отсутствует закрывающая скобка в конце main(). После этого все компилируется нормально.
f340.png
(28.27 КБ) 312 скачиваний
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

Большое спасибо, а еще Вы не знаете, как можно реализовать вывод вот таких кодировок на частоте 50 Гц http://commons.wikimedia.org/wiki/File: ... uselang=ru (надо что бы в зависимости от команды компьютера контроллер выдавал один из кодов). И еще я правильно понимаю что все опросы кнопок, расчеты, сдвиги надо делать в цикле while(1) который в ваших исходниках пустой?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Реализовать последовательности можно, например, с помошью двух таймеров. Один из них генерирует несущую частоту, а другой отвечает за длительности посылок.

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

Сообщение PetrB09 »

А у меня все 5 таймеров используются для ШИМ, то есть придется делать внешний?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Для ШИМ у Вас используются не таймеры, а модули PCA. В F340 есть еше 4 нзависимых от PCA таймера, задействуйтe их.
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 14, 2012 21:13:42
Откуда: Санкт-Петербург

Сообщение PetrB09 »

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

Сообщение PetrB09 »

Доброго времени суток! Сейчас писал часть программы ответственную за опрос регистров и вывод данных на дешефратор для ламп, и внезапно понял, что не знаю, как работать с портами ввода-вывода :oops: . Полез к Гладштейну, а у него примеры на ассемблере, гугл знает только про AVR, в ДШ описаны только настройки портов, а как с ними работать - не нашел. У Вас в исходнике нашел такой фрагмент:

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

SBIT(Led1, SFR_P1, 4);                 	// LED='1' means ON
SBIT(Led2, SFR_P1, 5);
сравнив со схемой понял что здесь указывается название действующих ног МК и дальше в программе употребляются только их имена. Вы не могли бы пояснить, что в этой конструкции за что отвечает
Контактная информация:
Ответить

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