Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVRStudio вопрос по прерыванию USART
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Pavlike
Доброго времени суток!
Вкратце проблема такова:
перебросил проект из ИАРа в АВРСтудию. (проект атмеловский 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% памяти и данных.
- может непорядок с прерыванием!

Подскажите плиз еще мысли!
Палыч
#include <avr/interrupt.h>

Цитата
Do not use SIGNAL() in new code. Use ISR() instead.
Pavlike
Цитата(Палыч @ Jun 1 2011, 13:50) *
#include <avr/interrupt.h>


Спасибо - помогло!
Прерывания по приему не было в вообще в коде...
поэтому по приему быйта контроллер сбрасывался..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.