Таймеры Arduino NANO

gin87
Offline
Зарегистрирован: 15.03.2016

Всем привет! ПРоблема вот в чем. Реализовал на ардуине распространенный вариант динамической индикации на семисегментнике. Т.е. с delay(). Программа принимает число по UART и выводит на семисегментник. Так вот, когда происходит обмен по UART дисплей моргает, наверно потухает на доли секнуды, но это видно....

Внимание вопрос!! Как организовать динамическую индикацию по таймеру???? По типу AVR Studio? Чтобы индикация не прерывалась. Спасибо всем!

 

P.S. Сделать работу в студии не предлагать!! Тут интерес сделать на Ардуинке.

gin87
Offline
Зарегистрирован: 15.03.2016

АУУ!!! Форум мертвый что ли?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Форум очень даже живой, просто когда что-то хочется услышать в ответ, полезно приводить схему, если она неочевидна А ТАКЖЕ код сделанного.

Как правило все телепаты в перманентных отпусках, панимаишь ли. Вот не было никогда такого и опять оно.. :)

gena
Offline
Зарегистрирован: 04.11.2012

Так кто ж что посоветует, если даже код не показан?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

gena пишет:

Так кто ж что посоветует, если даже код не показан?

я завсегда могу посоветовать идти нахуй.

gin87
Offline
Зарегистрирован: 15.03.2016

Вот код, но я ждал советов по настройке ТАЙМЕРА. Любой.

 

#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================

//=================задержка на таймере===================

//===============конец задержка на таймере===============

Logik
Онлайн
Зарегистрирован: 05.08.2014

gin87 пишет:

Вот код, но я ждал советов по настройке ТАЙМЕРА. Любой.

Их есть у меня.

//*******************************************************************************************
//  Таймер 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);
.................................

Видели как я код вставил? И Вам так советую делать. Правила-с.

gin87
Offline
Зарегистрирован: 15.03.2016

Сори за вставку кода. Вот что получил.

34: error: 'BSET' was not declared in this scope

Dynamic_Indication_2:43: error: 'BCLR' was not declared in this scope

 

gin87
Offline
Зарегистрирован: 15.03.2016

Logik пишет:

gin87 пишет:

Вот код, но я ждал советов по настройке ТАЙМЕРА. Любой.

Их есть у меня.

//*******************************************************************************************
//  Таймер 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, компилляция прошла. Но событие по переполнению не выполняется. Диод не загорается.

Logik
Онлайн
Зарегистрирован: 05.08.2014

gin87 пишет:

BSET заменил на bit_is_set, компилляция прошла. Но событие по переполнению не выполняется. Диод не загорается.

Моя ошибка. Упустил.

#define BSET(a,b) a|=_BV(b);
#define BCLR(a,b) a&=~(_BV(b));

 

gin87
Offline
Зарегистрирован: 15.03.2016

Кароч сделал вот такую конструкцию и она работает.

#include <avr/interrupt.h>  // Прерывания 

TIMSK1 |= (1 << TOIE1); // Разрешение прерывания по таймеру1
TCCR1B |= (1 << CS11)|(1 << CS10);  // Предделитель на 64

sei();
ISR( TIMER1_OVF_vect )
{

}

Но как тольтко я активировал таймер1, посылки перестали доходить по юарт....=(((

gin87
Offline
Зарегистрирован: 15.03.2016

Logik пишет:

gin87 пишет:

BSET заменил на bit_is_set, компилляция прошла. Но событие по переполнению не выполняется. Диод не загорается.

Моя ошибка. Упустил.

#define BSET(a,b) a|=_BV(b);
#define BCLR(a,b) a&=~(_BV(b));

 

 

компилляция прошла, но событие по переполнению не происходит

Logik
Онлайн
Зарегистрирован: 05.08.2014

gin87 пишет:

Кароч сделал вот такую конструкцию и она работает.

#include <avr/interrupt.h>  // Прерывания 

TIMSK1 |= (1 << TOIE1); // Разрешение прерывания по таймеру1
TCCR1B |= (1 << CS11)|(1 << CS10);  // Предделитель на 64

sei();
ISR( TIMER1_OVF_vect )
{

}

Но как тольтко я активировал таймер1, посылки перестали доходить по юарт....=(((

Фрагмент непонятный. Строки до 6 - настройка и это отдельно от остального? Вы не полностю настроили таймер, возможно прерывания идут слишком часто и юарту не хватает времени для работы. Настройте как выкладывал, это из рабочего проекта цитата.

Logik
Онлайн
Зарегистрирован: 05.08.2014

gin87 пишет:

компилляция прошла, но событие по переполнению не происходит

Код покажте.

gin87
Offline
Зарегистрирован: 15.03.2016

Вот этот код работает нормально, но первые три разряда горят тускло. Передача идет, не мигает.

Если поставить 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);//выводим четвертый разряд



 }

//===============конец задержка на таймере===============

 

gin87
Offline
Зарегистрирован: 15.03.2016

Спасибо, тему можно закрывать. Я добился своего.

gena
Offline
Зарегистрирован: 04.11.2012

Я пояснить тем, кто придёт в эту тему после Вас тоже набираться знаний , что бы небыло   -   "АУУ!!! Форум мертвый что ли?".

Logik
Онлайн
Зарегистрирован: 05.08.2014

"Подержую мнение предыдущего оратора!!" Форум - не бесплатная консультация, опыт получил - верни с процентом )))

gin87
Offline
Зарегистрирован: 15.03.2016

Logik пишет:

"Подержую мнение предыдущего оратора!!" Форум - не бесплатная консультация, опыт получил - верни с процентом )))

Logik спасибо Вам большое, что не остались равнодушным и пытались помочь. Один человек из толпы! Но, к сожалению, ваш опыт не пригодился. Ваш кусок кода у меня не заработал. То есть свою задачу я решил сам без участия формучан. И конкретно опыта никакого не поимел от форума. А как вернуть с процентом? Помочь чем-то? так спрашивайте, отвечу. Или то, что получилось выложить?

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

gin87, комментарий к коду #14  Управлять динамической индикацией командами digitalWrite не комильфо. А первые три цифры горят тускло потому, что  в прерывании по-очереди зажигаются 4 цифры,  каждая цифра светится примерно по 100µs, а все за за 400µs. Потом выйдя из прерывания остаётся светится четвёртая цифра, и продолжает  светится 2ms, пока не придёт следущее прерывание. Лучше сделать прерывание в 4 раза чаще, и зажигать в прерывании только одну цифру, тогда вывод будет равномерным. Видимо вы это и сделали. Но стоит отказаться и от digitalWrite, и управлять одновременно целым портом.

gena
Offline
Зарегистрирован: 04.11.2012

  Нередко "дать пинка", что бы появилась обида на мир за его несправедливость и является вполне достаточной помощью. Это даёт спортивную злость. Я часто мысленно благодарю тех, кто отказал мне в быстрой подсказке. Потому как приходилось "рыть" самому и это давало немалые дополнительные знания. Так что  - "То есть свою задачу я решил сам без участия формучан. И конкретно опыта никакого не поимел от форума." не канает.

gin87
Offline
Зарегистрирован: 15.03.2016

dimax пишет:

gin87, комментарий к коду #14  Управлять динамической индикацией командами digitalWrite не комильфо. А первые три цифры горят тускло потому, что  в прерывании по-очереди зажигаются 4 цифры,  каждая цифра светится примерно по 100µs, а все за за 400µs. Потом выйдя из прерывания остаётся светится четвёртая цифра, и продолжает  светится 2ms, пока не придёт следущее прерывание. Лучше сделать прерывание в 4 раза чаще, и зажигать в прерывании только одну цифру, тогда вывод будет равномерным. Видимо вы это и сделали. Но стоит отказаться и от digitalWrite, и управлять одновременно целым портом.

Управлять портом не вариант. Ибо сегменты индикатора сидят на разных портах.

Charovnik
Charovnik аватар
Offline
Зарегистрирован: 05.02.2016

а не могли бы вы подсказать у меня такая же проблема, но различие в том что я использовал для этого дела один сдвиговый и один двойичный дешифратор с первого по четвертый у меня катоды а еще 4 вывода рулят дешифратором ивыводятся на индикаторы значения с джипиэски.

Charovnik
Charovnik аватар
Offline
Зарегистрирован: 05.02.2016

,,,,

gin87
Offline
Зарегистрирован: 15.03.2016

Вот мой код для индикации.

#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;

}

//===============конец индикации на таймере===============