Перейти к содержанию

Рекомендуемые сообщения

' Никак не получается программа. Подскажите, пожалуйста, что не так?

' Секундные часы на Таймере0
' PIC Basic PRO. Программа. версия от 18 мая 2016
'Таймер0, предделитель = 64, TMR0=131, Cnt=125 ( Период=1сек), Cnt = 7500 (Период=60 сек)

'16F877А-I/P


Cnt var byte
tchas VAR byte ' счетчик часов до 24
tmin VAR byte ' счетчик минут до 60
tsec var byte ' Счетчик секунд
dnedel var byte ' счетчик дней недели от 1 до 7
x var word
i var word
update var byte

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATUS 50
define ADC_BITS 10
define ADC_CLOCK 3
define ADC_SAMPLEUS 100

pause 100

'Конфигурируем порты
PortB=000000
PortC=000000
PortD=000000
PortE=000000

TrisB=000000 ' 0- Выход, 1 - Вход !!!!
TrisD=111111 ' 0- Выход, 1 - Вход !!!!
TrisA=111111 ' 0- Выход, 1 - Вход !!!!
TrisE=111111 ' 0- Выход, 1 - Вход !!!!
TrisC=001000 ' 0- Выход, 1 - Вход !!!!
ADCON1=000010

' Установка Таймера0 для работы по прерыванию

OPTION_REG.7=0 'T0CS=0 'внутренние часы
OPTION_REG.6=1 'T0CS=0 'внутренние часы
OPTION_REG.5=0 'T0CS=0 'внутренние часы
OPTION_REG.4=1 'T0SE=0 'фронт от 0 до 1
OPTION_REG.3=0 'PSA=0 'работа с предделителем
OPTION_REG.2=1 'PS2=1 '
OPTION_REG.1=0 'PS1=0 '
OPTION_REG.0=1 'PS0=1 'Предделитель = 64

INTCON.7=1 'Бит глобального прерывания
INTCON.6=0
INTCON.5=1 'Прерывание по Переполнению TIMER0
INTCON.4=0
INTCON.3=0
INTCON.2=0
INTCON.1=0
INTCON.0=0
T1CON=000000
T2CON=000000
'MAIN:
TMR0=131 'Установска регистра таймера
Cnt=0
tmin=0
tsec=0
tchas=0
dnedel=1 'Первый день недели Понедельник

ON interrupt goto ISR
sto: 'НАЧАЛО ЦИКЛА
' Вывод информации на дисплей
' Первая строка: Часы.Минуты.Секунды
' Вторая строка: День недели. Понедельник=1.

if update=1 then
lcdout $fe, 1
lcdout $fe, 2
lcdout dec tchas,".", dec tmin,".",dec tsec

lcdout $fe, 192
lcdout dec dnedel
pause 10
update=0
endif
x=120
x=x-80
x=x/10
x=x*30


'Конец вывода информации на дисплей


goto sto ' КОНЕЦ ЦИКЛА

ISR:' Подпрограмма обработки прерывания таймера

If INTCON.2=1 then '--1
TMR0=131
Cnt=cnt+1
if Cnt=50 then 'Секундные отсчеты '--2
Cnt=0
'if PortC.4=0 then
'PortC.4 =1 'секундное переключение светодиода
'else
'PortC.4=0
'endif
tsec=tsec+1
update=1

if tsec=60 then '--3
tsec=0
if PortC.5=0 then
PortC.5=1 'минутное переключение светодиода
else
PortC.5=0
endif
tmin=tmin+1 'Минуты часовые до 60
if tmin=60 then '--4
tmin=0
tchas=tchas+1 'Часы до 24
if tchas=24 then '--5
tchas=0
dnedel=dnedel+1 'Недели до 7
if dnedel>7 then dnedel=1
endif '==5
endif '==4
endif '==3

endif '==2
INTCON.2=0
resume
endif '==1


' Конец подпрограммы обработки прерывания таймера c периодом 1 сек


resume

End

 

Изменено пользователем dvselectronic
код под спойлер убрал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
 

Да, смотрел и изучал. Но прерывания еще не пробовал программировать. Сейчас прерывания не идут...

Упущена какая то важная фишка...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

В подпрограмме прерывания кода должно быть минимум! 

 

оставьте только отслеживание прерывания и присвоение 1 переменной, если прерывание было. Пересчёт времени и все остальные условия переносите в основной код.

 

Посмотрите мой урок, про таймеры

под ним можно код скачать, прошивку и проект протэуса

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
 

В подпрограмме прерывания кода должно быть минимум! 

 

оставьте только отслеживание прерывания и присвоение 1 переменной, если прерывание было. Пересчёт времени и все остальные условия переносите в основной код.

 

Посмотрите мой урок, про таймеры

под ним можно код скачать, прошивку и проект протэуса

Спасибо за совет! Сейчас совсем нет прерываний, даже на первых секундах ничего...Мне кажется, что ошибка в структуре программы, например, не так сделана точка входа в подпрограмму обработки прерывания или возврат из нее...

Будьте добры, пришлите пожалуйста текст программы на PIc Basic Pro Вашего 12 урока на двух таймерах. Ведь очень важны и детали в программировании..

Моя почта:

bushkovaa@mail.ru

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Под каждым видео-уроком есть описание, исходный текст, прошивка, проект в протеусе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Спасибо большое за помощь! 

Нашел ошибку в тексте программы.

Не поставил перед обработчиком прерываний ключевое слово Disable,

а при выходе из обработчика не поставил Enable.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
' ПРОГРАММА РАБОТАЕТ!

' Секундные часы на Таймере0

' Программа. версия от 19 мая 2016

'Таймер0, предделитель = 64, TMR0=131, Cnt=125 ( Период=1сек), Cnt = 7500 (Период=60 сек)

 

'16F877А-I/P 

 

 

 Cnt var byte

 tchas VAR byte ' счетчик часов до 24

 tmin VAR byte     ' счетчик минут до 60

 tsec var byte       ' Счетчик секунд 

 dnedel var byte   ' счетчик дней недели от 1 до 7

 x var word

 i var word   

 update var byte

 

DEFINE LCD_DREG   PORTB

DEFINE LCD_DBIT   4

DEFINE LCD_RSREG  PORTB

DEFINE LCD_RSBIT  3

DEFINE LCD_EREG   PORTB

DEFINE LCD_EBIT   0

DEFINE LCD_BITS   4

DEFINE LCD_LINES  2

DEFINE LCD_COMMANDUS 2000

DEFINE LCD_DATUS  50

define ADC_BITS   10

define ADC_CLOCK 3

define ADC_SAMPLEUS 100

 

pause 100

 

'Конфигурируем порты

PortB=%00000000

PortC=%00000000

PortD=%00000000

PortE=%00000000

 

TrisB=%00000000 ' 0- Выход, 1 - Вход    !!!!

TrisD=%11111111 ' 0- Выход, 1 - Вход    !!!!

TrisA=%11111111 ' 0- Выход, 1 - Вход    !!!!

TrisE=%11111111 ' 0- Выход, 1 - Вход    !!!!

TrisC=%00001000 ' 0- Выход, 1 - Вход    !!!!

ADCON1=%10000010    

 

' Установка Таймера0 для работы по прерыванию 

 

OPTION_REG.7=0       'T0CS=0 'внутренние часы

OPTION_REG.6=1       'T0CS=0 'внутренние часы

OPTION_REG.5=0       'T0CS=0 'внутренние часы

OPTION_REG.4=1       'T0SE=0 'фронт от 0 до 1

OPTION_REG.3=0       'PSA=0 'работа с предделителем

OPTION_REG.2=1      'PS2=1 '

OPTION_REG.1=0      'PS1=0 '

OPTION_REG.0=1      'PS0=1 'Предделитель = 64

 

INTCON.7=1   'Бит глобального прерывания

INTCON.6=0

INTCON.5=1   'Прерывание по Переполнению TIMER0

INTCON.4=0

INTCON.3=0

INTCON.2=0

INTCON.1=0

INTCON.0=0 

T1CON=%00000000

T2CON=%00000000

'MAIN:

TMR0=131       'Установска регистра таймера

Cnt=0

tmin=0

tsec=0

tchas=0

dnedel=1 'Первый день недели Понедельник   

 

 ON interrupt goto ISR    

sto: 'НАЧАЛО ЦИКЛА  

' Вывод информации на дисплей

' Первая строка: Часы.Минуты.Секунды

' Вторая строка:    День недели. Понедельник=1. 

 

if update=1 then

    lcdout $fe, 1

    lcdout $fe, 2 

    lcdout dec tchas,".", dec tmin,".",dec tsec

 

    lcdout $fe, 192

    lcdout dec dnedel

    pause 10

    update=0

endif             

x=120

x=x-80

x=x/10

x=x*30 

 

 

'Конец вывода информации на дисплей 

 

 

goto sto ' КОНЕЦ ЦИКЛА 

 disable

ISR:' Подпрограмма обработки прерывания таймера

 

If INTCON.2=1 then                                   '--1     

    TMR0=131    

   Cnt=cnt+1

 if Cnt=125 then           'Секундные отсчеты    '--2

Cnt=0

 'if PortC.4=0 then 

       'PortC.4 =1         'секундное переключение светодиода

       'else 

       'PortC.4=0

       'endif

tsec=tsec+1

      update=1

      

 if tsec=60 then                                '--3

       tsec=0

       'if PortC.5=0 then 

        'PortC.5=1  'минутное переключение светодиода

        'else 

        'PortC.5=0

       'endif

  tmin=tmin+1       'Минуты часовые до 60

       if tmin=60 then                              '--4

          tmin=0

      tchas=tchas+1            'Часы до 24

                if tchas=24 then         '--5

                    tchas=0

                     dnedel=dnedel+1    'Недели до 7

                   if dnedel>7 then dnedel=1                     

                 endif                               '==5 

     endif                                        '==4

      endif                                          '==3  

                          

 endif                                               '==2

 INTCON.2=0

 resume 

  enable

endif                                                '==1

 

 

' Конец подпрограммы обработки прерывания таймера c периодом 1 сек 

 

 

resume 

 enable

End

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
 

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти



×
  • Создать...