PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 03-09-2008, 01:13 AM   #1
picpen
Đệ tử 5 túi
 
picpen's Avatar
 
Tham gia ngày: Jun 2008
Bài gửi: 112
:
Cool LCD_Công

trích:
Code:
cám ơn anh picpen.nhưng làm theo cách của anh thì em thấy có 1 hạn chế.có lẽ do em chưa tìm ra giải pháp.vần đề thế này.nếu dùng theo cách của anh.chương trình gọn gàng nhiểu lắm nhưng khi tốc độ thay đổi thì những số lớn sẽ ko bị mất.
vd thế này lcd hiển thị số 1111. sau đó vận tốc giảm còn 222.tức là chỉ 3 chữ số.nhưng trên lcd số thứ 4 ko bị mất.nên kết quả hiển thị là 2221.
cách làm của em thế này
Code:

 lcd_gotoxy(1,1);
      Printf( lcd_putc,"so_vong_1s:%ld",so_vong);

do em khởi tạo vị trí đầu là cố định nên có hiện tương trên!!các anh góp ý khắc phục!!
Bạn có thể khắc phục cách trên bằng cách: định dạng giá trị cần hiển thị là FLOAT, khi đó lệnh:
Printf( lcd_putc,"so_vong_1s:%f",so_vong);
sẽ in lên lcd giá trị của so_vong , khi so_vong thay đổi thì lcd in đúng giá trị,còn những số đằng sau dấu phẩy ' . ' sẽ là 000... ,cách này hiển thị đúng giá trị số vòng nhưng nhìn ko được đẹp mắt nắm
Cách khác: bạn chỉ cần chèn lệnh xóa màn hình trước khi hiển thị giá trị mới vậy là ok
__________________
** xin hãy cho tôi là tượng đá
** Để muôn đời không nhớ thương ai ..!!
picpen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-09-2008, 07:27 PM   #2
cong1810
Đệ tử 4 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 62
:
Send a message via Yahoo to cong1810
huynh PICPEN ơi.cách thứ 1 có lẽ đúng nhưng chỉ có thể giải quyết vấn đề nêu ra còn ko dùng được.bởi em có dùng đến lệnh % để lấy số dơn vị để hiển thị nên ko dùng được dạng float. cách thứ 2 cũng ko được luôn.bởi vì em cho cập nhật và hiển thị liên tục lên lcd trong vòng lặp while.có lẽ do chương trình còn ngắn nên thời gian giữa lệnh xóa và hiển thị ko đủ lớn =>lcd ko hiển thị gì hết.hì!!
lúc huynh làm thì huynh dùng cách nào vậy! có vướng phải vấn đề trên ko?

thay đổi nội dung bởi: cong1810, 04-09-2008 lúc 11:54 PM.
cong1810 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-09-2008, 01:41 AM   #3
popeye_ts22
Đệ tử 2 túi
 
popeye_ts22's Avatar
 
Tham gia ngày: Jul 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 42
:
Send a message via Yahoo to popeye_ts22
Thumbs up

Mò mẫm mãi cũng ra bài đo tốc độ,đưa xung encoder lên tính vận tốc.Lúc đầu thì encoder hỏng,sau thì tính sai 1 chỗ trong vòng ngắt.hihi.Mới học Pic nên còn gà wá...Em post bài đã làm được lên share cho bác nào cũng mới nghiên cứu PIC như em,gặp phải bài toán này hi vọng các bác sẽ ko bị mất time nữa.
Compiler: CCSC 4.065
PIC:16F877A
Encoder:100xung/vòng
Code:
Code:
#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=8000000)
#include <lcd.c>
float vantoc,soxung;
int8 a,b,c,d,a1;
int16 sovong,i;
#int_TIMER1
void  TIMER1_isr(void) 
{ 
soxung=get_timer0(); //Lay so xung Timer0 dem
set_timer1(55535);    // Trong 1ms
if(tmr1if==1)
 {
  intcon=0;               //stop ngat
  a1=1;
 }
}
void main()
{ 
   trisa=255;            //Cho RA4 di vao
   trisb=0;
   trisc=0;
   trisd=0;
  lcd_init();
  lcd_gotoxy(1,1);
   lcd_putc("Beginning....");
   delay_ms(1000);
   lcd_putc('\f');
    setup_timer_2(T2_DIV_BY_16,255,1);
    setup_ccp1(CCP_PWM);
   rd7=0;                    //Mo role,quay theo 1 chieu
for(i=0;i<1024;i++)      //0 la quay nhanh,1024 quay cham-->Do mach thiet ke.
  {
   set_pwm1_duty(i);   // Toc do giam dan
   delay_ms(1);
   set_timer0(0);
   set_timer1(55535);
   setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);  //Che do counter
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);        
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   delay_ms(50); 
if(a1==1)  
{
//while (1)
 //{
vantoc=((float)(60*soxung)/(0.01*100));  //Tinh van toc
a=vantoc/1000;                                    //Tach so..
b=(int)(vantoc-1000*a)/100;
c=(int)(vantoc-1000*a-100*b)/10;
d=(int)vantoc%10;
lcd_gotoxy(1,1);                       //Hien thi
lcd_putc(a+48);
lcd_gotoxy(2,1);
lcd_putc(b+48);
lcd_gotoxy(3,1);
lcd_putc(c+48);
lcd_gotoxy(4,1);
lcd_putc(d+48);
lcd_gotoxy(6,1);
lcd_putc("vong/ph");
lcd_gotoxy(3,2);
lcd_putc("toc do dc");
delay_ms(5);            //Vong for0->1024 nen delay it.
tmr0if=0;tmr1if=0;     //Xoa tran
}
  }
}
Chúc các bác thành công.
__________________
Best Regard.

thay đổi nội dung bởi: popeye_ts22, 05-09-2008 lúc 01:52 AM. Lý do: Edit chỉn chu.Hihi.
popeye_ts22 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-09-2008, 03:04 PM   #4
picpen
Đệ tử 5 túi
 
picpen's Avatar
 
Tham gia ngày: Jun 2008
Bài gửi: 112
:
Cool Khẩn cấp

Mọi người cho hỏi ,khi khai báo cấu hình cho pic thì lệnh này có ý nghĩa gì và hoạt động ra sao????

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

khi khai báo lệnh :" xmit=PIN_C6, rcv=PIN_C7 " thì 2 chân RC6,7 luôn ở mức cao ,ko thể sử dụng làm cổng ra được
khi mà xóa lệnh khai báo đó đi thì lại ảnh hưởng tới cổng chuyển đổi ADC .cụ thể như sau : khi mình bỏ lệnh đó đi thì mình thay đổi biến trở ở cổng vào tương tự An0 thấy điện áp tăng ko tuyến tính như khi có lệnh " xmit=PIN_C6, rcv=PIN_C7 " được khai báo .khi mới tăng biến trở từ mức 0% lên 1 it thì điện áp vào An0 đã nhảy tớ >1v ,rồi tăng vọt lên khoảng 4V ,khi này mình tăng biến trở lên thì gần như điện áp ko tăng lên được nữa .

Nói tóm lại là cổng ADC hoạt động ko còn đúng nữa
Rất mong mọi người giải thích cho .trong khi mình cần sử dụng cổng ADC và 2 chân Rc6,7 làm cổng ra

********* Cám ơn mọi người ,mình cần khắc phục vấn đề này gấp ( vì ko còn thời gian ,mình sắp phải bảo vệ rồi ) .......Thanks
File Kèm Theo
File Type: doc dung.doc (34.0 KB, 50 lần tải)
__________________
** xin hãy cho tôi là tượng đá
** Để muôn đời không nhớ thương ai ..!!

thay đổi nội dung bởi: picpen, 15-09-2008 lúc 03:11 PM.
picpen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-09-2008, 03:39 PM   #5
cong1810
Đệ tử 4 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 62
:
Send a message via Yahoo to cong1810
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) câu lệnh này là khai báo sử dụng cổng nối tiếp RS232,chân C6 là chân truyền data,C7 là nhận.tốc độc truyền là 9600 bauld.em thấy nó ko có liên quan gì đến ADC hết.chắc do chương trình mô phỏng rồi!!
cong1810 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-09-2008, 04:28 PM   #6
quocloc.pham
Đệ tử 1 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 14
:
Question CCSC 3.249 không hỗ trợ pic18xxx??

Mình viết code cho 18F452 nhưng không compiler được, nó báo lỗi "Unknown device type -- Try PCH", sau đó mình thử viết cho 18F2450,18f4550 đều bị lỗi như thế!
bạn nào biết vui lòng giúp với
mình sử dụng ccsc 3.249
quocloc.pham vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-09-2008, 12:55 PM   #7
picpen
Đệ tử 5 túi
 
picpen's Avatar
 
Tham gia ngày: Jun 2008
Bài gửi: 112
:
Trich:
Code:
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) câu lệnh này là khai báo sử dụng cổng nối tiếp RS232,chân C6 là chân truyền data,C7 là nhận.tốc độc truyền là 9600 bauld.em thấy nó ko có liên quan gì đến ADC hết.chắc do chương trình mô phỏng rồi!!
Đọc kỹ lại tài liệu thì đúng là 2 vấn đề này chẳng liên quan gì đến nhau ,và chạy mạch thực tế thì cũng ok , vậy mà khi mô phổng bằng Proteus thì lại trục trặc.... cái thằng Proteus này nắm lúc nó giở trứng kỳ quặc quá ,sau khi cài lại proteus chạy thì lại ok ,nó làm mình hú vía giờ thì ổn rùi
__________________
** xin hãy cho tôi là tượng đá
** Để muôn đời không nhớ thương ai ..!!
picpen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-09-2008, 11:16 AM   #8
leejongfan
Nhập môn đệ tử
 
Tham gia ngày: May 2008
Bài gửi: 8
:
Cho em hỏi: có cách nào convert tu CCS sang Mikro C ko ah?
leejongfan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-10-2008, 10:23 PM   #9
cong1810
Đệ tử 4 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 62
:
Send a message via Yahoo to cong1810
em khai báo chế độ power pwm cho pic18f4431.hoạt động ở chế độ independent.vậy mà khi set_power_pwm3_duty();cho các chân thì CCS C báo là undefined identify cho các chân 1,3,5. còn các chân 0,2,4 thì ok.vậy em phải khai báo thêm cho nó ở chỗ nào.
các anh giúp với ạ!!
cong1810 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-10-2008, 10:38 PM   #10
cong1810
Đệ tử 4 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 62
:
Send a message via Yahoo to cong1810
hình như không có cách nào làm theo yêu cầu em muốn được.bởi trong data sheet thì chỉ có 1 thanh ghi duty cycle cho 2 chân 0 và 1 .tức là 2 chân này sẽ xuất xung giống nhau ở chế độ independent!! các huynh check lại dùm đệ xem đúng vậy ko!!?
cong1810 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-10-2008, 10:53 PM   #11
cong1810
Đệ tử 4 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 62
:
Send a message via Yahoo to cong1810
các anh ui!! ai có file def_18f4431 .cho em xin với nhé.nếu chưa có thì chắc em phải mần hết 1 ngày quá!! thanks các huynh!!
cong1810 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-10-2008, 03:24 PM   #12
bean984
Đệ tử 3 túi
 
Tham gia ngày: Dec 2007
Bài gửi: 51
:
giúp mình với!!!!
ai rành về counter xin chi mình cách thiết lập timer ở chế độ đếm?nếu có code thì tốt quá!!!
có phải cứ có 1 xung đếm thì timer sẽ ngắt 1 lần?
mình thử viết như thế này nhưng k thấy nó chạy j cả.
Code:
#include "16F877A.h" // PIC16F877A header file
#device 16F877A*=16 ADC=10
#include <defs_16F877A.h>
#fuses HS, NOWDT, PUT, NOPROTECT, NOLVP // for debug mode
#use delay(clock=8000000) // for 4Mhz crystal
#use fast_io(b)

int16 count0;
int8  b0;
///////////////////////////////////////////////////////////
#INT_TIMER0
TIMER0_ISR()
{
   ++count0;
   if (count0==100)
      {
        count0=0;
        b0=b0+1;// dich trai a 1bit
        //portd=170;
      }
   if (b0==2)
      {
        b0=0;
        count0=0;
        //HTGT0=1;
        portb=0;
        //portd=252;
        disable_interrupts(int_timer0);
      }
}
/////////////////////////////////////////////////////////////////////
void main(void)
{
   set_tris_a(255); // Chi co dau vao tuong tu
   set_tris_b(0);
   set_tris_d(0);
   portb=255;
   //portd=255;
   count0=b0=0;
   enable_interrupts(global);
   enable_interrupts(int_timer0);
   setup_TIMER_0(RTCC_EXT_L_TO_H );
   setup_COUNTERS(RTCC_EXT_L_TO_H,RTCC_DIV_2);
   set_TIMER0(1);
   while(true)
   {
      
   }
}
chương trình của mình định thử là nếu đếm đc 200 xung thì tắt hết led ở portB.nhưng khi thử k thấy có hiện tượng j cả.
bean984 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-10-2008, 12:50 AM   #13
cong1810
Đệ tử 4 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 62
:
Send a message via Yahoo to cong1810
Trích:
Nguyên văn bởi bean984 View Post

Code:

   if (b0==2)
      {
        b0=0;
        count0=0;
        //HTGT0=1;
        portb=0;
        //portd=252;
        disable_interrupts(int_timer0);
      }
}
có lẽ là do đoạn code trên bạn ạ. bạn nhầm tại câu lệnh "disable_interrupts(int_timer0);" có phải bạn muốn xóa cờ ngắt cho lần tiếp theo nhưng câu lệnh trên là xóa bit enable cho ngắt timer0. bạn đọc kĩ lại help CCS C và datasheet của 877a nhé. xem mình có đúng ý bạn ko!! good luck!!
cong1810 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-10-2008, 06:47 PM   #14
bá vinh
Nhập môn đệ tử
 
Tham gia ngày: Oct 2008
Bài gửi: 2
:
chào các bác
các bác cho em hỏi la:khi viết bàng CSS ma mình sài chức năng UART voi máy tinh. ma khi khai báo ngắt của no thi không bao giờ dược cả ,vi khi dó nó sẽ báo là ngắt toàn cục bị cấm trong khi chương trình chính đang thực hiện :
vd:
puts i

ma trong khai báo ngắt
#int_tbe()
{
led=!led;
}

thi không bao giờ led nay chớp tăt nghĩa la nó không bao giờ nhảy vao ngát la so vây.
mình thi sử dụng được hết các chức năng khác nhưng chỉ con ngắt của Uart la không sai dược, bực mình quá.
nhưng mình viết bằng hợp ngữ thi ok.
mong cac bác chỉ giáo .
bá vinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-11-2008, 07:17 PM   #15
dientudong
Đệ tử 5 túi
 
Tham gia ngày: Oct 2008
Bài gửi: 95
:
Smile

các bạn cho mình hỏi về đoạn code này :khai báo hàm if(tmr1if==1) sao ki vay tmr1if là gì vậy.Với intcon là gì vậy ? Cảm ơn các bạn .Mình còn yếu.
//////////////////////////////////khai bao va chuong trinh ngat cho TIMER1
#int_TIMER1
void TIMER1_isr(void)
{
soxung=get_timer0(); //Lay so xung ma Timer0 dem
set_timer1(55535); // Trong 1ms
if(tmr1if==1)
{
intcon=0; //stop ngat
a1=1;
}
}
dientudong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 09:36 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam