PDA

View Full Version : Học CCS thông qua Tutorial PICVIETNAM


FFGmember
18-10-2006, 05:20 PM
Đã 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//attachment.php?attachmentid=366&d=1157644591
• Chương trình CCS: down load ban CCS3.249.rar. http://www.tailieuvietnam.net/download/PICSoft/CCSC_3.249.rar
• Chương trình Proteus. 6.7

FFGmember
18-10-2006, 05:47 PM
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

#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
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.

#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
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/d52/mafd_47A/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/d52/mafd_47A/hinh2-1.jpg


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
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//showthread.php?t=406&page=2 Dưới cùng, bài của anh F có link.

anhquangngai
07-11-2006, 04:13 PM
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//showthread.php?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
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/CCS_PCWH_and_IdeUtils_4.014_and_regfiles.rar

tranhuyky
14-11-2006, 04:14 PM
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
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
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??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
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

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:

//Chuong trinh led sang don o PORTB
/*ket qua o PORTB là:00000001,00000010,00000100,00001000,00010000,0 0100000,01000000,10000000,10000001,10000010,100001 00,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:

//Chuong trinh led sang don o PORTB
/*ket qua o PORTB là:00000001,00000010,00000100,00001000,00010000,0 0100000,01000000,10000000,10000001,10000010,100001 00,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
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

#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

#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
lâu rùi không động chạm PIC nên quên mứt..!!!
mọi người cho em hỏi :::

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 ở :

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
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
Đã 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//attachment.php?attachmentid=366&d=1157644591
• Chương trình CCS: down load ban CCS3.249.rar. http://www.tailieuvietnam.net/download/PICSoft/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/k34/minoan_1983/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
http://i84.photobucket.com/albums/k34/minoan_1983/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
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
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
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.

quyendn
17-09-2008, 02:01 PM
Em bắt đầu học pic, vào đây hơi trễ. Nên link phần mềm CCS mất rồi.
Vậy có ai cho em link mới nhé.
Cám ơn nhiều.

bengan
19-09-2008, 11:52 PM
thanks các bạn nhiều, cái này rất hay.

bogu
30-09-2008, 05:39 PM
loạt bài về CCs pic đâu hết tiêu rùi :((

nguyenquoctoan
30-09-2008, 06:35 PM
-protues phần mềm mô phỏng ko tin tưởng đâu các bác, theo em nghĩ nó chỉ là mô phỏng ý tưởng và giải thuật chương trình mình viết, còn thực tế thì khác xa
-muốn nạp chương trình vào protues bạn phải có sẵn file hex, trong protues nhấp đúp vào pic chọn đường dẫn file==>ok==>xong, phía dưới bên trái có bảng mô phỏng

nguyenquoctoan
30-09-2008, 06:37 PM
-protues phần mềm mô phỏng ko tin tưởng đâu các bác, theo em nghĩ nó chỉ là mô phỏng ý tưởng và giẩi thuật chương trình mình viết, còn thực tế thì khác xa
-muốn nạp chương trình vào protues bạn phải có sẵn file hex, trong protues nhấp đúp vào pic chọn đường dẫn file==>ok==>xong, phía dưới bên trái có bảng mô phỏng

nguyenquoctoan
30-09-2008, 06:37 PM
-protues phần mềm mô phỏng ko tin tưởng đâu các bác, theo em nghĩ nó chỉ là mô phỏng ý tưởng và giẩi thuật chương trình mình viết, còn thực tế thì khác xa
-muốn nạp chương trình vào protues bạn phải có sẵn file hex, trong protues nhấp đúp vào pic chọn đường dẫn file==>ok==>xong, phía dưới bên trái có bảng mô phỏng

nguyenquoctoan
30-09-2008, 07:17 PM
ccs phiên bản 4.0 cả tài liệu học ccs tiếng việt đây
tài liệu hướng dẫn protues lun
http://www.mediafire.com/?sharekey=33d20a68b2843bbbab1eab3e9fa335ca5deb367e e4828c31
các sư huynh dowload đi

nbb3i
04-11-2008, 12:54 AM
ccs phiên bản 4.0 cả tài liệu học ccs tiếng việt đây
tài liệu hướng dẫn protues lun
http://www.mediafire.com/?sharekey=33d20a68b2843bbbab1eab3e9fa335ca5deb367e e4828c31
các sư huynh dowload đi
Link này có file nào đâu?
Mình cũng đang làm đề tài ghi đọc thẻ nhớ MMC dùng PIC 16F877A qua chuẩn SPI. Nhưng ko rõ MMC nó cấu trúc bộ nhớ như thế nào?
Bạn nào có thể hướng dẫn qua giúp mình về chuẩn ghi đọc dữ liệu trên thẻ MMC với? Hoặc có thể nêu ra các bước thực hiện lập trình ghi đọc trên MMC giúp mình với.
Cảm ơn những gợi ý quý báu của các bạn:)!

dientudong
07-11-2008, 01:02 AM
các bạn cho mình hỏi ý nghĩa của hai câu lenh sau là sao >Chân thành cảm ơn !
lcd_init();
lcd_putc('\f');

dientudong
07-11-2008, 01:19 AM
Cho mình hỏi là sao đoạn code của anh Linh không có lệnh trisc và tại sao ở lệnh LCD_putcmd(0xC3):thì 0xC3 là vị trí thứ 4 của dòng thứ 2

#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 ");
}

hopeman
07-11-2008, 09:03 AM
các bạn cho mình hỏi ý nghĩa của hai câu lenh sau là sao >Chân thành cảm ơn !
lcd_init();
lcd_putc('\f');

cả hai lệnh này đều là lệnh gọi hàm thôi bạn ơi
vd lcd_init() tức là gọi hàm void lcd_init(void){...} đây có lẽ là hàm khởi tạo cho lcd, còn hàm còn lại là hàm đẩy 1 ký tự (char) đi thôi.

hopeman
07-11-2008, 09:40 AM
Cho mình hỏi là sao đoạn code của anh Linh không có lệnh trisc và tại sao ở lệnh LCD_putcmd(0xC3):thì 0xC3 là vị trí thứ 4 của dòng thứ 2

#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 ");
}

bạn nên vào #3 của topic này down file đính kèm về, giải nén và đọc kỹ lại file lcd_lib_4bit.c xem sao nhé.

dientudong
07-11-2008, 01:39 PM
Bạn cho mình hỏi là : khi mình viết một chương trình có dùng LCD thì cứ bê y nguyên code LCD4bit vào ,chỉ việc gắn chân cho phù hợp phải không bạn ?rồi mới viết thêm một số lệnh cho LCD theo bài của mình ?Cảm ơn bạn nhiều .

vuvulinh_8x
08-11-2008, 01:05 AM
Bạn cho mình hỏi là : khi mình viết một chương trình có dùng LCD thì cứ bê y nguyên code LCD4bit vào ,chỉ việc gắn chân cho phù hợp phải không bạn ?rồi mới viết thêm một số lệnh cho LCD theo bài của mình ?Cảm ơn bạn nhiều .

Code LCD4bit là một thư viện hàm được xây dựng sẵn tránh phải viết lại nhiều code trong các bài giao tiếp LCD mà thôi. Bạn cũng có thể xây dựng độc lập một hàm riêng ra một file.c nào đó hay trực tiếp ở code của mình. Nếu bạn include file LCD_lib_4bit.c thì phải gắn chân theo định nghĩa của file.

tv-vaa
08-11-2008, 12:17 PM
Em tải CCS bản CCS-PCWHD4.065 về máy, cài đặt được nhưng không chạy được. Máy em cài win Vista, các anh có bản nào chạy trên vista không share cho em nhé, crack luôn nhé. Thanks

khucthuydu1
11-11-2008, 09:41 PM
Mọi người ơi cho em hỏi, em mới học pic và đang code những bài đầu tiên dùng C với chương trình MPLAB. Em type theo đoạn code nhấp nháy led của anh Linh mà khi compile thấy báo lỗi TRISB và PORTB chưa được khai báo, khi em cho dấu chú thích vào thì compile mới thành công?

Vậy 2 biến TRISB và PORTB có cần khai báo j không?


edit:
Em đã thử bằng cách khác, cho dòng #include<defs_16f877a.h> vào sau dấu // và có khai báo hai biến TRISB, PORTB kiểu int16 thì dịch thành công. Nhưng em vẫn chưa hiểu, muốn khai báo TRISB và PORTB thì phải làm ra sao?
Còn file defs_16f877a.h thì có cần thiết khi mình dùng mạch nạp thật để test bài tutorial đầu tiên này k?

edit1:

Lên mạng kiếm được file def_877a.h rồi thì em cho vào device rồi include vào chương trình. Bỏ dòng khai báo TRISB và PORTB ( tự viết để xem chạy thế nào ) đi thì build success.

badungdtk3
15-03-2009, 04:21 PM
Mọi người cho em hỏi:
Em viết thử ct ADC nhưng cứ báo lỗi thế này:
" can't change device type this far in to the code"
và con trỏ nằm ở dòng này: #device *=16 ADC=8
Mong nhận được giúp đỡ sớm! Thanks trước nha.

TRUNGDTD
16-03-2009, 02:33 PM
Em mới học ccs,cho em hỏi các bác cái def_877A là cái gì mà em tìm không có,mấy chương trình của các bác có khai báo nhưng có khi dịch được có khi thi không ,nhờ các bác?

badungdtk3
19-03-2009, 08:59 PM
bạn đem về cho nó vào c/program file/picc/devices nhé. Còn trong đó có gì bạn mở ra sẽ biết thôi.

quyenk9a
04-04-2009, 05:32 PM
Đã 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//attachment.php?attachmentid=366&d=1157644591
• Chương trình CCS: down load ban CCS3.249.rar. http://www.tailieuvietnam.net/download/PICSoft/CCSC_3.249.rar
• Chương trình Proteus. 6.7

////////////////////////
em viết chương trình này sao không mô phỏng bằng proteus được
trả lời giúp em sớm nhé
thanks
#include<16f877a.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#device PIC16f877a*=16 ADC=10
#use delay(clock=4000000)
#include <lcd.c>
#byte portb=0x06
#byte portd=0x08
#bit b0=portb.0
#bit b1=portb.1
#bit b2=portb.2
#bit b3=portb.3
#bit b4=portb.4
#bit b5=portb.5
#bit b6=portb.6
#bit b7=portb.7
#int_rb

void docphim()
{
if(b0&&b4)
lcd_putc("giang");
if(b1&&b4)
lcd_putc("hoang");
if(b2&&b4)
lcd_putc("k9a");
if(b3&&b4)
lcd_putc(" ");
if(b0&&b5)
lcd_putc("hoang");
if(b1&&b5)
lcd_putc("giang");
}//end int
void main(void)
{

set_tris_b(0xf0);
set_tris_d(0x00);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
ext_int_edge(H_to_L);

{
portb=1;
portb=2;
portb=4;
portb=8;
lcd_putc("hoang giang !!!");
delay_ms(100);
lcd_putc("\f");

}
while(true);}

quyenk9a
04-04-2009, 05:39 PM
code của em không chạy các bác ơi
#include<16f877a.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#device PIC16f877a*=16 ADC=10
#use delay(clock=4000000)
#include <lcd.c>
#byte portb=0x06
#byte portd=0x08
#bit b0=portb.0
#bit b1=portb.1
#bit b2=portb.2
#bit b3=portb.3
#bit b4=portb.4
#bit b5=portb.5
#bit b6=portb.6
#bit b7=portb.7
#int_rb

void docphim()
{
if(b0&&b4)
lcd_putc("giang");
if(b1&&b4)
lcd_putc("hoang");
if(b2&&b4)
lcd_putc("k9a");
if(b3&&b4)
lcd_putc(" ");
if(b0&&b5)
lcd_putc("hoang");
if(b1&&b5)
lcd_putc("giang");
}//end int
void main(void)
{

set_tris_b(0xf0);
set_tris_d(0x00);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
ext_int_edge(H_to_L);

{
portb=1;
portb=2;
portb=4;
portb=8;
lcd_putc("hoang giang !!!");
delay_ms(100);
lcd_putc("\f");

}
while(true);}

phandinh
04-04-2009, 08:24 PM
while (true); /// mình nghĩ có vấn đề ở dấu ' ; '

baodinh88
05-04-2009, 06:42 PM
#include<16F887.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=20000000)
#use fast_io(b)
#byte portb=0x00
int i;
int j;
main()
{
for(i=0;i<=7;i++)
{
j=2^i;
portb= j ; // led 8-1on
delay_ms(1000);
}
}
các bác cho e hỏi sao đoạn code này khi dịch wa file hex đổ vào protues mô phỏng không chạy được là sao ?

namqn
05-04-2009, 07:45 PM
#include<16F887.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=20000000)
#use fast_io(b)
#byte portb=0x00
int i;
int j;
main()
{
for(i=0;i<=7;i++)
{
j=2^i;
portb= j ; // led 8-1on
delay_ms(1000);
}
}
các bác cho e hỏi sao đoạn code này khi dịch wa file hex đổ vào protues mô phỏng không chạy được là sao ?
Như thế nào là không chạy được?

Chương trình của bạn không có một vòng lặp vô tận ở cuối để tránh cho vi điều khiển chạy tiếp những lệnh vô nghĩa phía sau mã chương trình. Với loại bài toán thay đổi trạng thái LED, không nên dùng Proteus để mô phỏng.

Thân,

quyenk9a
06-04-2009, 01:31 AM
while (true); /// mình nghĩ có vấn đề ở dấu ' ; '

bác chỉnh lại cho em với.ccs van biên dịch sang hex duoc.mà mô fongr không đc

hoangquan_d
19-04-2009, 09:31 PM
không hiểu tại sao khi em chép <DEF_16F877A.H> vào thư mục Devices rồi mà khi kiểm lỗi vẩn báo lỗi , các bác giúp em với. chưởng trình như sau
/*******BAT DAU CHUONG TRINH************/
#INCLUDE <16F877A.H>
#INCLUDE <DEF_16F877A.H>
#DEFINE STOP PIN_B4
#DEFINE DKTH PIN_B5
#DEFINE DKNG PIN_B6
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000) //SU DUNG THACH ANH 20MHZ
#USE FAST_IO(A)
#USE FAST_IO(B)
#USE FAST_IO(D)
INT8 I,BCHUC,BDVI,VDVI,VCHUC;
INT8 SBUOC=0,A,SVONG=0;
INT8 R_KEY=0;
CONST UNSIGNED CHAR
DIG[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X9 0};
CONST UNSIGNED CHAR ROTATE[]={14,12,13,9,11,3,7,6};
/************************************************** *******
CHUONG TRINH DIEU KHIEN LED QUAY THUAN
SU DUNG LOAI DONG CO BUOC 48 RANG
DIEU KHIEN NUA BUOC
*/
//CHUONG TRINH NGAT RB
#INT_RB
VOID NGAT_RB()
{
IF(RBIF==1)
{
IF(INPUT(STOP)==0){A=0;}
IF(INPUT(DKTH)==0){A=1;}
IF(INPUT(DKNG)==0){A=2;}
}
RBIF=0;
}
//CHUONG TRINH DOI SO BUOC, SO VONG RA SO BCD
HEX_BCD()
{
VCHUC=SVONG/10;
VDVI=SVONG%10;
BCHUC=SBUOC/10;
BDVI=SBUOC%10;
}
HIENTHI1()
{
PORTC=DIG[BDVI]; //HIEN THI SO BUOC DON VI
PORTD=0X0F;
DELAY_US(100);
PORTD=0; //CHONG LEM
PORTC=DIG[BCHUC]; //HIEN THI SO BUOC CHUC
PORTD=0X17;
DELAY_US(100);
PORTD=0;
PORTC=0XBF; //HIEN THI DAU GACH PHAN CACH
PORTD=0X1B;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VDVI]; //HIEN THI SO VONG DON VI
PORTD=0X1D;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VCHUC]; //HIEN THI SO VONG CHUC
PORTD=0X1E;
DELAY_US(100);
PORTD=0;
}
HIENTHI()
{
I=0;
SBUOC++;
IF(SBUOC>95){
SBUOC=0;
SVONG++;
IF(SVONG>99){SVONG=0;}
}
HEX_BCD();
WHILE(I<10)
{
HIENTHI1();
I++;
}
}
QUAYTHUAN()
{
PORTA=ROTATE[R_KEY];
HIENTHI();
IF (R_KEY < 7){R_KEY++;}
ELSE R_KEY=0;
}
QUAYNGICH()
{
IF (R_KEY > 0){R_KEY--;}
ELSE R_KEY=7;
PORTA=ROTATE[R_KEY];
HIENTHI();
}
STP()
{
OUTPUT_A(0XFF);
HEX_BCD();
HIENTHI1();
}
VOID MAIN ()
{
SET_TRIS_A(0); // PORTA DIEU KHIEN DONG CO BUOC
SET_TRIS_B(0XFF); // PORTB LA PORT NHAP DU LIEU
SET_TRIS_C(0); // PORTC XUAT MA HIEN THI
SET_TRIS_D(0); // PORTD QUET LED
ENABLE_INTERRUPTS(GLOBAL); //CHO PHEP NGAT TOAN CUC
ENABLE_INTERRUPTS(INT_RB); //CHO PHEP NGAT RB
EXT_INT_EDGE(H_TO_L); //CHO PHEP NGAT CANH XUONG
A=0;
WHILE(1)
{
SWITCH(A)
{
CASE 0 : STP(); //NEU A=0 THI STOP
BREAK;
CASE 1 : QUAYTHUAN(); //NEU A=1 THI QUAY THUAN
BREAK;
CASE 2 : QUAYNGICH(); //NEU A=2 THI QUAY NGHICH
BREAK;
}
}
}

hoangquan_d
19-04-2009, 09:31 PM
không hiểu tại sao khi em chép <DEF_16F877A.H> vào thư mục Devices rồi mà khi kiểm lỗi vẩn báo lỗi , các bác giúp em với. chưởng trình như sau
/*******BAT DAU CHUONG TRINH************/
#INCLUDE <16F877A.H>
#INCLUDE <DEF_16F877A.H>
#DEFINE STOP PIN_B4
#DEFINE DKTH PIN_B5
#DEFINE DKNG PIN_B6
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000) //SU DUNG THACH ANH 20MHZ
#USE FAST_IO(A)
#USE FAST_IO(B)
#USE FAST_IO(D)
INT8 I,BCHUC,BDVI,VDVI,VCHUC;
INT8 SBUOC=0,A,SVONG=0;
INT8 R_KEY=0;
CONST UNSIGNED CHAR
DIG[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X9 0};
CONST UNSIGNED CHAR ROTATE[]={14,12,13,9,11,3,7,6};
/************************************************** *******
CHUONG TRINH DIEU KHIEN LED QUAY THUAN
SU DUNG LOAI DONG CO BUOC 48 RANG
DIEU KHIEN NUA BUOC
*/
//CHUONG TRINH NGAT RB
#INT_RB
VOID NGAT_RB()
{
IF(RBIF==1)
{
IF(INPUT(STOP)==0){A=0;}
IF(INPUT(DKTH)==0){A=1;}
IF(INPUT(DKNG)==0){A=2;}
}
RBIF=0;
}
//CHUONG TRINH DOI SO BUOC, SO VONG RA SO BCD
HEX_BCD()
{
VCHUC=SVONG/10;
VDVI=SVONG%10;
BCHUC=SBUOC/10;
BDVI=SBUOC%10;
}
HIENTHI1()
{
PORTC=DIG[BDVI]; //HIEN THI SO BUOC DON VI
PORTD=0X0F;
DELAY_US(100);
PORTD=0; //CHONG LEM
PORTC=DIG[BCHUC]; //HIEN THI SO BUOC CHUC
PORTD=0X17;
DELAY_US(100);
PORTD=0;
PORTC=0XBF; //HIEN THI DAU GACH PHAN CACH
PORTD=0X1B;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VDVI]; //HIEN THI SO VONG DON VI
PORTD=0X1D;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VCHUC]; //HIEN THI SO VONG CHUC
PORTD=0X1E;
DELAY_US(100);
PORTD=0;
}
HIENTHI()
{
I=0;
SBUOC++;
IF(SBUOC>95){
SBUOC=0;
SVONG++;
IF(SVONG>99){SVONG=0;}
}
HEX_BCD();
WHILE(I<10)
{
HIENTHI1();
I++;
}
}
QUAYTHUAN()
{
PORTA=ROTATE[R_KEY];
HIENTHI();
IF (R_KEY < 7){R_KEY++;}
ELSE R_KEY=0;
}
QUAYNGICH()
{
IF (R_KEY > 0){R_KEY--;}
ELSE R_KEY=7;
PORTA=ROTATE[R_KEY];
HIENTHI();
}
STP()
{
OUTPUT_A(0XFF);
HEX_BCD();
HIENTHI1();
}
VOID MAIN ()
{
SET_TRIS_A(0); // PORTA DIEU KHIEN DONG CO BUOC
SET_TRIS_B(0XFF); // PORTB LA PORT NHAP DU LIEU
SET_TRIS_C(0); // PORTC XUAT MA HIEN THI
SET_TRIS_D(0); // PORTD QUET LED
ENABLE_INTERRUPTS(GLOBAL); //CHO PHEP NGAT TOAN CUC
ENABLE_INTERRUPTS(INT_RB); //CHO PHEP NGAT RB
EXT_INT_EDGE(H_TO_L); //CHO PHEP NGAT CANH XUONG
A=0;
WHILE(1)
{
SWITCH(A)
{
CASE 0 : STP(); //NEU A=0 THI STOP
BREAK;
CASE 1 : QUAYTHUAN(); //NEU A=1 THI QUAY THUAN
BREAK;
CASE 2 : QUAYNGICH(); //NEU A=2 THI QUAY NGHICH
BREAK;
}
}
}

hoangquan_d
19-04-2009, 10:09 PM
em đã tim ra lỗi, cam ơn

thanhvanckbk
07-07-2009, 04:45 PM
sao mình sử dụng chương trình CCS để viết chương trình cho PIC thì sau khi viết xong lại không thể compile để chuyển thành file .hex được vì nút compile đó bị mờ đi, mình bấm thử F9 cũng không được, xin mọi người chỉ giúp. Đa tạ!

Em_ku
06-09-2009, 11:58 AM
hix, các bác ơi. Khó hiểu thật. Em dùng timer0 để tạo thời gian trễ là 1s. Nháy leg hiển thị số. Em nghĩ đã đúng rồi, vì thử các led nháy 1s đúng mà sao khi bỏ vào led bảy đoạn nó lại chạy quá nhanh kô như ý muốn được. Hix vậy là sao đây ạ?? Muốn xử lý thì thế nào ??
code:
#include <16f877a.h>
#fuses HS, NOWDT
#use delay(clock=4000000)
#byte portb=0x06
#byte trisb=0x86
#byte INTCON=0x0b
#bit TMR0IF=INTCON.2
#byte TMR0=0x01
#use fast_IO (b)
void tre1s (int so)
{
int i,j;
TMR0IF=0;
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
set_timer0 (6);
for (i=0;i<=so;i++)
{
while (TMR0IF==0)
{
}
}
}
void main ()
{
int a,b;
int C[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };
set_tris_b (0x00);
a=0;
while (1)
{
for (a=0;a<=9;a++)
{
tre1s (250);
portb=C[a];
tre1s (250);
}
}
}

nhamdtk4
06-09-2009, 03:47 PM
void tre1s (int so)
{
int i,j;
TMR0IF=0;
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
set_timer0 (6);
for (i=0;i<=so;i++)
{
while (TMR0IF==0)
{
}
}
}
}
Hàm này của bạn sai rồi nó ko tạo trễ 1s, xem lại đi rồi tìm xem viết kiểu j cho đúng.

Em_ku
06-09-2009, 04:04 PM
bác nói rõ hơn một chút được kô ạ?? Còn cái 1s đó kô wan trọng. Theo em nghĩ mình tính toán cũng đúng mà. Thời gian để i tăng lên 1 đơn vị: (255-6+1)*1*16 = 40000. Vậy giá trị số phải là 250. Em wen ở đó kô có dấu bằng xảy ra.
Vấn đề em thắc mắc ở đây. Là cái đoạn sau. Nếu em thay đoạn sau:
void main ()
{
int a=0b00000001;
set_tris_b(0x00);
while (1)
{
portb=a;
tre1s (250);
rotate_left (&a,1);
}
}

thì đèn led ở portb của em nháy từng con với thời gian trễ là 1s. Còn nếu em thay cái đoạn trên thì nó nhảy gì gì đâu ấy à. Em kô hiểu được

Em_ku
09-09-2009, 02:56 PM
Kô ai giúp em với!! Hix em chờ lâu quá mà kô thấy. Cũng tìm khắp diễn đàn rồi mà kô thấy có chỗ nào nói về cái này cả

newboystylew
10-09-2009, 05:33 PM
mh cũng gốp zui thêm 1 số chưg trìh ccs,các ct này chạy tốt trên protues7.4
http://www.mediafire.com/?xzynn5nmgnz

nhamdtk4
11-09-2009, 09:28 PM
bác nói rõ hơn một chút được kô ạ?? Còn cái 1s đó kô wan trọng. Theo em nghĩ mình tính toán cũng đúng mà. Thời gian để i tăng lên 1 đơn vị: (255-6+1)*1*16 = 40000. Vậy giá trị số phải là 250. Em wen ở đó kô có dấu bằng xảy ra.
Vấn đề em thắc mắc ở đây. Là cái đoạn sau. Nếu em thay đoạn sau:
void main ()
{
int a=0b00000001;
set_tris_b(0x00);
while (1)
{
portb=a;
tre1s (250);
rotate_left (&a,1);
}
}

thì đèn led ở portb của em nháy từng con với thời gian trễ là 1s. Còn nếu em thay cái đoạn trên thì nó nhảy gì gì đâu ấy à. Em kô hiểu được
Tôi thật ko thể hiểu đc sao cái hàm trễ của bạn lại có lúc chạy đúng đc 1s, và cách bạn tính thời gian trễ ở trên là dùng cho ngắt timer ko biết khai báo ngắt của bạn đặt đâu.
Hàm tre1s() của bạn chỉ đơn giản là thực hiện các lệnh trong đó mỗi lệnh tốn khoảng vài us làm sao mà trễ đc đến 1s cơ chứ.

nhamdtk4
11-09-2009, 09:29 PM
Bạn thử sửa lại code trên đó thành như này xem sao
#include <16f877a.h>
#fuses HS, NOWDT
#use delay(clock=4000000)
#byte portb=0x06
#byte trisb=0x86
#byte INTCON=0x0b
#bit TMR0IF=INTCON.2
#byte TMR0=0x01
#use fast_IO (b)

int a,b=0;
int C[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };
#int_rtcc
void rtcc()
{
if(b++==250)
{
a++;
if(a==10) a=0;
}
}
void main ()
{
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
set_timer0 (6);
enable_interrupts(int_rtcc);
enable_interrupts(global);
set_tris_b (0x00);
a=0;
while (true)
{
//for (a=0;a<=9;a++)
//{
//tre1s (250);
portb=C[a];
//tre1s (250);
}
}

Em_ku
17-09-2009, 10:00 AM
Tôi thật ko thể hiểu đc sao cái hàm trễ của bạn lại có lúc chạy đúng đc 1s, và cách bạn tính thời gian trễ ở trên là dùng cho ngắt timer ko biết khai báo ngắt của bạn đặt đâu.
Hàm tre1s() của bạn chỉ đơn giản là thực hiện các lệnh trong đó mỗi lệnh tốn khoảng vài us làm sao mà trễ đc đến 1s cơ chứ.
Cái này tớ không sử dụng ngắt dùng timer mà đơn giản là chỉ thực hiện cái lệnh đó. Thời gian để thực hiện lệnh này là 1s được tính như sau:
đầu tiên gán cho timer0=6. Giá trị timer tăng sau 1 chu kì lệnh với tỉ lệ chia tần số là 16. Vậy sau bao lâu thì giá trị i tăng lên 1 đơn vị:
t=(255-6+1)*1us*16=4000us. Vậy giá trị của i phải chạy từ 0 đến 250. Như vậy nó tốn thời gian là 4000us*250=1000000us=1s. đó là cách em tính. Nhưng ở đây em không thắc mắc về tính thời gian trễ này. Nếu ta sửa cái led 7 đoạn bằng một led đơn thì nó vẫn đỏ tắt sau thời gian là 1s. Nhưng nếu nó là led 7 đoạn thì nhảy loạn xạ lên.

nhamdtk4
17-09-2009, 04:54 PM
void tre1s (int so)
{
int i,j;
TMR0IF=0;
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
set_timer0 (6);
for (i=0;i<=so;i++)
{
while (TMR0IF==0)
{
}
}
}

Mình thử "giải phẫu" cái hàm tre1s() của bạn, cùng theo dõi xem có đúng ko nha:
-RTCC_DIV_16 chưa nhắc tới, khi hàm tre1s() được gọi và đến khi hàm lệnh set_timer0(6) được thực hiện thì timer0 bắt đầu đếm từ 6, mặc kệ timer0 nó đếm thì vòng lặp for(..) vẫn được thực hiện đúng ko.
-Trong khi đang đếm timer0 chưa tràn thì con trỏ CT cứ ở yên trong while(TMR0IF==0) (vì TMR0IF==0 true) vậy sau t=(255-6+1)*1us*16=4000us thì sao, thì timer0 bị tràn và TMR0IF==0 false chứ sao nhỉ, vậy thế thì sao nào.
-Như vậy là khi i==0 thì timer0 đã bị tràn rồi và TMR0IF==1 nhưng chưa thể thoát khỏi tre1s() ngay được vì i còn phải tăng đến khi i==so thì mới thoát khỏi vòng lặp for(..) và cũng thoát khỏi hàm tre1s() luôn.
Đấy như thế thì hàm tre1s() của bạn chỉ trễ được có 4000us + vài trăm us trong vòng for(..) thôi chứ sao đủ 1s được.
Ko biết bạn mô phỏng thế nào chứ mình thấy khi thay đoạn code khác vào thì nó vẫn trễ như thế (vì vấn đề là ở hàm trễ);

letrongdtk4
23-09-2009, 10:11 PM
Cái này tớ không sử dụng ngắt dùng timer mà đơn giản là chỉ thực hiện cái lệnh đó. Thời gian để thực hiện lệnh này là 1s được tính như sau:
đầu tiên gán cho timer0=6. Giá trị timer tăng sau 1 chu kì lệnh với tỉ lệ chia tần số là 16. Vậy sau bao lâu thì giá trị i tăng lên 1 đơn vị:
t=(255-6+1)*1us*16=4000us. Vậy giá trị của i phải chạy từ 0 đến 250. Như vậy nó tốn thời gian là 4000us*250=1000000us=1s. đó là cách em tính. Nhưng ở đây em không thắc mắc về tính thời gian trễ này. Nếu ta sửa cái led 7 đoạn bằng một led đơn thì nó vẫn đỏ tắt sau thời gian là 1s. Nhưng nếu nó là led 7 đoạn thì nhảy loạn xạ lên.

Mình lại thấy cách tính của bạn cũng gần như chính là cách dùng ngắt của Timer
vì khi bạn dùng Set_timer0(X) thì thời gian để 1 lần Timer của bạn tràn là :
T = 4.(256 - X) / Tấn số thạch anh
Cụ thể ở đây của bạn : X = 6 và Tần số thạch anh là : 4MHz
-> T = 4.(256 -6) / 4000000 = 250uS . Vậy để trễ 1s bạn cần tràn Timer 4000 lần
Nhưng bạn dùng chế độ RTCC_DIV_16 nên Timer tràn 250 lần là bạn có 1s

Vì thế bạn chỉ cần sửa chương trình lại như sau là ngon lành :
#include <16f877a.h>
#fuses HS, NOWDT
#use delay(clock=4000000)
#byte portb=0x06
#byte trisb=0x86
#byte INTCON=0x0b
#bit TMR0IF=INTCON.2
#byte TMR0=0x01
#use fast_IO (b)

INT8 I=0;
int8 a,b;
int8 C[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };

#INT_TIMER0
VOID TRAN_TIMER0()
{
I ++;
SET_TIMER0(6);
}


void tre1s (int so)
{
int i,j;
TMR0IF=0;
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
set_timer0 (6);
for (i=0;i<=so;i++)
{
while (TMR0IF==0)
{
}
}
}

void main ()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
set_tris_b (0x00);
a=0;
while (1)
{
for (a=0;a<=9;a++)
{
//tre1s(250);
portb=C[a];
tre1s(250);
}
}
}



:beer:

letrongdtk4
23-09-2009, 10:26 PM
Mình vừa viết lại chương trình . Vẫn là dùng Timer bạn xem thế nào ???
http://www.mediafire.com/download.php?mtgyjhjniij
Mà bài toán này mục đích của bạn chỉ là hiển thị led 7 thanh thôi hay có ý định gì tiếp theo không ? :D

letrongdtk4
23-09-2009, 11:04 PM
Mọi người cho em hỏi:
Em viết thử ct ADC nhưng cứ báo lỗi thế này:
" can't change device type this far in to the code"
và con trỏ nằm ở dòng này: #device *=16 ADC=8
Mong nhận được giúp đỡ sớm! Thanks trước nha.


Bạn xem lại khai báo ban đầu vì chắc bạn đã khai báo #device *=16 ADC=8 sau khi khai báo
#fuses và #use :D

nhamdtk4
24-09-2009, 09:39 AM
- Ko nhất thiết phải dùng cả hàm ngắt ở bài toán này, mình muốn Em_ku tự viết lại bài đó theo cách khác nhưng ko biết hắn biến đâu mất. Và code của Em_ku hoàn toàn có thể giữ nguyên chỉ sửa vài chỗ thôi là có thể chạy đúng.
- Như mình phân tích ở trên thì khi i==0 timer0 đã bị tràn rồi và cờ TMR0IF khi đó đã bằng 1, nhưng mà vấn đề là ở chỗ mỗi khi i tăng lên thì quá trình phải lặp lại như vậy (phải lặp lại thì mới đảm bảo trễ đúng 1s như đã tính toán) thế thì mỗi lần i nhận đc một giá trị thì timer0 phải tràn rồi đếm lại từ đầu một lần. Vậy chỉ cần đặt cụmTMR0IF=0;
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
set_timer0 (6); vào trong vòng lặp for (i=0;i<=so;i++) của bạn là xong thôi mà.

letrongdtk4
24-09-2009, 09:02 PM
Hi !!!
Tôi cũng chẳng bít hẳn biến đâu mà mất tiêu
Nhưng anh em mình chỉ mún nói 1 chút về Timer0 thui
Còn đơn giản nhất thì anh em mình vẫn có thể dùng Delay_ms() mà :D

noridomoto
24-09-2009, 11:39 PM
đang đợi bài viết sample SPI cho PIC ?

tdm
21-11-2009, 06:06 PM
tôi mới tự học viết chương trình bằng c thông qua các bài viết trên diễn đàn.
đây là chương trinh bàn phim hex .các bạn xem dùm code đã được hay chưa?
//************************************************** ***************************
// nguoi thuc hien : tdm
// ngay : 21/11/2009
// phan cung: PIC16F877A
// ten bai:ban phim hex
//************************************************** ***************************
#include <16F877A.h>
#include <def_877a.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
int a,b,n;// khai bao bien
// Chuong trinh chinh
void su_ly_ma(void);//khai bao chuong trinh con
void main()
{
TRISB =0xf0;
TRISC = 0;
PORTB =0;
PORTC =0;
b=0x01;
n=0;
while(1)//vong lap chinh
{
PORTB =b;
if(RB4=1)
{
delay_ms(10);//chong rung phim
if(RB4=1)
{
a=0;
su_ly_ma();//goi chuong trinh con
}
}
while(RB4=1)//cho phim nha
{
}
delay_ms(10);//chong rung phim
//*******************************
if(RB5=1)
{
delay_ms(10);//chong rung phim
if(RB5=1)
{
a=1;
su_ly_ma();//goi chuong trinh con
}
}
while(RB5=1)//cho phim nha
{
}
delay_ms(10);//chong rung phim
//*******************************
if(RB6=1)
{
delay_ms(10);//chong rung phim
if(RB6=1)
{
a=2;
su_ly_ma();//goi chuong trinh con
}
}
while(RB6=1)//cho phim nha
{
}
delay_ms(10);//chong rung phim
//*******************************
if(RB7=1)
{
delay_ms(10);//chong rung phim
if(RB7=1)
{
a=3;
su_ly_ma();//goi chuong trinh con
}
}
while(RB7=1)//cho phim nha
{
}
delay_ms(10);//chong rung phim
//**********************************
rotate_left(&b,1);
if(b>9)
{
b=0x01;
n=0;
}
++n;// tang n len 1
}// vong lap
}//ket thuc chuong trinh
//**************************
//khai bao chuong trinh con
void su_ly_ma(void)
{
if(n=0)
{
PORTC =a;
}
if(n=1)
{
PORTC =a+4;
}
if(n=2)
{
PORTC =a+8;
}
if(n=3)
{
PORTC =a+12;
}
}

tdm
21-11-2009, 06:13 PM
đây là file của phim hex:

nhamdtk4
22-11-2009, 06:00 PM
Không biết cái "if(RB4=1)", "while(RB4=1)",... của bạn là j (hoặc là bỏ đi hoặc là thay bằng phép so sánh "==" chứ bạn lại dùng phép gán ở đây sao đc).

tdm
23-11-2009, 12:53 PM
Không biết cái "if(RB4=1)", "while(RB4=1)",... của bạn là j (hoặc là bỏ đi hoặc là thay bằng phép so sánh "==" chứ bạn lại dùng phép gán ở đây sao đc).
if(RB4=1):bit RB4=1 thì đọc phím
while(RB4=1): sau khi đọc phím chờ phím nhả (chờ RB4=0) rồi mới đọc tiếp phím.

nhamdtk4
23-11-2009, 02:48 PM
if(RB4=1):bit RB4=1 thì đọc phím
while(RB4=1): sau khi đọc phím chờ phím nhả (chờ RB4=0) rồi mới đọc tiếp phím.
Đúng là đọc và chờ nhả, nhưng phải là "if(RB4)" hoặc "if(RB4==1)" còn cái "if(RB4=1)" của bạn thì RB4=1 là gán giá trị logic 1 cho RB4.

tdm
24-11-2009, 12:30 PM
Đúng là đọc và chờ nhả, nhưng phải là "if(RB4)" hoặc "if(RB4==1)" còn cái "if(RB4=1)" của bạn thì RB4=1 là gán giá trị logic 1 cho RB4.
cảm ơn bạn .mình đã sửa theo hướng dẫn của bạn.

nguyenhuytuong
03-01-2010, 08:27 PM
Mình đang viết chương trình hiển thị trên LCD, mình thấy rất khó khăn để hiểu các chương trình trên diễn đàn nếu không hiểu rõ về bộ điều khiển HD44780U của LCD của Hitachi. Nếu bạn nào cũng đang làm về LCD thì nên đọc datasheet của con này.

chang kho
12-01-2010, 07:52 AM
#INCLUDE<16F877A.H>
#INCLUDE<def_877a.h>
#FUSES XT,NOWDT,NOPROTECT
#USE DELAY(CLOCK=20000000)
#DEFINE RS RE2
#DEFINE RW RE1
#DEFINE E RE0
#DEFINE LCD PORTB
CONST UNSIGNED CHAR LINE1[]={'D','O','','A','N','','T','O','T','','N','G','H' ,'I','E','P','#'};
CONST UNSIGNED CHAR LINE2[]={'K','I','T','','T','H','U','C','','T','A','P','' ,'P','I','C','','1','6','F','8','7','7','A','','', '#'};
CONST UNSIGNED CHAR LINE3[]={'','','K','H','O','A','','D','T','','-','','T','H','#'}
CONST UNSIGNED CHAR LINE4[]={
'','','G','V','H','D',':','P','H','U','N','G','',' B','A','O','','C','H','A','U',
'','','S','V','T','H',':','H','U','Y','N','H','',' V','A','N','','T','R','U','N','G'
,'','&','','N','G','U','Y','E','N','','T','U','A','N','' ,'V','U','','','#'}
doan code nay hok bt sao ma em chay no hok dc
em bt no sai o cho defs_16f877a.
phai chen file def_877a nhu the nao
may anh cho file va chi dum nhe

lednghethuat
22-01-2010, 10:54 PM
Chào các bạn. Mình học tin mới chuyển sang nghiên cứu pic. Hôm nay tìm trên diễn đàn mãi không được cái hàm trả về chiều dài của mảng. bạn nào biết chỉ mình với. thank nhiều:

Mảng A={1,2,3,4,5} muốn xác định chiều dài của nó thì dùng hàm nao?

manhdktd
14-06-2010, 06:46 PM
anh namqn cho em hỏi luôn cái chương trình này:

//Chuong trinh led sang don o PORTB
/*ket qua o PORTB là:00000001,00000010,00000100,00001000,00010000,0 0100000,01000000,10000000,10000001,10000010,100001 00,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!
làm sao chạy được khi giá trị ban đầu của sck=8 ma trong khi bạn kiểm tra vòng lặp while(sck<1)?????

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

for(a=0;a<8;a++)
bạn viết sai

manhdktd
14-06-2010, 09:45 PM
cả hai lệnh này đều là lệnh gọi hàm thôi bạn ơi
vd lcd_init() tức là gọi hàm void lcd_init(void){...} đây có lẽ là hàm khởi tạo cho lcd, còn hàm còn lại là hàm đẩy 1 ký tự (char) đi thôi.

cld_putc('\f')
là lệnh xóa màn hình

thanhphuc15
01-11-2010, 09:00 AM
may a oi cho e hoi trong ccs thi thoi gian mac dinh la s , ms hay la us vay...
vi e lap trinh de giai ma remote tv sony nhung khi e get_timer xong roi e ho biet la phai so sanh cai timer nay voi s, ms hay la us nua..
mong cac anh chi giup

haitaccr113
14-12-2010, 09:06 AM
Chào mọi người. E mới chân ướt chân ráo tìm hiểu pic mong mấy huynh chỉ giáo. E có câu hỏi này tuy ngớ ngẩn "Khi vẽ mạch orcad thì làm sao biết gắn các tụ bao nhiêu với chân nguồn ?

phamquocgia
01-04-2011, 02:20 PM
bạn dùng tụ 104

alycuong
21-05-2011, 02:22 AM
#include <16F877a.h>
#define LED1 PIN_B4 //HANG NGHIN
#define LED2 PIN_B5 //HANG TRAM
#define LED3 PIN_B6 //HANG CHUC
#define LED4 PIN_B7 //HANG DON VI
#fuses hs, nowdt, put, nolvp, brownout
#use delay(clock=20000000)
int16 a,b,i,j,dv,chuc,tram,nghin,n;


void led7()
{
nghin=a/1000;
a=a%1000;
tram=a/100;
a=a%100;
chuc=a/10;
dv=a%10;
output_b(dv|0b10000000); //hien hang don vi
delay_us(1000);
output_b(chuc|0b01000000);//hien hang chuc
delay_us(1000);
output_b(tram|0b00100000);//hien hang tram
delay_us(500);
output_b(nghin|0b00010000);//hien hang nghin
delay_us(500);
}
void main()
{
set_tris_b(0x00);//chon port b lam port dau ra
set_tris_d(0x00);//chon port b lam port dau ra
while(1)
{
n++;
a=n;
led7();
}
}



e có down trên diễn đàn về đoạn code về led 7 doan. Cho e hỏi trong phần code trên:

output_b(dv|0b10000000); có nghĩa là gì. xuất ra portb (dv|0b10000000) là như thế nào ah.

alycuong
23-05-2011, 10:40 PM
#include <16F877a.h>
#define LED1 PIN_B4 //HANG NGHIN
#define LED2 PIN_B5 //HANG TRAM
#define LED3 PIN_B6 //HANG CHUC
#define LED4 PIN_B7 //HANG DON VI
#fuses hs, nowdt, put, nolvp, brownout
#use delay(clock=20000000)
int16 a,b,i,j,dv,chuc,tram,nghin,n;


void led7()
{
nghin=a/1000;
a=a%1000;
tram=a/100;
a=a%100;
chuc=a/10;
dv=a%10;
output_b(dv|0b10000000); //hien hang don vi
delay_us(1000);
output_b(chuc|0b01000000);//hien hang chuc
delay_us(1000);
output_b(tram|0b00100000);//hien hang tram
delay_us(500);
output_b(nghin|0b00010000);//hien hang nghin
delay_us(500);
}
void main()
{
set_tris_b(0x00);//chon port b lam port dau ra
set_tris_d(0x00);//chon port b lam port dau ra
while(1)
{
n++;
a=n;
led7();
}
}



e có down trên diễn đàn về đoạn code về led 7 doan. Cho e hỏi trong phần code trên:

output_b(dv|0b10000000); có nghĩa là gì. xuất ra portb (dv|0b10000000) là như thế nào ah.

k có ai giúp e ah.

qiuyinffy
14-06-2011, 09:15 AM
phía dưới bên trái có bảng mô phỏng

bbld
05-12-2011, 05:46 PM
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.

#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 ");
}



[/LIST]
mọi người cho mình hỏi 1 điều là LCD mình mới mua(chưa dùng đựoc lần nào).trong lcd_lib_4bit.c của anh linh có những hàm khởi tạo lcd đúng như nhà sx yêu cầu.vậy sao mình kết nối lcd dùng đoạn code trên thì ko chạy,chỉ hiện 1 dòng đen
mình đã define port rồi,RS=D0,EN=D2,D4-D7,vậy lỗi này có thể do LCD hỏng hay là do khởi tạo chưa đúng?

ngdnhanbk
11-01-2012, 03:18 AM
Buồn quá! Học PIC qua tutorial mà chỉ được 1 cái tutorial. hix

teemo
06-12-2014, 10:40 PM
anh ơi, làm sao khắc phục lỗi này vậy anh:
*** Error 18 "def_877a.h.c" Line 1(9,20): File can not be opened
Not in "E:\Program Files\PICC\devices\16F877A.h"
Not in "E:\Program Files\PICC\dr\16F877A.h"
Not in project "C:\Users\NhokPro1234\Documents\pi\project1\16F877A .h"
*** Error 128 "def_877a.h.c" Line 3(1,12): A #DEVICE required before this line
2 Errors, 0 Warnings.

Cannavarojo9
08-09-2017, 04:12 PM
Nguyễn Nguyễn Nguyễn Nguyễn royal1688 (https://xn--royal1688--ni5a0fsgb1mc.snbbet.com//)