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
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
Comment