Подскажите где собака зарыта. По 7-мисегментному

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 216
Зарегистрирован: Вс окт 23, 2011 22:18:40

Сообщение djrec »

При выводе на 7-ми сегментный индикатор на 2ке, 3ке не горит G, А на 0 не горит F. В чом может быть загвоздка.

Матрицу проверил все сходится.

вот программа. Под схему http://radiokot.ru/circuit/digital/automat/16/

#include <mega8.h>
#include <delay.h>

unsigned char sek,see,min,chasi,i,q,k;
bit m;

static flash unsigned char digit[] = { //массив с цифрами
(0b00111111), //0
(0b00000110), //1
(0b01011011), //2
(0b01001111), //3
(0b01100110), //4
(0b01101101), //5
(0b01111101), //6
(0b00000111), //7
(0b01111111), //8
(0b01101111), //9
};

////////// Timer /////////////////

interrupt [TIM2_OVF] void timer2_ovf_isr(void) //Прерывание по переполнению таймера счётчика 2
{
// TCNT2=0x00;

sek++;

if (sek==60)
{
sek=0;
min++;
}

if (min==60)
{
min=0;
chasi++;
}

if (chasi==24) chasi=0;
}

/////////// Indikator ///////////////////

void ind(unsigned char chislo)
{
unsigned char desjatki=0;

while(chislo>=10)
{
chislo-=10;
desjatki++;
}
if (m==0)
{ // PORTC=0b11111111;
// 1
PORTC.3=0;
PORTD=digit[desjatki] ;
delay_ms(5);

PORTC.3=1;
// 2
PORTC.2=0;
PORTD=digit[chislo];
delay_ms(5);

PORTC.2=1;
m=1;
}
else

{
// 3
PORTC.5=0;
PORTD=digit[desjatki] ;
delay_ms(5);
PORTC.5=1;
// 4
PORTC.4=0;
PORTD=digit[chislo];
delay_ms(5);
PORTC.4=1;
m=0;
}


};

///////////////////////////////////////////////////

void main(void)
{
PORTB=0b00111110;
DDRB=0b00000000;



// PORTC=0b11111111;
DDRC=0b11111111;

// PORTD=0b00000000;
DDRD=0b11111111;

////// TIMER//////

TIMSK |= (1 << TOIE2); // Разрешение прерывания по таймеру2
TCCR2=0b00000110; //0b00000110; // |= (1 << CS21) ; //(1 << CS20) || (1 << CS22) Предделитель на 8
OCR2=250;
#asm ("sei");






while(1) //!!!!!!! Пример цадачи в бесконечном цикле: переключение лог. уров.
{
m=0;

ind(sek);

ind(min);

if (!PINB.3)
{
delay_ms(20);
for(i=0;i<50;i++)
{
ind(77);
ind(77);

}

while(k<=2)
{
k=1;
for(i=0;i<10;i++)
{
ind(sek);
ind(min);

}
while(!PINB.5)
{
min++;
if (min==60)min=0;
for(i=0;i<10;i++)
{
ind(sek);
ind(min);

}
}

while(!PINB.4)
{
sek++;
if (sek==60)sek=0;
for(i=0;i<10;i++)
{
ind(sek);
ind(min);

}
}

if (!PINB.2)
{
delay_ms(20);
k=3;
sek=0;
}
}

k=0;
}



}

}
Реклама
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Сообщение Rtmip »

Проблема в том, что при динамической индикации надо сначала погасить разряд, а только потом вывести в порт
значение разряда и затем включить разряд. Об этом много раз поднимали вопрос на форуме.
Во вложении подправил программу с комментариями, надеюсь понятно будет. Что там с кнопками мудрите не разбирался :beer:
Похоже все это рассчитано на 4 МГц...
Свою "простыню" оформите как положено(используйте теги) :)
Вложения
timer.rar
(1.03 КБ) 124 скачивания
Реклама
Прорезались зубы
Сообщения: 216
Зарегистрирован: Вс окт 23, 2011 22:18:40

Сообщение djrec »

Спасибо за ответ, но к сожаленью не помогло.

При том что все остальные цифры выводятся нормально.
Прорезались зубы
Сообщения: 216
Зарегистрирован: Вс окт 23, 2011 22:18:40

Сообщение djrec »

Кстати первоначально писал программу для семисегментника с ОА, все работало отлично. Только поставил с ОК, переделал под ОК. И стало вот так выводить.
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 216
Зарегистрирован: Вс окт 23, 2011 22:18:40

Сообщение djrec »

Проблема исчезла сама собой после того как взамен вывода времени вбил вывод битов для тройки на все сегменты. все показало нормально. Изменил снова на вывод времени и стало нормально выводить.
Последний раз редактировалось AlekseyEnergo Ср сен 03, 2014 00:40:58, всего редактировалось 1 раз.
Причина: Нарушение пункта 2.2 правил форума. Предупрежден!
Реклама
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Сообщение Rtmip »

Чудеса :shock:
Реклама
Прорезались зубы
Сообщения: 216
Зарегистрирован: Вс окт 23, 2011 22:18:40

Сообщение djrec »

Помогите пожалуйста настроить таймер на прерывание раз в одну секунду. Частота внутреннего генератора 4 МГц
Ответить

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