Jump to content

Recommended Posts

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

' Секундные часы на Таймере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

 

Edited by dvselectronic
код под спойлер убрал

Share this post


Link to post
Share on other sites
 
 
 

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

 

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

 

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

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

Share this post


Link to post
Share on other sites
 
 

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

 

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

 

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

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

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

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

Моя почта:

bushkovaa@mail.ru

Share this post


Link to post
Share on other sites
 

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

Share this post


Link to post
Share on other sites
 

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

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

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

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

Share this post


Link to post
Share on other sites
 
' ПРОГРАММА РАБОТАЕТ!

' Секундные часы на Таймере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

Share this post


Link to post
Share on other sites
 
 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
  • Create New...