Перейти к содержанию
    

Помогите с ADuC 831

Нужно сделать комуникацию через I2C меж ADuC 831 и RTC ( DS1307 ), но не понимаю как дефинировать порти в асемблерском фаѝле. В даташете контролера указано что пин 26 - SCLOCK и пин 27 - SDATA/MOSI , но когда дефинирую ети пини как порти дает ошибка и не возпринимает SCLOCK и SDATA как порти. Помогите пожалуѝста и скажите где моя ошибка.

п.п. извините за правопис, но на етоѝ кирилицоѝ не имею ни "ериѝ" ни " е оборотное"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так эти выводы подключены к аппаратному I2C напрямую - соответственно непосредственно управлять ими нельзя, только посредствам регистров I2C контроллера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так эти выводы подключены к аппаратному I2C напрямую - соответственно непосредственно управлять ими нельзя, только посредствам регистров I2C контроллера.

 

Спосибо тебе Kolia, твоя помощ неоценимая, вот и моѝ проблем разрешен думаю. Спосибо еще раз!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так эти выводы подключены к аппаратному I2C напрямую - соответственно непосредственно управлять ими нельзя, только посредствам регистров I2C контроллера.

 

Привет знатоки, Привет Коля,

Извините но новие проблеми возникнули. прочитал в даташете но не понял как директно поменят ети регистри.

Попробую склеит здес фотки с даташита.

Моа просьба - помогите с какоѝ-то пример на асемблере как пишется в регистрам.

Спосибо предварительхо за помощ.

post-47203-1239298954_thumb.jpg

post-47203-1239299393_thumb.jpg

Изменено пользователем emo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет знатоки, Привет Коля,

Извините но новие проблеми возникнули. прочитал в даташете но не понял как директно поменят ети регистри.

Попробую склеит здес фотки с даташита.

Моа просьба - помогите с какоѝ-то пример на асемблере как пишется в регистрам.

Спосибо предварительхо за помощ.

А в чём собственно проблема,вот лови на русском языке SPI и I2Chttp://electronix.ru/forum/style_images/1/folder_attach_images/attach_add.png

http://electronix.ru/forum/style_images/1/.../attach_add.png ну и примеры с диска ADUC http://electronix.ru/forum/style_images/1/.../attach_add.png

http://electronix.ru/forum/style_images/1/.../attach_add.png

http://electronix.ru/forum/style_images/1/.../attach_add.png

И что конкретно тебе нужно изменить илли подключить к I2C.

I2C.rar

SPI.rar

122.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в чём собственно проблема,вот лови на русском языке SPI и I2Chttp://electronix.ru/forum/style_images/1/folder_attach_images/attach_add.png

http://electronix.ru/forum/style_images/1/.../attach_add.png ну и примеры с диска ADUC http://electronix.ru/forum/style_images/1/.../attach_add.png

http://electronix.ru/forum/style_images/1/.../attach_add.png

http://electronix.ru/forum/style_images/1/.../attach_add.png

И что конкретно тебе нужно изменить илли подключить к I2C.

 

Спосибо за информацию Verifi,

Вот и моя проблемма - нужно подключить RTC ( DS1307 ) к ADuC831, вводит дату и время и потом читать дату и время.

Проработал прогу, но не хочет записибать в 1307, вот прикреплю и асемблерскии фаѝлчик, посмотрите пожалуѝста и сказите где моя ошибка.

.....................................

; Program DS1307.ASM

;

; This program responds to commands received over the serial

; port to set the date/time as well as RAM data on the DS1307

; using a ADuC831 as a controller

;

$MOD831 ;use ADuC831 predefined symbols

;

; definitions

CR EQU 0DH

LF EQU 0AH

MCON EQU 0C6H

TA EQU 0C7H

SCL BIT P0.4

SDA BIT P0.3

TRIG BIT P0.2

DS1307W EQU 0D0H

DS1307R EQU 0D1H

FLAGS DATA 20H

LASTREAD BIT FLAGS.0

_12_24 BIT FLAGS.1

PM_AM BIT FLAGS.2

OSC BIT FLAGS.3

SQW BIT FLAGS.4

ACK BIT FLAGS.5

BUS_FAULT BIT FLAGS.6

_2W_BUSY BIT FLAGS.7

BITCOUNT DATA 21H

BYTECOUNT DATA 22H

BYTE DATA 23H

;____________________________________________________________________

; DEFINE VARIABLES IN INTERNAL RAM

 

BITCNT DATA 30h ; bit counter for I2C routines

SLAVEADD DATA 31h ; slave address for I2C routines

INPUT DATA 32h ; data recieved from the slave

OUTPUT DATA 33h ; data to be transmitted to slave

 

NOACK BIT 00h ; I2C no acknowledge flag

ERR BIT 00h ; I2C error flag

 

 

;

;____________________________________________________________________

; BEGINNING OF CODE

CSEG

ORG 0000h

AJMP START

;

;____________________________________________________________________

; INT0 ISR

ORG 0003h

INC OUTPUT

RETI

 

;

 

CSEG AT 30H

;*************************************************************

;*** RESET GOES HERE TO START PROGRAM ****

;*************************************************************

ORG 0060h

START:

; configure the UART ADuC831

 

MOV SCON,#52h ; configure UERT for 9600 baud

MOV TMOD,#20h ; assumihg 11.0592 MHz crystal

MOv TH1,#-3

SETB TR1

 

; configure & enable interrupts

SETB EX0 ; enable INT0

SETB IT0 ; INT0 edge triggered

SETB EA ; allow all the interrupts

 

; initialise settings

MOV SLAVEADD,#88H ; clear RW bit

MOV I2CCON,#0A8h ; sets SDATA & SCLOCK, and

; selects master mode

MOV OUTPUT,#0 ; TX 0 as default

CLR NOACK

CLR ERR

 

;-----------------------------------------------------------------------

; THIS IS THE MASTER CONTROLLER LOOP

;-----------------------------------------------------------------------

MASTER_CONTROLLER:

MOV BYTECOUNT,#10H

FORM_FEED: MOV A,#LF ; CLEAR SCREEN FOR MAIN MENU

LCALL WRITE_DATA

DJNZ BYTECOUNT,FORM_FEED

MOV DPTR, #TEXT0 ; PUT MAIN MENU ON SCREEN

LCALL WRITE_TEXT

MOV DPTR, #TEXT3

LCALL WRITE_TEXT

LCALL READ_DATA

CLR ACC.5 ; CONVERT ACC TO UPPER CASE

CJNE A,#'A',NOTA ; CALL SET CLOCK FUNCTION

LCALL SET_CLOCKM

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

NOTA: CJNE A,#'B',NOTB ; CALL SET RAM FUNCTION AND

LCALL SET_RAM ; CALL READ RAM FUNCTION

LCALL READ_RAM

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

NOTB: CJNE A,#'C',NOTC ; CALL READ CLOCK FUNCTION

LCALL READ_CLOCK

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

NOTC: CJNE A,#'D',NOTD ; CALL READ RAM FUNCTION

LCALL READ_RAM

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

NOTD: CJNE A,#'E',NOTE ; CALL OSC CONTROL FUNCTION

CLR OSC ; CLR OSC FLAG - ON

LCALL OSC_CONTROL

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

NOTE: CJNE A,#'F',NOTF ; CALL OSC CONTROL FUNCTION

SETB OSC ; SET OSC FLAG - OFF

LCALL OSC_CONTROL

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

NOTF: CJNE A,#'G',NOTG ; CALL SWQ CONTROL FUNCTION

CLR SQW ; CLR SQW FLAG - ON

LCALL SQW_CONTROL_1HZ

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

NOTG: CJNE A,#'H',NOTH ; CALL SWQ CONTROL FUNCTION

CLR SQW ; CLR SQW FLAG - ON

LCALL SQW_CONTROL_4KHZ

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

NOTH: CJNE A,#'I',NOTI ; CALL SWQ CONTROL FUNCTION

CLR SQW ; CLR SQW FLAG - ON

LCALL SQW_CONTROL_8KHZ

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

NOTI: CJNE A,#'J',NOTJ ; CALL SWQ CONTROL FUNCTION

CLR SQW ; CLR SQW FLAG - ON

LCALL SQW_CONTROL_32KHZ

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

NOTJ: CJNE A,#'K',NOTK ; CALL SWQ CONTROL FUNCTION

SETB SQW ; SET SQW FLAG - OFF

LCALL SQW_CONTROL_1HZ

JMP MASTER_CONTROLLER

NOTK: CJNE A,#'L',NOTL

LCALL SET_RAM_UNQ

LCALL READ_RAM

NOTL: JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

;-----------------------------------------------------------------------

; THIS SUB SENDS THE START CONDITION

;-----------------------------------------------------------------------

SEND_START: ; Sends the start bit to initiate an I2C communication

SETB MDE ; enable SDATA pin as an output

CLR NOACK

CLR MDO ; low O/P on SDATA

CLR MCO ; start bit

RET

;

;-----------------------------------------------------------------------

; THIS SUB SENDS THE STOP CONDITION

;-----------------------------------------------------------------------

SEND_STOP: ; Sends the stop bit to end an I2C transmission

SETB MDE ; to enable SDATA pin as an output

CLR MDO ; get SDATA ready for stop

SETB MCO ; set clock for stop

SETB MDO ; this is the stop bit

RET

;

;-----------------------------------------------------------------------

; THIS SUB SENDS ONE BYTE OF DATA TO THE DS1307

;-----------------------------------------------------------------------

SEND_BYTE: ; Send 8-bits in ACC to the slave

MOV BITCNT,#8 ; 8 bits in a byte

SETB MDE ; to enable SDATA pin as an output

CLR MCO ; make sure that the clock line is low

SENDBIT:

RLC A ; put data bit to be sent into carry

MOV MDO,C ; put data bit on SDATA line

SETB MCO ; clock to send bit

CLR MCO ; clear clock

DJNZ BITCNT,SENDBIT ; jump back and send all eight bits

 

CLR MDE ; release data line for acknowledge

SETB MCO ; send clock for acknowledge

JNB MDI,NEXT ; this is a check for acknowledge

SETB NOACK ; no acknowledge, set flag

NEXT: CLR MCO ; clear clock

RET

;

;-----------------------------------------------------------------------

; THIS SUB READS ONE BYTE OF DATA FROM THE DS1307

;-----------------------------------------------------------------------

READ_BYTE: ; receives one byte of data from an I2C slave device. Returns it in A

MOV BITCNT,#8 ; Set bit count.

CLR MDE ; to enable SDATA pin as an input

CLR MCO ; make sure the clock line is low

RCVBIT:

SETB MCO ; clock to recieve bit

CLR MCO ; clear clock

MOV C,MDI ; read data bit into carry.

RLC A ; Rotate bit into result byte.

 

DJNZ BITCNT,RCVBIT ; Repeat until all bits received.

; recieved byte is in the accumulator

 

SETB MDE ; Data pin =Output for NACK

SETB MDO ; Send NACK (always send NACK for

; last byte in transmission)

SETB MCO ; Send NACK clock.

CLR MCO

RET

;

;----------------------------------------------------------------------- ;

; THIS SUB SETS THE CLOCK LINE HIGH

;-----------------------------------------------------------------------

SCL_HIGH:

SETB SCL ; SET SCL HIGH

JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL

RET

;----------------------------------------------------------------------- ;

; THIS SUB DELAY THE BUS

;-----------------------------------------------------------------------

; DELAY

; DELAY ROUTINE FOR THE ADuC812/ADuC816/ADuC824

DELAY: ; Delays by 100ms * A

 

; ADuC812 100ms based on 11.0592MHz Core Clock

; ADuC824 100ms based on 1.573MHz Core Clock

 

MOV R2,A ; Acc holds delay variable

DLY0: MOV R3,#200 ; Set up delay loop0

DLY1: MOV R4,#229 ; Set up delay loop1

DJNZ R4,$ ; Dec R4 & Jump here until R4 is 0

; wait here for 131*15.3us=2ms

DJNZ R3,DLY1 ; Dec R3 & Jump DLY1 until R3 is 0

; Wait for 50*2ms

DJNZ R2,DLY0 ; Dec R2 & Jump DLY0 until R2 is 0

; wait for ACC*100ms

RET ; Return from subroutine

;

;-----------------------------------------------------------------------

; THIS SUB DELAYS 4 CYCLES

;-----------------------------------------------------------------------

DELAY_4:

NOP ; DELAY FOR BUS TIMING

NOP

NOP

NOP

RET

;-----------------------------------------------------------------------

; THIS SUB SETS THE CLOCK (MANUAL)

;-----------------------------------------------------------------------

SET_CLOCKM:

MOV R1,#2EH ; SET R1 TO SCRATCHPAD MEMORY FOR DATE/TIME

MOV DPTR, #GODINA ; GET THE DATE/TIME INFORMATION FROM THE

LCALL WRITE_TEXT ; USER. WRITE THE DATE/TIME TO SCRATCHPAD

LCALL READ_BCD ; MEMORY

MOV @R1,A

DEC R1

MOV DPTR, #MESEC

LCALL WRITE_TEXT

LCALL READ_BCD

MOV @R1,A

DEC R1

MOV DPTR, #DATATA

LCALL WRITE_TEXT

LCALL READ_BCD

MOV @R1,A

DEC R1

MOV DPTR, #DEN

LCALL WRITE_TEXT

LCALL READ_BCD

ANL A, #7

MOV @R1,A

DEC R1

MOV DPTR, #CHAS

LCALL WRITE_TEXT

LCALL READ_BCD

MOV @R1,A

DEC R1

MOV DPTR, #MINUTI

LCALL WRITE_TEXT

LCALL READ_BCD

MOV @R1,A

DEC R1

MOV DPTR, #SEKUNDI

LCALL WRITE_TEXT

LCALL READ_BCD

MOV @R1,A

MOV R1,#28H ; POINT TO BEGINNING OF CLOCK DATA IN SCRATCHPAD MEMORY

LCALL SEND_START ; SEND 2WIRE START CONDITION

MOV A,#DS1307W ; SEND DS1307 WRITE COMMAND

LCALL SEND_BYTE

MOV A,#00H ; SET DATA POINTER TO REGISTER 00H ON

LCALL SEND_BYTE ; THE DS1307

SEND_LOOP:

MOV A,@R1 ; MOVE THE FIRST BYTE OF DATA TO ACC

LCALL SEND_BYTE ; SEND DATA ON 2WIRE BUT

INC R1

CJNE R1,#2FH,SEND_LOOP ; LOOP UNTIL CLOCK DATA SENT TO DS1307

LCALL SEND_STOP ; SEND 2WIRE STOP CONDITION

RET

;-----------------------------------------------------------------------

; THIS SUB SETS THE DS1307 USER RAM TO THE VALUE IN 'BYTE'

;-----------------------------------------------------------------------

SET_RAM:

MOV R1,#08H ; POINTER TO BEGINNING OF DS1307 USER RAM

MOV DPTR, #TEXT5 ; MESSAGE TO ENTER DATA BYTE

LCALL WRITE_TEXT ;

LCALL READ_BCD ; READ BYTE FROM KEYBOARD

MOV BYTE,A ; AND STORE IN 'BYTE'

LCALL SEND_START ; SEND 2WIRE START CONDITION

MOV A,#DS1307W ; LOAD DS1307 WRITE COMMAND

LCALL SEND_BYTE ; SEND WRITE COMMAND

MOV A,#08H ; SET DS1307 DATA POINTER TO BEGINNING

LCALL SEND_BYTE ; OF USER RAM - 08H

SEND_LOOP2:

MOV A,BYTE ; WRITE BYTE TO ENTIRE RAM SPACE

LCALL SEND_BYTE ; WHICH IS 08H TO 37H

INC R1

CJNE R1,#040H,SEND_LOOP2 ; LOOP UNTIL RAM FILLED

LCALL SEND_STOP ; SEND 2WIRE STOP CONTION

RET

;-----------------------------------------------------------------------

; THIS SUB SETS THE DS1307 USER RAM TO THE UNIQUE PATTERN

;-----------------------------------------------------------------------

SET_RAM_UNQ:

MOV R1,#08H ; POINTER TO BEGINNING OF DS1307 USER RAM

LCALL SEND_START ; SEND 2WIRE START CONDITION

MOV A,#DS1307W ; LOAD DS1307 WRITE COMMAND

LCALL SEND_BYTE ; SEND WRITE COMMAND

MOV A,#08H ; SET DS1307 DATA POINTER TO BEGINNING

LCALL SEND_BYTE ; OF USER RAM - 08H

SEND_LOOP3:

LCALL SEND_BYTE ; WHICH IS 08H TO 37H

INC R1

INC A

CJNE R1,#040H,SEND_LOOP3 ; LOOP UNTIL RAM FILLED

LCALL SEND_STOP ; SEND 2WIRE STOP CONTION

RET

;-----------------------------------------------------------------------

; THIS SUB READS THE DS1307 RAM AND WRITES IT TO THE SCRATCH PAD MEMORY

;-----------------------------------------------------------------------

READ_RAM:

MOV DPTR,#TEXT4 ; SEND KEY PRESS MSG

LCALL WRITE_TEXT

MOV R1,#30H ; START OF RAM REGS IN SCRATCH PAD

MOV BYTECOUNT,#00H ; COUNTER FOR 56 RAM BYTES

CLR LASTREAD ; FLAG TO CHECK FOR LAST READ

LCALL SEND_START ; SEND 2WIRE START CONDITION

MOV A,#DS1307W ; SEND DS1307 WRITE COMMAND

LCALL SEND_BYTE

MOV A,#08H ; SET POINTER TO REG 08H ON

;DS1307

LCALL SEND_BYTE

LCALL SEND_STOP ; SEND STOP CONDITION

LCALL SEND_START ; SEND START CONDITION

MOV A,#DS1307R ; SEND DS1307 READ COMMAND

LCALL SEND_BYTE

READ_LOOP2:

MOV A,BYTECOUNT ; CHECK TO SEE OF DOING LAST READ

CJNE A,#37H,NOT_LAST2

SETB LASTREAD ; IF LAST READ SET LASTREAD FLAG

NOT_LAST2:

LCALL READ_BYTE ; READ A BYTE OF DATA

MOV @R1,A ; MOVE DATA INTO SCRATCHPAD MEMORY

INC R1 ; INC POINTERS

INC BYTECOUNT

MOV A,BYTECOUNT

CJNE A,#38H,READ_LOOP2 ; LOOP FOR ENTIRE DS1307 RAM

LCALL SEND_STOP ; SEND 2WIRE STOP CONDITION

LCALL DISP_RAM ; DISPLAY DATA IN SCRATCHPAD MEMORY

JNB RI,$ ;WAIT UNTIL A KEY IS PRESSED

CLR RI

RET

;-----------------------------------------------------------------------

; THIS SUB DISPLAYS THE RAM DATA SAVED IN SCRATCHPAD MEMORY

;-----------------------------------------------------------------------

DISP_RAM:

MOV R1,#30H ;START OF RAM IN SCRATCHPAD

;MEMORY

MOV BITCOUNT,#00H

MOV DPTR,#TEXT6 ;DISPLAY TABLE HEADING

LCALL WRITE_TEXT

DISP_ADDR:

LCALL DISP_LOC ; DISPLAY VALUE OF CURRENT RAM LOCATION

DIS_LOOP:

MOV A,@R1 ; DISPLAY RAM DATA SAVED IN SCRATCHPAD

LCALL WRITE_BCD ; CONVERT TO BCD FORMAT AND DISPLAY

INC R1

INC BITCOUNT

MOV A,#20H ; SPACE BETWEEN DATA BYTES

LCALL WRITE_DATA

MOV A,BITCOUNT

CJNE A,#08H,DIS_LOOP ; LINE FEED AFTER 8 BYTES OF DATA

MOV BITCOUNT,#00H

MOV DPTR,#TEXT3 ; 'CR,LF'

LCALL WRITE_TEXT

CJNE R1,#68H,DISP_ADDR ; DISPLAY DATA FOR 56 BYTES OF RAM

RET

;----------------------------------------------------------------------- ;

; THIS SUB WRITES THE RAM LOCATION OF THE DATA

;-----------------------------------------------------------------------

DISP_LOC:

MOV A,R1 ; DISPLAY THE HEX VALUE FOR THE DATA

ADD A,#-28H ; IN THE DS1307 RAM SPACE

LCALL WRITE_BCD ; CONVERTS SCRATCHPAD ADDRESS

MOV A,#20H ; INTO DS1307 RAM ADDRESS

LCALL WRITE_DATA

MOV A,#20H

LCALL WRITE_DATA

MOV A,#20H

LCALL WRITE_DATA

RET

;-----------------------------------------------------------------------

; THIS SUB READS THE CLOCK AND WRITES IT TO THE SCRATCH PAD MEMORY ;

;-----------------------------------------------------------------------

READ_CLOCK:

MOV DPTR,#TEXT4 ; KEY PRESS MSG

LCALL WRITE_TEXT

READ_AGAIN:

MOV R1,#28H ; START OF CLOCK REG IN SCRATCHPAD

MOV BYTECOUNT,#00H ; COUNTER UP TO 8 BYTES FOR CLOCK

CLR LASTREAD ; FLAG TO CHECK FOR LAST READ

LCALL SEND_START ; SEND START CONDITION

MOV A,#DS1307W ; SET POINTER TO REG 00H ON DS1307

LCALL SEND_BYTE

MOV A,#00H

LCALL SEND_BYTE

LCALL SEND_STOP ; SEND STOP CONDITION

LCALL SEND_START ; SEND START CONDITION

MOV A,#DS1307R ; SEND READ COMMAND TO DS1307

LCALL SEND_BYTE

READ_LOOP:

MOV A,BYTECOUNT ; CHECK TO SEE OF DOING LAST READ

CJNE A,#07H,NOT_LAST

SETB LASTREAD ; SET LASTREAD FLAG

NOT_LAST:

LCALL READ_BYTE ; READ A BYTE OF DATA

MOV @R1,A ; MOVE DATA IN SCRATCHPAD MEMORY

MOV A,BYTECOUNT ; CHECK TO SEE IF READING SECONDS REG

CJNE A,#00H,NOT_FIRST

CLR OSC ; CLR OSC FLAG

MOV A,@R1 ; MOVE SECONDS REG INTO ACC

JNB ACC.7,NO_OSC ; JUMP IF BIT 7 OF IS A 0

SETB OSC ; SET OSC FLAG, BIT 7 IS A 1

CLR ACC.7 ; CLEAR BIT 7 FOR DISPLAY

; PURPOSES

MOV @R1,A ; MOVE DATA BACK TO SCRATCHPAD

NO_OSC:

NOT_FIRST:

INC R1 ; INC COUNTERS

INC BYTECOUNT

MOV A,BYTECOUNT

CJNE A,#08H,READ_LOOP ; LOOP FOR ENTIRE CLOCK REGISTERS

LCALL SEND_STOP ; SEND 2WIRE STOP CONDITION

LCALL DISP_CLOCK ; DISPLAY DATE/TIME FROM SCRATCHPAD

JNB RI,READ_AGAIN ; READ AND DISPLAY UNTIL A KEY IS PRESSED

CLR RI

RET

;-----------------------------------------------------------------------

; THIS SUB DISPLAYS THE DATE AND TIME SAVED IN SCRATCHPAD MEMORY

;-----------------------------------------------------------------------

DISP_CLOCK:

MOV DPTR,#TEXT1 ; DATE:

LCALL WRITE_TEXT

MOV R1,#2DH ; MONTH

MOV A,@R1

LCALL WRITE_BCD

MOV A,#'/'

LCALL WRITE_DATA

MOV R1,#2CH ; DATE

MOV A,@R1

LCALL WRITE_BCD

MOV A,#'/'

LCALL WRITE_DATA

MOV R1,#2EH ; YEAR

MOV A,@R1

LCALL WRITE_BCD

MOV A,#09H ; TAB

LCALL WRITE_DATA

MOV DPTR,#TEXT2 ; TIME:

LCALL WRITE_TEXT

MOV R1,#2AH ; HOURS

MOV A,@R1

LCALL WRITE_BCD

MOV A,#3AH ; COLON

LCALL WRITE_DATA

MOV R1,#29H ; MINUTES

MOV A,@R1

LCALL WRITE_BCD

MOV A,#3AH ; COLON

LCALL WRITE_DATA

MOV R1,#28H ; SECONDS

MOV A,@R1

LCALL WRITE_BCD

RET

;-----------------------------------------------------------------------

; THIS SUB SETS THE OSCILLATOR ACCORDING TO THE OSC BIT

;-----------------------------------------------------------------------

OSC_CONTROL:

LCALL SEND_START ; SEND START CONDITION

MOV A,#DS1307W ; SET POINTER TO REG 00H ON DS1307

LCALL SEND_BYTE

MOV A,#00H

LCALL SEND_BYTE

SETB LASTREAD ; SET LAST READ FOR SINGLE READ

LCALL SEND_STOP ; SEND STOP CONDITION

LCALL SEND_START ; SEND START CONDITION

MOV A,#DS1307R ; SEND READ COMMAND TO DS1307

LCALL SEND_BYTE

LCALL READ_BYTE ; READ SECONDS REGISTER

CLR ACC.7 ; TURN OSC ON

JNB OSC,OSC_SET

SETB ACC.7 ; TURN OSC OFF IF OSC BIT IS SET IN

OSC_SET: ; SECONDS REGISTER

PUSH ACC ; SAVE SECONDS DATA ON STACK

LCALL SEND_STOP ; SEND STOP CONDITION

LCALL SEND_START ; SEND START CONDITION

MOV A,#DS1307W ; SET POINTER TO REG 00H ON DS1307

LCALL SEND_BYTE

MOV A,#00H

LCALL SEND_BYTE

POP ACC ; SEND SECONDS REGISTER TO CONTROL

LCALL SEND_BYTE ; OSCILLATOR ON DS1307

LCALL SEND_STOP

RET

;-----------------------------------------------------------------------

; THIS SUB CONTROLS THE SQW OUTPUT 1HZ

;-----------------------------------------------------------------------

SQW_CONTROL_1HZ:

LCALL SEND_START ; SEND START CONDITION

MOV A,#DS1307W ; SET POINTER TO REG 07H ON DS1307

LCALL SEND_BYTE

MOV A,#07H

LCALL SEND_BYTE

MOV A,#90H ; SQW/OUT ON AT 1HZ

JNB SQW,SQW_SET ; JUMP IF SQW BIT IS ACTIVE

MOV A,#80H ; TURN SQW/OUT OFF - OFF HIGH

SQW_SET:

LCALL SEND_BYTE

LCALL SEND_STOP

RET

;-----------------------------------------------------------------------

; THIS SUB CONTROLS THE SQW OUTPUT 4KHZ

;-----------------------------------------------------------------------

SQW_CONTROL_4KHZ:

LCALL SEND_START ; SEND START CONDITION

MOV A,#DS1307W ; SET POINTER TO REG 07H ON DS1307

LCALL SEND_BYTE

MOV A,#07H

LCALL SEND_BYTE

MOV A,#91H ; SQW/OUT ON AT 1HZ

JNB SQW,SQW_SET1 ; JUMP IF SQW BIT IS ACTIVE

MOV A,#80H ; TURN SQW/OUT OFF - OFF HIGH

SQW_SET1:

LCALL SEND_BYTE

LCALL SEND_STOP

RET

;-----------------------------------------------------------------------

; THIS SUB CONTROLS THE SQW OUTPUT 8KHZ

;-----------------------------------------------------------------------

SQW_CONTROL_8KHZ:

LCALL SEND_START ; SEND START CONDITION

MOV A,#DS1307W ; SET POINTER TO REG 07H ON DS1307

LCALL SEND_BYTE

MOV A,#07H

LCALL SEND_BYTE

MOV A,#92H ; SQW/OUT ON AT 1HZ

JNB SQW,SQW_SET2 ; JUMP IF SQW BIT IS ACTIVE

MOV A,#80H ; TURN SQW/OUT OFF - OFF HIGH

SQW_SET2:

LCALL SEND_BYTE

LCALL SEND_STOP

RET

;-----------------------------------------------------------------------

; THIS SUB CONTROLS THE SQW OUTPUT 32KHZ

;-----------------------------------------------------------------------

SQW_CONTROL_32KHZ:

LCALL SEND_START ; SEND START CONDITION

MOV A,#DS1307W ; SET POINTER TO REG 07H ON DS1307

LCALL SEND_BYTE

MOV A,#07H

LCALL SEND_BYTE

MOV A,#93H ; SQW/OUT ON AT 1HZ

JNB SQW,SQW_SET3 ; JUMP IF SQW BIT IS ACTIVE

MOV A,#80H ; TURN SQW/OUT OFF - OFF HIGH

SQW_SET3:

LCALL SEND_BYTE

LCALL SEND_STOP

RET

;-----------------------------------------------------------------------

; THIS SUB IS A SCOPE TRIGGER BIT

;-----------------------------------------------------------------------

TRIGGER:

CLR TRIG

SETB TRIG

LCALL DELAY_4

CLR TRIG

RET

;-----------------------------------------------------------------------

; THIS SUB READS DATA FROM THE SCREEN AND CONVERTS IT TO BCD FORM

; DATA SHOULD BE HEX DIGITS: 1,2,3...9,A,B,C,D,E,F

;-----------------------------------------------------------------------

READ_BCD:

MOV R0,#0 ; CLEAR R0

BCD_LOOP:

LCALL READ_DATA ; READ BYTE FROM KEYBOARD

CJNE A, #0DH, BCD ; CHECK FOR CR

MOV A,R0 ; MOVE R0 TO ACC AND RETURN

RET

BCD:

ADD A,#-30H ; BEGIN TO CONVERT TO ACTUAL VALUE

JNB ACC.4,DIGIT ; JUMP IF NOT A-F

ADD A,#-07H ; IF A-F SUBTRACT 7

DIGIT:

ANL A,#0FH ; ENSURE BITS 4-7 ARE CLEARED

ANL 0,#0FH ; ENSURE BITS 4-7 ARE CLEARED

XCH A,R0 ; EXCHANGE R0 AND ACC

SWAP A ; NIBBLE SWAP ACC

ORL A,R0 ; INSERT BITS 0-3 OF R0 INTO ACC

MOV R0,A ; MOVE ACC INTO R0

SJMP BCD_LOOP ; LOOP UNTIL CR ENCOUNTERED

;-----------------------------------------------------------------------

; THIS SUB WRITES THE BYTE TO THE SCREEN

;-----------------------------------------------------------------------

WRITE_BCD:

PUSH ACC ; SAVE ACC ON STACK

SWAP A ; NIBBLE SWAP ACC

ANL A,#0FH ; CLEAR BITS 4-7 OF ACC

ADD A,#07H ; ADD 7 TO ACC TO CONVERT TO ASCII HEX

JNB ACC.4,LESSNINE ; CHECK TO SEE IF LESS THAN NINE 0-8

CJNE A,#10H,NOTNINE ; JUMP IS GREATER THAN NINE A-F

LESSNINE:

ADD A,#-07H ; SUBTRACT 7 FOR 0-9

NOTNINE:

ADD A,#30H ; ADD 30 TO CONVERT TO ASCII EQUIVALENT

LCALL WRITE_DATA ; WRITE BYTE TO SCREEN

POP ACC ; RECALL ACC FROM STACK

ANL A,#0FH ; PERFORM CONVERSION ON OTHER HALF OF BYTE

ADD A,#07H

JNB ACC.4,NINE2

CJNE A,#10H,NOTNINE2

NINE2:

ADD A,#-07H

NOTNINE2:

ADD A,#30H

LCALL WRITE_DATA

RET

;-----------------------------------------------------------------------

READ_DATA:

JNB RI,READ_DATA ; LOOP WHILE RI BIT IS LOW

CLR RI ;

MOV A,SBUF ; GET DATA BYTE FROM SERIAL BUFFER

RET

;-----------------------------------------------------------------------

WRITE_DATA:

JNB TI,WRITE_DATA ; LOOP WHILE TI BIT IS LOW

CLR TI ;

MOV SBUF,A ; SEND DATA BYTE TO SERIAL

; BUFFER

RET

;-----------------------------------------------------------------------

WRITE_TEXT:

PUSH ACC ; SAVE ACC BYTE ON STACK

WT1:

CLR A ; CLEAR ACC

MOVC A,@A+DPTR ; MOVE FIRST BYTE OF STRING

; TO ACC

INC DPTR ; INC DATA POINTER

CJNE A,#0,WT2 ; CHECK FOR STRING

; TERMINATOR - 0

POP ACC ; RESTORE ACC

RET ; RETURN WHEN STRING IS SENT

WT2:

LCALL WRITE_DATA ; SEND BYTE OF STRING OVER SERIAL PORT

SJMP WT1

;-----------------------------------------------------------------------

; TEXT STRINGS USED FOR USER INTERFACE OVER SERIAL PORT

;-----------------------------------------------------------------------

GODINA:

DB CR,LF,'GODINA (0 - 99) : ',0

MESEC:

DB CR,LF,'MESEC (1 - 12) : ',0

DATATA:

DB CR,LF,'DATA OT MESECA : ',0

DEN:

DB CR,LF,'DEN OT SEDMICATA : ',0

CHAS:

DB CR,LF,'CHAS (0 - 24) : ',0

MINUTI:

DB CR,LF,'MINUTI (0 - 59) : ',0

SEKUNDI:

DB CR,LF,'SEKUNDI (0 - 59) : ',0

TRIER:

DB CR,LF,'PRESS ANY KEY TO SET THIS TIME ',CR,LF,0

TEXT0:

DB CR,LF,'******* DALLAS SEMICONDUCTOR ******** '

DB CR,LF,'******* DS1307 TEST PROGRAM ******** ',CR,LF

DB CR,LF,'*PLEASE CHOOSE AN OPTION TO CONTINUE* '

DB CR,LF,'------------------------------------- '

DB CR,LF,'A. SET TIME(MANUAL) B. SET RAM '

DB CR,LF,'C. READ DATE/TIME D. READ RAM '

DB CR,LF,'E. OSC ON F. OSC OFF '

DB CR,LF

DB CR,LF,'G. SQW/OUT ON-1HZ H. SQW/OUT ON-4KHZ'

DB CR,LF,'I. SQW/OUT ON-8KHZ J. SQW/OUT ON-32KHZ'

DB CR,LF

DB CR,LF,'K. SQW/OUT OFF'

DB CR,LF,'L. WRITE RAM UNIQUE PATTERN '

DB CR,LF,'ESC. TO QUIT ',0

TEXT1:

DB CR,'DATE: ',0

TEXT2:

DB 'TIME: ',0

TEXT3:

DB CR,LF,0

TEXT4:

DB CR,LF,'PRESS ANY KEY TO RETURN'

DB CR,LF,0

TEXT5:

DB CR,LF,'ENTER THE BYTE VALUE WHICH WILL FILL THE RAM'

DB CR,LF,0

TEXT6:

DB CR,LF,'RAM RAM'

DB CR,LF,'ADDR DATA'

DB CR,LF,'-----------------------------'

DB CR,LF,0

;******************************************

;**** END OF PROGRAM ************

;******************************************

END

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спосибо за информацию Verifi,

Вот и моя проблемма - нужно подключить RTC ( DS1307 ) к ADuC831, вводит дату и время и потом читать дату и время.

Проработал прогу, но не хочет записибать в 1307, вот прикреплю и асемблерскии фаѝлчик, посмотрите пожалуѝста и сказите где моя ошибка.

.....................................

;

В какой среде пишешь прогу,тут без поллитра не разберёшся ,надо помозговать,надеюсь пишешь не на китайском асцемблере !!!!! :lol: :lol:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В какой среде пишешь прогу,тут без поллитра не разберёшся ,надо помозговать,надеюсь пишешь не на китайском асцемблере !!!!! :lol: :lol:

 

Ползую ASPIRE - Version 1.5 IDE software ( write, edit, debug, compile ) и работаю в среду MetaLink 8051 Cross-Assembler

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ползую ASPIRE - Version 1.5 IDE software ( write, edit, debug, compile ) и работаю в среду MetaLink 8051 Cross-Assembler

К каким ножкам подключаеш I2C,где обработка вектора прерывания отi2c/spi,это что программная реализация?I2C

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К каким ножкам подключаеш I2C,где обработка вектора прерывания отi2c/spi,это что программная реализация?I2C

 

I2C подключаю на pin 26 - SCLOCK и pin 27 - SDATA/MOSI с резисторами по 1к к питанию.

переривание от I2C/SPI делается програмно ( может бит там моя ошибка )

вот и переделал прогу, только запись и чтение, сеѝчас легче будет с неѝ разобратся, но не хочет

записать ничего в RTC, когда читаю дает только 00

вот и прога :

........................................................

; RTC DS1307 MCU ADuC831

; I2C comunications

;

;--------------------------------------------

$MOD831 ;use ADuC831 predefined symbols

;--------------------------------------------

;

; definitions

 

CR EQU 0DH

LF EQU 0AH

DS1307W EQU 0D0H

DS1307R EQU 0D1H

FLAGS DATA 20H

LASTREAD BIT FLAGS.0

_12_24 BIT FLAGS.1

PM_AM BIT FLAGS.2

OSC BIT FLAGS.3

BYTECOUNT DATA 22H

;

;____________________________________________________________________

; DEFINE VARIABLES IN INTERNAL RAM

 

BITCNT DATA 30h ; bit counter for I2C routines / 110000 /

SLAVEADD DATA 31h ; slave address for I2C routines / 110001 /

INPUT DATA 32h ; data recieved from the slave / 110010 /

OUTPUT DATA 33h ; data to be transmitted to slave / 110011 /

 

NOACK BIT 00h ; I2C no acknowledge flag

ERR BIT 00h ; I2C error flag

 

 

;

;____________________________________________________________________

; BEGINNING OF CODE

CSEG

ORG 0000h

AJMP START

;

;____________________________________________________________________

; INT0 ISR

ORG 0003h

INC OUTPUT

RETI

 

;

 

CSEG AT 30H

;*************************************************************

;*** RESET GOES HERE TO START PROGRAM ****

;*************************************************************

ORG 0060h

 

START:

; configure the UART ADuC831

 

MOV SCON,#52h ; configure UERT for 9600 baud

MOV TMOD,#20h ; assumihg 11.0592 MHz crystal

MOV TH1,#-3 ;

SETB TR1

 

; configure & enable interrupts

SETB EX0 ; enable INT0

SETB IT0 ; INT0 edge triggered

SETB EA ; allow all the interrupts

 

; initialise settings

MOV SLAVEADD,#88H ; clear RW bit / 10001000 /

MOV I2CCON,#0A8h ; sets SDATA & SCLOCK, and / 10101000 /

; selects master mode

MOV OUTPUT,#0 ; TX 0 as default

CLR NOACK

CLR ERR

 

;-----------------------------------------------------------------------

; THIS IS THE MASTER CONTROLLER LOOP

;-----------------------------------------------------------------------

MASTER_CONTROLLER:

 

MOV BYTECOUNT,#10H

FORM_FEED: MOV A,#LF ; CLEAR SCREEN FOR MAIN MENU

LCALL WRITE_DATA

DJNZ BYTECOUNT,FORM_FEED

MOV DPTR, #TEXT0 ; PUT MAIN MENU ON SCREEN

LCALL WRITE_TEXT

MOV DPTR,#TEXT3

LCALL WRITE_TEXT

LCALL READ_DATA

CLR ACC.5 ; CONVERT ACC TO UPPER CASE

 

CJNE A,#'A',NOTA

LCALL SET_CLOCKM ; CALL SET CLOCK FUNCTION

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

 

NOTA:

CJNE A,#'B',NOTB

LCALL READ_CLOCK ; CALL READ CLOCK FUNCTION

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

 

NOTB:

JMP MASTER_CONTROLLER ; RETURN TO MAIN MENU

;-----------------------------------------------------------------------

; THIS SUB SENDS THE START CONDITION

;-----------------------------------------------------------------------

SEND_START: ; Sends the start bit to initiate an I2C

; communication

SETB MDE ; enable SDATA pin as an output

CLR NOACK

CLR MDO ; low O/P on SDATA

CLR MCO ; start bit

RET

;

;-----------------------------------------------------------------------

; THIS SUB SENDS THE STOP CONDITION

;-----------------------------------------------------------------------

SEND_STOP: ; Sends the stop bit to end an I2C

; transmission

SETB MDE ; to enable SDATA pin as an output

CLR MDO ; get SDATA ready for stop

SETB MCO ; set clock for stop

SETB MDO ; this is the stop bit

RET

;

;-----------------------------------------------------------------------

; THIS SUB SENDS ONE BYTE OF DATA TO THE DS1307

;-----------------------------------------------------------------------

SEND_BYTE: ; Send 8-bits in ACC to the slave

 

MOV BITCNT,#8 ; 8 bits in a byte

SETB MDE ; to enable SDATA pin as an output

CLR MCO ; make sure that the clock line is low

 

SENDBIT:

RLC A ; put data bit to be sent into carry

MOV MDO,C ; put data bit on SDATA line

SETB MCO ; clock to send bit

CLR MCO ; clear clock

DJNZ BITCNT,SENDBIT ; jump back and send all eight bits

CLR MDE ; release data line for acknowledge

SETB MCO ; send clock for acknowledge

JNB MDI,NEXT ; this is a check for acknowledge

SETB NOACK ; no acknowledge, set flag

 

NEXT: CLR MCO ; clear clock

RET

;

;-----------------------------------------------------------------------

; THIS SUB READS ONE BYTE OF DATA FROM THE DS1307

;-----------------------------------------------------------------------

READ_BYTE: ; receives one byte of data from an I2C

; slave device. Returns it in A

MOV BITCNT,#8 ; Set bit count.

CLR MDE ; to enable SDATA pin as an input

CLR MCO ; make sure the clock line is low

 

RCVBIT:

SETB MCO ; clock to recieve bit

CLR MCO ; clear clock

MOV C,MDI ; read data bit into carry.

RLC A ; Rotate bit into result byte.

 

DJNZ BITCNT,RCVBIT ; Repeat until all bits received.

; recieved byte is in the accumulator

 

SETB MDE ; Data pin =Output for NACK

SETB MDO ; Send NACK (always send NACK for

; last byte in transmission)

SETB MCO ; Send NACK clock.

CLR MCO

RET

;

;----------------------------------------------------------------------- ;

; THIS SUB DELAY THE BUS

;-----------------------------------------------------------------------

; DELAY

; DELAY ROUTINE FOR THE ADuC831

 

DELAY: ; Delays by 100ms * A

 

; ADuC831 100ms based on 11.0592MHz Core Clock

 

MOV R2,A ; Acc holds delay variable

 

DLY0: MOV R3,#200 ; Set up delay loop0

 

DLY1: MOV R4,#229 ; Set up delay loop1

DJNZ R4,$ ; Dec R4 & Jump here until R4 is 0

; wait here for 131*15.3us=2ms

DJNZ R3,DLY1 ; Dec R3 & Jump DLY1 until R3 is 0

; Wait for 50*2ms

DJNZ R2,DLY0 ; Dec R2 & Jump DLY0 until R2 is 0

; wait for ACC*100ms

RET ; Return from subroutine

;

;-----------------------------------------------------------------------

; THIS SUB DELAYS 4 CYCLES

;-----------------------------------------------------------------------

DELAY_4:

NOP ; DELAY FOR BUS TIMING

NOP

NOP

NOP

RET

;-----------------------------------------------------------------------

; THIS SUB SETS THE CLOCK (MANUAL)

;-----------------------------------------------------------------------

SET_CLOCKM:

 

MOV R1,#2EH ; SET R1 TO SCRATCHPAD MEMORY FOR DATE/TIME

MOV DPTR, #GODINA ; GET THE DATE/TIME INFORMATION FROM THE

LCALL WRITE_TEXT ; USER. WRITE THE DATE/TIME TO SCRATCHPAD

LCALL READ_BCD ; MEMORY

 

MOV @R1,A

DEC R1

MOV DPTR, #MESEC

LCALL WRITE_TEXT

LCALL READ_BCD

 

MOV @R1,A

DEC R1

MOV DPTR, #DATATA

LCALL WRITE_TEXT

LCALL READ_BCD

 

MOV @R1,A

DEC R1

MOV DPTR, #DEN

LCALL WRITE_TEXT

LCALL READ_BCD

ANL A, #7

 

MOV @R1,A

DEC R1

MOV DPTR, #CHAS

LCALL WRITE_TEXT

LCALL READ_BCD

 

MOV @R1,A

DEC R1

MOV DPTR, #MINUTI

LCALL WRITE_TEXT

LCALL READ_BCD

 

MOV @R1,A

DEC R1

MOV DPTR, #SEKUNDI

LCALL WRITE_TEXT

LCALL READ_BCD

 

MOV @R1,A

MOV R1,#28H ; POINT TO BEGINNING OF CLOCK DATA IN

; SCRATCHPAD MEMORY

LCALL SEND_START ; SEND 2WIRE START CONDITION

MOV A,#DS1307W ; SEND DS1307 WRITE COMMAND

LCALL SEND_BYTE

MOV A,#00H ; SET DATA POINTER TO REGISTER 00H ON

LCALL SEND_BYTE ; THE DS1307

SEND_LOOP:

MOV A,@R1 ; MOVE THE FIRST BYTE OF DATA TO ACC

LCALL SEND_BYTE ; SEND DATA ON 2WIRE BUT

INC R1

CJNE R1,#2FH,SEND_LOOP ; LOOP UNTIL CLOCK DATA SENT TO DS1307

LCALL SEND_STOP ; SEND 2WIRE STOP CONDITION

RET

;-----------------------------------------------------------------------

; THIS SUB READS THE CLOCK AND WRITES IT TO THE SCRATCH PAD MEMORY

;-----------------------------------------------------------------------

READ_CLOCK:

 

MOV DPTR,#TEXT4 ; KEY PRESS MSG

LCALL WRITE_TEXT

 

READ_AGAIN:

MOV R1,#28H ; START OF CLOCK REG IN SCRATCHPAD

MOV BYTECOUNT,#00H ; COUNTER UP TO 8 BYTES FOR CLOCK

CLR LASTREAD ; FLAG TO CHECK FOR LAST READ

; LCALL SEND_START ; SEND START CONDITION

; MOV A,#DS1307W ; SET POINTER TO REG 00H ON DS1307

; LCALL SEND_BYTE

; MOV A,#00H

; LCALL SEND_BYTE

; LCALL SEND_STOP ; SEND STOP CONDITION

LCALL SEND_START ; SEND START CONDITION

MOV A,#DS1307R ; SEND READ COMMAND TO DS1307

LCALL SEND_BYTE

 

READ_LOOP:

MOV A,BYTECOUNT ; CHECK TO SEE OF DOING LAST READ

CJNE A,#07H,NOT_LAST

SETB LASTREAD ; SET LASTREAD FLAG

 

NOT_LAST:

LCALL READ_BYTE ; READ A BYTE OF DATA

MOV @R1,A ; MOVE DATA IN SCRATCHPAD MEMORY

MOV A,BYTECOUNT ; CHECK TO SEE IF READING SECONDS REG

CJNE A,#00H,NOT_FIRST

CLR OSC ; CLR OSC FLAG

MOV A,@R1 ; MOVE SECONDS REG INTO ACC

JNB ACC.7,NO_OSC ; JUMP IF BIT 7 OF IS A 0

SETB OSC ; SET OSC FLAG, BIT 7 IS A 1

CLR ACC.7 ; CLEAR BIT 7 FOR DISPLAY

; PURPOSES

MOV @R1,A ; MOVE DATA BACK TO SCRATCHPAD

 

NO_OSC:

 

NOT_FIRST:

INC R1 ; INC COUNTERS

INC BYTECOUNT

MOV A,BYTECOUNT

CJNE A,#08H,READ_LOOP ; LOOP FOR ENTIRE CLOCK REGISTERS

LCALL SEND_STOP ; SEND 2WIRE STOP CONDITION

LCALL DISP_CLOCK ; DISPLAY DATE/TIME FROM SCRATCHPAD

JNB RI,READ_AGAIN ; READ AND DISPLAY UNTIL A KEY IS PRESSED

CLR RI

RET

;-----------------------------------------------------------------------

; THIS SUB DISPLAYS THE DATE AND TIME SAVED IN SCRATCHPAD MEMORY

;-----------------------------------------------------------------------

DISP_CLOCK:

 

MOV DPTR,#TEXT1 ; DATE:

LCALL WRITE_TEXT

 

MOV R1,#2DH ; MONTH

MOV A,@R1

LCALL WRITE_BCD

 

MOV A,#'/'

LCALL WRITE_DATA

 

MOV R1,#2CH ; DATE

MOV A,@R1

LCALL WRITE_BCD

 

MOV A,#'/'

LCALL WRITE_DATA

 

MOV R1,#2EH ; YEAR

MOV A,@R1

LCALL WRITE_BCD

 

MOV A,#09H ; TAB

LCALL WRITE_DATA

 

MOV DPTR,#TEXT2 ; TIME:

LCALL WRITE_TEXT

 

MOV R1,#2AH ; HOURS

MOV A,@R1

LCALL WRITE_BCD

 

MOV A,#3AH ; COLON

LCALL WRITE_DATA

 

MOV R1,#29H ; MINUTES

MOV A,@R1

LCALL WRITE_BCD

 

MOV A,#3AH ; COLON

LCALL WRITE_DATA

 

MOV R1,#28H ; SECONDS

MOV A,@R1

 

LCALL WRITE_BCD

RET

;-----------------------------------------------------------------------

; THIS SUB READS DATA FROM THE SCREEN AND CONVERTS IT TO BCD FORM

; DATA SHOULD BE HEX DIGITS: 1,2,3...9,A,B,C,D,E,F

;-----------------------------------------------------------------------

READ_BCD:

 

MOV R0,#0 ; CLEAR R0

BCD_LOOP:

LCALL READ_DATA ; READ BYTE FROM KEYBOARD

CJNE A, #0DH, BCD ; CHECK FOR CR

MOV A,R0 ; MOVE R0 TO ACC AND RETURN

RET

 

BCD:

ADD A,#-30H ; BEGIN TO CONVERT TO ACTUAL VALUE

JNB ACC.4,DIGIT ; JUMP IF NOT A-F

ADD A,#-07H ; IF A-F SUBTRACT 7

 

DIGIT:

ANL A,#0FH ; ENSURE BITS 4-7 ARE CLEARED

ANL 0,#0FH ; ENSURE BITS 4-7 ARE CLEARED

XCH A,R0 ; EXCHANGE R0 AND ACC

SWAP A ; NIBBLE SWAP ACC

ORL A,R0 ; INSERT BITS 0-3 OF R0 INTO ACC

MOV R0,A ; MOVE ACC INTO R0

SJMP BCD_LOOP ; LOOP UNTIL CR ENCOUNTERED

;-----------------------------------------------------------------------

; THIS SUB WRITES THE BYTE TO THE SCREEN

;-----------------------------------------------------------------------

WRITE_BCD:

 

PUSH ACC ; SAVE ACC ON STACK

SWAP A ; NIBBLE SWAP ACC

ANL A,#0FH ; CLEAR BITS 4-7 OF ACC

ADD A,#07H ; ADD 7 TO ACC TO CONVERT TO ASCII HEX

JNB ACC.4,LESSNINE ; CHECK TO SEE IF LESS THAN NINE 0-8

CJNE A,#10H,NOTNINE ; JUMP IS GREATER THAN NINE A-F

 

LESSNINE:

ADD A,#-07H ; SUBTRACT 7 FOR 0-9

 

NOTNINE:

ADD A,#30H ; ADD 30 TO CONVERT TO ASCII EQUIVALENT

LCALL WRITE_DATA ; WRITE BYTE TO SCREEN

POP ACC ; RECALL ACC FROM STACK

ANL A,#0FH ; PERFORM CONVERSION ON OTHER HALF OF BYTE

ADD A,#07H

JNB ACC.4,NINE2

CJNE A,#10H,NOTNINE2

 

NINE2:

ADD A,#-07H

 

NOTNINE2:

ADD A,#30H

LCALL WRITE_DATA

RET

;-----------------------------------------------------------------------

READ_DATA:

 

JNB RI,READ_DATA ; LOOP WHILE RI BIT IS LOW

CLR RI ;

MOV A,SBUF ; GET DATA BYTE FROM SERIAL BUFFER

RET

;-----------------------------------------------------------------------

WRITE_DATA:

 

JNB TI,WRITE_DATA ; LOOP WHILE TI BIT IS LOW

CLR TI ;

MOV SBUF,A ; SEND DATA BYTE TO SERIAL BUFFER

RET

;-----------------------------------------------------------------------

WRITE_TEXT:

 

PUSH ACC ; SAVE ACC BYTE ON STACK

 

WT1:

CLR A ; CLEAR ACC

MOVC A,@A+DPTR ; MOVE FIRST BYTE OF STRING

; TO ACC

INC DPTR ; INC DATA POINTER

CJNE A,#0,WT2 ; CHECK FOR STRING

; TERMINATOR - 0

POP ACC ; RESTORE ACC

RET ; RETURN WHEN STRING IS SENT

 

WT2:

LCALL WRITE_DATA ; SEND BYTE OF STRING OVER SERIAL PORT

SJMP WT1

;-----------------------------------------------------------------------

; TEXT STRINGS USED FOR USER INTERFACE OVER SERIAL PORT

;-----------------------------------------------------------------------

GODINA:

DB CR,LF,'GODINA (0 - 99) : ',0

 

MESEC:

DB CR,LF,'MESEC (1 - 12) : ',0

 

DATATA:

DB CR,LF,'DATA OT MESECA : ',0

 

DEN:

DB CR,LF,'DEN OT SEDMICATA : ',0

 

CHAS:

DB CR,LF,'CHAS (0 - 24) : ',0

 

MINUTI:

DB CR,LF,'MINUTI (0 - 59) : ',0

 

SEKUNDI:

DB CR,LF,'SEKUNDI (0 - 59) : ',0

 

TRIER:

DB CR,LF,'NATISNI NIAKOI BUTON ZA DA ZAPISHESH TEZI DANNI ',CR,LF,0

 

TEXT0:

DB CR,LF,'***************** '

DB CR,LF,'******** DS1307 TEST PROGRAMM ********* ',CR,LF

DB CR,LF,'*MOLIA IZBERETE OPCIA ZA DA PRODALZITE* '

DB CR,LF,'--------------------------------------- '

DB CR,LF,'A. SET TIME(MANUAL) B. READ DATE/TIME '

DB CR,LF,'ESC. TO QUIT ',0

 

TEXT1:

DB CR,'DATE: ',0

 

TEXT2:

DB 'TIME: ',0

 

TEXT3:

DB CR,LF,0

 

TEXT4:

DB CR,LF,'natisni niakoi klavish za vrashtane'

DB CR,LF,0

 

;******************************************

;**** END OF PROGRAM ************

;******************************************

END

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

I2C подключаю на pin 26 - SCLOCK и pin 27 - SDATA/MOSI с резисторами по 1к к питанию.

переривание от I2C/SPI делается програмно ( может бит там моя ошибка )

Это я немного с другим контроллером перепутал у ADUC нет "аппаратного ведущего",выложи даташит на DS1307,вот статья к примерам по I2С у ADUC,покури её пока ,а к концу недели между делом и с твоей бедой разберёмся,а то по работе пока занят!

uC001_rus.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это я немного с другим контроллером перепутал у ADUC нет "аппаратного ведущего",выложи даташит на DS1307,вот статья к примерам по I2С у ADUC,покури её пока ,а к концу недели между делом и с твоей бедой разберёмся,а то по работе пока занят!

 

Спосибо за содеѝствие, посмотрю, покурю, вот и даташит на DS1307, извини что он на англиѝскиѝ, но на русскиѝ не нашел.

DS1307.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот библиотека I2C и пример ее использования.

Из реального, живого проекта. Заточено под Кейл.

 

Тормоза можно выключить, т.е. закомментарить вот такие куски:

PUSH B

MOV B,#80

DJNZ B,$

POP B

Изменено пользователем Intel4004

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...