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

проблем с декрементиране на long пром. в CCS и setup_wdt();
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=1507
Страница 1 от 1

Автор:  jony++ [ Пет Дек 30, 2005 6:07 pm ]
Заглавие:  проблем с декрементиране на long пром. в CCS и setup_wdt();

Здравейте, хвърлете едно око на следната функция:

контролерът е PIC16F819

Код:
#define TMR0   0x01
#define INTCON   0x0B
#define TMR0IF   2

void wait_ms(unsigned long ulDelay)
{
   unsigned char ucTime_1ms = 0;
   
   #asm
   again:
      movlw   0x04
      movwf   ucTime_1ms
   wait_1ms:
      movlw   0x06
      movwf   TMR0
      bcf      INTCON,TMR0IF
   loop:
      btfss      INTCON,TMR0IF
      goto      loop

      CLRWDT
      decfsz   ucTime_1ms
      goto      wait_1ms
      decfsz   ulDelay
      goto      again
   #endasm
}


Както ви става ясно това е функция за време закъснение от определени милисекунди оказани чрез ulDelay. Проблемът е че при декрементиране на ulDelay=1000 след 232-то декрементиране се излиза от функцията. Пробвах декрементирането на ulDelay да се извършва извън асемблерския фрагмент, написано на "С" но отново след 232-то декрементиране се излиза от функцията. ulDelay със сигурност е 16 бита. На каков може да се дължи това. Явно аз съм много прост и греша фундаментално някъде :roll:

Другото което забелязъх е:
Код:
setup_timer_0(RTCC_INTERNAL);
   setup_wdt(WDT_2304MS);

На пръв поглед всичко си е точно - настройва си се таймера, настройва си се прескалера, но не се вдига бита (бит 3) в OPTION регистъра оказващ че прескалера ще се използва с WDT. При вас възниквал ли е подобен проблем?

Автор:  Predator_MF [ Пет Дек 30, 2005 6:24 pm ]
Заглавие: 

A в #include-a указал ли си фуза WDT?

Автор:  jony++ [ Пет Дек 30, 2005 6:38 pm ]
Заглавие: 

да, указал съм го

Автор:  Dimiter [ Пет Дек 30, 2005 6:42 pm ]
Заглавие: 

Пич, тука имаш една грешка

#define TMR0 0x01
#define INTCON 0x0B
#define TMR0IF 2

при CCS това трябва да е така:

#BYTE TMR0 = 0x01
#BYTE INTCON = 0x0B
#define TMR0IF 2

регистрите се указват с директивата #BYTE
за да нямаш ядове с банките (компилатора се оправя сам)

Още по тарикатско за флагове е #BIT
примерно #BIT T0IF = 0xb.2
и после го манипулираш директно

if(T0IF)
{
do something
}
else
{
do something else
}

По надоло не съм гледал нямам време..

Автор:  Gogo [ Пет Дек 30, 2005 6:43 pm ]
Заглавие: 

Ами ти декрементираш само младшия байт на ulDelay:
decfsz ulDelay
goto again
#endasm
1000 десетично е 03Е8
Е8 = 232

Автор:  nickich [ Пет Дек 30, 2005 7:35 pm ]
Заглавие: 

абе то хуу си дефинирал unsigned long за ulDelay, обаче после използваш: 'decfsz ulDelay'.
Незнам дали 'decfsz' може да се оправи с 'unsigned long' променлива ;)...

Автор:  jony++ [ Пет Дек 30, 2005 7:45 pm ]
Заглавие: 

Благодаряско за
Цитат:
#define TMR0 0x01
#define INTCON 0x0B
#define TMR0IF 2

при CCS това трябва да е така:

#BYTE TMR0 = 0x01
#BYTE INTCON = 0x0B
#define TMR0IF 2

това не го знаех, отчитам го като грешка.

Колкото до
Цитат:
Ами ти декрементираш само младшия байт на ulDelay:
decfsz ulDelay
goto again
#endasm

очевидно тук е проблема, ще го коригирам.

Автор:  jony++ [ Пет Дек 30, 2005 9:13 pm ]
Заглавие: 

Е не, ще се побъркам. Ето го същото нещо написано само на "С".
Сега ефекта е друг, wait_ms(1000); зарежда ulDelay с 232 (еднобайтово число). А в симулатора на MPLAB за ucTime_1ms дава съобщение Restricted Memory.
Добре, се използва "С" нетрябва ли компилатора да си се грижи за обработката на Long променлива? А това Restricted Memory защо излиза? Е не, направо ще се метна от балкона.

Код:
#byte TMR0 = 0x01
#byte INTCON = 0x0B
#bit TMR0IF = 0xB.2

void wait_ms(unsigned long ulDelay)
{
   unsigned char ucTime_1ms=0;

   while(ulDelay) {
      ucTime_1ms = 4;
      while(ucTime_1ms) {
         //TMR0IF = 0;
         bit_clear(INTCON,2);
         TMR0 = 6;
         while(!TMR0IF);
         ucTime_1ms--;
      }
      restart_wdt();
      ulDelay--;
   }
}

Автор:  Predator_MF [ Пет Дек 30, 2005 9:25 pm ]
Заглавие: 

И вместо да си тъпчеш главата на празника с главоболия как да прехвърляш Carry флага за да декрементираш long-a, пробвай с едно "ulDelay--" :D Айде весело посрещане :)

Автор:  Gogo [ Пет Дек 30, 2005 11:21 pm ]
Заглавие: 

Цитат:
А това Restricted Memory защо излиза?

Защото ucTime_1ms ти е локална променлива и тъпия симулатор не знае, че я има.
Цитат:
wait_ms(1000); зарежда ulDelay с 232 (еднобайтово число)

Най-верятно тука всичко е точно. Предполагам, че мплаблския симулатор не се справя с декларацийте на CCS-а (unsigned long на майкрочипското С е 32 бита). И друго - ти гледаш ulDelay, което е само младшата част. Старшата е на следващия адрес (ulDelay+1).

Автор:  jony++ [ Съб Дек 31, 2005 12:01 am ]
Заглавие: 

Благодарско но всички. За мое щастие се оказа че проблема не е в "задклавиатурното устройство" :) . Или поне не изцяло :wink: .
Оказа се че *.cof файла генериран от CCS не се симулира коректно в MPLAB-а.
Още веднъж благдарско и да си изкарате готино утре вечер. Наздраве :wink:

Автор:  ToHu [ Вто Яну 03, 2006 4:09 am ]
Заглавие: 

Абе аз тоя MPLAB тотално съм го забравил, CCS с ICD1 си е супер, а иначе протеуса, не виждам предимство на MPLAB пред него.

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