Форум РадиоКот https://radiokot.ru/forum/ |
|
Последовательний ввод https://radiokot.ru/forum/viewtopic.php?f=20&t=52946 |
Страница 1 из 1 |
Автор: | Transistor [ Пн авг 15, 2011 21:34:53 ] |
Заголовок сообщения: | Последовательний ввод |
Подскажите как на СЯх для Пика сделат последовательний ввод даних с одной ножки, те считать 8 бит в одну перемену. П.С. Лутше кусок кода влепите. |
Автор: | Аlex [ Пн авг 15, 2011 22:57:55 ] |
Заголовок сообщения: | Re: Последовательний ввод |
Как-то примерно так. Код: char var=0, i; Циклично двигаем переменную и, в зависимости от состояния порта (в данном случае это RB0), устанавливаем 0-вой бит в переменной.
for (i=0;i<8;i++){ var <<= 1; if( RB0 ) var |=0x01; } |
Автор: | YS [ Пн авг 15, 2011 22:58:44 ] |
Заголовок сообщения: | Re: Последовательний ввод |
На прерываниях или в цикле? Подразумеваем, что синхронизация есть? Если поддерживаются прерывания от ножек, то можно сделать так: Код: //код в прерывании от ножки синхронизации bit_count++; if (bit_count==8) { //если все приняли - обнуляем счетчик бит и уведомляем основную программу, что готово bit_count=0; byte_received=byte_temp; byte_temp=0; status|=BYTE_RECEIVED; } else { if ([если на приемной ножке "1"]) byte_temp|=(1<<bit_count); bit_count++; } В цикле можно так: Код: temp_byte=0; bit_count=0; while (bit_count<8) { if ([на ножке синхронизации "1"]) temp_byte|=(1<<bit_count); bit_count++; } byte_received=byte_temp; status|=BYTE_RECEIVED; |
Автор: | Transistor [ Вт авг 16, 2011 21:15:15 ] |
Заголовок сообщения: | Re: Последовательний ввод |
Спасибо взял на заметку конструкцию, но повидиму у вас ХАй ТИЧ, а у меня ССЗ компилятор, что та вроде такова: Код: for (i=1;i<=7;++i) { output_high (PIN_A1); output_low (PIN_A1); if(!input(PIN_A2)) bit_set (kode,i); } Правда ищо сиро, без защити, но работаю над етим. без вас ненайшолби инструкцию по работе из битами (но можт найшол но очен долго би искал). |
Автор: | DX168B [ Вт авг 16, 2011 21:24:48 ] |
Заголовок сообщения: | Re: Последовательний ввод |
Поинтересуйтесь протоколом 1Wire. Ему для двухстороннего обмена хватает одной ноги МК. Поищите либы к нему. ![]() |
Автор: | YS [ Вт авг 16, 2011 22:00:05 ] |
Заголовок сообщения: | Re: Последовательний ввод |
Цитата: Спасибо взял на заметку конструкцию, но повидиму у вас ХАй ТИЧ, а у меня ССЗ Это Вы мне? Я писал, вообще не привязываясь к компилятору. Цитата: output_high (PIN_A1); output_low (PIN_A1); - плохой стиль, ибо компиляторозависимо. Правильнее Код: //set bit var|=bitmask; //clear bit var&=~bitmask; //test bit if (var & bitmask) ... это будет работать везде без переделок. |
Автор: | Transistor [ Вт авг 16, 2011 23:06:19 ] |
Заголовок сообщения: | Re: Последовательний ввод |
Да я вам. У моево компилятора нету таких операторов в справке от я и сделал вивод что увас другой компилятор. А что чтото не так? |
Автор: | YS [ Ср авг 17, 2011 22:46:49 ] |
Заголовок сообщения: | Re: Последовательний ввод |
Цитата: У моево компилятора нету таких операторов в справке Так дело как раз в том, что это (битовые операции) стандарт не компилятора, а самого языка С, потому, естесственно, в справке к компилятору описывать их нет необходимости. И работать это будет везде, потому что это обязаны поддерживать все компиляторы. А вот использовать компиляторо-зависимые конструкции типа output_ххх() - плохой стиль, потому что это будет работать только в одном компиляторе и препятствовать портируемости. |
Автор: | DX168B [ Чт авг 18, 2011 13:44:09 ] |
Заголовок сообщения: | Re: Последовательний ввод |
То есть, стандартные битовые (атомарные) операции не влияют на портируемость кода. К этому если ещё добавить условную компиляцию и директивы #define для регистров периферии, то такой код можно даже на ARM портировать почти без изменений. ЗЫ: Если не прав, поправьте. |
Автор: | Transistor [ Чт авг 18, 2011 20:58:54 ] |
Заголовок сообщения: | Re: Последовательний ввод |
А можно какойнибуд хелп по етим операциям для пиков. |
Автор: | urry [ Чт авг 18, 2011 21:22:01 ] |
Заголовок сообщения: | Re: Последовательний ввод |
нет си для пиков, си для авр и си для арм. Си - он и в африке си, только черный. Существует отдельный бонус в отдельных компиляторах (хм, уже легче перечислить, где этого бонуса нет ![]() где существует понятие - булевая переменная в принципе и вместо PORTB |=(1<< 3); пишут PORTB.3=1; Как бы вот http://electronix.ru/forum/index.php?ac ... t&id=30242 только конкатенация работает не на всех компиляторах, не злоупотребляйте ага, еще вспомнил http://www.pic24.ru/doku.php/articles/m ... mic_access Наслаждайтесь |
Автор: | YS [ Пт авг 19, 2011 12:37:01 ] |
Заголовок сообщения: | Re: Последовательний ввод |
Цитата: хелп по етим операциям для пиков. Почитайте про битовые операции в любой книжке по С. Работать они будут и на PIC, и на AVR, и на ARM, и точно так же на x86. Это - стандарт С. А вот всякие PORTB.3=xxx стухнут при переезде на другой компилятор. |
Автор: | DX168B [ Пт авг 19, 2011 16:06:44 ] |
Заголовок сообщения: | Re: Последовательний ввод |
YS писал(а): А вот всякие PORTB.3=xxx стухнут при переезде на другой компилятор. Полностью согласен. Когда я выбирал себе компилятор, то я этот CV AVR сразу же отбросил и остался на WinAVR. Мне сразу не понравилось это: Код: PORTA.2 = 0; Уж лучше так: Код: //C PORTA&=~(1<<PA2); //Аналог на АСМе cbi PORTA, 2 А условия по приёму с пина - вообще красота. ![]() Код: //C
if ((PINA & (1<<PA2)) == 1){...} //Аналог на АСМе sbis PINA, 2 |
Автор: | diehard [ Пт авг 19, 2011 16:30:28 ] |
Заголовок сообщения: | Re: Последовательний ввод |
var|=bitmask; y |= (1<<x) Это будет работать на всех компиляторах, в том числе и на CV PORTB.3=1; Это костыль для начинающих и им самим решать, использовать его или нет. OFFTOP ON Библиотеки в разных компиляторах разные. И если нужна 100% портируемость, тогда пишите сами все библиотеки. Тогда и не будет проблем при переезде с компилятора на компилятор. Вспомните так же про прерывания и их объявление. В разных компиляторах разное. и т.д. Дебаты какой компилятор лучше никогда ни к чему не приводят. Каждый работает на том, на чем нравится/привык. Если тема про лучший код или полную контролируемость, нужно и асм вспомнить. На каждом углу кричат Windows must die, а на линуксе редко кого из кричащих увидишь ![]() OFFTOP OFF |
Автор: | DX168B [ Пт авг 19, 2011 16:41:05 ] |
Заголовок сообщения: | Re: Последовательний ввод |
Я вообще стараюсь от языков высокого уровня держаться подальше. Большая часть проектов у меня на ассемблере. ![]() ![]() |
Автор: | YS [ Пт авг 19, 2011 18:04:32 ] |
Заголовок сообщения: | Re: Последовательний ввод |
Цитата: Дебаты какой компилятор лучше никогда ни к чему не приводят. Дыг мы не об этом вовсе. ![]() ![]() |
Автор: | diehard [ Сб авг 20, 2011 09:57:30 ] |
Заголовок сообщения: | Re: Последовательний ввод |
+1 |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |