На прерываниях или в цикле? Подразумеваем, что синхронизация есть?
Если поддерживаются прерывания от ножек, то можно сделать так:
Код:
//код в прерывании от ножки синхронизации
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;
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
У моево компилятора нету таких операторов в справке
Так дело как раз в том, что это (битовые операции) стандарт не компилятора, а самого языка С, потому, естесственно, в справке к компилятору описывать их нет необходимости. И работать это будет везде, потому что это обязаны поддерживать все компиляторы. А вот использовать компиляторо-зависимые конструкции типа output_ххх() - плохой стиль, потому что это будет работать только в одном компиляторе и препятствовать портируемости.
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4468 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
То есть, стандартные битовые (атомарные) операции не влияют на портируемость кода. К этому если ещё добавить условную компиляцию и директивы #define для регистров периферии, то такой код можно даже на ARM портировать почти без изменений.
ЗЫ: Если не прав, поправьте.
_________________ I am DX168B and this is my favourite forum on internet!
нет си для пиков, си для авр и си для арм. Си - он и в африке си, только черный. Существует отдельный бонус в отдельных компиляторах (хм, уже легче перечислить, где этого бонуса нет ) где существует понятие - булевая переменная в принципе и вместо 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 Наслаждайтесь
var|=bitmask; y |= (1<<x) Это будет работать на всех компиляторах, в том числе и на CV
PORTB.3=1; Это костыль для начинающих и им самим решать, использовать его или нет.
OFFTOP ON Библиотеки в разных компиляторах разные. И если нужна 100% портируемость, тогда пишите сами все библиотеки. Тогда и не будет проблем при переезде с компилятора на компилятор. Вспомните так же про прерывания и их объявление. В разных компиляторах разное. и т.д.
Дебаты какой компилятор лучше никогда ни к чему не приводят. Каждый работает на том, на чем нравится/привык.
Если тема про лучший код или полную контролируемость, нужно и асм вспомнить.
На каждом углу кричат Windows must die, а на линуксе редко кого из кричащих увидишь OFFTOP OFF
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4468 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
Я вообще стараюсь от языков высокого уровня держаться подальше. Большая часть проектов у меня на ассемблере. На Си у меня только те проекты, которые сложно реализовать на АСМе за короткий срок.
_________________ I am DX168B and this is my favourite forum on internet!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения