Страница 1 из 1

Уход частоты 12F629 при неизменном OSCCAL

Добавлено: Пн авг 15, 2016 07:04:37
Пока_без_кота
Доброго времени суток. Подходящей темы не нашел, поэтому пришлось создавать эту. В процессе переноса програмного UART-а с 16F84 на 12F629 возникла следующая проблема. Чип был куплен б/у и залоченым. Я его полностью стер и записал свою прошивку (программатором PICkit2), попутно восстановив OSСCAL средствами оболочки PICkit 2 v2.61. Так вот программный UART запускается только 1 раз. После переподачи питания, логическим анализатором вижу, что временные интервалы уходят за рамки допустимых. Стираю чип, заново восстанавливаю OSСCAL, записываю прошивку, и она работает. До первой пропажи питания :))) После этого частота опять уплывает, хотя значение OSСCAL остается неизменным (вычитавал после того, как частота уплывала). И так 3 чипа. Что я делаю не так ?

Re: Уход частоты 12F629 при неизменном OSCCAL

Добавлено: Пн авг 15, 2016 08:22:23
BOB51
Если удачно записано значение OSСCAL проблема только в программе. Или в самой величине константы (а-ля "с потолка"). Даже из залоченного кристалла значение константы считывается нормально. Возможный казус - установка не той конфигурации и/или использование вывода RESET как линии ввода/вывода - в даташитах частенько мелькает "внутренний r-c генератор остановлен при RESET =0") я не проверял, но мало ли...
Далее...
"при первой пропаже питания"...
наиболее вероятная причина ошибки программы в отношении начальной инициализации регистров при ситуации "сбой по питанию" - ПИК штука маломощная, если схема имеет по питанию конденсатор за 200 микрофарад схемка формирования аппаратного сброса может не обнаружить таковой (интервал между отключением питания и последующим включением менее времени разряда конденсатора фильтра до уровня достаточного для сработки схемы POR).
В результате аппаратного сброса нету или выполнен без очистки промежуточных значений в критичных регистрах программы.
:beer:

Re: Уход частоты 12F629 при неизменном OSCCAL

Добавлено: Пн авг 15, 2016 15:22:18
Родэрик
А что есть в Вашем понимании OSCCAL? Просто вы пишете про его восстановление с помощью программатора. Но OSCCAL это лишь регистр оперативной памяти и его необходимо загрузить (в программе) при каждом старте чипа, "подобрав" его значение по последнему адресу программной памяти. Вы делаете это?

Код: Выделить всё

            BANKSEL    OSCCAL
            CALL       0x3FF
            ADDLW      .4    ;можно без этой строчки, просто я так делаю.
            MOVWF    OSCCAL


Re: Уход частоты 12F629 при неизменном OSCCAL

Добавлено: Пн авг 15, 2016 17:00:50
-=Vovka=-
Сделайте тестовую прошивку выдачи на пин определенной частоты или мигания раз в секунду светодиодом.

Re: Уход частоты 12F629 при неизменном OSCCAL

Добавлено: Пн авг 15, 2016 17:42:03
Пока_без_кота
Работа закончилась, можно и себе время уделить)) Итак, код:
Спойлер

Код: Выделить всё

	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
Я шлю английскую "А". Ее ASCII-код имеет внутри 5 идущих подряд нулей, по этому и ориентируюсь. При длительности 1 бита в 104 мкс, имеем для этой последовательности 104*5=520 мкс низкого уровня.
Вот что я и имею после восстановления OSCCAL и перепрошивки:
Изображение
Тоесть теория (расчитывал задержку в симуляторе) вяжется с практикой.

А вот что я имею после переподачи питания:
Изображение

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

П.С. Внимательно прочитал, что написал Родэрик, и все стало ясно, спасибо, все работает как надо))

Re: Уход частоты 12F629 при неизменном OSCCAL

Добавлено: Пн авг 15, 2016 18:06:33
BOB51
...
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
8)
В самом конце ПЗУ записана константа в виде команды retlw NN (NN- собственно константа)/
org 0 нежелательный сленг - ибо накладывается на область обработчика прерываний.
Ну и пропуск обязательной части заголовка...
:wink: