2013-09-24 5 views
0

Я использую SDCC-компилятор.Переконфигурировать таймер во время прерывания прерывания таймера 8051

То, что я пытаюсь достичь, - это перенастроить таймер 0 в режиме автообновления режима 2 во время его собственного обработчика прерываний. Вот код C:

void reconf(void) __interrupt(1){ 
    TR0=0; 
    TH0=0xC0; 
    TL0=0xC0; 
    TR0=1; 
} 

Вот вопросы:

  1. Можно ли перенастроить tl0 и TH0 для Timer0 в режиме режима 2 автоперезагрузки во время своего собственного выполнения обработчика прерываний?

  2. Необходимо ли остановить таймер0 во время реконфигурации или нет, потому что он не работает во время перерыва?

  3. Задается ли значение TH0 и TL0 в стек до начала процедуры прерывания ? Если эти значения PUSHed в стек, а затем во время выполнения обработчика подпрограммы я переконфигурировал эти значения, будут ли эти значения переопределены значениями POPed из стека при выходе из прерывания?

+0

Я изучил HEX-файл, который генерируется sdcc после компиляции кода C, и кажется, что TH0 и TL0 не загружены в стек перед выполнением каких-либо процедур прерывания. – distortedbsd

+0

А также я попытался перенастроить timer0 через его прерывание, и он работает. – distortedbsd

ответ

1

Прежде чем обратиться на ваши вопросы, я думаю, что стоит отметить, что TR0, TH0 и TL0 есть. Они являются не переменными, локальными для функции или сидящими в стеке (при условии, что у вас есть стек вызовов, который не используется большинством приложений 8051), - просматривайте наложения памяти). Это Регистры специальных функций, обычно сокращенно SFR. Вы можете read more about SFRs, но для целей вашего вопроса вы можете рассматривать их как глобальные переменные с точки зрения сферы.

  1. Вы можете изменить TL0 и TH0 регистров в любое время, в том числе в обработчике прерывания таймера 0 Peripheral в.

  2. Нет необходимости останавливать таймер, чтобы изменить его значение, но имейте в виду, что он будет продолжать подсчет, пока вы это делаете. Это может быть проблемой, если вы пишете так же, как младший байт перекатывается, где вы можете получить значение таймера, отличное от вашего намерения.

    <previous code> // Timer increments to 0x12fe 
    TH0 = 0xff;  // Timer is now 0xffff 
           // Timer increments to 0x0000 
    TL0 = 0x52;  // Timer is now 0x0052 
           // Timer increments to 0x0053 
    

    Вы попытались установить таймер на 0xff52, но вы попали в 0x0052. Это крайний пример, но риск есть. Вы можете быть менее рискованными, написав TL0, а затем TH0, но отключение таймера - самое простое решение.

  3. Поскольку вы теперь знаете, что TL0 и TH0 являются SFR с глобальной областью видимости, вам не нужно беспокоиться о стеке или любом другом механизме передачи аргументов, мешающем им.