2015-09-04 4 views
1

Я в настоящее время работает над программированием PIC16F883 с 3.2768   МГц oscilator. Мне нужно сделать LED миганием в нужное время, но это действительно не актуально.Таймер PIC16F883 не будет работать

Проблема в том, что настроили Timer0, но он не работает. Я собираюсь опубликовать свой код и инициализацию здесь, чтобы вы могли видеть :). Кстати, я программирую в MpLap IDE, в обычном C с компилятором Hi-Tech C.

Initialization:

T0CS = 0x00;   //Set Timer0 to Timer-Mode 
GIE = 0x01;    //Enable all interrupts 
PSA = 0x00;    //Prescaler enable 
PS0 = 0x01;    //Prescaler set 
PS1 = 0x00;    //Prescaler set 
PS2 = 0x01;    //Prescaler set 

Прерывание службы сама процедура:

void interrupt timer() 
{ 
    T0IF = 0x00;    //Reset timer 
    millicounter++;   //Add one to the helper variable 
    PORTA = 0x00; 

    if (millicounter == 25) //Check if one second has passed. 
    { 
     millicounter = 0; //Reset helper variable 
     seconds++;   //Add one to elapsed seconds. 
    } 
} 

Проблема заключается в том, что она не выглядит, как таймер работает. Теперь я смоделировал программу разное время с разными настройками, последнее - сделать вывод открытым, когда прерывание запускается, а затем снова включено в основном. Проблема в том, что это никогда не происходило. Думаю, таймер не работает. Зачем?

+1

Если я хорошо помню, вы должны установить 'T0IE = 1;' – LPs

+0

я нашел [это] (http://ww1.microchip.com/downloads/en/DeviceDoc/51702A.pdf) хороший учебник – LPs

+0

Изготовление светодиодной подсветки в нужное время на самом деле * *. При создании кода - это ваша первая точка отсчета. В этом случае прерывание таймера начнет мигать. Если это слишком быстро, посмотрите, используйте маску счетчика или начните с медленного таймера. –

ответ

3

Вы установили бит разрешения глобального прерывания. Но для прерывания таймера вам необходимо установить бит разрешения прерывания таймера (T0IE).

И из ваших значений регистра таймера и частоты кристалла ваш «секунд» variavle будет увеличиваться в 256 раз в секунду. Т.е., если вы используете эту переменную «секунды», чтобы обеспечить мигающую задержку, ваш светодиод на время будет примерно 3,9 миллисекунды. Человеческие глаза не могут быстро обнаружить это.

+0

К сожалению, я пробовал это, и до сих пор ничего не работает, никаких других идей? –

+0

Кажется, что ваши настройки таймера верны. Вы можете попробовать использовать симуляторы, такие как picsimulatorIDE или Proteus, чтобы убедиться, что значения конфигурации написаны правильно в соответствующем регистре. Также убедитесь, что ваши биты конфигурации установлены правильно. Забыть отключить сторожевой таймер, когда он не требуется, часто меня беспокоил. – sreeyesh

0

Благодарю вас за помощь, у меня работает таймер. Я удалил всю конфигурацию и переписал таймер, и теперь он работает нормально. У меня есть еще одна проблема, что я написал новое сообщение для :) Проверьте это, если хотите.

New Post