Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.12.2011, 14:58
|
|
Вид на жительство
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
|
PIC16 TMR0 и TMR2
Почему D1 и D3 работают синхронно? Может TMR2 не правильно настроил?
Схема и программа во вложении.
Вложения:
![Тип файла: rar](images/attach/rar.gif) |
22.rar (39.4 Кб, 153 просмотров) |
|
|
|
Сказали "Спасибо" Slava-martyn
|
|
|
04.12.2011, 15:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: PIC16 TMR0 и TMR2
Прикольно. Где-то я это уже видел. Дежавю.
|
|
|
Сказали "Спасибо" alvadep
|
|
|
04.12.2011, 19:19
|
|
Вид на жительство
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
|
Re: PIC16 TMR0 и TMR2
Да, просто не стоило ту тему продолжать. Лучше в новой.
Сообщение от Slava-martyn
|
Избыточность нужна мне для наглядности, и сокращать программу не требуется. Вопрос в том, почему я не могу выставить другой период таймера №2 в МК? Почему он работает синхронно с TMR0?
|
Сообщение от alvadep
|
Вам надо еще разрешить прерывание от периферийных модулей (bsf INTCON, PEIE).
|
А они зачем (здесь)? При отладке в протеусе в прерывания заходит, и от TMR0 и от TMR1. От TMR2 устанавливается флаг, но почему-то одновременно с TMR0.
Сообщение от alvadep
|
В общем, это еще раз подтверждает то, что излишества только усложняют отладку.
Это ни в коей мере не относится к Вам, я понимаю, что Вы экспериментируете и пытаетесь во всем разобраться, но в реальных устройствах, чем проще, тем лучше.
|
Да, только для обучения, а так можно (и нужно) упрощать (оптимизировать).
|
|
|
Сказали "Спасибо" Slava-martyn
|
|
|
04.12.2011, 19:22
|
|
Вид на жительство
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
|
Re: PIC16 TMR0 и TMR2
Выложу программу текстом на всякий случай. В архиве уже есть.
PHP код:
|
list p=16f877A ; Выбор микроконтроллера
include "p16f877A.inc" ; Подключение библиотек к компилятору
__CONFIG(_WDT_ON) ; Бит конфигурации - выключение сторожевого таймера WDT
;---------------------------
cblock 0x71 ; Начало блока переменных
;здесь можно присвоить имена регистрам с адреса 0х71 по порядку
LED ; Ячейки для хранения переменных светодиодов
W_TEMP ; Ячейка для сохранения значения регистра W
STATUS_TEMP ; Ячейка для сохранения значения регистра STATUS
FLAGS ; Ячейки для хранения флагов
endc ; Конец блока переменных
;---------------------------
T0 EQU 0x00 ; Флаг таймера TMR0
T1 EQU 0x01 ; Флаг таймера TMR1
T2 EQU 0x02 ; Флаг таймера TMR2
D0 EQU 0x00 ; Переменная светодиода D1
D1 EQU 0x01 ; Переменная светодиода D2
D2 EQU 0x02 ; Переменная светодиода D3
D3 EQU 0x03 ; Переменная светодиода D4
;---------------------------
; Начало программы
ORG 0x00 ; Адрес вектора сброса
GOTO START ; После сброса идти на метку START
;---------------------------
ORG 0x04 ; Адрес вектора прерывания
GOTO PRER ; После прерывания идти на метку PRER
;---------------------------
PRER ; Метка для перехода по прерыванию
MOVWF W_TEMP ; Сохранить W
SWAPF STATUS,W ; Поменять местами полубайты STATUS и сохранить в W
MOVWF STATUS_TEMP ; Сохранить STATUS
BTFSC INTCON,T0IF ; Если T0IF установлен,
CALL PRERT0 ; то вызываем подпрограмму PRERT0
BTFSC PIR1,TMR1IF ; Если TMR1IF установлен,
CALL PRERT1 ; то вызываем подпрограмму PRERT1
BTFSC PIR1,TMR2IF ; Если TMR2IF установлен,
CALL PRERT2 ; то вызываем подпрограмму PRERT2
; востановление W и STATUS
SWAPF STATUS_TEMP,W ; Поменять местами полубайты STATUS_TEMP и сохранить в W
MOVWF STATUS ; Востановить STATUS
SWAPF W_TEMP,F ; Поменять местами полубайты W_TEMP и сохранить в W_TEMP
SWAPF W_TEMP,W ; Поменять местами полубайты W_TEMP и сохранить в W
RETFIE
;---------------------------
START ; Метка для перехода по сбросу МК
MOVLW B'00000111' ; Загрузить B'10001111' в регистр W
MOVWF OPTION_REG ; Установить все выводы порта B как логические входы
banksel TRISD ; Выбор второго банка регистров
CLRF TRISD ; Очистка регистра-защелки порта D
banksel PORTD ; Выбор первого банка регистров
CLRF PORTD ; Очистить порт D
BSF LED,D0 ; Установить D0
BSF LED,D1 ; Установить D1
BSF LED,D2 ; Установить D2
BSF LED,D3 ; Установить D3
CLRWDT ; Сбросить WDT и предделитель
CLRF INTCON ; Выключить прерывания и сбросить T0IF
CLRF T1CON ; Выключить TMR1
CLRF T2CON ; Выключить TMR2
CLRF TMR0 ; Сброс счётчика TMR0
CLRF TMR1H ; Очистить старший байт регистра TMR1
CLRF TMR1L ; Очистить младший байт регистра TMR1
CLRF TMR2 ; Очистить регистр TMR2
BSF STATUS,RP0 ; Банк 1
CLRF PIE1 ; Выключить переферийные прерывания
MOVLW b'00000111' ; Предделитель включён перед TMR0, коэффициент деления 1:128
MOVWF OPTION_REG ; смотри PIC16_Manual.pdf
MOVLW b'11111111' ; Загрузить B'11111111' в регистр W
MOVWF PR2 ; Запись в регистр PR2 периода таймера
BCF STATUS,RP0 ; Банк 0
CLRF PIR1 ; Очистить флаги переферийных прерываний
MOVLW b'00110100' ; Предделитель перед TMR1, коэффициент деления 1:8
MOVWF T1CON ; смотри PIC16_Manual.pdf
MOVLW b'00111001' ; Предделитель перед и после TMR2, коэффициент деления 1:7 и 1:4
MOVWF T2CON ; смотри PIC16_Manual.pdf
BSF T1CON,TMR1ON ; Включение модуля TMR1
BSF T2CON,TMR2ON ; Включение модуля TMR2
BSF STATUS,RP0 ; Банк 1
BSF INTCON,T0IE ; Разрешить прерывания от TMR0
BSF PIE1,TMR1IE ; Разрешить прерывания от TMR1
BSF PIE1,TMR2IE ; Разрешить прерывания от TMR2
BSF INTCON,GIE ; Разрешить все прерывания
BCF STATUS,RP0 ; Банк 0
;---------------------------
MAIN ; Метка для перехода
CLRWDT ; Сбросить WDT и предделитель
BTFSC FLAGS,T0 ; Если T0 установлен,
CALL LED0 ; то вызов подпрограммы LED0
BTFSC FLAGS,T1 ; Если T1 установлен,
CALL LED1 ; то вызов подпрограммы LED1
BTFSC FLAGS,T2 ; Если T2 установлен,
CALL LED2 ; то вызов подпрограммы LED2
; Инверсия переменной D3
MOVLW B'00001000' ; Загрузить B'00001000' в регистр W
XORWF LED,F ; Побитное "исключающее ИЛИ" переменной и W
MOVF LED,W ; Загрузить LED в регистр W
MOVWF PORTD ; Загрузить W в регистр PORTD
GOTO MAIN ; Цикл MAIN
;---------------------------
LED0 ; Инверсия переменной D0 и сброс флага T0
MOVLW B'00000001' ; Загрузить B'00000001' в регистр W
XORWF LED,F ; Побитное "исключающее ИЛИ" переменной и W
BCF FLAGS,T0 ; Сбросить флаг T0
RETURN ; Возврат из подпрограммы
;---------------------------
LED1 ; Инверсия переменной D1 и сброс флага T0
MOVLW B'00000010' ; Загрузить B'00000010' в регистр W
XORWF LED,F ; Побитное "исключающее ИЛИ" переменной и W
BCF FLAGS,T1 ; Сбросить флаг T1
RETURN ; Возврат из подпрограммы
;---------------------------
LED2 ; Инверсия переменной D2 и сброс флага T0
MOVLW B'00000100' ; Загрузить B'00000100' в регистр W
XORWF LED,F ; Побитное "исключающее ИЛИ" переменной и W
BCF FLAGS,T2 ; Сбросить флаг T2
RETURN ; Возврат из подпрограммы
;---------------------------
PRERT0 ; Обработка прерывания от TMR0
BCF INTCON,T0IF ; Сбросим флаг прерывания таймера 0
BSF FLAGS,T0 ; Установим свой флаг прерывания
RETURN ; Возврат из подпрограммы
;---------------------------
PRERT1 ; Обработка прерывания от TMR1
BCF PIR1,TMR1IF ; Сбросим флаг прерывания таймера 1
BSF FLAGS,T1 ; Установим свой флаг прерывания
RETURN ; Возврат из подпрограммы
;---------------------------
PRERT2 ; Обработка прерывания от TMR2
BCF PIR1,TMR2IF ; Сбросим флаг прерывания таймера 2
BSF FLAGS,T2 ; Установим свой флаг прерывания
RETURN ; Возврат из подпрограммы
;---------------------------
END
|
|
|
|
Сказали "Спасибо" Slava-martyn
|
|
|
04.12.2011, 20:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: PIC16 TMR0 и TMR2
Сообщение от Slava-martyn
|
А они зачем (здесь)? При отладке в протеусе в прерывания заходит, и от TMR0 и от TMR1. От TMR2 устанавливается флаг, но почему-то одновременно с TMR0.
|
Без разрешения прерывания от периферийных устройств (PEIE) прерываний от TMR1 и TMR2 не будет, но флаги TMR1IF и TMR2IF будут устанавливаться. Поэтому, когда происходит переход на вектор обработки прерывания по переполнению TMR0, флаг TMR2IF уже установлен и получается синхронная работа D1 и D3.
А на счет разных "протеусов", так косяки есть везде.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо alvadep за это сообщение:
|
|
|
04.12.2011, 21:07
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: PIC16 TMR0 и TMR2
Сообщение от Slava-martyn
|
программа во вложении
|
Она не рабочая... и бред по сути...
Начните всё сначала... и не торопитесь освоить новое... не разобравшись с предыдущим...
Рано вы открыли новую тему...
Почитайте лучше это...
http://www.pic24.ru/doku.php/osa/art...asm_formatting
... больше пользы будет...
|
|
|
|
04.12.2011, 21:19
|
|
Вид на жительство
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
|
Re: PIC16 TMR0 и TMR2
Сообщение от alvadep
|
А на счет разных "протеусов", так косяки есть везде.
|
Зря Вы про него так, он хороший ![Улыбка](images/smilies/icon_smile.gif)
Добавил прерывания от периферийных устройств и всё заработало! Никогда бы не подумал что таймер это периферийное устройство, хотя, каким же ещё ему быть ![Улыбка](images/smilies/icon_smile.gif)
А зачем INTCON в 4 банках? Клоны?
Сообщение от st_1
|
Она не рабочая...
|
Странно, у меня запускается. Только добавил.
BSF INTCON,PEIE ; Разрешить прерывания от периферийных модулей
Сообщение от st_1
|
и бред по сути...
|
А по подробнее?
Последний раз редактировалось Slava-martyn; 04.12.2011 в 21:24.
|
|
|
Сказали "Спасибо" Slava-martyn
|
|
|
04.12.2011, 22:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: PIC16 TMR0 и TMR2
Сообщение от Slava-martyn
|
Зря Вы про него так, он хороший
|
Я не говорил, что он плохой, а только лишь о то, что у каждой подобной программы есть свои “тараканы”. В любом случае при возникновении вопросов обращаться нужно к первоисточникам т.е. к datasheetам.
Цитата:
|
А зачем INTCON в 4 банках? Клоны?
|
Это один регистр, только обращаться к этому регистру можно из любого банка.
|
|
|
Сказали "Спасибо" alvadep
|
|
|
05.12.2011, 00:25
|
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,647
Сказал спасибо: 73
Сказали Спасибо 1,799 раз(а) в 651 сообщении(ях)
|
Re: PIC16 TMR0 и TMR2
Сообщение от Slava-martyn
|
Никогда бы не подумал что таймер это периферийное устройство, хотя, каким же ещё ему быть
|
Просто внимательно смотрите в даташите по каждому модулю раздел "Регистры и биты, связанные с работой ...". Если TMR2 связан с битом PEIE, то конечно, это периферийное устройство, и этот бит нужно выставить.
Поскольку уж затронули проблему таймеров, у меня есть свой вопрос. В даташите сказано, что для уменьшения энергопотребления TMR2 может быть выключен сбросом флага TMR2ON. Так вот, собственно, сам вопрос - будет ли этот таймер сказываться на потреблении в режиме SLEEP? То есть, понятно, что генератор остановлен и таймер ничего не считает. Но как периферийное устройство он остается подключенным к общему питанию, и какую-то часть энергии потребляет... Или это совершенно не сказывается на энергопотреблении в SLLEP-режиме?
|
|
|
|
05.12.2011, 12:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: PIC16 TMR0 и TMR2
Сообщение от RECTO
|
Так вот, собственно, сам вопрос - будет ли этот таймер сказываться на потреблении в режиме SLEEP?
|
“Есть ли жизнь на Марсе…. Науке не известно”.
Но если рассуждать логически….
В TMR1 бит включения TMR1ON используется логическим элементом, который стоит после делителя и поэтому вкл/откл модуля практически не влияет на потребление (делитель по любому крутится).
В TMR2 скорей всего TMR2ON используется до делителя и отключает только подачу тактовых импульсов, а не весь модуль. Поскольку при TMR2ON=0 в модуле TMR2 ни чего не крутится, то это и позволило говорить о снижении потребления. Следовательно, в SLEEP вкл/откл модуля TMR2 не должно влиять на потребление, хотя прямого подтверждения этому нет в даташитах.
Еще о том, что модуль не отключается полностью, может косвенно свидетельствовать тот факт, что “регистр TMR2 не очищается при записи в T2CON” (при POR и BOR TMR2 обнуляется). И еще регистры TMR2 и PR2 доступны при TMR2ON=0.
Последний раз редактировалось alvadep; 05.12.2011 в 12:43.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо alvadep за это сообщение:
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Преблема с TMR0 в PIC508
|
cnc10 |
Микроконтроллеры, АЦП, память и т.д |
2 |
24.03.2011 16:52 |
TMR0 pic12c508
|
cnc10 |
Микроконтроллеры, АЦП, память и т.д |
7 |
30.04.2009 20:23 |
По PIC 12 C508A по поводу TMR0
|
cnc10 |
Микроконтроллеры, АЦП, память и т.д |
6 |
28.05.2007 10:11 |
pic16+rs232
|
Superkaif |
Микроконтроллеры, АЦП, память и т.д |
1 |
29.03.2007 12:52 |
переполнение TMR2 ???
|
Picallka |
Микроконтроллеры, АЦП, память и т.д |
2 |
11.02.2004 21:32 |
Часовой пояс GMT +4, время: 16:52.
|
|