PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   CCS C cho PIC/dsPIC phiên bản 4.xxx (http://www.picvietnam.com/forum/showthread.php?t=2296)

phu_vinh77 19-03-2011 04:01 PM

Các anh các bạn các vị tiền bối ơi, sao em đọc thấy nhiều topic nói mà ko thấy trả lời.
CCS có hổ trợ compiler cho dsPIC ko vậy ạ.
Em cảm ơn.

hamster.khin 04-06-2011 10:08 AM

giúp code điều khiển động cơ
 
Trích:

Nguyên văn bởi popeye_ts22 (Post 18497)
Chào các bác.Có chút vướng mắc,các bác giúp em với.
Mục đích:Điều khiển động cơ phản hồi tốc độ về LCD
Thực hiện:Điều khiển được động cơ nhưng chưa phản hồi đc.
Em không biết sau mỗi lần gọi ngắt có cần phải để 1 vòng while() để đợi ngắt không.
Em dùng 16F877A,bây giờ điều khiển 1 kênh đã phải cần:TIMER2-PWM,TIMER 0:Đếm xung,TIMER1:Đếm thời gian,dùng để tính toán vận tốc.
Vậy nếu em dùng động cơ thứ 2 phải làm thế nào,có thuật toán nào ko ạ.
Có đoạn code và chương trình mô phỏng,các bác xem cho em:
Code:

#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=8000000)
#include <lcd_lib_4bit.c>
int16 cnt,cnt2,xung,v;
int8 a,b,c;
#int_TIMER0
void  TIMER0_isr(void) //TIMER0 dem xung ve
{
set_timer0(255);
if(tmr0if==1)
 {
 cnt++;
 tmr0if=0;
 }
}
#int_TIMER1          //TIMER1 dem tgian,tinh van toc
void  TIMER1_isr(void)
 {
 set_timer1(5565);
 if(tmr1if==1)
  {
    xung=get_timer0()*4; 
    v=(xung*60)/((100*60*0.001));
    tmr1if=0; 
  }
 }
void Lcd()
{
while(1)
  {
  a=(int)v/100;
  b=(int)(v-a*100)/10;
  c=(int)v%10;
  LCD_putcmd(0xC0);
  LCD_putchar("xung encoder");
  LCD_putcmd(0x80);
  LCD_putchar(a+48);
  LCD_putcmd(0x81);
  LCD_putchar(b+48);
    LCD_putcmd(0x82);
    LCD_putchar(c+48);
  } 
}
void Ngat()
{
  set_timer0(255);
  setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_4);
  enable_interrupts(INT_TIMER0);
  setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
  set_timer1(5565);
  enable_interrupts(INT_TIMER1);
  enable_interrupts(GLOBAL);
  }
void PWM()
{
  setup_timer_2(T2_DIV_BY_16,255,1);
  setup_ccp1(CCP_PWM);
  setup_ccp2(CCP_PWM);
  set_pwm1_duty(1000);
  set_pwm2_duty(1022); 
}
void main()
{
  set_tris_d(0);
  set_tris_a(0xff);    //Cho tin hieu di vao RA4
  set_tris_c(0);
  LCD_Init();
  PWM();
  Ngat();
  Lcd();
  delay_ms(100);
}


bạn có thể up file lên được không cho mình xem với, mình cop code về sao không buil được file hex, xem giúp mình với !

auto_tvt 09-08-2011 12:08 AM

phần mềm lập trình cho pic Mikro-C
 
minh mới tập tành học vxl, va hiện mình Mikro-C , nhưng vì mới làm quen vxl nên lang thang trên mạng nhưng chẳng có code cho nó gì hết ah,
sao mọi người không ai dùng phần mềm này ah,
qua đây cho mình hỏi có ai dùng thi chỉ giáo cho mình với.. thanks mọi người.
mail của em: auto.tvt@gmail.com

caremlanh 09-08-2011 03:59 PM

Trích:

Nguyên văn bởi auto_tvt (Post 47940)
minh mới tập tành học vxl, va hiện mình Mikro-C , nhưng vì mới làm quen vxl nên lang thang trên mạng nhưng chẳng có code cho nó gì hết ah,
sao mọi người không ai dùng phần mềm này ah,
qua đây cho mình hỏi có ai dùng thi chỉ giáo cho mình với.. thanks mọi người.
mail của em: auto.tvt@gmail.com

tốt nhất là dùng CCS đi, ko thì HT PIC chứ Micro C chả hỏi được ai đâu

nguyenminhthi90 03-10-2011 02:28 PM

nhờ các pro chỉ giúp phần RS232
 
1 Attachment(s)
chào các bác!
em tập theo cái tuto của pác linh thì đã có thể gửi ký tự từ PC lên LCD bình thường rồi, nhưng phần ngược lại, dù có printf cỡ nào nó cũng không truyền được vào hyper terminal được ah :(. cái này em mô phỏng bên con 8051 thì ngon lành cành đào ạ, hix :|
sau đây là code của e:

#include <16f877a.h>
#include <def_877a.h>
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=9)

#include <lcd_lib_4bit.c>
//#include <input.c>

int8 count=0;
int1 t=1;

#INT_RDA
Receive_isr() {
char c;
count++;
c = getc();
putc(c);
if (c=='z')
{
LCD_putcmd(0x01); //Clear Screen
count=0;
}

if ((count<=16) && (c!='z'))
{
LCD_putchar(c);
}
if ((count > 16) && (t==1))
{
count=1;
LCD_putcmd(0xc0);
LCD_putchar(c);
t=0;
}
if ((count > 16) && (t==0))
{
count=1;
LCD_putcmd(0x01);
LCD_putchar(c);
t=1;
}
}
void main()
{

enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
lcd_init();
lcd_putcmd(0x01);
lcd_putcmd(line_1);
printf("hello!");
while (1) {}
}

em có gửi theo mấy cái file, mọi người chỉ giúp e nhé :).

ngdnhanbk 11-01-2012 02:59 AM

Trích:

Nguyên văn bởi dungnt7 (Post 17765)
Theo mình biết thì giá trị value được biểu diễn bằng 10bit, giá trị lớn nhất của value là 1024.

Value không phải lúc nào cũng nhỏ hơn period, theo datasheet thì (pwm_duty/pwm_period)=(value/(4*(tmr2+1))).

Đoạn chương trình sau xuất xung PWM 50%, f=5Khz, ở chân CCP1
void main()
{
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,249,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(512);
set_tris_c(0x00);
}


Vấn đề của bạn ngtdung.nguyen mình cũng chưa hiểu vì sao bị như vậy.

Không cần set_tris_c(0x00) liệu có ảnh hưởng gì ko bạn

ngdnhanbk 11-01-2012 03:13 AM

Trích:

Nguyên văn bởi namqn (Post 18415)
Có nhiều vấn đề liên quan đến câu hỏi của bạn mà hiện giờ tôi cũng chưa có thời gian tìm lại các tài liệu. Bạn có thể xem qua phần "Common Design Mistakes" trong tài liệu "ABCs of ADCs" của National Semiconductor (link download dưới đây), để từ đó tránh được một số lỗi thiết kế thường gặp. Điều này đôi khi có thể giúp bạn có được một thiết kế đủ tốt, chứ chưa cần đến những kỹ thuật phức tạp khác.

http://www.national.com/appinfo/adc/...Cs_of_ADCs.pdf

Thân,

Anh có thể up lại tài liệu trên được không, link die rồi ạ

DunLop 30-03-2012 12:27 PM

đo nhiệt độ dùng lm335 và 16f877a hiển thị led 7 đoạn
 
1 Attachment(s)
e mới học vdk...đang viết 1 mạch đo nhiệt độ dùng lm335 và 16f877a hiển thị led 7 đoạn
ko bik đoạn code e viết sai chỗ nào, mong ae giúp cho..thanks
# include <16f877a.h>
# fuses hs,nowdt,nolvp
# DEVICE 16f877a*=16 ADC=10
# use delay (clock=4000000)

int Maled[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X9 0};
int hc=0,hdv=0,nhietdo,giatriadc;
# int_timer1
void ngattimer()
{
set_adc_channel(0);
delay_ms(10);
giatriadc=read_adc();
nhietdo=((giatriadc-558.558)/2.048);
hc=nhietdo/10;
hdv=nhietdo%10;
set_timer1(40536);
}
void hienthi();
void main()
{
set_tris_a (0xff);
set_tris_b (0x00);
set_tris_c (0x00);
setup_timer_1(t1_internal|t1_div_by_8);
set_timer1(40536);
enable_interrupts(int_timer1);
enable_interrupts(global);
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);

while(1)
{

hienthi();
}

}
void hienthi()
{

output_high (pin_c0);
output_low (pin_c1);
output_b (Maled[hc]);
delay_ms(5);
output_high (pin_c1);
output_low(pin_c0);
output_b (Maled[hdv]);
delay_ms (5);


}

sơ đồ mạch:

lt10dkdt 06-04-2012 10:42 AM

Trích:

Nguyên văn bởi tyhon (Post 15992)
Em có đoạn code sau nhưng em không hiểu là lệnh adcHI và adcLO làm gì (với khai báo
char adcHI,adcLO).Anh nào giải thích hộ em

Code:

  while(TRUE)
        {
              adcValue = read_adc(); // Get ADC reading
 
              adcHI = (char)((adcValue >> 5)& 0x1f);     
              adcLO = (char)((adcValue & 0x1f)|0x80);   
                     
              putc(adcHI); 
              putc(adcLO); 
 
              delay_ms(10);  // Preset delay, repeat every 10ms
        }
}


em có đoạn code sau.tình hình là như thế này.em kết hợp nút ấn bên ngoài với ngắt. đoạn nhấp nháy thì oke hết rùi.nhưng khi khai báo ở void main thì toàn báo lỗi ở *case" ai biết chỉ dùm em với.em đang học về pic thôi.tim mãi mà không ra:

#include "16f877a.h"
#use delay(clock=20000000)
#int_rb

unsigned char x,i,a,b,tre;
int16 mode;

void trai()// chuong trinh con nhay trai sang
{

x=0x01;
output_d(x);
delay_ms(tre);
for(i=1;i<=7;i++)
{x=x<<1;
output_d(x);
delay_ms(tre);
}
}

void phai()//chuong trinh con nhay phai sang
{

x=0x80;
output_d(x);
delay_ms(tre);
for(i=1;i<=7;i++)
{
x=x>>1;
output_d(x);
delay_ms(tre);
}
}

void trong() //chuong trinh con nhay trong ra
{
a=0x01;
b=0x80;
for(i=1;i<=7;i++)
{
a<<=1;
b>>=1;
output_d(a|b);
delay_ms(tre);
}
}
void ngat()
{
if(input(pin_b0))
if(mode<2)mode++;//chuyen che do tang len o b0
if(input(pin_b1))
if(mode<0 )mode--;//chuyen che do tang len o b1
if(input(pin_b2))
if(tre<100) tre=tre+100;//tang thoi gian tre cho led
if(input(pin_b3))
if(tre>100) tre=tre-100;//giam thoi gian tre cho led

}

void main()
{
set_tris_b(0xff);
enable_interrupts(int_rb);
enable_interrupts(GLOBAL);

mode=0;
while (true)
case 0: trai();break;
case 1: phai();break;
case 2: trong();break;
}

yannibandari 04-05-2012 01:00 AM

mọi người ơi giúp mình với. mình tìm chương trình pic c cả ngày rồi,cài vào rồi lại xóa không biết bao nhiêu lần mà cũng không tìm ra phiên bản thích hợp. cứ mỗi lần compile cái file.c (đã chạy tốt trên máy khác,có thể phiên bản cũ) thì nó lại báo error! mình xài win 7 64bit untimate. ức chế quá!

vietthanh123 28-08-2012 05:25 PM

Trích:

Nguyên văn bởi lt10dkdt (Post 55690)
đoạn nhấp nháy thì oke hết rùi.nhưng khi khai báo ở void main thì toàn báo lỗi ở *case" ai biết chỉ dùm em với.em đang học về pic thôi.tim mãi mà không ra:

Báo lỗi vì cấu trúc của hàm case bị thiếu. Cấu trúc có nó là:
switch (cmd)
{
case 0: sthing;
break;
case 1: sthing;
break;
case 2: sthing;
break;

}

tranhien5291 04-11-2012 11:14 PM

help!!!
 
Các bác ơi cho e hỏi e cài CCS nhưng mà bị báo lỗi " Exception EInoutError in module pcwwiz.exe at 00833f6 I/O error 123 " , k biết phải làm thế nào nữa. Các pro chỉ cho e với ạ!!! e cảm ơn ạ.

huydungsh 06-11-2012 04:14 PM

các anh cho em hỏi đoạn chương trình sau co nghĩa như thế nào ak?
#int_timer0
void interrupt_timer0(){
int1 a;
int16 count;
set_timer0(56);
++count;
if(count == 500)
{
count=0;
a=~a;
RB0=a;
}


}
theo em nghĩ thì khi timer0 đêm được 200 lần( set_timer0(56); 256-56=200) thì biến cuont tăng lên 1. vậy trong quá trình chờ biến count đếm được 500 lần tương ứng với 100ms thì con pic16f877a có làm gì không? nếu làm thì khi thỏa mãn điều kiện IF thì làm sao pic có thể thực hiện các lệnh trong điều kiện đó. thanks all!

quanghuy_125 07-11-2012 01:31 AM

Trích:

Nguyên văn bởi huydungsh (Post 79132)
các anh cho em hỏi đoạn chương trình sau co nghĩa như thế nào ak?
#int_timer0
void interrupt_timer0(){
int1 a;
int16 count;
set_timer0(56);
++count;
if(count == 500)
{
count=0;
a=~a;
RB0=a;
}


}
theo em nghĩ thì khi timer0 đêm được 200 lần( set_timer0(56); 256-56=200) thì biến cuont tăng lên 1. vậy trong quá trình chờ biến count đếm được 500 lần tương ứng với 100ms thì con pic16f877a có làm gì không? nếu làm thì khi thỏa mãn điều kiện IF thì làm sao pic có thể thực hiện các lệnh trong điều kiện đó. thanks all!

Đúng theo bạn nói" timer0 đêm được 200 lần( set_timer0(56); 256-56=200) thì biến count tăng lên 1. vậy trong quá trình chờ biến count đếm được 500 lần "
Cái 100ms không tính được vì nó phụ thuộc vào xung nhịp mà mình đưa vào.
Khi count=500; thì count=0; a = đảo a; chân RB0 =a; và quá trình lại được tiếp diễn...

huydungsh 07-11-2012 01:56 AM

cảm ơn các anh đã giải thích! nguyên code là như sau:
#include <16F877A.h>
#include <DEFS_16F877A.h>
#device 16F877*=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

#int_timer0
void interrupt_timer0(){
int1 a;
int16 count;
set_timer0(56);
++count;
if(count == 500)
{
count=0;
a=~a;
RB0=a;
}


}
void main()
{
set_tris_b(0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(int_timer0);
enable_interrupts(global);
set_timer0(56);

while(true)
{
}
}
em chỉ copy ở page 1 thôi thắc ở cái đoạn đó mong các anh giải thích giúp em!! thanks all


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