Jump to content

Welcome to vip-cxema.org

logo3.png

The forum has a section for guests, where you can ask your questions without registration: Вопросы и ответы

By registering, you will be able to send private messages, receive notification of replies to topics. You can always send a message, many restrictions are removed.


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
 
 

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

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

Не поставил перед обработчиком прерываний ключевое слово 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
 
 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...



×
  • Create New...