Первые часы - очень много вопросов

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вс мар 30, 2014 21:41:24
Откуда: Украина

Сообщение sanyo.95 »

metan писал(а):Покажите 2 последних кода
Первый, не работает (это часы)

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

#include <mega8.h>
#include <delay.h>
 static flash unsigned char display[]=    // масив для индикатора
 {
  (0b11000000), // 0
  (0b11111001), // 1
  (0b10100100), // 2
  (0b10110000), // 3
  (0b10011001), // 4
  (0b10010010), // 5
  (0b10000010), // 6
  (0b11111000), // 7
  (0b10000000), // 8
  (0b10010000), // 9  
 };
unsigned char seconds, ten_seconds, minutes, ten_minutes, hours, ten_hours;
     
interrupt [TIM2_COMP] void timer2_comp_isr(void)    // прерывание по таймеру 2
 {
  TCNT2=0x00;        // обнуляем счетный регистр
  seconds++;         // условия работы часов
   if(seconds>=10)
  {
   seconds=0;
   ten_seconds++;
  }
  if(ten_seconds>=6)
  {
  ten_seconds=0;
  minutes++;
  }
  if(minutes>=10)
  {
  minutes=0;
  ten_minutes++;
  }
   if(ten_minutes>=6)
  {
  ten_minutes=0;
  hours++;
  }
  if(hours>=10)
  {
  hours=0;
  ten_hours++;
  }
  if(ten_hours>=2&&hours==4)
  {
  ten_hours=0;
  hours=0; 
  } 
 }


void main(void)
{
PORTC=0x00;
DDRC=0x1F;
PORTD=0x00;
DDRD=0b11111111;

ASSR=0b00001000;      // таймер в асинхронном режиме
TCCR2=0b00000110;     // делитель
TCNT2=0x00;
OCR2=127;             // регистр сравнения
TIMSK=0b10000000;
#asm("sei") 

TIMSK &=~(1<<OCIE2 | 1<< TOIE2);   // Запрещаем прерывания таймера 2
ASSR  = 1<<AS2;            // Включаем асинхронный режим
TCNT2 = 0;
TCCR2 = 5<<CS20;          // Предделитель на 128 на 32768 даст 256 тиков в секунду
               // Что даст 1 прерывание по переполнению в секунду.

while(ASSR & (1<<TCN2UB | 1<<OCR2UB | TCR2UB));

TIFR  |= 1<<OCF2 | 1<< TOV2;      // Сбрасываем флаги прерываний, на всякий случай.

TIMSK |= 1<< TOIE2 | 1<<TOIE0;   // Нулевой таймер для индикации 


while (1)
{
 //динамическая индикация             
 PORTC.0=1;                  // первый разряд, десятки часов
 PORTD=display[ten_hours];
 delay_us(10);
 PORTC.0=0;
 
 PORTC.1=1;                  // второй разряд, единици часов
 PORTD=display[hours];
 delay_us(10);
 PORTC.1=0;
 
 PORTC.2=1;                     //третий разряд, десятки минут
 PORTD=display[ten_minutes];
 delay_us(10);
 PORTC.2=0;
 
 PORTC.3=1;                   // четвертый разряд, единици минут
 PORTD=display[minutes];
 delay_us(10);
 PORTC.3=0;
 
 PORTC.4=1;                    // пятый разряд, десятки секунд
 PORTD=display[ten_seconds];
 delay_us(10);
 PORTC.4=0;
 
 PORTC.5=1;                    //шестой разряд, единици секунд
 PORTD=display[seconds];
 delay_us(10);
 PORTC.5=0;       
                            
}
}
Этот работает:

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

#include <mega8.h>
#include <delay.h>
static flash unsigned char display[]=    // масив для индикатора
 {
  (0b11000000), // 0
  (0b11111001), // 1
  (0b10100100), // 2
  (0b10110000), // 3
  (0b10011001), // 4
  (0b10010010), // 5
  (0b10000010), // 6
  (0b11111000), // 7
  (0b10000000), // 8
  (0b10010000), // 9  
 };
char sec=0;
interrupt [TIM2_COMP] void timer2_comp_isr(void)    // прерывание по таймеру 2
 {
  TCNT2=0x00;        // обнуляем счетный регистр
  sec++;
  if(sec==10) sec=0;
 }
void main(void)
{   
PORTC=0b11011111;
DDRC=0b00000000;
PORTD=0x00;
DDRD=0x00;

ASSR=0b00001000;      // таймер в асинхронном режиме
TCCR2=0b00000110;     // делитель
TCNT2=0x00;
OCR2=127;             // регистр сравнения
TIMSK=0b10000000;
#asm("sei")


while (1)
{                 
PORTD=display[sec];  
}
}
Реклама
Вымогатель припоя
Сообщения: 602
Зарегистрирован: Ср янв 06, 2010 10:01:46

Сообщение metan »

sanyo.95 писал(а):Этот работает:
Хм...
А в какой разряд содержимое переменной выводится? В смысле на сетках-то чего?
Может, стоит так попробовать? Я плохо понимаю в вакууме :)

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

 PORTC.0=0;                  // первый разряд, десятки часов
 PORTD=display[ten_hours];
 delay_us(10);
 PORTC.0=1;
Ой, и конечно нафига вы время задержки такое сделали - delay_us(10), это ужос :)
delay_ms(1) думаю надо.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вс мар 30, 2014 21:41:24
Откуда: Украина

Сообщение sanyo.95 »

Блин как я мог так затупить!!! :oops:
metan, огромное вам спасибо, затикали :))
Возможно ли увеличить яркость?
Возникает видимое мерцание, я так понимаю скорость переключения разрядов нужно увеличить?
Вымогатель припоя
Сообщения: 602
Зарегистрирован: Ср янв 06, 2010 10:01:46

Сообщение metan »

sanyo.95 писал(а):Возникает видимое мерцание, я так понимаю скорость переключения разрядов нужно увеличить?
Наверное, да. Можно delay_us(500) попробовать.
А насчет яркости, померяйте ток накала, в норме ли. И анодно-сеточные напряжения. В такой программе яркость регулировать можно только числом разрядов.
Уберите секунды, и яркость должна возрасти :)
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вс мар 30, 2014 21:41:24
Откуда: Украина

Сообщение sanyo.95 »

metan писал(а):Уберите секунды, и яркость должна возрасти
Так суть задумки в том чтоб были секунды, я еще и дату собираюсь выводить... Я вот слышал про сдвиговые регистры, насколько я понимаю, с их помощью можно статическую индикацию сделать, или это очень не рационально?
Реклама
Ответить

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