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 24-10-2005 10:17 PM

Code:

To mafd_47a:
Bạn viết thế này rất khó theo dõi, trước khi viết code cậu có thể viết "chiến thuật" để giải quyết bài toán. Và đoạn code nào thực hiện việc giải quyết đó. Tại vì MPASM không phải ai cũng viết được, có thể viết bằng CCS ,HTPIC, BASIC.. và sau đó phần code bạn có thể để file *.asm hoặc *.txt ai đó muốn xem thì "đao" về. Còn sơ đồ nguyên lý nữa,...


//************************************************** ***********
Tớ rất thích chữ kí của bạn! rất đúng đó
Code:

ONE WORK, ONE PURPOSE or NOTHING!

vdt 26-10-2005 06:25 PM

To mafd_47a: Tôi đang dùng CCS viết cho con PIC16F88 để điều khiển LCD 20x4 và thấy rất dễ dàng, vì nó có sẵn thư viện LCD420.c.
Tôi thấy con PIC16F88 này rất hay, vì nó sẵn mấy đường vào ADC, tôi sử dụng 4 kênh vào ADC, hiển thị kết quả đo được nên LCD.

vdt 27-10-2005 02:46 PM

Chào bạn,
Mình cũng ở HN. Mình sẵn lòng ủng hộ các chương trình của mình đã làm để mọi người cùng tham khảo.
Mình vừa làm 1 chương trình rất nhỏ, với 1 mục đích là đo đồng thời 4 tín hiệu tương tự, và hiển thị kết quả lên LCD 4x20. Mình sử dụng PIC16F88. Đồng thời kết quả đó được đưa về PC qua cổng RS232. Mình phải sửa lại thư viện LCD420.C của CCS một chút, vì trong thư viện này, nó dùng chân Tx và Rx để điều khiển LCD, do vậy tôi phải diều chỉnh lại sơ đồ chân nối với LCD. Mặt khác, trong ứng dụng của tôi, tôi không sử dung các hàm đọc từ LCD xuồng PIC, thế nên tôi cũng không nối chân RW của LCD về PIC nữa, mà nối chân RW xuống đất.
Chức năng của PIC16F88 là rất nhiều, nhưng số cổng ra ngoài lại có hạn, do số chân PIC chỉ có 18, thế nên khi thiết kế, chúng ta lên tối ưu lại sơ đồ nối bên ngoài để tận dụng các chức năng có sẵn của PIC và hạn chế số lượng linh kiện phụ trợ bên ngoài.
Rất mong nhận được ý kiến đóng góp của mọi người để thiết kế của tôi được hoàn thiện hơn.
Thanks


P/S: Làm sao để upload file lên diễn đàn đây ???

mafd_47a 28-10-2005 01:22 AM

Rất hoan nghênh bạn đã đóng góp vào box này

Khi bạn soạn thảo, bạn chú ý phía dưới phần soạn thảo sẽ thấy phần “Đính kèm” kích vào phần “ Tải file từ máy” khi đó trên màn hình Window sẽ mở ra hộp thoại bạn chọn Choose để chỉ đường dẫn đến file mà bạn muốn chọn rồi kích vào “them File” đợi khoảng một lát để máy tải file lên nếu xuất hiện File bên dưới thì coi như bạn đã xong ( lưu ý đến các file hợp lệ về kích thước, kiểu file …. ) đóng hộp thoại này rồi sau đó gửi như bình thường

vdt 28-10-2005 09:41 AM

Tôi gửi thử sơ đồ mạch

mafd_47a 30-10-2005 09:47 AM

Chuẩn 1-Wire interface là một chuẩn của Maxim-ic, có khá nhiều linh kiện về giao tiếp cho chuẩn này. Điển hình nhất là đo nhiềt độ dùng Sensor nhiệt DS18B20, hay DS1821. Ưu điểm của chuẩn giao tiếp này là chúng ta chỉ cần một dây để giao tiếp, Giao thức giao tiếp cũng khá đơn giản có lợi cho Master ( đơn giản hơn I2C )

Bài viết tới đây tôi xin giới thiệu cho các bạn về chuẩn giao tiếp này
file: 1w_16f6x.inc ( dung de khai bao bien dau - Marco )
PHP Code:

; *******************************************************
;
Dallas 1-Wire Support for PIC16F628
;
Processor has 4MHz clock and 1s per instruction cycle.
;
; *******************************************************
; *******************************************************
Dallas Semiconductor 1-Wire MACROS
; *******************************************************
WRITE_SENTENCEMACRO POS,DONG,CHUOI,WRITE,VITRICONTRO
        MOVLW   POS
        CALL    DONG        
        CLRF    R1
AGAIN1  MOVF    R1
,W
        CALL    CHUOI
        ADDLW   0x00
        BTFSC   STATUS
,Z
        
GOTO    NEXT1
        CALL    WRITE
        INCF    R1
,F
        
GOTO    AGAIN1
        MOVLW   POS
        ADDWF   R1
,W
        MOVWF   VITRICONTRO       
Luu con tro cua LCD vao bien
        
NEXT1
        ENDM
OW_HIZ
:MACRO
        BSF     STATUS
,RP0        Select Bank 1 of data memory
        BSF     TRISB
DQ         Make DQ pin High Z
        BCF     STATUS
,RP0        Select Bank 0 of data memory
        ENDM
; --------------------------------------------------------
OW_LO:MACRO
        BCF     STATUS
,RP0        Select Bank 0 of data memory
        BCF     PORTB
DQ         Clear the DQ bit
        BSF     STATUS
,RP0        Select Bank 1 of data memory
        BCF     TRISB
DQ         Make DQ pin an output
        BCF STATUS
,RP0            Select Bank 0 of data memory
        ENDM
; --------------------------------------------------------
WAIT:MACRO TIME
                                  
;Delay for TIME s.
                                  ;
time must be in multiples of 5s.
        
MOVLW   (TIME/5)-1        ;1s
        MOVWF   TMP0              
;1s
        CALL    WAIT5U 
;2s
        ENDM
; *******************************************************
Dallas Semiconductor 1-Wire ROUTINES
; *******************************************************
WAIT5U:
                                  ;
This takes 5uS to complete
        NOP                       
;1s
        NOP                       
;1s
        DECFSZ  TMP0
,F            ;1s or 2s
        
GOTO    WAIT5U            ;2s
        RETLW   0                 
;2s
; --------------------------------------------------------
OW_RESET:
        
OW_HIZ                    Start with the line high
        CLRF    PDBYTE            
Clear the PD byte
        OW_LO
        WAIT    .500              
Drive Low for 500s
        OW_HIZ
        WAIT    .70               
Release line and wait 70s for PD Pulse
        BTFSS   PORTB
,DQ          Read for a PD Pulse
        INCF    PDBYTE
,F          Set PDBYTE to 1 if get a PD Pulse
        WAIT    .400              
Wait 400s after PD Pulse
        RETLW   0
; --------------------------------------------------------
DSRXBYTE:                         ; Byte read is stored in IOBYTE
        MOVLW   .8
        MOVWF   COUNT             
Set COUNT equal to 8 to count the bits
DSRXLP
:
        
OW_LO
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP                       
Bring DQ low for 6s
        OW_HIZ
        NOP
        NOP
        NOP
        NOP                       
Change to HiZ and Wait 4s
        MOVF    PORTB
,W           Read DQ
        ANDLW   1
<<DQ             Mask off the DQ bit
        ADDLW   .255              
C=if DQ=1C=if DQ=0
        RRF     IOBYTE
,F          Shift C into IOBYTE
        WAIT    .50               
Wait 50s to end of time slot
        DECFSZ  COUNT
,F           Decrement the bit counter
        
GOTO    DSRXLP
        RETLW   0
; --------------------------------------------------------
DSTXBYTE:                         ; Byte to send starts in W
        MOVWF   IOBYTE            
We send it from IOBYTE
        MOVLW   .8
        MOVWF   COUNT             
Set COUNT equal to 8 to count the bits
DSTXLP
:
        
OW_LO
        NOP
        NOP
        NOP
        NOP
        NOP                       
Drive the line low for 5s
        RRF     IOBYTE
,F          The data byte
        BTFSC   STATUS
,C          Check the LSB of IOBYTE for or 0
        BSF     PORTB
,DQ          Drive the line high if LSB is 1
        WAIT    .60               
; Continue driving line for 60s
        OW_HIZ                    
Release the line for pullup
        NOP
        NOP                       
Recovery time of 2s
        DECFSZ  COUNT
,F           Decrement the bit counter
        
GOTO    DSTXLP
        RETLW   0
; -------------------------------------------------------- 

Về chuẩn giao tiếp các bạn có thể tham khảo các tài liệu dưới đây. Về phương thức giao tiếp tôi dùng luôn code của họ. Với các chuẩn giao tiếp tôi nghĩ chúng ta nên dùng các code có sẵn; nếu tự xây dựng thì sẽ rất mất nhiều thời gian và chắc chắn là sẽ không tối ưu ( bài học sương máu từ I2C )

mafd_47a 30-10-2005 09:58 AM

Chuong tirnh chinh
 
2 Attachment(s)
File tempt.asm
PHP Code:

;**********************************************************************
;                                                                     *
;    
Filename:        DS1307.asm                                        *
;    
Date:          28-10-2005                                        *
;    
File Version:  V1.0                                              *
;                                                                     *
;    
Author:        MAFD_47A                                          *
;    
Company:       BACHKHOA                                          *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Files requiredKet noi PIC16f88 voi DS1821 hien thi len LCD     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
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                                  *
;              
Noi DQ cua DS1821 voi chan RAcua VDK                 *
;                                                                     *
;**********************************************************************
;                                                                     *
;    
Upgrade:                                                         *
;                                                                     *
;**********************************************************************

    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

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
R0            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
I2C           EQU     0x00


PORT_DAT      EQU     PORTA
TRIS_DAT      EQU     TRISA
PORT_CON      EQU     PORTB
TRIS_CON      EQU     TRISB
DQ            EQU     0x04
        cblock 0x20
               IOBYTE
               TMP0                      
Address 0x23
               COUNT                     
Keep track of bits
               PICMSB                    
Store the MSB
               PICLSB                    
Store the LSB
               PDBYTE                    
Presence Detect Pulse
               VITRI                     
Dung de luu bien cua vi tri con tro trong LCD
               S100                      
Gia tri hang 100
               S10                       
Gia tri hang chuc
               S1                        
Gia tri hang don vi
        endc

      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
;==============================================================================
     
;==============================================================================
          
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

       
include <1W_16F6X.inc>  
MAIN
        BANKSEL ANSEL
        CLRF    ANSEL
        BANKSEL PORTA
        CALL    INIT_LCD   
                
                                                                         
;====================================================================

        
WRITE_SENTENCE 0x03,GOTOLINE1,MYDATA,WRITE_TEXT,VITRI
        CALL    INIT_TEMP
        MOVLW   0x08
        MOVWF   VITRI
        
AGAIN   CALL    DELAY255
        CALL    DELAY255
        CALL    DELAY255
        CALL    DELAY255
        CALL    GET_TEMP
        INCF    IOBYTE
,F
        CALL    WRITE_TEMP 
               
        
GOTO    AGAIN 
;====================================================================


MYDATA  ADDWF   PCL,F
        RETLW   
'T'
        
RETLW   'E'
        
RETLW   'M'
        
RETLW   'P'
        
RETLW   ':'
        
RETLW   ' '
        
RETLW   0x00

INIT_TEMP
        CALL    OW_RESET
        MOVLW   0x01
        CALL    DSTXBYTE
        MOVLW   .40
        CALL    DSTXBYTE
        CALL    OW_RESET
        MOVLW   0x02
        CALL    DSTXBYTE
        MOVLW   .10
        CALL    DSTXBYTE
        CALL    OW_RESET
        MOVLW   0x0C
        CALL    DSTXBYTE
        MOVLW   
B'01000000'
        
CALL    DSTXBYTE
        CALL    OW_RESET
        MOVLW   0xEE
        CALL    DSTXBYTE
        
RETURN
       
        
GET_TEMP

        CALL    OW_RESET
        MOVLW   0xAA
        CALL    DSTXBYTE
        CALL    DSRXBYTE         
GIA TRI NHIET DO DA DUOC LUU VAO IOBYTE
        
RETURN

WRITE_TEMP 
        MOVF    IOBYTE
,W
        CALL    CONVERT_BCD
        MOVF    R2
,W             Luu cac gia tri r2,r1,r0 vao cac bien s100,s10,s1
        MOVWF   S100
        MOVF    R1
,W
        MOVWF   S10
        MOVF    R0
,W
        MOVWF   S1
        MOVF    VITRI
,W
        CALL    GOTOLINE1
        MOVF    S100
,W
        ADDLW   0x00
        BTFSC   STATUS
,Z
        MOVLW   0xE0
        ADDLW   0x30
        CALL    WRITE_TEXT
        MOVF    S10
,W
        ADDLW   0x30
        CALL    WRITE_TEXT
        MOVF    S1
,W
        ADDLW   0x30
        CALL    WRITE_TEXT
        RETLW   0x00

CONVERT_BCD                       
In WoutR2,R1,R0  hang tram chudon vi )
        
MOVWF   ACC               Luu vao trong ACC lam thanh ghi dem
        CLRF    R0                
Xoa cac thanh ghi de luu RA DANG gia tri out
        CLRF    R1
        CLRF    R2
        MOVLW   .100
BCD_100                           
Voi so hang chuc
        INCF    R2
,F
        SUBWF   ACC
,F
        BTFSC   STATUS
,C
        
GOTO    BCD_100        
        DECF    R2
,F
        ADDWF   ACC
,F
        MOVLW   .10
BCD_10                           
Voi so hang chuc
        INCF    R1
,F
        SUBWF   ACC
,F
        BTFSC   STATUS
,C
        
GOTO    BCD_10        
        DECF    R1
,F
        ADDWF   ACC
,W
        MOVWF   R0
        
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 

( Module ve LCD cac ban tham khao o tren bai viet ve DS1307 )
Việc mổ sẻ các chương trình con ở trên sẽ mất rất nhiều thời gian, chắc tôi ko đủ sức làm được. Thắc mắc chỗ nào mọi người cứ post lên chúng ta cùng giải quyết

Còn một điều nữa chương trình này là bản V1.0 tức là bản đầu tiên, tôi chưa chú trọng đến giao diện hay việc tối ưu code chương trình, Mục đích của các bản V1.0 ở đây là làm sao chay được mà thôi. Với chương trình này các bạn hoàn toàn có thể nâng cấp chỉnh sửa nó lên

Have a good time

tuanva 02-11-2005 02:01 PM

Re:
 
Trích:

Nguyên văn bởi vdt
Tôi gửi thử sơ đồ mạch

Sao không thấy gì nhỉ, ví dụ của vdt rất hay. Cậu có thể gửi cho tôi đc không? tuan@cdc-automation.com.vn

Cám ơn nhiều.

vdt 10-11-2005 12:04 PM

1 Attachment(s)
Gửi thử sơ đồ PIC6F88 điều khiển LCD 4x20

kienvq 11-04-2006 08:45 AM

các bác nói hay lắm, nhưng mình đi tìm con F88 này mà có ở đâu bán đâu
bác nào có bán, hay biết chỗ bán thì lên tiếng với.

falleaf 11-04-2006 02:46 PM

Ngay trong picvietnam có bán, phần quảng cáo và bán sản phẩm. Nếu bạn cần mua bán gì, cứ vào đó nhé. Hạn chế hỏi han việc mua bán trong các bài viết kỹ thuật.

Chúc vui

sidesignvn 01-10-2008 11:22 AM

Sử dụng dao động nội 16F88 trong CCS.
 
Tôi mới thực hiện một thiết kế với 16F88 để tiết kiệm thạch anh tôi dùng dao động nội trong CCS như sau:

Code:

#include <16F88.H>
#include <ctype.h>
#fuses INTRC_IO,NOWDT
#use delay(clock=8000000)
#use rs232(baud=19200,xmit=PIN_B5, rcv=PIN_B2,enable=PIN_B4,errors,stream=HOSTPC)

#define TRIS_A 0xFF //0b11111111 //Tat ca la dau vao
#define TRIS_B 0xC4 //0b11000100

#define RTCC_RVALUE 6 //=256 - ((8000000/4)/RTCC_DIV_8)/1000 (Ngat 1000 lan/giay)

#define DO2 PIN_B0 //Led

int16 LedTimeout;

void InitPar()
{
  set_tris_a(TRIS_A);
  set_tris_b(TRIS_B);
}

void InitRTCC(void)
{
  set_rtcc(RTCC_RVALUE); // Khoi tao timer0
  setup_counters (RTCC_INTERNAL, RTCC_DIV_8);
  enable_interrupts (INT_RTCC);
}

#INT_RTCC
clock_isr()
//Ngat nay se tran sau 1000us
{
  disable_interrupts(INT_RTCC);

  if (++LedTimeout > 1000)
  {
      output_toggle(DO2);
      LedTimeout = 0;
  }

  set_rtcc(RTCC_RVALUE);
  enable_interrupts(INT_RTCC);
}
...

RA6, RA7 tôi để lửng. Bình thường LED nhấp nháy đúng chu kỳ sáng 1 giây / tắt 1 giây. Khi tôi đưa tay lại gần hoặc trạm vào chân RA6, RA7 thì chân đầu ra DO2 chỉ chớp xuống 0 rồi lên 1 ngay (không giữ được ở trạng thái 0 đủ thời gian 1 giây).

Tôi nghi rằng việc đặt #fuses của tôi chưa đủ dẫn đến chưa chuyển được chân RA6, RA7 sang mode IO nên vẫn bị ảnh hưởng đến hoạt động của chíp.

Bạn nào biết vấn đề này xin chỉ giúp cách giải quyết.

Chân thành cảm ơn.

tantme 13-04-2012 03:24 AM

mấy a cho e xin file def_16f88 được không. e không chuyên về pic lắm nên không thể tạo được file này. mấy a có file định nghĩa nào khác nữa thì cho e với. e mới học nên còn gà lắm. mail e: tantme@gmail.com


Múi giờ GMT. Hiện tại là 08:55 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