Thông báo

Collapse
No announcement yet.

Giúp mình đồng bộ hóa các interrupt cho ATMEGA128

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

  • Giúp mình đồng bộ hóa các interrupt cho ATMEGA128

    Chào mọi người .Chúc một ngày vui vẻ và hãy giúp mình vấn đề này nhé .
    Chả là mình đang làm luận văn về thiết kế bộ khóa số .Mình đang sử dụng module GSM BG2-EVB của cinterion và module Touchscreen điện trở 320-240 loại 4 dây .Mình đã control OK 2 thứ dưới dạng mỗi thứ 1 chương trình riêng biệt .Nhưng khi gộp chung lại thì mình gặp trục trặc .Cái cảm ứng nó bị đơ không touch được .Mình nghĩ là do vấn đề interrupt nên mọi người xem giúp mình với nhé :

    1.UART0 cho việc nhận dữ liệu từ GSM .Mỗi khi gọi hay nhắn tin đến GSM thì nó sẽ trả một chuỗi về AVR.Mình đọc và lọc thông tin
    2.TImer0 : sử dụng loại compare và overflow .Mục đích là mình dùng nó để liên tục quét xem có tín hiệu ADC tức là người dùng chạm vào màn hình không .Nếu có thì tiếp tục lấy mẫu ,tính toán trung bình và chuyển đổi từ touch sang display .
    3.Timer2 : Mình chỉ dùng overflow mục đích cho việc delay giữ các button .Dùng để thay đổi màu sắc button ấy và đa phím (một button cho 3 character A,B,C)

    Đó là 4 cái interrupt mình dùng .Và mình được biết trong AVR thì ưu tiên ngắt là cố định .Thứ tự là timer2,timer0 và uart .Khi mình làm riêng rẽ thì chúng chạy ok .Nhưng khi gộp lại thì sự cố phát sinh .Vì uart có độ ưu tiên thấp nên trong 3 interrupt còn lại của timer thì :
    -->Trong ISR mình kiểm tra bit RXC0 của USART0A của bộ USART0 ,Nếu bit này là 1 tức có USART thì mình thoát kêt thúc ISR đó .Và mình không set bit ngắt toàn cục (sei) trong 3 ISR đó .Sau đó khi mình xử lý thông tin nhận từ SM thì mình vô hiệu hóa timer0,timer2 .Sau khi thao tác xử lý xong thì mình enable lại .Chương trình chính thì mình cho vào vòng while (1) .
    while(1)
    {
    if(rx_ack==1)
    {
    vô hiệu hóa timer0,timer2
    xử lý
    enable lại timer0,timer2
    } //Nếu nhận đúng thông điệp mong muốn từ GSM thì xử lý

    else if(action==select) //Touch trên màn hình
    {
    xử lý
    }
    }

    Trong ISR của USART0 thì mình vừa nhận dữ liệu vừa xử lý tức so sánh với thông điệp mong muốn .Cờ rx_ack chỉ bằng 1 khi thông điệp nhận từ GSM là đúng yêu cầu

    Mình sử dụng codevision và ATMEGA128,thạch anh ngoài 16mHz và tốc độ paud là 9600 bit per second

    Và kết quả khi mình làm như thế thì cái Touchscreen nó hiển thị graphic được .Như chạm vào thì không xử lý được .Mình lầy cái điện thoại gọi vào số sim của GSM thì sau đó touchscreen lại touch được .

    Mình cấu hình 1 số chủ thuê bao .Nếu gọi vào đúng số chủ thì sẽ gửi lại 1 tin nhắn báo cho ông chủ .Nếu số khác thì không gửi .

    Và vấn đề nữa là số khác gọi vào thì touchscreen lại touch được .Ban đầu không touch được .Nhưng hễ số của chủ gọi vào thì sau đó vài giây nhận được message mong muốn .Nhưng cái touchscreen bị đơ .Và số khác gọi vào lại touch được

    Đó vấn đề hơi dài dòng mong mọi người thông cảm và cố gắng giúp mình

    Chân thành cảm ơn nhiều

  • #2
    Bạn kô nên dÙng nhiều ngắt quá.Gây chồng chất ngắt thì bị tràn ngăn xếp đó.Cẩn thận đó.
    , , ,

    Comment


    • #3
      thanks .Nhưng mình không thể giảm số lượng ngắt được .Cao thủ nào đó giúp mình với

      Comment


      • #4
        Mình thấy việc quét và hiển thị nháy trên màn hình có thể gộp làm 1 đi.Bạn làm nhiều ngắt nó đơ là phải.UART chỉ dÙng vòng lặp thôi.Kô phải cứ dÙng ngắt thì ngon lành đâu.
        , , ,

        Comment


        • #5
          Em cũng đang nghiên cứu về module BG2-E nhưng bị một số lỗi anh Salinh có thể cho em xin phần sch để tham khảo được không? Mail của em là quanghuydck1@gmail.com.

          Mobile: 0985158901
          Email:

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          Đang tải...
          X