Александр Бушков 4 Report post Posted May 18, 2016 (edited) ' Никак не получается программа. Подскажите, пожалуйста, что не так? ' Секундные часы на Таймере0' PIC Basic PRO. Программа. версия от 18 мая 2016'Таймер0, предделитель = 64, TMR0=131, Cnt=125 ( Период=1сек), Cnt = 7500 (Период=60 сек)'16F877А-I/PCnt var bytetchas VAR byte ' счетчик часов до 24tmin VAR byte ' счетчик минут до 60tsec var byte ' Счетчик секундdnedel var byte ' счетчик дней недели от 1 до 7x var wordi var wordupdate var byteDEFINE LCD_DREG PORTBDEFINE LCD_DBIT 4DEFINE LCD_RSREG PORTBDEFINE LCD_RSBIT 3DEFINE LCD_EREG PORTBDEFINE LCD_EBIT 0DEFINE LCD_BITS 4DEFINE LCD_LINES 2DEFINE LCD_COMMANDUS 2000DEFINE LCD_DATUS 50define ADC_BITS 10define ADC_CLOCK 3define ADC_SAMPLEUS 100pause 100'Конфигурируем портыPortB=000000PortC=000000PortD=000000PortE=000000TrisB=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 до 1OPTION_REG.3=0 'PSA=0 'работа с предделителемOPTION_REG.2=1 'PS2=1 'OPTION_REG.1=0 'PS1=0 'OPTION_REG.0=1 'PS0=1 'Предделитель = 64INTCON.7=1 'Бит глобального прерыванияINTCON.6=0INTCON.5=1 'Прерывание по Переполнению TIMER0INTCON.4=0INTCON.3=0INTCON.2=0INTCON.1=0INTCON.0=0T1CON=000000T2CON=000000'MAIN:TMR0=131 'Установска регистра таймераCnt=0tmin=0tsec=0tchas=0dnedel=1 'Первый день недели ПонедельникON interrupt goto ISRsto: 'НАЧАЛО ЦИКЛА' Вывод информации на дисплей' Первая строка: Часы.Минуты.Секунды' Вторая строка: День недели. Понедельник=1.if update=1 thenlcdout $fe, 1lcdout $fe, 2lcdout dec tchas,".", dec tmin,".",dec tseclcdout $fe, 192lcdout dec dnedelpause 10update=0endifx=120x=x-80x=x/10x=x*30'Конец вывода информации на дисплейgoto sto ' КОНЕЦ ЦИКЛАISR:' Подпрограмма обработки прерывания таймераIf INTCON.2=1 then '--1TMR0=131Cnt=cnt+1if Cnt=50 then 'Секундные отсчеты '--2Cnt=0'if PortC.4=0 then'PortC.4 =1 'секундное переключение светодиода'else'PortC.4=0'endiftsec=tsec+1update=1if tsec=60 then '--3tsec=0if PortC.5=0 thenPortC.5=1 'минутное переключение светодиодаelsePortC.5=0endiftmin=tmin+1 'Минуты часовые до 60if tmin=60 then '--4tmin=0tchas=tchas+1 'Часы до 24if tchas=24 then '--5tchas=0dnedel=dnedel+1 'Недели до 7if dnedel>7 then dnedel=1endif '==5endif '==4endif '==3endif '==2INTCON.2=0resumeendif '==1' Конец подпрограммы обработки прерывания таймера c периодом 1 секresumeEnd Edited May 18, 2016 by dvselectronic код под спойлер убрал Share this post Link to post Share on other sites
Александр Бушков 4 Report post Posted May 19, 2016 Да, смотрел и изучал. Но прерывания еще не пробовал программировать. Сейчас прерывания не идут... Упущена какая то важная фишка... Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted May 19, 2016 В подпрограмме прерывания кода должно быть минимум! оставьте только отслеживание прерывания и присвоение 1 переменной, если прерывание было. Пересчёт времени и все остальные условия переносите в основной код. Посмотрите мой урок, про таймеры под ним можно код скачать, прошивку и проект протэуса Share this post Link to post Share on other sites
Александр Бушков 4 Report post Posted May 19, 2016 Спасибо, буду пробовать. Share this post Link to post Share on other sites
Александр Бушков 4 Report post Posted May 19, 2016 В подпрограмме прерывания кода должно быть минимум! оставьте только отслеживание прерывания и присвоение 1 переменной, если прерывание было. Пересчёт времени и все остальные условия переносите в основной код. Посмотрите мой урок, про таймеры под ним можно код скачать, прошивку и проект протэуса Спасибо за совет! Сейчас совсем нет прерываний, даже на первых секундах ничего...Мне кажется, что ошибка в структуре программы, например, не так сделана точка входа в подпрограмму обработки прерывания или возврат из нее... Будьте добры, пришлите пожалуйста текст программы на PIc Basic Pro Вашего 12 урока на двух таймерах. Ведь очень важны и детали в программировании.. Моя почта: bushkovaa@mail.ru Share this post Link to post Share on other sites
VitalForce 67 Report post Posted May 19, 2016 Под каждым видео-уроком есть описание, исходный текст, прошивка, проект в протеусе. Share this post Link to post Share on other sites
Александр Бушков 4 Report post Posted May 19, 2016 Спасибо большое за помощь! Нашел ошибку в тексте программы. Не поставил перед обработчиком прерываний ключевое слово Disable, а при выходе из обработчика не поставил Enable. Share this post Link to post Share on other sites
Александр Бушков 4 Report post Posted May 19, 2016 ' ПРОГРАММА РАБОТАЕТ! ' Секундные часы на Таймере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
Evgeniy 285 Report post Posted May 19, 2016 Архив проекта: http://vip-cxema.org/files/picbasic_lessons/lesson_12.zip Share this post Link to post Share on other sites