управление 3мя регистрами cd4094 по двум проводам

Февраль 22, 2010

 100_0511

В этот раз речь пойдет о управлении целой платой с регистрами типа cd4094, включенными последовательно. Код остался тот же, только немного увеличился в соответствии с индикаторами.

4094proteus

При изготовлении платы надо обратить внимание на порядок расположения индикаторов. На первом регистре распологается самый старший разряд. У меня получилось не так и пришлось дописывать еще извращение. Так же регистры требуют конденсаторов по питанию во избежании помех.

Расширить диапазон индикации до 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. В этом поможет самый  первый пример.

Исходники

Tags: , ,

категория: учим мк avr

ответить

Авторизация только через loginza.

Yandex Google Вконтакте Mail.ru Twitter Loginza MyOpenID OpenID