5

Tôi đang làm việc với dự án Arduino Mega 2560. Tại một máy tính Windows 7 tôi đang sử dụng IDE Arduino1.0. Tôi cần phải thiết lập một giao tiếp Bluetooth nối tiếp với tốc độ baud 115200. Tôi cần phải nhận được một ngắt khi dữ liệu có sẵn tại RX. Mỗi đoạn mã tôi đã thấy sử dụng "polling", đó là đặt một điều kiện của Serial.available bên trong vòng lặp của Arduino. Làm thế nào tôi có thể thay thế phương pháp này tại vòng lặp của Arduino cho một gián đoạn và định tuyến dịch vụ của nó? Dường như attachInterrupt() không cung cấp cho mục đích này. Tôi phụ thuộc vào một Interrupt để đánh thức Arduino từ chế độ ngủ.Ngắt nối tiếp Arduino

tôi đã phát triển mã này đơn giản mà là nghĩa vụ phải bật một đèn LED kết nối với pin 13.

#include <avr/interrupt.h> 
    #include <avr/io.h> 
    void setup() 
    { 
     pinMode(13, OUTPUT);  //Set pin 13 as output 

     UBRR0H = 0;//(BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register 
     UBRR0L = 8; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register 
     UCSR0C |= (1 << UCSZ00) | (1 << UCSZ10); // Use 8-bit character sizes 
     UCSR0B |= (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); // Turn on the transmission, reception, and Receive interrupt  
    } 

    void loop() 
    { 
     //Do nothing 
    } 

    ISR(USART0_RXC_vect) 
    {  
     digitalWrite(13, HIGH); // Turn the LED on   
    } 

Vấn đề là các chương trình con là không bao giờ phục vụ.

+0

Câu hỏi của bạn phải làm gì với bluetooth? Có vẻ như bạn chỉ hỏi làm thế nào để sử dụng một UART thường xuyên với ngắt? – TJD

Trả lời

6

Cuối cùng tôi đã tìm thấy sự cố của mình. Tôi đã thay đổi vector ngắt "USART0_RXC_vect" bởi USART0_RX_vect. Ngoài ra tôi đã thêm interrupts(); để cho phép gián đoạn toàn cầu và nó hoạt động rất tốt.

Mã này là:

#include <avr/interrupt.h> 
#include <avr/io.h> 
void setup() 
{ 
    pinMode(13, OUTPUT); 

    UBRR0H = 0; // Load upper 8-bits of the baud rate value into the high byte of the UBRR register 
    UBRR0L = 8; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register 
    UCSR0C |= (1 << UCSZ00) | (1 << UCSZ10); // Use 8-bit character sizes 
    UCSR0B |= (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); // Turn on the transmission, reception, and Receive interrupt  
    interrupts(); 
} 

void loop() 
{ 

} 

ISR(USART0_RX_vect) 
{ 
    digitalWrite(13, HIGH); // set the LED on 
    delay(1000);    // wait for a second 
} 

Cảm ơn đã trả lời !!!!

1

Bạn đã thử mã đó và nó không hoạt động? Tôi nghĩ vấn đề là bạn chưa bật ngắt. Bạn có thể thử gọi số sei(); hoặc interrupts(); trong chức năng setup của mình.