|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
29-11-2013, 08:16 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Jul 2011
Bài gửi: 10
: |
Dịch giúp đoạn code
Mình có cái code đồng hồ dùng PIC nhưng không có trình biên dịch cho PIC, các bạn có picbasic pro thì giúp mình dịch với, thanks
file đồng hồ.bas http://www.mediafire.com/view/v57mn4z4w7zkc2z/code.bas '************************************************* *************** '* Name : dong ho.BAS * '* Author : * '* Notice : Copyright (c) 2013 [ETE] * '* : All Rights Reserved * '* Date : 29.11.2013 * '* Version : 1.0 LED (44) * '* Notes : '************************************************* *************** PORTA=0ortb=0 'bu versiyonda saat sürekli okunuyor. Orta ledlerde hiç sorun yok. TRISB=0 'buda güzel çalu?uyor bence hemde en güzeli TRISA=%11100000 '----------------------------------------------------------------- @ DEVICE pic16F628 'i?lemci 16F628 @ DEVICE pic16F628, WDT_ON 'Watch Dog timer açuk @ DEVICE pic16F628, PWRT_ON 'Power on timer açuk @ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapalu @ DEVICE pic16F628, MCLR_off 'MCLR pini kullanulMIYOR. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanulacak '----------------------------------------------------------------- DEFINE OSC 4 '------------------------------------------------------------------------- ON INTERRUPT GoTo KESME 'kesme olu?ursa KESME adlu etikete git. OPTION_REG=%10000101 'Pull up dirençleri UPTAL- Bölme oranu 1/64. INTCON=%10100000 'Kesmeler aktif ve TMR0 kesmesi aktif TMR0=0 CMCON=7 '---------------------------------------------------------------------------- Comm_Pin VAR PortA.4 ' One-wire Data-Pin "DQ" PortB.0 da Busy VAR BIT ' Busy Status-Bit POZ VAR BIT Z VAR BIT W VAR BIT U VAR BIT T VAR BIT GOR VAR BYTE HAM VAR WORD ' Sensör HAM okuma dederi ISI VAR WORD ' Hesaplanmu? ISI dederi Float VAR WORD ' Holds remainder for + temp C display X VAR WORD Y VAR BYTE SAYI VAR BYTE SIGN_BITI VAR HAM.Bit11 ' +/- sucakluk U?aret biti, 1 = olursa eksi sucakluk NEGAT_ISI CON 1 ' Negatif_Cold = 1 Deg CON 223 ' ° i?areti SIGN VAR BYTE ' ISI dederi için +/- i?aret TEMP VAR BYTE ' Div32 bit hesap için geçici dedi?ken SAYAC VAR BYTE 80 SN VAR BYTE DAK VAR BYTE SAAT VAR BYTE GUN VAR BYTE AY VAR BYTE YIL VAR BYTE MEM var byte ' EKRAN_ZAM var byte ' SUM VAR BYTE EKRAN_ISI VAR BYTE ONLAR VAR BYTE BIRLER VAR BYTE ESN VAR BYTE '--------------------------------------------- SYMBOL DTA=PortB.0 SYMBOL CLK=PORTB.1 symbol ST=PORTB.2 SYMBOL RTC_DTA=PORTA.0 SYMBOL RTC_CLK=PORTA.1 SYMBOL RTC_RST=PORTA.2 symbol SEC =PORTA.5 SYMBOL ASAGI =PORTA.6 SYMBOL YUKARI=PORTA.7 '----------------------------------------------------------------------------- CLEAR 'tüm dedi?kenler sufurlandu EKRAN_ZAM=10 'saat EKRANDA KALMA SÜRESU EKRAN_ISI=5 'sucakluk EKRANDA KALMA SÜRESU BUNLARI DEĐU~TUREBULURSUNUZ. SUM=EKRAN_ZAM+EKRAN_ISI IF sec=0 then ZAM_AYAR ILK: gosub ekran0 gosub sensoryaz gosub sensoroku low RTC_RST low RTC_CLK GOSUB GECIKME '----------------------------------------------------------------------------- HIGH PORTA.3 gosub ZAMAN_OKU:esn=SN BASLA: GOSUB ZAMAN_OKU IF SAYAC=30 THEN LOW porta.3 IF Y=SUM THEN Y=0 IF Y>(EKRAN_ZAM) AND Y<SUM THEN if y=(EKRAN_ZAM+1) then GOSUB SENSOROKU GOSUB EKRAN1 ENDIF if esn=sn then atla Y=Y+1 : ESN=SN : SAYAC=0 IF Y<=EKRAN_ZAM THEN HIGH porta.3 GOSUB EKRAN0 ENDIF ATLA: if SEC=0 THEN AYAR 'MODE TU~UNA BASILMI~ USE AYAR'A GUT GOTO BASLA '-----------------------alt programlar------------------------------------------- TEKRAR: SHIFTOUT DTA,CLK,1,[SAYI] RETURN BAK_0: GOSUB AL IF Z=1 AND W=1 THEN SAYI=0 RETURN BAK_1: GOSUB AL IF Z=1 AND U=1 THEN SAYI=0 RETURN BAK_2: GOSUB AL IF Z=1 AND T=1 THEN SAYI=0 RETURN EKRAN0: X= DAK DIG 0:GOSUB BAK_1:GOSUB TEKRAR X= DAK DIG 1 :GOSUB BAK_1:GOSUB TEKRAR u=0 X= SAAT DIG 0 :GOSUB BAK_0:GOSUB TEKRAR X= SAAT DIG 1:GOSUB BAK_0:GOSUB TEKRAR w=0 HIGH st:PAUSEUS 2:LOW st RETURN 'AL: LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN 'ma K chung AL: LOOKUP X,[64,249,164,176,153,146,130,248,128,144,156,198],SAYI :RETURN 'ma A chung EKRAN1:LOW PORTA.3 X=11:GOSUB AL:GOSUB TEKRAR X=10:GOSUB AL:GOSUB TEKRAR x=(ISI DIG 0):GOSUB AL:GOSUB TEKRAR x=(ISI DIG 1):GOSUB AL:GOSUB TEKRAR HIGH st:PAUSEUS 2:LOW st RETURN EKRAN2:IF POZ=0 THEN HIGH porta.3 X= YIL DIG 0:GOSUB BAK_2:GOSUB TEKRAR X= YIL DIG 1:GOSUB BAK_2:GOSUB TEKRAR T=0 X= AY DIG 0:GOSUB BAK_1:GOSUB TEKRAR X= AY DIG 1:GOSUB BAK_1:GOSUB TEKRAR U=0 X= GUN DIG 0:GOSUB BAK_0:GOSUB TEKRAR X= GUN DIG 1:GOSUB BAK_0:GOSUB TEKRAR w=0 HIGH st:PAUSEUS 2:LOW st RETURN EKRAN_3: X= SN DIG 0:GOSUB BAK_1:GOSUB TEKRAR X= SN DIG 1 :GOSUB BAK_1:GOSUB TEKRAR u=0 SAYI=0:GOSUB TEKRAR SAYI=SUM:GOSUB TEKRAR w=0 HIGH st:PAUSEUS 2:LOW st RETURN '----------------------------------------------------- ZAM_AYAR: LOW PORTA.3:SN=0:POZ=1:SUM=6 SN=EKRAN_ZAM:GOSUB EKRAN_3 WHILE SEC=0:WEND ZAM_BIR: W=1 IF SEC=0 THEN ZAM_IKI IF YUKARI=0 THEN IF Z=0 THEN sn=SN+1 IF SN=31 THEN SN=0 ENDIF IF ASAGI=0 THEN IF Z=0 THEN SN=SN-1 IF SN=255 THEN SN=30 ENDIF Z=1-Z GOSUB EKRAN_3 GOSUB GECIKME GOTO ZAM_BIR ZAM_IKI: EKRAN_ZAM=SN:SUM=91 SN=EKRAN_ISI:GOSUB EKRAN_3 WHILE SEC=0:WEND ZAM_UC: W=1 IF SEC=0 THEN ZAM_DORT IF YUKARI=0 THEN IF Z=0 THEN sn=SN+1 IF SN=31 THEN SN=0 ENDIF IF ASAGI=0 THEN IF Z=0 THEN SN=SN-1 IF SN=255 THEN SN=30 ENDIF Z=1-Z GOSUB EKRAN_3 GOSUB GECIKME GOTO ZAM_UC ZAM_DORT: EKRAN_ISI=SN SUM=EKRAN_ZAM+EKRAN_ISI Z=0:W=0:POZ=0 GOTO ILK AYAR: LOW PORTA.3:SN=0:POZ=1 gosub ekran0 WHILE SEC=0:WEND HOUR: W=1 LOW PORTA.3 IF SEC=0 THEN MINBIR IF YUKARI=0 THEN IF Z=0 THEN SAAT=SAAT+1 IF SAAT=24 THEN SAAT=0 ENDIF IF ASAGI=0 THEN IF Z=0 THEN SAAT=SAAT-1 IF SAAT=255 THEN SAAT=23 ENDIF Z=1-Z GOSUB EKRAN0 GOSUB GECIKME GOTO HOUR MINBIR: W=0:Z=0 GOSUB EKRAN0 WHILE SEC=0 WEND MINUTE: U=1 LOW PORTA.3 IF SEC=0 THEN ara IF YUKARI=0 THEN IF Z=0 THEN DAK=DAK+1 IF DAK=60 THEN DAK=0 ENDIF IF ASAGI=0 THEN IF Z=0 THEN DAK=DAK-1 IF DAK=255 THEN DAK=59 ENDIF Z=Z-1 GOSUB EKRAN0 GOSUB GECIKME GOTO MINUTE SECBIR: WHILE SEC=0 WEND U=0 GECIKME: FOR X=0 TO 3500 PAUSEUS 5 NEXT RETURN DELAY: FOR X=0 TO 1900 PAUSEUS 10 NEXT RETURN ARA: W=0:u=0:T=0:Z=0 GOSUB FLASH Gosub EKRAN0 HIGH PORTA.3 WHILE SEC=0 wend MEM=SN:GOSUB TERSCEVIR:SN=SAYI MEM=DAK:GOSUB TERSCEVIRAK=SAYI MEM=SAAT:GOSUB TERSCEVIR:SAAT=SAYI MEM=GUN:GOSUB TERSCEVIR:GUN=SAYI MEM=AY:GOSUB TERSCEVIR:AY=SAYI MEM=YIL:GOSUB TERSCEVIR:YIL=SAYI GOSUB ZAMAN_YAZ GOSUB ZAMAN_OKU y=0:POZ=0 goto BASLA FLASH: TOGGLE PORTA.3:GOSUB DELAY:TOGGLE PORTA.3:GOSUB DELAY TOGGLE PORTA.3:GOSUB DELAY:TOGGLE PORTA.3:GOSUB DELAY return '------------------------------------------------------------------------------- '----------------ISI SENSÖR OKUMA BÖLÜMÜ -------------------------------- SENSOROKU: '-----------------DUKKAT USUS'de BU SATIR AKTUF EDULECEK---------------------- ' ham=$0200:Gosub hesapla:return 'NORMAL ÇALI~MADA BU SATIR SULUNECEK '------------------------------------------------------------------------------ OWOUT Comm_Pin, 1, [$CC, $44]' ISI dederini oku Bekle: OWIN Comm_Pin, 4, [Busy] ' Busy dederini oku IF Busy = 0 THEN Bekle ' hala me?gulmü? , evet ise goto Bekle..! OWOUT Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku OWIN Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' Uki byte oku ve okumayu bitir. GOSUB Hesapla RETURN SENSORYAZ: OWOUT COMM_Pin, 1, [$CC, $4E, $00,$00,$31] return Hesapla: ' Ham dederden Santigrat derece hesabu Sign = "+" IF SIGN_BITI = NEGAT_ISI THEN Sign = "-" temp=($ffff-ham+1)*625 ISI = DIV32 10 GOTO GEC endif TEMP = 625 * (HAM+1) ' ISI = DIV32 10 ' Div32 hassas derece hesabu için 32 bit bölme yapuyoruz. GEC: FLOAT = (ISI //1000)/100 ISI=ISI/1000 RETURN ZAMAN_OKU: high RTC_RST:OUTPUT rtc_dta shiftout RTC_DTA, RTC_CLK, 0, [$BF]:INPUT RTC_DTA SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, MEM, YIL, MEM] 'OKU MEM=SN:GOSUB CEVIR:SN=SAYI MEM=DAK:GOSUB CEVIRAK=SAYI MEM=SAAT:GOSUB CEVIR:SAAT=SAYI MEM=GUN:GOSUB CEVIR:GUN=SAYI MEM=AY:GOSUB CEVIR:AY=SAYI MEM=YIL:GOSUB CEVIR:YIL=SAYI low RTC_RST return ZAMAN_YAZ: high RTC_RST:OUTPUT RTC_DTA SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0] 'WRT Protek açuldu low RTC_RST:PAUSEUS 10 high RTC_RST SHIFTOUT RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, 0, YIL, 128] 'YAZ low RTC_RST PAUSEUS 10 return CEVIR: ONLAR=MEM & %01110000 ONLAR=ONLAR>>4 BIRLER=MEM & %00001111 SAYI=ONLAR*10+BIRLER RETURN TERSCEVIR: ONLAR=MEM DIG 1 ONLAR=ONLAR<<4 BIRLER=MEM DIG 0 SAYI=ONLAR+BIRLER RETURN DISABLE KESME:IF POZ=1 then CIK SAYAC=SAYAC+1 'kesme sayacu 1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme) CIK: INTCON.2=0 'TMR0 Kesme bayradu sufurlanuyor RESUME ENABLE END |
30-11-2013, 03:59 AM | #2 |
Làm quen với PIC
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
: |
Bạn kiểm tra thử xem .
|
30-11-2013, 05:13 PM | #3 |
Nhập môn đệ tử
Tham gia ngày: Jul 2011
Bài gửi: 10
: |
Chạy được nhưng không chỉnh giờ được ( trong mô phỏng) con mạch thật thì nó không chạy. Cái mạch này dùng thạch anh nội, nó khai báo đâu ở đoạn code này: @ DEVICE pic16F628 @ DEVICE pic16F628, WDT_ON @ DEVICE pic16F628, PWRT_ON @ DEVICE pic16F628, PROTECT_OFF @ DEVICE pic16F628, MCLR_off @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT con trong file bạn gửi minh không thấy! Chạy được nhưng không chỉnh giờ được ( trong mô phỏng) con mạch thật thì nó không chạy. Cái mạch này dùng thạch anh nội, nó khai báo đâu ở đoạn code này: @ DEVICE pic16F628 @ DEVICE pic16F628, WDT_ON @ DEVICE pic16F628, PWRT_ON @ DEVICE pic16F628, PROTECT_OFF @ DEVICE pic16F628, MCLR_off @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT con trong file bạn gửi minh không thấy! File mô phỏng: http://www.mediafire.com/download/6q...mo%20phong.rar File gốc dùng LED âm chung (mã nguồn saat44.bas): http://www.mediafire.com/download/6q...mo%20phong.rar thay đổi nội dung bởi: minhthanh29, 30-11-2013 lúc 05:42 PM. |
30-11-2013, 09:35 PM | #4 |
Làm quen với PIC
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
: |
Code:
@ DEVICE pic16F628 @ DEVICE pic16F628, WDT_ON @ DEVICE pic16F628, PWRT_ON @ DEVICE pic16F628, PROTECT_OFF @ DEVICE pic16F628, MCLR_off @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT |
30-11-2013, 10:20 PM | #5 | |
Nhập môn đệ tử
Tham gia ngày: Jul 2011
Bài gửi: 10
: |
Trích:
|
|
30-11-2013, 11:12 PM | #6 |
Làm quen với PIC
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
: |
Mình phải vào file INC của dòng PIC 16F628 để thay đổi . Sau khi xem file mô phỏng của bạn , mình thấy mô phỏng không cho phép cài đặt thời gian là đúng vì khi biên dịch chương trình ta chưa set MCLR_OFF để tận dụng chân reset làm phím nhập chế độ .
Bạn thử với chương trình mình đã thay đổi xem sao . Lưu ý là mình chỉ mới set MCLR_OFF thôi , còn những cái khác mình giữ nguyên như trong file INC đã set sẵn . Mình test với mô phỏng thì thấy hoạt động . |
01-12-2013, 01:42 AM | #7 |
Nhập môn đệ tử
Tham gia ngày: Jul 2011
Bài gửi: 10
: |
File inc nằm ở thư mục nào vậy bạn
|
01-12-2013, 03:17 AM | #8 |
Làm quen với PIC
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
: |
File 16F628.inc thuộc trình biên dịch Picbasic Pro bạn ơi . Nó có dạng như sau
Code:
;**************************************************************** ;* 16F628.INC * ;* * ;* By : Leonard Zerman, Jeff Schmoyer * ;* Notice : Copyright (c) 2002 microEngineering Labs, Inc. * ;* All Rights Reserved * ;* Date : 09/27/02 * ;* Version : 2.43 * ;* Notes : * ;**************************************************************** NOLIST ifdef PM_USED LIST include 'M16F62x.INC' ; PM header device pic16F628, xt_osc, wdt_on, pwrt_on, mclr_off, lvp_off, protect_off XALL NOLIST else LIST LIST p = 16F628, r = dec, w = -302 INCLUDE "P16F628.INC" ; MPASM Header __config _XT_OSC & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF NOLIST endif LIST |
01-12-2013, 12:37 PM | #9 |
Nhập môn đệ tử
Tham gia ngày: Jul 2011
Bài gửi: 10
: |
Mình mới cài pic basic pro nhưng không thấy bạn hướng dẫn mình cách add và biên dịch được không, cảm ơn
|
01-12-2013, 01:15 PM | #10 |
Nhập môn đệ tử
Tham gia ngày: Jul 2011
Bài gửi: 10
: |
Mình thêm dòng INCLUDE <P16F628A.inc> trong file .bas nhưng nó báo lỗi
|
02-12-2013, 01:25 AM | #11 | |
Làm quen với PIC
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
: |
Trích:
Những file này sẽ nằm trong thư mục PBP thuộc ổ C . Khi biên dịch code thì phần mềm Picbasic Pro sẽ lấy file .INC , tùy thuộc vào bạn viết code cho chip nào thì Picbasic Pro sẽ lấy file .INC của chip đó . Trường hợp của bạn là 16F628.INC . File .INC giống như để khởi tạo cho chip , khởi tạo Xtal, watchdog , power on reset ...... Cho nên khi viết code , bạn không cần phải include nữa . |
|
02-12-2013, 02:03 AM | #12 | |
Nhập môn đệ tử
Tham gia ngày: Jul 2011
Bài gửi: 10
: |
Trích:
|
|
02-12-2013, 02:04 AM | #13 |
Nhập môn đệ tử
Tham gia ngày: Jul 2011
Bài gửi: 10
: |
Bạn có TeamView không add giúp mình
|
02-12-2013, 07:08 PM | #14 |
Làm quen với PIC
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
: |
|
03-12-2013, 12:22 AM | #15 | |
Nhập môn đệ tử
Tham gia ngày: Jul 2011
Bài gửi: 10
: |
Trích:
Mình làm được rồi nhưng khi chỉnh giờ nó bị giật số, rất khó chỉnh, bạn fix lại giúp mình được không http://www.mediafire.com/download/mz...0DC%20V1.2.rar |
|
|
|