ai giải thích cho mình cái này nhỉ
khi dùng : unsigned char font[] = {...}; thì chương trình báo lỗi không đủ RAM khi dùng : unsigned char const font[] = {...}; thì chương trình hết báo lỗi và dung lượng RAM giảm xuống rất nhiều. mong giúp đỡ |
Sao luồng này trầm thế nhỉ. Lâu lâu không thấy các cao thủ post bài cho bọn đàn em học tập với nhỉ
|
Trích:
Còn với cách khai báo thứ hai sẽ chỉ là một mảng các hằng số kiểu ký tự mà thôi cho nên việc bạn nhìn thấy dung lượng Ram giảm xuống rất nhiều là điều bình thường :) |
1 Attachment(s)
Trích:
|
1 Attachment(s)
Em vừa mới viết xong ct hiển thị LCD 4 bit! có hiệu ứng chữ chạy rất hay!! em post lên cho các pác tham khảo nhé! và góp ý cho em nhé!
#include <16F877A.h> #include <DEFS_16F877A.h> #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #define use_portb_lcd TRUE #include <lcd.c> const unsigned char line1[]={'H','E','L','L','O',' ','P','I','C','V','N','!','#'}; const unsigned char line2[]={'Y','H',':','T','H','O','N','G','T','R','0','6', '0','1','@',\ 'Y','A','H','O','O','.','C','O','M','#'}; void main(void) { while(true) { int I=0,y=0,k=0,z=0; delay_ms(100); // tao tre 100ms cho LCD khoi dong lcd_init(); lcd_gotoxy(1,1); while (line1[y]!='#') { lcd_putc(line1[y]); delay_ms(200); y++; } lcd_gotoxy(1,2); while (i<16) { lcd_putc(line2[I]); i++; delay_ms(200); } i=2; while (line2[z]!='#') { lcd_init(); lcd_gotoxy(1,1); y=0; while (line1[y]!='#') { lcd_putc(line1[y]); y++; } lcd_gotoxy(1,2); k=i+16; for(z=i;z<k;z++) {lcd_putc(line2[z]);} delay_ms(400); i++; } } } |
Mình thấy khai báo mảng của bạn hơi phức tạp , sao không khai báo là
const unsigned char line1[]={"Hello PICVIETNAM#"}; const unsigned char line2[]={"YH :xxx"}; vậy thì đơn giản, dễ hiểu và kết quả vẫn vậy. và hàm lcd_init(); chỉ cần dùng một lầm duy nhất là đủ,như vấy sẽ không làm cho lcd bị nháy khi hiển thị các câu khác nhau. Nếu muốn xóa trắng màn hình thì chỉ việc dùng lệnh lcd_putc("\f"); |
Có cao thủ nào có thể cho em biết công thức liên hệ giữa Resolution và Overflow trong con PIC 16F877A không?
Em dùng thạch anh 4Mhz, timer0 , Resolution : 8us, Overflow : 2ms. Nhưng em không hiểu chúng liên hệ với nhau thế nào. Em mới ra nhập làng VDK nói chung và Pic nói riêng,mong các bác giúp đỡ. |
Trích:
Chờ cả buổi mà chẳng bác nào tra lời,đi ăn xin nhiều nơi mới hiểu ra, thôi thì cứ POST lên cho anh em nào chưa rõ thì coi. Timer0 là bộ định thời có khoảng chia cho trước , các khoảng chia theo 2 lũy thừa 1 2 4 8 ... ( tùy theo chip ) Ví dụ ở câu hỏi trên của em thì câu lệnh setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // Prescale 4us,Overflow 2us có nghĩa là : cứ 4us ( 4 xung đồng hồ ) ==> 1 xung timer cứ 255 xung timer ( 8 bit ) ==> 1 lần tràn ==> timer sẽ tràn từ 0xFF -> 0x00 trong khoảng thời gian 4 x 255 = 1020 us |
Bác nào giúp em với:! Em muon truyền 1 tín hiệu 4 - 20mA bằng dây dẫn khoảng cách 1000m, đang định sd 485 nhưng nghe có vẽ ko ổn lắm, sợ nhiễu. tín hiệu thu về cũng là 4-20mA. Ko biết bác nào có cánh hay hơn ko thì giúp mình với! cảm ơn nhiều nhé!
|
Timer có nhiều kiểu chia tần, dùng chia trước và sau (prescale và postscale)
là chia trước và chia sau, có nhiều cách đặt tỉ lệ cho Timer từ 1:1 - 1:256 tức là cách chia này giúp cho ta nhận được xung kích vào Timer sẽ được chậm đi n lần ( 1:n ) so với 1Tcy (Fosc/4), và như vậy ta sẽ được xung kich chậm hơn: setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // 4Mhz => dùng dao động nội, chế độ prescal 1:4 => clock cho Timer0 la Fosc/4/4 = Fosc/16. Khi này ta có Fosc/4 => Tcy = 1us. Ttimer0 = Fosc/16 => 4us Timer0 tràn 8 bit => 4x8bit = 1024us. 8 bit có 256 trạng thái chứ không phải 255 trạng thái, do đó x256, Còn cách thứ 2 Postscale (Only Timer2) thì nó sẽ đếm số lần tràn của Timer2, Nghĩa là 1:2 - 2 làn tràn cho ra 1 lần xung ..... 1:16 - 16 làn Timer2 tràn giả sử Áp dụng với Timer2 thay Timer0 ở trên và với postscale 1:8 ta sẽ thu được đầu ra là : 4x256x8 = 8192 us |
Trích:
Những function : delay() , rs232(), i2c thì tìm ở đâu vậy ??? |
Hỏi về PWM
Oe oe, các bác lừa em nhá. Các bác bảo là tập trung mổ xẻ phần PWM làm em đọc mãi hết hai mấy trang mà thấy có mỗi 2 bài liên quan. Bác nào biết về phần này thì chỉ bảo em với ạ.
Em đang có một con step motor 4 dây (đỏ, xám- đen, vàng). Em đang tìm cách điều khiển nó (chạy, dừng, đảo chiều) nhưng mà chưa biết làm thế nào cả. Các bác cho em hỏi: 1. Em dùng 16f877 điều khiển nó có được không? 2. Cần phải có những kiến thức gì để điều khiển nó? Bác nào có tài liệu về phần này bằng tiếng Việt thì share cho em với ạ. Em cám ơn các bác ạ!!!! |
Tất nhiên dùng 16F877 được, phí phạm nữa là đằng khác.
Tài liệu tiếng Việt về stepper motor, bạn vào phần điều khiển motor trong diễn đàn này tìm. Stepper motor của bạn nếu công suất bé có thể dùng ULN lái. Tham khảo điều khiển stepper motor ở đây:http://www.interq.or.jp/japan/se-inoue/e_step.htm http://www.interq.or.jp/japan/se-ino...ture/step1.jpg |
output_high(pin_xx);
output_low (pin_xx); Hai câu lệnh trên chỉ làm cho chân ra xx là cao hay thấp, ứng với mức logic 1 hoặc 0.trong bài trên ta muốn cho sáng tất một port thì chỉ càn câu lệnh : Code:
void main (void ) |
Những function : delay() , rs232(), i2c thì tìm ở đâu vậy ???
bạn xem rõ hơn trong phần help của nó nhé, hoặc tạo new project = PIC Wizard xem trong đó có nói về Những function : delay() , rs232(), i2c ......! |
Các anh ơi giúp e với. Các anh có thể chỉ cho em cách sử dụng ngắt ngoài để đếm thời gian của sự thay đổi tín hiệu vào port B không?
|
1 Attachment(s)
cá pac ơi giúp em!! em bi lỗi gì vậy!
|
Trích:
|
1 Attachment(s)
mình cũng a thêm đấu } vào rồi nhưng cũng ko có tác dụng!! với lại mình đưa chuột tới đấu } cuối cùng đó thì nó hiện ra màu xanh và nhìn lên trên thì thấy màu xanh đó ứng với đấu { dưới hàm void main(void) !!!
mình cũng ko biết bị chuyện nữa!! |
1 Attachment(s)
Trích:
Mình đã mắc mạch theo sơ đồ này!! (chỉ có thay thạch anh 20M thôi!) |
1 Attachment(s)
Trích:
- Chưa include file lcd.c - Chú ý phép gán = và phép so sánh bằng == Việc chạy mô phỏng đúng ko hẳn thực tế sẽ đúng nhưng chạy mô phỏng sai thì chạy trên mạch thật sai là cái chắc. |
Xin loi vi chen ngang các anh
1 Attachment(s)
Em muon' cho 595 ra 8 bit 1 luc nhung lam mai khong duoc. Em sai ởi chỗ nào
do mới học em chỉ có thể nghĩ đơực như vậy thôi. các anh tối ưu code+ mạch hộ em với. ==================================== #include <16f877a.h> #use delay(clock=4M) int8 i; void input_byte(){ for(i=0;i<=7;i++){ output_bit(pin_B0,0); //1.tao xung cho pin_sck output_bit(pin_B1,i%=2);//2.dich du lieu vao luc pin_sck o trang thai suon output_bit(pin_B0,1); //3.ket thuc xung tai pin_sck } } void output_byte(){ output_bit(pin_B2,0); //1.tao xung clock cho pin_rck delay_ms(100); //2.dung lai de xem output_bit(pin_B2,1); //3.ket thuc xung tai pin_rck } void main(){ set_tris_b(0); output_bit(pin_B4,0);//khoi dong 595 pin_/OE while(1){ output_bit(pin_B3,1);//cho phep ghi du lieu pin_MR =1 input_byte(); output_byte(); output_bit(pin_B3,0);//all pin out 595= level low }//end while }// end main ========================== |
hỏi về ngắt
Các bác cho em hỏi về các loại ngắt của con 16f877 này với ạ. Tên của nó này, chế độ hoạt động của nó như thế nào (khi nào thì ngắt ấy ạ). Em gà, mới nghiên cứu pic, các bác giúp cho!
GLOBAL INT_RTCC INT_RB INT_EXT INT_AD INT_TBE INT_RDA INT_TIMER1 INT_TIMER2 INT_CCP1 INT_CCP2 INT_SSP INT_PSP INT_BUSCOL INT_EEPROM INT_TIMER0 Thanks các bác nhiều |
Hiển thị dùng 595 trên CCS
Dưới đây là một chương trình đưa một byte bằng 74hc595 dùng trên CCS
Code:
void display(unsigned char dataout) |
1 Attachment(s)
trong ct mình dùng hai file của bộ compiler: lcd.c và ds1307.c
khi biên dịch thành file .hex thì bị những lỗi về delay như thế này: Nguyên nhân do đau vậy! |
hỏi về counter
chào các Bác, Em là thành viên mới , rất mong được chào đón. mong các bác chỉ cho Em về cuonter (Em đang làm đề tài mạch đếm sản phẩm ma chưa hiểu gì về cuonter) mong các bác chỉ dùm em .cám ơn các bác nhiều!
|
em cũng muốn hỏi về counter, và cho hỏi đếm xung encoder bằng counter có được không nhỉ, bác nào làm về phần này cho em xin code & đề tài với
|
bác nào rành về timer cho em hỏi tí
em thấy các bài timer khi chương trình đã nhảy vào làm việc trong timer thì nó thực hiện lập đi lập lại trong timer mà không thoát ra ngoài. thế nếu em muốn thoát ra khỏi timer để thực hiện các lệnh khác ở ngoài vòng lập while thì làm thế nào hả các bác. ý em muốn dùng timer như ngắt ngoài vậy các bác ạ. sau khi thực hiện ngắt xong thì thoát ra để thực hiện lệnh kế tiếp. |
Chế độ ghi dịch cho cổng nối tiếp USART
Giúp em với ... em cần tiết kiệm chân của con Pic 887 , nên em muốn dùng cổng nối tiếp để truyền dữ liệu cho con 74LS164 qua 2 chân C6 va C7 của cổng nối tiếp quét 4 con led 7 đoạn , em viết mãi mà không được , mong các anh giúp đỡ .
đây là đoạn code em viết để quét 4 led 7 đoạn qua port D cua con pic ...Mong các anh sửa lại để có thể truyền dữ liệu qua 2 chân C6 va C7 giúp em .. CODE : Code:
/ |
dùng ngắt trên các chân từ rc4 -> rc7 khi chạy thì báo lỗi invalid pri_processor diẻctive.
em thấy trong các ngắt có loại ngắt này nhưng khi khai báo sao nó không hiểu nhỉ. Code:
#include<16f877a.h> |
Trích:
Thân, |
Bác nào làm về counter rồi cho em ví dụ với. Sao khi khai báo cho timer0 ở chế độ counter rồi cho xung vào chân RA4 thì không thấy gì xảy ra nhỉ:(
|
Trích:
Thân, |
Code:
#include <16F877A.h> - em khai báo biến đếm a toàn cục , như trên code - ý định của em : mỗi lần nhấn phím thì mảng key[] sẽ tự nạp số vào & nạp theo thứ tự , vì vậy , sau mỗi lần nhấn phím , em cho key[a++] - nhưng ko hiểu sao , cứ mỗi lần nhấn đúng mã số "3952610", thì ct cứ nhảy tới label HERE .. em nghi ngờ ngay chỗ so sánh mảng key[] và num_ss[] ; - chắc chắn key[] có giá trị ko đúng như các số mình đã nhấn ! các anh thấy em phân tích vậy có đúng ko ? - thứ nữa : sau mỗi lần chạy hết ct ngắt thì ko bit ct có thoát khỏi ngắt hay ko ? nhưng em nhấn phím trở lại thì LCD ko chịu hiện số nữa , chỉ khi nhấn từ 3 lần trở lên thì số mới hiện trở lại . LCD lúc ấy đang bận ? nhưng nó có làm gì đâu . Đến nhãn THOAT , chỉ việc hiện " Ready!" lên thui mà . Có lẽ tới chỗ này ct bị treo !? |
uhm ! rùi .. cuối cùng mình cũng tìm ra lỗi .
- Đúng là ngay chỗ so sánh key[] & num_ss[] ấy ! phải là : Code:
Còn cái chỗ : sau khi hết ct ngắt ,ct vẫn ko chịu thoát ra ngoài main() & đứng đợi while(1) ; cụ thể là khi bấm nút .. LCD vẫn ko hiển thị.. sau 3 lần nhấn só mới bắt đầu hiển thị --> mình vẫn chưa tìm đc nguyên nhân .! sẽ cố gắng chữa lỗi tiếp |
các bác chỉ em cách tính step size với.
|
các pác chỉ cho mình với! mình đang làm với con lm335 nhưng sao nhiệt độ của nó không có ổn định tới chênh lệch nhau tới 4 độ. các bác có cách gì chỉ cho mình với! mình đang dùng con 16F877a
|
lm35 để đo nhiệt độ cho vui thôi.phụ thuộc vào nhiều vấn đề, ko chỉ là do con lm35, AD của PIC, thuât toán của bạn.Bọn TQ nó thường dùng thuật toán tra bảng. nếu cần chính xác, ổn định thì bạn nên lhệ bác Cường Quay , mình ko nhớ là con gì, giá khoảng 40$ thì phải. bảo đảm ok luôn!
|
các bác cho em hỏi: làm thế nào để biết con slave đã nhận xong chuỗi ký tự? e dùng rs232 để truyền nhận giữa 2 con pic.
em cũng thử dùng hàm itoa để chuyển số int sang chuỗi và dùng hàm printf để truyền. bên nhận em dùng hàm atol để chuyển chuỗi về dạng int16 rồi hiể thị. nhưng kết quả hiển thị lại không chính xác. cụ thể là sau chuỗi số là các ký tự lạ. bác nào đã làm vấn đề này rồi xin chỉ giáo giúp em. nếu có code thì tốt quá |
cộng ký tự thành chuỗi
các bác cho em hỏi trong CCS mình muốn cộng các ký tự riêng lẻ thành một chuỗi ký tự thì dùng lệnh gì? bài toán của em cụ thể như sau:dùng ma trận phím 4x3 để nhập các ký tự từ 0-9 sau đó cộng các ký tự này lại thành một chuỗi.Sau đó hiển thị chuỗi này lên LCD nhưng em làm hoài mà nó cũng không chạy, khi dịch chương trình thì cũng không thấy báo lỗi gì cả.Em đã thử cho hiện từng ký tự thì chương trình chạy rất ok! nhưng khi cộng các ký tự lai bằng lệnh "key=key+k;" thi ko chạy được.
em dùng con 16F877A ,thạch anh 20MHz Code:
#include "D:\PIC PROGRAM\dk.h" |
Múi giờ GMT. Hiện tại là 12:02 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