PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Học PIC trong 1 ngày (Upd. 01/01/2006) (http://www.picvietnam.com/forum/showthread.php?t=5)

falleaf 28-05-2007 08:57 AM

Thử xem lại việc quản lý các cờ ngắt.

Chúc vui

tranvanthuong 28-05-2007 09:17 AM

HIC HIC, anh nào giup em di

tranvanthuong 28-05-2007 09:19 AM

a anh ơi~! em viết chạy ổn rồi ne!

Code:

#include "E:\ccs c\chuong_trinh_ccsc\banh_kem_duc_thanh\chuong_trinh.h"
#int_RB
RB_isr()
{
int8 y;
  disable_interrupts(INT_RB);
  disable_interrupts(GLOBAL);
 
 
  if ( input(PIN_B6) )        //tang gia tri trong o nho
    {
      y = read_eeprom(0x00);
      if(y<244)
        {
          y = y + 10;
          write_eeprom (0x00,y);
        }
    }
   

 if ( input(PIN_B7) )          //giam gia tri trong o nho
    {

      y = read_eeprom(0x00);
      if(y>10)
      {
        y = y - 10;
        write_eeprom (0x00,y);
      }
      }
     
 
    delay_ms(50);
   
   
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_RB);
   
}
//===========CAC CHUONG TRINH CON==============



void tao_tre(int8 x);




//============================================



void main()
{


  output_B(0x00);
  output_A(0x00);
  enable_interrupts(INT_RB);
  enable_interrupts(GLOBAL);




  while(1)
    {
      output_high(pin_B0);
      tao_tre(1);
      output_low(pin_B0);
      tao_tre(1);

      output_high(pin_B1);
      tao_tre(1);
      output_low(pin_B1);
      tao_tre(1);

      output_high(pin_B2);
      tao_tre(1);
      output_low(pin_B2);
      tao_tre(1);

      output_high(pin_B3);
      tao_tre(1);
      output_low(pin_B3);
      tao_tre(1);

      output_low(pin_B0);
      output_low(pin_B1);
      output_low(pin_B2);
      output_low(pin_B3);
      tao_tre(1);

      output_high(pin_B0);
      output_high(pin_B1);
      output_high(pin_B2);
      output_high(pin_B3);
      tao_tre(1);

      output_low(pin_B0);
      output_low(pin_B1);
      output_low(pin_B2);
      output_low(pin_B3);
      tao_tre(1);


    }
}
//============================================

void tao_tre(int8 x)
  {
        int8 z,i;

        z = x + read_eeprom (0x00);
        delay_ms(100);
        for(i=0;i<z;++i)
        delay_ms(2);

  }

//===========================================


Dolphin 15-07-2007 05:52 PM

+ Cho em hỏi về phần nút bấm với điện trở kéo lên. Khi bấm thì chân ở mức thấp (ok); khi ko bấm thì lam sao biết được trạng thái của chân? (do chân mắc với nguồn qua điện trở nên điện áp ở chân ko biết xác định thế nào, vẫn có thể là H hoặc L).
+ Đặt chân là input với điện áp là 0. Nếu nối chân đó với nguồn 5V thì nó sẽ chuyển từ 0-->5V và dòng điện sẽ chạy từ nguồn vào chân Pic? Còn nếu là output thì sao dòng điện sẽ chạy đi đâu?
Mấy cái này em vẫn chưa thông lắm...

namqn 15-07-2007 10:03 PM

Trích:

Nguyên văn bởi Dolphin (Post 10082)
+ Cho em hỏi về phần nút bấm với điện trở kéo lên. Khi bấm thì chân ở mức thấp (ok); khi ko bấm thì lam sao biết được trạng thái của chân? (do chân mắc với nguồn qua điện trở nên điện áp ở chân ko biết xác định thế nào, vẫn có thể là H hoặc L).
+ Đặt chân là input với điện áp là 0. Nếu nối chân đó với nguồn 5V thì nó sẽ chuyển từ 0-->5V và dòng điện sẽ chạy từ nguồn vào chân Pic? Còn nếu là output thì sao dòng điện sẽ chạy đi đâu?
Mấy cái này em vẫn chưa thông lắm...

1. Thông thường, người ta dùng điện trở vài k để kéo lên cho nút bấm, còn ngõ vào của PIC thì có tổng trở vào khá lớn (hàng megaohm). Do đó, nếu bấm nút thì điện áp đặt vào ngõ vào là 0V, còn không bấm nút thì điện áp đặt vào ngõ vào là điện áp ở điểm giữa của mạch phân áp, với 5V đi qua trở kéo lên, rồi đến điện trở vào hàng megaohm của PIC. Như vậy áp tại ngõ vào của PIC sẽ xấp xỉ 5V, tức là mức cao.

2. Câu này bạn hỏi không rõ ràng: 'Còn nếu là output thì sao dòng điện sẽ chạy đi đâu?'. Nếu bạn muốn biết khi bạn xuất mức cao hay thấp thì dòng điện sẽ chạy ra sao thì câu trả lời thế này: khi bạn xuất mức cao, MOSFET phía cao của cặp transistor ngõ ra sẽ dẫn, do đó ngõ ra là gần bằng 5V và PIC cấp dòng cho tải, nếu có tải thì tùy theo dòng tải mà điện áp ở ngõ ra sẽ bị giảm nhiều hay ít do áp rơi trên MOSFET phía cao. Khi bạn xuất mức thấp, MOSFET phía thấp của cặp transistor ngõ ra sẽ dẫn, do đó ngõ ra là gần bằng 0V và PIC rút dòng từ tải xuống Vss, nếu có tải thì tùy theo dòng tải mà điện áp ở ngõ ra sẽ cao hơn Vss nhiều hay ít do áp rơi trên MOSFET phía thấp. Bạn xem thêm mục I/O Ports trong các datasheet của chip sẽ thấy họ vẽ cấu trúc của ngõ ra.

Thân,

vodka1505 30-03-2008 07:26 PM

- Bác nào rảnh giải thích giúp em cái hàm Delay này cái:
Code:

Delay
        Movlw        d’250’
        Movwf        count1
D1       
        Movlw        0xc7
        Movwf        counta
        Movlw        0x01
        Movwf        countb
Delay_0
        Decfsz        counta, f
        Goto                $+2
        Decfsz        countb, f
        Goto                Delay_0
        Decfsz        count1, f
        Goto                D1
        Return

- em chưa hiểu về cái lệnh này "Goto $+2"?
- và lệnh "Goto Delay_0" với "Goto D1" thì có gì khác nhau? em thấy trong một số hàm Delay người ta chỉ dùng có lệnh "Goto Delay_0"
Em xin cảm ơn rất nhiều.

namqn 30-03-2008 07:55 PM

$ là địa chỉ lệnh hiện hành, $ + 2 là ô nhớ lệnh cách vị trí hiện hành 2 đơn vị.

Với ví dụ trên của bạn (giả sử viết cho PIC16), lệnh GOTO $ + 2 dùng để chuyển điều khiển đến lệnh GOTO Delay_0 nếu sau khi giảm biến counta kết quả vẫn khác 0 (tức là nếu sau khi giảm counta mà counta vẫn khác 0 thì bỏ qua lệnh giảm countb).

Đoạn chương trình trên dùng 3 biến đếm, do đó nếu cập nhật counta, rồi countb, thì sẽ đến lượt count1 được cập nhật. Do đó cần dùng các nhãn Delay_0 hay D1 cho các lệnh GOTO một cách thích hợp.

Thân,

vodka1505 31-03-2008 08:51 PM

- Cảm ơn anh Nam đã giúp đỡ:
em viết hàm delay như này được không? và hai cái này khác nhau ở chỗ nào?
Code:

Delay
        Movlw        d’250’
        Movwf        count1
        Movlw        0xc7
        Movwf        counta
        Movlw        0x01
        Movwf        countb
Delay_0
        Decfsz        counta
        Goto        Delay_0
        Decfsz        countb
        Goto        Delay_0
        Decfsz        count1
        Goto        Delay_0
        Return


vnchampion 13-04-2008 03:26 PM

Chài khó hiểu quá mấy bác ơi

thaile 13-04-2008 09:35 PM

PIC16 thì em không biết nhưng với PIC18F4580 thì không cần lưu lại giá trị của PCLATH :
1>Bình thường nếu không có tác động trực tiếp thì thanh ghi PCLATH sẽ không thay đổi giá trị, kể cả khi PC thay đổi từ địa chỉ 0xFF đến 0x100. Lúc đó PCL=00 và PCLATH=00. ( Kết quả có được nhờ giả lập MPLAB SIM)
2>Sau lenh RETIF hoặc RET thì chương trình đọc PC từ Stack (TOSL, TOSH, TOSU). Lúc này PC sẽ được phục hồi như ngay tại thời điểm gặp ngắt, hoặc lệnh CALL. Nhưng PCLATH vẫn không bị thay đổi nếu không có lệnh tác động trực tiếp (chẳng hạn MOVWF PCLATH)
3>Thanh ghi PCLATH chỉ có tác dụng khi ta tác động ghi lên thanh ghi PCL, chẳng hạn:
+ với PCLATH=1 thì lệnh MOVWF PCL sẽ làm cho PC=0x100 ( với WREG=0)

Nói túm lại bình thường PC không tham khảo đến thanh ghi PCLATH, chỉ khi có tác động ghi trực tiếp lên thanh ghi PCL thì PC mới tham khảo đến nó. Theo em thấy thì khi sử dụng bảng mới thực sự cần đến thanh ghi PCLATH

Em là Newbie, có sai sót gì thì nhẹ nhàng chỉ bảo em ^^

tuanlq14 14-04-2008 05:44 PM

co thể chạy chương trinh MPLAB ngay trong CCS C không
co thể vừa viết MPLAB và CCS C cung trong CCS C không

namqn 14-04-2008 08:30 PM

Trích:

Nguyên văn bởi tuanlq14 (Post 15549)
co thể chạy chương trinh MPLAB ngay trong CCS C không
co thể vừa viết MPLAB và CCS C cung trong CCS C không

MPLAB IDE là môi trường phát triển tích hợp, CCS C là một trình biên dịch. Do đó, nói ngược lại thì đúng hơn, nghĩa là có thể nhúng CCS C vào MPLAB IDE.

Bản thân CCS cũng có IDE. Tuy nhiên, IDE của CCS không hỗ trợ các trình biên dịch của Microchip (MPLAB C18, MPLAB C30, MPLAB C32).

Thân,

vodka1505 19-04-2008 04:36 PM

Code:

;==============================================================================================
;KHOI TAO VI DIEU KHIEN
                TITLE                "TUTORIAL_1"
                PROCESSOR        P16F628A
                INCLUDE                <P16F628A.INC>
                __CONFIG        _CP_OFF&_PWRTE_OFF&_WDT_ON&_HS_OSC
;==============================================================================================
;PHAN DAT BIEN
                ORG                        0x20
COUNT1        RES                        1
COUNTA        RES                        1
COUNTB        RES                        1
;==============================================================================================
                ORG                        0x0000
                GOTO                MAIN
                ORG                        0x0005
MAIN       
;                MOVLW                0x07                                ;CHUYEN 0000 0111 VAO THANH GHI W
;                MOVWF                CMCON                        ;TAT THANH GHI SO SANH

                BANKSEL        TRISB
                CLRF                TRISB

                BANKSEL                PORTB
                CLRF                PORTB
               
LOOP
                MOVLW                B'11111111'                ;W = 1111 1111
                MOVWF                PORTB                ;SANG CAC LED
                CALL                DELAY                        ;GOI HAM TAO TRE

                MOVLW                B'00000000'                ;W = 0000 0000
                MOVWF                PORTB              ; TAT LED
                CALL                DELAY                        ;GOI HAM TAO TRE

                MOVLW                B'11111111'                ;W = 1111 1111
                MOVWF                PORTB                ;
                CALL                DELAY                        ;GOI HAM TAO TRE

                MOVLW                B'00000000'                ;W = 0000 0000
                MOVWF                PORTB
                CALL                DELAY                        ;GOI HAM TAO TRE
       
                MOVLW                B'11111111'                ;W = 1111 1111
                MOVWF                PORTB                ;
                CALL                DELAY                        ;GOI HAM TAO TRE

                MOVLW                B'00000000'                ;W = 0000 0000
                MOVWF                PORTB
                CALL                DELAY                        ;GOI HAM TAO TRE

                MOVLW                B'11111111'                ;W = 1111 1111
                MOVWF                PORTB                ;
                CALL                DELAY                        ;GOI HAM TAO TRE

                MOVLW                B'10000000'
                MOVWF                PORTB
LOOP_1
                CALL                DELAY
                BCF                        STATUS, C
                RRF                        PORTB
                BTFSS                STATUS, C
                GOTO                LOOP_1

                MOVLW                B'00000001'
                MOVWF                PORTB
LOOP_2
                CALL                DELAY
                BCF                        STATUS,C
                RLF                        PORTB
                BTFSS                STATUS,C
                GOTO                LOOP_2

                MOVLW                B'11000000'
                MOVWF                PORTB
                CALL                DELAY

                MOVLW                B'11100000'
                MOVWF                PORTB
                CALL                DELAY

                MOVLW                B'11110000'
                MOVWF                PORTB
                CALL                DELAY

                MOVLW                B'11111000'
                MOVWF                PORTB
                CALL                DELAY

                MOVLW                B'11111100'
                MOVWF                PORTB
                CALL                DELAY

                MOVLW                B'11111110'
                MOVWF                PORTB
                CALL                DELAY

                MOVLW                B'11111111'
                MOVWF                PORTB
                CALL                DELAY               

                GOTO                LOOP                        ;GO BACK AND DO IT AGAIN
;==============================================================================================
;CHUONG TRINH CON
;----------------------------------------------------------------------------------------------
DELAY
                MOVLW                D'255'                        ;
                MOVWF                COUNT1                ;COUNT1 = 255
                MOVLW                d'255'                        ;
                MOVWF                COUNTA
;                MOVLW                d'51'
;                MOVWF                COUNTB
DELAY_1
                DECFSZ                COUNT1                ;COUNT1 = COUNT1 - 1
                GOTO                DELAY_1                        ;QUAY TRO LAI NHAN DELAY
;                DECFSZ                COUNTA                ;COUNTA = COUNTA - 1
;                GOTO                DELAY_1
                DECFSZ                COUNTB
                GOTO                DELAY_1       
                RETURN
GOTO        $
END

- Đoạn chương trình trên của em chạy rất tốt nếu khai báo dùng thạch anh nội của PIC, còn nếu em khai bao như trên ( dùng thạch anh ngoài) thì nó không chạy. cụ thể là các led không nháy, và chân rb4 của nó không có mức tín hiệu cao, mặc dù em đã set nó lên mức cao.
- Anh nào biết nó sai ở chỗ nào chỉ giúp em với. Mạch em dùng thạch anh 10Mhz, tụ gốm 33p.
Cảm ơn các anh nhiếu

vodka1505 21-04-2008 08:20 AM

không có ai giúp mình sao? đang cần quá.

namqn 21-04-2008 09:05 AM

Bạn đã khẳng định là chương trình chạy tốt rồi, chỉ có thay đổi thiết lập cấu hình từ bộ dao động nội sang thạch anh ngoài thôi. Như vậy có nhiều khả năng là thạch anh không dao động (đã có bạn gặp trường hợp là chân OSC2 bị hỏng, do đó chỉ dùng được cấu hình clock ngoài, không dùng được cấu hình thạch anh ngoài). Bạn cũng chú ý là bạn đang bật WDT, và trong code không hề có lệnh xóa WDT. Có khả năng là bạn tắt WDT khi chạy bằng bộ dao động nội, và bật WDT khi cấu hình lại để dùng thạch anh ngoài hay không?

Thân,


Múi giờ GMT. Hiện tại là 05:04 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam