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 for PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=357)

dvnccbmacbt 30-06-2007 08:12 PM

Các bác ơi! Em gặp nhiều trường hợp vẽ orcad bị nhầm. Theo em biết thì proteus có thể mô phỏng và thiết kế mạch in nữa. Vậy tại sao không dùng Proteus? Có ai so sánh hai món này giúp em ko? Cho em hỏi thêm: Làm sao để tạo bus trong proteus. Cảm ơn các bác rất nhiều!

anh_gioi 01-07-2007 01:27 AM

cái đoạn code này:
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=8
#use delay(clock=10000000)
#use fast_io(b)
int8 adc;
main()
{set_tris_b(0);
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(0);
delay_ms(10);
while(true)
{
adc=read_adc();
output_B(adc);
}
}

/////////////////////////////
setup_adc_ports(AN0);
//tại sao lại lại chọn chân AN0, mình có thể chọn chân khác được không.nếu chọn chân khác thì mình có phải thay thông số nào khác nữa không?
thank!

thaithienanh 01-07-2007 04:22 AM

To anh giỏi @ : bạn phải nắm đuợc các tập lệnh sẵn của ccs :)

Như lệnh Setup_ADC_port (value) dùng để xác định chân nhận tín hiệu Analog và điện thế chuẩn sử dụng (Vref), thường thì mình hay dùng (all_analogs) tức là dùng hết các chân analog mà VDK cung cấp và điện thế chuẩn bằng VDD,
nhưng tuỳ vào nguời sử dụng muốn biến một chân Analog thành pin I/O và Vref từ một nguồn khác thì sẽ chọn value này khác đi :o .

Lệnh Set_ADC_channel (channel) dùng để chọn chân đọc giá trị ADC
channel là các số từ 0->n (n phụ thuộc vào từng loại vi điều khiển đuợc trang bị bao nhiêu cổng ADC) ví dụ như bạn nhìn thấy chân AN3, và bạn muốn đọc giá trị từ chân này thì bạn sẽ đánh vào là (3) rất đơn giản phải không :D

Ví dụ cho bạn chút nhá :
setup_adc(adc_clock_internal); // chọn xung lấy mẫu ADC = xung nội
setup_adc_ports(all_analogs); //sử dụng tất cả các chân ADC và vef=VDD
While(true){ // vòng lặp chính
while(true){
set_adc_channel(0); // chọn chân lấy mẫu là ANO
delay_ms(10); // tạo trễ để lấy mẫu ADC chuẩn xác
adc0=read_ADC(); // nạp giá trị đọc đuợc vào biến adc0
set_adc_channel(1); // chọn chân lấy mẫu là AN1
delay_ms(10);
adc1=read_ADC();
}
sau đó bạn muốn làm gì đó với các giá trị thu đuợc thì làm OK ;)
}

To dvnccbmacbt @ : Proteus hỗ trợ luôn cho nguời dùng tiện ích là Ares (thần nam tính theo ngữ hi lạp cổ :D), mình có thể dùng để vẽ mạch khá tốt, đồ hoạ khá bắt mắt (có hỗ trợ cả chức năng mô phỏng mạch 3D), giải thuật giải đẩy khi đi mạch của nó cũng khá thông minh (hơn cả Orcad tất nhiên là theo mình thui), nhưng nó có một điểm cực yếu là khi đi vào cấy hình chi tiết các thông số cho mạch in thì nó không có đủ :( , nên nếu là các mạch dơn giản thì Proteus là một trong những lựa chọn hàng đầu của mình, Orcad điểm mạnh là các thông số OK (quá chi tiết), trình nhiều nguời dùng nên có thể giao lưu học hỏi qua lại, phần help dễ nắm bắt..v.v... tuy nhiên điểm yếu của nó là cực kỳ dễ nhầm lẫn trong thiết kế (chỉ cần phần nguyên lý bạn không cẩn thận chồng dây hay gì đó là sinh chuyện rồi :mad:), đồ hoạ thì xấu hoắc, thuật đi mạch thì ngốc hết biết (thường thấy mấy anh dùng toàn vẽ tay :D),... Nên lựa chọn hàng đầu của mình hiện giờ là Protel hoàn hảo hết tất cả những gì mình muốn ,khuyên bạn nên dùng Protel nếu như cảm thấy mình có khả năng tự tiếp thu tốt (do tài liệu hiện rất ít và chẳng đầy đủ) và chọn Orcad khi muốn học hỏi lớp nguời đi trước ;),

Còn về vẽ Bus trong Proteus thì quá đơn giản rùi bạn chọn cái tool nào có hình giống như "sợi bus" vậy là xong, sau đó nối các đường dây từ linh kiện vào dùng tiếp tool net_label đặt nhãn cho từng đường để bus còn biết đâu là các đầu dây của cùng một dây :o , nếu vẫn chưa hiểu rõ về bus thì bạn phải tìm về một ví dụ nào đó rồi xem tại sao lại nối như vậy

Chú ý nếu bạn vẫn chưa rõ thì hãy rê chuột lên trên các tool chờ 1 lát trình sẽ hiện lên tên của từng tool (cái này giúp ích bạn rất nhiều khi mò mẫm một phần mềm nào đấy ;) )

dvnccbmacbt 01-07-2007 08:49 PM

Tui có cuốn sách này về CCS. hi vọng có thể giúp cho cho 1 số bạn :
http://d3.myfreefilehosting.com/d1/C...update%20I.pdf

namqn 01-07-2007 08:57 PM

Trích:

Nguyên văn bởi thaithienanh (Post 9723)
To dvnccbmacbt @ : Proteus hỗ trợ luôn cho nguời dùng tiện ích là Ares (thần nam tính theo ngữ hi lạp cổ :D), mình có thể dùng để vẽ mạch khá tốt, đồ hoạ khá bắt mắt (có hỗ trợ cả chức năng mô phỏng mạch 3D), giải thuật giải đẩy khi đi mạch của nó cũng khá thông minh (hơn cả Orcad tất nhiên là theo mình thui), nhưng nó có một điểm cực yếu là khi đi vào cấy hình chi tiết các thông số cho mạch in thì nó không có đủ :( , nên nếu là các mạch dơn giản thì Proteus là một trong những lựa chọn hàng đầu của mình, ...

Cho ví dụ về những thông số cho mạch in mà Proteus không có đủ?

Thân,

cuopbienquin 09-07-2007 08:12 PM

Chương trình ngắt đây
 
1 Attachment(s)
Các bạn coi gium` mình có sai chỗ nào không mà mình delay không được
Mình muốn khi đóng RB4 thì LED sẽ nháp nháy với delay 50ms chẳng hạn.
Phần ngắt chuyển chế độ thì mình làm được nhưng delay trong mỗi chế độ thì potay.
Code:

#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=1000000)
#use fast_io(b)
#byte portb=0x06
#byte intcon=0x000B
#bit RB4=portb.4
#bit RB5=portb.5
#bit RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB

// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
  {
      //Kiem tra sw1
      {
      if(RB4==0)
        {
       
        portb=0b00000001;
       
        delay_ms(200);
        portb=0b00001111;
        delay_ms(200);
                 
        }
      }
      //Kiem tra sw2
      {
      if(RB5==0)
        {
        portb=0b00001000;
                                    }
      }
     
  RBIF=0; //Xoa co ngat RB
  }
}
// Chuong trinh chinh
main()
{
set_tris_b(0b11110000);
portb=0b11110000;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
  {
 
  }
}


nhh 09-07-2007 08:53 PM

Trích:

Nguyên văn bởi cuopbienquin (Post 9943)
Các bạn coi gium` mình có sai chỗ nào không mà mình delay không được
Mình muốn khi đóng RB4 thì LED sẽ nháp nháy với delay 50ms chẳng hạn.
Phần ngắt chuyển chế độ thì mình làm được nhưng delay trong mỗi chế độ thì potay.
Code:

#include <16F877A.h>
...
}


Code:

#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#byte intcon=0x000B
#bit RB4=portb.4
#bit RB5=portb.5
#bit RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB

// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
  {
      //Kiem tra sw1
      {
      if(RB4==0)
        {
       
        portb=0b00000001;
       
        delay_ms(50);
        portb=0b00001111;
        delay_ms(50);
                 
        }
      }
      //Kiem tra sw2
      {
      if(RB5==0)
        {
        portb=0b00001000;
                                    }
      }
     
  RBIF=0; //Xoa co ngat RB
  }
}
// Chuong trinh chinh
main()
{
set_tris_b(0b11110000);
portb=0b11110000;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
  {
  }
}

Đã sửa lại cho phù hợp file mô phỏng của bạn. Với code trên, kết thúc ngắt tất nhiên ko còn delay nữa. 50ms hơi ít, tăng lên 1000ms, thấy kết quả.

cuopbienquin 09-07-2007 10:55 PM

Mình đã sữa lại thành 1000ms và đã chạy mô phỏng được,có điều khi chuyển chế độ (nhấn button tới 2 lần và mối làn nhấn phải giữ một thời gian) thì mới chuyển được .
Mình muốn nhấn button (1 lần) thì chế đọ 1 chạy,nhấn button 2 thi chế độ 2 chạy,vạy thôi.Mình hi vọng các bạn có thể sửa giùm mình thêm đoạn code đó nha.
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#byte intcon=0x000B
#bit RB4=portb.4
#bit RB5=portb.5
#bit RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB

// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
{
//Kiem tra sw1
{
if(RB4==0)
while(RB5==1)
{

portb=0b00000001;
delay_ms(1000);
portb=0b00001111;
delay_ms(1000);

}
}
//Kiem tra sw2
{
if(RB5==0)
while(RB4==1)
{
portb=0b00001000;

delay_ms(1000);
portb=0b00001111;
delay_ms(1000);
}
}

RBIF=0; //Xoa co ngat RB
}
}
// Chuong trinh chinh
main()
{
set_tris_b(0b11110000);
portb=0b11110000;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
{
}
}

tranvanthuong 11-07-2007 09:47 AM

BẠN SỪA LẠI #fuses NOWDT,PUT,XT,NOPROTECT THÀNH
#fuses NOWDT,PUT,HS,NOPROTECT LÀ CHƯƠNG TRÌNH ỔN RỒI

tranvanthuong 11-07-2007 09:50 AM

Lúc Bạn Viết Chương Trình Ngắt Thì Trong Chương Trình Này Phải Cấm Ngắt Toàn Cục Xử Lí Xong Mới Cho Phép Ngắt Lại
Vài điều Trao đổi Cùng Bạn!

cuopbienquin 11-07-2007 02:34 PM

thx bạn nhiều.Mình chạy được rồi,ah,mà bạn giải thích mình thay "Xt" trong dòng đó bằng "HS" la sao hả bạn.

anh_gioi 12-07-2007 09:52 AM

bài này:
Code:

/*-----------------------------------------------------------------------------
* Author    : nhh
* Date      : 05/04/06
* Hardware  : PIC16F877A
* Compiler    : CCS C 3.249
* Description  : Hien thi LCD
*=============================================================================*/
#include <16F877A.h>
//#include <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define RS  RD0
#define RW  RD1
#define E  RD2
#define LCD PORTB

/*Ham yeu cau goi lenh dieu khien LCD*/
void comnwrt(void)
{
 RS = 0;
 RW = 0;
 E  = 1;
 E  = 0;
 delay_ms(1);
}
/*Ham yeu cau goi du lieu hien thi len LCD*/
void datawrt(void)
{
 RS = 1;
 RW = 0;
 E  = 1;
 E  = 0;
 delay_ms(1);
}
/*Ham main*/
void main(void)
{
 set_tris_B(0);
 set_tris_D(0);
 delay_ms(100);  //  Tao tre 100ms cho LCD khoi dong

 LCD = 0x38;      //  Hai hang, ma tran dot 5*7, 8 bit interface
 comnwrt();
 LCD = 0x0C;      //  Bat hien thi, tat con tro
 comnwrt();

 LCD = 0x85;      //  Vi tri hang 1,cot 6
 comnwrt();

 LCD = 'B';      //  Xuat dong chu "BE YEU" ra LCD
 datawrt();
 LCD = 'E';
 datawrt();
 LCD = ' ';
 datawrt();
 LCD = 'Y';
 datawrt();
 LCD = 'E';
 datawrt();
 LCD = 'U';
 datawrt();
 LCD = '!';
 datawrt();
}

bài này không bít gọi file DEFS_16F877A.h ra như thế nào nhỉ?
mong mọi người chỉ dùm.thank!

namqn 12-07-2007 06:56 PM

Trích:

Nguyên văn bởi cuopbienquin (Post 9985)
thx bạn nhiều. Mình chạy được rồi,ah,mà bạn giải thích mình thay "Xt" trong dòng đó bằng "HS" la sao hả bạn.

XT là đặt bộ dao động ở chế độ dùng với thạch anh tần số thấp (4 MHz trở lại), HS là đặt bộ dao động ở chế độ dùng với thạch anh tần số cao hơn (4 MHz đến maximum của chip).

Thân,

anh_gioi 12-07-2007 07:30 PM

mọi ngừoi ơi! xem hộ mã này với
không bít có sai gì ko ,nó không báo lỗi nhưng nó không hiển thị chữ

Code:

#include "16F877A.h"
#include "C:\Documents and Settings\Administrator\Desktop\DEFS_16F877A\DEFS_16F877a.h"
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 4M)
#define RS RD0
#define RW RD1
#define E  RD2
#define LCD portB

//tao ham goi lenh dieu khien
void comnwrite(){
                    RS = 0; //chon thanh ghi lenh 
                    RW = 0; //chon che do ghi
                    E = 1; //tao suon xung
                    E = 0;
                    delay_ms(1); //tao do tre cho LCD
                          }
// tao ham ghi du lieu
void datawrite(){
                  RS = 1;
                  RW = 0;
                  E = 1;
                  E = 0;
                  delay_ms(1);
                          }
//ham chinh
void main(){
            set_tris_b(0);
            set_tris_d(0);
            delay_ms(100); //tao tre cho lcd khoi dong
           
            LCD = 0x38; //tao ma tran 5x7
            comnwrite();
            LCD = 0x0C ; //bat hien thi,tat con tro
            comnwrite();
            LCD = 0x80; //dau dong thu nhat
            comnwrite();
           
            //xuat chu ANH_GIOI
            LCD = 'A';
            datawrite();
            LCD = 'N';
            datawrite();
            LCD = 'H';
            datawrite();
            LCD = '_';
            datawrite();
            LCD = 'G';
            datawrite();
            LCD = 'I';
            datawrite();
            LCD = 'O';
            datawrite();
            LCD = 'I';
            datawrite();
                    }

thank!

namqn: bạn xem lại tôi sửa như thế nào để hiển thị code, sau đó bạn làm như vậy khi post code. Tôi không thể sửa cho mọi post có code được.

anh_gioi 12-07-2007 08:43 PM

kiểm tra lại hóa ra chẳng có lỗi gì cả.


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