PIC Vietnam

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

namqn 10-01-2009 06:07 PM

Bạn sửa lại code trong vòng while (1) của bạn thành như sau xem:
Code:

  while (1)
      {
        PORTB = PORTB | 0x0C;        //Bat cac bit RB2 va RB3
        delay_ms(1000);
        PORTB = PORTB & 0xF3;        //Tat cac bit RB2 va RB3
        delay_ms(1000);
      }

Bạn đọc thêm về hoạt động read-modify-write đã được nói đến nhiều lần trên diễn đàn, chẳng hạn ở đây:
http://www.picvietnam.com/forum/showthread.php?p=4613

Thân,

vdtk3 10-01-2009 08:06 PM

Cảm ơn bác Namqn nhiều em thử được rồi ! Mấy hôm trước em cũng viết vậy nhưng vẫn chạy bình thường, cứ tưởng là máy bị Virut cơ chứ .

namqn 10-01-2009 08:52 PM

Trích:

Nguyên văn bởi vdtk3 (Post 22069)
Cảm ơn bác Namqn nhiều em thử được rồi ! Mấy hôm trước em cũng viết vậy nhưng vẫn chạy bình thường, cứ tưởng là máy bị Virut cơ chứ .

Với tốc độ xung clock tương đối thấp, bạn có thể gặp may rằng các hiện tượng liên quan đến hoạt động read-modify-write chưa đủ mạnh để làm cho PIC của bạn chạy không đúng ý đồ.

Thân,

ga_dientu 14-01-2009 04:40 AM

Code:

#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#define led pin_B0
int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count==2000)
  {
count=0;
a=a<<1;  // dich trai a 1bit
  }
if(a==256)
  {
a=1;
count=0;
  }
}
//Chuong trinh chinh
main()
{
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6);
count=0;
a=1;
while(true)
  {
portb=a;
  }
}

Đây là chương trình dùng ngắt Timer0 định thời 1s của anh NHH,mong a chị giải đáp dùng em làm sao tính được thời gian định thời trong chương trình này

ga_dientu 16-01-2009 08:09 PM

Việc tính toán thời gian định thời của Timer em đã hiểu, chỉ còn vấn đề tại sao lại set_timer0 (6). Mong sớm nhận được câu trả lời .

manhha2799 16-01-2009 08:53 PM

set_timer0 (6) là để cho chương trình đếm từ bắt đầu từ số 6 chứ không phải là số 0. Tức là mỗi lần tràn là 256-6=250.

namqn 16-01-2009 09:45 PM

Trích:

Nguyên văn bởi manhha2799 (Post 22208)
set_timer0 (6) là để cho chương trình đếm từ bắt đầu từ số 6 chứ không phải là số 0. Tức là mỗi lần tràn là 256-6=200.

256 - 6 = 250!

Thân,

ga_dientu 06-02-2009 10:33 PM

Một số chương trình hiến thị LCD có viết là LCD = 0xC3 // vị trí hàng 2,cột 4//,em chưa hiểu mấy cách xác định vị trí này.

namqn 06-02-2009 10:57 PM

Trích:

Nguyên văn bởi ga_dientu (Post 22426)
Một số chương trình hiến thị LCD có viết là LCD = 0xC3 // vị trí hàng 2,cột 4//,em chưa hiểu mấy cách xác định vị trí này.

Bạn tham khảo các tutorial về các module LCD, chẳng hạn như ở đây:
http://www.winpicprog.co.uk/pic_tutorial3.htm

Để đặt con trỏ màn hình LCD ở một vị trí nào đó, bạn sẽ dùng lệnh "Set Display Address", có bit 7 mang giá trị '1' (ứng với giá trị 0x80). 7 bit thấp hơn của lệnh sẽ xác định địa chỉ cần di chuyển con trỏ đến. Thông thường, hàng 1 của LCD có địa chỉ bắt đầu là 0x00, hàng 2 của LCD có địa chỉ bắt đầu là 0x40.

Do đó, cột 4 của hàng 2 sẽ có địa chỉ là 0x43. Như vậy cần xuất lệnh 0x80 + 0x43 = 0xC3 để di chuyển đến hàng 2, cột 4.

Thân,

thaithien 05-03-2009 10:34 PM

Em lục nhưng chưa thấy link download CCS.Ai biết chỉ dùm.Cám ơn

namqn 06-03-2009 12:17 AM

Trích:

Nguyên văn bởi thaithien (Post 23261)
Em lục nhưng chưa thấy link download CCS.Ai biết chỉ dùm.Cám ơn

Bạn tìm nhầm luồng rồi, luồng dưới đây mới là chỗ để tìm link download:
http://www.picvietnam.com/forum/showthread.php?t=958

Thân,

vietanh 06-03-2009 05:54 AM

đây này bản bản 4.084 http://rapidshare.com/files/176228329/CCS_4.084.RAR
con đây la bùa chú // http://rapidshare.com/files/176409172/Key_pcwhd.exe

notbadday 08-03-2009 05:53 PM

Lỗi với khai báo #device *=16 ADC=10
 
Em đang viết chương trình sử dụng ADC 10 bit. Dùng khai báo #device *=16 ADC=10 nhưng bị báo lỗi. Đã thử ở CCS 4.057 và 4.084 nhưng đều báo lỗi (=> ko phải do phần mềm)
Đây là code của em nó:
Code:

#include <16F877A.h>
#include <stdlib.h>
#device *=16 ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP

void main()
{
}


vietanh 08-03-2009 09:03 PM

kiêm tra lại cai ##include <stdlib.h> cua bạn co trong thư viện không . không co thi xoa dong đó di dich ok

nếu không ban phai viết nhu thế nay thi moi đúng không bao sai
#include <16F877A.h>
#device *=16 ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP
#include <stdlib.h>
void main()
{
}

notbadday 08-03-2009 11:11 PM

Cám ơn bạn. Mình đã sửa lại được rồi. Khai báo #device ngay dưới dòng #include <16F877A.h> thì không bị báo lỗi nữa. Có lẽ CCS bắt phải theo thứ tự vậy :-/
Code:

#include <16F877A.h>
#device *=16 ADC=10
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP

void main()
{
}



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