Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

DS1307
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=755
Страница 1 от 1

Автор:  Гост [ Чет Юни 09, 2005 4:04 pm ]
Заглавие:  DS1307

Ìîëÿ, ñïåöèàëèñòèòå àêî èìàò æåëàíèå äà ìè ïîìîãíàò ñ ïðîãðàìêà çà êîìóíèêàöèÿ íà PIC16 è DS1307. Ìîëáàòà ìè å äà å íà àñåìáëåð (ðàçáèðàì, ÷å å òðóäíî çà âàñ, êîèòî ïîëçâàòå Ñ, íî àç ñúì âñå îùå íà àñåìáëåð) è äà íå ñå èçïîëçâà àïàðàòíàòà ÷àñò íà I2C. Áëàãîäàðÿ ïðåäâàðèòåëíî!

Автор:  Predator_MF [ Чет Юни 09, 2005 10:08 pm ]
Заглавие: 

Ами писал съм такова....ама иска ми се да знам на кого го давам... :wink:

Автор:  Marko [ Чет Юни 09, 2005 11:40 pm ]
Заглавие: 

Извинявайте не бях се регистрирал!
Въпросът за DS1307 е от мен.

Автор:  Predator_MF [ Пет Юни 10, 2005 12:20 am ]
Заглавие: 

Ами добре :D . Ето как става на АСМ, малко е дърто щото отдавна не ползвам MPLAB, но със сигурност работи:
Код:
init_ds1307
   call iicstart
   movlw   0xD0
   call      iicwrite
   call      ack_check
   movlw   0x00
   call      iicwrite
   call      ack_check   
   movlw   0x00
   call      iicwrite
   call      ack_check   
   call      iicstop
   call      leds_delay
   call iicstart
   movlw   0xD0
   call      iicwrite
   call      ack_check
   movlw   0x07
   call      iicwrite
   call      ack_check   
   movlw   b'10010000'
   call      iicwrite
   call      ack_check   
   call      iicstop   
      
return

; ***************************
; ****                   ****
; **** IIC (IІC) Routine ****
; ****                   ****
; ***************************
; Nessaccary Variable:
; --------------------
;
; iicbuffer = 0x27   ; Buffer for IIC
; iicbuffercount = 0x28   ; Counter for IIC rotary
; iicdelaycount = 0x29   ; Counter for IIC delay
iicdelayus = 15   ; How much delay for IIC
; IICPORT = PORTB   ; Port for IIC
; IICTRIS = TRISB   ; Tris for IIC
; scl = 1      ; Interner IIC Bus - Clock
; sda = 0      ; Interner IIC Bus - Data


; **** I_IICRead *********************************************************
;                     Read a Byte from IIC
; Input:  -
; Output: iicbuffer = received Byte
;         w = received Byte

iicread:
   call   iicin
   movlw   0x08            ; 8 Bits
   movwf   iicbuffercount         ; write it to the buffer counter
nextbitin:
   bsf   IICPORT,scl         ; Clock goes HIGH
   
   call   iicdelay
   btfss   IICPORT,sda         ; if SDA is high then skip next cmd
   goto   iicbitin0
iicbitin1:
   bsf   STATUS,C         ; Carry set to 1
   goto   iicbitincnt
iicbitin0:
   bcf   STATUS,C         ; Carry set to 0
iicbitincnt:
   rlf   iicbuffer,f         ; Increase IIC bit count to next bit

   bcf   IICPORT,scl         ; Clock goes LOW
   
;*   call   iicdelay
   
   decfsz   iicbuffercount,f      ; buffer down 1 step
   goto   nextbitin

   movf   iicbuffer,w         ; copy buffer to W
   
   return


; **** IICWrite ********************************************************
;                   Write a Byte to IIC
; Input:  W = Byte to send
; Output: -

iicwrite:
   movwf   iicbuffer            ; copy W to IIC Buffer
   
   call   iicout
   movlw   0x08            ; 8 bit long
   movwf   iicbuffercount         ; copy into BufferCounter
nextbitout:
   rlf   iicbuffer,f         ; roll left; MSB ins  Carry
   btfss   STATUS,C         ; if C is high then skip next cmd
   goto   iicbitout0         ; 0 ausgeben
iicbitout1:
   bsf   IICPORT,sda         ; HIGH to SDA
   goto   iicbitoutcnt
iicbitout0:
   bcf   IICPORT,sda         ; LOW to SDA
iicbitoutcnt:
   bsf   IICPORT,scl         ; Clock HIGH
   
   call   iicdelay      
   bcf   IICPORT,scl         ; Clock LOW
   
;*   call   iicdelay

   decfsz   iicbuffercount,f         ; Buffer counter down 1 step
   goto   nextbitout   

   goto   iicwaitack         ; And wait for ACK


; **** IICwaitAck ******************************************************
;                      wait for ACK
; Input:  -
; Output: C = 1 ACK received
;     C = 0 no ACK reveived

iicwaitack:
   call   iicin
   bsf   IICPORT,scl         ; Clock goes HIGH
   clrf   iicbuffercount         ; Buffer counter = 0
waitack:   
   decfsz   iicbuffercount,f      ; Decrease Buffer counter
   goto   chksda

   bcf   STATUS,C         ; Carry = 0 - No ACK recieved
   bcf   IICPORT,scl         ; Clock auf LOW
   
   return

chksda:
   btfsc   IICPORT,sda         ; Wait till SDA goes LOW
   goto   waitack
   bcf   IICPORT,scl         ; Clock goes LOW
   bsf   STATUS,C
   
   return


; **** IICsendAck ******************************************************
;                        send ACK to IIC
; Input:  -
; Output: -

iicsendack:
   call   iicout
   bcf   IICPORT,sda         ; Data goes LOW   
   bsf   IICPORT,scl         ; Clock goes HIGH
   
   call   iicdelay
   bcf   IICPORT,scl         ; Clock goes LOW
   
   return


; **** IICsendNAck *****************************************************
;                      send NACK to IIC
; Input:  -
; Output: -

iicsendnack:
   call   iicout
   bsf   IICPORT,sda         ; Data goes HIGH
   bsf   IICPORT,scl         ; Clock goes HIGH
   
   call   iicdelay
   bcf   IICPORT,scl         ; Clock goes LOW
   
   return


; **** IICOut **********************************************************
;                  set SDA-Port Pin to Output
; Input:  -
; Output: -

iicout:
   bsf   STATUS,RP0         ; Bank 1
   bcf   IICTRIS & 0x7f,sda      ; Data is now Output
   bcf   STATUS,RP0         
   
   return


; **** IICIn ***********************************************************
;                   set SDA-Port Pin to Input
; Input:  -
; Output: -

iicin:
   bsf   STATUS,RP0         ; Bank 1
   bsf   IICTRIS & 0x7f,sda      ; Data is now Input
   bcf   STATUS,RP0         ; Bank 0      
   
   return


; **** IICStart ********************************************************
;                send a Start-Condition to IIC
; Input:  -
; Output: -

iicstart:
   call   iicout
   bsf   IICPORT,scl         ; Clock goes HIGH
   bsf   IICPORT,sda         ; Data goes HIGH
   
   call   iicdelay
   bcf   IICPORT,sda         ; Data goes LOW
   
   call   iicdelay
   bcf   IICPORT,scl         ; Clock goes LOW
   
   goto   iicdelay
   

; **** IICStop *********************************************************
;                send a Stop-Condition to IIC
; Input:  -
; Output: -


iicstop:
   call   iicout
   bcf   IICPORT,scl         ; Clock goes LOW
   bcf   IICPORT,sda         ; Data goes LOW
   
   call   iicdelay
   bsf   IICPORT,scl         ; Clock goes HIGH
   
   call   iicdelay
   bsf   IICPORT,sda         ; Data goes HIGH
   
   goto   iicdelay


; **** IICReset ********************************************************
;                      Reset IIC Bus
; Input:  -
; Output: -

iicreset:
   call   iicout
   movlw   .18
   movwf   iicbuffercount
inextresetbit:
   bsf   IICPORT,sda         ; Data goes High
   bsf   IICPORT,scl         ; Clock goes High
   
   call   iicdelay
   bcf   IICPORT,scl         ; Clock goes Low
   
   call   iicdelay
   decfsz   iicbuffercount,f      ; Decrease Counter
   goto   inextresetbit
   
   return

   
; **** IICDelay **********************************************************
;                    Delay routine for IIC
; Input:  -
; Output: -

iicdelay:
;   movlw   iicdelayus
;   movwf   iicdelaycount
;iicdelaydown:
;   decfsz   iicdelaycount,f
;   goto   iicdelaydown
movlw   .26
movwf   iicdelaycount
iicdelaydown:
   decfsz   iicdelaycount,f
   goto   iicdelaydown

   return
   ack_check
   btfss   STATUS,C      ; C=1 = ACK received
   goto   write_err      ; There was a problem - display "ERROR"
   return

   write_err
   bsf      L_SERVICE
   goto   INIT
      
   err_read
   bsf      L_DOWNL
   goto   INIT

   ack_read   btfss   STATUS,C
   goto   INIT
   return

Като разгледаш внимателно ще видиш че основното е Init_DS1307 процедурката...останалото е I2C код, не е мой (моя не го давам :D ). Това цялото е пробвано, работи 100%. Ако имаш други въпроси, питай 8)

PS:
Има няколко функции дето са от конкретното приложение от което ти извадих кода (например leds_delay и пр.), може да си ги махнеш...

Автор:  Marko [ Пет Юни 10, 2005 7:52 am ]
Заглавие: 

Благодаря Predator_MF за бързия и изчерпателен отговор! Ще го пробвам веднага. Хубаво е когато има такава взаимопомощ между колеги! Наистина това е смисъла на форума!!!

Автор:  Predator_MF [ Пет Юни 10, 2005 10:51 am ]
Заглавие: 

Аха, тва е смисъла на форума :D Да вмъкна само едно допълнение към сорса - някъде из PDF-а пише че DS1307 работи на 100KHz I2C шина, при мене на повече от 80 не тръгва. Най-долу в iic_delay вкарвам едно число в брояч (26), смятал съм го за 22,118400MHz кварц, ако не запали от раз увеличавай числото 8)

Автор:  Marko [ Пет Юни 10, 2005 12:29 pm ]
Заглавие: 

Благодаря!!!!
Всичко вече е под контрол!!!
Еее страхотно е като има на какво да се базира човек. Щях да се мотам, ако не беше помогнал!!!

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/