Динамическая индикация в PIC16, на С.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 936
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Динамическая индикация в PIC16, на С.

Сообщение Ghost in shell »

Доброго времени суток!
Сразу признаюсь, что это моя первая прога на С, поэтому сильно не выскубайте.
Таймер(ы) настраиваются в отдельной функции. Как и порты, объявление констант и переменных. С этим проблем нет. Хочу записать число 1234.
Вот обработчик прерываний:

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

void interrupt isr (void)
{	
if (T0IF)	
	{					
	tmp100 = tmp100 + 1;	// изменение переменной каждое преывание по переполнению TMR0
	T0IF = 0; 				
	}	
}	
Настройка таймера: (для примера, могу настроить как надо)

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

void init (void) 
{
// настройки для всех таймеров
GIE = 1;		// разрешены все немаскированные прерывания
PEIE = 1;		// разрешены все немаскированные прерывания от переферийных модулей

// регистр OPTION
T0CS = 0;	// bit 5 TMR0 Выбор источника сигнала 0 - Fosc/4 (внутренний); 1 - подача на T0CKI
T0SE = 0;	// bit 4 TMR0 Выбор фронта приращения TMR0 при внешнем тактовом сигнале (0-передний фронт)
PSA  = 0;	// bit 3 Выбор включения предделителя: 0 - перед TMR0, 1 - перед WDT
PS2  = 1;	// bit 2 Настройка предделителя на 224 Гц
PS1  = 1;	// bit 1 Настройка предделителя на 224 Гц
PS0  = 1;	// bit 0 Настройка предделителя на 224 Гц
TMR0 = 0;      // предзагрузка TMR0, сбрасывается при переполнении.
}
Запуск таймера:

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

void stTMR0 (void)	
{
T0IF = 0; 		// сброс флага прерывания по переполнению TMR0
T0IE = 1;		// Разрешение прерывания по переполнению TMR0
}
Теперь о неработающем: динамическая индикация на 4 разряда.

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

void main (void)
{ 
podgot(); // настройки портов, АЦП и т.п.
init(); // настройка таймеров
stTMR0(); запуск TMR0
for(;;)
{
while (tmp100 == 10) // ждать 10-ти прерываний от TMR0
	{
	all_1 = 0; // общий анод 1-го разряда
	PORTB = arr_seg [1]; // запись в порт, подключенный к сегментам, числа из ячейки массива
	}
while (tmp100 == 20)
	{
	gash (); // гашение всех разрядов
	}

while (tmp100 == 35)
	{
	all_2 = 0;
	PORTB = arr_seg [2];
	}
while (tmp100 == 35)
	{
	gash ();
	}

while (tmp100 == 40)
	{
	all_3 = 0;
	PORTB = arr_seg [3];
	}
while (tmp100 == 50)
	{
	gash ();
	}

while (tmp100 == 55)
	{
	all_4 = 0;
	PORTB = arr_seg [4];
	}
while (tmp100 == 60)
	{
	gash ();
	}
tmp100 = 0;
} 
}
как загорается еденица в первом разряде так и горит... Теории я прочитал немеряно, но там если не макросы так асм... поэтому ожидаю практической помощи.
Кот гуляет сам по себе, но вблизи холодильника.
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Динамическая индикация в PIC16, на С.

Сообщение urry »

ошибка в идеологии. Выносить короткие операции из прерывания нет никакого смысла, выражение
while (tmp100 == 10) // ждать 10-ти прерываний от TMR0
крайне сомнительное, а литературы по динамической индикации море.
Почитайте здесь http://vrtp.ru/index.php?showtopic=10583&st=0
Реклама
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 936
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Динамическая индикация в PIC16, на С.

Сообщение Ghost in shell »

urry
Спасибо огромное! Будете в Киеве - с меня большое пиво!!!!!!!!!!!!!!
У меня получилось попроще - переменная для каждого разряда у меня изначально отдельно. (Счет времени - там не везде десятичная система) И цифрогенератор я оставляю в двоичном виде: так при разводке платы легче оптимизировать выводы. Настройку TMR1 не совсем понял, сделал на TMR0. А идея с разбивкой на 4 байта - блеск.
Кот гуляет сам по себе, но вблизи холодильника.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»