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)
-   -   Học CCS thông qua Tutorial PICVIETNAM (http://www.picvietnam.com/forum/showthread.php?t=689)

FFGmember 18-10-2006 05:20 PM

Học CCS thông qua Tutorial PICVIETNAM
 
Đã lâu lâu không đóng góp cho PIC Việt Nam gì rồi. Đợt này tự nhiên công việc liên quan đến PIC, yêu cầu đến việc sử dụng SPI, nhào zô luôn cho việc học CCS. Mong mỏi đóng góp chút gì đó cho tất cả mọi ngưòi.


1. Mục tiêu của việc học CCS:
• Sử dụng được CCS programmer
• Ứng dụng được chương trình hiển thị LCD
• Ứng dụng được chương trình kết nối SPI với EEPROM và MMC card. hiển thị các thông số lên LCD .


2. Nguồn tài liệu và công cụ làm việc:
• Theo tutorial của Linhnc308: http://www.picvietnam.com/forum//att...6&d=1157644591
• Chương trình CCS: down load ban CCS3.249.rar. http://www.tailieuvietnam.net/downlo...CCSC_3.249.rar
• Chương trình Proteus. 6.7

FFGmember 18-10-2006 05:47 PM

Ví dụ 1: thực thi bài nhấp nháy led
 
1 Attachment(s)
Bước 1: tạo một project mới test1 trong thư mục project1 ( CCS -> Project -> New -> PIC Wizard )
Bước 2: Copy paste đoạn code của Linhnc308 vào trong mục file test1.c

Trích:

#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
void main()
{
// Thiet lap che do cho PORTB
TRISB = 0x00; // Tat ca PORTB deu la cong xuat du lieu
PORTB = 0xFF; // Tat het cac LED
While(1)
{
PORTB = 0; // Cho các LED sáng
delay_ms(250); // T.o th.i gian tr. 250ms
PORTB = 0xFF;
delay_ms(250);
}
}
Bước 3: Compile Unit ( F9 ) => chương trình báo lỗi, không có def_877A trong thư mục PICC/Device/ . Đọc lại bài hướng dẫn thấy có nói def_F877A là file khai báo thanh ghi của người sử dụng. Search một hồi trong diễ đàn cũng tìm được file def_876 -> chỉnh sửa rename rồi copy vào PICC/Device . Compile lại => chuơng trình chạy OK.
Bước 4: Quay trở lại đường link thư mục ban đầu …./Project1 check xem có file gì mới ko, file hex đã được tạo trong này rồi
Bước 5: Bật chương trình Proteus lên lắp mạch như linhnc308 => chỉnh thông số tần só thạch anh là 4Mhz rồi nạp file hex vào => chạy. Chương trình chạy OK

Túm lại : kết thúc VD1 này tôi đã thu được:
• Năm bắt được thành thạo các bước thực thi của CCS : tạo project mới, tạo file mới, các compile chương trình
• Nắm được cấu trúc khung cảu chương trình CCS, cách khai báo ban đầu
• Gợi nhớ lại Proteus 6.7 vì đã lâu lắm rồi ko sờ đến nó, chuẩn bị cho các Project tiếp theo.

Vi du 2, 3 ve` LCD, SPI den toi' giai quyet tiep.

FFGmember 19-10-2006 12:40 AM

Project2: Hiển thị lên LCD dùng lcd_lib_4bit.c
 
1 Attachment(s)
LCD cùng với led đơn và led 7 thanh là một trong những phương thức để hiển thị các kết quả các thông số. Thông thường tôi luôn chọn LCD vì lập trình đơn giản và đông thời có thể thể hiện được các giá trị mà mình mong muốn.

Có rất rất nhiều source code cho việc viết LCD 4 bit. Và một trong số đó là file lcd_lib_4bit.c đã đươc linhnc308 giới thiệu trong tập tutorial của mình

Lại thực thi các bước như ở trên, với đoạn code dưới đây.

PHP Code:

#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c> // Thu vien ham cho LCD

void main()
{
trisa 0xFF;
trisb 0x01;
trisd 0x00;
LCD_init();
Printf(LCD_putchar," PICVIETNAM tut");
LCD_putcmd(0xC3);
Printf(LCD_putchar," LCD 4bit ");



Khi lập trình đến LCD 4bit sử dụng lcd_lib_4bit.c cần lưu ý đến 2 điều
  • Chân nối đã được fix sẵn trong hàm lcd_lib_4bit.c, khi thay đổi chân cho phù hợp với việc thiết kế mạch là coi như đã thay đổi cả với các chương trình mình dùng truóc đó.
  • Trong chương trình sử dụng đến lệnh LCD_putcmd( 0xC3) chính là chỉ vị trí con trỏ cho việc hiển thị đoạn text. 0xC3 là vi tri thu 4 của dòng thứ 2

FFGmember 19-10-2006 04:30 AM

Project 1: Kết nối PIC 16F877A với EEPROM 25AA640.
 
Sorry mọi người là tối hôm nay em tìm mỏi cả mắt mà không thấy bất cử một thằng EEPROM nào có chuẩn giao tiếp SPI, cho nên ở Project này em chỉ xin được làm chay thôi, ai có điều kiện mạch thật hoặc có trình giả lập tốt thì xin test + đưa ra ý kiến cho em phát.

SPI là một chuẩn dữ liệu giao tiếp đơn giản nhất có tốc độ lớn nhất, tuy nhiên có độ an toàn không cao khi mà dây clock bị ảnh hưởng => dẫn đến ảnh hưởng đến toàn hệ thống.
Với PIC16F877A thì có 3 chân cho chế độ SPI đó là: RC3( clock ), RC4 ( SDI ), RC5 ( SD0) , còn chân select chíp thì lấy bất cứ một chân I/O thông thường.

Cơ chế SPI là quá trình dịch bít qua lại giữa Slave và Master qua 2 đường đây SDI, SDO. Ứng với mỗi IC khác nhau lại cho một chuẩn truyền tiếp riêng để điều khiển quá trình truyền. Với EEPROM 25AA640 cơ chế đó là:

Đọc byte:
Truyền lệnh 0000011 tiếp đến là truyền địa chỉ 16 byte, và đọc dữ liệu . Khi chân CS lên 1 => cũng là lúc báo hiệu kết thúc đường truyền.


http://i33.photobucket.com/albums/d5...7A/hinh1-1.jpg



Write byte
Viết lệnh command: 00000010, sau đó truyền địa chỉ 16 bit, rồi bắt đầu truyền dữ liệu. Quá trình truyền kết thức khi CS = 1


http://i33.photobucket.com/albums/d5...7A/hinh2-1.jpg


PHP Code:

void main()
{
// init ban dau
   
OUTPUT_LOW(PIN_C2);       
   
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
   
OUTPUT_HIGH(PIN_C2); 
   
delay(5);   
   
// truyen du lieu co gia tri 0x55 xuong eeprom tai dia chi 0x0004    
   
OUTPUT_LOW(PIN_C2);      
   
spi_write(0x02);        // command = 0x02 -> ghi du lieu
   
spi_write(0x00);
   
spi_write(0x04);
   
wpi_write(0x55);
   
OUTPUT_HIGH(PIN_C2); 
   
delay(5);
   
// Doc du leu
   
OUTPUT_LOW(PIN_C2);      
   
spi_write(0x03);       // command -= 0x03 -> doc du lieu
   
spi_write(0x00);
   
spi_write(0x04);
   
wpi_read(buff);
   
OUTPUT_HIGH(PORTD); 
   
delay(5);   
   
   while(
1);



Code trên hoàn toàn chỉ là ý tưởng như thế, ai có điều kiện hoặc đã làm rồi xin cho đôi lời.
Lâu lâu ko đựoc làm đến pic , nay còn được làm trên CCS nữa thấy thật thoải mái.

See Ua!

IMI 30-10-2006 11:47 AM

Quá hay. Và quá chi tiết.

anhquangngai 02-11-2006 08:12 PM

vậy muốn viết cho led đơn sáng dần và xoay phải xoay trái thì làm thế nào?
mình mới làm quen với CCS nên ko biết nhờ bạn giúp cho!

nhh 05-11-2006 09:53 AM

Trích:

Nguyên văn bởi anhquangngai (Post 5771)
vậy muốn viết cho led đơn sáng dần và xoay phải xoay trái thì làm thế nào?
mình mới làm quen với CCS nên ko biết nhờ bạn giúp cho!

http://www.picvietnam.com/forum//showthread.php?t=357
Tài liệu mô phỏng bạn hỏi ở đây:
http://www.picvietnam.com/forum//sho...p?t=406&page=2 Dưới cùng, bài của anh F có link.

anhquangngai 07-11-2006 04:13 PM

Trích:

Nguyên văn bởi nhh (Post 5813)
http://www.picvietnam.com/forum//showthread.php?t=357
Tài liệu mô phỏng bạn hỏi ở đây:
http://www.picvietnam.com/forum//sho...p?t=406&page=2 Dưới cùng, bài của anh F có link.

trong này ko có led sang dan !

nhh 08-11-2006 08:36 AM

Trích:

Nguyên văn bởi anhquangngai (Post 5846)
trong này ko có led sang dan !

Muốn làm led sáng dần, tức là bạn phải làm cho điện áp cấp vào chân led tăng dần.

Hãy sử dụng chức năng PWM điều chế độ rộng xung, nhưng trước hết bạn phải học cách sử dụng các Timer, Timer 2 phục vụ PWM.

thaithienanh 08-11-2006 09:40 PM

anh REMMEMBER ơi viết tiếp bài nữa đi

necati 14-11-2006 05:18 AM

http://rapidshare.com/files/2849523/...d_regfiles.rar

tranhuyky 14-11-2006 04:14 PM

Bước 5 mình bí rồi
 
gởi bạn FFGmember
Mình đã làm thử vd1 theo hướng dẫn của bạn rồi, nhưng tới bước 5 thì bí. Mình không biết cách nạp file hex vào trong proteus. Bạn hướng dẫn kỷ hơn cho mình được không. Cám ơn bạn trước nha.

anhquangngai 03-12-2006 07:01 PM

cho em hỏi về vòng lặp while
 
các bác có thể cho mình biết cách sử dụng vòng lặp while dc ko?
chương trình mình viết như sau nhưng vòng lặp while ko thực hiện đc
Code:

int8 a,b;
main()
{
while(a==8){
a++;
portb=00;
delay_ms(100);
portb=0xFF;
delay_ms(100);
}

em sử dụng như thế mà sao vòng lặp while ko chạy?

namqn 03-12-2006 07:15 PM

Bên ngoài vòng while nên khởi tạo giá trị cho biến a. Điều kiện lặp là a==8 do đó nếu giá trị a ban đầu không phải là 8 thì vòng lặp không chạy. Nếu vòng lặp có chạy thì chỉ chạy 1 lần, vì bên trong vòng lặp a bị thay đổi.

Thân,

anhquangngai 03-12-2006 09:10 PM

vậy nếu như chương trình gán biến a=8 thì vòng lặp sẽ ko lặp 8 lần
vậy thì chương trình này phải viết lại như thế nào??
PHP Code:

int8 a;
a=8;
main()
{
while(
a==8){
a++;
portb=00;
delay_ms(100);
portb=0xFF;
delay_ms(100);


và như vậy nếu như lệnh a++; ko dc thực hiện thì ko lặp dc 8 lần
nhưng vòng lệnh for thì thực hiện lặp 8 lần dc
PHP Code:

for(a=0;a<8;a++){..........} 


namqn 03-12-2006 09:20 PM

Code của bạn chỉ cần sửa lại thành

Code:

int8 a,b;
main()
{
a = 0;
while(a<8){
a++;
portb=00;
delay_ms(100);
portb=0xFF;
delay_ms(100);
}

Thân,

anhquangngai 04-12-2006 09:15 PM

anh namqn cho em hỏi luôn cái chương trình này:
Code:

//Chuong trinh led sang don o PORTB
/*ket qua o PORTB là:00000001,00000010,00000100,00001000,00010000,00100000,01000000,10000000,10000001,10000010,10000100,10001000,.....cuoi cung thi PORTB=0xFF */
#include<16F877A.h>
#include<def_16f877a.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)
int8 sck,slx,bienxoay,bienluu,giatri;
main()
  {
      trisb=0;
    while(true){
      sck=8;
      portb=0;
      delay_ms(100);
      while(sck<1)
        {
            bienxoay=0;
            slx=sck;
          while(slx<1)
              {
              bienxoay=bienxoay<<1;
              giatri=bienluu|bienxoay;
              portb=giatri;
              delay_ms(100);
              slx--;
              }
          bienluu=giatri;
          sck--;
        }
      }
  }

chương trình em viết như thế nhưng sao nó ko chạy và ban đầu em gán cho biến sck=8 thì trong dk while nó có chạy hay ko?
Cảm ơn anh trước!
Em mới học nên ko hiểu!

namqn 04-12-2006 11:18 PM

Có lẽ chương trình chạy đúng theo những gì bạn viết đó chứ.

Chương trình nên được sửa lại thành:

Code:

//Chuong trinh led sang don o PORTB
/*ket qua o PORTB là:00000001,00000010,00000100,00001000,00010000,00100000,01000000,10000000,10000001,10000010,10000100,10001000,.....cuoi cung thi PORTB=0xFF */
#include<16F877A.h>
#include<def_16f877a.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)
int8 sck,bienxoay;
main()
  {
      trisb=0;
    while(true){
      sck=8;
      portb=0;
      delay_ms(100);
      bienxoay=1;
      while(sck>0)
        {
              portb=bienxoay;
              bienxoay=bienxoay<<1;
              delay_ms(100);
              sck--;
          }
      }
  }

Thân,

phamhuydangcdt 05-02-2007 03:13 PM

counter!!!
 
hoi ve counter: xin chao cac ban minh co mot thac nac the nay
khi ta dem xung ngoai dung :timer0 thi xung ngoai dua vao chan A4
va ta dung lenh: setup_counters(rtcc_ext_h_to_l,rtcc_div_1);
bay gio minh muon dem xung tren c0va c1 (dung timer1)
thi khai bao the nao?
mong cac ban giup do cam on!

thongtr 09-10-2007 06:56 PM

cho mình hỏi cách sửa bộ compiler với! giả sử như sửa file lcd.c!
trong file lcd.c thi compiler mặc định là dữ liệu sẽ được gởi các chân RB4-RB7! nếu em muốn dl dc đưa ra các chân của RC4-RC7 thì phải làm như thế nào?

Mr.Bi 16-12-2007 11:50 PM

thì bạn define lại ngõ suất ra ! thường trong thư viện đó ng ta đ/n như sau
Code:

#define D4 RB4
#define D5 RB5
#define D6 RB6
#define D7 RB7

bạn chỉnh RB.. thành RC .. thế thui !

Mr.Bi 16-12-2007 11:54 PM

Đây là code LCD4bit , mình chỉnh lại từ code của anh Linh
Code:

#define E            PIN_D0
#define RS          PIN_D1
#define RW          PIN_D2
#define LCD_D4      PIN_D4
#define LCD_D5      PIN_D5
#define LCD_D6      PIN_D6
#define LCD_D7      PIN_D7

void LCD_Init ( void );                    // ham khoi tao LCD
void LCD_SetPosition ( unsigned int data );//Thiet lap vi tri con tro
void LCD_PutChar ( unsigned int data );    // Ham viet1kitu/1chuoi len LCD
void LCD_PutCmd ( unsigned int data ) ;    // Ham gui lenh len LCD
void send_to_LCD( unsigned int data);

void LCD_Init ( void )
{
    delay_ms(200); // thoi gian de LCD khoi dong

    output_low(RW);        // RW = 0
    output_low(RS);        // che do gui lenh

    send_to_LCD( 0x00 );
    output_high ( E ); output_low ( E ); delay_ms ( 10 );


    send_to_LCD( 0x03 );  /* init with specific nibbles to start 4-bit mode */
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E
    output_high ( E ); output_low ( E ); delay_ms ( 3 );
    output_high ( E ); output_low ( E ); delay_ms ( 3 );

    send_to_LCD( 0x02 );  /* set 4-bit interface */
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E


    LCD_PutCmd ( 0x2C );    /* function set (all lines, 5x7 characters) */
    LCD_PutCmd ( 0x0C);    /* display ON, cursor off, no blink */
    LCD_PutCmd ( 0x06 );    /* entry mode set, increment & scroll left */
    LCD_PutCmd ( 0x01 );    /* clear display */
}

void LCD_SetPosition ( unsigned int data )
{

    send_to_LCD( swap ( data ) | 0x08 );
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E

    send_to_LCD( swap ( data ) );
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E

}

void LCD_PutChar ( unsigned int data )
{
    output_high( RS ); //RS = 1
    output_low ( RW ); //RW = 0

    send_to_LCD( swap ( data ) );                        // gui 4 bit cao
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E

    send_to_LCD( swap ( data ) );                        //gui 4 bit thap
    output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E

}

void LCD_PutCmd ( unsigned int data )
{
    output_low(RS); // RS = 0
    output_low(RW); // RW = 0

    send_to_LCD( swap(data) );    // gui 4 bit cao
    output_high (E); output_low (E); delay_ms (3);

    send_to_LCD( swap(data) );    // gui 4 bit thap
    output_high (E); output_low (E); delay_ms ( 3 );
}


void send_to_LCD( unsigned int data )
{
    output_bit ( LCD_D4, data & 0x01 );
    output_bit ( LCD_D5, data & 0x02 );
    output_bit ( LCD_D6, data & 0x04 );
    output_bit ( LCD_D7, data & 0x08 );
}

bạn thick xuất PORT nào thì cứ thế mà chỉnh lại

anh_gioi 17-12-2007 11:24 AM

help về Lm335+16F877A+LCD1602
 
lâu rùi không động chạm PIC nên quên mứt..!!!
mọi người cho em hỏi :::
Trích:

Mach do nhiet do
- MCU = PIC16F877A
- Sensor = LM335 (co the thay the bang LM35D)
- MAX232 giao tiep may tinh
- LCD1602A de hien thi gia tri nhiet do
Mo ta phan cung:
- Mach cho sensor mac nhu trong Datasheet cua LM335
Chan V_out noi qua dien tro 1K voi +5V. Chan nay cung duoc noi voi kenh AN0 cua PIC
Chan Adj noi voi dien tro 10K de tinh chinh
Chan GND noi dat
- Mach VDK gom co LCD va max232
LCD noi voi PORTD cua PIC
RS -> RD2, RW -> GND, E -> RD3
D4-D7 -> RD4-RD7
Max232:
chan10 -> RC6, chan9 -> RC7
chan8 -> chan3 DB9, chan7 -> chan2 DB9, chan5 DB9 -> GND
Kenh AN0 cua PIC noi den chan V_out LM335
Nut bam noi tai chan RB0 -> nhan ngat ngoai
Thach anh loai 20MHz, tu 22pF


#include <16F877A.h>
#include <def_877a.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)

#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7, bits=9)

#include <lcd_lib_4bit.c>

int8 low,high,key,mode,min,max,mode1,i;
int1 blink,on_off,blink_min,blink_max;
int1 do_F;

void convert_bcd(int8 x);
void set_blink();
void bao_dong();
void test();
//-----------------------------------------------------------------

void main()
{
float value;
on_off =1;
min =15; //nhiet do min default
max =35; //nhiet do max default
do_F =0 ;
i = 0 ;
mode =0 ;
mode1 = 0 ;
blink=0 ;

trisa = 0xFF;
trisb = 0x01;
trisd = 0x00;

LCD_init();
Printf(LCD_putchar,"Lop DT8 - BKHN");
LCD_putcmd(0xC0);
Printf(LCD_putchar,"Khoi tao...");
// Khoi tao cho ngat ngoai
enable_interrupts (INT_EXT);
ext_int_edge(H_TO_L);
enable_interrupts (GLOBAL);
// Khoi tao che do cho bo ADC
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);
// Lay mau nhiet do lan dau tien
value=(float)read_adc();
value = (value - 558.5)/2.048; // For 5V supply
// value = (value - 754.8)/2.048; // For 3.7V Supply
// value = (value - 698.2)/2.048; // For 4V supply
convert_bcd((int8)value); // Chuyen doi tach so tram, chuc, donvi de hien thi len LED 7
delay_ms(1000);
LCD_putcmd(0xC0);
Printf(LCD_putchar," Init OK");

while(1)
{
if (i==25)
{
value = read_adc();
value=(value-558.5)/2.048;

if (do_F==1) value=1.8*value+32;
convert_bcd((int8)value);
printf("\n\rNhiet do phong: %u",value);
LCD_putcmd(0xC0);
printf(LCD_putchar," T = ");
LCD_putchar(high); LCD_putchar(low);
if (do_F==0) printf(LCD_putchar," C");
else printf(LCD_putchar," F");
i=0;
}
i++;
if(((int8)value > 40) || ((int8)value < 15)) on_off=1;
else
{
on_off = 0;
LCD_Putcmd(0xCF);
LCD_putchar(" ");
blink=0;
}

if (on_off==1)
{
if (blink==0) { LCD_Putcmd(0xCF);LCD_putchar("!");blink=1;delay_ms (250);}
else {LCD_Putcmd(0xCF);LCD_putchar(" ");blink=0;delay_ms(250);}
}
}
}
//end main-----------------------------------------------------------

#INT_EXT
void test()
{
if (do_F == 1) do_F=0;
else do_F=1;

}

void set_blink()
{
switch(mode)
{
case 1: blink_min=1; break;
case 2: {blink_max=1; blink_min=0;} break;
case 3: {mode=0; blink=0; blink_min=0; blink_max=0;} break;
}
}

void convert_bcd(int8 x)
{
low=x%10; //chia lay phan du, so hang don vi
high=x/10; //tach hang tram va hang chuc
low = low + 0x30;
high = high + 0x30;
}

void bao_dong(){
int8 i;

if (blink == 0) blink = 1;
else blink=0;

for(i=0;i<50;i++)
{
LCD_Putcmd(0xCF);
if (blink==0) LCD_putchar("!");
else LCD_putchar(" ");
}
}
cho em hỏi chương trình này của anh linh ạ.nhưng sao nó cứ báo lỗi ở :
Trích:

trisa = 0xFF;
trisb = 0x01;
trisd = 0x00;
cám ơn..!

Mr.Bi 22-12-2007 11:03 PM

hình như trong 2 file bạn include vào ko có định nghĩa trisa , trisb ,trisd . bạn chỉ cần khai báo lại địa chỉ là đc thui .. ko có gì cả !

tiendungkct 23-12-2007 06:11 PM

bạn cũng có thể viết như sau:
while(1)// vong lap luôn đúng
{
for(a=0;a=8;a++)
..................
}

thechinhcdt 26-01-2008 06:41 PM

K hiển thị LCD được.
 
1 Attachment(s)
Em mới học PIC và viết thử chương trình hiển thị LCD giống như bạn FFGmember hướng dẫn, compile no error nhưng khi mô phỏng Proteus thì k hiển thị được. Kết nối LCD chắc đúng vì em thử load file của anh FFGmember thì chạy ào ào.
Mong mọi người xem giúp, em mò hoài mà chẳng xong. :(

#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>


void main()
{
TRISD = 0x00;
LCD_Init();
Printf(LCD_Putchar,"Test LCD");
}

Cảm ơn mọi người !

thechinhcdt 26-01-2008 07:09 PM

Nhân tiện cho em hỏi một chút về CCS C, tuy có vẻ hơi ngớ ngẩn:

1. Compile và Build & Build all khác nhau chỗ nào, tại sao em mở 1 file .c bất kì, sửa rồi compile thì báo lỗi : I/O error 103. Vậy làm cách nào ?
2. Một project có Source, Output va Document để quản lý cái gì. Source gồm nhiều unit có tác dụng gì, vì thường em chỉ tạo 1 unit thôi..?

truong407 27-01-2008 08:49 PM

em muốn tìm tài liệu mới và đầy đủ nhất về CCS bằng tiếng việt, anh nào có chỉ giúp em với. đọc phần help của nó chua hiểu kỹ vì chưa nhìu kinh nghiệm

thechinhcdt 29-01-2008 12:35 AM

Trong topic này có 2 tutorial của anh linhnc và của anh Trần Xuân Trường (nick txt), mình nghĩ là khá đủ. bạn tìm và đọc nha !

uydanh 18-02-2008 11:41 PM

Trích:

Nguyên văn bởi FFGmember (Post 5569)
Đã lâu lâu không đóng góp cho PIC Việt Nam gì rồi. Đợt này tự nhiên công việc liên quan đến PIC, yêu cầu đến việc sử dụng SPI, nhào zô luôn cho việc học CCS. Mong mỏi đóng góp chút gì đó cho tất cả mọi ngưòi.


1. Mục tiêu của việc học CCS:
• Sử dụng được CCS programmer
• Ứng dụng được chương trình hiển thị LCD
• Ứng dụng được chương trình kết nối SPI với EEPROM và MMC card. hiển thị các thông số lên LCD .


2. Nguồn tài liệu và công cụ làm việc:
• Theo tutorial của Linhnc308: http://www.picvietnam.com/forum//att...6&d=1157644591
• Chương trình CCS: down load ban CCS3.249.rar. http://www.tailieuvietnam.net/downlo...CCSC_3.249.rar
• Chương trình Proteus. 6.7

file chương trình CCS giải nén báo lỗi. Bạn nào có up lại giúp mình. Cảm ơn nhiều.

minoan 25-02-2008 09:55 AM

Làm sao để có thể mô phỏng pic trong CCS như trong MPLAB được.

falleaf 25-02-2008 10:10 AM

Có hai cách, bản thân CCS C cũng có chức năng debug, bạn đọc phần Help để xem hướng dẫn. Hai là sau khi dịch thành file Hex, bạn import file Hex này vào MPLAB và chạy mô phỏng trên MPLAB.

Tuỳ theo bạn quen dùng với cái nào.

Chúc vui

minoan 25-02-2008 10:20 AM

Nhưng làm thế nào để dịch ra được file *.hex vậy. Khi Enable Dubugger thì có thông báo lỗi "Access violation at address 004060D2 in modul 'pcw.exe'. Read of address 001330EC". Cho hỏi vậy muốn khắc phục được thì làm thế nào?

minoan 26-02-2008 08:09 PM

http://i84.photobucket.com/albums/k3...untitled-1.jpg
Có ai giúp với, bị báo lỗi như thế đó, nó cứ đòi ICD. Muốn mô phỏng trên CCS như trong MPLAB mà không được. Có phải không có mạch nạp thì không mô phỏng được bằng CCS không? Mà ICD là gì vậy? Phải làm sao bgiờ.Hi

namqn 26-02-2008 10:23 PM

Trích:

Nguyên văn bởi minoan (Post 14498)
http://i84.photobucket.com/albums/k3...untitled-1.jpg
Có ai giúp với, bị báo lỗi như thế đó, nó cứ đòi ICD. Muốn mô phỏng trên CCS như trong MPLAB mà không được. Có phải không có mạch nạp thì không mô phỏng được bằng CCS không? Mà ICD là gì vậy? Phải làm sao bgiờ.Hi

Bạn đã chọn debugger là ICD-USB do CCS chế tạo, nếu bạn không có phần cứng đó thì tất nhiên là nhận được thông báo lỗi. Bạn có thể dịch ra tập tin .hex rồi import vào MPLAB để debug bằng MPLAB SIM.

Thân,

thechinhcdt 27-02-2008 06:13 PM

Hix, các bác có ai trả lời giúp em với !
em hỏi ở bài #26 và #27 ở luồng này, chờ dài cổ k thấy.. :-(

namqn 27-02-2008 07:11 PM

Trích:

Nguyên văn bởi thechinhcdt (Post 14144)
Em mới học PIC và viết thử chương trình hiển thị LCD giống như bạn FFGmember hướng dẫn, compile no error nhưng khi mô phỏng Proteus thì k hiển thị được. Kết nối LCD chắc đúng vì em thử load file của anh FFGmember thì chạy ào ào.
Mong mọi người xem giúp, em mò hoài mà chẳng xong. :(

#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>


void main()
{
TRISD = 0x00;
LCD_Init();
Printf(LCD_Putchar,"Test LCD");
}

Cảm ơn mọi người !

Với LCD, bạn nên làm thực tế thì tốt hơn. Có một số bạn mô phỏng tốt nhưng làm thực vẫn không chạy, vì Proteus giả định một số thiết lập của chip, và thông tin định thời của các dạng sóng tín hiệu điều khiển LCD là chuẩn. Thực tế thì các module LCD khác nhau khá nhiều.

Thân,

namqn 27-02-2008 07:21 PM

Trích:

Nguyên văn bởi thechinhcdt (Post 14145)
Nhân tiện cho em hỏi một chút về CCS C, tuy có vẻ hơi ngớ ngẩn:

1. Compile và Build & Build all khác nhau chỗ nào, tại sao em mở 1 file .c bất kì, sửa rồi compile thì báo lỗi : I/O error 103. Vậy làm cách nào ?
2. Một project có Source, Output va Document để quản lý cái gì. Source gồm nhiều unit có tác dụng gì, vì thường em chỉ tạo 1 unit thôi..?

1. Compile là biên dịch một/nhiều tập tin nguồn thành mã đối tượng. Build là biên dịch và liên kết các mã đối tượng thành một chương trình mã máy có thể nạp vào chip để thực thi (Build thường chỉ biên dịch các tập tin nguồn đã được sửa đổi kể từ lần Build trước). Build all là biên dịch tất cả tập tin nguồn của project và liên kết thành chương trình hoàn chỉnh, bất chấp tập tin nguồn có được sửa đổi kể từ lần Build/Compile trước hay không. Về lỗi 103, bạn đọc tài liệu hướng dẫn sử dụng CCS C.

2. Một cách tổng quát, project thường có nhiều tập tin nguồn, có thể do nhiều người cùng phát triển, do đó có nhu cầu tổ chức một cách có hệ thống. Output thường chứa các đầu ra của quá trình xây dựng project. Cụ thể ở đây là các tập tin đối tượng, các tập tin chứa thông điệp, chứa thông báo lỗi, tập tin chương trình hoàn chỉnh, ... Document thường dùng để chứa các tài liệu liên quan đến project, như tập tin trợ giúp (help), ghi chú (annotation), hướng dẫn sử dụng (user manual). Người ta viết tài liệu theo quá trình phát triển của project, để theo dõi quá trình, chỉnh sửa, quay lại một mốc nào đó, ... chứ không đợi đến khi hoàn thành project mới ngồi viết tài liệu.

Người mới học cho đến người dùng trung bình thường chỉ tạo ra một vài tập tin nguồn, và không có nhu cầu viết tài liệu, nên thường thấy việc tổ chức project là rắc rối, rườm rà. Các dự án lớn nhất định cần phải tổ chức theo kiểu này thì mới làm việc hiệu quả được.

Thân,

cuccutiara 04-04-2008 12:01 PM

Trích:

Nguyên văn bởi thechinhcdt (Post 14144)
Em mới học PIC và viết thử chương trình hiển thị LCD giống như bạn FFGmember hướng dẫn, compile no error nhưng khi mô phỏng Proteus thì k hiển thị được. Kết nối LCD chắc đúng vì em thử load file của anh FFGmember thì chạy ào ào.
Mong mọi người xem giúp, em mò hoài mà chẳng xong. :(

#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>


void main()
{
TRISD = 0x00;
LCD_Init();
Printf(LCD_Putchar,"Test LCD");
}

Cảm ơn mọi người !

Em cũng thế, load file hex về chạy thì bt, nhưng cũng file c đó nếu ấn f9 để dịch đè lên file hex thì ko hiển thị dc. CCS của em bị lỗi ạ?

tan_cumeo 24-07-2008 01:16 PM

Cho em hỏi khai báo dùng dao động bên trong của PIC như thế nào. Em có cái mạch PICkit2 Starter Kit không có thạch anh ở trên mạch nhưng không biết dùng dao động nội thế nào. Giúp em với. Em đang học CCS C.


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