P.S.
Контроллер Mega16, тактируется от внутреннего генератора на 8 Мгц.
А мя и не учитывал..akl писал(а):Вы не учли тактность двигателя
BARS_ писал(а):Что-то никак не могу до конца разобраться с тахометром. Надо его еще как-то связать с динамической индикацией. Этой самой индикацией занят таймер TCNT1. Как сделать тахометр на таймере TCNT0 или TCNT2 ? Можете написать кусочек кода с пояснениями, а то я что-то совсем завис...![]()
P.S.
Контроллер Mega16, тактируется от внутреннего генератора на 8 Мгц.
BARS_ писал(а):Возможно добавится измерение напряжение
pyzh_man писал(а):BARS_ писал(а):Возможно добавится измерение напряжение
Не возможно, а надо делать! Очень удобно.
clawham писал(а):мог бы и помочь....что именно у Вас не получается?
вообще-то я категорически ненавижу эти 7-мисегментники и динамическую индикацию в частности....ибо с этой индикацией да на такое большое кол-во экранов вы получите никакую яркость и не сможете с термометром работать нормально!
Код: Выделить всё
#define TimerStop TCCR1B=0x00;
#define TimerStart TCCR1B=0x01;
bit intenabled = 1;
unsigned long int g1 = 0;
unsigned int g2 = 0;
unsigned int Time =0;
unsigned char SecTmp = 0;
unsigned long int Sec = 0;
unsigned long int OldSec = 0;
unsigned long int PeriodA = 0;
unsigned char PeriodB = 0;
bit PeriodUpdated = 0;
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
PeriodB = TCNT1;
TCNT1 = 0;
#pragma optsize++
PeriodA = counter;
counter = 0;
PeriodUpdated = 1;
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
counter+=1;
}
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// TCCR1A=0x00;
TCCR1B=0x01;
// TCNT1H=0x00;
// TCNT1L=0x00;
// ICR1H=0x00;
// ICR1L=0x00;
// OCR1AH=0x00;
// OCR1AL=0x00;
// OCR1BH=0x00;
// OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x85;
float GetPeriod(unsigned long int H_f, unsigned int L_f)
{
float t;
if(H_f<MaxOverflows)
{
tmp=H_f;
tmp=65536*tmp;
tmp=tmp+L_f+11;
t = ClocksPerSec;
t = t / tmp;
t = t * WattsPerHz;
return t;
}
else
{
// наверное перебор по счетчику...это минимум...перезапустим а на экран ноль
PeriodB = PeriodA = 0;
TCNT1 = 0;
counter = 0;
PeriodUpdated = 1;
return 0;
}
}
// если текущее положение - конец конверсии то...
if(PeriodUpdated)
{
//#asm("wdr");
// считаем что наконвертировали по периоду
ByPeriod = GetPeriod(PeriodA, PeriodB);
LastPeriod = ByPeriod;
// разрешаем новую конверсию
PeriodUpdated = 0;
}
// если не нажата то отрабатываем стандартный экран
// посчитаем минимальную мощность для метода замера длительности
// она равна ваттам в герц поделить на время таймаута
MinPeriodedWatts = maxawg*WattsPerHz;
// смотрим а не перевалило ли нас за 10000 ватт(тоесть
// считаем вывод на экран
// считаем по кол-ву импульсов
ToDisplay=0;
//summawg = 0;
// суммируем кол-во тиков за всё время
//lcd_gotoxy(0,1);
for(a=0;a<maxawg;a++)
{
ToDisplay += awg[a];
//lcd_putchar(' ');
}
// считаем кол-во тиков в секунду
ToDisplay = ToDisplay / maxawg;
ToDisplay = ToDisplay * 8.0 * WattsPerHz;
//ToDisplay = ToDisplay ;
// теперь смотрим... если прерывания были выключены
if(intenabled!=1)
{
//проверяем а не малова-то ли импульсов натикало
if(ToDisplay<MinPeriodedWatts)
{
// а натикало меньше 100 ватт ....
// включаем прерывание - будем мерять по длине
intenable();
intenabled = 1;
//clearawg();
// теперь считаем последние вычисленные мощности в длительность
//LastPeriod = ToDisplay;
}
// если натикало достаточно не меняем ничего - выведем результат
LastPeriod = ToDisplay;
}
else
{
// если же прерывание было включено
// проверим не слишком ли мал период
if(ByPeriod>MinPeriodedWatts)
{
// мал... выключаем прерывание а на экран выведется мощность
// исходя из колличества импульсов
//intdisable();
#asm("cli");
GICR|=0x40;
GIFR=0x40;
#asm("sei");
intenabled = 0;
}
else
{
// малая мощность - выводим данные из длительности периода
CurrentPeriod = GetPeriod(counter, TCNT1);
if(LastPeriod>CurrentPeriod)
ToDisplay = CurrentPeriod;
else
ToDisplay = LastPeriod;
}
}
Благодарствую, пушистый..clawham писал(а):tpic6a595 помоему