Отговори на тема  [ 4 мнения ] 
RQ: AVR, GCC, Timer, UART, LCD & Sleep-елементарно нивo 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение RQ: AVR, GCC, Timer, UART, LCD & Sleep-елементарно нивo
RQ: AVR, GCC, Timer, UART, LCD & Sleep - елементарно ниво

Има някакво странно заспиване и спиране на прекъсванията по таймера (ISR(TIMER1_OVF_vect)), когато работя с последователния порт и LCD.
(По-точно - когато викам функции, които ги ползват)
На приложената картинка - симулация, се вижда, че жълтия и червения лъчи спират генерациите (нивата се управляват в ISR(TIMER1_OVF_vect)).

Реших, че е от незнанието ми на ползването на спящите режими на AVR.

Набедих кода
Код:
uint8_t uart_getc()
{
    /* wait until receive buffer is full */
#if USE_SLEEP
    uint8_t sreg = SREG;
    sei();

    while(!(UCSRA & (1 << RXC)))
        sleep_mode();

    SREG = sreg;
#else
    while(!(UCSRA & (1 << RXC)));
#endif

    uint8_t b = UDR;
    if(b == '\r')
        b = '\n';

    return b;
}
, където sleep_mode() е дефинирано (от Atmel) в sleep.h така:
Код:
#if defined(__DOXYGEN__)

extern void sleep_mode (void);

#else

#define sleep_mode() \
do {                 \
    sleep_enable();  \
    sleep_cpu();     \
    sleep_disable(); \
} while (0)

#endif
Аз не съм, а и не намерих някой друг да е дефинирал __DOXYGEN__, така, че минаваме по "else"-то :)

И сега - питането ми:
Тествам простичка програмка с един главен цикъл в main(), който се обръща към uart_getc така, че стига до цикълчето:
Код:
    while(!(UCSRA & (1 << RXC)))
        sleep_mode();
придрямва и всеки път, като се събуди, проверява дали има получен символ. Ако има - завършва функцията, ако няма - пак се унася.
А КАКВО СТАВА С ОСТАНАЛИТЕ апаратни случки (примерно - прекъсванията по таймера)?


Прикачени файлове:
Коментар на файл: Заспиване :)
AVR_Sleep.JPG
AVR_Sleep.JPG [ 267.93 KiB | Прегледано 926 пъти ]
Чет Мар 10, 2011 10:43 pm
Профил ICQ WWW
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пет Авг 07, 2009 4:58 pm
Мнения: 273
Мнение 
Виж в дейташийта на Атмега 128 за слийп режимите, може ли таймер 1 да събуди устройството от слийп режим.

Атмегата има няколко слийп режима, тази библиотечна функция знаеш ли в кой точно те вкарва, напиши си твоя функция за заспиването.


Пон Мар 14, 2011 11:48 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Като начало, виж да не се ресетира поради няква причина.


Пон Мар 14, 2011 11:49 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение 
:)
Сега виждам, че темата не е довършена. (Тоя форум не винаги ми изпраща напомнящи мейли :( )

Тука трябва да се смеете много (на мен :))- преди ден-два (май в вторник, 15-ти) установих, че никой в main не се грижи да разреши глобалните прекъсванията.
Оказа се, че съм пропуснал да разреша прекъсванията глобално, а те понякога са вървели, защото до скоро ползвах един дървен протокол за конзола по UART, който, докато чака да получи байт, ги разрешава.

Така, че поне с тая чума се оправих и вече е съвсем нормално и обозримо.


Чет Мар 17, 2011 9:50 pm
Профил ICQ WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 4 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни