реклама на сайте
подробности

 
 
> AVRStudio вопрос по прерыванию USART
Pavlike
сообщение Jun 1 2011, 14:08
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560



Доброго времени суток!
Вкратце проблема такова:
перебросил проект из ИАРа в АВРСтудию. (проект атмеловский AVR323),
добавил немного своего кода, все компилируется без ошибок(в железе не работает), кроме варнинга:

../sms_com.c: In function 'SIGNAL':
../sms_com.c:100: warning: type of '__vector_11' defaults to 'int'

Пробовал с разной оптимизацией, по разному прерывание называл... все равно варнинг..
Вот код прерывания (прием байта из УСАРТ)
Код
//#pragma vector=USART_RXC_vect                         //  Это оригинал из ИАРа
//__interrupt void USART0_RX_interrupt( void )           //  ---..----
// ISR (USART_RXC_vect)                                        // Это я пробовол эти варианты
//int ISR (SIG_UART_RECV)
int SIGNAL (SIG_UART_RECV)
{
    unsigned char data;                             //Local variable
    data = UDR;                                    //Always read something
    rx_buffer[ rx_wr_i++ ] = data;                  //Store new data

    if( rx_wr_i > RX_BUFFER_MASK )                  //Check for overflow
    {
        rx_wr_i = 0;                                //Reset write index
        rx_overflow = 1;                            //Set flag high
        UCSRB &= ~( 1 << RXCIE );                 // Disable RX interrupt
    }

    if( searchFor[rx_i] == data )                   //Test response match
    {
        rx_i++;
        if( !searchFor[rx_i] )                      //End of new_message string...received new message!
        {
            rx_i = 0;
            if( searchStr == CMTI_ )                //+CMTI:
            {
                searchFor = searchStrings[ CRLF_ ]; //Wait for
                searchStr = CRLF_;
            }
            else                                    //Normal acknowledgement
            {
                rx_ack = 1;                         //Set new message flag
                UCSRB &= ~( 1 << RXCIE );         // Disable RX interrupt
            }
        }
    }
    else
    {
        rx_i = 0;                                   //Not valid search pattern...start again.
    }
//    return 0;  //  это тоже пробовал
}


Если не писать перед ISR(SIGNAL) Int - то пишет 3 варнинга:

../sms_com.c:100: warning: return type defaults to 'int'
../sms_com.c: In function 'SIGNAL':
../sms_com.c:100: warning: type of '__vector_11' defaults to 'int'
../sms_com.c:139: warning: control reaches end of non-void function


Оригинальный проект был на меге 128, я писал для меги8.

В итоге, железо не работает, команду отсылает, но приема невидит, мало того происходит рестарт программы...
Я пробовал пошагово, но выловить не смог..
Мысли: - может непорядок со стеком(хотя проект занимает меньше 40% памяти и данных.
- может непорядок с прерыванием!

Подскажите плиз еще мысли!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Jun 1 2011, 15:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



#include <avr/interrupt.h>

Цитата
Do not use SIGNAL() in new code. Use ISR() instead.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 14:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016