Отговори на тема  [ 7 мнения ] 
DS1307 
Автор Съобщение
Мнение DS1307
Ìîëÿ, ñïåöèàëèñòèòå àêî èìàò æåëàíèå äà ìè ïîìîãíàò ñ ïðîãðàìêà çà êîìóíèêàöèÿ íà PIC16 è DS1307. Ìîëáàòà ìè å äà å íà àñåìáëåð (ðàçáèðàì, ÷å å òðóäíî çà âàñ, êîèòî ïîëçâàòå Ñ, íî àç ñúì âñå îùå íà àñåìáëåð) è äà íå ñå èçïîëçâà àïàðàòíàòà ÷àñò íà I2C. Áëàãîäàðÿ ïðåäâàðèòåëíî!


Чет Юни 09, 2005 4:04 pm
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Ами писал съм такова....ама иска ми се да знам на кого го давам... :wink:


Чет Юни 09, 2005 10:08 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 09, 2005 11:36 pm
Мнения: 9
Мнение 
Извинявайте не бях се регистрирал!
Въпросът за DS1307 е от мен.


Чет Юни 09, 2005 11:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Ами добре :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 и пр.), може да си ги махнеш...


Пет Юни 10, 2005 12:20 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 09, 2005 11:36 pm
Мнения: 9
Мнение 
Благодаря Predator_MF за бързия и изчерпателен отговор! Ще го пробвам веднага. Хубаво е когато има такава взаимопомощ между колеги! Наистина това е смисъла на форума!!!


Пет Юни 10, 2005 7:52 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


Пет Юни 10, 2005 10:51 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Юни 09, 2005 11:36 pm
Мнения: 9
Мнение 
Благодаря!!!!
Всичко вече е под контрол!!!
Еее страхотно е като има на какво да се базира човек. Щях да се мотам, ако не беше помогнал!!!


Пет Юни 10, 2005 12:29 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 7 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: Google [Bot] и 9 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни