Прошу помочь изменить код ОА в ОК

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Сообщение Garin »

Здравствуйте . К сожалению пока не могу написать что либо подобное свое.
Вот нашел готовое нужное мне решение, но для ОА , мои пробы переделать это под ОК никак не получаются,
Помогите пожалуйста, переделать это под ОК ....
Спойлер

Код: Выделить всё

/*****************************************************
CodeWizardAVR V2.05.3 Standard
Date    : 29.07.2013
Chip type               : ATmega8
AVR Core Clock frequency: 8,000000 MHz

*****************************************************/
#include <mega8.h>
#include <delay.h>
                  #define a 128 //    q0
                  #define b 64   //   q1
                  #define c 32   //   q2
                  #define d 16   //   q3             Меняем эти числа для другого индикатора
                  #define e 8   //    q4
                  #define f 4   //    q5
                  #define g 2   //    q6
                  #define dp 1  //    q7    

typedef  unsigned char byte ;

//                        byte dig[] = {
//                          (a+b+c+d+e+f),    //0        Для общего катода
//                          (b+c),                   //1
//                          (a+b+g+e+d),      //2
//                          (a+b+g+c+d),      //3
//                          (f+g+b+c) ,         //4
//                          (a+f+g+c+d) ,     //5
//                          (a+f+g+c+d+e) ,   //6
//                          (a+b+c)       ,   //7
//                          (a+b+c+d+e+f+g),  //8
//                          (a+b+c+d+f+g)  ,  //9
//                          (c+e+g)   ,       // n
//                          (a+e+f+g) ,       // f
//                          (c+d+e+g)   ,     // o
//                          0,              //пусто
//                             dp} ;     // точка №14

                        byte dig[] = {
                          ~(a+b+c+d+e+f),    //0        Для общего анода
                          ~(b+c),                   //1
                          ~(a+b+g+e+d),      //2
                          ~(a+b+g+c+d),      //3
                          ~(f+g+b+c) ,         //4
                          ~(a+f+g+c+d) ,     //5
                          ~(a+f+g+c+d+e) ,   //6
                          ~(a+b+c)       ,   //7
                          ~(a+b+c+d+e+f+g),  //8
                          ~(a+b+c+d+f+g)  ,  //9
                          ~(c+e+g)   ,       // n
                          ~(a+e+f+g) ,       // f
                          ~(c+d+e+g)   ,     // o
                          ~0,              //пусто
                             ~dp} ;     // точка №14

                        byte number_razr[] = {  8  ,  4  ,   2 ,   1   } ;   //        Для общего анода

byte ind[4];          //    массив индикатора 0-единицы , 3 - тысячи
unsigned char  cursor=0;           //    номер разряда

                                                                   
                           void reg_out(byte tmp)      //  output function in 74hc595 reg                                   
                               {   byte i;
                                for  (i=0;i<8;i++)       // для всех 8-ми битов числа tmp
                                 {  PORTD=PIND&0b00011111;       //  сброс в 0 входов регистра
                                    PORTD.6 = (tmp)&0b00000001 ;  //  мл разряд на данные
                                    PORTD.5  = 0b00000001;         //  строб
                                    tmp= tmp>>1;          //  подготовка след разряда
                                 }
                                   PORTD.7 = 1;          //   после 8-го данные защелкнуть
                               }

                                           
        interrupt [TIM0_OVF] void timer0_ovf_isr(void)
        {
               PORTD=0b00000000;     //гашение индикатора        PORTB=0b11110000;     //гашение индикатора
               reg_out(ind[cursor]); //  подаем в регистр число
                           PORTD=(PIND&0b11110000) | number_razr[cursor] ;// засвеч. разряд
                           cursor++;      //   
                         if (cursor>3)    //   индекс 
                            cursor=0;   //   сброс индекса

               
        }
            interrupt [TIM1_OVF] void timer1_ovf_isr(void)
            {  TCNT1H=0xFF;    //  перезапуск таймера 1
               TCNT1L=0x00;

           }

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here

}



void main(void)
{
      PORTB=0b00000000;
        DDRB=0b00000000;
      PORTC=0b00000000;                              
        DDRC=0b00000000;
      PORTD=0b00000000;   
        DDRD=0b11101111;     
TCCR0=0x03;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x07;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x45;

UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;

#asm("sei")   

while (1)
      {   

                                                            ind[3] =dig[1]  ; 
                                                            ind[2] =dig[2]   &  dig[14]  ;  
                                                            ind[1] =dig[3]  ; 
                                                            ind[0] =dig[4]   ; 

      };
}
Проект и протеус прилагаю
Вложения
OA_OK.rar
(54.02 КБ) 146 скачиваний
Реклама
Встал на лапы
Сообщения: 132
Зарегистрирован: Пт окт 19, 2012 05:54:55

Сообщение koms48 »

Атмегу8 на такую сомнительную безделушку? Сталина на вас нет. В протеусе кстати всегда одно время 12-34.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Какие проблемы у вас возникают? Выкладывайте конкретные проблемы, которые возникают при переделке.
Время стоит на месте вполне резонно, т.к. в коде нет абсолютно никакого счетчика секунд, минут и т.д.
Может вам стоит таймер 2 завести в асинхронный режим и тактировать от часового кварца?
А время как вы собрались выставлять? Хоть пару кнопок или ИК приемник в будущем добавите?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Сообщение Garin »

Товарищи , извиняйте что не ясно изложил свой вопрос .
ЧАСЫ сейчас тут совсем не причем!
Это код, заготовка- "болванка" он далее вырастет во что угодно ... часы...термометр... счетчик...

Этот код сейчас используется для индикаторов ОА, мне нужно его переделать для индикатора с Общим Катодом, вот в этом у меня проблема....
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Все сигналы, которые идут на индикатор надо инвертировать. И все заработает.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Сообщение Garin »

Так вот я этим и занимался очень долгооо, и на практике у меня ничего не получилось,
поэтому и написал здесь на форуме.
Как то не просто там с 595, вот если без сдвигового регистра у меня получалось проинветировать, а тут ни в какую.
Реклама
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

держите
PS. и сдвиговый регистр ту вообще не при чем.
Вложения
OA_OK.zip
(62.28 КБ) 136 скачиваний
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Сообщение Garin »

a_skr Большое спасибо.

Вот это я никак бы не осилил
PORTD=((PIND&0b11110000)|0b00001111) & ~number_razr[cursor] ;
ind[2] =dig[2] | dig[14] и точку в разряде еще долго бы искал, все теперь из этого практического примера , для себя "закрепляю" физическую реализацию битовых операций.
Спасибо, данный вопрос полностью решен.
Ответить

Вернуться в «AVR»