Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 09.07.2009, 13:03   #1
faramun21
Junior Member
 
Регистрация: 15.05.2009
Возраст: 36
Сообщений: 8
Вес репутации: 100/0
faramun21 will become famous soon enoughfaramun21 will become famous soon enough
По умолчанию Часы на pic 16f874a и ds1307n работают, но не работают

Доброго всем времени суток.
мне необходимо создать определенную табличку, на которой будет отображаться часы и календарь и еще кое-какие данные, написал программу, собрал схему в протеусе, запустил всё работоает, собрал схему на монтажной плате, ничего не работает. может кто подскажет есть ли ошибки, уже месяц бьюсь.. сейчас по программе будут выводится на индикаторы только единицы секунд, хотя бы так для начала. спасибо всем заранеееееее!!!!!!!
вот программа

list p=16F874A
__config 3735H
; __config _cp_off & _debug_off & _wrt_enable_on & _cpd_off & _lvp_off & _boden_off & _pwrte_on & _wdt_off & _xt_osc


;================================================= ==============================================
; Определение положения регистров специального назначения.
;================================================= ==============================================

Indf equ 00h ;Регистр Indf.
PC equ 02h ;Регистр счетчика команд.
status equ 03h ;Регистр Status.
FSR equ 04h ;Регистр FSR.

intcon equ 0Bh ;Регистр прерываний

sspcon equ 14h ;Управление модулем MSSP
sspcon2 equ 11h ;Управление модулем MSSP
sspstat equ 14h ;Регистра статуса MSSP
sspbuf equ 13h ;Регистр-буфер приемника/передатчика
sspadd equ 13h ;Регистр адреса
pir1 equ 0Ch ;Регистр флагов прерываний

adcon1 equ 1Fh ;Регистр настройки порта A на цифровой выход/вход

trisa equ 05h ;Регистр выбора направления работы выводов порта А.
porta equ 05h ;Регистр управления защелками порта А.

trisb equ 06h ;Регистр выбора направления работы выводов порта В.
portb equ 06h ;Регистр управления защелками порта В.

trisc equ 07h ;Регистр выбора направления работы выводов порта С.
portc equ 07h ;Регистр управления защелками порта С.

trisd equ 08h ;Регистр выбора направления работы выводов порта D.
portd equ 08h ;Регистр управления защелками порта D.


;================================================= ==============================================
; Определение названия и положения регистров общего назначения.
;================================================= ==============================================

LED0 equ 30h ; Регистр хранения результатов преобразований
; 1-го двоично-десятичного разряда.
LED1 equ 31h ; ------- 2-го -------------------------
LED2 equ 32h ; ------- 3-го -------------------------
LED3 equ 33h ; ------- 4-го -------------------------
LED4 equ 34h ; ------- 5-го -------------------------
LED5 equ 35h ; ------- 6-го -------------------------
LED6 equ 36h ; ------- 7-го -------------------------
LED7 equ 37h ; ------- 8-го -------------------------
LED8 equ 38h ; ------- 9-го -------------------------
LED9 equ 39h ; ------- 10-го ------------------------

send equ 022h ;Регистр-передатчик
clockw equ 025h ;Регистрдля адреса с битом записи
clockr equ 026h ;Регистр для адреса с битом чтения
sec equ 027h ;Регистр установки секунд
pointer equ 028h ;Регистр-указатель
Index equ 021h ;Регистр счетчика количества малых колец индикации.
Count equ 023h ;Регистр счетчика количества больших колец индикации.
Temp equ 024h ;Регистр временного хранения данных.
del equ 028h ;Счётчик задержки для шины
del1 equ 033h ;Счётчик задержки для шины
;================================================= ==============================================
; Определение места размещения результатов операций.
;================================================= ==============================================
W equ 0 ;Результат направить в аккумулятор.
F equ 1 ;Результат направить в регистр.
;================================================= ==============================================
; Присваивание битам названий.
;================================================= ==============================================
C equ 0 ;Флаг переноса-заема.
RP0 equ 5 ;бит 5 регистра status
RP1 equ 6 ;бит 6 регистра status
Z equ 2 ;Флаг нулевого результата.
;================================================= ==============================================
; Присваивание константам названий.
;================================================= ==============================================
Const1 equ .255 ;Y1 - значение времязадающей константы "грубо" (до .255).
;Задается программистом.
Const2 equ .255 ;Y2 - значение времязадающей константы "точно" (до .255).
;Задается программистом.
;================================================= ==============================================
; --------Инициализация-------
;================================================= ==============================================

org 0000h ;Вектор сброса (начальный адрес)
bcf status,RP1 ;Выбор 0 банка регистров
bcf status,RP0 ;Выбор 0 банка регистров
CLRF porta
clrf status ;Очистить регистр состояния
clrf intcon ;Очистить регистр прерываний
bsf status,RP0 ;Выбор 1 банка регистров
movlw 06h ;Настроить порт A на выход
movwf adcon1 ;Каналы порта А - цифровые входы/выходы

movlw 000h ;Настроить порт A на выход
movwf trisa ;Через регистр направления

movlw b'00000000' ;Настроить порт D на выход
movwf trisd ;Через регистр направления

movlw b'00000000' ;Настроить порт B на выход
movwf trisb ;Через регистр направления

movlw b'00011000' ;Настроить бит sda, scl порт C на вход, остальные выход
movwf trisc ;Через регистр направления

movlw b'10100000' ;Настроить порт B на выход
movwf sspstat ;Через регистр направления

bcf status,RP0 ;Выбор 0 банка регистров
movlw b'00101000' ;
movwf sspcon ;Настройка регистра управления модуля MSSP

clrf porta
clrf portb
clrf portd
;================================================= ==============================================
; ---------Главный цикл-------
;================================================= ==============================================

main movlw 0D0h
movwf clockw
movlw 0D1h
movwf clockr
movlw 000h
movwf pointer
movlw 005h
movwf sec

;================================================= ==============================================
; Установка секунд и запуск генератора
;================================================= ==============================================

iclock call start

movf clockw,w
movwf sspbuf
call wait

movf pointer,w
movwf sspbuf
call wait

movf sec,w
movwf sspbuf
call wait

call stop

;================================================= ==============================================
; Чтение часов и минут
;================================================= ==============================================
readclock movlw 000h
movwf pointer

call start

call writeadd

call start2

movf clockr,w
movwf sspbuf
call wait

call read
movf sspbuf,w
movwf LED0
call yes

call read
movf sspbuf,w
movwf LED1

bsf status,RP0
bsf sspcon2,5
bsf sspcon2,4
bcf status,RP0
call wait
call stop
;================================================= ==============================================
; Чтение даты
;================================================= ==============================================
movlw 004h
movwf pointer

call start

call writeadd

call start2

movf clockr,w
movwf sspbuf
call wait

call read
movf sspbuf,w
movwf LED2
call yes

call read
movf sspbuf,w
movwf LED3
call yes

call read
movf sspbuf,w
movwf LED4
bsf status,RP0
bsf sspcon2,5
bsf sspcon2,4
bcf status,RP0

call stop
;================================================= ==============================================
call change
goto DINAM

;================================================= ==============================================
; Запись адреса
;================================================= ==============================================

writeadd movf clockw,w
movwf sspbuf
call wait

movf pointer,w
movwf sspbuf
call wait

return

yes bsf status,RP0
bcf sspcon2,5
bsf sspcon2,4
bcf status,RP0
return

;================================================= ==============================================
; Поразрядное распределение содержимого регистров LED0...3 (обоих
; полубайтов) по младшим полубайтам регистров LED0...7.
;================================================= ==============================================
change swapf LED4,W ;Запись старшего полубайта LED4
andlw 0Fh ;в младший полубайт LED9.
movwf LED9 ;--------------------------------

movfw LED4 ;Запись младшего полубайта LED4
andlw 0Fh ;в младший полубайт LED8.
movwf LED8 ;--------------------------------

swapf LED3,W ;Запись старшего полубайта LED3
andlw 0Fh ;в младший полубайт LED7.
movwf LED7 ;--------------------------------

movfw LED3 ;Запись младшего полубайта LED3
andlw 0Fh ;в младший полубайт LED6.
movwf LED6 ;--------------------------------

swapf LED2,W ;Запись старшего полубайта LED2
andlw 0Fh ;в младший полубайт LED5.
movwf LED5 ;--------------------------------

movfw LED2 ;Запись младшего полубайта LED2
andlw 0Fh ;в младший полубайт LED4.
movwf LED4 ;--------------------------------

swapf LED1,W ;Запись старшего полубайта LED1
andlw 0Fh ;в младший полубайт LED3.
movwf LED3 ;--------------------------------

movfw LED1 ;Запись младшего полубайта LED1
andlw 0Fh ;в младший полубайт LED2.
movwf LED2 ;--------------------------------

swapf LED0,W ;Запись старшего полубайта LED0
andlw 0Fh ;в младший полубайт LED1.
movwf LED1 ;--------------------------------

movfw LED0 ;Запись младшего полубайта LED0
andlw 0Fh ;в младший полубайт LED0.
movwf LED0 ;--------------------------------
;--------------------------------------------------------------------
; Конец распределения. В младших полубайтах регистров LED0...7 установлены
; двоично-десятичные числа в порядке возрастания разрядности. Старшие полубайты = 0.
;--------------------------------------------------------------------
return ; Переход по стеку в группу подпрограмм
; 8-разрядной динамической индикации.



;************************************************* **********************************************
; Подготовка счетчика количества малых колец индикации Index к началу полного цикла
; динамической индикации.
;-----------------------------------------------------------------------------------------------
DINAM clrf Index ; Сброс в 0 содержимого счетчика малых колец индикации Index.

;-----------------------------------------------------------------------------------------------
; Предварительная закладка количества больших колец индикации, которое нужно "пройти" за один
; полный цикл динамической индикации в регистр Count.
;-----------------------------------------------------------------------------------------------
movlw .10 ; Запись константы X (количество больших колец индикации,
; задается программистом) в регистр W.
movwf Count ; Копирование содержимого регистра W в регистр счетчика
; количества больших колец индикации Count.
;+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++
; Использование косвенной адресации при работе с таблицей данных.
;================================================= ==============================================
; Подготовка к косвенной адресации: запись в регистр W адреса регистра младшего разряда
; линейки 7-сегментных индикаторов ("привязка" к 7-сегментному индикатору, с активации которого
; начинается полный цикл первого большого кольца индикации).
;-----------------------------------------------------------------------------------------------
CYCLE movlw LED0 ; Запись в регистр W адреса регистра LED0.
addwf Index,W ; Увеличение адреса регистра LED0 на величину числа,
; записанного в регистре счетчика количества малых колец
; индикации Index, c сохранением результата в регистре W.
;-----------------------------------------------------------------------------------------------
; Косвенная адресация.
;-----------------------------------------------------------------------------------------------
movwf FSR ; Копирование содержимого регистра W в регистр FSR.
movf Indf,W ; Копирование содержимого регистра с адресом, записанным
; в регистре FSR, в регистр W.
call TABLE ; Условный переход (адрес следующей команды закладывается
; в стек) в ПП TABLE.
;+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++
; Группа команд установки запятой.
;-----------------------------------------------------------------------------------------------
;---> Возврат по стеку из ПП TABLE

movwf portd ; Копирование содержимого регистра W в 8 защелок порта D.
;-----------------------------------------------------------------------------------------------
; Группа команд формирования адресного кода управления дешифратором.
;-----------------------------------------------------------------------------------------------
movlw 4 ; Запись в регистр W константы .06.
bsf status,C ; Поднятие флага нулевого результата Z.
subwf Index,W ; Вычесть содержимое регистра W (число .06) из содержимого
; регистра Index (числа от .00 до .09).
btfss status,C ; Проверка состояния флага Z.
goto TIME ; Если флаг Z опущен (результат операции не=0), то переход
; в ПП Dot2 (запятая не выставляется).
call TABLE1
movwf porta ; Копирование содержимого регистра W в первые 3 защелки
; порта А (работа "на выход"), управляющие адресными входами
; внешнего дешифратора.
goto Zader
TIME movf Index,W ; Копирование содержимого регистра Index в регистр W.
call TABLE1
movwf portb ; Копирование содержимого регистра W в первые 3 защелки
; порта А (работа "на выход"), управляющие адресными входами
; внешнего дешифратора.
;-----------------------------------------------------------------------------------------------
; Группа команд задержки, определяющей время нахождения одного 7-сегментного индикатора
; в активном состоянии (определяющей время прохождения малого кольца индикации).
; "Грубое" формирование времени полного цикла динамической индикации.
;-----------------------------------------------------------------------------------------------
Zader movlw Const1 ; Запись в регистр W константы Y1 (см. "шапку").
movwf Temp ; Копирование содержимого регистра W в регистр Temp.
clrwdt ; Установка начала отсчета сторожевого таймера WDT.
PAUSE decfsz Temp,F ; Декремент содержимого регистра Temp c сохранением
; результата в нем же.
goto PAUSE ; Если результат декремента не=0, то переход в ПП PAUSE.
; Если результат декремента =0, то программа исполняется далее.
;-----------------------------------------------------------------------------------------------
; Увеличение на 1 содержимого счетчика количества малых колец индикации Index с последующей
; проверкой результата инкремента на равенство (или нет) числу .08.
;-----------------------------------------------------------------------------------------------
incf Index,F ; Увеличение на 1 содержимого регистра Index с сохранением
; результата в нем же.
movlw .1 ; Запись в регистр W константы .08.
bcf status,Z ; Сброс флага нулевого результата Z.
subwf Index,W ; Вычесть из содержимого регистра Index содержимое регистра
; W с сохранением результата в регистре W.
btfss status,Z ; Результат операции вычитания равен или нет нулю?
goto CYCLE ; Если не =0 (в регистре Index - число не равное 8), то
; переход к циклу активизации следующего по старшинству
; 7-сегментного индикатора (переход на новое малое
; кольцо индикации, то есть, в ПП CYCLE).
; Если =0 (в регистре Index - число равное 8), то программа
; исполняется далее.
;-----------------------------------------------------------------------------------------------
; Начало перехода на новое большое кольцо индикации после того, как последовательно активизиру-
; ются все 8 7-сегментных индикатора линейки (после прохождения 8-ми малых колец индикации).
;-----------------------------------------------------------------------------------------------
nop ; Выравнивающий NOP.
clrf Index ; Сброс в 0 содержимого регистра Index.
;-----------------------------------------------------------------------------------------------
; Уменьшение на 1 содержимого счетчика количества больших колец индикации Count.
;-----------------------------------------------------------------------------------------------
decfsz Count,F ; Декремент содержимого счетчика количества больших колец
; индикации Count с сохранением результата в нем же.
goto CYCLE ; Если результат декремента не=0, то переход в ПП CYCLE
; (переход на новое большое кольцо индикации).
; Если результат декремента =0, то программа исполняется далее
; (переход на новый полный цикл динамической индикации).
nop ; Выравнивающий NOP.
goto readclock

;================================================= ==============================================
; ----------Шина I2C----------
;================================================= ==============================================

;================================================= ==============================================
; START-условие
;================================================= ==============================================

start bsf status,RP0 ;Выбор 1 банка регистров
bsf sspcon2,0 ;Инициируем START
bcf status,RP0 ;Выбор 0 банка регистров
call wait
return

;================================================= ==============================================
; Повторный START-условие
;================================================= ==============================================

start2 bsf status,RP0 ;Выбор 1 банка регистров
bsf sspcon2,1 ;Инициируем повторный START
bcf status,RP0 ;Выбор 0 банка регистров
call wait
return

;================================================= ==============================================
; Ожидание завершения выполнения процедуры
;================================================= ==============================================

wait btfss pir1,3
goto wait
bcf pir1,3 ;Обнуляем флаг прерывания MSSP
return

;================================================= ==============================================
; STOP-условие
;================================================= ==============================================

stop bsf status,RP0 ;Выбор 1 банка регистров
bsf sspcon2,2
bcf status,RP0 ;Выбор 0 банка регистров
call wait
return

;================================================= ==============================================
; Чтение байта
;================================================= ==============================================

read bsf status,RP0 ;Выбор 1 банка регистров
bsf sspcon2,3
bcf status,RP0 ;Выбор 0 банка регистров
call wait
return

;================================================= ==============================================
; Задержка 6 мкс для шины
;================================================= ==============================================

delay movlw .255
movwf del1
movlw .255
movwf del
loop decfsz del1,f
decfsz del,f
goto loop
return


;-----------------------------------------------------------------------------------------------
; Применение вычисляемого перехода.
; (преобразование двоично-десятичного кода в код 7-сегментного индикатора)
;-----------------------------------------------------------------------------------------------
TABLE addwf PC,F ; Содержимое счетчика команд PC увеличивается
; на величину содержимого аккумулятора W.
retlw b'11000000' ; ..FEDCBA = 0 Происходит скачек по таблице
retlw b'11111001' ; .....CB. = 1 на строку со значением,
retlw b'10100100' ; .G.ED.BA = 2 записанным в аккумуляторе,
retlw b'10110000' ; .G..DCBA = 3 и далее - возврат по стеку.
retlw b'10011001' ; .GF..CB. = 4
retlw b'10010010' ; .GF.DC.A = 5
retlw b'10000010' ; .GFEDC.A = 6
retlw b'11111000' ; .....CBA = 7
retlw b'10000000' ; .GFEDCBA = 8
retlw b'10010000' ; .GF.DCBA = 9
;-----------------------------------------------------------------------------------------------
; Применение вычисляемого перехода.
; (преобразование двоично-десятичного кода в код 7-сегментного индикатора)
;-----------------------------------------------------------------------------------------------
TABLE1 addwf PC,F ; Содержимое счетчика команд PC увеличивается
; на величину содержимого аккумулятора W.
retlw b'00000001' ; ..FEDCBA = 0 Происходит скачек по таблице
retlw b'00000010' ; .....CB. = 1 на строку со значением,
retlw b'00000100' ; .G.ED.BA = 2 записанным в аккумуляторе,
retlw b'00001000' ; .G..DCBA = 3 и далее - возврат по стеку.
retlw b'00010000' ; .GF..CB. = 4
retlw b'00100000' ; .GF.DC.A = 5
retlw b'01000000' ; .GFEDC.A = 6
retlw b'10000000' ; .....CBA = 7

;************************************************* **********************************************
;================================================= ==============================================
end ; Директива конца текста программы.



схема внизу.......... спасибо большое всем заранее
Миниатюры
Безымянный1.JPG  
faramun21 вне форума   Ответить с цитированием
Старый 09.07.2009, 13:43   #2
IgorV
Senior Member
 
Аватар для IgorV
 
Регистрация: 25.02.2007
Адрес: всем пока
Возраст: 49
Сообщений: 4,100
Вес репутации: 1883/107
IgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant future
Отправить сообщение для IgorV с помощью Skype™
По умолчанию Re: Часы на pic 16f874a и ds1307n работают, но не работают

Цитата:
Сообщение от faramun21 Посмотреть сообщение
Доброго всем времени суток.
мне необходимо создать определенную табличку, на которой будет отображаться часы и календарь и еще кое-какие данные, написал программу, собрал схему в протеусе, запустил всё работоает, собрал схему на монтажной плате, ничего не работает. может кто подскажет есть ли ошибки, уже месяц бьюсь.. сейчас по программе будут выводится на индикаторы только единицы секунд, хотя бы так для начала. спасибо всем заранеееееее!!!!!!!
вот программа
оформи свой текст кода в тегах CODE
IgorV вне форума   Ответить с цитированием
Старый 09.07.2009, 14:55   #3
faramun21
Junior Member
 
Регистрация: 15.05.2009
Возраст: 36
Сообщений: 8
Вес репутации: 100/0
faramun21 will become famous soon enoughfaramun21 will become famous soon enough
По умолчанию Re: Часы на pic 16f874a и ds1307n работают, но не работают

Код:
            list 	p=16F874A
	    __config 	3735H
;	    __config    _cp_off & _debug_off & _wrt_enable_on & _cpd_off & _lvp_off & _boden_off & _pwrte_on & _wdt_off & _xt_osc


;===============================================================================================
; Определение  положения  регистров  специального  назначения.
;===============================================================================================

Indf        equ         00h         ;Регистр Indf.
PC          equ         02h         ;Регистр счетчика команд.
status      equ         03h         ;Регистр Status.
FSR         equ         04h         ;Регистр FSR.

intcon	    equ		0Bh	    ;Регистр прерываний

sspcon	    equ		14h	    ;Управление модулем MSSP
sspcon2	    equ		11h	    ;Управление модулем MSSP
sspstat     equ         14h	    ;Регистра статуса MSSP
sspbuf 	    equ		13h	    ;Регистр-буфер приемника/передатчика
sspadd	    equ		13h	    ;Регистр адреса
pir1	    equ		0Ch	    ;Регистр флагов прерываний

adcon1	    equ		1Fh	    ;Регистр настройки порта A на цифровой выход/вход

trisa       equ         05h         ;Регистр выбора направления работы выводов порта А.
porta       equ         05h         ;Регистр управления защелками порта А.

trisb       equ         06h         ;Регистр выбора направления работы выводов порта В.
portb       equ         06h         ;Регистр управления защелками порта В.

trisc       equ         07h         ;Регистр выбора направления работы выводов порта С.
portc       equ         07h         ;Регистр управления защелками порта С.

trisd       equ         08h         ;Регистр выбора направления работы выводов порта D.
portd       equ         08h         ;Регистр управления защелками порта D.


;===============================================================================================
; Определение  названия  и  положения  регистров  общего  назначения.
;===============================================================================================

LED0        equ         30h         ; Регистр хранения результатов преобразований
                                    ; 1-го двоично-десятичного разряда.
LED1        equ         31h         ; ------- 2-го -------------------------
LED2        equ         32h         ; ------- 3-го -------------------------
LED3        equ         33h         ; ------- 4-го -------------------------
LED4        equ         34h         ; ------- 5-го -------------------------
LED5        equ         35h         ; ------- 6-го -------------------------
LED6        equ         36h         ; ------- 7-го -------------------------
LED7        equ         37h         ; ------- 8-го -------------------------
LED8        equ         38h         ; ------- 9-го -------------------------
LED9        equ         39h         ; ------- 10-го ------------------------

send 	    equ 	022h        ;Регистр-передатчик
clockw 	    equ 	025h  	    ;Регистрдля адреса с битом записи
clockr 	    equ 	026h   	    ;Регистр для адреса с битом чтения
sec 	    equ 	027h  	    ;Регистр установки секунд
pointer     equ 	028h  	    ;Регистр-указатель
Index       equ         021h        ;Регистр счетчика количества малых колец индикации.
Count       equ         023h        ;Регистр счетчика количества больших колец индикации.
Temp        equ         024h        ;Регистр временного хранения данных.
del 	    equ 	028h        ;Счётчик задержки для шины
del1 	    equ 	033h        ;Счётчик задержки для шины
;===============================================================================================
; Определение места размещения результатов операций.
;===============================================================================================
W           equ         0           ;Результат направить в аккумулятор.
F           equ         1           ;Результат направить в регистр.
;===============================================================================================
; Присваивание битам названий.
;===============================================================================================
C           equ         0           ;Флаг переноса-заема.
RP0 	    equ		5	    ;бит 5 регистра status
RP1	    equ		6	    ;бит 6 регистра status
Z           equ         2           ;Флаг нулевого результата.
;===============================================================================================
; Присваивание константам названий.
;===============================================================================================
Const1      equ        .255         ;Y1 - значение времязадающей константы "грубо" (до .255).
                                    ;Задается программистом.
Const2      equ        .255         ;Y2 - значение времязадающей константы "точно" (до .255).
                                    ;Задается программистом.       
;===============================================================================================
; --------Инициализация-------
;=============================================================================================== 

	    org 	0000h  	    ;Вектор сброса (начальный адрес)
	    bcf         status,RP1  ;Выбор 0 банка регистров
	    bcf         status,RP0  ;Выбор 0 банка регистров
	    CLRF	porta
	    clrf 	status      ;Очистить регистр состояния
 	    clrf 	intcon      ;Очистить регистр прерываний
  	    movlw 	b'00101000' ;
 	    movwf 	sspcon      ;Настройка регистра управления модуля MSSP
 	    
 	    bsf 	status,RP0  ;Выбор 1 банка регистров
  	    movlw 	06h         ;Настроить порт A на выход
 	    movwf 	adcon1      ;Каналы порта А - цифровые входы/выходы

  	    movlw 	000h	    ;Настроить порт A на выход
 	    movwf 	trisa       ;Через регистр направления

 	    movlw 	b'00000000' ;Настроить порт D на выход
 	    movwf 	trisd       ;Через регистр направления

  	    movlw 	b'00000000' ;Настроить порт B на выход
 	    movwf 	trisb       ;Через регистр направления

 	    movlw 	b'00011000' ;Настроить бит sda, scl порт C на вход, остальные выход
 	    movwf 	trisc       ;Через регистр направления

  	    movlw 	b'10100000' ;Настроить порт B на выход
 	    movwf 	sspstat     ;Через регистр направления

  	    movlw    	.9          ; Скорость генератора BRG.
            movwf    	sspadd
 
	    bcf         status,RP0  ;Выбор 0 банка регистров

	    clrf        porta
	    clrf        portb
	    clrf        portd
;=============================================================================================== 
; ---------Главный цикл-------
;=============================================================================================== 

main        movlw       0D0h
 	    movwf 	clockw
            movlw 	0D1h
 	    movwf 	clockr
   	    movlw 	000h
 	    movwf 	pointer
   	    movlw 	005h
 	    movwf 	sec

;=============================================================================================== 
; Установка секунд и запуск генератора
;=============================================================================================== 

iclock	    call 	start

 	    movf 	clockw,w
 	    movwf 	sspbuf
	    call 	wait

 	    movf 	pointer,w
 	    movwf 	sspbuf
	    call 	wait

 	    movf 	sec,w
 	    movwf 	sspbuf
	    call 	wait

 	    call 	stop
	    
;=============================================================================================== 
; Чтение часов и минут
;=============================================================================================== 
readclock   movlw 	000h
 	    movwf 	pointer

            call 	start

            call 	writeadd

 	    call 	start2

 	    movf 	clockr,w
 	    movwf 	sspbuf
	    call	wait

 	    call 	read
      	    movf	sspbuf,w
	    movwf	LED0
 	    call 	yes

  	    call 	read
 	    movf	sspbuf,w
	    movwf	LED1

 	    bsf 	status,RP0
 	    bsf 	sspcon2,5
 	    bsf 	sspcon2,4
 	    bcf 	status,RP0
	    call	wait
	    call 	stop
;=============================================================================================== 
; Чтение даты
;===============================================================================================  	    
	    movlw 	004h
 	    movwf 	pointer

 	    call 	start

 	    call	writeadd

 	    call 	start2

 	    movf 	clockr,w
 	    movwf 	sspbuf
	    call	wait

 	    call 	read
      	    movf	sspbuf,w
	    movwf	LED2
 	    call 	yes

 	    call 	read
 	    movf	sspbuf,w
	    movwf	LED3
 	    call 	yes

 	    call 	read
 	    movf	sspbuf,w
	    movwf	LED4
 	    bsf 	status,RP0
 	    bsf 	sspcon2,5
 	    bsf 	sspcon2,4
 	    bcf 	status,RP0

	    call 	stop
;===============================================================================================
	    call 	change
	    goto	DINAM

;===============================================================================================
; Запись адреса
;===============================================================================================

writeadd    movf 	clockw,w
 	    movwf 	sspbuf
	    call	wait

	    movf 	pointer,w
 	    movwf 	sspbuf
	    call	wait

 	    return

yes 	    bsf 	status,RP0
 	    bcf 	sspcon2,5
 	    bsf 	sspcon2,4
 	    bcf 	status,RP0
 	    return

;===============================================================================================
; Поразрядное распределение содержимого регистров LED0...3 (обоих
; полубайтов) по младшим полубайтам регистров LED0...7.
;===============================================================================================
change      swapf       LED4,W      ;Запись старшего полубайта LED4 
            andlw       0Fh         ;в младший полубайт LED9.
            movwf       LED9        ;--------------------------------

            movfw       LED4        ;Запись младшего полубайта LED4
            andlw       0Fh         ;в младший полубайт LED8.
            movwf       LED8        ;--------------------------------

            swapf       LED3,W      ;Запись старшего полубайта LED3 
            andlw       0Fh         ;в младший полубайт LED7.
            movwf       LED7        ;--------------------------------

            movfw       LED3        ;Запись младшего полубайта LED3
            andlw       0Fh         ;в младший полубайт LED6.
            movwf       LED6        ;--------------------------------

            swapf       LED2,W      ;Запись старшего полубайта LED2
            andlw       0Fh         ;в младший полубайт LED5.
            movwf       LED5        ;--------------------------------

            movfw       LED2        ;Запись младшего полубайта LED2
            andlw       0Fh         ;в младший полубайт LED4.
            movwf       LED4        ;--------------------------------

            swapf       LED1,W      ;Запись старшего полубайта LED1
            andlw       0Fh         ;в младший полубайт LED3.
            movwf       LED3        ;--------------------------------

            movfw       LED1        ;Запись младшего полубайта LED1
            andlw       0Fh         ;в младший полубайт LED2.
            movwf       LED2        ;--------------------------------

            swapf       LED0,W      ;Запись старшего полубайта LED0
            andlw       0Fh         ;в младший полубайт LED1.
            movwf       LED1        ;--------------------------------

            movfw       LED0        ;Запись младшего полубайта LED0
            andlw       0Fh         ;в младший полубайт LED0.
            movwf       LED0        ;--------------------------------
;--------------------------------------------------------------------
; Конец распределения. В младших полубайтах регистров LED0...7 установлены
; двоично-десятичные числа в порядке возрастания разрядности. Старшие полубайты = 0.
;--------------------------------------------------------------------
            return                  ; Переход по стеку в группу подпрограмм  
                                    ; 8-разрядной динамической индикации. 



;***********************************************************************************************
; Подготовка счетчика количества малых колец индикации Index к началу полного цикла 
; динамической индикации.
;-----------------------------------------------------------------------------------------------
DINAM       clrf        Index       ; Сброс в 0 содержимого счетчика малых колец индикации Index.

;-----------------------------------------------------------------------------------------------
; Предварительная закладка количества больших колец индикации, которое нужно "пройти" за один
; полный цикл динамической индикации в регистр Count.
;-----------------------------------------------------------------------------------------------
            movlw       .10         ; Запись константы X (количество больших колец индикации,
                                    ; задается программистом) в регистр W.
            movwf       Count       ; Копирование содержимого регистра W в регистр счетчика
                                    ; количества больших колец индикации Count.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Использование косвенной адресации при работе с таблицей данных.
;===============================================================================================
; Подготовка к косвенной адресации: запись в регистр W адреса регистра младшего разряда
; линейки 7-сегментных индикаторов ("привязка" к 7-сегментному индикатору, с активации которого 
; начинается полный цикл первого большого кольца индикации).
;-----------------------------------------------------------------------------------------------
CYCLE       movlw       LED0        ; Запись в регистр W адреса регистра LED0.
            addwf       Index,W     ; Увеличение адреса регистра LED0 на величину числа,
                                    ; записанного в регистре счетчика количества малых колец
                                    ; индикации Index, c сохранением результата в регистре W.                                   
;-----------------------------------------------------------------------------------------------
; Косвенная адресация.
;-----------------------------------------------------------------------------------------------
            movwf       FSR         ; Копирование содержимого регистра W в регистр FSR.
            movf        Indf,W      ; Копирование содержимого регистра с адресом, записанным
                                    ; в регистре FSR, в регистр W.
            call        TABLE       ; Условный переход (адрес следующей команды закладывается
                                    ; в стек) в ПП TABLE.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Группа команд установки запятой.
;-----------------------------------------------------------------------------------------------
;---> Возврат по стеку из ПП TABLE

            movwf       portd       ; Копирование содержимого регистра W в 8 защелок порта D.
;-----------------------------------------------------------------------------------------------
; Группа команд формирования адресного кода управления дешифратором.
;-----------------------------------------------------------------------------------------------
     	    movlw       4           ; Запись в регистр W константы .06.
            bsf         status,C    ; Поднятие флага нулевого результата Z.
            subwf       Index,W     ; Вычесть содержимое регистра W (число .06) из содержимого
                                    ; регистра Index (числа от .00 до .09).
            btfss       status,C    ; Проверка состояния флага Z.
            goto        TIME        ; Если флаг Z опущен (результат операции не=0), то переход
                                    ; в ПП Dot2 (запятая не выставляется). 
	    call	TABLE1
            movwf       porta       ; Копирование содержимого регистра W в первые 3 защелки
                                    ; порта А (работа "на выход"), управляющие адресными входами
                                    ; внешнего дешифратора.
	    goto	Zader
TIME	    movf	Index,W     ; Копирование содержимого регистра Index в регистр W.
	    call	TABLE1
            movwf       portb       ; Копирование содержимого регистра W в первые 3 защелки
                                    ; порта А (работа "на выход"), управляющие адресными входами
                                    ; внешнего дешифратора.
;-----------------------------------------------------------------------------------------------
; Группа команд задержки, определяющей время нахождения одного 7-сегментного индикатора
; в активном состоянии (определяющей время прохождения малого кольца индикации).
; "Грубое" формирование времени полного цикла динамической индикации.
;-----------------------------------------------------------------------------------------------
Zader       movlw       Const1      ; Запись в регистр W константы Y1 (см. "шапку").
            movwf       Temp        ; Копирование содержимого регистра W в регистр Temp.
	    clrwdt                 ; Установка начала отсчета сторожевого таймера WDT.
PAUSE       decfsz      Temp,F      ; Декремент содержимого регистра Temp c сохранением 
                                    ; результата в нем же.
            goto        PAUSE       ; Если результат декремента не=0, то переход в ПП PAUSE.
                                    ; Если результат декремента =0, то программа исполняется далее.
;-----------------------------------------------------------------------------------------------
; Увеличение на 1 содержимого счетчика количества малых колец индикации Index с последующей
; проверкой результата инкремента на равенство (или нет) числу .08.
;-----------------------------------------------------------------------------------------------
            incf        Index,F     ; Увеличение на 1 содержимого регистра Index с сохранением
                                    ; результата в нем же.
            movlw       .1          ; Запись в регистр W константы .08.
            bcf         status,Z    ; Сброс флага нулевого результата Z.
            subwf       Index,W     ; Вычесть из содержимого регистра Index содержимое регистра
                                    ; W с сохранением результата в регистре W.
            btfss       status,Z    ; Результат операции вычитания равен или нет нулю? 
            goto        CYCLE       ; Если не =0 (в регистре Index - число не равное 8), то
                                    ; переход к циклу активизации следующего по старшинству
                                    ; 7-сегментного индикатора (переход на новое малое
                                    ; кольцо индикации, то есть, в ПП CYCLE).
                                    ; Если =0 (в регистре Index - число равное 8), то программа
                                    ; исполняется далее.
;-----------------------------------------------------------------------------------------------
; Начало перехода на новое большое кольцо индикации после того, как последовательно активизиру- 
; ются все 8 7-сегментных индикатора линейки (после прохождения 8-ми малых колец индикации).
;-----------------------------------------------------------------------------------------------
            nop                     ; Выравнивающий NOP. 
            clrf        Index       ; Сброс в 0 содержимого регистра Index.
;-----------------------------------------------------------------------------------------------
; Уменьшение на 1 содержимого счетчика количества больших колец индикации Count.
;-----------------------------------------------------------------------------------------------
            decfsz      Count,F     ; Декремент содержимого счетчика количества больших колец
                                    ; индикации Count с сохранением результата в нем же.
            goto        CYCLE       ; Если результат декремента не=0, то переход в ПП CYCLE 
                                    ; (переход на новое большое кольцо индикации).
                                    ; Если результат декремента =0, то программа исполняется далее
                                    ; (переход на новый полный цикл динамической индикации).
            nop                     ; Выравнивающий NOP.
	    goto	readclock

;=============================================================================================== 
; ----------Шина I2C----------
;=============================================================================================== 

;=============================================================================================== 
; START-условие
;=============================================================================================== 

start	    bsf 	status,RP0  ;Выбор 1 банка регистров
	    bsf 	sspcon2,0   ;Инициируем START
	    bcf 	status,RP0  ;Выбор 0 банка регистров
	    call	wait
	    return

;=============================================================================================== 
; Повторный START-условие
;=============================================================================================== 

start2	    bsf 	status,RP0  ;Выбор 1 банка регистров
	    bsf 	sspcon2,1   ;Инициируем повторный START
	    bcf 	status,RP0  ;Выбор 0 банка регистров
	    call	wait
	    return

;=============================================================================================== 
; Ожидание завершения выполнения процедуры
;=============================================================================================== 

wait 	    btfss 	pir1,3
	    goto 	wait       
	    bcf 	pir1,3	     ;Обнуляем флаг прерывания MSSP
 	    return

;=============================================================================================== 
; STOP-условие
;=============================================================================================== 

stop	    bsf 	status,RP0  ;Выбор 1 банка регистров
	    bsf 	sspcon2,2  
	    bcf 	status,RP0  ;Выбор 0 банка регистров
	    call	wait
 	    return

;=============================================================================================== 
; Чтение байта
;=============================================================================================== 

read	    bsf 	status,RP0  ;Выбор 1 банка регистров
	    bsf 	sspcon2,3  
	    bcf 	status,RP0  ;Выбор 0 банка регистров
	    call	wait
	    return

;=============================================================================================== 
; Задержка 6 мкс для шины
;=============================================================================================== 

delay       movlw 	.255
 	    movwf 	del1
  	    movlw 	.255
 	    movwf 	del
loop        decfsz 	del1,f
	    decfsz 	del,f
 	    goto 	loop
 	    return


;-----------------------------------------------------------------------------------------------
;                   Применение вычисляемого перехода.
; (преобразование двоично-десятичного кода в код 7-сегментного индикатора)
;-----------------------------------------------------------------------------------------------                
TABLE       addwf       PC,F        ; Содержимое счетчика команд PC увеличивается
                                    ; на величину содержимого аккумулятора W.
            retlw       b'11000000' ; ..FEDCBA = 0               Происходит скачек по таблице
            retlw       b'11111001' ; .....CB. = 1               на строку со значением, 
            retlw       b'10100100' ; .G.ED.BA = 2               записанным в аккумуляторе,
            retlw       b'10110000' ; .G..DCBA = 3               и далее - возврат по стеку.
            retlw       b'10011001' ; .GF..CB. = 4       
            retlw       b'10010010' ; .GF.DC.A = 5      
            retlw       b'10000010' ; .GFEDC.A = 6        
            retlw       b'11111000' ; .....CBA = 7                                     
            retlw       b'10000000' ; .GFEDCBA = 8                                     
            retlw       b'10010000' ; .GF.DCBA = 9                
;-----------------------------------------------------------------------------------------------
;                   Применение вычисляемого перехода.
; (преобразование двоично-десятичного кода в код 7-сегментного индикатора)
;-----------------------------------------------------------------------------------------------                
TABLE1      addwf       PC,F        ; Содержимое счетчика команд PC увеличивается
                                    ; на величину содержимого аккумулятора W.
            retlw       b'00000001' ; ..FEDCBA = 0               Происходит скачек по таблице
            retlw       b'00000010' ; .....CB. = 1               на строку со значением, 
            retlw       b'00000100' ; .G.ED.BA = 2               записанным в аккумуляторе,
            retlw       b'00001000' ; .G..DCBA = 3               и далее - возврат по стеку.
            retlw       b'00010000' ; .GF..CB. = 4       
            retlw       b'00100000' ; .GF.DC.A = 5      
            retlw       b'01000000' ; .GFEDC.A = 6        
            retlw       b'10000000' ; .....CBA = 7                                     
                                                             
;***********************************************************************************************
;===============================================================================================
            end                    ; Директива конца текста программы.
faramun21 вне форума   Ответить с цитированием
Старый 09.07.2009, 17:33   #4
assaodu
Junior Member
 
Аватар для assaodu
 
Регистрация: 11.11.2007
Сообщений: 24
Вес репутации: 136/47
assaodu will become famous soon enoughassaodu will become famous soon enough
По умолчанию Re: Часы на pic 16f874a и ds1307n работают, но не работают

Надеюсь, Вы подключили вывод MCLR к +Uп через резистор.
assaodu вне форума   Ответить с цитированием
Старый 09.07.2009, 20:47   #5
FiNik
Member
 
Регистрация: 03.08.2007
Сообщений: 69
Вес репутации: 140/48
FiNik will become famous soon enoughFiNik will become famous soon enough
По умолчанию Re: Часы на pic 16f874a и ds1307n работают, но не работают

Цитата:
Сообщение от faramun21 Посмотреть сообщение
... написал программу, собрал схему в протеусе, запустил всё работоает, собрал схему на монтажной плате, ничего не работает. может кто подскажет есть ли ошибки, уже месяц бьюсь..
Что значит "ничего не работает"? Никаких признаков жизни? За месяц можно было немного конкретнее определить...
Проверьте шины sda и scl - они должны быть подтянуты к питанию, иначе программа будет уже в самом начале бесконечно висеть в п/п Wait (ждать окончания формирования Start).

И вообще, как можно ждать установки флага прерывания от модуля I2C, если все прерывания запрещены?

Последний раз редактировалось FiNik; 09.07.2009 в 20:54.
FiNik вне форума   Ответить с цитированием
Старый 09.07.2009, 21:19   #6
HHIMERA
Senior Member
 
Регистрация: 10.06.2008
Возраст: 58
Сообщений: 2,866
Вес репутации: 3992/111
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию Re: Часы на pic 16f874a и ds1307n работают, но не работают

Цитата:
Сообщение от FiNik Посмотреть сообщение
И вообще, как можно ждать установки флага прерывания от модуля I2C, если все прерывания запрещены?
Тихо так, спокойно, сидя на скамеечке...

Нажмите на изображение для увеличения
Название: 4324.png
Просмотров: 18
Размер:	18.0 Кб
ID:	1716
HHIMERA вне форума   Ответить с цитированием
Старый 09.07.2009, 21:55   #7
FiNik
Member
 
Регистрация: 03.08.2007
Сообщений: 69
Вес репутации: 140/48
FiNik will become famous soon enoughFiNik will become famous soon enough
По умолчанию Re: Часы на pic 16f874a и ds1307n работают, но не работают

Да, с флагом я погорячился...
FiNik вне форума   Ответить с цитированием
Старый 10.07.2009, 04:34   #8
faramun21
Junior Member
 
Регистрация: 15.05.2009
Возраст: 36
Сообщений: 8
Вес репутации: 100/0
faramun21 will become famous soon enoughfaramun21 will become famous soon enough
По умолчанию Re: Часы на pic 16f874a и ds1307n работают, но не работают

на счет резистора MCLR, он обязателен? дело в том что на пике 16f84a я ставил его, без него не работал. а на 16f874a толку от него не увидел. сейчас исправил программу. на данный момент в ds1307 записываю 04 - секунды, 06 - минуты, на индикаторах это и отображается. на секунды стоят
Код:
            list 	p=16F874A
	    __config 	3F31H
;	    __config    _cp_off & _debug_off & _wrt_enable_on & _cpd_off & _lvp_off & _boden_off & _pwrte_on & _wdt_off & _xt_osc


;===============================================================================================
; Определение  положения  регистров  специального  назначения.
;===============================================================================================

Indf        equ         00h         ;Регистр Indf.
PC          equ         02h         ;Регистр счетчика команд.
status      equ         03h         ;Регистр Status.
FSR         equ         04h         ;Регистр FSR.

intcon	    equ		0Bh	    ;Регистр прерываний

sspcon	    equ		14h	    ;Управление модулем MSSP
sspcon2	    equ		11h	    ;Управление модулем MSSP
sspstat     equ         14h	    ;Регистра статуса MSSP
sspbuf 	    equ		13h	    ;Регистр-буфер приемника/передатчика
sspadd	    equ		13h	    ;Регистр адреса
pir1	    equ		0Ch	    ;Регистр флагов прерываний

adcon1	    equ		1Fh	    ;Регистр настройки порта A на цифровой выход/вход

trisa       equ         05h         ;Регистр выбора направления работы выводов порта А.
porta       equ         05h         ;Регистр управления защелками порта А.

trisb       equ         06h         ;Регистр выбора направления работы выводов порта В.
portb       equ         06h         ;Регистр управления защелками порта В.

trisc       equ         07h         ;Регистр выбора направления работы выводов порта С.
portc       equ         07h         ;Регистр управления защелками порта С.

trisd       equ         08h         ;Регистр выбора направления работы выводов порта D.
portd       equ         08h         ;Регистр управления защелками порта D.


;===============================================================================================
; Определение  названия  и  положения  регистров  общего  назначения.
;===============================================================================================

LED0        equ         30h         ; Регистр хранения результатов преобразований
                                    ; 1-го двоично-десятичного разряда.
LED1        equ         31h         ; ------- 2-го -------------------------
LED2        equ         32h         ; ------- 3-го -------------------------
LED3        equ         33h         ; ------- 4-го -------------------------
LED4        equ         34h         ; ------- 5-го -------------------------
LED5        equ         35h         ; ------- 6-го -------------------------
LED6        equ         36h         ; ------- 7-го -------------------------
LED7        equ         37h         ; ------- 8-го -------------------------
LED8        equ         38h         ; ------- 9-го -------------------------
LED9        equ         39h         ; ------- 10-го ------------------------

send 	    equ 	022h        ;Регистр-передатчик
clockw 	    equ 	025h  	    ;Регистрдля адреса с битом записи
clockr 	    equ 	026h   	    ;Регистр для адреса с битом чтения
sec 	    equ 	027h  	    ;Регистр установки секунд
pointer     equ 	028h  	    ;Регистр-указатель
Index       equ         021h        ;Регистр счетчика количества малых колец индикации.
Count       equ         023h        ;Регистр счетчика количества больших колец индикации.
Temp        equ         024h        ;Регистр временного хранения данных.
del 	    equ 	028h        ;Счётчик задержки для шины
del1 	    equ 	033h        ;Счётчик задержки для шины
;===============================================================================================
; Определение места размещения результатов операций.
;===============================================================================================
W           equ         0           ;Результат направить в аккумулятор.
F           equ         1           ;Результат направить в регистр.
;===============================================================================================
; Присваивание битам названий.
;===============================================================================================
C           equ         0           ;Флаг переноса-заема.
RP0 	    equ		5	    ;бит 5 регистра status
RP1	    equ		6	    ;бит 6 регистра status
Z           equ         2           ;Флаг нулевого результата.
;===============================================================================================
; Присваивание константам названий.
;===============================================================================================
Const1      equ        .255         ;Y1 - значение времязадающей константы "грубо" (до .255).
                                    ;Задается программистом.
Const2      equ        .255         ;Y2 - значение времязадающей константы "точно" (до .255).
                                    ;Задается программистом.       
;===============================================================================================
; --------Инициализация-------
;=============================================================================================== 

	    org 	0000h  	    ;Вектор сброса (начальный адрес)
	    bcf         status,RP1  ;Выбор 0 банка регистров
	    bcf         status,RP0  ;Выбор 0 банка регистров
	    CLRF	porta
	    clrf 	status      ;Очистить регистр состояния
 	    clrf 	intcon      ;Очистить регистр прерываний
  	    movlw 	b'00101000' ;
 	    movwf 	sspcon      ;Настройка регистра управления модуля MSSP
 	    
 	    bsf 	status,RP0  ;Выбор 1 банка регистров
  	    movlw 	06h         ;Настроить порт A на выход
 	    movwf 	adcon1      ;Каналы порта А - цифровые входы/выходы

  	    movlw 	000h	    ;Настроить порт A на выход
 	    movwf 	trisa       ;Через регистр направления

 	    movlw 	b'00000000' ;Настроить порт D на выход
 	    movwf 	trisd       ;Через регистр направления

  	    movlw 	b'00000000' ;Настроить порт B на выход
 	    movwf 	trisb       ;Через регистр направления

 	    movlw 	b'00011000' ;Настроить бит sda, scl порт C на вход, остальные выход
 	    movwf 	trisc       ;Через регистр направления

  	    movlw 	b'10000000' ;Настроить порт B на выход
 	    movwf 	sspstat     ;Через регистр направления

  	    movlw    	9h         ; Скорость генератора BRG.
            movwf    	sspadd
 
	    bcf         status,RP0  ;Выбор 0 банка регистров

	    clrf        porta
	    clrf        portb
	    clrf        portd
;=============================================================================================== 
; ---------Главный цикл-------
;=============================================================================================== 

main        movlw       0D0h
 	    movwf 	clockw
            movlw 	0D1h
 	    movwf 	clockr
   	    movlw 	000h
 	    movwf 	pointer
   	    movlw 	004h
 	    movwf 	sec

;=============================================================================================== 
; Установка секунд и запуск генератора
;=============================================================================================== 

iclock	    call 	start

 	    movf 	clockw,w
 	    movwf 	sspbuf
	    call 	wait

 	    movf 	pointer,w
 	    movwf 	sspbuf
	    call 	wait

 	    movf 	sec,w
 	    movwf 	sspbuf
	    call 	wait

   	    movlw 	006h
 	    movwf 	sec
 	    movf 	sec,w
 	    movwf 	sspbuf
	    call 	wait



 	    call 	stop
	    
;=============================================================================================== 
; Чтение часов и минут
;=============================================================================================== 
readclock   clrf        porta
	    clrf        portb
	    clrf        portd
            movlw 	000h
 	    movwf 	pointer

            call 	start

            call 	writeadd

 	    call 	start2

 	    movf 	clockr,w
 	    movwf 	sspbuf
	    call	wait

 	    call 	read
      	    movf	sspbuf,w
	    movwf	LED0
 	    call 	yes

  	    call 	read
 	    movf	sspbuf,w
	    movwf	LED1

 	    bsf 	status,RP0
 	    bsf 	sspcon2,5
 	    bsf 	sspcon2,4
 	    bcf 	status,RP0
	    call	wait
	    call 	stop
;=============================================================================================== 
; Чтение даты
;===============================================================================================  	    
	    movlw 	004h
 	    movwf 	pointer

 	    call 	start

 	    call	writeadd

 	    call 	start2

 	    movf 	clockr,w
 	    movwf 	sspbuf
	    call	wait

 	    call 	read
      	    movf	sspbuf,w
	    movwf	LED2
 	    call 	yes

 	    call 	read
 	    movf	sspbuf,w
	    movwf	LED3
 	    call 	yes

 	    call 	read
 	    movf	sspbuf,w
	    movwf	LED4
 	    bsf 	status,RP0
 	    bsf 	sspcon2,5
 	    bsf 	sspcon2,4
 	    bcf 	status,RP0
 	    call	wait
	    call 	stop
;===============================================================================================
	    call 	change
	    goto	DINAM

;===============================================================================================
; Запись адреса
;===============================================================================================

writeadd    movf 	clockw,w
 	    movwf 	sspbuf
	    call	wait

	    movf 	pointer,w
 	    movwf 	sspbuf
	    call	wait

 	    return

yes 	    bsf 	status,RP0

 	    bcf 	sspcon2,5
 	    bsf 	sspcon2,4
 	    bcf 	status,RP0
	    call        wait
 	    return

;===============================================================================================
; Поразрядное распределение содержимого регистров LED0...3 (обоих
; полубайтов) по младшим полубайтам регистров LED0...7.
;===============================================================================================
change      swapf       LED4,W      ;Запись старшего полубайта LED4 
            andlw       0Fh         ;в младший полубайт LED9.
            movwf       LED9        ;--------------------------------

            movfw       LED4        ;Запись младшего полубайта LED4
            andlw       0Fh         ;в младший полубайт LED8.
            movwf       LED8        ;--------------------------------

            swapf       LED3,W      ;Запись старшего полубайта LED3 
            andlw       0Fh         ;в младший полубайт LED7.
            movwf       LED7        ;--------------------------------

            movfw       LED3        ;Запись младшего полубайта LED3
            andlw       0Fh         ;в младший полубайт LED6.
            movwf       LED6        ;--------------------------------

            swapf       LED2,W      ;Запись старшего полубайта LED2
            andlw       0Fh         ;в младший полубайт LED5.
            movwf       LED5        ;--------------------------------

            movfw       LED2        ;Запись младшего полубайта LED2
            andlw       0Fh         ;в младший полубайт LED4.
            movwf       LED4        ;--------------------------------

            swapf       LED1,W      ;Запись старшего полубайта LED1
            andlw       0Fh         ;в младший полубайт LED3.
            movwf       LED3        ;--------------------------------

            movfw       LED1        ;Запись младшего полубайта LED1
            andlw       0Fh         ;в младший полубайт LED2.
            movwf       LED2        ;--------------------------------

            swapf       LED0,W      ;Запись старшего полубайта LED0
            andlw       0Fh         ;в младший полубайт LED1.
            movwf       LED1        ;--------------------------------

            movfw       LED0        ;Запись младшего полубайта LED0
            andlw       0Fh         ;в младший полубайт LED0.
            movwf       LED0        ;--------------------------------
;--------------------------------------------------------------------
; Конец распределения. В младших полубайтах регистров LED0...7 установлены
; двоично-десятичные числа в порядке возрастания разрядности. Старшие полубайты = 0.
;--------------------------------------------------------------------
            return                  ; Переход по стеку в группу подпрограмм  
                                    ; 8-разрядной динамической индикации. 



;***********************************************************************************************
; Подготовка счетчика количества малых колец индикации Index к началу полного цикла 
; динамической индикации.
;-----------------------------------------------------------------------------------------------
DINAM       clrf        Index       ; Сброс в 0 содержимого счетчика малых колец индикации Index.

;-----------------------------------------------------------------------------------------------
; Предварительная закладка количества больших колец индикации, которое нужно "пройти" за один
; полный цикл динамической индикации в регистр Count.
;-----------------------------------------------------------------------------------------------
            movlw       .10         ; Запись константы X (количество больших колец индикации,
                                    ; задается программистом) в регистр W.
            movwf       Count       ; Копирование содержимого регистра W в регистр счетчика
                                    ; количества больших колец индикации Count.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Использование косвенной адресации при работе с таблицей данных.
;===============================================================================================
; Подготовка к косвенной адресации: запись в регистр W адреса регистра младшего разряда
; линейки 7-сегментных индикаторов ("привязка" к 7-сегментному индикатору, с активации которого 
; начинается полный цикл первого большого кольца индикации).
;-----------------------------------------------------------------------------------------------
CYCLE       clrf        porta
	    clrf        portb
	    clrf        portd

            movlw       LED0        ; Запись в регистр W адреса регистра LED0.
            addwf       Index,W     ; Увеличение адреса регистра LED0 на величину числа,
                                    ; записанного в регистре счетчика количества малых колец
                                    ; индикации Index, c сохранением результата в регистре W.                                   
;-----------------------------------------------------------------------------------------------
; Косвенная адресация.
;-----------------------------------------------------------------------------------------------
            movwf       FSR         ; Копирование содержимого регистра W в регистр FSR.
            movf        Indf,W      ; Копирование содержимого регистра с адресом, записанным
                                    ; в регистре FSR, в регистр W.
            call        TABLE       ; Условный переход (адрес следующей команды закладывается
                                    ; в стек) в ПП TABLE.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Группа команд установки запятой.
;-----------------------------------------------------------------------------------------------
;---> Возврат по стеку из ПП TABLE

            movwf       portd       ; Копирование содержимого регистра W в 8 защелок порта D.
;-----------------------------------------------------------------------------------------------
; Группа команд формирования адресного кода управления дешифратором.
;-----------------------------------------------------------------------------------------------
     	    movlw       4           ; Запись в регистр W константы .06.
            bsf         status,C    ; Поднятие флага нулевого результата Z.
            subwf       Index,W     ; Вычесть содержимое регистра W (число .06) из содержимого
                                    ; регистра Index (числа от .00 до .09).
            btfss       status,C    ; Проверка состояния флага Z.
            goto        TIME        ; Если флаг Z опущен (результат операции не=0), то переход
                                    ; в ПП Dot2 (запятая не выставляется). 
	    call	TABLE1
            movwf       porta       ; Копирование содержимого регистра W в первые 3 защелки
                                    ; порта А (работа "на выход"), управляющие адресными входами
                                    ; внешнего дешифратора.
	    goto	Zader
TIME	    movf	Index,W     ; Копирование содержимого регистра Index в регистр W.
	    call	TABLE1
            movwf       portb       ; Копирование содержимого регистра W в первые 3 защелки
                                    ; порта А (работа "на выход"), управляющие адресными входами
                                    ; внешнего дешифратора.
;-----------------------------------------------------------------------------------------------
; Группа команд задержки, определяющей время нахождения одного 7-сегментного индикатора
; в активном состоянии (определяющей время прохождения малого кольца индикации).
; "Грубое" формирование времени полного цикла динамической индикации.
;-----------------------------------------------------------------------------------------------
Zader       movlw       Const1      ; Запись в регистр W константы Y1 (см. "шапку").
            movwf       Temp        ; Копирование содержимого регистра W в регистр Temp.
	    clrwdt                 ; Установка начала отсчета сторожевого таймера WDT.
PAUSE       decfsz      Temp,F      ; Декремент содержимого регистра Temp c сохранением 
                                    ; результата в нем же.
            goto        PAUSE       ; Если результат декремента не=0, то переход в ПП PAUSE.
                                    ; Если результат декремента =0, то программа исполняется далее.
;-----------------------------------------------------------------------------------------------
; Увеличение на 1 содержимого счетчика количества малых колец индикации Index с последующей
; проверкой результата инкремента на равенство (или нет) числу .08.
;-----------------------------------------------------------------------------------------------
            incf        Index,F     ; Увеличение на 1 содержимого регистра Index с сохранением
                                    ; результата в нем же.
            movlw       .4          ; Запись в регистр W константы .08.
            bcf         status,Z    ; Сброс флага нулевого результата Z.
            subwf       Index,W     ; Вычесть из содержимого регистра Index содержимое регистра
                                    ; W с сохранением результата в регистре W.
            btfss       status,Z    ; Результат операции вычитания равен или нет нулю? 
            goto        CYCLE       ; Если не =0 (в регистре Index - число не равное 8), то
                                    ; переход к циклу активизации следующего по старшинству
                                    ; 7-сегментного индикатора (переход на новое малое
                                    ; кольцо индикации, то есть, в ПП CYCLE).
                                    ; Если =0 (в регистре Index - число равное 8), то программа
                                    ; исполняется далее.
;-----------------------------------------------------------------------------------------------
; Начало перехода на новое большое кольцо индикации после того, как последовательно активизиру- 
; ются все 8 7-сегментных индикатора линейки (после прохождения 8-ми малых колец индикации).
;-----------------------------------------------------------------------------------------------
            nop                     ; Выравнивающий NOP. 
            clrf        Index       ; Сброс в 0 содержимого регистра Index.
;-----------------------------------------------------------------------------------------------
; Уменьшение на 1 содержимого счетчика количества больших колец индикации Count.
;-----------------------------------------------------------------------------------------------
            decfsz      Count,F     ; Декремент содержимого счетчика количества больших колец
                                    ; индикации Count с сохранением результата в нем же.
            goto        CYCLE       ; Если результат декремента не=0, то переход в ПП CYCLE 
                                    ; (переход на новое большое кольцо индикации).
                                    ; Если результат декремента =0, то программа исполняется далее
                                    ; (переход на новый полный цикл динамической индикации).
            nop                     ; Выравнивающий NOP.
	    goto	readclock

;=============================================================================================== 
; ----------Шина I2C----------
;=============================================================================================== 

;=============================================================================================== 
; START-условие
;=============================================================================================== 

start	    bsf 	status,RP0  ;Выбор 1 банка регистров
	    bsf 	sspcon2,0   ;Инициируем START
	    bcf 	status,RP0  ;Выбор 0 банка регистров
	    call	wait
	    return

;=============================================================================================== 
; Повторный START-условие
;=============================================================================================== 

start2	    bsf 	status,RP0  ;Выбор 1 банка регистров
	    bsf 	sspcon2,1   ;Инициируем повторный START
	    bcf 	status,RP0  ;Выбор 0 банка регистров
	    call	wait
	    return

;=============================================================================================== 
; Ожидание завершения выполнения процедуры
;=============================================================================================== 

wait 	    btfss 	pir1,3
	    goto 	wait       
	    bcf 	pir1,3	     ;Обнуляем флаг прерывания MSSP
 	    return

;=============================================================================================== 
; STOP-условие
;=============================================================================================== 

stop	    bsf 	status,RP0  ;Выбор 1 банка регистров
	    bsf 	sspcon2,2  
	    bcf 	status,RP0  ;Выбор 0 банка регистров
	    call	wait
 	    return

;=============================================================================================== 
; Чтение байта
;=============================================================================================== 

read	    bsf 	status,RP0  ;Выбор 1 банка регистров
	    bsf 	sspcon2,3  
	    bcf 	status,RP0  ;Выбор 0 банка регистров
	    call	wait
	    return

;=============================================================================================== 
; Задержка 6 мкс для шины
;=============================================================================================== 

delay       movlw 	.255
 	    movwf 	del1
  	    movlw 	.255
 	    movwf 	del
loop        decfsz 	del1,f
	    decfsz 	del,f
 	    goto 	loop
 	    return


;-----------------------------------------------------------------------------------------------
;                   Применение вычисляемого перехода.
; (преобразование двоично-десятичного кода в код 7-сегментного индикатора)
;-----------------------------------------------------------------------------------------------                
TABLE       addwf       PC,F        ; Содержимое счетчика команд PC увеличивается
                                    ; на величину содержимого аккумулятора W.
            retlw       b'01000000' ; ..FEDCBA = 0               Происходит скачек по таблице
            retlw       b'01111001' ; .....CB. = 1               на строку со значением, 
            retlw       b'10100100' ; .G.ED.BA = 2               записанным в аккумуляторе,
            retlw       b'00110000' ; .G..DCBA = 3               и далее - возврат по стеку.
            retlw       b'00011001' ; .GF..CB. = 4       
            retlw       b'00010010' ; .GF.DC.A = 5      
            retlw       b'00000010' ; .GFEDC.A = 6        
            retlw       b'01111000' ; .....CBA = 7                                     
            retlw       b'00000000' ; .GFEDCBA = 8                                     
            retlw       b'00010000' ; .GF.DCBA = 9                
;-----------------------------------------------------------------------------------------------
;                   Применение вычисляемого перехода.
; (преобразование двоично-десятичного кода в код 7-сегментного индикатора)
;-----------------------------------------------------------------------------------------------                
TABLE1      addwf       PC,F        ; Содержимое счетчика команд PC увеличивается
                                    ; на величину содержимого аккумулятора W.
            retlw       b'00000001' ; ..FEDCBA = 0               Происходит скачек по таблице
            retlw       b'00000010' ; .....CB. = 1               на строку со значением, 
            retlw       b'00000100' ; .G.ED.BA = 2               записанным в аккумуляторе,
            retlw       b'00001000' ; .G..DCBA = 3               и далее - возврат по стеку.
            retlw       b'00010000' ; .GF..CB. = 4       
            retlw       b'00100000' ; .GF.DC.A = 5      
            retlw       b'01000000' ; .GFEDC.A = 6        
            retlw       b'10000000' ; .....CBA = 7                                     
                                                             
;***********************************************************************************************
;===============================================================================================
            end                    ; Директива конца текста программы.


получается что все работает, но часы не идут?????????
faramun21 вне форума   Ответить с цитированием
Старый 10.07.2009, 04:40   #9
faramun21
Junior Member
 
Регистрация: 15.05.2009
Возраст: 36
Сообщений: 8
Вес репутации: 100/0
faramun21 will become famous soon enoughfaramun21 will become famous soon enough
Thumbs up Re: Часы на pic 16f874a и ds1307n работают, но не работают

Ребята спасибо большое.......... поставил резистор МСLR всё побежало.................. спасибо еще раз, думал уже бросить всё......
faramun21 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
X-ray zenner Общетехнические вопросы 11 08.12.2007 02:01
Передача даных по радиоканалу ZLOI Общетехнические вопросы 40 23.11.2007 12:29
Это не PIC vs AVR, но... ADL Продукция MICROCHIP 24 13.09.2007 00:15
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00
Организация меню Денис_1_9_8_4 Продукция MICROCHIP 24 26.03.2007 12:36


Часовой пояс GMT +3, время: 13:33.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot