реклама на сайте
подробности

 
 
21 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Изменение текста программы при смене компилятора и чипа
sigmaN
сообщение Nov 5 2010, 15:18
Сообщение #16


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...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 5 2010, 18:43
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 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;                        // Настройка портов ввода/вывода

видимо кнопки реализованы как то по другому
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 6 2010, 02:18
Сообщение #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...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 6 2010, 18:35
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 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. Ведь достаточно при включении просто дёрнуть движком туда-сюда(причём на доли секунды) чтобы подать напряжение для измерения угла и засветить нужный светодиодегг ))

Совершенно согласен.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 6 2010, 23:00
Сообщение #20


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...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 7 2010, 01:31
Сообщение #21


I WANT TO BELIEVE
******

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



А ещё я тут подумал...
Светодиоды(сдвиговые регистры) надо цеплять к контроллеру по интерфейсу Universal Serial Interface – USI.
Тогда вся эта программная муть, формирующая клоки и выталкивающая данные в сдвиговые регистры будет заменена кодом конфигурации USI, а потом только регистр подгружай и прерывания лови. Сама передача и тактирование будут выполняться аппаратно.
Правда немного схему переделать придётся, чтобы регистры на нужных пинах оказались, но я думаю это не проблема.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 7 2010, 17:35
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 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, а потом только регистр подгружай и прерывания лови. Сама передача и тактирование будут выполняться аппаратно.
Правда немного схему переделать придётся, чтобы регистры на нужных пинах оказались, но я думаю это не проблема.

Из сказаного понял немного,но схема то уже спаяна и не хотелось бы делать печатку заново.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 7 2010, 19:11
Сообщение #23


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...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 7 2010, 20:05
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Цитата
Таким образом мы сняли бит номер 3.

Всё это для того что бы снять третий бит в байте???А проще нельзя?

Цитата
Ну и ладно. Хотя конечно перекинуть 3 ноги, рзрезав дорожки иприпаяв провода - не так сложно

Да нет,не сложно это сделать,просто я никакой интерфейс не знаю и поэтому без разницы какой изучать.Можно и USI.

Цитата
Совет: старайтесь больше вникать в суть дела. В теорию. Тупое просматривание примеров не даст результата.

Да вы не правильно поняли,не копирую я тупо куски кода из примеров,но эти куски реально помогают при изучении с нуля.Просто мало кто из "гуру" на форумах снисходит до того,что бы растолковать новичкам простые(отнюдь не для новичков)вещи как вот например на этом сайте:http://atmel.moy.su/publ/1-1-0-4.К сожалению везде обучение новичков сводится к миганию светодиодами и дальше этого дело не идёт,а жаль.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 7 2010, 21:15
Сообщение #25


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...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 8 2010, 19:17
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Цитата
А с USI будет всё более цивилизованно - загрузили значение, которое нужно передать и пошел процесс передачи. Всё делает железо, проц свободен. Это более грамотный подход, хотя и не обязательно делать именно так.

Пока не понимаю о чём речь,но звучит заманчиво.Не подскажите ссылочку а русскоязычный даташит по тиньке2313.У меня в книге Голубцова М.С. очень хорошо описана 90S2313,но она же не аналог тиньки.Нагуглил много но всё по аглицки(только не говорите что нужно учить английский) ))
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 8 2010, 20:40
Сообщение #27


I WANT TO BELIEVE
******

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



Нужно!
Нужно знать минимальный набор слов для чтения даташитов. Это не так много. Говорить вас никто не просит, но понимать технический текст надо!

Русский даташит... блин... лично у меня стойкая аллергия на подобные явления.

На поиск в гугле потратил минуты 3....

И даже прикрепляю вам файлик прямо сюда.

Added: тут на коте рекомендовали книжечку http://www.kodges.ru/34902-samouchitel-raz...rojjstv-na.html
сам не читал, но говорят толковая для начинающих.
Прикрепленные файлы
Прикрепленный файл  Datasheet_ATTiny2313_na_russkom.zip ( 2.3 мегабайт ) Кол-во скачиваний: 92
 


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 9 2010, 05:55
Сообщение #28


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Цитата
На поиск в гугле потратил минуты 3....

За это время с моим "быстрым" инетом я хорошо если 5-6 страниц открою crying.gif
Спасибо за ссылки.Сажусь курить доки biggrin.gif до полного просветления.Жаль только с 14 ехать на вахту надо.Инет будет только по телефону,но вопросы,буде таковые возникнут,я и по телефону задам.
Go to the top of the page
 
+Quote Post
314
сообщение Nov 9 2010, 06:33
Сообщение #29


Частый гость
**

Группа: Участник
Сообщений: 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();

}
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 9 2010, 13:04
Сообщение #30


I WANT TO BELIEVE
******

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



Цитата
Сажусь курить доки biggrin.gif до полного просветления.
А иначе ничего и не будет. Даа. Только так smile.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

21 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th August 2025 - 07:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.02346 секунд с 7
ELECTRONIX ©2004-2016