18.04.2013, 17:51
|
|
Временная регистрация
Регистрация: 27.02.2012
Адрес: Николаев
Сообщений: 98
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Некорректная работа TMR0 (PIC18F4550)
День добрый, надеюсь, что где-то допустил грубую ошибку, но два дня сижу - не могу понять в чём дело.
Суть проблемы: прерывание TMR0 по переполнению, а так же 16 битный режим TMR0 перестают работать, если в пустом цикле TMR0L не пишется в переменную.
Т.е. вот так:
Код:
|
while (1)
{
tmr_temp2=TMR1L;
} |
всё работает.
а вот так:
Код:
|
while (1)
{
//tmr_temp2=TMR1L;
} |
нет.
Код:
Код:
|
/*конфиг*/
#include ‹delays.h›
#include ‹define.h›
#include ‹timers.h›
#pragma config FOSC=HS, IESO=OFF // для p18f252 OSC=HS, OSCS=OFF
#pragma config PWRT=ON, BOR=OFF
#pragma config WDT=OFF
#pragma config STVREN=ON, LVP=OFF //для p18f252 STVR=ON
/*переменные*/
unsigned int voltage_bin;
unsigned int voltage_7_SEG;
char voltage_bin_thousands;/*переменная вывода на 7_сегментники*/
unsigned int push_number;/*кнопка*/
unsigned short long work_1;/*рабочий№1*/
unsigned int work_2;/*рабочий№2*/
unsigned int thousands;/*тысячный разряд_семисегметник*/
unsigned int hundreds;/*сотый разряд_семисегметник*/
unsigned int decads;/*десятый разряд_семисегметник*/
unsigned int units;/*единичный разряд_семисегметник*/
unsigned int ADC_L;/* младший байт AЦП*/
unsigned int ADC_H;/* старший байт AЦП*/
unsigned long int napruga;/* миливольты*/
unsigned char koma_1;/* тысячная запятая*/
unsigned char koma_2;/* сотая запятая*/
unsigned char koma_3;/* десятая запятая*/
unsigned int ADC_int_counter;
int V_ref;
unsigned char flag_1;
char error_flag;
unsigned char index;// индекс элемента массива
int value;//значение элемента массива
unsigned int S[100];//наш массивчик из 100 элементов (0-99)
unsigned char predel_status;//идентификатор предела измерения (500В-1, 50В-2, 5В-3, 0.5В-4)
unsigned char config;
extern long tmr1_value;
extern unsigned int tmr_value;
extern unsigned int tmr_temp;
extern unsigned int tmr_temp2;
extern unsigned int tmr_temp3;
extern unsigned int cykle_status;
//////////////////
/*функции*/
void test_SEG_1 (void);
void test_subprogram (void);
void seven_SEG_code (void);
void knopka_push (void);
void out_units (void);
void out_decads (void);
void out_hundreds (void);
void out_thousands (void);
void adc_calculate (void);
void adc_GO (void);
void read_ADC (void);
void Err (void);
void settings_0 (void);
void read_counter_1 (void);
void loop (void);
//////////////////
/*главная*/
void main (void)
{
settings_0 ();
//настройка таймера 0 как счётчика импульсов//
TRISAbits.TRISA4=1;//ножка таймера - вход
INTCONbits.TMR0IE=1;//разрешить прерывание таймера 0 по переполнению
INTCON2bits.TMR0IP=1;//высокий приоритет прерывания таймера0
T0CON=0b10111000;//делитель 1:2, предделитель выкл, по спаду фронта, счёт по импульсам на RA4, 16 бит, таймер вкл.
//настройка таймера 1 как счётчика времени//
TRISCbits.TRISC1=1;//ножка таймера - вход
T1CON=0b01001011; //таймер вкл, синхронизация Fosc/8, синхронизация внутр,16 бит
PIE1bits.TMR1IE=1;//вкл. прерывание по переполнению
while (1)
{
}
} |
проект+протеус в приложении.
|
|
|
|
23.04.2013, 09:45
|
|
Временная регистрация
Регистрация: 27.02.2012
Адрес: Николаев
Сообщений: 98
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Некорректная работа TMR0 (PIC18F4550)
собрал макет - всё работает нормально. Так что похоже именно на протеус. К тому же, когда считают внешние импульсы два таймера симуляция получается не в реальном времени, т.е. очень долго. Так что если у вас не core i5 какой-то, то пытаться не стоит.
|
|
|
|
18.03.2016, 10:55
|
|
Частый гость
Регистрация: 25.11.2010
Сообщений: 8
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 5 сообщении(ях)
|
Re: Некорректная работа TMR0 (PIC18F4550)
Попробуйте вместо
while (1)
{
}
написать
while (1)
{
;
}
или
while (1)
{
asm("nop");
}
или
locLoop:
goto locLoop;
|
|
|
|
18.03.2016, 11:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Некорректная работа TMR0 (PIC18F4550)
Компилятор оптимизирует пустой цикл while - т.е. удаляет его совсем. Пишите там или НОП, или какой-нибудь не оптимизируемый в ноль код
|
|
|
Эти 2 пользователя(ей) сказали Спасибо niXto за это сообщение:
|
|
|
18.03.2016, 22:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
|
Re: Некорректная работа TMR0 (PIC18F4550)
Некрофилы! Еще бы месяц подождали, и было бы ровно три года...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:38.
|
|