управление 3мя регистрами cd4094 по двум проводам
Февраль 22, 2010
В этот раз речь пойдет о управлении целой платой с регистрами типа cd4094, включенными последовательно. Код остался тот же, только немного увеличился в соответствии с индикаторами.
При изготовлении платы надо обратить внимание на порядок расположения индикаторов. На первом регистре распологается самый старший разряд. У меня получилось не так и пришлось дописывать еще извращение. Так же регистры требуют конденсаторов по питанию во избежании помех.
Расширить диапазон индикации до 1999 можно, если в первом регистре Q7 соединить с сегментами b,c еще одного индикатора. У меня именно так плата и сделана, к тому же еще предусмотрен светодиод, который сидит на Q7 другого индикатора. Изначально плата предназначалась для укв передатчика. В одном из последующих уроков мы рассмотрим принцип работы синтезатора частоты укв приемника и напишем для этой платы код.
В этом уроке же будет подготовка.
Из прошлого урока известно о инициализации регистров перед использованием. В нашем случае регистров 3 по 8 бит. Итого 3*8=24 бита надо послать.
Напишем эту функцию.
1: void cd4094_init(void){
2: char i=0;
3:
4: while(i!=24){
5:
6: REG_CLK
7: i++;
8: }
9: }
Теперь начинается самое интересное.
Допустим у нас есть число 123. Чтобы передать его в регистры последовательно, нам это число надо разложить на цифры и потом каждую цифру передавать как раньше. Какую цифру брать сначала?
Возьмем 1. Выделим ее и пошлем. Куда? Сразу в последний регистр? Тогда при передаче во второй регистр информация в 3м сотрется.
Возьмем тогда первый. Передали 1. На индикаторах будет 1--, где - означает пустоту (сегменты не горят), т.к. в функции инициализации мы записали нули.
Теперь шлем вторую цифру 2 - тогда 1 перейдет на второе место,а первое займет 2. Будет 21-. В 3й раз на индикаторе будет 321.
Получается, начинать с первой цифры не надо. А как тогда брать последнюю и как вообще разложить число на цифры? Оказывается в математике есть деление с остатком на 10, которое в остатке дает нам как раз последнюю нужную цифру.
Например 123%10=3. Однако в переменной изначально ничего не поменяется и останется 123.
Чтобы укоротить и это число, его надо разделить обычно на 10.
123/10=12.3 Но т.к. у нас переменная типа int, то дробная часть просто откидывается.
Переменная типа int у нас потому, что число будет больше 255. Если она будет 1 байт, то на определенном этапе показания индикатора будут сбиваться и отловить такой глюк очень сложно для новичка.
Т.к. у нас 3 индикатора, то считать надо от 0 до 3.
Алгоритм раскладки реализуется так.
1: for(j=3;j>0;j--){
2:
3: tmp = digs[dig%10];
4: dig = dig/10;
5: send_dig(tmp);
6: }
Если индикаторов больше, то вместо 3 надо поставить 4, хотя больше 4х регистров я бы не стал использовать и сделал бы динамическую индикацию (тема следущего урока).
Собственно вот и весь код. В качестве самостоятельно работы - дописать код так, чтобы задействовать еще один индикатор для чисел больше 999. В этом поможет самый первый пример.
Исходники
категория: учим мк avr