Отговори на тема  [ 12 мнения ] 
проблем с декрементиране на long пром. в CCS и setup_wdt(); 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 19, 2005 12:49 am
Мнения: 61
Мнение проблем с декрементиране на 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. При вас възниквал ли е подобен проблем?


Пет Дек 30, 2005 6:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
A в #include-a указал ли си фуза WDT?


Пет Дек 30, 2005 6:24 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 19, 2005 12:49 am
Мнения: 61
Мнение 
да, указал съм го


Пет Дек 30, 2005 6:38 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
Пич, тука имаш една грешка

#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
}

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


Пет Дек 30, 2005 6:42 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Ами ти декрементираш само младшия байт на ulDelay:
decfsz ulDelay
goto again
#endasm
1000 десетично е 03Е8
Е8 = 232


Пет Дек 30, 2005 6:43 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Ное 01, 2005 10:23 am
Мнения: 704
Местоположение: Limerick, Ireland
Мнение 
абе то хуу си дефинирал unsigned long за ulDelay, обаче после използваш: 'decfsz ulDelay'.
Незнам дали 'decfsz' може да се оправи с 'unsigned long' променлива ;)...

_________________
"640 К са достатъчни на всеки за всичко."
Бил Гейтс


Пет Дек 30, 2005 7:35 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 19, 2005 12:49 am
Мнения: 61
Мнение 
Благодаряско за
Цитат:
#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

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


Пет Дек 30, 2005 7:45 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 19, 2005 12:49 am
Мнения: 61
Мнение 
Е не, ще се побъркам. Ето го същото нещо написано само на "С".
Сега ефекта е друг, 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--;
   }
}


Пет Дек 30, 2005 9:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
И вместо да си тъпчеш главата на празника с главоболия как да прехвърляш Carry флага за да декрементираш long-a, пробвай с едно "ulDelay--" :D Айде весело посрещане :)


Пет Дек 30, 2005 9:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Цитат:
А това Restricted Memory защо излиза?

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

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


Пет Дек 30, 2005 11:21 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 19, 2005 12:49 am
Мнения: 61
Мнение 
Благодарско но всички. За мое щастие се оказа че проблема не е в "задклавиатурното устройство" :) . Или поне не изцяло :wink: .
Оказа се че *.cof файла генериран от CCS не се симулира коректно в MPLAB-а.
Още веднъж благдарско и да си изкарате готино утре вечер. Наздраве :wink:


Съб Дек 31, 2005 12:01 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение 
Абе аз тоя MPLAB тотално съм го забравил, CCS с ICD1 си е супер, а иначе протеуса, не виждам предимство на MPLAB пред него.


Вто Яну 03, 2006 4:09 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 12 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 6 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни