1. THÔNG BÁO TUYỂN ADMIN DIỄN ĐÀN 2013
    Tìm kiếm nhà trọ - Ở ghép
    THÔNG BÁO BÁN ÁO SPKT.NET CHO THÀNH VIÊN DIỄN ĐÀN


    HÃY TÌM KIẾM Ở ĐÂY TRƯỚC KHI ĐẶT CÂU HỎI
    {xen:phrase loading}

Thắc Mắc - Gỡ Rối Các Bài Tập VDK

Thảo luận trong 'Lập trình C cho vi điều khiển AVR cơ bản' bắt đầu bởi cdtu_trdiep, 5 Tháng mười 2009.

  1. cdtu_trdiep New Member

    Số bài viết: 10
    Đã được thích: 0
    Điểm thành tích: 0
    Mình lập topic này để các bạn có thể trao đổi với nhau những thắc mắc trong các bài tập hay ví dụ của Thầy Cường...thấy các bạn post bài vào trong phần hướng dẫn dạy của thầy như thế mọi người khó theo dõi được các bài học. Anh em có một topic riêng để trao đổi thì hay hơn.
    Rất mong mọi người đóng góp những kinh nghiệm của mình...! Chào và chúc học tốt...
  2. cdtu_trdiep New Member

    Số bài viết: 10
    Đã được thích: 0
    Điểm thành tích: 0
    Mình mới bắt đầu học con avr, chính xác là đang lập trình cho con atmega32. Hiện tại mình gặp một vấn đề:
    Mình đã khởi tạo :
    DDRC=0xff;
    PORTC=0x00;
    Nhưng khi mình đo chân ra của PORTC thì có vấn đề : 4 chân từ PC2 - PC5 đều ở mức cao ( 2,75v), khi điều khiển thì 4 chân này hoàn toàn ngược lại với chương trình...:(( :((
    => Mình không hiểu, mong thầy và các bạn chỉ giúp...
    Các PORT khác vẫn hoạt động bình thường...
    Thanks!
  3. huyen New Member

    Số bài viết: 148
    Đã được thích: 0
    Điểm thành tích: 0
    D nói mức cao nhưng sao chỉ có 2,75 thui?nếu với cách khởi tạo như vậy thì đáng lẻ PortC phải 0 hết chứ(chưa nạp ctrinh).D nói trên mô phong hay trên kit thí nghiệm vậy?nếu là kit thì xem có khả năng 1 chân nào đó bị chạm mass nên bị kéo áp xuống
  4. cdtu_trdiep New Member

    Số bài viết: 10
    Đã được thích: 0
    Điểm thành tích: 0
    Trên kit huyền ơi, khởi tạo như trên. Nạp chương trình điều khiển sử dụng PORT khác ( PORTA chẳng hạn) thì 4 chân từ PC2-> PC5 vẫn bị thế. Điệp không hiểu thế nào nữa, Điệp kiểm tra lại rồi không chạm dây nào hết...
  5. huycdt06 New Member

    Số bài viết: 3
    Đã được thích: 0
    Điểm thành tích: 0
    theo tui bit thì portC là port có nhiều chức năng,bạn phải bỏ JTAG của PORTC. Bạn nạp chip bằng công cụ gì, nếu là mạch nạp qua cổng LPT thì không bỏ được. Bạn dùng mạch nạp qua giao tiếp USB thì có thể bỏ được.
    Dùng CAVR -> vào phần nạp -> bỏ JTAG enable là OK.
    Bạn đọc kỹ datasheet rồi làm là OK.
  6. KN Servant. Servant.

    Số bài viết: 1,291
    Đã được thích: 3
    Điểm thành tích: 0
    Theo mình thì nên treo lên rùi cấp mức 0 là OK nhất.
    Chứ không kéo lên thì nên bố trí trở bên ngoài chứ cứ để bình thường không chắc ở mức 0 hay 1 thì không tốt
  7. htungtdh3 New Member

    Số bài viết: 8
    Đã được thích: 0
    Điểm thành tích: 0
    chào các bạn, mình mới học lập trình cho AVR, mình có một vài thắc mắc mong anh em giải đáp.
    mình đang viết chương trình hiển thời gian thông qua 6LED bằng AVR atmega8
    [IMG]
    Chương trình của mình như sau :

    #include <mega8.h>

    unsigned char number[10] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x03, 0x38, 0x00, 0x18};
    unsigned char led[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

    char ledi = 0; //dung de dieu khien sang led
    char hh, mm, ss;
    int counter0;

    void tang_time(void)
    {
    int h1,h2,m1,m2,s1,s2;
    ss ++;
    if (ss >= 60) {
    ss = 0;
    mm ++;
    if (mm >= 60){
    mm = 0;
    hh ++;
    if (hh >= 24) hh = 0;
    };
    };
    h1 = hh / 10;
    h2 = hh % 10;
    m1 = mm / 10;
    m2 = mm % 10;
    s1 = ss / 10;
    s2 = ss % 10;
    led[0] = number[h1];
    led[1] = number[h2];
    led[2] = number[m1];
    led[3] = number[m2];
    led[4] = number[s1];
    led[5] = number[s2];
    }

    interrupt [TIM0_OVF] void timer0_overflow(void)
    {
    TCNT0 = 0x06;
    counter0++;
    if (counter0 >= 500) {
    counter0 = 0;
    //if (ok != 0)
    tang_time;
    }
    PORTB = 0x3F;
    switch (ledi) {
    case 0 : PORTB.0 = 0; break;
    case 1 : PORTB.1 = 0; break;
    case 2 : PORTB.2 = 0; break;
    case 3 : PORTB.3 = 0; break;
    case 4 : PORTB.4 = 0; break;
    case 5 : PORTB.5 = 0; break;
    }
    PORTD = led[ledi];
    ledi++;
    if (ledi >= 6) ledi = 0;
    }


    void main(void)
    {
    //khoi tao cac thanh ghi
    DDRD = 0XFF;
    PORTD = 0X00;
    DDRB = 0X3F;
    PORTB = 0X3F;
    DDRC = 0X00;
    PORTC = 0b110000;

    // khoi tao ngat tran 0;
    TCCR0 = 0x04; // SU DUNG CLOCK LA XUNG SYMTEM/8
    TCNT0 = 0x06;
    TIMSK = 0x01; //CHO PHEP LA NGAT TRAN

    #asm("sei");

    while (1)
    {
    }
    }

    -trong đoẹn chương trình trên mình có bôi đỏ 1 đoạn dòng lệnh. Khi em mô phỏng băng proteus thì sau khi chạy từng bước thì em thấy biến counter0 sau khi tăng lên 1, rùi vào lệnh so sonh ( counter0 >=5000 ...) thì chương trình gán luôn cho cuonter0 = 0.
    - sao chương trình dịch lại thành như vậy ạ, và cách khắc phục như thế nào ?

    - và trong đoạn chương trình trên không chạy vào chương trình con tang_time trong ngat TIMER0, tại sao lại thế ạ
    interrupt [TIM0_OVF] void timer0_overflow(void)
    {
    TCNT0 = 0x06;
    counter0++;
    if (counter0 >= 500) {
    counter0 = 0;
    //if (ok != 0)
    tang_time;
    }
    PORTB = 0x3F;
    switch (ledi) {
    case 0 : PORTB.0 = 0; break;
    case 1 : PORTB.1 = 0; break;
    case 2 : PORTB.2 = 0; break;
    case 3 : PORTB.3 = 0; break;
    case 4 : PORTB.4 = 0; break;
    case 5 : PORTB.5 = 0; break;
    }
    PORTD = led[ledi];
    ledi++;
    if (ledi >= 6) ledi = 0;
    }

    mình rất mong có được thư của các bạn,
    nick yahoo của mình là : boyhaychat
    cảm ơn các bạn rất nhiều.
  8. KN Servant. Servant.

    Số bài viết: 1,291
    Đã được thích: 3
    Điểm thành tích: 0
    Chào bạn. Bạn đang viết chương trinh mạch đồng hồ phải không? Bạn có thể gởi file protues và file Code được không. Như thế thì mình mới có thể check và hiểu hơn ý bạn
  9. htungtdh3 New Member

    Số bài viết: 8
    Đã được thích: 0
    Điểm thành tích: 0
    đúng rồi bạn à, bạn xem giúp mình cái.
    files proteus và code
    http://www.mediafire.com/?dmzomwyouaz



    -Khi mình mô phỏng băng proteus thì sau khi mô phỏng không thấy sẩy ra hiện tượng lưu ảnh của mắt, các led vẫn nhìn thấy con sáng con tắt, mà không sáng cả 6 con.
    mình để xung hệ thống của ATmega8 la 8MHz,
    cài đặt clock cho timer0 la /64 -> xung clock cho timer0 la 125 kHz
    khởi tạo giá trị đầu cho TCNT0 = 6 -> timer0 đếm 250 nhịp
    -> tần số hiển thị cả 6 led là 500 Hz

    thế sao khi mô phỏng bằng proteus 7.5 lại không sáng hết cả 6 led nhỉ, mong các pro chỉ giáo
    xung clock frequency trong proteus 7.5 để 8Mhz

  10. KN Servant. Servant.

    Số bài viết: 1,291
    Đã được thích: 3
    Điểm thành tích: 0
    Chào bạn.

    Led đã sáng nhưng chưa có tính lưu ảnh
    bạn gọi hàm phải là tang_time();
    như vậy cũng sai

    Chúc bạn học tốt.
    Dạo này mình hơi bận bạn thông cảm
  11. ngocnhanctu New Member

    Số bài viết: 10
    Đã được thích: 0
    Điểm thành tích: 0
    bạn chưa co chương trình con quét led thì làm sao hiển thị cả 6 led được
    muốn quét led thì trong 1 thời điểm chỉ có thể đẩy dữ liệu vào 1 led và delay_ that nhanh đê lưu trạng thái ảnh trong mắt

    void hienthi(unsigned char x,unsigned char y)
    {


    PORTA=led[x];
    PORTB=0x01;
    delay_ms(2);
    PORTA =0xFF;

    PORTA =led[y];
    PORTB=0X02;
    delay_ms(2);
    PORTA=0XFF;




    }

    PORTA đẩy dữ liệu
    PORTB kích mở led
  12. KN Servant. Servant.

    Số bài viết: 1,291
    Đã được thích: 3
    Điểm thành tích: 0
    Nói chung bài bạn có nhiều lổi quá mà sửa thì ngại.
    Vd led 7 đoạn cũng không giải mã
    Viết giải thuật như epprom vẫn bị lổi này
    Chắc bạn đã đưa ra giải thuật hợp lý cho mình.
    Chúc vui

  13. htungtdh3 New Member

    Số bài viết: 8
    Đã được thích: 0
    Điểm thành tích: 0
    aha, cái này mình quét LED băng timer chú không dùng hàm delay bạn à.
    Việc quét LED không được là do mình để 6 con LED khác loại nhau, 2 con không có DOT và 4 con có DOT, không hiểu tại sao nó không chạy, cứ báo lỗi hoài. Mong các bạn giải thích sự việc này.
    - còn sau khi sua 6 LEd giong nhau thi mình đã quét được. Sau đây là codec cho các bạn tam khảo :
    #include <mega8.h>

    unsigned char number[10] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x03, 0x38, 0x00, 0x18};
    unsigned char led[6] = {0x40, 0x40, 0x40, 0x40, 0x40, 0x40};
    char ledi = 0,hh,mm,ss,start,stop,ok;
    int counter0;

    void tang_time(void)
    {
    int h1,h2,m1,m2,s1,s2;

    ss ++;
    if (ss >= 60) {
    ss = 0;
    mm ++;
    if (mm >= 60){
    mm = 0;
    hh ++;
    if (hh >= 24) hh = 0;
    };
    };
    h1 = hh / 10;
    h2 = hh % 10;
    m1 = mm / 10;
    m2 = mm % 10;
    s1 = ss / 10;
    s2 = ss % 10;
    led[0] = number[h1];
    led[1] = number[h2];
    led[2] = number[m1];
    led[3] = number[m2];
    led[4] = number[s1];
    led[5] = number[s2];
    }

    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    TCNT0 = 0x06;
    counter0++;
    if ((stop == 1) && (!PINC.5))
    {
    ok = 0;
    stop = 0;
    };
    if ((!ok) && (!PINC.4))
    { ok = 1;
    stop = 1;
    ss = 0; mm = 0; hh = 0;
    led[0] = number[0];
    led[1] = led[0];
    led[2] = led[0];
    led[3] = led[0];
    led[4] = led[0];
    led[5] = led[0];
    counter0 = 0;
    };
    if ((counter0 >= 500) && (ok != 0))
    {
    counter0 = 0;
    tang_time();
    }
    PORTD = 0xFF;
    PORTB = 0x3F;
    switch (ledi) {
    case 0 : PORTB.0 = 0; break;
    case 1 : PORTB.1 = 0; break;
    case 2 : PORTB.2 = 0; break;
    case 3 : PORTB.3 = 0; break;
    case 4 : PORTB.4 = 0; break;
    case 5 : PORTB.5 = 0; break;
    }
    PORTD = led[ledi];
    ledi ++;
    if (ledi == 6) ledi = 0;
    }

    void main(void)
    {
    DDRD = 0xFF;
    PORTD = 0xFF;
    DDRB = 0x3F;
    PORTB = 0x3F;
    DDRC = 0x30;
    PORTC = 0x30;
    start = 1; stop = 1; ok = 1;

    counter0 = 0;
    hh = 0; mm = 0; ss = 0;

    TCCR0 = 0x04;
    TCNT0 = 0x06;
    TIMSK = 0X01;
    #asm("sei");


    while (1)
    {

    };
    }

    - còn việc quét LED không nhất thiết phải sử dụng LM để giải mã, vì thế sẽ làm bản mạch in của bạn lớn hơn
  14. cuonglc New Member

    Số bài viết: 2
    Đã được thích: 0
    Điểm thành tích: 0

Chia sẻ trang này