Таймеры 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================
//=================задержка на таймере===================
//===============конец задержка на таймере===============
Вот код, но я ждал советов по настройке ТАЙМЕРА. Любой.
Их есть у меня.
Видели как я код вставил? И Вам так советую делать. Правила-с.
Сори за вставку кода. Вот что получил.
Вот код, но я ждал советов по настройке ТАЙМЕРА. Любой.
Их есть у меня.
Видели как я код вставил? И Вам так советую делать. Правила-с.
BSET заменил на bit_is_set, компилляция прошла. Но событие по переполнению не выполняется. Диод не загорается.
BSET заменил на bit_is_set, компилляция прошла. Но событие по переполнению не выполняется. Диод не загорается.
Моя ошибка. Упустил.
Кароч сделал вот такую конструкцию и она работает.
Но как тольтко я активировал таймер1, посылки перестали доходить по юарт....=(((
BSET заменил на bit_is_set, компилляция прошла. Но событие по переполнению не выполняется. Диод не загорается.
Моя ошибка. Упустил.
компилляция прошла, но событие по переполнению не происходит
Кароч сделал вот такую конструкцию и она работает.
Но как тольтко я активировал таймер1, посылки перестали доходить по юарт....=(((
Фрагмент непонятный. Строки до 6 - настройка и это отдельно от остального? Вы не полностю настроили таймер, возможно прерывания идут слишком часто и юарту не хватает времени для работы. Настройте как выкладывал, это из рабочего проекта цитата.
компилляция прошла, но событие по переполнению не происходит
Код покажте.
Вот этот код работает нормально, но первые три разряда горят тускло. Передача идет, не мигает.
Если поставить delay(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 вывода рулят дешифратором ивыводятся на индикаторы значения с джипиэски.
,,,,
Вот мой код для индикации.