Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Рандомные пропуски счета таймера 0 и 1 в прерываниях PIC16
Alex68 Дата: Пн, 23.09.2019, 06:14  |                                                                                                                Сообщение # 1
Группа: Пользователи
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 23.09.2019

Статус: Offline

Привет всем. Столкнулся с непонятной особенностью таймера 0 (или 1) в обработке прерывания.  По переполнению таймера в прерывании командой hserout выдается последовательный байт. Далее сброс флага TMR0IF. Ничего особенного и необычного. Основная программа упрощена до предела. Даже простой loop ничего не меняет. На картинке можно увидеть неравномерность в периодичности выдачи байта. Менял hserout  на короткий имульс - результат тот же. Не могу понять, в чём дело. Если кто-то из вас сталкивался с подобной особенностью, просьба поделиться решением. Код не привожу в силу его элементарности.
Прикрепления: 6718865.jpg (23.1 Kb)

Сообщение отредактировал Alex68 - Пн, 23.09.2019, 06:21
ЯНДЕКС Дата: 23.09.2019
xvovanx Дата: Пн, 23.09.2019, 20:47  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 332
Репутация: 59   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата Alex68 ()
Код не привожу в силу его элементарности


чудес не бывает, все таки выложите код, а то это гадание на кофейной гуще. Анализатор у вас виртуальный или железный?

Сообщение отредактировал xvovanx - Пн, 23.09.2019, 20:49
Alex68 Дата: Вт, 24.09.2019, 08:53  |                                                                                                                Сообщение # 3
Группа: Пользователи
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 23.09.2019

Статус: Offline

Цитата xvovanx ()
выложите код


DEFINE LOADER_USED 1               'Define loader
DEFINE OSC 4                                'Define oscillator

DEFINE HSER_RCSTA 90h             'Enable the receive register
DEFINE HSER_TXSTA 20h              'Enable the transmit register
DEFINE SER_BAUD 9600               'Set the baud rate
DEFINE HSER_BAUD 9600             'Set the baud rate

TRISB.3 = 0

INTCON = %00100000                    'Enable TMR0 interrupts
OPTION_REG = %00000110            'Set prescaler 1:128
TMR0 = 175                                     'Load TMR0 register

ON INTERRUPT GOTO ISR

loop:                                                 'Short code
PORTB.3 = 1                                     'Short code
GOTO loop                                       'Short code

DISABLE                                           'Disable interrupts
ISR:                                                   'Entry point of the ISR
TMR0 = 175                                      'Load TMR0 register
HSEROUT [$F8]                                'Send a byte
INTCON.2 = 0                                   'Reset INT0IF flag
RESUME                                           'Resume main program
ENABLE                                            'Enable interrupts

Цитата xvovanx ()
Анализатор у вас виртуальный или железный?


Анализатор "железный" smile

Сообщение отредактировал Alex68 - Вт, 24.09.2019, 09:10
Меджикивис Дата: Ср, 09.10.2019, 09:20  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 6   ±
Замечания:   ±
На сайте с 11.04.2016

Статус: Offline

Попробуйте так:

Код
DEFINE LOADER_USED 1               'Define loader
DEFINE OSC 4                    'Define oscillator

DEFINE HSER_RCSTA 90h             'Enable the receive register
DEFINE HSER_TXSTA 20h              'Enable the transmit register
DEFINE SER_BAUD 9600               'Set the baud rate
DEFINE HSER_BAUD 9600             'Set the baud rate

intflag VAR bit            'interrupt flag

intflag = 0
TRISB.3 = 0

INTCON = %00100000                    'Enable TMR0 interrupts
OPTION_REG = %00000110            'Set prescaler 1:128
TMR0 = 175                    'Load TMR0 register

ON INTERRUPT GOTO ISR

loop:                    'Short code
PORTB.3 = 1                    'Short code
DISABLE                    'Disable interrupts
IF intflag=1 THEN
  intflag = 0                    'Clear interrupt flag
  TMR0 = 175                    'Load TMR0 register
  HSEROUT [$F8]                    'Send a byte
  INTCON.2 = 0                    'Reset INT0IF flag
ENDIF
ENABLE                    'Enable interrupts
GOTO loop                    'Short code

ISR:                    'Entry point of the ISR
intflag = 1                    'Set interrupt flag
RESUME                    'Resume main program


PS:
Извиняюсь за поздний ответ. Я редко здесь бываю, поскольку форум практически мертв((((((((
  • Страница 1 из 1
  • 1
Поиск: