|
|
  |
Изменение текста программы при смене компилятора и чипа |
|
|
|
Nov 5 2010, 15:18
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата Я видел что у вас выражено через оператор if,но честно говоря не понимаю разницы.И там и там проверяется условие и если оно правильно работает тело Да, но тогда у Вас зациклится присвоение значения регистру PORTD и пока кнопка нажата - мы будем непрерывно присваивать, в то время как остальные операторы исполняться не будут. Теперь представьте если у вас ниже в коде идет проверка состояния концевика(ну типа двигатель дошел до определенной точки - включить реверс), а тут вдруг кто-то нажал кнопку и держит - движок дойдет до упора, а может быть и сломает что-нибудь )) Ну это так, самый простой пример. Да и просто реально нет там необходимости в цикле. Ни малейшей. Но в вашем конкретном случае в таком виде как оно есть сейчас - работать конечно будет и с while. Цитата Мне не понятна реализация измерения напряжения датчика угла поворота. Напряжение измеряется с помощью ADC(АЦП). Советую не привыкать использовать стиль K&R в расстановке операторных скобок вместо if (PIND.4==0){ я рекомендовал бы писать if (PIND.4==0) { позднее, при отладке вложенных условий вы непременно оцените преимущества такого стиля.
--------------------
The truth is out there...
|
|
|
|
|
Nov 5 2010, 18:43
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата Да, но тогда у Вас зациклится присвоение значения регистру PORTD и пока кнопка нажата - мы будем непрерывно присваивать, в то время как остальные операторы исполняться не будут. Вот теперь всё ясно! Цитата Напряжение измеряется с помощью ADC(АЦП). ???Если можно несколько подробнее(эх,пример бы посмотреть).Из исходника Код // Применение компаратора при измерении аналоговых величин. word measure(void){ ClrBit(DDRB,AIN0); // Перевести в Z-состояние TCNT0 = TH = 0; // Очистить счетчик-накопитель TCCR0 = PRESC; // Включить Таймер 0 SetBit(DDRB,T); // Включить транзистор while(BitOff(ACSR,ACO)); // Ждать изменения состояния компаратора TCCR0 = 0; // Выключить Таймер 0 ClrBit(DDRB,T); // Выключить транзистор SetBit(DDRB,AIN0); // Разрядить конденсатор delayms(2); // Время для разряда return(TH<<8 | TCNT0); // Возвращаем результат замера времени } я практически ничего не понял??? Цитата я рекомендовал бы писать if (PIND.4==0) { Я сначала так и писал(так нагляднее),но посмотрев примеры кодов решил писать как все. Да,с настройкой портов ввода и вывода в исходнике я то же не пойму,на кнопках почему то выход а RUN REV как вход??? Код DDRD=0x71; PORTD=0x0E; // Настройка портов ввода/вывода видимо кнопки реализованы как то по другому
|
|
|
|
|
Nov 6 2010, 02:18
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата Цитата Напряжение измеряется с помощью ADC(АЦП). ???Если можно несколько подробнее(эх,пример бы посмотреть).Из исходника Да да, в этом контроллере нет АЦП, поэтому применяется компаратор. Измеряемое напряжение подаётся на один вход, а на другом входе имеем конденсатор С8 и транзистор Q1. В базе транзистора присутствует достаточно большое сопротивление, что ограничивает ТОК коллектора таким образом, чтобы конденсатор заряжался не мгновенно, а с достаточной задержкой. Т.е. если бы этот резистор был меньше - ток заряда конденсатора был бы больше и он заряжался бы ооочень быстро. Компаратор позволяет заметить момент, когда напряжение на AIN0(а значит на обкладках конденсатора) становится больше AIN1. Этого события мы и ожидаем в коде while(BitOff(ACSR,ACO)); // Ждать изменения состояния компаратора По времени, за которое конденсатор разрядился на столько, чтобы сравниться с измеряемым напряжением мы и можем судить о величине измеряемого напряжения. Думаю о конкретном значении можно говорить только после проведения калиборовки, подавая заранее известное значение напряжения и замечая, скольким тикам таймера оно соответствует. Цитата видимо кнопки реализованы как то по другому очень интересно. Диоды то почему тогда стоят не в ту сторону?! Да при таком раскладе даже если там и выход - через диод то всё равно не пройдет ничё! Но может быть я чего-то не знаю и тут какая-то неведомая хитрость присутствует ) И тут даже в коде всё это явно накручено и высосано из пальца. Ну нет смысла для трёх кнопок так извращаться. Рекомендую забить на это дело и сделать свои кнопки по простому. И вообще, честно, код не очень то хорош. Я бы не рекомендовал особо сильно подражать такому подходу. Я могу точно сказать, что программу, реализующую заявленный функционал можно написать на много более наглядно и просто. Что и рекомендую Вам сделать. И кнопки я бы сделал всего две. Стоп это когда ничего не нажато. Ну и по часовой/против часовой - понятно. Цитата Для экономии ресурсов НП, (производителем заявлено гарантированных 100000 циклов записи/стирания) запись состояния производится только в моменты его изменения. А именно, в моменты начала вращения или после останова. В моменты останова в энергонезависимую память заносяться параметры последнего угла положения. При включении устройства управления эти данные будут извлечены из памяти и отображены "поджиганием" необходимого светодиода. Если же останов произошел по вине пропадания питания (в этом случае последним зафиксированным состоянием будет состояние вращения), то при включении МК проинформирует о недостоверности указания направления трехкратной быстрой прокруткой светящейся точки по всем светодиодам, и табло останется погашенным. При первой же команде на вращение зажжется светодиод, реально отображающий положение антенны. ИМХО - хреновый подход. Не нужно там ничего записывать в EEPROM. Ведь достаточно при включении просто дёрнуть движком туда-сюда(причём на доли секунды) чтобы подать напряжение для измерения угла и засветить нужный светодиодегг ))
--------------------
The truth is out there...
|
|
|
|
|
Nov 6 2010, 18:35
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата Измеряемое напряжение подаётся на один вход, а на другом входе имеем конденсатор С8 и транзистор Q1. То есть если я правильно понял алгоритм следующий:включаем таймер для замера времени необходимого для изменения состояния компаратора - включаем транзистор - ждём пока конденсатор зарядится на уровень срабатывания компаратора - таймер выкл - транзистор выкл -кондёр разряжаем(для следущего заряда) - результат замера времени таймером отправляем для сравнения в Код // Таблица перевода количества импульсов, соответствующих входному // напряжению в номер группы и номер светодиода в группе. __flash byte LedPos[] = { 0x00,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06, 0x07,0x07, 0x10,0x10,0x10,0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x15, 0x16,0x16,0x17, 0x17,0x17,0x20,0x20,0x21,0x21,0x21,0x22,0x22,0x23,0x23,0x23,0x24,0x24,0x25, 0x25,0x26,0x26, 0x26,0x27,0x27,0x30,0x30,0x30,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x34,0x34, 0x35,0x35,0x35, 0x36,0x36,0x37,0x37,0x37,0x40,0x40,0x41,0x41,0x41,0x42,0x42,0x43,0x43,0x43, 0x44,0x44,0x45, 0x45,0x46,0x46,0x46,0x47,0x47,0x50,0x50,0x50,0x51,0x51,0x52,0x52,0x52,0x53, 0x53,0x54,0x54, 0x54,0x55,0x55,0x56,0x56,0x57};
__flash byte Mask[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; Кстати я думаю эту таблицу можно повзаимствовать из исходника,я думаю автор её составлял не наугад.Может кстати весь блок кода применения компаратора повзаимствовать?Только вот я не совсем с ним разобрался(но это видимо потому,что плохо знаю работу компаратора в МК)В частности загадка для меня Код #define ClrBit(address,bit) (address&=~(1<<bit)) &=~ что за сочетание??? & это порязрядное И или определение адреса?~ это поразрядное отрицание?(1<<bit) это умножение 1 на 2 в степени bit или это сдвиг 1 на bit влево?Не понимая этого я соответственно не понимаю Код ClrBit(DDRB,AIN0); Вообщем масса вопросов.Кстати, что то не могу найти примеров, где компаратор использовался бы подобным образом,не подскажите где поискать? Цитата Рекомендую забить на это дело и сделать свои кнопки по простому. Вот я так и сделаю.В принципе они как кнопки готовы вот только осталось ввести функцию концевиков,но для этого опять же нужно разобраться с компаратором. Цитата ИМХО - хреновый подход. Не нужно там ничего записывать в EEPROM. Ведь достаточно при включении просто дёрнуть движком туда-сюда(причём на доли секунды) чтобы подать напряжение для измерения угла и засветить нужный светодиодегг )) Совершенно согласен.
|
|
|
|
|
Nov 6 2010, 23:00
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата Кстати я думаю эту таблицу можно повзаимствовать из исходника,я думаю автор её составлял не наугад Вы знаете, я ещё не смотрел как там увАжаемый афтар реализовал все эти светодиоды, но почему-то моё чутьё подсказывает, что вероятность черезжопной реализации там также высока. Поэтому опять же нужно смотреть и очень хорошо подумать... В принципе можно и таблицу.. Вообще там всё зависит от схемы включения диодов. Там их просто довольно много и я подозреваю, что как раз таки они включены матрицей. 8*8=64. Т.е. на те два регистра можно нацепить 64 диода. И в принципе, если там задержка будет линейно зависеть от положения потенциометра - ничто не мешает использовать функцию, которая элементарно на ходу вычислит строку и диод в строке, который нужно засветить. Строки матрицы будут физически расположены по дуге. Все строки вместе составляют линию окружности. А вот если время заряда кондера будет нелинейно зависеть от поворота ручки, то проще будет таблицей ибо для начинающего там уже будет заморочка с расчётом на ходу... Цитата &=~ что за сочетание??? & это порязрядное И или определение адреса? Вопросы это хорошо! & здесь - поразрядное И. Запись a &=b; эквивалентна a = a & b; таким образом имеем address&=~(1<<bit) эквивалентно address = address & ~(1<<bit); И поскольку приоритет операции ~ выше, чем операции & - будет выполнено сначала то, что в скобках, потом к каждому биту результата будет применена операция НЕ, после этого выполняется оператор &. Таким образом мы очистим бит номер bit переменной address. Только опять таки address тут немного некорректное имя, т.к. всё же параметром этого макроса является переменная, а не указатель. Цитата Кстати, что то не могу найти примеров, где компаратор использовался бы подобным образом,не подскажите где поискать? Не знаю. А зачем? Ведь и так всё ясно. Главное знать как работает компаратор, а как его использовать - это дело разработчика ))
--------------------
The truth is out there...
|
|
|
|
|
Nov 7 2010, 17:35
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата Вы знаете, я ещё не смотрел как там увАжаемый афтар реализовал все эти светодиоды Насколько я понял 6 групп по 8 светодиодов через регистры CD4094N от МК0 по последовательному порту. Цитата Запись a &=b; эквивалентна a = a & b; таким образом имеем address&=~(1<<bit) эквивалентно address = address & ~(1<<bit); Вообщем понял,но конкретно видимо пока сложно для новичка в С. Насколько понял в скобках (1 сдвигаем влево на bit) - в полученом(например 011001 меняем наоборот 100110)проводим отрицание - address будет истина если address и полученное после отрицания тоже истинны?Бр-р-р.Нифига не понял.Нельзя это всё проще выразить? Цитата Не знаю. А зачем? Ведь и так всё ясно. Главное знать как работает компаратор, а как его использовать - это дело разработчика )) Да мне посмотреть примеры кодов,кто как пишет.Как запускают таймер,как отключают,как использовать результат замера времени и т.д.Я ж всё таки начинающий, мне легче когда есть посмотреть аналог,проанализировать и понять почему пишут так,а не иначе и как правильно. Цитата А ещё я тут подумал... Светодиоды(сдвиговые регистры) надо цеплять к контроллеру по интерфейсу Universal Serial Interface – USI. Тогда вся эта программная муть, формирующая клоки и выталкивающая данные в сдвиговые регистры будет заменена кодом конфигурации USI, а потом только регистр подгружай и прерывания лови. Сама передача и тактирование будут выполняться аппаратно. Правда немного схему переделать придётся, чтобы регистры на нужных пинах оказались, но я думаю это не проблема. Из сказаного понял немного,но схема то уже спаяна и не хотелось бы делать печатку заново.
|
|
|
|
|
Nov 7 2010, 19:11
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата Цитата Вы знаете, я ещё не смотрел как там увАжаемый афтар реализовал все эти светодиоды Насколько я понял 6 групп по 8 светодиодов через регистры CD4094N от МК0 по последовательному порту. Да я не о том. Я о программировании. То, что они там включены матрицей - сомнений не вызывает. Цитата Насколько понял в скобках (1 сдвигаем влево на bit) - в полученом(например 011001 меняем наоборот 100110)проводим отрицание - address будет истина если address и полученное после отрицания тоже истинны?Бр-р-р.Нифига не понял.Нельзя это всё проще выразить? Хорошо. Допустим address == 00101001 bit == 3 начинаем считать. первым делом надо вычислить значение в скобках. Что мы там видим. 1 << bit т.е. берем 1 и сдвигаем её на 3 позиции влево. Дело мы имеем с байтом. поэтому 1 мы запишем как 00000001 сдвигаем на 3 влево == 00001000 т.е. (1 << bit) == 00001000 запомнили далее операция ~ применяет НЕ ко всем битам байта. Т.е. ~00001000 == 11110111 далее нужно выполнить операцию & т.е. address & 11110111 address мы приняли за 00101001 а значит будет выполнено 00101001 & 11110111 и результат будет занесен в address. выполнив И над каждым битом - получаем результат 00100001 Таким образом мы сняли бит номер 3. Цитата Да мне посмотреть примеры кодов,кто как пишет.Как запускают таймер,как отключают,как использовать результат замера времени и т.д. Тут уж извините, в даташит смотрите как с таймером работать. Запускать его и останваливать. И где результат брать(в каком регистре). Тупое смотрение примеров и copy - paste врятли прибавит мозгов )) Цитата Из сказаного понял немного,но схема то уже спаяна и не хотелось бы делать печатку заново. Ну и ладно. Хотя конечно перекинуть 3 ноги, рзрезав дорожки иприпаяв провода - не так сложно. Может быть потом сделаете таким образом. Совет: старайтесь больше вникать в суть дела. В теорию. Тупое просматривание примеров не даст результата. Более того - вы можете научиться плохому. За примером далеко ходить не надо: приведенный в этой теме код автора едва ли можно назвать эталоном для подражания. В общем пользуйтесь своей головой и не бойтесь вникать в детали. И пусть даже на изучение работы таймера у вас уйдет неделя - вы потом сможете применить его как угодно и где угодно. А тупо скопировав код из примера - вы становитесь заложником своего непонимания.
--------------------
The truth is out there...
|
|
|
|
|
Nov 7 2010, 20:05
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата Таким образом мы сняли бит номер 3. Всё это для того что бы снять третий бит в байте???А проще нельзя? Цитата Ну и ладно. Хотя конечно перекинуть 3 ноги, рзрезав дорожки иприпаяв провода - не так сложно Да нет,не сложно это сделать,просто я никакой интерфейс не знаю и поэтому без разницы какой изучать.Можно и USI. Цитата Совет: старайтесь больше вникать в суть дела. В теорию. Тупое просматривание примеров не даст результата. Да вы не правильно поняли,не копирую я тупо куски кода из примеров,но эти куски реально помогают при изучении с нуля.Просто мало кто из "гуру" на форумах снисходит до того,что бы растолковать новичкам простые(отнюдь не для новичков)вещи как вот например на этом сайте:http://atmel.moy.su/publ/1-1-0-4.К сожалению везде обучение новичков сводится к миганию светодиодами и дальше этого дело не идёт,а жаль.
|
|
|
|
|
Nov 7 2010, 21:15
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата Всё это для того что бы снять третий бит в байте???А проще нельзя? Ну макрос же так и назывался ClrBit(); т.е. очистить бит. Есть там наверно ещё и SetBit(); И это очень просто. Кстати то, что в скобках и операцию ~ компилятор делает "в уме" и генерирует лишь код для операции &. Т.е. для контроллера это тоже очень просто(сам & за 1 такт) )) Цитата Да нет,не сложно это сделать,просто я никакой интерфейс не знаю и поэтому без разницы какой изучать.Можно и USI. Ну это на выбор. Просто так вы будете программно генерировать тактовую частоту и извлекать биты из байта, передавая их на ногу процессора чисто программно(опять же меняя соответствующий бит в байте порта, чтоб нога дёргалась). А с USI будет всё более цивилизованно - загрузили значение, которое нужно передать и пошел процесс передачи. Всё делает железо, проц свободен. Это более грамотный подход, хотя и не обязательно делать именно так. Цитата Просто мало кто из "гуру" на форумах снисходит до того,что бы растолковать новичкам простые(отнюдь не для новичков)вещи как вот например на этом сайте... К сожалению везде обучение новичков сводится к миганию светодиодами и дальше этого дело не идёт,а жаль. Все, кто чего-то добился - знают, что без самообучения никуда. Также я думаю, что на составление толкового толмуда по тому-же USI для новичков потребуется потратить немало часов. И то найдутся те, которым ничего не понятно. И "гуру" они от того и стали гуру, что берут доку и курят до наступления просветления. Не понимаешь первую же строку - поднимаешь материал по конкретному термину и снова куришь.... вот так становятся гуру. И вы не поверите, но те, кто для вас гуру - чуть ли не каждый день сталкиваются с чем-то новым и непрерывно самообучаются и решают проблемы. Да, подсказки, вопросы - всё это будет. Но основную работу придётся проделывать самому. Вы должны быть к этому готовы. И уж на что что, а на такие вещи как остановка таймера или включение/выключение ноги контроллера, чтобы открылся транзистор - смотреть нечено. Нужно читать даташит, рисовать на бумажечке, если нужно и в голове себе нарисовать чёткую картину что куда и зачем. Вот как только это произошло - считайте что вы на одну ступеньку приблизились к тем, кого сейчас называете гуру. Вот тут есть учебный курс по AVR. http://easyelectronics.ru/category/avr-uchebnyj-kurs кажется давал уже... или это не в этой теме.. не помню... И вообще есть и примеры, если и статьи и ответы на форумах тоже... и поиск в гугле тоже то, чем придётся овладеть не хуже, чем языком программирования )
--------------------
The truth is out there...
|
|
|
|
|
Nov 8 2010, 19:17
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата А с USI будет всё более цивилизованно - загрузили значение, которое нужно передать и пошел процесс передачи. Всё делает железо, проц свободен. Это более грамотный подход, хотя и не обязательно делать именно так. Пока не понимаю о чём речь,но звучит заманчиво.Не подскажите ссылочку а русскоязычный даташит по тиньке2313.У меня в книге Голубцова М.С. очень хорошо описана 90S2313,но она же не аналог тиньки.Нагуглил много но всё по аглицки(только не говорите что нужно учить английский) ))
|
|
|
|
|
Nov 8 2010, 20:40
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Нужно! Нужно знать минимальный набор слов для чтения даташитов. Это не так много. Говорить вас никто не просит, но понимать технический текст надо! Русский даташит... блин... лично у меня стойкая аллергия на подобные явления. На поиск в гугле потратил минуты 3.... И даже прикрепляю вам файлик прямо сюда. Added: тут на коте рекомендовали книжечку http://www.kodges.ru/34902-samouchitel-raz...rojjstv-na.html сам не читал, но говорят толковая для начинающих.
--------------------
The truth is out there...
|
|
|
|
|
Nov 9 2010, 05:55
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата На поиск в гугле потратил минуты 3.... За это время с моим "быстрым" инетом я хорошо если 5-6 страниц открою Спасибо за ссылки.Сажусь курить доки  до полного просветления.Жаль только с 14 ехать на вахту надо.Инет будет только по телефону,но вопросы,буде таковые возникнут,я и по телефону задам.
|
|
|
|
|
Nov 9 2010, 06:33
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 17-08-07
Пользователь №: 29 855

|
Вот Вам небольшой примерчик, как делать нежелательно, но возможно. Он под компилятор GCC. В данном устройстве интерфейсы контроллера заняты обменом с другими устройствами, поэтому вывод на цифровые индикаторы+линейка светодиодов сделан так кривенько, через последовательные регистры. Динамическая индикация, две строки по 6 цифр. Регистры 74164. PORTD,4 - вход сброса регистров, он инверсный, PORTB,6 - тактовый, PORTD,5 и PORTD,6 - входа данных регистров символов (цифры), PORTB,7 - вход регистра анодов индикаторов. Из нехорошестей этой функции - слишком большое использование глобальных переменных, неудобно отлаживать и портировать, а так, в общем, работает. Массив индикации 2 на 6 (2 строки на 6 ячеек), count_a - счетчик анодов, CODE void indicator (void)
{ register uint8_t i1,j1,A,hlp_ind1,hlp_ind2,hlp_ind3,hlp_ind; j1=0xff; if (count_a == 5) count_a = 0;
else count_a++ ;
for (i1=0;i1<2;i1++ ) { A=array_indic[i1][count_a];
switch (A) /* Знакогенератор */ { case 0: { hlp_ind=0xc0; break; } case 1: { hlp_ind=0xf9; break; } case 2: { hlp_ind=0xa4; break; } case 3: { hlp_ind=0xb0; break; } case 4: { hlp_ind=0x99; break; } case 5: { hlp_ind=0x92; break; } case 6: { hlp_ind=0x82; break; } case 7: { hlp_ind=0xf8; break; } case 8: { hlp_ind=0x80; break; } case 9: { hlp_ind=0x90; } } if (A>9) hlp_ind=0xff; if ((count_a==2)&(i1==0)) { hlp_ind=array_indic[0][2]; } if ((alarm==1)&(i1==1)) { if (counter_delay<20) hlp_ind=hlp_ind|0x80; else hlp_ind=hlp_ind&0x7f; } if ((count_a==1)&(i1==1)) // засветка точки на индикаторе напряжения { hlp_ind=hlp_ind&0x7f; } /*if ((count_a==pnt)&(i1==1)) // засветка точки на индикаторе времени { hlp_ind=hlp_ind&0x7f; } */
indic_symbol[i1]=hlp_ind; } if (count_a==0) j1=0xf7; if (count_a==1) j1=0xef; if (count_a==2) j1=0xdf; if (count_a==3) j1=0xfe; if (count_a==4) j1=0xfd; if (count_a==5) j1=0xfb; hlp_ind3=j1; hlp_ind1=indic_symbol[0]; hlp_ind2=indic_symbol[1]; cli(); cbi(PORTD,4); /* сброс регистров индикаторов */ for (i1=0;i1<=2;i1++); sbi(PORTD,4); for (i1=1;i1<=2;i1++); j1=0x80; for (i1=0;i1<8;i1++) /* последовательная выдача на регистры */ { cbi(PORTB,6); if (j1&hlp_ind1) sbi(PORTD,5); else cbi(PORTD,5); if (j1&hlp_ind2) sbi(PORTD,6); else cbi(PORTD,6); if (j1&hlp_ind3) sbi(PORTB,7); else cbi(PORTB,7); sbi(PORTB,6); j1>>=1; } sei(); }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|