PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Cùng khai hoang con 16F88 (http://www.picvietnam.com/forum/showthread.php?t=152)

noisePIC 29-09-2005 06:25 PM

Cùng khai hoang con 16F88
 
2 Attachment(s)
Sau một thời gian làm quen với PIC noisepic thấy học 16F84 là dễ nhất, và thấy 16F88 nhiều chức năng hơn như:
- ADC
- PWM
- Comparator (bộ so sánh)
.. Nói chung hơn hẳn 16F84. Hiện nay phong trào học PIC đang diễn ra sôi nổi, noisepic biết bên BKHN có hẳn một nhóm học PIC. Hi vọng chúng ta cùng học và khám phá nó. Bắt đầu nhé!
http://i11.photobucket.com/albums/a1...pic/PORTA1.jpg
//************************************************** ****
PORTA
Các chức năng có thể làm:
- Biến đổi AD
- Bộ so sánh
- I/O
Các thanh ghi liên qua đến PORTA, các bạn có thể xem thêm trong datasheet.
- Thanh ghi PORTA (RA7:RA0)
- Thanh ghi TRISA(TRISA7:TRISA0)--> I/O?
- Thanh ghi ADCON1(ADFM,ADCS2,VCFG1,VCFG0)
- Thanh ghi ANSEL (Bit ANS4:ANS0)--> cấu hình cho 1 chân là Analog/digital

Nếu dùng chức năng A/D, comparator thì dùng thanh ghi ADCON1.

//************************************************** ****
http://i11.photobucket.com/albums/a1.../thanhghi1.jpg
Chương trình sau viết bằng CCS_ làm cho 1 LED nháy tại chân RA0 với khoảng thời gian là 1s
Code:

#include<16F88.h>
#include<def_16F88.h>
#use delay(clock=4000000)
#fuses NOWDT,MCLR,HS
main()
{
TRISA=0;// Chân RA0 là Output
ANS0 =0;// Chân RA là Digital
RA0  =1;// RA0~5V
while(1)
  {
  RA0=!RA0;
  delay_ms(1000);
  }

}

Nếu 10 người cùng học thì tốc độ học sẽ nhanh gấp 10 lần!!..rất mong các bạn hưởng ứng!

mafd_47a 30-09-2005 12:37 AM

Chào Noisepic:

Tớ là thành viên của nhóm BK ấy đây, Hôm nay vừa mới nhận được Pic+Mach Nạp từ anh BinhAnh , cho nên bây giờ mới đủ diều kiện thực hành về Pic.( mấy hôm trước chỉ viết chay)

Cậu dung CCS còn tớ dung Mpasm như thế sẽ có sự tương đương . Chúng ta sẽ làm từng phần một, khi làm đến phần nào cậu viết lý thuyết ( bao gồm các thanh ghi, các chức năng ) . Coi như cậu là người cầm trịch của box này, đẫn dắt anh em

Anh em sẽ theo sau để hỗ trợ và bổ sung nếu cần thiết

Tài liệu chính của chúng ta sẽ là cuốn datasheet 16f88

Có lẽ nhưng người tham gia box này đều là những người mới học Pic( như tui) hoặc mới bẳt đầu làm trên 16f88 ( như bác NoisePic) , do đó kinh nghiệm ko nhiều Và chắc chắn ko tránh khỏi sai sót , rất mong sự giúp đỡ của các bậc tiền bối đi trước

Working together to improve ourselves

Bắt đầu thôi ……………….

noisePIC 30-09-2005 03:00 PM

Bộ dao động dùng cho 16F88
 
Có nhiều nguồn cấp xung nhịp cho 16F88
http://i11.photobucket.com/albums/a1...sepic/OSC1.jpg
Có 3 nguồn tạo dao động chính:
- Bộ dao động sơ cấp (Primary Oscillator)
- Bộ dao động thứ cấp (Secondary Oscillator)
- Bộ dao động bên trong (Internal Oscillator)
Việc cấu hình các bit trong thanh ghi CONFIG1, OSCCON sẽ để PIC làm việc với bộ dao động nào! tần số bao nhiêu?
//*********************************************
thanh ghi CONFIG1
FOSC2:FOSC0
= 010 // Làm việc với bộ dao động thạch anh, tần số >= 4MHz, cách này thường sử dụng
= 101 // Làm việc với bộ dao động bên trong (INTRC), RA7: I/O
= 100 // INTRC, RA6,RA7: I/O
Thanh ghi OSCCON (0x8F)
SCS<1:0>
= 00 // Chế độ dao động chọn bởi FOSC2:FOSC0
= 01 // xung nhịp hệ thống lấy từ Timer1
= 10 // xung nhịp hệ thống lấy từ bộ dao động RC bên trong.

OSCCON<6:4> 3 bit này sẽ quyết định xung nhịp của bộ dao động bên trong.

//**********************************************
Có 8 chế độ dao động:

LP Lowpower Crystal
XT Crystal/ Resonator
HS High Speed Crystal/Resonator
RC External Resitor/ Capacitor với Fosc/4 tại lối ra RA6
RCIO External Resitor/ Capacitor với I/O trên RA6
INTIO1 Bộ dao động bên trong với Fosc/4 lối ra trên RA6 và I/O trên RA7
INTIO2 Bộ dao động bên trong với I/O trên RA6, và RA7
ECIO Xung nhịp bên ngoài với I/O trên RA6

Do vậy khi lắp bộ dao động thế nào, bạn phải cấu hình bit cho phù hợp!

vietsonxp 01-10-2005 09:34 PM

NoiPIC viết rất hay. cảm ơn em nhiều.

hamchoi 03-10-2005 06:09 PM

Khoan đã nào, chương trình thì hay thiệt nhưng sau mình thử chạy chương trình của bạn noisePIC thi máy lại báo lỗi ở phần def_16F88.h nhỉ? Bạn hãy giải thích giùm mình đi.

noisePIC 03-10-2005 08:47 PM

Bạn hamchoi chắc chưa đọc những bài viết cũ của noisepic, vì file def_16f88.h chứa định nghĩa các thanh ghi và các bit của 16F88. Cách lập trình này giúp bạn hiểu rõ hơn về phần cứng. Trong các bài viết của noisepic, dùng đến thanh ghi nào noisepic sẽ bổ sung vào file def_16F88.h--> khi làm xong hết chắc là đủ số thanh ghi và các bit.

Ví dụ file def_16F88.h dủng trong chương trình trên
Code:

// dinh nghia cac thanh ghi
#byte    TMR0=0x01    // Dia chi thanh ghi TRM0
#byte    PORTA=0x05  // Dia chi thanh ghi PORTA
#byte    PORTB=0x06  // Dia chi thanh ghi PORTB
#byte    TRISA=0x85
...................................................................
#byte  ADCON=0x1F
// dinh nghia cac bit
#bit      TRISA0 =  0x85.0
#bit      TRISA1 =  0x85.1
.....

Khi các bạn tự tay viết địa chỉ, các bit trong thanh ghi thì sẽ ngấm hơn bạn sẽ biết chương trình tác động vào thanh ghi nào? bit nào?... dần dần bạn sẽ làm chủ được các chương trình của mình.
Chúc bạn vui vẻ!

falleaf 03-10-2005 11:05 PM

Em có thể lấy các file .h này trong MPASM, nó đã định nghĩa sẵn rồi, và nó định nghĩa tất cả các thanh ghi có trong danh sách của nó. Nó có rất đầy đủ, em không cần phải viết lại như thế này.

Với CCS C, nó cũng có đầy đủ rồi, không cần viết lại.

Ngoại trừ một số thanh ghi mà em muốn tạo thêm, tuy nhiên, nói chung không nên đặt thêm nhiều ngoài các thanh ghi có trong map registers của nó. Bởi vì mỗi chương trình có một đặc thù riêng, dùng của nó là đủ rồi.

hamchoi 04-10-2005 09:43 AM

Chào falleaf và noisePIC, sao mình tìm hoài trong MPASM mà không thấy có files có đuôi (.h) nhỉ? Các bác có thể post nó lên để mình download nó về dùng được không?
Cảm ơn trước nhé!

mafd_47a 07-10-2005 02:42 PM

Moi nguoi khi hoc F88 hay ho 16x noi chung , chu y doc qua ca quan " PICmicro™Mid-Range MCU family Reference Manual" Quan nay viet rat chi tiet va co code mau bang MPASM.

Co the down tai ( 2.7MB):
http://www.microchip.com/stellent/id...elect=&x=5&y=4

mafd_47a 07-10-2005 04:25 PM

Khi moi lap trinh cho F88 chac co nhieu ban bo ngo ve phan "Configuration Bits", va toi cung vay. Sau day la mot so diem khac biet so voi F84

+ Cac bit Configuration duoc luu o hai dia chi bo nho 2007h( gom 14 bit) va 2008h (2 bit) va cac bit nay duoc dinh nghia trong MPASM do la
PHP Code:

_CONFIG1                    EQU     H'2007'
_CONFIG2                     EQU     H'2008'

;Configuration Byte 1 Options
_CP_ALL                      EQU     H
'1FFF'
_CP_OFF                      EQU     H'3FFF'
_CCP1_RB0                    EQU     H'3FFF'
_CCP1_RB3                    EQU     H'2FFF'
_DEBUG_OFF                   EQU     H'3FFF'
_DEBUG_ON                    EQU     H'37FF'
_WRT_PROTECT_OFF             EQU     H'3FFF'    ;No program memory write protection
_WRT_PROTECT_256             EQU     H
'3DFF'    ;First 256 program memory protected
_WRT_PROTECT_2048            EQU     H'3BFF'    ;First 2048 program memory protected
_WRT_PROTECT_ALL             EQU     H'39FF'    ;All of program memory protected
_CPD_ON                      EQU     H'3EFF'
_CPD_OFF                     EQU     H'3FFF'
_LVP_ON                      EQU     H'3FFF'
_LVP_OFF                     EQU     H'3F7F'
_BODEN_ON                    EQU     H'3FFF'
_BODEN_OFF                   EQU     H'3FBF'
_MCLR_ON                            EQU     H'3FFF'
_MCLR_OFF                    EQU     H'3FDF'
_PWRTE_OFF                   EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_EXTRC_CLKOUT                EQU     H'3FFF'
_EXTRC_IO                    EQU     H'3FFE'
_INTRC_CLKOUT                EQU     H'3FFD'
_INTRC_IO                    EQU     H'3FFC'
_EXTCLK                      EQU     H'3FEF'
_HS_OSC                      EQU     H'3FEE'
_XT_OSC                      EQU     H'3FED'
_LP_OSC                      EQU     H'3FEC'

;Configuration Byte 2 Options
_IESO_ON                     EQU     H
'3FFF'
_IESO_OFF                    EQU     H'3FFD'
_FCMEN_ON                    EQU     H'3FFF'
_FCMEN_OFF                   EQU     H'3FFE' 

Chac co mot so ban ko hieu duoc y nghia tung Bit phai ko , cac ban co the tham khao trang 129,130,131 cua Datasheet 16f88, viet rat chi tiet

Nhu vay khac voi F84 , F88 co lenh thong thuong de dua ra _config_ trong MPASM do la

PHP Code:

    __CONFIG    _CONFIG1_CP_OFF _CCP1_RB0 _DEBUG_OFF _CPD_OFF _LVP_OFF _BODEN_OFF _MCLR_OFF _PWRTE_ON _WDT_OFF _HS_OSC   
__CONFIG    _CONFIG2
_IESO_OFF _FCMEN_OFF 

Chia se mot chut voi anh em

mafd_47a 08-10-2005 01:49 AM

Mot dieu dac biet o PortA ma moi nguoi can phai chu y: sau khi Reset hoac bat dau mot chuong trinh thi PortA( 5 pin RA4,RA3,RA2,RA1,RA0), va hai pin RB7,RB6 ko phai la dang I/O nua ma la analog input
va trang thai nay duoc quy dinh boi thanh ghi ANSEL (9bh) ( cac ban tham khao them o trang 51 datasheet)

Do do de ban dau thiet lap trang thai cua cac chan nay la dang I/O thi ta phai
CLRF ANSEL

Den day moi thiet lap trang thai I/O:

Do la nhung loi tuong nhu nho nhat, nhung rat de mac phai doi voi nhung newbie, Rat mong duoc su hop tac cua moi nguoi

mafd_47a 09-10-2005 04:51 PM

Hi everybody, sau một thời gian vật lộn với con 16f88 cuối cùng mình cũng thành công với bản đầu tay, nay muốn chia sẻ cho tất cả mọi người

Đây là chương trình hiển thị LCD dung 16f88, trong chương trình có sử dụng kỹ thuật bảng , dung thạch anh 4M , dung 4 chân data ( trong đó D7=>D4 của LCD nối với Port7=>Port4 của F88) và các chân EN, RS, RW của LCD được nối với port2,1,0 của F88). Các bạn có thể tham khảo kiến thức cơ bản của LCD ở

http://www.dientuvietnam.net/board/s...1&page=1&pp=10


PHP Code:

;**********************************************************************
;                                                                     *
;    
Filename:        LCD.asm                                           *
;    
Date:          25-9-2005                                         *
;    
File Version:  V1_1                                              *
;                                                                     *
;    
Author:        MAFD_47A                                          *
;    
Company:       BACHKHOA                                          *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Files requiredConvert 8051 Assembler to PIC                    *
;                    
Chi dung Rom de hien thi ra ngoai                *
;                    
Ky thuat bang                                    *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Notes:    EN noi voi chan 2 PORTA                                     *
;              
RS noi voi chan 1 PORTA                                     *
;              
RW noi voi chan 0 PORTA                                      *
;              
Data noi tu 7,6,5,4 voi D7,D6,D5,D4 cua LCD            *
;                                                                     *
;**********************************************************************

    list      
p=16f88           ; list directive to define processor
    
#include <p16F88.inc>        ; processor specific variable definitions

    
errorlevel  -302              suppress message 302 from list file  _WRT_ENABLE_OFF

    __CONFIG    _CONFIG1
_CP_OFF _CCP1_RB0 _DEBUG_OFF _CPD_OFF _LVP_OFF _BODEN_OFF _MCLR_OFF _PWRTE_ON _WDT_OFF _HS_OSC   
    __CONFIG    _CONFIG2
_IESO_OFF _FCMEN_OFF




;***** VARIABLE DEFINITIONS
w_temp        EQU     0x71        
variable used for context saving 
status_temp   EQU     0x72        
variable used for context saving
pclath_temp   EQU     0x73          
variable used for context saving
ACC           EQU     0x74
RO            EQU     0x78
R1            EQU     0x79
R2            EQU     0x7A
R3            EQU     0x7B
R4            EQU     0x7C
R5            EQU     0x7D
R6            EQU     0x7E
R7            EQU     0x7F
EN            EQU     H
'0002'
RS            EQU     H'0001'
RW            EQU     H'0000'
P7            EQU     H'0007'



;**********************************************************************
        
ORG     0x000             processor reset vector
        
goto    main              go to beginning of program
    

        ORG     0x004             
interrupt vector location
        movwf   w_temp            
save off current W register contents
        movf    STATUS
,w          move STATUS register into W register
        movwf    status_temp       
save off contents of STATUS register
        movf    PCLATH
,W          move PCLATH register into W register
        movwf    pclath_temp       
save off contents of PCLATH register

isr code can go here or be located as a call subroutine elsewhere


        movf    pclath_temp
,w     retrieve copy of PCLATH register
        movwf    PCLATH            
restore pre-isr PCLATH register contents
        movf    status_temp
,w     retrieve copy of STATUS register
        movwf    STATUS            
restore pre-isr STATUS register contents
        swapf   w_temp
,f
        swapf   w_temp
,w          restore pre-isr W register contents
        retfie                    
; return from interrupt

main        
        BANKSEL ANSEL
        MOVLW   0x00
        MOVWF   ANSEL
        CALL    INIT_LCD
        CALL    CLEAR_LCD
        MOVLW   0x00
        MOVWF   R1
AGAIN1   MOVF    R1
,W
        CALL    TABLE
        ADDLW   0x00
        BTFSC   STATUS
,Z
        
GOTO    NEXT
        CALL    WRITE_TEXT
        INCF    R1
,F
        
GOTO    AGAIN1
NEXT    
        MOVLW   0x02
        CALL    GOTOLINE2
        MOVLW   0x00
        MOVWF   R1
AGAIN2   MOVF    R1
,W
        CALL    THUY
        ADDLW   0x00
        BTFSC   STATUS
,Z
        
GOTO    NEXT1
        CALL    WRITE_TEXT
        INCF    R1
,F
        
GOTO    AGAIN2

NEXT1        
        
GOTO    $


TABLE   ADDWF   PCL,F
        RETLW   
'H'
        
RETLW   'E'
        
RETLW   'L'
        
RETLW   'L'
        
RETLW   '0'
        
RETLW   ' '
        
RETLW   'W'
        
RETLW   'O'
        
RETLW   'R'
        
RETLW   'L'
        
RETLW   'D'
        
RETLW   0x00

THUY    ADDWF   PCL
,F
        RETLW   
'T'
        
RETLW   'H'
        
RETLW   'U'
        
RETLW   'Y'
        
RETLW   0x00
        
WRITE_2_NIBBLES
        MOVWF   ACC
        BANKSEL TRISB
        MOVLW   
B'00001111'       Chon data lam dau ra
        ANDWF   TRISB
,F
        BANKSEL PORTB
        MOVLW   0xF0
        IORWF   PORTB
,F
        MOVF    ACC
,W
        IORLW   0x0F
        ANDWF   PORTB
,F           Dua 4 bit cao ra PortB
        BSF     PORTA
,EN
        NOP
        BCF     PORTA
,EN
        MOVLW   0xF0
        IORWF   PORTB
,F
        SWAPF   ACC
,W
        IORLW   0x0F
        ANDWF   PORTB
,F           Dua 4 bit cao ra PortB
        BSF     PORTA
,EN
        NOP
        BCF     PORTA
,EN
        
RETURN


        
INIT_LCD
        CALL    DELAY100
        BANKSEL TRISA
        MOVLW   
B'00000'
        
MOVWF   TRISB
        MOVWF   TRISA
        BANKSEL PORTA    
        BCF     PORTA
,RS
        BCF     PORTA
,RW
        BCF     PORTA
,EN
        BSF     PORTA
,EN
        MOVLW   0x28
        MOVWF   PORTB
        BCF     PORTA
,EN
        CALL    DELAY5
        MOVLW   0x28
        CALL    WRITE_2_NIBBLES   
Write A as two separate nibbles to LCD
        CALL    DELAY5
        MOVLW   0x0E
        CALL    WRITE_2_NIBBLES
        CALL    DELAY5
        MOVLW   0x06
        CALL    WRITE_2_NIBBLES
        CALL    DELAY5
        
RETURN

CLEAR_LCD
        BCF     PORTA
,RS
        MOVLW   0x01
        CALL    WRITE_2_NIBBLES
        CALL    DELAY5
        
RETURN

WRITE_TEXT
        BSF    PORTA
,RS
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN  

GOTOLINE1
        BCF    PORTA
,RS
        ADDLW  0x80
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN 

GOTOLINE2
        BCF    PORTA
,RS
        ADDLW  0xC0
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN 




DELAY255    movlw    0xff        ;delay 255 mS
        
goto    D0
DELAY100    movlw    d
'100'        ;delay 100mS
        
goto    D0
DELAY50        movlw    d
'50'        ;delay 50mS
        
goto    D0
DELAY20        movlw    d
'20'        ;delay 20mS
        
goto    D0
DELAY5        movlw    0x05        
;delay 5.000 ms (4 MHz clock)
D0        movwf    R2
D1        movlw    0xC7            
;delay 1mS
        movwf    R3
        movlw    0x01
        movwf    R4
Delay_0
        decfsz    R3
f
        
goto    $+2
        decfsz    R4
f
        
goto    Delay_0

        decfsz    R2    
,f
        
goto    D1
        retlw    0x00
            
remaining code goes here



initialize eeprom locations

        ORG    0x2100
        DE    0x00
0x010x020x03


        END                       
directive 'end of program'



( em ko the nao dinh kem duoc file ?????? )
Rất mong chương trình này giúp đỡ được một phần nào cho các bạn

Nếu bạn nào thác mắc vấn đề về chương trình này thì hãy mở một luông mới để thảo luận về vấn đề này nhé

:)

mafd_47a 24-10-2005 02:05 AM

Chào các bạn ở bài viết này mình muốn đề cập đến sử dụng I2C trong F88

+ I2C là chuẩn giao tiếp của hang Philp và hiện đang đựoc sử dụng rất rộng rãi, ưu điểm tốc độ truyền nhanh, chỉ cần 2 dây SDA, SCL nhưng chỉ truyền trong phạm vi ngắn , Tốc độ đường truyền vào khoảng 100Kb => 400Kb ……
Các bạn có thể tham khảo tại :
http://users.pandora.be/educypedia/electronics/I2C.htm
http://www.semiconductors.philips.co...protocols/i2c/

+ Trong 16F88 có hỗ trợ I2C nhưng chỉ hỗ trợ các chế độ Slave Mode, do đó để có thể giao tiếp với các IC như DS1307 ( hoạt động ở chế dộ Slave mode ) ta phải tự xây dựng các giao tiếp chế độ Master Mode

+ Về tài liệu giao tiếp I2C trong PIC các bạn có thể tham khảo vidu của Ngài Nigel ( VD6 ) Project dưới đây tôi cũng dựa theo VD đó

+ Để các bạn hình dung được hơn về I2C mình Up lên cho các bạn Project mình vừa mới hoàn thành xong. Giao tiếp DS1307 với 16F88..
Các đặc điểm của chương trình:
Dây nối SDA, SCL được nối với RB1,RB4 của RTC, SQW/OUT của RTC được nối với RB0 ( chân này được sử dụng để tạo ngắt.ngoài )
Cơ chế hoạt động: cho RTC hoạt động với mức tạo xung ra ở chân SQW 1Hz, xung tín hiêu được đưa vào RB0 tạo ngăt, cứ mỗi khi có ngắt xảy ra thì Pic sẽ đọc dữ liệu từ RTC đưa ra màn hình LCD.

Trong chương trình ko sử dụng nut bắm để điều chinh thời gian , ko hiển thị ngày tháng năm, các bạn hoàn toàn có thể đưa vào để nâng cấp chương trình. Rât mong được nhận các chương trình từ các bạn

Phan 1
PHP Code:

;**********************************************************************
;                                                                     *
;    
Filename:        DS1307.asm                                        *
;    
Date:          20-10-2005                                        *
;    
File Version:  V1.0                                              *
;                                                                     *
;    
Author:        MAFD_47A                                            *
;    
Company:       BACHKHOA                                          *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Files requiredHien thi thoi gian dung DS1307                   *
;                    
Ket noi va hien thi dung LCD                     *
;                    
Su dung ngat ngoai de thuc hien bao thoi diem    *
;                    
Nhap du lieu                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Notes:    EN noi voi chan 7                                      *
;              
RS noi voi chan 6                                      *
;              
RW noi voi chan 3                                      *
;              
Data noi tu 3,2,1,(portAvoi D7,D6,D5,D4 cua LCD    *
;              
Su dung thach anh 4MH                                  *
;              
Chan SDASCL cua DS1307 ket noi voi SDASCL cua VDK  *
;              
Chan PTout duoc noi voi chan RB0 tao ngat)           *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Upgrade:  HIEN THI GIOPHUTGIAY LEN MAN HINH LCD              *
;              
SU DUNG NGAT DE NHAN BIET THOI GIAN (dung ngat RB0)    *
;                                                                     *
;                                                                     *
;**********************************************************************

    list      
p=16f88             ; list directive to define processor
    
#include <p16F88.inc>         ; processor specific variable definitions

    
errorlevel  -302              suppress message 302 from list file  _WRT_ENABLE_OFF

    __CONFIG    _CONFIG1
_CP_OFF _CCP1_RB0 _DEBUG_OFF _CPD_OFF _LVP_OFF _BODEN_OFF _MCLR_OFF _PWRTE_ON _WDT_OFF _HS_OSC   
    __CONFIG    _CONFIG2
_IESO_OFF _FCMEN_OFF


;***** VARIABLE DEFINITIONS
w_temp        EQU     0x71        
variable used for context saving 
status_temp   EQU     0x72        
variable used for context saving
pclath_temp   EQU     0x73          
variable used for context saving
ACC           EQU     0x74
MODE          EQU     0x75
RO            EQU     0x78
R1            EQU     0x79
R2            EQU     0x7A
R3            EQU     0x7B
R4            EQU     0x7C
R5            EQU     0x7D
R6            EQU     0x7E
R7            EQU     0x7F
EN            EQU     H
'0007'
RS            EQU     H'0006'
RW            EQU     H'0003'
P7            EQU     H'0007'
START_RAM     EQU     0x60


PORT_DAT      EQU     PORTA
TRIS_DAT      EQU     TRISA
PORT_CON      EQU     PORTB
TRIS_CON      EQU     TRISB
SCL           EQU     0x04
SDA           EQU     0x01
I2C_PORT      Equ        PORTB
I2C_TRIS      Equ      TRISB


        CBLOCK     0x20            
;start of general purpose registers
            count
            Flags
            Flags2
            Adr_Lo            
RTC memory address to be accessed
            Adr_Hi
            DAT_VAL
            _N
            InputByte        
byte read from RTC is stored in this register
            OutputByte        
used for holding byte to be output to RTC
            I2Cflags        
flag bit register
            RAM_SEC      
            RAM_MIN       
            RAM_HOU       
            RAM_DAY       
            RAM_DAT       
            RAM_MON       
            RAM_YEA       
         endc

ErrFlag        Equ    0x00
StartFlag    Equ    0x01            
;flags used for received bit
One            Equ    0x02
Zero        Equ    0x03

Chip_Read     Equ    0xD1            
;RTC address values
Chip_Write    Equ    0xD0

      ORG 0x0000
        
goto MAIN
      ORG 0x0004

        movwf   w_temp            
save off current W register contents
        movf    STATUS
,w          move STATUS register into W register
        movwf    status_temp       
save off contents of STATUS register
        movf    PCLATH
,W          move PCLATH register into W register
        movwf    pclath_temp       
save off contents of PCLATH register
;==============================================================================
        
CLRF    Adr_Lo
        CALL    Read_RTC
        MOVWF   RAM_SEC
        INCF    Adr_Lo
        CALL    Read_RTC
        MOVWF   RAM_MIN
        INCF    Adr_Lo
        CALL    Read_RTC
        MOVWF   RAM_HOU
        CALL    CONVERT
        CALL    WRITE_TIMER_LCD
        BCF     INTCON
,1
;==============================================================================
          
movf    pclath_temp,w     retrieve copy of PCLATH register
        movwf    PCLATH            
restore pre-isr PCLATH register contents
        movf    status_temp
,w     retrieve copy of STATUS register
        movwf    STATUS            
restore pre-isr STATUS register contents
        swapf   w_temp
,f
        swapf   w_temp
,w          restore pre-isr W register contents
        retfie                    
; return from interrupt


MAIN
        BANKSEL ANSEL
        CLRF    ANSEL
        BANKSEL PORTA
        CALL    INIT_LCD
Kiem tra trang thai ban dau co nen nhap so lieu hay ko
        MOVLW   0x07
        MOVWF   Adr_Lo
        CALL    Read_RTC
        SUBLW   0x10
        BTFSC   STATUS
,Z
        
GOTO    NEXT_MAIN
Ham INIT Timer 
        MOVLW   0x00
        MOVWF   Adr_Lo
        CALL    Write_RTC
        MOVLW   0x07
        MOVWF   Adr_Lo
        MOVLW   0x10
        CALL    Write_RTC
        MOVLW   0x01
        MOVWF   Adr_Lo
        MOVLW   0x25
        CALL    Write_RTC
        MOVLW   0x02
        MOVWF   Adr_Lo
        MOVLW   0x00
        CALL    Write_RTC
NEXT_MAIN
        BANKSEL TRISB
        BSF     TRISB
,0
        BANKSEL PORTB
        MOVLW   
B'11010000'
        
MOVWF   INTCON

        
goto    $ 


mafd_47a 24-10-2005 02:08 AM

Phan 2( cac module ve I2C va LCD )
 
1 Attachment(s)
PHP Code:

;================================== Cac chuong trinh con ======================
CONVERT
        MOVLW   START_RAM
        MOVWF   FSR
        MOVF    RAM_HOU
,W         Xu ly du lieu gio
        ANDLW   
B'00010000'
        
MOVWF   INDF
        SWAPF   INDF
,F            Luu vao trong Ram
        INCF    FSR
,F
        MOVF    RAM_HOU
,W    
        ANDLW   
B'00001111'
        
MOVWF   INDF              Ket thuc qua trinh xu ly hour
       
        INCF    FSR
,F             Bat dau xu ly minute
        MOVF    RAM_MIN
,W         Xy ly bien High truoc
        ANDLW   
B'01110000'
        
MOVWF   INDF
        SWAPF   INDF
,F
        INCF    FSR
,F
        MOVF    RAM_MIN
,W
        ANDLW   
B'00001111'
        
MOVWF   INDF
    
        INCF    FSR
,F             Bat dau xu ly SECOND
        MOVF    RAM_SEC
,W         Xy ly bien High truoc
        ANDLW   
B'01110000'
        
MOVWF   INDF
        SWAPF   INDF
,F
        INCF    FSR
,F
        MOVF    RAM_SEC
,W
        ANDLW   
B'00001111'
        
MOVWF   INDF
       
RETURN
WRITE_TIMER_LCD
        MOVLW   START_RAM
        MOVWF   FSR
        MOVLW   0x02
        MOVWF   R7
        MOVLW   0x05
        CALL    GOTOLINE1
LOOP_WTL1
        MOVF    INDF
,W            Qua trinh hien thi giophutgiay len dong 1 cua LCD
        ADDLW   0x30
        CALL    WRITE_TEXT
        INCF    FSR
,F
        MOVF    INDF
,W
        ADDLW   0x30
        CALL    WRITE_TEXT
        MOVLW   
':'
        
CALL    WRITE_TEXT
        INCF    FSR
,F
        DECFSZ  R7
,F
        
GOTO    LOOP_WTL1        Ket thuc qua trinh hien thi timer
        MOVF    INDF
,W            Qua trinh hien thi giophutgiay len dong 1 cua LCD
        ADDLW   0x30
        CALL    WRITE_TEXT
        INCF    FSR
,F
        MOVF    INDF
,W
        ADDLW   0x30
        CALL    WRITE_TEXT
        
RETURN

Write_RTC                    write W register to address Adr_Lo
        movwf    DAT_VAL            
save W
        call    I2C_Start
        call    I2C_Set_Write

; If ACK error display 'e'

        
btfsc    I2Cflags0
        call    Error_Routine

;            call    I2C_Hi_Adr        used for extendd addressing (24L64/5)

        
call    I2C_Lo_Adr

; If ACK error display 'f'

        
btfsc    I2Cflags0
        call    Error_Routine1

           movf    DAT_VAL
,     W    send the actual data
           movwf    OutputByte
           call    I2C_Out
           call    I2C_NAK

; If ACK error display 'g'

        
btfsc    I2Cflags0
        call    Error_Routine2

           call    I2C_Stop 
        call    WaitForWrite
           
return

Read_RTC                    reads data at location specified in Adr_Lo (& Adr_Hi for 24LC64)                    
        
call     I2C_Start         ; and page specified in Data_Page
        call    I2C_Set_Write     
returns result in W

; If ACK error display 'e'

        
btfsc    I2Cflags0
        call    Error_Routine
        call    I2C_Lo_Adr

; If ACK error display 'f'

        
btfsc    I2Cflags0
        call    Error_Routine1

           call     I2C_Start        
note there is no STOP
        call    I2C_Set_Read

; If ACK error display 'g'

        
btfsc    I2Cflags0
        call    Error_Routine2

           call     I2C_Read        
fetch the byte
           call     I2C_Send_NAK        
send no acknowledgement

           call     I2C_Stop
        movf     InputByte
,     W    ; return the byte in W
           
return


The following routines are low level I2C routines applicable to most
interfaces with I2C devices.

I2C_Read                    read byte on i2c bus
        clrf     InputByte
        movlw     0x08
        movwf     _N            
set index to 8    
        call    HIGH_SDA        
be sure SDA is configured as input
In_Bit
        call     HIGH_SCL        
clock high
        btfss     I2C_PORT
,    SDA    test SDA bit
        
goto    In_Zero
        
goto    In_One

In_Zero
        bcf     STATUS
,     C    clear carry
        rlf     InputByte
,     f    i_byte i_byte << 0
        
goto     Cont_In

In_One
        bsf    STATUS
,     C    set carry
        rlf     InputByte
,     f

Cont_In
        call    LOW_SCL            
bring clock low
        decfsz     _N
,     F        decrement index
        
goto     In_Bit
        
return

I2C_Out:                    ; send w register on I2C bus
           movwf     OutputByte
        movlw     0x08
        movwf     _N
Out_Bit
:
        
bcf     STATUS,        C    clear carry
        rlf     OutputByte
,     f    left shiftmost sig bit is now in carry
        btfss     STATUS
,     C    ; if onesend a one
        
goto     Out_Zero
        
goto     Out_One

Out_Zero
:
        
call     LOW_SDA            SDA at zero
        call     Clock_Pulse    
        call     HIGH_SDA
        
goto     Out_Cont

Out_One
:
        
call     HIGH_SDA        SDA at logic one
        call     Clock_Pulse
Out_Cont
:
        
decfsz     _N,        F    decrement index
        
goto     Out_Bit
        
return    

;;;;;;
        
I2C_NAK:                    ; bring SDA high and clock
        call     HIGH_SDA
        call     HIGH_SCL

        clrf    count            
wait for ACK
WaitForACK    
        incf    count
f        increase timeout counter each time ACK is not received
        btfsc    STATUS
Z
        
goto    No_ACK_Rec
        btfsc    I2C_PORT
,    SDA    test pin. If clearRTC is pulling SDA low for ACK
        
goto    WaitForACK        ; ...otherwise, continue to wait
        bcf        I2Cflags
0        clear flag bit (ACK received)
        
call     LOW_SCL
        
return

I2C_Send_NAK:                    ; bring SDA high and clock
        call     HIGH_SDA
        call     Clock_Pulse
        
return

WaitForWrite                    poll ACK for write timing
        call     I2C_Start
        call    I2C_Set_Write
        btfsc    I2Cflags
0
        
goto    WaitForWrite
        
return


;------ 
No ACK received from slave (must use "return" from here)
;; 
Typicallyset a flag bit to indicate failed write and check for it upon return.
No_ACK_Rec
        bsf    I2Cflags
0        set flag bit
        
return    

I2C_ACK:
        
call     LOW_SDA
        call     Clock_Pulse
        
return

I2C_Start:                
        
call     LOW_SCL
        call     HIGH_SDA
        call     HIGH_SCL
        call     LOW_SDA            
bring SDA low while SCL is high
        call     LOW_SCL
        
return

I2C_Stop:
        
call     LOW_SCL
        call     LOW_SDA
        call     HIGH_SCL
        call     HIGH_SDA        
bring SDA high while SCL is high
        call     LOW_SCL
        
return
 
I2C_Set_Write
        MOVLW     Chip_Write
        call     I2C_Out
        call     I2C_NAK
        
return

I2C_Set_Read
        MOVLW    Chip_Read
        call     I2C_Out
        call     I2C_NAK
        
return

I2C_Lo_Adr      movf     Adr_Lo,     W    send low byte of address
        call     I2C_Out
        call     I2C_NAK
        
return

Clock_Pulse:                    ; SCL momentarily to logic one
        call     HIGH_SCL
        call     LOW_SCL
        
return        

HIGH_SDA:                    ; high impedance by making SDA an input
        bsf     STATUS
,     RP0    bank 1
        bsf     I2C_TRIS
,     SDA    make SDA pin an input
        bcf     STATUS
,     RP0    back to bank 0
        
return

LOW_SDA:
        
bcf     I2C_PORT,     SDA    
        bsf     STATUS
,     RP0    bank 1
        bcf     I2C_TRIS
,     SDA    make SDA pin an output
        bcf     STATUS
,     RP0    back to bank 0
        
return

HIGH_SCL:
        
bsf     STATUS,     RP0    bank 1
        bsf     I2C_TRIS
,     SCL    make SCL pin an input
        bcf     STATUS
,     RP0    back to bank 0
        
return

LOW_SCL:
        
bcf        I2C_PORT,     SCL
        bsf     STATUS
,     RP0    bank 1
        bcf     I2C_TRIS
,     SCL    make SCL pin an output
        bcf     STATUS
,     RP0    back to bank 0
        
return

;------ 
No ACK received from slave.  This is the error handler.
Error_Routine
Output error messageetchere
        MOVLW   0x04
        CALL    GOTOLINE2
        movlw    
'e'
        
call    WRITE_TEXT
        
return                ; returns to INITIAL calling routine

Error_Routine1
Output error messageetchere
        MOVLW   0x05
        CALL    GOTOLINE2
        movlw    
'f'
        
call    WRITE_TEXT
        
return

Error_Routine2
Output error messageetchere
        MOVLW   0x06
        CALL    GOTOLINE2
        movlw    
'g'
        
call    WRITE_TEXT
        
return

End of I2C routines

;======================== MODULE LCD ====================================
WRITE_2_NIBBLES
        MOVWF   ACC
        BANKSEL TRISB
        MOVLW   
B'11110000'       Chon data lam dau ra
        ANDWF   TRIS_DAT
,F
        BANKSEL PORTB
        MOVLW   0x0F
        IORWF   PORT_DAT
,F
        SWAPF   ACC
,W
        IORLW   0xF0
        ANDWF   PORT_DAT
,F        Dua 4 bit CAO ra Port_CON
        BSF     PORT_CON
,EN
        NOP
        BCF     PORT_CON
,EN
        MOVLW   0x0F
        IORWF   PORT_DAT
,F
        MOVF    ACC
,W
        IORLW   0xF0
        ANDWF   PORT_DAT
,F        Dua 4 bit THAP ra Port_CON
        BSF     PORT_CON
,EN
        NOP
        BCF     PORT_CON
,EN
        
RETURN


        
INIT_LCD
        CALL    DELAY100
        BANKSEL TRISA
        MOVLW   
B'00000'
        
MOVWF   TRIS_DAT
        BCF     TRIS_CON
,EN
        BCF     TRIS_CON
,RS
        BCF     TRIS_CON
,RW
        BANKSEL PORTA    
        BCF     PORT_CON
,RS
        BCF     PORT_CON
,RW
        BCF     PORT_CON
,EN
        BSF     PORT_CON
,EN
        MOVLW   0x82
        MOVWF   PORT_DAT
        BCF     PORT_CON
,EN
        CALL    DELAY5
        MOVLW   0x28
        CALL    WRITE_2_NIBBLES   
Write A as two separate nibbles to LCD
        CALL    DELAY5
        MOVLW   0x0E
        CALL    WRITE_2_NIBBLES
        CALL    DELAY5
        MOVLW   0x06
        CALL    WRITE_2_NIBBLES
        CALL    DELAY5
        
RETURN

CLEAR_LCD
        BCF     PORT_CON
,RS
        MOVLW   0x01
        CALL    WRITE_2_NIBBLES
        CALL    DELAY50
        
RETURN

WRITE_TEXT
        BSF    PORT_CON
,RS
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN  

GOTOLINE1
        BCF    PORT_CON
,RS
        ADDLW  0x80
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN 

GOTOLINE2
        BCF    PORT_CON
,RS
        ADDLW  0xC0
        CALL   WRITE_2_NIBBLES
        CALL   DELAY5
        
RETURN 




DELAY255    movlw    0xff        ;delay 255 mS
        
goto    D0
DELAY100    movlw    d
'100'        ;delay 100mS
        
goto    D0
DELAY50        movlw    d
'50'        ;delay 50mS
        
goto    D0
DELAY20        movlw    d
'20'        ;delay 20mS
        
goto    D0
DELAY5        movlw    0x05        
;delay 5.000 ms (4 MHz clock)
D0        movwf    R2
D1        movlw    0xC7            
;delay 1mS
        movwf    R3
        movlw    0x01
        movwf    R4
Delay_0
        decfsz    R3
f
        
goto    $+2
        decfsz    R4
f
        
goto    Delay_0

        decfsz    R2    
,f
        
goto    D1
        retlw    0x00
            

        END 


Luu y voi cac ban la: cac ky tu f,g,e trong chuong trinh tren la cac ky tu bao loi duong truyen

mafd_47a 24-10-2005 02:14 AM

Chương trình trên các bác cứ coi như là một newbie viết nhé. Các bác đừng có cười em nhé. Nếu có gì sai hoặc lỗi mong các bác cứ bảo em Thực sự là em cũng rất mong được nhận duoc các y kien hay chương trình nâng cấp của các bác. Vì hiện em cũng chưa có thời gian để làm tiếp về con này

Xem chừng 16F88 được it người quan tâm quá àh. Có lẽ cũng phải theo thời đại chuyển sang 16F87x thui.

Chúc cả nhà vui


Múi giờ GMT. Hiện tại là 02:44 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam