Вопрос по таймеру и не только.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Вопрос по таймеру и не только.

Сообщение prw07 »

Всем МЯУ!

Есть несколько вопросов. Решил не плодить темы а все задать в одной. Уж не обессудте.

1. При динамической индикации на 3-х секционный семисегментник вывожу информацию с частотой 75 Гц (25Гц х 3). И наблюдаю интенсивное моргание, которое пропадает, если поднять частоту до 150Гц, т.е. 50Гц на секцию. Почему? Ведь для глаза не должно быть уловимо мерцание в 25Гц.
2. Почему CodeVision на операцию "TCCR0=(1<<CS20)" выдает ошибку "неизвестная переменная CS20" ? Но если ставить номер бита, то все хорошо. В CV не предусмотрено обращение к регистрам через название их битов?
3. Хочу сделать амперметр с диапазоном измерения от 0.01А до 10А (шаг 0.01А). Я так понимаю, что один шунт в 0.1 Ом не пойдет (при напряжении 10В и токе 10А рассеиваемая мощность 10Вт, а значит нагрев шунта и изменение его сопротивления). Если ставить шунт 0.01 Ом , то на малом токе падение напряжения будет в диапазоне шумов. Как выйти из положения? Можно ли использовать автоматическое переключение релюхи между несколькими шунтами по уровню падения напряжения на шунте? Или есть другой способ?
Реклама
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение vAv »

1. Перед тем как вывести, надо сначала погасить и сделать паузу. Видел где-то исходник, но на асме для пика
2. Не забыл присоединить заголовочный файл с типом контроллера?
3. что-то не так считаешь... на 0,1 ом упадет сколько вольт? :)
Реклама
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: Вопрос по таймеру и не только.

Сообщение prw07 »

1. Зачем гасить и делать паузу? что это даст?
2. CV сам это делает. #include <mega8.h>
3. Блин. Точно. При расчете мощности взял входное напряжение. Лапух!

1 и 2 вопросы в силе.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение Мастер Ломастер »

prw07 писал(а):3. Блин. Точно. При расчете мощности взял входное напряжение. Лапух!
лапух в квадрате: P = I*I*R = 10*10*0.1 = 10 Вт. первый раз было правильно.
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение Леонид Иванович »

Вопрос 3 тоже в силе: при токе 10 А на 0.1 Ома упадет 1 В, что даст мощность 10 Вт. Многовато. Нужно ставить 0.01 Ома и использовать усилитель. Можно взять контроллер со встроенным усилителем (как, например, в ATmega64). А можно поставить внешний, например, LM358. Если хочется иметь два предела, то можно к шунту подключить два усилителя с разными Ку и подать с них сигнал на разные входы АЦП. Выбором входа будут переключаться пределы.

По вопросу 1: частота динамической индикации у Вас очень низкая. Я обычно ставлю 1 мс на разряд, моргания не видно. Что касается паузы между включением разрядов, то она имеет смысл лишь когда для управления общими электродами используются транзисторы с общим эмиттером. Они медленно закрывваются, может быть засветка лишних сегментов. Но даже при управлении прямо от портов я всё равно при динамической индикации сначало выключаю линии сканирования:

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

//------------------------- Сканирование дисплея: ----------------------------

void Display_Exe(bool t)
{
  static char Phase = 0;
  if(t)
  {
    //выключение всех скан-линий:
    Port_SCAN1_1;
    Port_SCAN2_1;
    Port_SCAN3_1;
    char s = SegData[Phase];
    //включение нужных сегментов:
    (s & 0x01)? Port_SEG_A_1 : Port_SEG_A_0;
    (s & 0x02)? Port_SEG_B_1 : Port_SEG_B_0;
    (s & 0x04)? Port_SEG_C_1 : Port_SEG_C_0;
    (s & 0x08)? Port_SEG_D_1 : Port_SEG_D_0;
    (s & 0x10)? Port_SEG_E_1 : Port_SEG_E_0;
    (s & 0x20)? Port_SEG_F_1 : Port_SEG_F_0;
    (s & 0x40)? Port_SEG_G_1 : Port_SEG_G_0;
    (s & 0x80)? Port_SEG_H_1 : Port_SEG_H_0;
    //включение нужной скан-линии:
    (Phase == 0)? Port_SCAN1_0 : Port_SCAN1_1;
    (Phase == 1)? Port_SCAN2_0 : Port_SCAN2_1;
    (Phase == 2)? Port_SCAN3_0 : Port_SCAN3_1;
    //следующая фаза сканирования:
    if(++Phase == DIGS) Phase = 0;
  }
}
По вопросу 2: никогда не используйте номера битов, а только их имена! Нужно заставить компилятор их понимать, для чего необходимо подключить h-файл с определениями для данного процессора.
Реклама
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: Вопрос по таймеру и не только.

Сообщение prw07 »

лапух в квадрате
при токе 10 А на 0.1 Ома упадет 1 В
вот блин так блин. Лапух не просто в квадрате, а в квадратном квадрате. Ведь первый раз точно посчитал и 1В в расчетах брал, а не входное напряжение. Помню что десятка в расчетах была, а это ток был. Первый пост с толку сбил и запамятовал.
И даже если усиливать входной сигнал, то будет усиливаться не только полезный сигнал, но и все что кабель и проводники поймают из "радиоэфира".
частота динамической индикации у Вас очень низкая. Я обычно ставлю 1 мс на разряд, моргания не видно.
Это я понял. Поставил 6ms. Но всетаки почему глаз распознает мерцание? Ведь не должен. Сначала думал, что идет задержка на выполнения кода, но в протеусе смотрел, весь код динамики выполняется за пару десятков микросекунд.
необходимо подключить h-файл с определениями для данного процессора.
ну так подключаю библиотеку же. Или еще какую-то нужно подключать?
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение Аlex »

Но всетаки почему глаз распознает мерцание?
Вы забыли самое главное. Показать Ваш проект. У Вас может мерцать вовсе не из-за частоты, а , к примеру, из-за длительных пауз, отнимающих управление индикации. Вариантов много, а тут, к сожалению, телепатов нет :(
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: Вопрос по таймеру и не только.

Сообщение prw07 »

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

#include <mega8.h>
#include <math.h>
#include <delay.h>

#define ADC_VREF_TYPE 0x00
volatile unsigned int a, temperature;  
unsigned char x=1;
const unsigned char codes[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{     
     temperature=read_adc(0)*5/10.24;        //данные АЦП датчика
 
 switch (x)      //по очереди зажигаем каждый индикатор (за одно прерывание - один индикатор). 
 {               //Переменная "х" определяет порядковый номер индикатора который засвечивается
  case 1:{  
          PORTD=0b11111110;                     //включаем первый индикатор 
          PORTB=codes[temperature/100];           //выводим первый символ
          x=0x02;   
          a=temperature/100;                      //получаем второй символ
          a=temperature-a*100;  
          break;
         };
   case 2:{
           PORTD=0b11111101;                //включаем второй индикатор 
           PORTB=codes[a/10];               //выводим второй символ
           x=0x03;  
           a=temperature/10;                      //получаем третий символ
           a=temperature-a*10;       
           break;
          };
   case 3:{
           PORTD=0b11111011;             //включаем третий индикатор 
           PORTB=codes[a];              //выводим третий символ
           x=0x01;
           break;
          };
}            
}

// Declare your global variables here

void main(void)
{

PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x0d;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x68;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x10;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x86;

// Global enable interrupts
#asm("sei")

while (1)
      {
      };
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение Аlex »

Выложите весь проект вместе с проектом протеуса и .cof файлом. Всю папку короче.
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение Meteor »

10 мс висите прерывании при чтении данных? :shock:
а зачем?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение Аlex »

Meteor писал(а):10 мс висите прерывании при чтении данных? :shock:
а зачем?
У него там вроде us, а не ms. :roll:
А вот подобная конструкция

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

    temperature=read_adc(0)*5/10.24;        //данные АЦП датчика
Будет выполняться очень долго.
Вобщем нужен проект.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение Леонид Иванович »

prw07 писал(а):И даже если усиливать входной сигнал, то будет усиливаться не только полезный сигнал, но и все что кабель и проводники поймают из "радиоэфира".
Не беспокойтесь, не будет. Ведь источник сигнала очень низкоомный. Другое дело, разводку правильно сделать надо, чтобы падения на других проводниках на показания не сказывались.
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: Вопрос по таймеру и не только.

Сообщение prw07 »

10 мс висите прерывании при чтении данных? :shock:
а зачем?
А вот подобная конструкция
Код:
temperature=read_adc(0)*5/10.24; //данные АЦП датчика
Будет выполняться очень долго.
На получение данных от АЦП уходит до 15 тактов (согласно даташиту). Так что они не могут повлиять на индикацию. Кроме того попробовал вынести чтение данных АЦП отдельным прерыванием с частотой 1 раз в секунду (мне чаще не нужно). На индикацию это не повлияло.
Другое дело, разводку правильно сделать надо, чтобы падения на других проводниках на показания не сказывались.
Подскажите как сделать правильно?

Вот весь проект.
Вложения
Общий катод.rar
(66.41 КБ) 153 скачивания
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение Леонид Иванович »

prw07 писал(а):Вот весь проект.
Ой, что это? Это проект в чём?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение Мастер Ломастер »

прерывание должно заниматься ТОЛЬКО динамической индикацией. кроме того, у вас крайне нерационально ведется вычисление того, что надо показать на индикаторе в данный момент индикации. рекомендую почитать статьи ARV по этой теме: тыц, тыц, тырырыц
битва с дураками проиграна, победители торжествуют. слава победителям!
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: Вопрос по таймеру и не только.

Сообщение prw07 »

Ой, что это? Это проект в чём?
CodeVision и Proteus. Вся папка как и просили.
Ну а в чем сложность-то? Все ж как нужно.
Если хочется иметь два предела, то можно к шунту подключить два усилителя с разными Ку и подать с них сигнал на разные входы АЦП
Ничего не выйдет. Все равно шунты будут параллельно замкнуты. Нужно переключатель ставить. Либо тумблер либо токовое реле.
прерывание должно заниматься ТОЛЬКО динамической индикацией
Я уже писал, что перенес вычисления на другое прерывание (1 раз в секунду) и на индикации это не отразилось. Все-равно блымает. И даже если закоментировать вычисление тоже блымает. На вычисление уходит до 20 тактов, что не повлияет на индукацию.
кроме того, у вас крайне нерационально ведется вычисление того, что надо показать на индикаторе в данный момент индикации.
Вы имеете ввиду, что вычисления производятся с частотой индикации? Но ведь это зависит от поставленной задачи.
Кстати ссылки не работают.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение Мастер Ломастер »

prw07 писал(а):Я уже писал, что перенес вычисления на другое прерывание (1 раз в секунду) и на индикации это не отразилось. Все-равно блымает.
повторяю: делать вычисления, да еще с плавающей точкой, в прерываниях (любых) - это дурной тон в программировании для МК. в вашем случае можно головой поручиться, что это ЛИШНЕЕ.
prw07 писал(а):Кстати ссылки не работают.
это проблема с вашим доступом - ссылки рабочие.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение Леонид Иванович »

prw07 писал(а):CodeVision и Proteus. Вся папка как и просили.
Ну а в чем сложность-то? Все ж как нужно.
Ни того, ни другого у меня нет, поэтому я не знал, как выглядят их проекты.
prw07 писал(а):Ничего не выйдет. Все равно шунты будут параллельно замкнуты. Нужно переключатель ставить. Либо тумблер либо токовое реле.
Почему не выйдет? К одному шунту подключаете два усилителя с разными коэффициентами усиления. И на разные входы АЦП.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение urry »

Ребята, о чем спор ?
Если включить лампу освещения через диод, мерцание будет заметно, а инерционность нити накаливания куда выше, чем светодиода.
Чувствительность периферийного зрения выше, поэтому мерцание сильнее заметно, когда смотреть чуть в сторону. мне сразу возразят, а как же кинематограф, с его 24 кадра в секунду.
Там скважность другая :)
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск
Контактная информация:

Re: Вопрос по таймеру и не только.

Сообщение vAv »

По третьему вопросу то что не правильно считаешь имелось ввиду что считаешь не правильно про резистор 0,01 ома. :)
При AREF = 2в (минимальное по даташиту, но может еще можно уменьшить и тогда пределы расширятся) и при падении 0,1 получаем что на одну единицу АЦП мы имеем 2/1024 = 0,001953125 вольта или 50 делений. На 10 ампер это 0,2 амера на деление. Т.е. ток ты выведешь с относительной погрешностью всего 0,2/2 = 0,1 ампера. Думаю что в принципе этого достаточно. Прикидки конечно грубые. Если не прав, то поправьте. Пока до измерения токов еще не добрался. :)

Кстати шунты в продаже по 75мв всего. Как то же мерят на них. :)

Кстати, насчет индикаторов - заказал себе парочку MAX7219, чтобы не заморачиваться с недостатком выводов для одной своей хреновины. :)
Закрыто

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