Таймеры Arduino NANO
- Войдите на сайт для отправки комментариев
Втр, 15/03/2016 - 22:30
Всем привет! ПРоблема вот в чем. Реализовал на ардуине распространенный вариант динамической индикации на семисегментнике. Т.е. с delay(). Программа принимает число по UART и выводит на семисегментник. Так вот, когда происходит обмен по UART дисплей моргает, наверно потухает на доли секнуды, но это видно....
Внимание вопрос!! Как организовать динамическую индикацию по таймеру???? По типу AVR Studio? Чтобы индикация не прерывалась. Спасибо всем!
P.S. Сделать работу в студии не предлагать!! Тут интерес сделать на Ардуинке.
АУУ!!! Форум мертвый что ли?
Форум очень даже живой, просто когда что-то хочется услышать в ответ, полезно приводить схему, если она неочевидна А ТАКЖЕ код сделанного.
Как правило все телепаты в перманентных отпусках, панимаишь ли. Вот не было никогда такого и опять оно.. :)
Так кто ж что посоветует, если даже код не показан?
Так кто ж что посоветует, если даже код не показан?
я завсегда могу посоветовать идти нахуй.
Вот код, но я ждал советов по настройке ТАЙМЕРА. Любой.
#include "ModbusRtu.h"
#include <avr/interrupt.h>
//============dynamic_indication======================
int c0 = 10;//выводы катодов
int c1 = 11;
int c2 = 12;
int c3 = 13;
int a = 2;//выводы сегментов
int b = 3;
int c = A5;
int d = 5;
int e = 6;
int f = 7;
int g = 8;
int dp = 9;
int temp;//переменная выводимая на индикатор
//============end_of_dynamic_indication===============
#define ID 1 // адрес ведомого
//Задаём ведомому адрес, последовательный порт, выход управления TX
Modbus slave(ID, 0, 0);
boolean led;
int8_t state = 0;
unsigned long tempus;
// массив данных modbus
uint16_t au16data[11];
void setup() {
// настраиваем входы и выходы
io_setup();
// настраиваем последовательный порт ведомого
slave.begin( 9600 );
//=================настройка таймер===================
//==================конец таймера=====================
}
void io_setup()
{
pinMode(a, OUTPUT);//установка пинов как выходы
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(dp, OUTPUT);
pinMode(c0, OUTPUT);
pinMode(c1, OUTPUT);
pinMode(c2, OUTPUT);
pinMode(c3, OUTPUT);
pinMode(A4, OUTPUT);
none();//сброс индикатора
}
void loop()
{
// обработка сообщений
state = slave.poll( au16data, 11);
// если получили пакет без ошибок - зажигаем светодиод на 50 мс
if (state > 4)
{
}
temp=au16data[2];
io_poll();
// вывод на индикатор
printch ( (temp/1000), 0);//выводим первый разряд
printch ( (temp%1000)/100, 1);//выводим второй рязряд
printch ( (temp%100)/10, 2);//выводим третий рязряд
printch ( (temp%10), 3);//выводим четвертый разряд
// конец
}
void io_poll() {
//Копируем Coil[1] в Discrete[0]
au16data[0] = au16data[1];
//Сохраняем в регистры отладочную информацию
au16data[8] = slave.getInCnt();
au16data[9] = slave.getOutCnt();
au16data[10] = slave.getErrCnt();
}
//==============dynamic_indication===================
void one (){//один
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
}
void two (){//два
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(e,HIGH);
digitalWrite(d,HIGH);
}
void three (){//три
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
}
void four (){//четыре
digitalWrite(c,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(f,HIGH);
}
void five (){//пять
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
}
void six (){//шесть
digitalWrite(a,HIGH);
digitalWrite(e,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(f,HIGH);
}
void seven (){//семь
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(a,HIGH);
}
void eight (){//восемь
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(b,HIGH);
}
void nine (){//девять
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(g,HIGH);
digitalWrite(f,HIGH);
}
void zero (){//ноль
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(f,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
}
void dot (){//точка
digitalWrite(dp,HIGH);
}
void none (){//сброс
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
digitalWrite(dp,LOW);
digitalWrite(c0,LOW);
digitalWrite(c1,LOW);
digitalWrite(c2,LOW);
digitalWrite(c3,LOW);
}
void printch (int val, int dig){
none();
switch (dig){
case 0: { digitalWrite(c0,HIGH); break; } //1 разряд
case 1: { digitalWrite(c1,HIGH); break; } //2 разряд
case 2: { digitalWrite(c2,HIGH); break; } //3 разряд
case 3: { digitalWrite(c3,HIGH); break; } //4 разряд
}
switch (val){
case 0 : { zero(); break; }
case 1 : { one(); break; }
case 2 : { two(); break; }
case 3 : { three(); break; }
case 4 : { four(); break; }
case 5 : { five(); break; }
case 6 : { six(); break; }
case 7 : { seven(); break; }
case 8 : { eight(); break; }
case 9 : { nine(); break; }
default : {dot(); break;}
}
delay(3);//светим цифру 5 мс
}
//==============end_of_dynamic_indication================
//=================задержка на таймере===================
//===============конец задержка на таймере===============
Вот код, но я ждал советов по настройке ТАЙМЕРА. Любой.
Их есть у меня.
//******************************************************************************************* // Таймер Timer1 используется разными модулями с разделением по времени static byte InterruptTimer1ID;//идентификатор модуля, который использует Timer1 //совместное использование прерывания разными модулями // time-требуемый интервал времени, единица - 4 мксек // id-идентификатор модуля // результат false - таймер сейчас занят bool StartTimer1(word time, byte id) { if (bit_is_set(TIMSK1, TOIE1)) return false; //таймер пока занят отсчетом предыдущего интервала TCCR1A = 0; cli(); TCNT1 = 65536 - time;//(150+p*2); sei(); BSET(TIFR1,TOV1); TCCR1B = (0<<CS12)|(1<<CS11)|(1<<CS10); //настройка прескаллера для формирования тиков по 4мксек при кварце 16МГц BSET(TIMSK1,TOIE1); InterruptTimer1ID = id; return true; } //прерывания по таймеру ISR( TIMER1_OVF_vect ) { BCLR(TIMSK1,TOIE1); .................................Видели как я код вставил? И Вам так советую делать. Правила-с.
Сори за вставку кода. Вот что получил.
Вот код, но я ждал советов по настройке ТАЙМЕРА. Любой.
Их есть у меня.
//******************************************************************************************* // Таймер Timer1 используется разными модулями с разделением по времени static byte InterruptTimer1ID;//идентификатор модуля, который использует Timer1 //совместное использование прерывания разными модулями // time-требуемый интервал времени, единица - 4 мксек // id-идентификатор модуля // результат false - таймер сейчас занят bool StartTimer1(word time, byte id) { if (bit_is_set(TIMSK1, TOIE1)) return false; //таймер пока занят отсчетом предыдущего интервала TCCR1A = 0; cli(); TCNT1 = 65536 - time;//(150+p*2); sei(); BSET(TIFR1,TOV1); TCCR1B = (0<<CS12)|(1<<CS11)|(1<<CS10); //настройка прескаллера для формирования тиков по 4мксек при кварце 16МГц BSET(TIMSK1,TOIE1); InterruptTimer1ID = id; return true; } //прерывания по таймеру ISR( TIMER1_OVF_vect ) { BCLR(TIMSK1,TOIE1); .................................Видели как я код вставил? И Вам так советую делать. Правила-с.
int c0 = 10;//выводы катодов int c1 = 11; int c2 = 12; int c3 = 13; int a = 2;//выводы сегментов int b = 3; int c = A5; int d = 5; int e = 6; int f = 7; int g = 8; int dp = 9; int temp;//переменная выводимая на индикатор //******************************************************************************************* // Таймер Timer1 используется разными модулями с разделением по времени static byte InterruptTimer1ID;//идентификатор модуля, который использует Timer1 //совместное использование прерывания разными модулями // time-требуемый интервал времени, единица - 4 мксек // id-идентификатор модуля // результат false - таймер сейчас занят bool StartTimer1(word time, byte id) { if (bit_is_set(TIMSK1, TOIE1)) return false; //таймер пока занят отсчетом предыдущего интервала TCCR1A = 0; cli(); TCNT1 = 65536 - time;//(150+p*2); sei(); bit_is_set(TIFR1,TOV1); TCCR1B = (0<<CS12)|(1<<CS11)|(1<<CS10); //настройка прескаллера для формирования тиков по 4мксек при кварце 16МГц bit_is_set(TIMSK1,TOIE1); InterruptTimer1ID = id; return true; } //прерывания по таймеру ISR( TIMER1_OVF_vect ) { bit_is_clear(TIMSK1,TOIE1); digitalWrite(A4, HIGH); // turn the LED on (HIGH is the voltage level) } //******************************************************************************************* void setup() { pinMode(a, OUTPUT);//установка пинов как выходы pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(dp, OUTPUT); pinMode(c0, OUTPUT); pinMode(c1, OUTPUT); pinMode(c2, OUTPUT); pinMode(c3, OUTPUT); pinMode(A4, OUTPUT); none();//сброс индикатора } void loop() {//цикл программы temp=1234; printch ( (temp/1000), 0);//выводим первый разряд printch ( (temp%1000)/100, 1);//выводим второй рязряд printch ( (temp%100)/10, 2);//выводим третий рязряд printch ( (temp%10), 3);//выводим четвертый разряд } void one (){//один digitalWrite(b,HIGH); digitalWrite(c,HIGH); } void two (){//два digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(e,HIGH); digitalWrite(d,HIGH); } void three (){//три digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); } void four (){//четыре digitalWrite(c,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(f,HIGH); } void five (){//пять digitalWrite(a,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); } void six (){//шесть digitalWrite(a,HIGH); digitalWrite(e,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(f,HIGH); } void seven (){//семь digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(a,HIGH); } void eight (){//восемь digitalWrite(a,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(b,HIGH); } void nine (){//девять digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(g,HIGH); digitalWrite(f,HIGH); } void zero (){//ноль digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(f,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); } void dot (){//точка digitalWrite(dp,HIGH); } void none (){//сброс digitalWrite(a,LOW); digitalWrite(b,LOW); digitalWrite(c,LOW); digitalWrite(d,LOW); digitalWrite(e,LOW); digitalWrite(f,LOW); digitalWrite(g,LOW); digitalWrite(dp,LOW); digitalWrite(c0,LOW); digitalWrite(c1,LOW); digitalWrite(c2,LOW); digitalWrite(c3,LOW); } //===================== void printch (int val, int dig){ none(); switch (dig){ case 0: { digitalWrite(c0,HIGH); break; } //1 разряд case 1: { digitalWrite(c1,HIGH); break; } //2 разряд case 2: { digitalWrite(c2,HIGH); break; } //3 разряд case 3: { digitalWrite(c3,HIGH); break; } //4 разряд } switch (val){ case 0 : { zero(); break; } case 1 : { one(); break; } case 2 : { two(); break; } case 3 : { three(); break; } case 4 : { four(); break; } case 5 : { five(); break; } case 6 : { six(); break; } case 7 : { seven(); break; } case 8 : { eight(); break; } case 9 : { nine(); break; } default : {dot(); break;} } delay(3);//светим цифру 5 мс }BSET заменил на bit_is_set, компилляция прошла. Но событие по переполнению не выполняется. Диод не загорается.
BSET заменил на bit_is_set, компилляция прошла. Но событие по переполнению не выполняется. Диод не загорается.
Моя ошибка. Упустил.
Кароч сделал вот такую конструкцию и она работает.
#include <avr/interrupt.h> // Прерывания TIMSK1 |= (1 << TOIE1); // Разрешение прерывания по таймеру1 TCCR1B |= (1 << CS11)|(1 << CS10); // Предделитель на 64 sei(); ISR( TIMER1_OVF_vect ) { }Но как тольтко я активировал таймер1, посылки перестали доходить по юарт....=(((
BSET заменил на bit_is_set, компилляция прошла. Но событие по переполнению не выполняется. Диод не загорается.
Моя ошибка. Упустил.
компилляция прошла, но событие по переполнению не происходит
Кароч сделал вот такую конструкцию и она работает.
#include <avr/interrupt.h> // Прерывания TIMSK1 |= (1 << TOIE1); // Разрешение прерывания по таймеру1 TCCR1B |= (1 << CS11)|(1 << CS10); // Предделитель на 64 sei(); ISR( TIMER1_OVF_vect ) { }Но как тольтко я активировал таймер1, посылки перестали доходить по юарт....=(((
Фрагмент непонятный. Строки до 6 - настройка и это отдельно от остального? Вы не полностю настроили таймер, возможно прерывания идут слишком часто и юарту не хватает времени для работы. Настройте как выкладывал, это из рабочего проекта цитата.
компилляция прошла, но событие по переполнению не происходит
Код покажте.
Вот этот код работает нормально, но первые три разряда горят тускло. Передача идет, не мигает.
Если поставить delay(3); после отображения цифр (см. код в конце), то все разряды горят ровно, но передача не идет =(
#include "ModbusRtu.h" #include <avr/interrupt.h> // Прерывания //============dynamic_indication====================== int c0 = 10;//выводы катодов int c1 = 11; int c2 = 12; int c3 = 13; int a = 2;//выводы сегментов int b = 3; int c = A5; int d = 5; int e = 6; int f = 7; int g = 8; int dp = 9; int temp;//переменная выводимая на индикатор int temp1;//переменная выводимая на индикатор //============end_of_dynamic_indication=============== #define ID 1 // адрес ведомого //Задаём ведомому адрес, последовательный порт, выход управления TX Modbus slave(ID, 0, 0); boolean led; int8_t state = 0; unsigned long tempus; // массив данных modbus uint16_t au16data[11]; void setup() { // настраиваем входы и выходы io_setup(); // настраиваем последовательный порт ведомого slave.begin( 9600 ); //=================настройка таймер=================== TIMSK1 |= (1 << TOIE1); // Разрешение прерывания по таймеру1 TCCR1B |= (1 << CS11)|(1 << CS10); // Предделитель на 64 //TCCR1B |= (1 << CS12); // Предделитель на 256 sei(); //==================конец таймера===================== } void io_setup() { pinMode(a, OUTPUT);//установка пинов как выходы pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(dp, OUTPUT); pinMode(c0, OUTPUT); pinMode(c1, OUTPUT); pinMode(c2, OUTPUT); pinMode(c3, OUTPUT); pinMode(A4, OUTPUT); none();//сброс индикатора } void loop() { // обработка сообщений state = slave.poll( au16data, 11); temp=au16data[2]; io_poll(); } void io_poll() { //Копируем Coil[1] в Discrete[0] au16data[0] = au16data[1]; //Сохраняем в регистры отладочную информацию au16data[8] = slave.getInCnt(); au16data[9] = slave.getOutCnt(); au16data[10] = slave.getErrCnt(); } //==============dynamic_indication=================== void one (){//один digitalWrite(b,HIGH); digitalWrite(c,HIGH); } void two (){//два digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(e,HIGH); digitalWrite(d,HIGH); } void three (){//три digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); } void four (){//четыре digitalWrite(c,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(f,HIGH); } void five (){//пять digitalWrite(a,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); } void six (){//шесть digitalWrite(a,HIGH); digitalWrite(e,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(f,HIGH); } void seven (){//семь digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(a,HIGH); } void eight (){//восемь digitalWrite(a,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(b,HIGH); } void nine (){//девять digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(g,HIGH); digitalWrite(f,HIGH); } void zero (){//ноль digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(f,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); } void dot (){//точка digitalWrite(dp,HIGH); } void none (){//сброс digitalWrite(a,LOW); digitalWrite(b,LOW); digitalWrite(c,LOW); digitalWrite(d,LOW); digitalWrite(e,LOW); digitalWrite(f,LOW); digitalWrite(g,LOW); digitalWrite(dp,LOW); digitalWrite(c0,LOW); digitalWrite(c1,LOW); digitalWrite(c2,LOW); digitalWrite(c3,LOW); } void printch (int val, int dig){ none(); switch (dig){ case 0: { digitalWrite(c0,HIGH); break; } //1 разряд delay(3);//светим цифру 3 мс case 1: { digitalWrite(c1,HIGH); break; } //2 разряд delay(3);//светим цифру 3 мс case 2: { digitalWrite(c2,HIGH); break; } //3 разряд delay(3);//светим цифру 3 мс case 3: { digitalWrite(c3,HIGH); break; } //4 разряд delay(3);//светим цифру 3 мс } switch (val){ case 0 : { zero(); break; } case 1 : { one(); break; } case 2 : { two(); break; } case 3 : { three(); break; } case 4 : { four(); break; } case 5 : { five(); break; } case 6 : { six(); break; } case 7 : { seven(); break; } case 8 : { eight(); break; } case 9 : { nine(); break; } default : {dot(); break;} } //если тут поставить delay(3); передача не идет } //==============end_of_dynamic_indication================ //=================задержка на таймере=================== ISR( TIMER1_OVF_vect ) { //void printch(); printch ( (temp/1000), 0);//выводим первый разряд printch ( (temp%1000)/100, 1);//выводим второй рязряд printch ( (temp%100)/10, 2);//выводим третий рязряд printch ( (temp%10), 3);//выводим четвертый разряд } //===============конец задержка на таймере===============Спасибо, тему можно закрывать. Я добился своего.
Я пояснить тем, кто придёт в эту тему после Вас тоже набираться знаний , что бы небыло - "АУУ!!! Форум мертвый что ли?".
"Подержую мнение предыдущего оратора!!" Форум - не бесплатная консультация, опыт получил - верни с процентом )))
"Подержую мнение предыдущего оратора!!" Форум - не бесплатная консультация, опыт получил - верни с процентом )))
Logik спасибо Вам большое, что не остались равнодушным и пытались помочь. Один человек из толпы! Но, к сожалению, ваш опыт не пригодился. Ваш кусок кода у меня не заработал. То есть свою задачу я решил сам без участия формучан. И конкретно опыта никакого не поимел от форума. А как вернуть с процентом? Помочь чем-то? так спрашивайте, отвечу. Или то, что получилось выложить?
gin87, комментарий к коду #14 Управлять динамической индикацией командами digitalWrite не комильфо. А первые три цифры горят тускло потому, что в прерывании по-очереди зажигаются 4 цифры, каждая цифра светится примерно по 100µs, а все за за 400µs. Потом выйдя из прерывания остаётся светится четвёртая цифра, и продолжает светится 2ms, пока не придёт следущее прерывание. Лучше сделать прерывание в 4 раза чаще, и зажигать в прерывании только одну цифру, тогда вывод будет равномерным. Видимо вы это и сделали. Но стоит отказаться и от digitalWrite, и управлять одновременно целым портом.
Нередко "дать пинка", что бы появилась обида на мир за его несправедливость и является вполне достаточной помощью. Это даёт спортивную злость. Я часто мысленно благодарю тех, кто отказал мне в быстрой подсказке. Потому как приходилось "рыть" самому и это давало немалые дополнительные знания. Так что - "То есть свою задачу я решил сам без участия формучан. И конкретно опыта никакого не поимел от форума." не канает.
gin87, комментарий к коду #14 Управлять динамической индикацией командами digitalWrite не комильфо. А первые три цифры горят тускло потому, что в прерывании по-очереди зажигаются 4 цифры, каждая цифра светится примерно по 100µs, а все за за 400µs. Потом выйдя из прерывания остаётся светится четвёртая цифра, и продолжает светится 2ms, пока не придёт следущее прерывание. Лучше сделать прерывание в 4 раза чаще, и зажигать в прерывании только одну цифру, тогда вывод будет равномерным. Видимо вы это и сделали. Но стоит отказаться и от digitalWrite, и управлять одновременно целым портом.
Управлять портом не вариант. Ибо сегменты индикатора сидят на разных портах.
а не могли бы вы подсказать у меня такая же проблема, но различие в том что я использовал для этого дела один сдвиговый и один двойичный дешифратор с первого по четвертый у меня катоды а еще 4 вывода рулят дешифратором ивыводятся на индикаторы значения с джипиэски.
,,,,
Вот мой код для индикации.
#include <avr/interrupt.h> // Прерывания //============dynamic_indication====================== int c0 = 2;//выводы катодов int c1 = A5; int c2 = 3; int c3 = 4; int a = 12;//выводы сегментов int b = 13; int c = 7; int d = 8; int e = 9; int f = 11; int g = 10; int dp = 9; int temp,temp1,R1,R2,R3,R4;//переменная выводимая на индикатор //============end_of_dynamic_indication=============== void setup() { // настраиваем входы и выходы io_setup(); //=================настройка таймер=================== TIMSK1 |= (1 << TOIE1); // Разрешение прерывания по таймеру1 TCCR1B |= (1 << CS11)|(1 << CS10); // Предделитель на 64 //TCCR1B |= (1 << CS12); // Предделитель на 256 sei(); //==================конец таймера===================== } void io_setup() { pinMode(a, OUTPUT);//установка пинов как выходы pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(dp, OUTPUT); pinMode(c0, OUTPUT); pinMode(c1, OUTPUT); pinMode(c2, OUTPUT); pinMode(c3, OUTPUT); pinMode(A4, OUTPUT); none();//сброс индикатора } void loop() { R1=temp/1000; R2=(temp%1000)/100; R3= (temp%100)/10; R4=temp%10; } //==============dynamic_indication=================== void one (){//один digitalWrite(b,HIGH); digitalWrite(c,HIGH); } void two (){//два digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(e,HIGH); digitalWrite(d,HIGH); } void three (){//три digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); } void four (){//четыре digitalWrite(c,HIGH); digitalWrite(b,HIGH); digitalWrite(g,HIGH); digitalWrite(f,HIGH); } void five (){//пять digitalWrite(a,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); } void six (){//шесть digitalWrite(a,HIGH); digitalWrite(e,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(f,HIGH); } void seven (){//семь digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(a,HIGH); } void eight (){//восемь digitalWrite(a,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(b,HIGH); } void nine (){//девять digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(g,HIGH); digitalWrite(f,HIGH); } void zero (){//ноль digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(f,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); } /*void dot (){//точка digitalWrite(dp,HIGH); }*/ void all_off (){//потушить дисплей digitalWrite(a,LOW); digitalWrite(b,LOW); digitalWrite(c,LOW); digitalWrite(d,LOW); digitalWrite(e,LOW); digitalWrite(f,LOW); digitalWrite(g,LOW); digitalWrite(dp,LOW); } void none (){//сброс digitalWrite(a,LOW); digitalWrite(b,LOW); digitalWrite(c,LOW); digitalWrite(d,LOW); digitalWrite(e,LOW); digitalWrite(f,LOW); digitalWrite(g,LOW); digitalWrite(dp,LOW); digitalWrite(c0,LOW); digitalWrite(c1,LOW); digitalWrite(c2,LOW); digitalWrite(c3,LOW); } void printch (int val){ switch (val){ case 0 : { zero(); break; } case 1 : { one(); break; } case 2 : { two(); break; } case 3 : { three(); break; } case 4 : { four(); break; } case 5 : { five(); break; } case 6 : { six(); break; } case 7 : { seven(); break; } case 8 : { eight(); break; } case 9 : { nine(); break; } case 10 : { all_off (); break; } } } //==============end_of_dynamic_indication================ //=================индикация на таймере=================== ISR( TIMER1_OVF_vect ) { none(); // Гасим все // Последовательно зажигаем общие катоды if(temp1==0) { digitalWrite(c0,HIGH); digitalWrite(c1,LOW); digitalWrite(c2,LOW); digitalWrite(c3,LOW); } if(temp1==1) { digitalWrite(c0,LOW); digitalWrite(c1,HIGH); digitalWrite(c2,LOW); digitalWrite(c3,LOW); } if(temp1==2) { digitalWrite(c0,LOW); digitalWrite(c1,LOW); digitalWrite(c2,HIGH); digitalWrite(c3,LOW); } if(temp1==3) { digitalWrite(c0,LOW); digitalWrite(c1,LOW); digitalWrite(c2,LOW); digitalWrite(c3,HIGH); } switch (temp1) { case 0: if(R1==0) { printch (10); } else { printch (R1); // Выводим первый разряд } break; case 1: if(R1==0&&R2==0) { printch (10); } else { printch (R2); // Выводим первый разряд } break; case 2: if(R1==0&&R2==0&&R3==0) { printch (10); } else { printch (R3); // Выводим первый разряд } break; case 3: printch (R4); // Выводим третий разряд break; } temp1++; if(temp1>3) temp1=0; } //===============конец индикации на таймере===============