01.12.2016, 23:09
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 139
Сказал спасибо: 12
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Время между прерываниями не соответствует расчетному
Код, который создал Wizzard CodeVisionAVR (да и калькулятор AVR рассчитал то же значение TCNT0=0x7B):
Код:
|
#include "tiny13a.h"
// Declare your global variables here
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x7B;
// Place your code here
PORTB.0 ^= 1;
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1«CLKPCE);
CLKPR=(0«CLKPCE) | (0«CLKPS3) | (0«CLKPS2) | (0«CLKPS1) | (0«CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out
DDRB=(0«DDB5) | (0«DDB4) | (0«DDB3) | (0«DDB2) | (1«DDB1) | (1«DDB0);
// State: Bit5=T Bit4=T Bit3=T Bit2=T Bit1=0 Bit0=0
PORTB=(0«PORTB5) | (0«PORTB4) | (0PORTB3) | (0«PORTB2) | (0«PORTB1) | (0«PORTB0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4800,000 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 0,027708 ms
TCCR0A=(0«COM0A1) | (0«COM0A0) | (0«COM0B1) | (0«COM0B0) | (0«WGM01) | (0«WGM00);
TCCR0B=(0«WGM02) | (0«CS02) | (0«CS01) | (1«CS00);
TCNT0=0x7B;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0«OCIE0B) | (0«OCIE0A) | (1«TOIE0);
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=(0«INT0) | (0«PCIE);
MCUCR=(0«ISC01) | (0«ISC00);
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1«ACD) | (0«ACBG) | (0«ACO) | (0«ACI) | (0«ACIE) | (0«ACIS1) | (0«ACIS0);
ADCSRB=(0«ACME);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR0=(0«AIN0D) | (0«AIN1D);
// ADC initialization
// ADC disabled
ADCSRA=(0«ADEN) | (0«ADSC) | (0«ADATE) | (0«ADIF) | (0«ADIE) | (0«ADPS2) | (0«ADPS1) | (0«ADPS0);
// Global enable interrupts
#asm("sei")
while (1)
{
}
} |
Время между прерываниями не соответствует расчетному.
Вместо 27.708us, прерывания наступают более, чем через 30us.
Последний раз редактировалось hubble; 02.12.2016 в 00:56.
|
|
|
|
02.12.2016, 00:28
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,254
Сказал спасибо: 11,168
Сказали Спасибо 3,857 раз(а) в 2,928 сообщении(ях)
|
Re: Время между прерываниями не соответствует расчетному
А уточнить реальное время и посчитать на его основе частоту для таймера?
Потом сравнить ее с использованной в расчётах для программы.
Может ошибка в установке частоты в итоге имеет место быть.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
02.12.2016, 00:40
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 139
Сказал спасибо: 12
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Re: Время между прерываниями не соответствует расчетному
Сообщение от mike-y-k
|
А уточнить реальное время и посчитать на его основе частоту для таймера?
Потом сравнить ее с использованной в расчётах для программы.
Может ошибка в установке частоты в итоге имеет место быть.
|
Необходима частота 36000Гц. Это 27.77(7)us. Погрешность до 27.708us (как в коде) допустима.
Сообщение от mike-y-k
|
Может ошибка в установке частоты в итоге имеет место быть.
|
Да вроде бы все проверил-перепроверил. Но не получается выйти на расчетное время прерывания. А вот если TCNT0=0x85, тогда все совпадает. Но это ведь не правильно.
Последний раз редактировалось hubble; 02.12.2016 в 01:03.
|
|
|
|
02.12.2016, 01:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,978
Сказал спасибо: 3,005
Сказали Спасибо 3,182 раз(а) в 2,160 сообщении(ях)
|
Re: Время между прерываниями не соответствует расчетному
Откройте порождённый ассемблерный код и посмотрите, сколько проходит от прерывания до реальной перезаписи TCNT0.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:04.
|
|