Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

RQ: AVR, GCC, Timer, UART, LCD & Sleep-елементарно нивo
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=8692
Страница 1 от 1

Автор:  NikB [ Чет Мар 10, 2011 10:43 pm ]
Заглавие:  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 | Прегледано 935 пъти ]

Автор:  marcuka68 [ Пон Мар 14, 2011 11:48 am ]
Заглавие: 

Виж в дейташийта на Атмега 128 за слийп режимите, може ли таймер 1 да събуди устройството от слийп режим.

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

Автор:  Реконструктор [ Пон Мар 14, 2011 11:49 am ]
Заглавие: 

Като начало, виж да не се ресетира поради няква причина.

Автор:  NikB [ Чет Мар 17, 2011 9:50 pm ]
Заглавие: 

:)
Сега виждам, че темата не е довършена. (Тоя форум не винаги ми изпраща напомнящи мейли :( )

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

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/