Thông báo

Collapse
No announcement yet.

Ghép Atmega16 với ADC ngoài mà không thấy chuyển đổi ???

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

  • Ghép Atmega16 với ADC ngoài mà không thấy chuyển đổi ???

    các bác cho em hỏi, em ghép AT16 với ADC0809 và hiển thị lên LCD theo sơ đồ sau mà ko hiểu sao không thấy chuyển đổi, chính xác là nó có chạy nhưng chạy như điên, bật nguồn phát là nó hiện lên LCD "ket qua chuyen doi la : 108" em đã xoay biến trở mỏi tay mà ko thấy nó suy chuyển kết quả, mà cũng ko hiểu nó lấy cái số 108 này ở đâu ra nữa. Trước đó em dùng bộ Adc trong tích hợp của nó thì chạy rất ngon, rất nhạy, xoay nửa vòng biến trở nó cũng phát hiện ra.
    phần cứng và phần mềm của em thế này, em dùng codevisionAVR để viết ct

    Em đã mất 1 tuần với cái mạch này mà chưa sửa đc, ko biết lỗi phần cứng hay phần mềm thế nào các bác thử xem hộ em.
    em dùng con bộ đếm 74393 để chia tần số thạch anh 4M của vdk (đã set fuse bit) cho 8 lấy ra 500Khz cấp cho clock ADC
    mạch của em đây


    chương trình của em đây

    Code:
    #include <mega16.h>
    // Alphanumeric LCD Module functions
    #asm
       .equ __lcd_port=0x1B ;PORTA
    #endasm
    #include <lcd.h>
    #include <delay.h>
    
    //***********************************************
    unsigned char doc_adc(void)              //chuong trinh con doc adc
    {
    unsigned char i; 
    PORTA.3=0;                               //ko cho phep dau ra
    PORTD.4=0;                               //xung thap len cao ale,start
    PORTD.4=1; 
    PORTD.4=0; 
    delay_us(250);                           //doi chuyen doi xong
    PORTA.3=1;                               //cho phep dau ra oe
                                            
    i=PINC;
    return i;
    } 
    //*******************************************************
    void lcd_hienthi(float so, unsigned char x, unsigned char y )  //ctc hien thi lcd
    {
    unsigned char a,b,c;
    a=so/100;                       //chu so hang tram
    b=(so-a*100)/10;             //chu so hang chuc
    c=(so-a*100-b*10)/1;      //chu so hang don vi
    lcd_gotoxy(x,y);              //ghi vao vi tri dinh truoc tren lcd
    lcd_putchar(a+48);           // đẩy mã Ascii tương ứng ra lcd
    lcd_putchar(b+48); 
    lcd_putchar(c+48);
    }
    //*******************************************
    // chuong trinh chinh
    void main(void)
    {
          while (1)
          {lcd_gotoxy(0,0);
           lcd_putsf("ket qua chuyen doi la:");
           lcd_hienthi(doc_adc,8,1);
           delay_ms(1000);      // 1 giay lay mau 1 lan
          };
    }
    có ai biết không giúp mình với
    Last edited by gold_heartes; 10-11-2007, 21:26.

  • #2
    PORTD.4=0; //xung thap len cao ale,start
    PORTD.4=1;
    PORTD.4=0;


    sao ko có trễ giữa các lệnh này,đây là xung cần thiết để cho phép adc hoạt động,bạn đọc datasheet xem,thời gian tối thiểu của xung này là bao nhiêu.
    khi lập trình,bạn nên define tên của cổng này rồi sử dụng để cho dễ nhìn.
    vd như này,sau cái include <mega16.h>
    #define start_adc PORTD.4
    #define oe_adc PORTA.3

    khi sử dụng bạn chỉ cần đánh tên cổng này ra là xong(tỉ dụ:start_adc = 0),và dễ nhớ,cứ mỗi lần sử dụng chân nào đó,lại mở nguyên lý ra nhìn nó là chân gì thì mệt lắm.
    Last edited by vinhsnooker; 12-11-2007, 08:52.

    Comment


    • #3
      em không góp ý cái gì phần ADC của bác nhưng mà em thấy cái thủ tục hiển thị một số lên LCD nghe chừng hơi vất vả. Trong C có hàm itoa hỗ trợ chuyển từ số int sang kí tự mà bác. Thế này nhé:
      #include<sdlib.h> // thư viện chứa hàm itoa
      char str[5];
      .
      .
      .
      void LCD_hienthi(int so, unsigned char x, unsigned char y)
      {
      itoa(so, str);
      lcd_gotoxy(x,y);
      lcd_puts(str);
      }
      Phone: 0978536011

      Comment


      • #4
        PORTA.3=0; //ko cho phep dau ra
        PORTD.4=0; //xung thap len cao ale,start
        PORTD.4=1;
        PORTD.4=0;


        thoi gian tre cua bac qua nho nen no khong doc kip gia tri bac thay goi trong do bac dat thoi gian tre lai di

        Comment


        • #5
          cảm ơn các bác, em đã sửa lại chương trình chèn thêm trễ thời gian vào để tạo ra xung có độ rộng tối thiểu đúng cái datasheet của nó mà vẫn dek đc. Mà còn 1 chuyện rất khôi hài nữa nảy sinh, bực mình em rút con ADC0809 ra xem chân cẳng có làm sao ko thì thấy mạch ko có ADC mà nó vẫn hiện lên lcd "ket qua chuyen doi la: 108" ấn reset rồi vẫn thế, không đỡ được. Không biết vc này có giúp các bác phát hiện dc cho em lỗi ở đâu kô, tóm lại là em vẫn ko biết nó lấy kết quả này ở đâu mà hiển thị khi mà ko có cả adc trên mạch

          Comment


          • #6
            Nguyên văn bởi gold_heartes Xem bài viết
            cảm ơn các bác, em đã sửa lại chương trình chèn thêm trễ thời gian vào để tạo ra xung có độ rộng tối thiểu đúng cái datasheet của nó mà vẫn dek đc. Mà còn 1 chuyện rất khôi hài nữa nảy sinh, bực mình em rút con ADC0809 ra xem chân cẳng có làm sao ko thì thấy mạch ko có ADC mà nó vẫn hiện lên lcd "ket qua chuyen doi la: 108" ấn reset rồi vẫn thế, không đỡ được. Không biết vc này có giúp các bác phát hiện dc cho em lỗi ở đâu kô, tóm lại là em vẫn ko biết nó lấy kết quả này ở đâu mà hiển thị khi mà ko có cả adc trên mạch

            sặc !
            đúng là khôi hài thật.
            Trước mình làm cái này sau đó cũng nản ko làm nữa. Sao không dùng adc của con Atmega đi cho nhẹ.

            Comment


            • #7
              ừ làm với adc trong của nó thì đc rồi, nhưng mà thầy giáo mình yêu cầu trong kit có modun ghép nối với adc ngoài. Thế thực tế là 2 con này ghép ko tương thích với nhau à, mình ko nghĩ thế,nhưng mà code thì chỉ đơn giản vài dòng thế kia thì sao có lỗi đc nhỉ

              Comment


              • #8
                pác thử test lại mạch đi.
                1. kiểm tra phần ADC xem có tín hiệu ra như ý muốn không? quan trọng nhất phần này và kiểm tra kĩ phần TẠO DAO ĐỘNG (phần này là đau đầu đấy).
                2. kiểm tra mạch Chip (cái này chắc khó có vấn đề).

                Tại hạ chỉ bít vậy thôi ....

                Comment


                • #9
                  Ku xem lại mạch tạo dao động đi. Chân XTAL2 mức tín hiệu rất thấp không phải TTL nên đưa vào bộ chia sẽ không nhận CLK. Cần đưa qua 1 trigger flipflop trước để nó chuẩn hóa thành xung vuông TTL. Con gì ấy quên rồi lâu lắm chả dùng :P

                  Comment


                  • #10
                    Mình dường như đã gặp hiện tượng này: đó là con ADC không được cập xung Clock
                    Bạn hãy xem lại phần cấp xung Clock của ADC

                    Comment


                    • #11
                      Huhu, cái này thì dùng oscillo soi cái là thấy ngay chứ sao lại phải phán mò thế này. Nhiều kỹ sư điện tử ra trường mà chưa biết dùng oscillo thế nào. Buồn quá.

                      1 phút buồn!
                      Buồn ...
                      Thôi buồn
                      AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                      Xem thêm tại Online Store ---> Click here
                      Mob: 0982.083.106

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X