Правка прошивки часов на DS3231 и ATMega32

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение Alek_von_German »

Доброго времени всем. Намедни жена попросила на кухню часы сделать, такие чтоб большие были. Я ,дабы особо не напрягаться, стащил схему и исходник у буржуя какого-то. В теории код и прошивка соответствуют моим хотелкам (читай хотелкам жены), кроме того, что в оригинальной схеме и прошивке используются 10 семисегментных индикаторов для вывода времени (ЧЧ.ММ), даты (ДД.ММ.ГГ). Мне, естественно, этого не нужно, и я убрал лишние индикаторы и децимальные точки из схемы, так же подчистил код. Теперь часы показывают только время. Но с тем же и вылезли определенные непонятки с самим кодом. Так как я программирование я начал изучать не так давно- знаний моих не хватает катастрофично, по-этому прошу помощи здесь разобраться в возникших вопросах.
1) Появился незначительный паразитный засвет сегментов, немного побороть получилось, но всё же...
2) В коде используются переменные и функции которые теоретически не нужны, такие как, например, чтение/запись даты, они же занимают место в камушке. Можно ли безболезненно их убрать?
3) Я собираюсь ставить большие индикаторы, хотель использовать две uln2803, но ситуёвина такова, что она инвертирует сигнал, ясное дело, что для исправления сего дела нужно программно инвертировать сигнал идущий на сегменты и сигналы управления индикаторами. С первым справился, а вот со вторым нихвига не вышло, на индикаторах вылазит всякая чепуха.

Привожу мой код:
Спойлер

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

#include<avr/io.h>
 #define F_CPU 8000000UL
 #include<util/delay.h>
 #include<avr/interrupt.h>

 int day=6,dd=4,mm=4,yy=20;
 unsigned int sec, min=13, hr=4;

 const unsigned int num[]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
 int d0,d1,d2,d3;

 volatile unsigned int count,count1;

 #define digit 4

 #define dataPort PORTB
 #define controlPortD PORTD
 #define controlPortC PORTC
 #define controlPortA PORTA

 #define controlPortD_Mask 0x83
 #define controlPortC_Mask 0x03
 #define controlPortA_Mask 0x7F

 #define segmentOff -1

 #define sw PINA
 #define set 4
 #define ok 3
 #define up 2
 #define down 1

 #define setEvent (sw & (1<<set))
 #define okEvent (sw & (1<<ok))
 #define upEvent (sw & (1<<up))
 #define downEvent (sw & (1<<down))

 #define LEDPORT PORTA
 #define secLed 5


 char blinkFlag;
 volatile char onFlag=0x00;

 #define timeFormat 24

 enum
 {
     hour=1,
     minute,
     date,
     month,
     year,
 };

 char segOn[12]={0x04,0x08,0x10,0x20}; // выводы на разряды индикаторов

 void display();
 void updateTime();

 ISR(TIMER1_OVF_vect)
 {
     display();
     TCNT1 = 61590;
 }

 void selectSeg(int count)
 {
     if(count < 5)
     {
         controlPortA&=controlPortA_Mask;
         controlPortC&=controlPortC_Mask;
         controlPortD&=controlPortD_Mask;
         controlPortD|=segOn[count];
     }
     else if(count == 5)
     {
         controlPortA|=segOn[count];
         controlPortC&=controlPortC_Mask;
         controlPortD&=controlPortD_Mask;
     }
     
     else if(count == -1)
     {
         controlPortA&=controlPortA_Mask;
         controlPortC&=controlPortC_Mask;
         controlPortD&=controlPortD_Mask;
     }
     else
     {
         controlPortA&=controlPortA_Mask;
         controlPortC&=controlPortC_Mask;
         controlPortD&=controlPortD_Mask;
         controlPortC|=segOn[count];
     }
 }

 void segment(int count, int seg)
 {
     if(blinkFlag == seg)
     {
         
         if(onFlag)
         {
             selectSeg(segmentOff);
             
         }
         
         else
         selectSeg(count);
     }
     else
     {
         selectSeg(count);
     }
 }

 void display()
 {
     count1++;
     if(count1>400)
     {
         count1=0;
         
         onFlag=!onFlag;
         
     }
     
     count++;
     if(count>digit)
     count=0;
     
     switch(count%digit)
     {
         case 0:
         segment(count,minute);
         dataPort=num[d0];

         break;
         
         case 1:
         segment(count,minute);
         dataPort=num[d1];
         break;
         
         case 2:
         segment(count,hour);
         dataPort=num[d2];
         break;
         
         case 3:
         segment(count,hour);
         dataPort=num[d3];
         
         break;
         
         
         
         
     }
 }

 void timer1_init()
 {
     // set up timer with prescaler = 8
     TCCR1B |= (1 << CS10);
     //TCCR1B &= ~(1 << CS10);
     //TCCR1B &= (1 << CS11);
     //TCCR1B &= ~(1 << CS12);
     TCNT1 = 63500;
     TIMSK |= (1 << TOIE1);
     sei();
 }

 int bcdtochar(char num)
 {
     return ((num/16 * 10) + (num % 16));
 }

 int dectobcd(char num)
 {
     return ((num/10)<<4) + (num % 10);
 }

 void RTC_start()
 {
     TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
     while((TWCR&0x80)==0x00);
 }

 void device()
 {
     TWDR=0xD0;                                         //RTC write (slave address)
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
     
     TWDR=0x00;                                        // word address write
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
 }

 void RTC_stp()
 {
     TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);           //stop communication
 }

 void RTC_read()
 {
     TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
     while((TWCR&0x80)==0x00);
     TWDR=0xD0;                                         //RTC запись (slave address)
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
     TWDR=0x00;                                         //RTC запись (word address)
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
     TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);              //start RTC  communication again
     while ((TWCR&0x80)==0x00);
     TWDR=0xD1;                                        // RTC command to read
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
 }

 void sec_init(unsigned char d)
 {
     TWDR=d;                                       //инициализация секунд
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
 }

 void min_init(unsigned char d)
 {
     TWDR=d;                                       //инициализация минут
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
 }

 void hr_init(unsigned char d)
 {
     TWDR=d;                                        //инициализация часов
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
 }

 void day_init(unsigned char d)
 {
     TWDR=d;                                          //days init
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
 }

 void date_init(unsigned char d)
 {
     TWDR=d;                                          //date init
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
 }

 void month_init(unsigned char d)
 {
     TWDR=d;                                         //month init
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
 }

 void yr_init(unsigned char d)
 {
     TWDR=d;                                         //year init
     TWCR=(1<<TWINT)|(1<<TWEN);
     while(!(TWCR&(1<<TWINT)));
 }

 int sec_rw()
 {
     /*int g[3];*/
     TWCR|=(1<<TWINT)|(1<<TWEA);                         //RTC чтение секунд
     while((TWCR & 0x80)==0x00);
     return bcdtochar(TWDR);
 }

 int min_rw()
 {
     TWCR|=(1<<TWINT);                                   //RTC чтение минут
     TWCR|=(1<<TWEA);
     while((TWCR & 0x80)==0x00);
     return bcdtochar(TWDR);
 }

 int hr_rw()
 {
     TWCR|=(1<<TWINT)|(1<<TWEA);                         //RTC чтение часов
     while((TWCR & 0x80)==0x00);
     return bcdtochar(TWDR);
 }

 int day_rd()
 {
     TWCR|=(1<<TWINT)|(1<<TWEA);                         //RTC day read
     while((TWCR&0x80)==0x00);
     return bcdtochar(TWDR);
 }

 int date_rw()
 {
     TWCR|=(1<<TWINT)|(1<<TWEA);                      //RTC date read
     while((TWCR & 0x80)==0x00);
     return bcdtochar(TWDR);
 }

 int month_rw()
 {
     TWCR|=(1<<TWINT)|(1<<TWEA);                     //RTC month read
     while((TWCR & 0x80)==0x00);
     return bcdtochar(TWDR);
 }

 int yr_rw()
 {
     TWCR|=(1<<TWINT);                                 //RTC year read
     TWCR&=(~(1<<TWEA));
     while((TWCR & 0x80)==0x00);
     return bcdtochar(TWDR);
 }

 void setTime()
 {
     RTC_start();
     device();
     sec_init(0);
     min_init(dectobcd(min));
     hr_init(dectobcd(hr));
     day_init(dectobcd(day));
     date_init(dectobcd(dd));
     month_init(dectobcd(mm));
     yr_init(dectobcd(yy));
     RTC_stp();
 }

 void RTC()
 {
     RTC_read();
     sec=sec_rw();
     min=min_rw();
     hr=hr_rw();
     day=day_rd();
     dd=date_rw();
     mm=month_rw();
     yy=yr_rw();
     RTC_stp();
 }

 char getPara(char count)
 {
     while(1)
     {
         updateTime();
         if(!upEvent)
         {
             count1=0;
             onFlag=0x00;
             count++;
             if(blinkFlag == hour)
             {
                 if(timeFormat == 12)
                 {
                     if(count>12)
                     count=0;
                 }
                 
                 else
                 {
                     if(count > 23)
                     count=0;
                 }
                 hr=count;
             }
             
             else if(blinkFlag == minute)
             {
                 if(count>59)
                 count=0;
                 min=count;
             }
             
             else if(blinkFlag == month)
             {
                 if(count > 12)
                 count=1;
                 mm=count;
             }
             
             else if(blinkFlag == date)
             {
                 if(mm == 4 || mm == 6  || mm == 9  || mm == 11)
                 {
                     if(count > 30)
                     count=1;
                 }
                 
                 else if(mm == 1 || mm == 3  || mm == 5  || mm == 7 || mm == 8  || mm == 10  || mm == 12)
                 {
                     if(count >31)
                     count=1;
                 }
                 
                 else
                 {
                     int y=2000+yy;
                     if(y/4 == 0 && y/400 == 0)
                     {
                         if(count > 29)
                         count=1;
                     }
                     
                     else
                     {
                         if(count > 28)
                         count=1;
                     }
                 }
                 dd=count;
             }
             
             else if(blinkFlag == year)
             {
                 if(count >99)
                 count=0;
                 yy=count;
             }
             _delay_ms(100);
         }
         
         else if(!(downEvent))
         {
             count--;
             
             _delay_ms(100);
         }
         else if(!okEvent)
         {
             _delay_ms(300);
             return count;
         }
     }
 }

 void settingTime()
 {
     blinkFlag=1;
     hr=getPara(hr);
     blinkFlag++;
     min=getPara(min);
     blinkFlag=0;
 }

 void updateTime()
 {
     d0=min%10;
     d1=min/10;
     d2=hr%10;
     d3=hr/10;
     
 }

 int main(void)
 {
     /*unsigned long int Time;*/
     DDRB=0xff;
     DDRA=0xE0;
     PORTA=0x1E;
     DDRD=0xff;
     DDRC=0xff;
     timer1_init();
     while(1)
     {
         RTC();
         updateTime();
         _delay_ms(500);
         LEDPORT|=1<<secLed;
         _delay_ms(500);
         LEDPORT&=~(1<<secLed);
         
         if (!setEvent)
         {
             settingTime();
             setTime();
         }
     }
 }

Также привожу оригинальный исходник:

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

#include<avr/io.h>
#define F_CPU 8000000UL
#include<util/delay.h>
#include<avr/interrupt.h>

int day=6,dd=1,mm=3,yy=19;
unsigned int sec, min=13, hr=4;

const unsigned int num[]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
int d0,d1,d2,d3,d4,d5,d6,d7,d8,d9;

volatile unsigned int count,count1;

#define digit 13

#define dataPort PORTB
#define controlPortD PORTD
#define controlPortC PORTC
#define controlPortA PORTA

#define controlPortD_Mask 0x83
#define controlPortC_Mask 0x03
#define controlPortA_Mask 0x7F

#define segmentOff -1

#define sw PINA
#define set 4
#define ok 3
#define up 2
#define down 1

#define setEvent (sw & (1<<set))
#define okEvent (sw & (1<<ok))
#define upEvent (sw & (1<<up))
#define downEvent (sw & (1<<down))

#define LEDPORT PORTA
#define secLed 5
#define BUZPORT PORTD
#define buzzer 7

char blinkFlag;
volatile char onFlag=0x00;

#define timeFormat 24

enum
{
    hour=1,
    minute,
    date,
    month,
    year,
};

char segOn[12]={0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x80,0x10,0x20,0x04,0x08};

void display();
void updateTime();

ISR(TIMER1_OVF_vect)
{
    display();
    TCNT1 = 64000;
}

void selectSeg(int count)
{
    if(count < 5)
    {
        controlPortA&=controlPortA_Mask;
        controlPortC&=controlPortC_Mask;
        controlPortD&=controlPortD_Mask;
        controlPortD|=segOn[count];
    }
    else if(count == 5)
    {
        controlPortA|=segOn[count];
        controlPortC&=controlPortC_Mask;
        controlPortD&=controlPortD_Mask;
    }
    
    else if(count == -1)
    {
        controlPortA&=controlPortA_Mask;
        controlPortC&=controlPortC_Mask;
        controlPortD&=controlPortD_Mask;
    }
    else
    {
        controlPortA&=controlPortA_Mask;
        controlPortC&=controlPortC_Mask;
        controlPortD&=controlPortD_Mask;
        controlPortC|=segOn[count];
    }
}

void segment(int count, int seg)
{
    if(blinkFlag == seg)
    {
        if(onFlag)
        selectSeg(segmentOff);
        else
        selectSeg(count);
    }
    else
    {
        selectSeg(count);
    }
}

void display()
{
    count1++;
    if(count1>400)
    {
        count1=0;
        onFlag=!onFlag;
    }
    
    count++;
    if(count>digit)
    count=0;
    
    switch(count%digit)
    {
        case 0:
        segment(count,minute);
        dataPort=num[d0];
        break;
        
        case 1:
        segment(count,minute);
        dataPort=num[d1];
        break;
        
        case 2:
        segment(count,hour);
        dataPort=num[d2];
        break;
        
        case 3:
        segment(count,hour);
        dataPort=num[d3];
        
        break;
        
        case 4:
        segment(count,date);
        dataPort=num[d4];
        break;
        
        case 5:
        segment(count,date);
        dataPort=num[d5];
        break;
        
        case 6:
        segment(count,month);
        dataPort=num[d6];
        break;
        
        case 7:
        segment(count,month);
        dataPort=num[d7];
        break;
        
        case 8:
        segment(count,year);
        dataPort=num[d8];
        break;
        
        case 9:
        segment(count,year);
        dataPort=num[d9];
        break;
    }
}

void timer1_init()
{
    // set up timer with prescaler = 8
    TCCR1B |= (1 << CS11);
    //TCCR1B &= ~(1 << CS10);
    //TCCR1B &= (1 << CS11);
    //TCCR1B &= ~(1 << CS12);
    TCNT1 = 63500;
    TIMSK |= (1 << TOIE1);
    sei();
}

int bcdtochar(char num)
{
    return ((num/16 * 10) + (num % 16));
}

int dectobcd(char num)
{
    return ((num/10)<<4) + (num % 10);
}

void RTC_start()
{
    TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while((TWCR&0x80)==0x00);
}

void device()
{
    TWDR=0xD0;                                         //RTC write (slave address)
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
    
    TWDR=0x00;                                        // word address write
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
}

void RTC_stp()
{
    TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);           //stop communication
}

void RTC_read()
{
    TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while((TWCR&0x80)==0x00);
    TWDR=0xD0;                                         //RTC write (slave address)
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
    TWDR=0x00;                                         //RTC write (word address)
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
    TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);              //start RTC  communication again
    while ((TWCR&0x80)==0x00);
    TWDR=0xD1;                                        // RTC command to read
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
}

void sec_init(unsigned char d)
{
    TWDR=d;                                       //second init
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
}

void min_init(unsigned char d)
{
    TWDR=d;                                       //minute init
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
}

void hr_init(unsigned char d)
{
    TWDR=d;                                        //hour init
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
}

void day_init(unsigned char d)
{
    TWDR=d;                                          //days init
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
}

void date_init(unsigned char d)
{
    TWDR=d;                                          //date init
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
}

void month_init(unsigned char d)
{
    TWDR=d;                                         //month init
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
}

void yr_init(unsigned char d)
{
    TWDR=d;                                         //year init
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)));
}

int sec_rw()
{
    int g[3];
    TWCR|=(1<<TWINT)|(1<<TWEA);                         //RTC second read
    while((TWCR & 0x80)==0x00);
    return bcdtochar(TWDR);
}

int min_rw()
{
    TWCR|=(1<<TWINT);                                   //RTC minute read
    TWCR|=(1<<TWEA);
    while((TWCR & 0x80)==0x00);
    return bcdtochar(TWDR);
}

int hr_rw()
{
    TWCR|=(1<<TWINT)|(1<<TWEA);                         //RTC hour read
    while((TWCR & 0x80)==0x00);
    return bcdtochar(TWDR);
}

int day_rd()
{
    TWCR|=(1<<TWINT)|(1<<TWEA);                         //RTC day read
    while((TWCR&0x80)==0x00);
    return bcdtochar(TWDR);
}

int date_rw()
{
    TWCR|=(1<<TWINT)|(1<<TWEA);                      //RTC date read
    while((TWCR & 0x80)==0x00);
    return bcdtochar(TWDR);
}

int month_rw()
{
    TWCR|=(1<<TWINT)|(1<<TWEA);                     //RTC month read
    while((TWCR & 0x80)==0x00);
    return bcdtochar(TWDR);
}

int yr_rw()
{
    TWCR|=(1<<TWINT);                                 //RTC year read
    TWCR&=(~(1<<TWEA));
    while((TWCR & 0x80)==0x00);
    return bcdtochar(TWDR);
}

void setTime()
{
    RTC_start();
    device();
    sec_init(0);
    min_init(dectobcd(min));
    hr_init(dectobcd(hr));
    day_init(dectobcd(day));
    date_init(dectobcd(dd));
    month_init(dectobcd(mm));
    yr_init(dectobcd(yy));
    RTC_stp();
}

void RTC()
{
    RTC_read();
    sec=sec_rw();
    min=min_rw();
    hr=hr_rw();
    day=day_rd();
    dd=date_rw();
    mm=month_rw();
    yy=yr_rw();
    RTC_stp();
}

char getPara(char count)
{
    while(1)
    {
        updateTime();
        if(!upEvent)
        {
            count1=0;
            onFlag=0x00;
            count++;
            if(blinkFlag == hour)
            {
                if(timeFormat == 12)
                {
                    if(count>12)
                    count=0;
                }
                
                else
                {
                    if(count > 23)
                    count=0;
                }
                hr=count;
            }
            
            else if(blinkFlag == minute)
            {
                if(count>59)
                count=0;
                min=count;
            }
            
            else if(blinkFlag == month)
            {
                if(count > 12)
                count=1;
                mm=count;
            }
            
            else if(blinkFlag == date)
            {
                if(mm == 4 || mm == 6  || mm == 9  || mm == 11)
                {
                    if(count > 30)
                    count=1;
                }
                
                else if(mm == 1 || mm == 3  || mm == 5  || mm == 7 || mm == 8  || mm == 10  || mm == 12)
                {
                    if(count >31)
                    count=1;
                }
                
                else
                {
                    int y=2000+yy;
                    if(y/4 == 0 && y/400 == 0)
                    {
                        if(count > 29)
                        count=1;
                    }
                    
                    else
                    {
                        if(count > 28)
                        count=1;
                    }
                }
                dd=count;
            }
            
            else if(blinkFlag == year)
            {
                if(count >99)
                count=0;
                yy=count;
            }
            _delay_ms(200);
        }
        
        else if(!(downEvent))
        {
            count--;
            if(blinkFlag == year)
            {
                if(count<0)
                count=99;
            }
            _delay_ms(100);
        }
        else if(!okEvent)
        {
            _delay_ms(1000);
            return count;
        }
    }
}

void settingTime()
{
    blinkFlag=1;
    hr=getPara(hr);
    blinkFlag++;
    min=getPara(min);
    blinkFlag++;
    dd=getPara(dd);
    blinkFlag++;
    mm=getPara(mm);
    blinkFlag++;
    yy=getPara(yy);
    blinkFlag=0;
}

void updateTime()
{
    d0=min%10;
    d1=min/10;
    d2=hr%10;
    d3=hr/10;
    d4=dd%10;
    d5=dd/10;
    d6=mm%10;
    d7=mm/10;
    d8=yy%10;
    d9=yy/10;
}

int main(void)
{
    unsigned long int Time;
    DDRB=0xff;
    DDRA=0xE0;
    PORTA=0x1E;
    DDRD=0xff;
    DDRC=0xff;
    timer1_init();
    while(1)
    {
        RTC();
        updateTime();
        _delay_ms(500);
        LEDPORT|=1<<secLed;
        _delay_ms(500);
        LEDPORT&=~(1<<secLed);
        
        if (!setEvent)
        {
            settingTime();
            setTime();
        }
    }
}
ADC.png
(175.13 КБ) 228 скачиваний
Последний раз редактировалось aen Чт апр 23, 2020 14:13:55, всего редактировалось 1 раз.
Причина: Исправил. Нарушение Правил форума п. 2.5
Хочется всё и сразу, а получаешь нихрена и постепенно...
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

1-2) А стоило ли? Может проще было не подключать ненужные 7сегментники и всё? Ну будет дергать ноги в воздухе, ну будет больше занимать места в МК. А вам это чем мешает?
3) const unsigned int num[] вначале содержит данные сегментов для включения. Их надо "инвертировать" тоже соответственно тогда.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

:)) а может ну его этого буржуя! " наши " то за всегда лучше будут!!
https://radiokot.ru/forum/viewtopic.php?f=57&t=21235
что для исправления сего дела нужно программно инвертировать сигнал идущий на сегменты
автор решил эту проблему для нас! :idea:
СпойлерРяд настроек доступ к которым осуществляется удержанием одной из кнопок при включении питания:
Выбор типа индикатора делается удержанием одной из четырех кнопок ("+", "-", "сек", "уст").
Если быть более точным то не выбор индикатора, а выбор активного 0 или 1 для зажигания сегмента и выбор активного 0 или 1 для зажигания разряда.
"+" - сегмент "0", разряд "0"
"-" - сегмент "0", разряд "1"
"сек" - сегмент "1", разряд "0"
"уст" - сегмент "1", разряд "1"
----------
можно ставить любой индикатор ОК или ОА. даже самодельный как у меня Изображение
4 сегмента , температура и дата если не нужна отключается в меню. все как ваша жена хочет :beer:

выложу и свою прошивку немного переделанную под себя, посмотри может понравится что :shock:
Вложения
урезанная_ DS3231_день_ночь.rar
(359.89 КБ) 174 скачивания
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение Alek_von_German »

[uquote="NStorm",url="/forum/viewtopic.php?p=3832236#p3832236"]3) const unsigned int num[] вначале содержит данные сегментов для включения. Их надо "инвертировать" тоже соответственно тогда.[/uquote]

Я так и сделал. Индикаторы с ОА, значит и сигналы на разряды нужно инвертировать, но почему-то не выходит.
Я вот думаю, если инвертировать в switch строки dataPort=num[d0];, по идее должны инвертироваться и сигналы на сегменты и на разряды одновременно. Или я не прав?
Спойлер

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

switch(count%digit)
     {
         case 0:
         segment(count,minute);
         dataPort=num[d0];

         break;
         
         case 1:
         segment(count,minute);
         dataPort=num[d1];
         break;
         
         case 2:
         segment(count,hour);
         dataPort=num[d2];
         break;
         
         case 3:
         segment(count,hour);
         dataPort=num[d3];
         
         break;
         
         
         
         
     }
Хочется всё и сразу, а получаешь нихрена и постепенно...
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

В ваше примере значение этой константы ничем не отличается от того, что написано в оригинале.
const unsigned char num[]={~0X40,~0X79,~0X24,~0X30,~0X19,~0X12,~0X02,~0X78,~0X00,~0X10};
Вот так можно сделать. Только int на char поменяйте. int - 16-битная.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение Alek_von_German »

[uquote="NStorm",url="/forum/viewtopic.php?p=3832880#p3832880"]const unsigned char num[]={~0X40,~0X79,~0X24,~0X30,~0X19,~0X12,~0X02,~0X78,~0X00,~0X10};
Вот так можно сделать. Только int на char поменяйте. int - 16-битная.[/uquote]

Спасибо, так и сделал.
Другой вопрос, в оригинале есть строка управления разрядами

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

char segOn[12]={0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x80,0x10,0x20,0x04,0x08};
но у меня их уже всего четыре, лишнее я убрал оставив только

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

char segOn[12]={0x04,0x08,0x10,0x20}; // выводы на разряды индикаторов
но при попытке в массиве поменять 12 на 4 на индикаторах вылазят артефакты будто другие разряды накладываются друг на друга и появляются совершенно бессмысленные цифры во времени типа 13 часов 99 минут.
Вроде решил это, нужно было в строках
Спойлер

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

 count++;
    if(count>digit)
    count=0;
    
    switch(count%digit)
заменить на

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

 count++;
     if(count>digit)
     count=0;
     
     switch(count)
Остался пока только засвет...
Хочется всё и сразу, а получаешь нихрена и постепенно...
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

В функции selectSeg() уберите последний блок:

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

    else
    {
        controlPortA&=controlPortA_Mask;
        controlPortC&=controlPortC_Mask;
        controlPortD&=controlPortD_Mask;
        controlPortC|=segOn[count];
    }
Это конечно "костыльное" лечение... и может не поможет. Более детально искать сейчас некогда, если не поможет - напишите, может позже будет время глянуть детальнее.
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Alek_von_German писал(а):в оригинале есть строка управления разрядами
Код:
char segOn[12]={0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x80,0x10,0x20,0x04,0x08};
но у меня их уже всего четыре, лишнее я убрал оставив только
Код:
char segOn[12]={0x04,0x08,0x10,0x20}; // выводы на разряды индикаторов
но при попытке в массиве поменять 12 на 4 на индикаторах вылазят артефакты
я вижу, что это 12 СЕГМЕНТОВ, а не разрядов.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение Alek_von_German »

[uquote="NStorm",url="/forum/viewtopic.php?p=3832919#p3832919"]В функции selectSeg() уберите последний блок:
.[/uquote]
Неа, я с этим уже тоже игрался раньше, не помогало.

ну это ж не я функции описывал, буржую почему-то так захотелось обозвать.

Добавлено after 3 minutes 41 second:
[uquote="Starichok51",url="/forum/viewtopic.php?p=3832949#p3832949"]я вижу, что это 12 СЕГМЕНТОВ, а не разрядов.[/uquote]
Хочется всё и сразу, а получаешь нихрена и постепенно...
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение Alek_von_German »

Так в общем разобрался я почти во всём, если кому-то еще интересно, единственное, что осталось, так это засвет(((
Хочется всё и сразу, а получаешь нихрена и постепенно...
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

А на статической индикации на этих сегментах засвета не будет?
Собутыльник Кота
Сообщения: 2804
Зарегистрирован: Вс фев 02, 2020 09:12:37

Сообщение 1en2 »

Я не знаю как это выглядит в коде, а последовательность должна быть такой - потушили сегменты, переключили разряд, зажгли сегменты. После "потушили" можно вставить задержку 10 мкс, например, на закрытие ключей...
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Да, я также и предположил, что из-за снижения кол-ва разрядов/сегментов возросла частота переключения между разрядами и соотв. все эти эффекты засветки.
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение Alek_von_German »

[uquote="1en2",url="/forum/viewtopic.php?p=3833417#p3833417"]Я не знаю как это выглядит в коде, а последовательность должна быть такой - потушили сегменты, переключили разряд, зажгли сегменты. После "потушили" можно вставить задержку 10 мкс, например, на закрытие ключей...[/uquote] Вы совершенно правы, такой способ описан много где, но, в коде переключение разряда и символа происходит одновременно, ничего не тушится и задержек нету...
NStorm писал(а):Да, я также и предположил, что из-за снижения кол-ва разрядов/сегментов возросла частота переключения между разрядами и соотв. все эти эффекты засветки.
Изменение частоты переключения на засветку немнооожечко повлияло, стало почти незаметно.
Хотел избавиться от switch-a, вроде правильно колхожу, но где-то еще из виду что-то упускаю. Ну ничего, главное лапки не опускать, а курить книги!))
Да, кстати, там в коде на порты накладываются маски, я не понимаю зачем они здесь, ведь можно и напрямую обращаться к портам?
Хочется всё и сразу, а получаешь нихрена и постепенно...
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Для ознакомления файлы из двух проектов. В одном проекте светодиоды напрямую подключены к МК. Так нельзя делать на самом деле. Но для проверки, в своих проверках иногда можно. Например лень или нет возможности прямо сейчас паять транзисторы для общих анодов-катодов.

seven_segm_led_ind.h
Спойлер

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

//==================
#ifndef SEVEN_SEGM_LED_IND_H

#define SEVEN_SEGM_LED_IND_H

#include "seven_segm_led_ind.h"
//==================

//==================
#include "main_def_func.h"
//==================

//==================
#define ANODS_PORT         PORTA
#define ANODS_PIN          PINA
#define ANODS_DDR          DDRA

//#define ANODS_2_PORT       PORTA
//#define ANODS_2_PIN        PINA
//#define ANODS_2_DDR        DDRA

#define KATODS_PORT        PORTC
#define KATODS_PIN         PINC
#define KATODS_DDR         DDRC
//==================

//==================
#define ANOD_1             1<<2
#define ANOD_2             1<<3
#define ANOD_3             1<<4
#define ANOD_4             1<<5
#define ANOD_5             1<<6
#define ANOD_6             1<<7
//------------------------------------------------------------------------
#define A                  1<<6
#define B                  1<<7 //     A
#define C                  1<<3 //   F   B
#define D                  1<<2 //     G
#define E                  1<<1 //   E   C
#define F                  1<<5 //     D
#define G                  1<<4
#define H                  1<<0
//------------------------------------------------------------------------
#define ZERO               (A | B | C | D | E | F)
#define ONE                (B | C)
#define TWO                (A | B | D | E | G)
#define THREE              (A | B | C | D | G)
#define FOUR               (B | C | F | G)
#define FIVE               (A | C | D | F | G)
#define SIX                (A | C | D | E | F | G)
#define SEVEN              (A | B | C)
#define EIGHT              (A | B | C | D | E | F | G)
#define NINE               (A | B | C | D | F | G)
#define SPACE              0

#define CHAR_SPACE         10
//==================

//==================
#define MAX_LED_INDS       6

#define ANODS_MASK         (ANOD_1 | ANOD_2 | ANOD_3 | ANOD_4 | ANOD_5 | ANOD_6)
#define KATODS_MASK        (A | B | C | D | E | F | G)
//==================

//==================
extern u08 dsp_buf [];

void clr_dsp_buf (void);
//==================

//==================
void _print_val_xxx (u08 x, u08 a);
#define print_val_xxx(x, a) _print_val_xxx(((x)-1), (a))
//==================

//==================
typedef struct index_anods
{
   u08 i;
   u08 anod;
} index_anods;
//==================

//==================
void set_proc_7_segm_ind_on (void);
void set_proc_7_segm_ind_off (void);
void proc_7_segm_ind (void);
//==================

//==================
#endif
//==================
seven_segm_led_ind.c
Спойлер

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

//==================
#include "seven_segm_led_ind.h"
//==================

//==================
struct index_anods __flash tab_index_anods [] =
{
   {0x01,   ANOD_2},
   {0x02,   ANOD_3},
   {0x03,   ANOD_4},
   {0x04,   ANOD_5},
   {0x05,   ANOD_6},
   {0x00,   ANOD_1},
};

u08 __flash table_7_segm_char [11] =
{
   ZERO,    ONE,
   TWO,     THREE,
   FOUR,    FIVE,
   SIX,     SEVEN,
   EIGHT,   NINE,
   SPACE,
};
//==================

//==================
soft_timer ST_PROC_7_SEGM_IND;
//------------------------------------------------------------------------
u08 dsp_buf [MAX_LED_INDS];
//------------------------------------------------------------------------
// Очистка буфера дисплея.

u08 dsp_buf [MAX_LED_INDS];

void clr_dsp_buf (void)
{
   for (u08 i = 0; i < MAX_LED_INDS; i++)
      dsp_buf [i] = CHAR_SPACE;
}
//==================

//==================
void _print_val_xxx (u08 x, u08 a) // Вывод числа в формате xx,x.
{
   char *ptr = num_str_buf + 7;
 
   char_to_str (a);

   dsp_buf[x] = *ptr; // Вывод сотен.
   dsp_buf[x++];
   ptr++;

   dsp_buf[x] = *ptr;
   dsp_buf[x++];
   ptr++;

   dsp_buf[x] = *ptr; // Вывод единиц.
}
//==================

//==================
static u08 _proc_7_segm_ind;

void set_proc_7_segm_ind_on (void)
{
   _proc_7_segm_ind = 1;
}

void set_proc_7_segm_ind_off (void)
{
   ANODS_DDR = 0;
   ANODS_PORT = 0;
   KATODS_DDR = 0;

   _proc_7_segm_ind = 0;
}

void proc_7_segm_ind (void)
{
   static u08 cnt_7_segm_ind;

   switch (_proc_7_segm_ind)
   {
      case 0:
         break;

      case 1:
         ANODS_DDR = 0xFF;
         cnt_7_segm_ind = 0;
         set_soft_timer (ST_PROC_7_SEGM_IND, 1, 1);
         _proc_7_segm_ind = 2;
         break;

      case 2:
         if (handle_soft_timer (ST_PROC_7_SEGM_IND))
         {
            u08 cnt = cnt_7_segm_ind;

            ANODS_PORT = 0;
            KATODS_DDR = 0;

            volatile u08 anods;
            volatile u08 katods;

            cnt_7_segm_ind = tab_index_anods [cnt].i;
            anods = tab_index_anods [cnt].anod;

            katods = table_7_segm_char [dsp_buf [cnt_7_segm_ind]];

            ANODS_PORT = anods;
            KATODS_DDR = katods;
         }
         break;

      default:
         break;
   }
}
//==================
Это из другого проекта. Там подключение сегменто через сдвиговый регистр, общие аноды-катоды через транзисторы. Отличие - дефайнами определять тип подключения для сегментов и для общих анодов-катодов.

seven_segm_led_ind.h
Спойлер

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

//==================
#ifndef SEVEN_SEGM_LED_IND_H

#define SEVEN_SEGM_LED_IND_H

#include "seven_segm_led_ind.h"
//==================

//==================
#include "main_def_func.h"
//==================

//==================
//#define __COMMON_METHOD_ONE__
#define __COMMON_METHOD_ZERO__

//#define __SEGMENT_METHOD_ONE__
#define __SEGMENT_METHOD_ZERO__
//==================

//==================
#define LEDS_IND_PORT           PORTC
#define LEDS_IND_PIN            PINC
#define LEDS_IND_DDR            DDRC

#define LEDS_IND                PC7
#define LEDS_IND_BIT            1<<LEDS_IND
//------------------------------------------------------------------------
#define SEVEN_SEGM_IND_1_PORT   PORTA
#define SEVEN_SEGM_IND_1_PIN    PINA
#define SEVEN_SEGM_IND_1_DDR    DDRA

#define SEVEN_SEGM_IND_1        PA0
#define SEVEN_SEGM_IND_1_BIT    1<<SEVEN_SEGM_IND_1
//------------------------------------------------------------------------
#define SEVEN_SEGM_IND_2_PORT   PORTA
#define SEVEN_SEGM_IND_2_PIN    PINA
#define SEVEN_SEGM_IND_2_DDR    DDRA

#define SEVEN_SEGM_IND_2        PA1
#define SEVEN_SEGM_IND_2_BIT    1<<SEVEN_SEGM_IND_2
//------------------------------------------------------------------------
#define SEVEN_SEGM_IND_3_PORT   PORTA
#define SEVEN_SEGM_IND_3_PIN    PINA
#define SEVEN_SEGM_IND_3_DDR    DDRA

#define SEVEN_SEGM_IND_3        PA2
#define SEVEN_SEGM_IND_3_BIT    1<<SEVEN_SEGM_IND_3
//------------------------------------------------------------------------
#define SEVEN_SEGM_IND_4_PORT   PORTA
#define SEVEN_SEGM_IND_4_PIN    PINA
#define SEVEN_SEGM_IND_4_DDR    DDRA

#define SEVEN_SEGM_IND_4        PA3
#define SEVEN_SEGM_IND_4_BIT    1<<SEVEN_SEGM_IND_4
//------------------------------------------------------------------------
#define SEVEN_SEGM_IND_5_PORT   PORTA
#define SEVEN_SEGM_IND_5_PIN    PINA
#define SEVEN_SEGM_IND_5_DDR    DDRA

#define SEVEN_SEGM_IND_5        PA4
#define SEVEN_SEGM_IND_5_BIT    1<<SEVEN_SEGM_IND_5
//------------------------------------------------------------------------
#define SEVEN_SEGM_IND_6_PORT   PORTA
#define SEVEN_SEGM_IND_6_PIN    PINA
#define SEVEN_SEGM_IND_6_DDR    DDRA

#define SEVEN_SEGM_IND_6        PA5
#define SEVEN_SEGM_IND_6_BIT    1<<SEVEN_SEGM_IND_6
//------------------------------------------------------------------------
#define SEVEN_SEGM_IND_7_PORT   PORTA
#define SEVEN_SEGM_IND_7_PIN    PINA
#define SEVEN_SEGM_IND_7_DDR    DDRA

#define SEVEN_SEGM_IND_7        PA6
#define SEVEN_SEGM_IND_7_BIT    1<<SEVEN_SEGM_IND_7
//------------------------------------------------------------------------
#define SEVEN_SEGM_IND_8_PORT   PORTA
#define SEVEN_SEGM_IND_8_PIN    PINA
#define SEVEN_SEGM_IND_8_DDR    DDRA

#define SEVEN_SEGM_IND_8        PA7
#define SEVEN_SEGM_IND_8_BIT    1<<SEVEN_SEGM_IND_8
//==================

/*
//==================
#ifdef __COMMON_METHOD_ONE__
#define set_seven_segm_ind_1_on()  set_bit (SEVEN_SEGM_IND_1_PORT, SEVEN_SEGM_IND_1)
#define set_seven_segm_ind_2_on()  set_bit (SEVEN_SEGM_IND_2_PORT, SEVEN_SEGM_IND_2)
#define set_seven_segm_ind_3_on()  set_bit (SEVEN_SEGM_IND_3_PORT, SEVEN_SEGM_IND_3)
#define set_seven_segm_ind_4_on()  set_bit (SEVEN_SEGM_IND_4_PORT, SEVEN_SEGM_IND_4)
#define set_seven_segm_ind_5_on()  set_bit (SEVEN_SEGM_IND_5_PORT, SEVEN_SEGM_IND_5)
#define set_seven_segm_ind_6_on()  set_bit (SEVEN_SEGM_IND_6_PORT, SEVEN_SEGM_IND_6)
#define set_seven_segm_ind_7_on()  set_bit (SEVEN_SEGM_IND_7_PORT, SEVEN_SEGM_IND_7)
#define set_seven_segm_ind_8_on()  set_bit (SEVEN_SEGM_IND_8_PORT, SEVEN_SEGM_IND_8)

#define set_leds_ind_on()          set_bit (LEDS_IND_PORT, LEDS_IND)
//------------------------------------------------------------------------
#define set_seven_segm_ind_1_off() clr_bit (SEVEN_SEGM_IND_1_PORT, SEVEN_SEGM_IND_1)
#define set_seven_segm_ind_2_off() clr_bit (SEVEN_SEGM_IND_2_PORT, SEVEN_SEGM_IND_2)
#define set_seven_segm_ind_3_off() clr_bit (SEVEN_SEGM_IND_3_PORT, SEVEN_SEGM_IND_3)
#define set_seven_segm_ind_4_off() clr_bit (SEVEN_SEGM_IND_4_PORT, SEVEN_SEGM_IND_4)
#define set_seven_segm_ind_5_off() clr_bit (SEVEN_SEGM_IND_5_PORT, SEVEN_SEGM_IND_5)
#define set_seven_segm_ind_6_off() clr_bit (SEVEN_SEGM_IND_6_PORT, SEVEN_SEGM_IND_6)
#define set_seven_segm_ind_7_off() clr_bit (SEVEN_SEGM_IND_7_PORT, SEVEN_SEGM_IND_7)
#define set_seven_segm_ind_8_off() clr_bit (SEVEN_SEGM_IND_8_PORT, SEVEN_SEGM_IND_8)

#define set_leds_ind_off()         clr_bit (LEDS_IND_PORT, LEDS_IND)
#endif
//------------------------------------------------------------------------

//------------------------------------------------------------------------
#ifdef __COMMON_METHOD_ZERO__
#define set_seven_segm_ind_1_on()  clr_bit (SEVEN_SEGM_IND_1_PORT, SEVEN_SEGM_IND_1)
#define set_seven_segm_ind_2_on()  clr_bit (SEVEN_SEGM_IND_2_PORT, SEVEN_SEGM_IND_2)
#define set_seven_segm_ind_3_on()  clr_bit (SEVEN_SEGM_IND_3_PORT, SEVEN_SEGM_IND_3)
#define set_seven_segm_ind_4_on()  clr_bit (SEVEN_SEGM_IND_4_PORT, SEVEN_SEGM_IND_4)
#define set_seven_segm_ind_5_on()  clr_bit (SEVEN_SEGM_IND_5_PORT, SEVEN_SEGM_IND_5)
#define set_seven_segm_ind_6_on()  clr_bit (SEVEN_SEGM_IND_6_PORT, SEVEN_SEGM_IND_6)
#define set_seven_segm_ind_7_on()  clr_bit (SEVEN_SEGM_IND_7_PORT, SEVEN_SEGM_IND_7)
#define set_seven_segm_ind_8_on()  clr_bit (SEVEN_SEGM_IND_8_PORT, SEVEN_SEGM_IND_8)

#define set_leds_ind_on()          clr_bit (LEDS_IND_PORT, LEDS_IND)
//------------------------------------------------------------------------
#define set_seven_segm_ind_1_off() set_bit (SEVEN_SEGM_IND_1_PORT, SEVEN_SEGM_IND_1)
#define set_seven_segm_ind_2_off() set_bit (SEVEN_SEGM_IND_2_PORT, SEVEN_SEGM_IND_2)
#define set_seven_segm_ind_3_off() set_bit (SEVEN_SEGM_IND_3_PORT, SEVEN_SEGM_IND_3)
#define set_seven_segm_ind_4_off() set_bit (SEVEN_SEGM_IND_4_PORT, SEVEN_SEGM_IND_4)
#define set_seven_segm_ind_5_off() set_bit (SEVEN_SEGM_IND_5_PORT, SEVEN_SEGM_IND_5)
#define set_seven_segm_ind_6_off() set_bit (SEVEN_SEGM_IND_6_PORT, SEVEN_SEGM_IND_6)
#define set_seven_segm_ind_7_off() set_bit (SEVEN_SEGM_IND_7_PORT, SEVEN_SEGM_IND_7)
#define set_seven_segm_ind_8_off() set_bit (SEVEN_SEGM_IND_8_PORT, SEVEN_SEGM_IND_8)

#define set_leds_ind_off()         set_bit (LEDS_IND_PORT, LEDS_IND)
#endif
//==================
*/

//==================
void set_seven_segm_ind_1_on (void);
void set_seven_segm_ind_2_on (void);
void set_seven_segm_ind_3_on (void);
void set_seven_segm_ind_4_on (void);
void set_seven_segm_ind_5_on (void);
void set_seven_segm_ind_6_on (void);
void set_seven_segm_ind_7_on (void);
void set_seven_segm_ind_8_on (void);

void set_leds_ind_on (void);
//------------------------------------------------------------------------
void set_seven_segm_ind_1_off (void);
void set_seven_segm_ind_2_off (void);
void set_seven_segm_ind_3_off (void);
void set_seven_segm_ind_4_off (void);
void set_seven_segm_ind_5_off (void);
void set_seven_segm_ind_6_off (void);
void set_seven_segm_ind_7_off (void);
void set_seven_segm_ind_8_off (void);

void set_leds_ind_off (void);
//==================

//==================
#define SEG_A              b00000001 // 1<<0
#define SEG_B              b00000010 // 1<<1 //     A
#define SEG_C              b00000100 // 1<<2 //   F   B
#define SEG_D              b00001000 // 1<<3 //     G
#define SEG_E              b00010000 // 1<<4 //   E   C
#define SEG_F              b00100000 // 1<<5 //     D   H
#define SEG_G              b01000000 // 1<<6
#define SEG_H              b10000000 // 1<<7
//------------------------------------------------------------------------
typedef struct tab_char_7_segm_cod_t
{
   u08 Char;
   u08 seven_segm_cod;
} tab_char_7_segm_cod_t;

extern struct tab_char_7_segm_cod_t __flash tab_char_7_segm_cod [];
//==================

//==================
#define MAX_LED_INDS       8
//==================

//==================
extern u08 dsp_buf [];

void clr_dsp_buf (void);
//==================

//==================
void set_proc_7_segm_ind_on (void);
void set_proc_7_segm_ind_off (void);
void proc_7_segm_ind (void);

u08 recod_char_7_segm_cod (u08 data);

void all_indications_init (void);
void all_indications_off (void);
//==================

//==================
#endif
//==================
seven_segm_led_ind.с
Спойлер

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

//==================
#include "seven_segm_led_ind.h"
//==================

//==================
struct tab_char_7_segm_cod_t __flash tab_char_7_segm_cod [] =
{
#ifdef __SEGMENT_METHOD_ONE__
   {'0',   (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)},                  // 0
   {'1',   (SEG_B | SEG_C)},                                                  // 1
   {'2',   (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)},                          // 2
   {'3',   (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)},                          // 3
   {'4',   (SEG_B | SEG_C | SEG_F | SEG_G)},                                  // 4
   {'5',   (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)},                          // 5
   {'6',   (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)},                  // 6
   {'7',   (SEG_A | SEG_B | SEG_C)},                                          // 7
   {'8',   (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)},          // 8
   {'9',   (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)},                  // 9
   {'A',   (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)},                  // 10
   {'B',   (SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)},                          // 11
   {'C',   (SEG_A | SEG_D | SEG_E | SEG_F)},                                  // 12
   {'D',   (SEG_B | SEG_C | SEG_D | SEG_E | SEG_G)},                          // 13
   {'E',   (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G)},                          // 14
   {'F',   (SEG_A | SEG_E | SEG_F | SEG_G)},                                  // 15
   {'G',   (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F)},                          // 16
   {'H',   (SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)},                          // 17
   {'L',   (SEG_D | SEG_E | SEG_F)},                                          // 18
   {'N',   (SEG_C | SEG_E | SEG_G)},                                          // 19
   {'O',   (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)},                  // 20
   {'P',   (SEG_A | SEG_B | SEG_E | SEG_F | SEG_G)},                          // 21
   {'П',   (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F)},                          // 22
   {'-',   (SEG_G)},                                                          // 23
   {' ',   0xFF},                                                             // 24
#endif

#ifdef __SEGMENT_METHOD_ZERO__
   {'0',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F))},         // 0
   {'1',   (0xFF ^ (SEG_B | SEG_C))},                                         // 1
   {'2',   (0xFF ^ (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G))},                 // 2
   {'3',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G))},                 // 3
   {'4',   (0xFF ^ (SEG_B | SEG_C | SEG_F | SEG_G))},                         // 4
   {'5',   (0xFF ^ (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G))},                 // 5
   {'6',   (0xFF ^ (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G))},         // 6
   {'7',   (0xFF ^ (SEG_A | SEG_B | SEG_C))},                                 // 7
   {'8',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G))}, // 8
   {'9',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G))},         // 9
   {'A',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G))},         // 10
   {'B',   (0xFF ^ (SEG_C | SEG_D | SEG_E | SEG_F | SEG_G))},                 // 11
   {'C',   (0xFF ^ (SEG_A | SEG_D | SEG_E | SEG_F))},                         // 12
   {'D',   (0xFF ^ (SEG_B | SEG_C | SEG_D | SEG_E | SEG_G))},                 // 13
   {'E',   (0xFF ^ (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G))},                 // 14
   {'F',   (0xFF ^ (SEG_A | SEG_E | SEG_F | SEG_G))},                         // 15
   {'G',   (0xFF ^ (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F))},                 // 16
   {'H',   (0xFF ^ (SEG_B | SEG_C | SEG_E | SEG_F | SEG_G))},                 // 17
   {'L',   (0xFF ^ (SEG_D | SEG_E | SEG_F))},                                 // 18
   {'N',   (0xFF ^ (SEG_C | SEG_E | SEG_G))},                                 // 19
   {'O',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F))},         // 20
   {'P',   (0xFF ^ (SEG_A | SEG_B | SEG_E | SEG_F | SEG_G))},                 // 21
   {'П',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F))},                 // 22
   {'-',   (0xFF ^ (SEG_G))},                                                 // 23
   {' ',   0xFF},                                                             // 24
#endif

   {0xFF,   0xFF},
};
//==================

//==================
u08 dsp_buf [MAX_LED_INDS];
//------------------------------------------------------------------------
// Очистка буфера дисплея.

u08 dsp_buf [MAX_LED_INDS];

void clr_dsp_buf (void)
{
   for (u08 i = 0; i < MAX_LED_INDS; i++)
      dsp_buf [i] = ' ';
}
//==================

//==================
u08 recod_char_7_segm_cod (u08 data)
{
   struct tab_char_7_segm_cod_t __flash *ptr = tab_char_7_segm_cod;

   for (; ptr -> Char != 0xFF; ptr++)
   {
      if (ptr -> Char == data)
         return ptr -> seven_segm_cod;
   }

   return false;
}
//==================

//==================
__flash FUNC proc_7_segm_ind_func [9] =
{
   set_seven_segm_ind_1_on,
   set_seven_segm_ind_2_on,
   set_seven_segm_ind_3_on,
   set_seven_segm_ind_4_on,
   set_seven_segm_ind_5_on,
   set_seven_segm_ind_6_on,
   set_seven_segm_ind_7_on,
   set_seven_segm_ind_8_on,
   set_leds_ind_on,
};

static u08 _proc_7_segm_ind;

void set_proc_7_segm_ind_on (void)
{
   _proc_7_segm_ind = 1;
}

void set_proc_7_segm_ind_off (void)
{
   all_indications_off ();
   _74act164_transf (0xFF);

   _proc_7_segm_ind = 0;
}

void proc_7_segm_ind (void)
{
   static soft_timer ST_PROC_7_SEGM_IND;

   static u08 cnt_7_segm_ind;

   u08 segments;

   switch (_proc_7_segm_ind)
   {
      case 0:
         break;

      case 1:
         all_indications_init ();
         clr_dsp_buf ();
         cnt_7_segm_ind = 0;
         set_soft_timer (ST_PROC_7_SEGM_IND, 0, 1);
         _proc_7_segm_ind = 2;
         break;

      case 2:
         if (handle_soft_timer (ST_PROC_7_SEGM_IND))
         {
            all_indications_off ();

            if (cnt_7_segm_ind < MAX_LED_INDS)
            {
               segments = recod_char_7_segm_cod (dsp_buf [cnt_7_segm_ind]);

               if ((get_dp_flag () == true) && (cnt_7_segm_ind == 2))
               {
                  #ifdef __SEGMENT_METHOD_ONE__
                  segments |= SEG_H;
                  #endif

                  #ifdef __SEGMENT_METHOD_ZERO__
                  segments &= (0xFF ^ SEG_H);
                  #endif
               }

               _74act164_transf (segments);
            }
            else
               _74act164_transf (get_leds_buf ());

            proc_7_segm_ind_func [cnt_7_segm_ind] ();

            if (++cnt_7_segm_ind > 8)
               cnt_7_segm_ind = 0;
         }
         break;

      default:
         break;
   }
}
//==================

//==================
#ifdef __COMMON_METHOD_ONE__
void set_seven_segm_ind_1_on (void)
{
   set_bit (SEVEN_SEGM_IND_1_PORT, SEVEN_SEGM_IND_1);
}

void set_seven_segm_ind_2_on (void)
{
   set_bit (SEVEN_SEGM_IND_2_PORT, SEVEN_SEGM_IND_2);
}

void set_seven_segm_ind_3_on (void)
{
   set_bit (SEVEN_SEGM_IND_3_PORT, SEVEN_SEGM_IND_3);
}

void set_seven_segm_ind_4_on (void)
{
   set_bit (SEVEN_SEGM_IND_4_PORT, SEVEN_SEGM_IND_4);
}

void set_seven_segm_ind_5_on (void)
{
   set_bit (SEVEN_SEGM_IND_5_PORT, SEVEN_SEGM_IND_5);
}

void set_seven_segm_ind_6_on (void)
{
   set_bit (SEVEN_SEGM_IND_6_PORT, SEVEN_SEGM_IND_6);
}

void set_seven_segm_ind_7_on (void)
{
   set_bit (SEVEN_SEGM_IND_7_PORT, SEVEN_SEGM_IND_7);
}

void set_seven_segm_ind_8_on (void)
{
   set_bit (SEVEN_SEGM_IND_8_PORT, SEVEN_SEGM_IND_8);
}

void set_leds_ind_on (void)
{
   set_bit (LEDS_IND_PORT, LEDS_IND);
}
//------------------------------------------------------------------------
void set_seven_segm_ind_1_off (void)
{
   clr_bit (SEVEN_SEGM_IND_1_PORT, SEVEN_SEGM_IND_1);
}

void set_seven_segm_ind_2_off (void)
{
   clr_bit (SEVEN_SEGM_IND_2_PORT, SEVEN_SEGM_IND_2);
}

void set_seven_segm_ind_3_off (void)
{
   clr_bit (SEVEN_SEGM_IND_3_PORT, SEVEN_SEGM_IND_3);
}

void set_seven_segm_ind_4_off (void)
{
   clr_bit (SEVEN_SEGM_IND_4_PORT, SEVEN_SEGM_IND_4);
}

void set_seven_segm_ind_5_off (void)
{
   clr_bit (SEVEN_SEGM_IND_5_PORT, SEVEN_SEGM_IND_5);
}

void set_seven_segm_ind_6_off (void)
{
   clr_bit (SEVEN_SEGM_IND_6_PORT, SEVEN_SEGM_IND_6);
}

void set_seven_segm_ind_7_off (void)
{
   clr_bit (SEVEN_SEGM_IND_7_PORT, SEVEN_SEGM_IND_7);
}

void set_seven_segm_ind_8_off (void)
{
   clr_bit (SEVEN_SEGM_IND_8_PORT, SEVEN_SEGM_IND_8);
}

void set_leds_ind_off (void)
{
   clr_bit (LEDS_IND_PORT, LEDS_IND);
}
#endif
//------------------------------------------------------------------------

//------------------------------------------------------------------------
#ifdef __COMMON_METHOD_ZERO__
void set_seven_segm_ind_1_on (void)
{
   clr_bit (SEVEN_SEGM_IND_1_PORT, SEVEN_SEGM_IND_1);
}

void set_seven_segm_ind_2_on (void)
{
   clr_bit (SEVEN_SEGM_IND_2_PORT, SEVEN_SEGM_IND_2);
}

void set_seven_segm_ind_3_on (void)
{
   clr_bit (SEVEN_SEGM_IND_3_PORT, SEVEN_SEGM_IND_3);
}

void set_seven_segm_ind_4_on (void)
{
   clr_bit (SEVEN_SEGM_IND_4_PORT, SEVEN_SEGM_IND_4);
}

void set_seven_segm_ind_5_on (void)
{
   clr_bit (SEVEN_SEGM_IND_5_PORT, SEVEN_SEGM_IND_5);
}

void set_seven_segm_ind_6_on (void)
{
   clr_bit (SEVEN_SEGM_IND_6_PORT, SEVEN_SEGM_IND_6);
}

void set_seven_segm_ind_7_on (void)
{
   clr_bit (SEVEN_SEGM_IND_7_PORT, SEVEN_SEGM_IND_7);
}

void set_seven_segm_ind_8_on (void)
{
   clr_bit (SEVEN_SEGM_IND_8_PORT, SEVEN_SEGM_IND_8);
}

void set_leds_ind_on (void)
{
   clr_bit (LEDS_IND_PORT, LEDS_IND);
}         
//------------------------------------------------------------------------
void set_seven_segm_ind_1_off (void)
{
   set_bit (SEVEN_SEGM_IND_1_PORT, SEVEN_SEGM_IND_1);
}

void set_seven_segm_ind_2_off (void)
{
   set_bit (SEVEN_SEGM_IND_2_PORT, SEVEN_SEGM_IND_2);
}

void set_seven_segm_ind_3_off (void)
{
   set_bit (SEVEN_SEGM_IND_3_PORT, SEVEN_SEGM_IND_3);
}

void set_seven_segm_ind_4_off (void)
{
   set_bit (SEVEN_SEGM_IND_4_PORT, SEVEN_SEGM_IND_4);
}

void set_seven_segm_ind_5_off (void)
{
   set_bit (SEVEN_SEGM_IND_5_PORT, SEVEN_SEGM_IND_5);
}

void set_seven_segm_ind_6_off (void)
{
   set_bit (SEVEN_SEGM_IND_6_PORT, SEVEN_SEGM_IND_6);
}

void set_seven_segm_ind_7_off (void)
{
   set_bit (SEVEN_SEGM_IND_7_PORT, SEVEN_SEGM_IND_7);
}

void set_seven_segm_ind_8_off (void)
{
   set_bit (SEVEN_SEGM_IND_8_PORT, SEVEN_SEGM_IND_8);
}

void set_leds_ind_off (void)
{
   set_bit (LEDS_IND_PORT, LEDS_IND);
}
#endif
//==================

//==================
void all_indications_init (void)
{
   _74act164_init ();

   set_bit (SEVEN_SEGM_IND_1_DDR, SEVEN_SEGM_IND_1);
   set_bit (SEVEN_SEGM_IND_2_DDR, SEVEN_SEGM_IND_2);
   set_bit (SEVEN_SEGM_IND_3_DDR, SEVEN_SEGM_IND_3);
   set_bit (SEVEN_SEGM_IND_4_DDR, SEVEN_SEGM_IND_4);
   set_bit (SEVEN_SEGM_IND_5_DDR, SEVEN_SEGM_IND_5);
   set_bit (SEVEN_SEGM_IND_6_DDR, SEVEN_SEGM_IND_6);
   set_bit (SEVEN_SEGM_IND_7_DDR, SEVEN_SEGM_IND_7);
   set_bit (SEVEN_SEGM_IND_8_DDR, SEVEN_SEGM_IND_8);

   set_bit (LEDS_IND_DDR, LEDS_IND);

   all_indications_off ();
   all_leds_off ();
}
//==================

//==================
void all_indications_off (void)
{
   set_seven_segm_ind_1_off ();
   set_seven_segm_ind_2_off ();
   set_seven_segm_ind_3_off ();
   set_seven_segm_ind_4_off ();
   set_seven_segm_ind_5_off ();
   set_seven_segm_ind_6_off ();
   set_seven_segm_ind_7_off ();
   set_seven_segm_ind_8_off ();

   set_bit (LEDS_IND_PORT, LEDS_IND);
}
//==================
Бонусом, софтовый SPI для работы со сдвиговыми регистрами.
_74act164.h
Спойлер

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

//==================
#ifndef _74ACT164_H

#define _74ACT164_H

#include "_74act164.h"

#include "main_def_func.h"
//==================

//==================
#define _74ACT164_DATA_PORT   PORTC
#define _74ACT164_DATA_PIN    PINC
#define _74ACT164_DATA_DDR    DDRC

#define _74ACT164_DATA        PC1
//------------------------------------------------------------------------
#define _74ACT164_CLK_PORT   PORTC
#define _74ACT164_CLK_PIN    PINC
#define _74ACT164_CLK_DDR    DDRC

#define _74ACT164_CLK        PC0
//==================

//==================
#define STROB_DELAY       10
//==================

//==================
void _74act164_init (void);
//------------------------------------------------------------------------
void _74act164_transf (u08 a);
//==================

//==================
#define _74act164_data_hi() set_bit (_74ACT164_DATA_PORT, _74ACT164_DATA)
#define _74act164_data_lo() clr_bit (_74ACT164_DATA_PORT, _74ACT164_DATA)
//------------------------------------------------------------------------
#define _74act164_clk_hi() set_bit (_74ACT164_CLK_PORT, _74ACT164_CLK)
#define _74act164_clk_lo() clr_bit (_74ACT164_CLK_PORT, _74ACT164_CLK)
//==================

#endif
_74act164.с
Спойлер

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

//==================
#include "_74act164.h"
//==================

//==================
void _74act164_init (void)
{
   set_bit (_74ACT164_DATA_DDR, _74ACT164_DATA);
   set_bit (_74ACT164_CLK_DDR, _74ACT164_CLK);
}
//------------------------------------------------------------------------
void _74act164_transf (u08 data)
{
   for (u08 i = 0; i < 8; i++)
   {
      __watchdog_reset ();

      if (data & 0x80)
         _74act164_data_hi ();
      else
         _74act164_data_lo ();

      data <<= 1;

      delay_us (STROB_DELAY/2);

      _74act164_clk_hi ();
      delay_us(STROB_DELAY/2);
      _74act164_clk_lo ();

      delay_us (STROB_DELAY/2);
  }
}
//==================
Контактная информация:
Ответить

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