PIC12f683 & TIMER1 не сразу запускается.

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
VileDog
Родился
Сообщения: 3
Зарегистрирован: Чт окт 31, 2013 13:07:27

PIC12f683 & TIMER1 не сразу запускается.

Сообщение VileDog »

Значит пишу на ССР под данный контроллер и проблема заключается в том, что ТАЙМЕР1 запускается спустя какое-то время 30сек-1мин.

Упрощенный код:

Код: Выделить всё

// 4MHz
//#define INTS_PER_SECOND 4         // (4000000/(4*4*65536)) = 3,814697265625
//#define TICS_PER_MSECOND 3815        
// 8MHz
#define TICS_PER_MSECOND 7629        
#define INTS_PER_SECOND 8          // (8000000/4/65536/4)) = 7,62939453125

int8 seconds=0;      // A running seconds counter

#INT_TIMER1                        // This function is called every time
void clock_isr() {                 // timer 1 overflows (65535->0), which is
                                   // approximately 19 times per second for
    if(--int_count==0) {           // this program.
      if(seconds == 255) seconds = 0;
      ++seconds;
      
      int_count = INTS_PER_SECOND;
    }
}

// MAIN Procedure
void main()
{
   set_tris_a(0x3D); 
   
   // Setup timer1 for seconds counting
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
   delay_ms(250);
   enable_interrupts(INT_TIMER1);
   delay_ms(250);
   enable_interrupts(GLOBAL);
   delay_ms(250);
   seconds = 0;
   
   
// Setup timer2 for our PWM generator
   setup_timer_2(T2_DIV_BY_16,127,1);      //499 us overflow, 499 us interrupt
   delay_ms(250);
// Setup PWM
   setup_ccp1(CCP_PWM);
   delay_ms(10);
   set_pwm1_duty(LIGHT_OFF8);
   delay_ms(150);


   // ADC (ÀÖÏ)
   setup_adc_ports(sAN0);
//   setup_adc_ports(sAN0 | sAN1);
//   setup_adc_ports(ALL_ANALOG /*sAN0 | sAN1 | sAN3*/);
   delay_ms(10);
//   setup_adc(ADC_CLOCK_INTERNAL|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   delay_ms(10);
   set_adc_channel(0);
   delay_ms(10);
   setup_vref(VREF_LOW);
   delay_ms(10);
 //  setup_adc_ports(sAN1);
   setup_comparator( NC_NC_NC_NC );
   delay_ms(10);
 
   
  curtime = oldtime = seconds;
 
   
   while(TRUE)
   {
         Здесь, например,
         Если(seconds = 1) { делпем бип, или блым; seconds = 0; }
   }

}
Так вот seconds начинает прибавляться не сразу, а по истечению определенного времени, причем в протеусе та же фигня.
Почему лыжи не едут? :cry:
Оно какбЭ и не критично, но напрягает.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC12f683 & TIMER1 не сразу запускается.

Сообщение Аlex »

Какой ужас... Зачем через каждую строчку тыкать delay_ms ?
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: PIC12f683 & TIMER1 не сразу запускается.

Сообщение urry »

ну ужас... но не ужас ужас ужас ... :)
Не вижу инициализации int_count, может из-за этого...

Код: Выделить всё

void clock_isr() {                 // timer 1 overflows (65535->0), which is
static unsigned char int_count = INTS_PER_SECOND; 
                                   // approximately 19 times per second for
    if(--int_count==0) {           // this program.
      if(seconds == 255) seconds = 0;
      ++seconds;
     
      int_count = INTS_PER_SECOND;
    }
VileDog
Родился
Сообщения: 3
Зарегистрирован: Чт окт 31, 2013 13:07:27

Re: PIC12f683 & TIMER1 не сразу запускается.

Сообщение VileDog »

По поводу делаев: не было их там изначально, но подумав, что может не успевает чего проинициализироваться, - понатыкал :) Это мой первый проект и первый опыт общения с микроконтроллерами...
А пример взял из екзамплов...
так обЪявлен int_count:
int8 int_count=0; // Number of interrupts left before a second has elapsed

и поидее после if(--int_count==0) он должен остаться = 0, т.к unsigned ... не?!

"urry" таки да! Вы были правы. Спасибо.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: PIC12f683 & TIMER1 не сразу запускается.

Сообщение dosikus »

VileDog писал(а): и поидее после if(--int_count==0) он должен остаться = 0, т.к unsigned ... не?!
Блажен кто верует... :)))
Потренируйтесь на win калькуляторе в режиме "Программист" ....
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC12f683 & TIMER1 не сразу запускается.

Сообщение Аlex »

VileDog писал(а):и поидее после if(--int_count==0) он должен остаться = 0, т.к unsigned ... не?!
Конечно же не ! Он будет = 0xFFFF. А сигнед он, или ансигнед - по-барабану.
Реклама
VileDog
Родился
Сообщения: 3
Зарегистрирован: Чт окт 31, 2013 13:07:27

Re: PIC12f683 & TIMER1 не сразу запускается.

Сообщение VileDog »

Видимо меня смутил один меседж компилятора: на строку if(int8 i <= 0) bla-bla-bla - он ругнулся (ворнинг) мол всегда истина, поскольку "i" ансигнед и не может быть меньше 0... хотя какого черта... видимо из-за #define int8 char, хотя тоже не до конца все ясно...
Я до этого момента с микроконтроллерами, вернее с их программированием, НИКОГДА не имел дела и это мой первый опыт. До этого писалЬ только проги на С++ под винду, а теперь вот решил расширить свои познания.
Так что спасибо вам и за УЖАС... УЖАС... и за дельные советы!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: PIC12f683 & TIMER1 не сразу запускается.

Сообщение dosikus »

VileDog писал(а): if(int8 i <= 0) bla-bla-bla -
Многие компиляторы ругаются на объявление в условии , допускают только в начале блока...
Ответить

Вернуться в «PIC»