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

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 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 чипа. Что я делаю не так ?
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15572
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Если удачно записано значение OSСCAL проблема только в программе. Или в самой величине константы (а-ля "с потолка"). Даже из залоченного кристалла значение константы считывается нормально. Возможный казус - установка не той конфигурации и/или использование вывода RESET как линии ввода/вывода - в даташитах частенько мелькает "внутренний r-c генератор остановлен при RESET =0") я не проверял, но мало ли...
Далее...
"при первой пропаже питания"...
наиболее вероятная причина ошибки программы в отношении начальной инициализации регистров при ситуации "сбой по питанию" - ПИК штука маломощная, если схема имеет по питанию конденсатор за 200 микрофарад схемка формирования аппаратного сброса может не обнаружить таковой (интервал между отключением питания и последующим включением менее времени разряда конденсатора фильтра до уровня достаточного для сработки схемы POR).
В результате аппаратного сброса нету или выполнен без очистки промежуточных значений в критичных регистрах программы.
:beer:
Реклама
Аватара пользователя
Родэрик
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы
Контактная информация:

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

Сообщение Родэрик »

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

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

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

-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

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

Сообщение -=Vovka=- »

Сделайте тестовую прошивку выдачи на пин определенной частоты или мигания раз в секунду светодиодом.
Реклама
Эиком - электронные компоненты и радиодетали
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

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

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

П.С. Внимательно прочитал, что написал Родэрик, и все стало ясно, спасибо, все работает как надо))
Последний раз редактировалось Пока_без_кота Пн авг 15, 2016 18:11:20, всего редактировалось 1 раз.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15572
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение 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:
Реклама
Ответить

Вернуться в «PIC»