Уход частоты 12F629 при неизменном OSCCAL
-
Пока_без_кота
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Уход частоты 12F629 при неизменном OSCCAL
Доброго времени суток. Подходящей темы не нашел, поэтому пришлось создавать эту. В процессе переноса програмного UART-а с 16F84 на 12F629 возникла следующая проблема. Чип был куплен б/у и залоченым. Я его полностью стер и записал свою прошивку (программатором PICkit2), попутно восстановив OSСCAL средствами оболочки PICkit 2 v2.61. Так вот программный UART запускается только 1 раз. После переподачи питания, логическим анализатором вижу, что временные интервалы уходят за рамки допустимых. Стираю чип, заново восстанавливаю OSСCAL, записываю прошивку, и она работает. До первой пропажи питания
После этого частота опять уплывает, хотя значение OSСCAL остается неизменным (вычитавал после того, как частота уплывала). И так 3 чипа. Что я делаю не так ?
- Реклама
Re: Уход частоты 12F629 при неизменном OSCCAL
Если удачно записано значение OSСCAL проблема только в программе. Или в самой величине константы (а-ля "с потолка"). Даже из залоченного кристалла значение константы считывается нормально. Возможный казус - установка не той конфигурации и/или использование вывода RESET как линии ввода/вывода - в даташитах частенько мелькает "внутренний r-c генератор остановлен при RESET =0") я не проверял, но мало ли...
Далее...
"при первой пропаже питания"...
наиболее вероятная причина ошибки программы в отношении начальной инициализации регистров при ситуации "сбой по питанию" - ПИК штука маломощная, если схема имеет по питанию конденсатор за 200 микрофарад схемка формирования аппаратного сброса может не обнаружить таковой (интервал между отключением питания и последующим включением менее времени разряда конденсатора фильтра до уровня достаточного для сработки схемы POR).
В результате аппаратного сброса нету или выполнен без очистки промежуточных значений в критичных регистрах программы.

Далее...
"при первой пропаже питания"...
наиболее вероятная причина ошибки программы в отношении начальной инициализации регистров при ситуации "сбой по питанию" - ПИК штука маломощная, если схема имеет по питанию конденсатор за 200 микрофарад схемка формирования аппаратного сброса может не обнаружить таковой (интервал между отключением питания и последующим включением менее времени разряда конденсатора фильтра до уровня достаточного для сработки схемы POR).
В результате аппаратного сброса нету или выполнен без очистки промежуточных значений в критичных регистрах программы.
- Родэрик
- Нашел транзистор. Понюхал.
- Сообщения: 162
- Зарегистрирован: Чт ноя 26, 2015 23:22:35
- Откуда: не с Уфы
- Контактная информация:
Re: Уход частоты 12F629 при неизменном OSCCAL
А что есть в Вашем понимании OSCCAL? Просто вы пишете про его восстановление с помощью программатора. Но OSCCAL это лишь регистр оперативной памяти и его необходимо загрузить (в программе) при каждом старте чипа, "подобрав" его значение по последнему адресу программной памяти. Вы делаете это?
Код: Выделить всё
BANKSEL OSCCAL
CALL 0x3FF
ADDLW .4 ;можно без этой строчки, просто я так делаю.
MOVWF OSCCAL
Re: Уход частоты 12F629 при неизменном OSCCAL
Сделайте тестовую прошивку выдачи на пин определенной частоты или мигания раз в секунду светодиодом.
-
Пока_без_кота
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Re: Уход частоты 12F629 при неизменном OSCCAL
Работа закончилась, можно и себе время уделить)) Итак, код:
Я шлю английскую "А". Ее ASCII-код имеет внутри 5 идущих подряд нулей, по этому и ориентируюсь. При длительности 1 бита в 104 мкс, имеем для этой последовательности 104*5=520 мкс низкого уровня.
Вот что я и имею после восстановления OSCCAL и перепрошивки:

Тоесть теория (расчитывал задержку в симуляторе) вяжется с практикой.
А вот что я имею после переподачи питания:

Восстановление OSCCAL произвожу так:


П.С. Внимательно прочитал, что написал Родэрик, и все стало ясно, спасибо, все работает как надо))
Спойлер
Код: Выделить всё
list p=16f629
__config _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDTE_OFF & _FOSC_INTRCIO
include p12f629.inc
#define RX GPIO,2 ; Ножка RX - бит порта
#define TX GPIO,1 ; Ножка TX - бит порта
#define BITS_DELAY .30 ; .30 Задержка длинной 1 бит - 104 мкс при 9600 бод и частоте 4 МГц
cblock 20h
w_temp
status_temp
TX_byte
RX_byte
UART_counter
delay_counter
endc
org 0
Main
bsf TX ; Заранее установим TX в 1, чтобы случайно не послать старт-бит
banksel TRISIO ; Банк 1
bcf TX ; TX на вывод, все остальные ноги как входы
banksel GPIO ; Банк 0
movlw b'00000111'
movwf CMCON ; Выключим аналоговый компаратор
movlw 'A'
call Send_TX_Byte
Loop
goto Loop
Send_TX_Byte ; Подпрограмма передачи 1 байта
bcf TX ; Шлем старт бит
movwf TX_byte ; Загрузим передавемый байт
movlw .8 ; Загрузим количесвто передаваемых битов
movwf UART_counter
nop
Transmit_Next_Bit
nop
call Delay_1bit ; Длинной 1 бит
rrf TX_byte ; Продвигаем в бит переноса все биты, начиная с младшего
btfsc STATUS,C ; Проверяем, что выдавилось в бит переноса
bsf TX ; Если 1, выставляем 1 на ТХ
btfss STATUS,C
bcf TX ; Если 0, выставляем 0 на ТХ
decfsz UART_counter ; Весь байт отослан ?
goto Transmit_Next_Bit ; Нет, идем слать следующий бит
call Delay_1bit ; Задержка длинной 1 бит
nop
nop
nop
nop
nop
bsf TX ; Шлем стоп-бит
return
Delay_1bit
movlw BITS_DELAY ; 104 мкс для 9600 бод
movwf delay_counter
Loop_Delay
decfsz delay_counter
goto Loop_Delay
return
end
Вот что я и имею после восстановления OSCCAL и перепрошивки:
Тоесть теория (расчитывал задержку в симуляторе) вяжется с практикой.
А вот что я имею после переподачи питания:
Восстановление OSCCAL произвожу так:
П.С. Внимательно прочитал, что написал Родэрик, и все стало ясно, спасибо, все работает как надо))
Последний раз редактировалось Пока_без_кота Пн авг 15, 2016 18:11:20, всего редактировалось 1 раз.
- Реклама
Re: Уход частоты 12F629 при неизменном OSCCAL
...
LIST P=12F629 ; list directive to define processor
#INCLUDE <P12F629.INC> ; processor specific variable definitions
...
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_ON & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
...
; пропущен участок инициализации
START
; errorlevel -302
BSF STATUS,RP0 ; set file register bank to 1
CALL 0x3FF ; retrieve factory calibration value
MOVWF OSCCAL ; update register with factory cal value
BCF STATUS,RP0 ; set file register bank to 0
....
.....
OSC CODE 0x03FF ; или org 0x03FF
retlw const_OSCCAL ; const_OSCCAL установить в defn_хххх_629.txt согласно
; предварительно считанного из целевого МК !!!
...
...
end
В самом конце ПЗУ записана константа в виде команды retlw NN (NN- собственно константа)/
org 0 нежелательный сленг - ибо накладывается на область обработчика прерываний.
Ну и пропуск обязательной части заголовка...

LIST P=12F629 ; list directive to define processor
#INCLUDE <P12F629.INC> ; processor specific variable definitions
...
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_ON & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
...
; пропущен участок инициализации
START
; errorlevel -302
BSF STATUS,RP0 ; set file register bank to 1
CALL 0x3FF ; retrieve factory calibration value
MOVWF OSCCAL ; update register with factory cal value
BCF STATUS,RP0 ; set file register bank to 0
....
.....
OSC CODE 0x03FF ; или org 0x03FF
retlw const_OSCCAL ; const_OSCCAL установить в defn_хххх_629.txt согласно
; предварительно считанного из целевого МК !!!
...
...
end
В самом конце ПЗУ записана константа в виде команды retlw NN (NN- собственно константа)/
org 0 нежелательный сленг - ибо накладывается на область обработчика прерываний.
Ну и пропуск обязательной части заголовка...


