![]() |
PIC18F2620 + rs232
Mình thường thấy trong các sample CCS code, thường sử dụng giá trị 20Mhz cho delay:
#use delay(clock=20000000) Mình hiểu là dùng chỉ thị này khi dùng delay_ms() function nhưng chưa hiểu hết ý nghĩa thực sự của nó Mình dùng PIC8F2620, đọc datasheet thì thấy tần số hoạt động của nó là 8Mhz. Vậy mình sẽ sửa lại #use delay(clock=8000000) thì có đúng hay không. Hiện mình đang lập trình để send key từ hyperterminal của máy tính đến cổng RS232 và muốn nó print lại ký tự đó lên màn hình terminal. Nhưng vẫn không được. Và không biết là làm sao để xác định được mình đang sai ở đâu. (dùng picdem 2 plus , board màu đỏ, CCS version 4.017) #include <18F2620.h> #include <stdio.h> #fuses HS,NOWDT,PUT,NOPROTECT,NOLVP #use delay(clock=20000000) #use rs232(BAUD=9600,parity=N,XMIT=PIN_B1, RCV=PIN_B4,bits=8,stream=pc) #define KEYHIT_DELAY 500 // in milliseconds void main() { char c; while(1){ c= getch(); putc(c); delay_ms(100); } } |
Trích:
dùng để báo cho trình biên dịch biết tần số thực của xung clock ở mạch ứng dụng thực. Từ đó trình biên dịch sẽ tính ra được số chu kỳ máy cần chờ tương ứng với một giá trị delay nào đó trong chương trình. Bạn phải xem trên board PICDEM 2 Plus đó có tần số của bộ dao động hay thạch anh nối vào PIC18F2620 là bao nhiêu, dùng giá trị đó (đổi thành Hz) và thay vào chỗ 20000000 trong khai báo trên. Thân, |
Đoạn chương trình như sau
#include <18F2620.h> #device icd=true #use delay(clock=20000000) #fuses HS,NOWDT #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8) main() { char c; int i; while(true) { c=getch(); for(i=0;i<3;i++){ putc(c); delay_ms(100); } } } dùng mttty để connect thì được, mỗi lần nhấn phím nó đều hiển thị thêm 3 ký tự. Tuy nhiên ký tự in ra lại giống chữ đ hơi cong, chứ không hiển thị ra ký tự mà mình đã nhấn. Nếu dùng hyper terminal của windows thì ko thấy gì cả và cũng không nhấn phím được. mặc dù đã chọn 9600, 8 bit, no parity,stopbit=1 Và 1 điều nữa là dùng hyper terminal thì rất dễ bị treo máy khi connect. (dùng picdem 2 plus , board màu đỏ, CCS version 4.016) Xin cho biết mình đã sai ở chỗ nào ạ. |
Có một vài điểm bạn cần làm rõ trước khi có thể giúp bạn xác định nguyên nhân gây lỗi:
1. Bạn có sử dụng ICD hay không? Nếu có thì là ICD của Microchip hay của CCS? 2. Tần số của bộ dao động hay thạch anh trên board PICDEM 2 Plus (còn có trường hợp dao động bằng RC nữa)? Thân, |
Mình dùng ICD 2 của microchip, còn tần số dao động của picdem 2 plus thì không biết tra thế nào cả. Nếu khai báo trong source code để 20Mhz thì còn nhận được ký tự(dù sai), còn để 40Mhz thì hoàn toàn ko nhận được. picdem của mình màu đỏ hình như khác với datasheet của loại màu xanh và search loại màu đỏ hình như nó cũng để là 40Mhz.
|
Trích:
Một cách rất đơn giản để xác định tần số xung clock là bạn lấy ví dụ nháy LED, chọn một tần số xung clock nào đó (1 MHz chẳng hạn) và đặt thời gian trễ giữa các thao tác bật/tắt LED là 1 giây trong chương trình nguồn. Sau đó dịch, nạp, và chạy thử, đo thời gian trễ thực sự giữa các thao tác bật/tắt LED, bạn sẽ tính được tần số xung clock thực. Lần trước tôi nhìn không kỹ, socket 28 chân vẫn được cấp chung các nguồn clock như 2 socket kia. Xin đính chính lại! Thân, |
board của mình đã được hàn con thạch anh 4Mhz vào rồi. thấy đề là OSC-2003 4.000MHZ BURNON (vị trí số 10 như trong user guide)
Đây là đoạn code mình viết và bấm theo đồng hồ thể thao thì mỗi cái nhấp nháy nó chính xác 1 giây: #include <18F2620.h> #fuses HS,NOWDT,PUT,NOPROTECT,NOLVP #use delay(clock=20000000) #define preload 57723 static int counter =0; #int_timer0 void intval() { static unsigned char i=0xBB; static int flag = 0; rotate_right(&i,1); output_b(i); } void main() { int status; char value; setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); set_timer0(preload); enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); output_b(0xff); status=1; while(1) ; } |
Vị trí số 10 là oscillator. Bạn đã xác định được tần số của bộ dao động rồi thì dùng giá trị 4 MHz đó khi setup các thông số clock cho delay, rs232 chẳng hạn.
Khi dùng oscillator thì thiết lập #fuses là EC hay EC_IO cho phần clock, chứ không dùng HS hay XT. Ngoài ra, tần số clock được bạn thiết lập khi tạo project (chẳng hạn như dùng Project Wizard). Thân, |
Tuyệt vời. problem solved.
Tất cả là do set tần số không đúng. Cảm ơn bác namqn nhiều. |
Múi giờ GMT. Hiện tại là 03:59 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam