реклама на сайте
подробности

 
 
> Опять двадцать пять, динамическая индикация
Василий_Безкатег...
сообщение Jun 19 2007, 12:34
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 15-09-06
Из: г. Смолевичи (Минская область)
Пользователь №: 20 403



Прошу не пинать сильно. Искал сабж по форуму, читал, но чегой-то недопонял. Есть Atmega16, компилятор IAR. К МК подключены 2 семисегментных индикатора (какие -то старенькие советские индикаторы). Схема подключения такая- на сегменты идёт сигнал с порта С (PC0-PC7)через резисторы 82 Ом, общие провода индикаторов подсоединены подсоединены к порту D (PD0 и PD2). Чтобы горели сразу два индикатора с неизменяющимся двухзначным числом написал такую программу.
---------------------------------------------------------------------------------------------------------


#include <ioavr.h>
#include <iom16.h>
#include <intrinsics.h>
int main( void )
{
int digit[10];

DDRC=0xFF; //настраиваем порт С на вывод
digit[0]=0x3F;
digit[1]=0x06;
digit[2]=0x5B;
digit[3]=0x4F; // цифры от 0 до 9
digit[4]=0x66;
digit[5]=0x6D;
digit[6]=0x7D;
digit[7]=0x07;
digit[8]=0x7F;
digit[9]=0x6F;
while(1) // бесконечный цикл
{
DDRD=0x04; // подаём единицу на PD2 -инициализируем один индикатор
PORTC =digit[1]; // подаём код цифры
__delay_cycles(2500); // задержка
DDRD=0x01; // подаём единицу на PD0-инициализируем второй индикатор
PORTC =digit[0]; // подаём код другой цифры
__delay_cycles(2500); // задержка
}
}
---------------------------------------------------------------------------------------------
А вот чтобы допустим 2 индикатора динамически отображали счёт до 99, например, не получается ;-(
Программа такая:
-------------------------------------------------------------------------
#include <ioavr.h>
#include <iom16.h>
#include <intrinsics.h>
int main( void )
{
int i;
int j;
int digit[10];
DDRC=0xFF;

digit[0]=0x3F;
digit[1]=0x06;
digit[2]=0x5B;
digit[3]=0x4F;
digit[4]=0x66;
digit[5]=0x6D;
digit[6]=0x7D;
digit[7]=0x07;
digit[8]=0x7F;
digit[9]=0x6F;
while(1)
{
for (j=0;j<10;j=j+1)
for (i=0;i<10;i=i+1)
{DDRD=0x04;
PORTC =digit[j];
__delay_cycles(90000);

DDRD=0x01;
PORTC =digit[i];
__delay_cycles(5000000);
}
}
}
=================================================
Пните пожалуйста, что и как писать чтобы считала до 99 в бесконечном цикле и при этом 2 индикатора горели постоянно. На Си это первые опыты для микроконтроллеров, с начала начал осваивать ассемблер.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Василий_Безкатег...
сообщение Jun 20 2007, 12:57
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 15-09-06
Из: г. Смолевичи (Минская область)
Пользователь №: 20 403



Спасибо за подробный ответ!
Цитата
Синхронизируются асинхронные процессы обычно с помощью буферов.

Вы имеете ввиду микросхемы буферов?

А вот если идёт счёт на двух индикаторах до 99 секунд?
Мне всё равно надо использовать один таймер?
Т.е таймер настраивается на прерывания через секунду
в нём же вырабатывается частота для динамической индикации 25-30 раз в секунду
в нём же - частота для вывода цифр - 2-3 раза в секунду.
Я правильно понял?
Или тут надо 2 таймера использовать(возможно это или нет, я не знаю sad.gif )?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 20 2007, 15:02
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Василий_Безкатегорийный @ Jun 20 2007, 18:57) *
Вы имеете ввиду микросхемы буферов?

Конечно нет. Я имел в виду программный буфер в ОЗУ, контролируемый (программным) счетчиком и семафором.
Цитата(Василий_Безкатегорийный @ Jun 20 2007, 18:57) *
А вот если идёт счёт на двух индикаторах до 99 секунд?
Мне всё равно надо использовать один таймер?
Т.е таймер настраивается на прерывания через секунду
в нём же вырабатывается частота для динамической индикации 25-30 раз в секунду
в нём же - частота для вывода цифр - 2-3 раза в секунду.
Я правильно понял?

Опять не правильно. Таймер нужен один и настраивается он на минимальный необходимый период. Раз у вас наивысшая частота 30Гц, то таймер должен выдавать прерывания и работать с периодом перезагрузки примерно в 1/(30*2)=16мс (2-число разрядов индикатора). Только это число не кратно целым долям секунды и секундный интервал считать не очень удобно. Поэтому возьмите период 20 мс (25Гц для дин.индикации) или даже 10мс. 10мс кратно периоду сетевого напряжения и целым долям секунды.
На каждый период таймера вызывается процедура для переключения разрядов и для вывода данных отображения текущего разряда. Тут же счетчик разрядов инкрементируется.
При выводе изображения вы должны делать паузу на 32-35 периодов таймера. Это будут как раз примерно 3Гц (задержка 320-350мс).
Для отсчета секунды вы будете использовать паузу в 100 последовательных периодов таймера.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 19:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016