Ну почему я не могу так написать.
На семисегментник не выводится число из массива Исходник
Не могу найти способ правильно считать и выводить на семисегментрик такие вот значения таймеров
Может у кого завалялся правильный алгоритм или код?
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
short unsigned int k = 0;
volatile unsigned int tic=0;
volatile char tic1=0,tic2=0, tic3=0;
unsigned int Day = 0, Hh = 0, h = 0, Mm = 0, m = 0, Ss = 0, s = 0, ms = 0;
Массивы для вывода
const unsigned char codes[10]={0x14,0xD7,0x4C,0x45,0x87,0x25,0x24,0x57,0x4,0x5}; // 0-1-2-3-4-5-6-7-8-9
unsigned char counter[4]={0x08,0x04,0x02,0x01};
unsigned char data[4]={0x14,0x14,0x14,0x14};
ISR(TIMER0_OVF_vect)
{
//отключаем, считаем от нуля до трех, переключаем разряд и снова включаем
PORTC=255;
(k == 3) ? k = 0 : k++;
PORTD = data[k];
PORTC = counter[k];
// сразу для обоих портов =)
tic=tic+1; //каждые 488 преравания таймера это секунда
if (tic >= 488)
{
tic1 = tic/488; // Секунды
tic=0;
}
if (tic1 >= 60)
{
tic2 = tic1/60; // Минуты
tic1 = 0;
}
if (tic2 >= 60)
{
tic3 = tic2/24; // Часы
tic2 = 0;
}
if (tic3 >= 24) // Сутки
{
tic3 = 0;
}
}
void init_timer (void)
{
TIMSK0 = (1<<TOIE0);
TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); //8.000.000/64 = 125.000 тиков в сек. (0-1-1 - делитель на 64)
}
int main (void)
{
cli();
DDRC = 255; // готовим порты
DDRD = 255;
PORTD = 0;
init_timer (); // готовим таймер/счетчик 0
sei ();
//Главный цикл...
while(1)
{
s = tic1; // эта переменная - полноценная секунда!
m = tic2; // минута
h = tic3; // час
//Day = tic3; // день
//далее попытка вывести s в разряд...
data[3]=codes[s];
}
return 1;
}
Но если написать так, подставив глобальную переменную tsec и вернув data[3]=codes[tsec]; в прерывание, почемуто так все работает..
Как вообще можно вытащить значение глобальной переменной из прерывания?
Я ведь хотел выбрать из неё значение tsec++;
Тогда, можно было бы считать секунды минутами а минуты часами и тд
ISR(TIMER0_OVF_vect)
{
tic=tic+1; //каждые 488 преравания таймера это секунда
if (tic >= 488)
{
tsec++;
tic=0; // Секунды
}
data[3]=codes[tsec];
}
Получается, что вывод ни дисплей я могу писать либо в прерывании, либо в теле - функцией :angry2:
Думается мне, что придется считать количество поднятых статусных флагов таймера...
488 поднятий и секунда в кармане. Надо пробовать...
:maniac: