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)
-   -   Pic16f877a TỪ DỄ TỚi KhÓ (http://www.picvietnam.com/forum/showthread.php?t=238)

vtt 07-09-2006 11:42 PM

Bác nào chỉ giùm tôi với!
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define RunningLed RD2
int8 ch;

void main(void) {

//Output_high(PIN_D2);
RunningLed = 1;
while(true){
ch = getc();
if (ch == 0) {
putc(ch);
}
else {
ch = ch + 1;
putc(ch);
}
}
}
Trên đây là chương trình tôi viết thử để giao tiếp với PC, nhưng không được.
Có hai điều tôi muốn hỏi các bác!
- Tại sao khi tôi dùng lệnh RunningLed = 1; ở trên thì mạch lại không chạy ( tức là chân RD2 không tích cực mức cao). Còn khi tôi dùng lệnh output_high(PIN_D2) thì lại được.
- Tôi dùng chương trình mô phỏng giao tiếp nối tiếp của CCS và chạy thử chương trình trên thì không được
Bác nào bớt chút thời gian trở lời giúp được không!
Bác nào có thể post cho tôi một chương trình giao tiếp với PC được không, cả trên PC lẫn chương trình của PIC

namqn 07-09-2006 11:50 PM

Trích:

Nguyên văn bởi vtt (Post 4828)
Bác nào chỉ giùm tôi với!
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define RunningLed RD2
int8 ch;

void main(void) {

//Output_high(PIN_D2);
RunningLed = 1;
while(true){
ch = getc();
if (ch == 0) {
putc(ch);
}
else {
ch = ch + 1;
putc(ch);
}
}
}
Trên đây là chương trình tôi viết thử để giao tiếp với PC, nhưng không được.
Có hai điều tôi muốn hỏi các bác!
- Tại sao khi tôi dùng lệnh RunningLed = 1; ở trên thì mạch lại không chạy ( tức là chân RD2 không tích cực mức cao). Còn khi tôi dùng lệnh output_high(PIN_D2) thì lại được.
...

Đã dùng được output_high(PIN_D2) thì tại sao còn phải tìm cách khác! Cách dùng này là chuẩn đối với CCS.

Trong tập tin "DEFS_16F877A.h" bạn có định nghĩa RD2 hay không? Nếu có thì định nghĩa như thế nào?

Thân,

vtt 08-09-2006 10:52 AM

Cảm ơn bác nhiều!
dùng output_high(PIN_X) nhiều khi thấy bất tiện, con thu vien DEFS_16F877A.h là mình load trên diễn đàn này.
Bác cho hỏi luôn tại sao tôi viết như trên dùng Serial Input/output monitor thì không test được?

linhnc308 08-09-2006 06:01 PM

ch = getc();
if (ch == 0) {
putc(ch);

bạn không mô phỏng được vì nếu bạn nhập thử vào màn hình đen phim 0 thì nó gửi xuống là mã ASCII của số 0 = 0x30h. bạn thử nhập vào mục Hex Send xem.

Một điều nữa là check lại phân setting cổng COM

leduy173 08-09-2006 06:07 PM

bac NTC cho them tut ve LCD di.thanks bac NTC cai tut ve RTC nha,doc de hieu lam.h dang lam thu voi no

falleaf 09-09-2006 01:01 PM

Hiện nay F đang giao cho NTC làm về phần truyền thông, vì vậy chắc chưa có thời gian làm tutorial về LCD. Tuy vậy, hiện nay trong luồng Lập nhóm 877 bạn nhh đang viết các tài liệu hướng dẫn mô phỏng và thiết lập LCD cũng như LED 7 đoạn khá hay, bạn có thể theo dõi ở đó.

Chúc vui.

vtt 09-09-2006 05:18 PM

Cảm ơn linhnc308!
Tôi thực sự thấy mình ngu dốt, tôi có về thử lại nhưng vẫn không được, bực quá tôi viết thử lại môt chương trình test đơn giản khác để thử mà vẫn không được. Tôi gửi một số hex vào thì nhận được mốt số hex khác và toàn là số 0 (0x00h), chân RXT trên Serial Input/output monitor sáng liên tục. Bác có thể chỉ giùm tôi cái lỗi của tôi được không?
Dưới đây là đoạn chương trình mà tôi viết lại.
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define RunningLed RD2
int8 ch;

void main(void) {

Output_high(PIN_D2);
//RunningLed = 1;
while(!true){
ch = getc();
if ((ch >= 0x30)&(ch <= 0x7A)){
putc(ch);
}
}
}
Bác nào đã test giao tiếp PIC với PC rồi xin chỉ giáo để tử ngu dốt này với!

nevergoback1001 10-09-2006 09:39 AM

Tôi không thấy đoạn code của bác bị gì cả! Copy- past vào CCS C là chạy bình thường trừ 1 lỗi: bỏ dấu "!" trước true trong vòng lặp while, vì not true nghĩa là false mà false thì biết bao giờ nó mới thực thi! (He he he)
Nếu sửa lại mà vẫn ko chạy thì bác xem lại modul giao tiếp với PC ( hổng biết có mắc lộn chân Tx với Rx hay ko?

vtt 10-09-2006 11:36 PM

Cám ơn bạn
Tôi đã sử lý tạm thời được rồi, nhưng không hiểu tại sao tôi chỉ truyền một ký tự mà nó đáp lại hàng đống ký tự. (khoảng chục ký tự thì nó mới dừng lại).

nevergoback1001 11-09-2006 01:20 AM

Tối viết tạm 1 chương trình đơn giản mà bạn có thể test được!
Chương trình trên PC viết bằng VB, còn chương trình trên PIC thì bạn có thể lấy ngay đoạn code của bạn đã viết đó ( Tôi đã thử rồi nếu như ko có gì trục trặc thì OK hết, nếu có gì trục trặc thì tôi bó tay. He he!). Bạn nhập số hay kí tự vào ô text2, thì PIC sẽ trả kết quả vào ô text1 sau khi nhấn command1. VD: bạn nhập vào đó chữ 'A' hay số '80' thì sau khi nhấn command1 ô text1 sẽ hiện chữ 'A' hoặc '80'.
Việc nhập số hay kí tự thì bạn tự tìm hiểu thêm về việc truyền thông nối tiếp vậy, vì không phải nhập cái gì cũng được đâu, nó sẽ báo lỗi tè lè đấy, bạn có thể phân tích kĩ đoạn code tôi viết để hiểu thêm ( rất đơn giản!)
Good luck!!

nevergoback1001 11-09-2006 01:23 AM

1 Attachment(s)
Ý quên tôi chưa up code lên sorry nhé!
Giờ mới up nè!

vtt 14-09-2006 08:47 PM

Cảm ơn Nevergoback1001!
Tôi sẽ về thử, có gì xin sự chỉ giúp của bạn!
Thank!

ngulapphuong 15-09-2006 12:32 PM

các cao thủ có tài liệu và code, sơ đồ nguyên lý về giao tiếp pic với SPI EPROM cho em share với

briantk_1988 26-09-2006 06:28 AM

Chào bác ntc,

Sao cháu không thấy bác post phần RS232 cho Pic16f877a? Mặc dù cháu biết viết RS232 bằng CCS C nhưng ASm thi chịu. Mong bác giúp đỡ.

Thnx

B

huunam 27-09-2006 10:23 PM

trong bai test cho portB cua pic16f877a, em viết code giống hệt nhu bác ntc nhưng vẫn 'build failed' , va báo lỗi sau:

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F877A "f877atemp.asm" /l"f877atemp.lst" /e"f877atemp.err" /o"f877atemp.o"
Message[302] C:\PROGRAM FILES\MICROCHIP\MPASM SUITE\TEMPLATE\CODE\F877ATEMP.ASM 27 : Register in operand not in bank 0. Ensure that bank bits are correct.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPLink.exe" "C:\Program Files\Microchip\MPASM Suite\LKR\16f877a.lkr" "C:\Program Files\Microchip\MPASM Suite\Template\Code\f877atemp.o" /o"NAM.cof" /M"NAM.map"
MPLINK 4.05, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - section '.org_0' can not fit the absolute section. Section '.org_0' start=0x00000000, length=0x00000012
Errors : 1

BUILD FAILED: Wed Sep 27 21:12:59 2006

em không hiểu lỗi gì , mong cac bác chỉ giúp.
Đây là code của em :


;************************************************* *********************
;
; Filename: testportb.asm
; Date: 25/9/2006
; File Version: 1
;
; Nguoi thuc hien : huunam
;************************************************* *************************** *


list p=16f877A ; khai bao thiet bi
#include <p16f877A.inc> ;file header dinh kem

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC& _WRT_OFF & _LVP_ON & _CPD_OFF

;khai bao configuration bit

;************************************************* *********************
; chuong trinh bat dau tai day
ORG 0x000 ;
GOTO start
start
BCF STATUS,RP1
BSF STATUS,RP0 ;chon bank1

CLRF TRISB ;khoi tao portb la cong xuat du lieu

BCF STATUS,RP1 ; chon bank0
BCF STATUS,RP0
MOVLW b'10001111' ;ghi gia tri can xuat ra portb
MOVWF PORTB ;PORTB<8Fh
loop
GOTO loop ; vong lap vo han

END ;ket thuc chuong trinh


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