Thông báo

Collapse
No announcement yet.

Timer 0 for PIC18LF4550 ???

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Timer 0 for PIC18LF4550 ???

    Gởi các huynh đệ trên diễn đàn có thể giúp tại hạ debug mấy lỗi sau với. Tại hạ chỉ muốn làm thử một chương trình nhấp nháy LED ở chân RA0 --> phần cứng rất cơ bản, còn đây la code của ct:
    ----------------------------------------------------------------
    program written by Eng.X - HT-PIC18 v8.35PL
    project to blind 1 LED on RA0
    ----------------------------------------------------------------

    #include<pic18.h>
    #include<stdio.h>

    /* Chu thich cho cac bit cau hinh */
    __CONFIG(1, HSPLL & PLLDIV1 & CPUDIV2 & FCMDIS & IESODIS);

    bit out;

    void interrupt Timer0(void)
    {
    if (TMR0IF == 1) //xac dinh ngat timer 0 thi thuc hien ct
    {
    TMR0IF = 0; // Xoa co ngat Timer 0
    TMR0H = 0xAA; // nap lai so dem
    TMR0L = 0xAA;
    if(out == 1)
    {
    out = 0;
    RA0 = out;
    }
    if(out == 0)
    {
    out = 1;
    RA0 = 0;
    }
    }
    }


    void main ()
    {
    OSTS = 1;
    INTCON = 0b11100100;
    IPEN = 1;
    T0CON = 0b10100000;
    TMR0H = 0xAA;
    TMR0L = 0xAA;
    TMR0ON =
    out = 1;
    TRISA = 0;
    while(1)
    {
    TRISA = 0;

    };
    }

    Nhung ko thấy mạch nhấp nháy tẹo nào cả !
    Troi ko so dat ko so chi so minh ko biet so

  • #2
    Trong đoạn chương trình xử lý ngắt, trong cả hai trường hợp bạn đều gán RA0 = 0 thì làm sao nhấp nháy được.

    Thân,
    Biển học mênh mông, sức người có hạn

    Comment


    • #3
      Phân tích đoạn code này:

      __CONFIG(1, HSPLL & PLLDIV1 & CPUDIV2 & FCMDIS & IESODIS);

      Với config như trên, chắc bác KST dùng thạch anh 4MHZ, nếu đúng như vậy thì PIC của bác đang chạy ở 48MHz.


      INTCON = 0b11100100;
      IPEN = 1;

      Đoạn khởi tạo trên thì bác nên để IPEN trước INTCON. Vì cấu hình INTCON phụ thuộc vào IPEN nên bác phải khai báo nó trước.

      T0CON = 0b10100000;

      Với cấu hình T0CON như trên thì bác dùng T0 ở chế độ 16 bit và nguồn clk lấy từ chân T0CKI theo sườn lên và chia 2.

      TMR0ON là không cần thiết.

      Bác nạp cho TMR0 giá trị AA x 256 + AA = 170x256 + 170 = 43690.
      Như vậy số clk để TMR0 tràn là 65536 - 43690 = 21846.
      PIC chạy ở tốc độ 48Mhz như vậy thời gian tràn của TMR0 là 1/(48.10^6)*21846 xấp xỉ 0.46ms.

      Trong vòng while(1) bác nên để NOP(); hay CLRWDT();

      Còn vụ viết ngắt chắc bác KST quen viết Keil rồi. PIC bang hiếm ai viết vậy

      Chươngh trình sau nháy LED chân RA0, cỡ 0.5s, tại hạ copy từ một chương trình khác:

      #include<pic18.h>

      /* Chu thich cho cac bit cau hinh */
      __CONFIG(1,HSPLL & USBPLL & PLLDIV1 & CPUDIV1 & FCMDIS & IESODIS);

      const TMR0H_RELOAD = 0x0E8;
      const TMR0L_RELOAD = 0x99;
      unsigned int count=0;

      void interrupt MyISR(void)
      {

      if (TMR0IF==1) //xac dinh ngat timer 0 thi thuc hien ct
      {
      count++;
      TMR0IF = 0; // Xoa co ngat Timer 0
      TMR0ON = 0; // Tat Timer 0
      TMR0H = TMR0H_RELOAD; //moi lan tran la 1ms
      TMR0L = TMR0L_RELOAD;
      TMR0ON = 1;
      if (count==100)
      {
      count=0;
      RA0 = !RA0;
      }

      }

      } //end of ISR

      void main ()
      {

      INTCON = 0b11100100;
      IPEN = 1;
      T0CON = 0b10000010; //chia 8


      TMR0H = TMR0H_RELOAD;
      TMR0L = TMR0L_RELOAD;

      TRISA = 0;

      while(1)
      {
      CLRWDT();
      }

      }

      Comment


      • #4
        Goi MOD Hoa, chương trình của huynh đệ không chạy. RA0 luôn ở mức 1 ??? He hehe h e. tại sao vậy nhỉ các huynh đệ ???
        Troi ko so dat ko so chi so minh ko biet so

        Comment


        • #5
          tôi đồng ý với nhận định của bác namqn, đoạn code xử lý LED của KST có vấn đề:
          ---------------------
          if(out == 1)
          {
          out = 0;
          RA0 = out;
          }

          if(out == 0)
          {
          out = 1;
          RA0 = 0;
          }
          ----------------------
          ban đầu KST khời tạo bit OUT = 1--->
          + lần vào ngắt đầu tiên sẽ thực hiện nhánh lệnh trên lúc này OUT=RA0=0,
          + lần vào ngắt thứ 2 --->nhánh lệnh dưới thực hiện (lỗi tại đây), KST dựng OUT trở lại 1, nhưng lại ko gán RA0=OUT để = 1 mà gán RA0=0
          + lần vào ngắt thứ 3 lại trở lại nhánh trên vì Out=1---> RAO=0

          Như vậy dù phần hardware ok, và chương trình đã vào ngắt--->nhưng
          RA0 lại luôn bằng 0---> LED luôn sáng hay luôn tắt tùy thuộc phần cứng của KTS.
          ---------
          Không biết lệnh của KST là
          if then
          else
          then
          hay
          if then

          if then
          ----------------------

          Comment


          • #6
            Hu huu huu, tại hạ đã sửa như vậy rồi mà có được đâu. Tại sao thế ???
            Troi ko so dat ko so chi so minh ko biet so

            Comment


            • #7
              Hừ hừ, xem kỹ lại phần phân tích của www9van thì thấy KST viết phần xử lý ngắt làm cho phần code:
              Code:
              if(out == 0)
              {
              out = 1;
              RA0 = 0;
              }
              luôn luôn chạy sau cùng, do đó RA0 sẽ luôn có giá trị 0 khi ra khỏi chương trình xử lý ngắt.

              Thân,
              Biển học mênh mông, sức người có hạn

              Comment


              • #8
                Có lẽ nguyên nhân sai nằm ở đây: cổng A có thể là analog hay digital. Nếu không khởi tạo ở ADCON1 hay CMCON thì nó hiểu là lối vào analog, do vậy bác KST thêm dòng: ADCON1=0b00001111;(Nếu vẫn chưa được thì thêm khởi tạo cho CMCON nữa, dạo này tui bận quá nên bác đọc kỹ nhé, đọc kỹ phần khởi tạo cổng A ấy). Còn để nháy led đơn giản là viết: RA0=!(RA0);

                Comment


                • #9
                  Nếu lênh của KST là 2 lệnh
                  if then
                  if then
                  tách biệt nhau, mà ko là
                  if then else thì....kết quả thu đựoc như vậy là đúng rồi he he
                  gợi ý như sau:
                  1. Nên viết thử 1 chương trình để dựng PIN nào đó lên 1, nếu được rồi thì viết chương trình khác hạ nó xuống 0 ---> đảm bảo config đúng PIN là IO output
                  2. Sau đó dùng lệnh delay viết nhấp nháy Pin đó (ko dùng ngắt) --> để đảm bảo thông suất phần hardware, từ CPU, thạch anh có chính xác ko ??..
                  3. Nếu 2 bươc trên đều ok --> viết dùng ngắt để nhấp nháy
                  và tại chương trình xử lý ngắt chỉ cần dùng 1 lệnh lấy bù bit như BA nói cho gọn vidu: RX.y = ! RX.y X là port, y là pin

                  Comment


                  • #10
                    Cái chương trình em viết trên, chạy OK rồi đó, lúc trước em thử với port D là OK rồi. Còn muốn dùng với portA thì config như anh BA nói.

                    Comment


                    • #11
                      He heh e he !
                      Tại hạ chưa thử chương trình nhưng những lập luận của trưởng nhóm ăn mày cũng chưa thật chính xác = BA, (1!), Bây giờ tại hạ thấy được nhiều điều rồi.
                      Chúc vui vẻ !
                      Troi ko so dat ko so chi so minh ko biet so

                      Comment


                      • #12
                        Lỗi trong phần code là trực quan, còn cấu hình của các chân analog là một cái bẫy mà đôi khi người có kinh nghiệm vẫn quên. Chú BA nói rồi thì không cần nhắc lại.

                        Nếu cấu hình chân đúng mà code như vậy thì cũng chẳng thể nào chạy đúng được.

                        Bạn sửa code rồi mà vẫn không đúng thì những người khác mới nghĩ đến đặc điểm của chân I/O bạn đang dùng. Với trường hợp của bạn, ngoại trừ đặt 4-bit thấp nhất của ADCON1 là '1111' thì không thể đặt RA0 là digital pin.

                        Đó là 2 trong số những lý do có thể dẫn đến việc chương trình được viết ra chạy không theo ý định. Liệu có một lý do nào là chính xác hơn những lý do còn lại không?

                        Thân,
                        Biển học mênh mông, sức người có hạn

                        Comment

                        Về tác giả

                        Collapse

                        Kesitinh Tìm hiểu thêm về Kesitinh

                        Bài viết mới nhất

                        Collapse

                        Đang tải...
                        X