|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 5:57 pm
|
Страница 1 от 1
|
[ 7 мнения ] |
|
| Автор |
Съобщение |
|
Гост
|
 DS1307
Ìîëÿ, ñïåöèàëèñòèòå àêî èìàò æåëàíèå äà ìè ïîìîãíàò ñ ïðîãðàìêà çà êîìóíèêàöèÿ íà PIC16 è DS1307. Ìîëáàòà ìè å äà å íà àñåìáëåð (ðàçáèðàì, ÷å å òðóäíî çà âàñ, êîèòî ïîëçâàòå Ñ, íî àç ñúì âñå îùå íà àñåìáëåð) è äà íå ñå èçïîëçâà àïàðàòíàòà ÷àñò íà I2C. Áëàãîäàðÿ ïðåäâàðèòåëíî!
|
| Чет Юни 09, 2005 4:04 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Ами писал съм такова....ама иска ми се да знам на кого го давам... 
|
| Чет Юни 09, 2005 10:08 pm |
|
 |
|
Marko
Ранг: Минаващ
Регистриран на: Чет Юни 09, 2005 11:36 pm Мнения: 9
|
Извинявайте не бях се регистрирал!
Въпросът за DS1307 е от мен.
|
| Чет Юни 09, 2005 11:40 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Ами добре  . Ето как става на АСМ, малко е дърто щото отдавна не ползвам 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 код, не е мой (моя не го давам  ). Това цялото е пробвано, работи 100%. Ако имаш други въпроси, питай
PS:
Има няколко функции дето са от конкретното приложение от което ти извадих кода (например leds_delay и пр.), може да си ги махнеш...
|
| Пет Юни 10, 2005 12:20 am |
|
 |
|
Marko
Ранг: Минаващ
Регистриран на: Чет Юни 09, 2005 11:36 pm Мнения: 9
|
Благодаря Predator_MF за бързия и изчерпателен отговор! Ще го пробвам веднага. Хубаво е когато има такава взаимопомощ между колеги! Наистина това е смисъла на форума!!!
|
| Пет Юни 10, 2005 7:52 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Аха, тва е смисъла на форума  Да вмъкна само едно допълнение към сорса - някъде из PDF-а пише че DS1307 работи на 100KHz I2C шина, при мене на повече от 80 не тръгва. Най-долу в iic_delay вкарвам едно число в брояч (26), смятал съм го за 22,118400MHz кварц, ако не запали от раз увеличавай числото 
|
| Пет Юни 10, 2005 10:51 am |
|
 |
|
Marko
Ранг: Минаващ
Регистриран на: Чет Юни 09, 2005 11:36 pm Мнения: 9
|
Благодаря!!!!
Всичко вече е под контрол!!!
Еее страхотно е като има на какво да се базира човек. Щях да се мотам, ако не беше помогнал!!!
|
| Пет Юни 10, 2005 12:29 pm |
|
|
|
Страница 1 от 1
|
[ 7 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|