Страница 1 из 2

ШИМ + UART как быть с пк

Добавлено: Чт мар 26, 2009 19:11:53
demson
доброго времени суток.
итак имеется МК соединенный с ПК по uart. необходимо вывести на МК 3 байта, первый байт разобрать на биты, если первый бит 1 вотрой бит 0 третий бит 1 то следующие 2 байта являются значениями которые необходимо вывести на 2 шима.
непонятно как взаимодействовать с пк из приложения, ведь пересылаются символы. а надо еще и разбить на биты.
помогите с куском кода.
PS пишу на С

Добавлено: Чт мар 26, 2009 19:21:50
ikarab
Надо принять символы-байты в буфер и потом их разобрать - какие биты в них. Парсинг команд - называется.

Пример приема команд по UART с ПК на Си есть в PROTEUS - это пример AN696. в папке Proteus\SAMPLES\VSM MPLAB Viewer\App Notes\AN696

Я очень советую вам скачать и использовать PROTEUS 7.4 sp3 с лекарством 1.6.5
PROTEUS позволяет ВИДЕТЬ что происходит ВНУТРИ микроконтроллера - это интересно и полезно при отладке.

Разбор команды начинается со строк

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

if(PIR1bits.RCIF)				
{
   switch(udata = RCREG)
Весь исходник прицеплен.

Подробно работу с UART USART AVR на Си недавно обсуждали в "МЯУУУУ" - прием и передача данных.
http://radiokot.ru/forum/viewtopic.php?p=194982#194982

Анализ битов проводят с помощью битовых операций с масками - с числами типа 0b00101110

Добавлено: Пт мар 27, 2009 12:13:01
demson
putsf("OK_START");
while (1){
st_bit = getchar() ;
st_bit = (3<<st_bit); //взять первые 3 бита из переменной
if(st_bit == 5) //101
{
znX=getchar();
znY=getchar();
OCR1AL = znX+read_adc(0);
OCR1BL = znY+read_adc(2);
putsf("OK");
} else { putsf("error"); };
};
не уверен что написал правильно, поправьте как должно быть.

Добавлено: Пт мар 27, 2009 23:25:00
demson
чтото никто не отвечает :cry: приходится самому ответ искать:
  • putsf("OK_START");

    while (1){


    st_bytte = getchar() ;
    OCR1AL = znX+(read_adc(0)+read_adc(1)/4);
    OCR1BL = znY+(read_adc(2)+read_adc(3)/4);


    st_bit0 = st_bytte & 0b10000000; // стартбит


    st_bit1 = st_bytte & 0b01000000; //
    st_bit2 = st_bytte & 0b00100000; //
    st_bit3 = st_bytte & 0b00010000; //
    st_bit4 = st_bytte & 0b00001000; //
    st_bit5 = st_bytte & 0b00000100; //
    st_bit6 = st_bytte & 0b00000010; // резерв
    st_bit7 = st_bytte & 0b00000001; // резерв
    if(st_bit0>0 & st_bit1==0 & st_bit2>0) //101
    {
    if(st_bit3>0) {blanking=1;} else {blanking=0;};
    if(st_bit4>0) {PORTC.4 = 1;} else {PORTC.4 = 0;};
    if(st_bit5>0) {PORTC.5 = 1;} else {PORTC.5 = 0;};
    znX=getchar();
    znY=getchar();
    putsf("OK");
    st_bytte=0;
    } else { putsf("error");
    };
    };
вобщем вот

итак возник вопрос как и чем и что отправлять с компа (в планах на basic)чтобы МК принял 160 а не 1 потом 6 потом 0 !

Добавлено: Сб мар 28, 2009 02:04:29
ikarab
demson писал(а): как и чем и что отправлять с компа (в планах на basic)
Специальные проги есть для работы с приборами через COM порт.
Посмотрите - вот 3 программы
http://kazus.ru/forum/topics/f_76711.html#76711
demson писал(а): чтобы МК принял 160 а не 1 потом 6 потом 0 !
Дак отправьте 160 он и примет 160.

Добавлено: Пн мар 30, 2009 15:06:09
demson
программа виснет при попытке отправить что-либо на мк грешу на переходник usb - com причем если мк отцепить все отлично, если замкнуть rx tx эхо идет без ошибок. в чем может быть дело?

Добавлено: Пн мар 30, 2009 17:17:38
demson
заработало но косо: с мк передает сообщение "error" а комп принимает сплошные нули от чего это может быть?

Добавлено: Пн мар 30, 2009 17:21:21
МитяРа
Может быть при несовпадении скоростей...

Добавлено: Пн мар 30, 2009 17:28:18
demson
нет скорости одни и те-же даже в симуляторе vmlab работает. а как всетаки передать с компа число 1101 1111 или BF
чтобы мк его принял как единое целое а не b и f.

вот еще исходник гляньте может в нем что косо.

Добавлено: Пн мар 30, 2009 18:39:14
МитяРа
Может и форматы не совпадать..
Обычно для ПК это:
1бит - стартовый,
8бит - данные,
1бит - чётность,
1бит - стоповый...
Проверь, как на МК запрограммировано..
У тя в программе например указано - нет чётности..
Сам те по твоему МК подсказать не смогу - сам работаю только с МК51 семейством...

Добавлено: Пн мар 30, 2009 18:40:37
ikarab
demson писал(а): а как всетаки передать с компа число 1101 1111 или BF чтобы мк его принял как единое целое а не b и f.
Из проги терминальной для COM порта передасть число 0хBF или BFh

Удобные программы для COM порта есть в "Связь COM порта ПК и USART МК AVR" - http://radiokot.ru/forum/viewtopic.php?p=198337#198337

Добавлено: Вт мар 31, 2009 20:11:48
demson
нашел проблему номер 1 - не встали фьюзы при первой прошивке, а больше я их и не смотрел :cry: вобщем так и тактовался мк от своего 1 мГц генератора, исправил теперь тактутся от кварца 16 мГц но проблема с usart не решилась. теперь думаю что не исправен переходник usb-com. вот так вот. скоро за мах232 поеду. :))

Добавлено: Вт мар 31, 2009 22:13:22
Negor
Чтобы проверить ком порт нужно замкнуть пины 2 и 3 на разьёме. Таким образом ПК будет принимать то, что отправит. И если в терминале(именно это вам и нужно попробуйте PuTTY - хороший терминал. В личке помогу настроить) Вы увидите то, что отправите. Например набрали "G" а в терминале будет "GG". Чтобы отправить байт 160(0xA0 или 0b10100000) нужно по таблице ASCII символов найти символ с таким кодом. Ещё хочу добавить что обычно для проверки правильности связи МК и ПК по UART'у обычно на Си пишут такой код

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

putchar(getchar());
Таким образом если скорости выставлены правильно и связь налажена верно то на терминале вы топять таки должны получить то что и отправляли.[/b]

Добавлено: Ср апр 01, 2009 13:50:53
demson
тобы проверить ком порт нужно замкнуть пины 2 и 3 на разьёме.
это работает принимает нормально без косяков.

Добавлено: Ср апр 01, 2009 17:15:02
МитяРа
а) попробуй "зациклить" передачу одного байта с МК и посмотри длительность посылки..
б) потом "зациклить" передачу одного байта с компа и тоже посмотри длительность посылки..
Думаю всё-же у тя - несовпадение скоростей..

Добавлено: Ср апр 01, 2009 19:46:10
demson
putchar(getchar());
опа не принимает ничего!

при попытке отослать на ПК строку putsf("OK"); на ПК полный бред.

Добавлено: Сб апр 04, 2009 22:20:55
demson
вобщем переходник usb-com не являлся таковым. Спаял avr 309 все работает замечательно.
вечно все проблемы от подделок!!!! 8)

Re: ШИМ + UART как быть с пк

Добавлено: Ср апр 11, 2012 14:10:33
Hitalik
Люди помогите всё не допрёт, до меня вот реализован UART и шим; делаю так
OCR1B = 300;
так работает;
ну или

if(UDR=='1')
OCR1B = 300;
тоже работает но только я делаю типо такого
OCR1B = UDR; ну к примеру.
пробовал всякие преоброзования и всё такое... ШИМ таким оброзом не работает, что упустил, ну и сам вопррос то
как получть число с UDR и отправить OCR1B ;

Re: ШИМ + UART как быть с пк

Добавлено: Ср апр 11, 2012 15:49:10
Engineer_Keen
UART настроен? Скорости совпадают? Процедура обработки приема данных через UART есть? Учитывается что OCR1B - 16 разрядный, а UDR - 8 разрядный?

Re: ШИМ + UART как быть с пк

Добавлено: Ср апр 11, 2012 18:50:38
phanis
Может лучше сделать работу с двойным буфером. И отправлять количество требуемых байт в комп(запрос), когда нужно заполнить один из буферов.
В буфер складывать по прерыванию юсарта.
Из буфера читать в шим по прерыванию таймера.
С данными работать в виде структуры. Битовые поля.