| Автор |
Съобщение |
|
jony++
Ранг: Минаващ
Регистриран на: Пон Сеп 19, 2005 12:49 am Мнения: 61
|
 проблем с декрементиране на long пром. в CCS и setup_wdt();
Здравейте, хвърлете едно око на следната функция:
контролерът е PIC16F819
Както ви става ясно това е функция за време закъснение от определени милисекунди оказани чрез ulDelay. Проблемът е че при декрементиране на ulDelay=1000 след 232-то декрементиране се излиза от функцията. Пробвах декрементирането на ulDelay да се извършва извън асемблерския фрагмент, написано на "С" но отново след 232-то декрементиране се излиза от функцията. ulDelay със сигурност е 16 бита. На каков може да се дължи това. Явно аз съм много прост и греша фундаментално някъде Другото което забелязъх е:
На пръв поглед всичко си е точно - настройва си се таймера, настройва си се прескалера, но не се вдига бита (бит 3) в OPTION регистъра оказващ че прескалера ще се използва с WDT. При вас възниквал ли е подобен проблем?
|
| Пет Дек 30, 2005 6:07 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
A в #include-a указал ли си фуза WDT?
|
| Пет Дек 30, 2005 6:24 pm |
|
 |
|
jony++
Ранг: Минаващ
Регистриран на: Пон Сеп 19, 2005 12:49 am Мнения: 61
|
да, указал съм го
|
| Пет Дек 30, 2005 6:38 pm |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 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 |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
Ами ти декрементираш само младшия байт на ulDelay:
decfsz ulDelay
goto again
#endasm
1000 десетично е 03Е8
Е8 = 232
|
| Пет Дек 30, 2005 6:43 pm |
|
 |
|
nickich
Ранг: Почетен член
Регистриран на: Вто Ное 01, 2005 10:23 am Мнения: 704 Местоположение: Limerick, Ireland
|
абе то хуу си дефинирал unsigned long за ulDelay, обаче после използваш: 'decfsz ulDelay'.
Незнам дали 'decfsz' може да се оправи с 'unsigned long' променлива  ...
_________________ "640 К са достатъчни на всеки за всичко." Бил Гейтс
|
| Пет Дек 30, 2005 7:35 pm |
|
 |
|
jony++
Ранг: Минаващ
Регистриран на: Пон Сеп 19, 2005 12:49 am Мнения: 61
|
Благодаряско за
това не го знаех, отчитам го като грешка. Колкото до
очевидно тук е проблема, ще го коригирам.
|
| Пет Дек 30, 2005 7:45 pm |
|
 |
|
jony++
Ранг: Минаващ
Регистриран на: Пон Сеп 19, 2005 12:49 am Мнения: 61
|
Е не, ще се побъркам. Ето го същото нещо написано само на "С".
Сега ефекта е друг, wait_ms(1000); зарежда ulDelay с 232 (еднобайтово число). А в симулатора на MPLAB за ucTime_1ms дава съобщение Restricted Memory.
Добре, се използва "С" нетрябва ли компилатора да си се грижи за обработката на Long променлива? А това Restricted Memory защо излиза? Е не, направо ще се метна от балкона.
|
| Пет Дек 30, 2005 9:13 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
И вместо да си тъпчеш главата на празника с главоболия как да прехвърляш Carry флага за да декрементираш long-a, пробвай с едно " ulDelay--"  Айде весело посрещане 
|
| Пет Дек 30, 2005 9:25 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
Защото ucTime_1ms ти е локална променлива и тъпия симулатор не знае, че я има.
Най-верятно тука всичко е точно. Предполагам, че мплаблския симулатор не се справя с декларацийте на CCS-а (unsigned long на майкрочипското С е 32 бита). И друго - ти гледаш ulDelay, което е само младшата част. Старшата е на следващия адрес (ulDelay+1).
|
| Пет Дек 30, 2005 11:21 pm |
|
 |
|
jony++
Ранг: Минаващ
Регистриран на: Пон Сеп 19, 2005 12:49 am Мнения: 61
|
Благодарско но всички. За мое щастие се оказа че проблема не е в "задклавиатурното устройство"  . Или поне не изцяло  .
Оказа се че *.cof файла генериран от CCS не се симулира коректно в MPLAB-а.
Още веднъж благдарско и да си изкарате готино утре вечер. Наздраве 
|
| Съб Дек 31, 2005 12:01 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30685 Местоположение: София
|
Абе аз тоя MPLAB тотално съм го забравил, CCS с ICD1 си е супер, а иначе протеуса, не виждам предимство на MPLAB пред него.
|
| Вто Яну 03, 2006 4:09 am |
|
|