Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Ты сам хотел этого :-) Вот мое творчество. Писал, когда учился в 7 классе.

Отправлено VasilyS 08 января 2009 г. 14:45
В ответ на: Шеф дал ТЗ на девайс с RTC (в том числе) и поставил ящик (1000 шт) PCF8583. Надо прикрутить к 51-ому (+). отправлено пользователем Cralex 08 января 2009 г. 13:23


;=============================
; Процедуры доступа к RTC I2C
; по 1 или 2 байта записи
; по 1 или 2 байта чтения
; для RTC при записи нет задержки
;=============================
ASEG
RSEG CODE

RPZU_WR EQU 10100000b
RPZU_RD EQU 10100001b

SDA1 EQU P1.5
SCL1 EQU P1.4
ERR_I2C EQU 20H.0
DUPLEX EQU 20H.1 ; "0" - писать/читать 1 байт данных, "1" -два COPY_DUP EQU 20H.2
Address_H EQU 30H ; cтарший байт адреса
Address_L EQU 31H ; младший
Dannoe_H EQU 32H ; cтарший байт данных
Dannoe_L EQU 33H ; младший
;-------
;--- Вызываются процедуры: INIT_I2C1, Read2, Write2
;=== Тестовая вызывная программа: пишет, читает и проверяет
START: MOV PSW,#0
MOV SP,#5FH
CALL INIT_I2C1
;--- запись
MOV Address_H,#00H ; high
mov Address_L,#40H ; low
clr DUPLEX ; писать 1 байт(мл.)
mov Dannoe_L,#0AAH ; мл. байт
CALL write2
JB ERR_I2C,ERO
MOV Dannoe_L,#0 ; порча байта для проверки
;--- проверочное чтЕниЕ
MOV Address_H,#00H
mov Address_L,#40H
CLR DUPLEX ; возврат 1 байт
CALL Read2
JB ERR_I2C,ERO
MOV P1,Dannoe_L
SJMP $
;--- ошибка!
ERO: MOV P1,#00001111b
SJMP $
;==========================================
;-- запись в заданныЕ адрЕса -------------
Write2: PUSH PSW
PUSH ACC
MOV PSW,#00001000b ;bank1
MOV C,DUPLEX ; сохранить сколько байт надо писать
MOV COPY_DUP,C
CALL STOP_I2C1
CALL DD_ELAY
CALL START_I2C1
MOV A,Address_H
ANL A,#00000111B
RL A
ORL A,#RPZU_WR ; обращЕниЕ на запись...
MOV R6,A
MOV R5,Address_L ; ...в заданный адрЕс
SETB DUPLEX ; здЕсь обязятЕльно 2 байта
CALL DR_WR2 ; запись R6
JNB ERR_I2C,WII2 ; провЕрка ошибок
WIWI22: CALL STOP_I2C1 ; выход
CLR DUPLEX
POP ACC
POP PSW
RET
WII2: MOV C,COPY_DUP
MOV DUPLEX,C
JNC WIST_0
MOV R6,Dannoe_H ; запись данных в ячЕйку
MOV R5,Dannoe_L
SJMP WRI_O2
WIST_0: MOV R6,Dannoe_L
WRI_O2: CALL DR_WR2 ; запись данных
SJMP WIWI22
;==================================================
;*-- чтЕниЕ из заданных адрЕсов ADDRESS в DANNOE -------
Read2: PUSH PSW
PUSH ACC
MOV PSW,#00001000b
MOV C,DUPLEX
MOV COPY_DUP,C
CALL STOP_I2C1
CALL DD_ELAY
CALL START_I2C1
MOV A,Address_H
ANL A,#00000111b
RL A
PUSH ACC
ORL A,#RPZU_WR ; обращЕниЕ к рпзу на запись...
MOV R6,A
MOV R5,Address_L
SETB DUPLEX ; здЕсь обязятЕльно 2 байта
CALL DR_WR2 ; запись R6
JB ERR_I2C,EXIT_READ_ERR2
CALL STOP_I2C1
CALL START_I2C1
POP ACC
ORL A,#RPZU_RD ; чтЕниЕ с заданного адрЕса
MOV R6,A
CALL DR_RD2
JNB COPY_DUP,WIST_01
MOV Dannoe_H,R6
MOV Dannoe_L,R5
SJMP EXIT_READ2
WIST_01: MOV Dannoe_H,#0
MOV Dannoe_L,R6
EXIT_READ2: CALL STOP_I2C1
CLR DUPLEX
POP ACC
POP PSW
RET
EXIT_READ_ERR2: POP ACC
SJMP EXIT_READ2
;******************************************************
; выдача в I2C байтов R6 и R5
;******************************************************
DR_WR2: CLR ERR_I2C ; бит ошибки связи
MOV A,R6 ; взяли пЕрвый байт
CALL DD_ELAY
LOOP12: MOV R2,#8 ; 8-битноЕ слово
CLR SCL1 ; SCL1\ синхро (могу измЕнять данныЕ)
LOOP2: CALL DD_ELAY
RLC A ; очЕрЕдной бит...
MOV SDA1,C ; ...выдаЕтся в порт
CALL DD_ELAY
SETB SCL1 ; SCL1/ конЕц синхробита
CALL DD_ELAY
CLR SCL1
DJNZ R2,LOOP2 ; эту процЕдуру повторять 8 раз
SETB SDA1
CALL DD_ELAY
SETB SCL1
;--- ожиданиЕ 0 на SDA1, означающЕЕ квитанцию
MOV R2,#1 ; константы ожидания
LO12: MOV R0,#0FH
LO02: MOV R1,#0FFH
QQQ2: SETB SDA1
JNB SDA1,DONE2 ; провЕрка на 0 в SDA1
DJNZ R1,QQQ2
DJNZ R0,LO02
DJNZ R2,LO12
EXIT_I2C_ERR2: SETB ERR_I2C ; нЕ пришла квитанция.....
SJMP EXIT_I2C2 ; выход по ошибкЕ
DONE2: CLR SCL1 ; импульс на синхролинии
CALL DD_ELAY ; .
MOV A,R5 ; бЕру второй байт...
JBC DUPLEX,LOOP12
EXIT_I2C2: RET ; выход
;********************************************************
;; выдача в I2C байта из R6 и приЕм из I2C в R6 и R5
;********************************************************
DR_RD2: CLR ERR_I2C ; сброс бита ошибки I2C
MOV A,R6
CALL DD_ELAY
LOP12: MOV R2,#8
CLR SCL1 ; SCL1\ синхробит (могу измЕнять данныЕ)
LOP2: CALL DD_ELAY
RLC A
MOV SDA1,C ; выдаю данныЕ из R6
CALL DD_ELAY
SETB SCL1 ; SCL1/ синхробит
CALL DD_ELAY
CLR SCL1
DJNZ R2,LOP2 ; послЕдоватЕльно 8 бит
SETB SDA1
CALL DD_ELAY
SETB SCL1
; провЕрка 0 ACKNOLEDGE
MOV R2,#1 ; константы ожидания
L2O12: MOV R0,#0FH
L2O02: MOV R1,#0FFH
Q2QQ2: SETB SDA1
JNB SDA1,D2ONE2 ; ожиданиЕ 0
DJNZ R1,Q2QQ2
DJNZ R0,L2O02
DJNZ R2,L2O12
;--- ошибка приЕма
SJMP EXIT_I2C_ERR2
D2ONE2: CLR SCL1 ; импульс по синхролинии
CALL DD_ELAY
;--- тЕпЕрь стробированноЕ чтЕниЕ из I2C в R6 и R5
MOV R2,#8
LOP22: SETB SDA1
CALL DD_ELAY
SETB SCL1
MOV C,SDA1
RLC A ; вдвиганиЕ в аккумулятор
CALL DD_ELAY
CLR SCL1
DJNZ R2,LOP22 ; 8 бит
;--- выдача квит-ции
CLR SDA1
CALL DD_ELAY
SETB SCL1
CALL DD_ELAY
CLR SCL1
SETB SDA1 ; сброс квит-ции
CALL DD_ELAY
MOV R6,A ; в R6
MOV R2,#8 ; тЕпЕрь то жЕ самоЕ чтЕниЕ из I2C в R5
LOP32: SETB SDA1
CALL DD_ELAY
SETB SCL1
MOV C,SDA1
RLC A
CALL DD_ELAY
CLR SCL1
DJNZ R2,LOP32 ; 8 бит
CALL DD_ELAY
SETB SCL1
CALL DD_ELAY
MOV R5,A
EXI_OUT2: RET ; выход
;---
START_I2C1:
SETB SDA1
SETB SCL1 ; START пЕрЕд циклом
CALL DD_ELAY
CLR SDA1
CALL DD_ELAY
CLR SCL1
CALL DD_ELAY
RET
;------------------
STOP_I2C1: CALL DD_ELAY
CLR SDA1
CALL DD_ELAY
SETB SCL1 ; STOP
CALL DD_ELAY
SETB SDA1
CALL DD_ELAY
RET
;============================================
INIT_I2C1: SETB SDA1
SETB SCL1
CALL STOP_I2C1
;------
DD_ELAY: RET
;------
END


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 76:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru