Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 05.01.2010, 14:25   #1
maxNTF
Senior Member
 
Регистрация: 12.07.2007
Возраст: 37
Сообщений: 908
Вес репутации: 287/58
maxNTF is a jewel in the roughmaxNTF is a jewel in the roughmaxNTF is a jewel in the rough
Question delay под pic16?

Люди помогите переделать набор функций из библиотеки delay под 16-й пик.
На сколько я понял вся проблема в директиве
Код:
#define DelayUs(x) { \
delayus_variable=(unsigned char)(x/DelayDivisor); \
asm("movlb (_delayus_variable) >> 8"); \
WaitFor1Us; } \
asm("decfsz (_delayus_variable)&0ffh,f"); \
Jumpback;
maxNTF вне форума   Ответить с цитированием
Старый 05.01.2010, 14:26   #2
maxNTF
Senior Member
 
Регистрация: 12.07.2007
Возраст: 37
Сообщений: 908
Вес репутации: 287/58
maxNTF is a jewel in the roughmaxNTF is a jewel in the roughmaxNTF is a jewel in the rough
По умолчанию Re: delay под pic16?

Вот весь исходник
Цитата:
/*

Lowlevel delay routines

For Microchip 18Fxxx or 18Cxxx and Hi-Tech C

Example C:

#define PIC_CLK 4000000

unsigned int timeout_int, timeout_char;

DelayUs(40); //do NOT do DelayUs(N) of N<5 @ 4Mhz or else it executes DelayUs(255) !!!!
DelayUs(255); //max

dly250n; //delay 250ns
dly1u; //delay 1us

timeout_char=timeout_char_us(1147);
while(timeout_char-- && (RA1==0)); //wait up to 1147us for port RA1 to go high
// - this is the max timeout

timeout_int=timeout_int_us(491512);
while(timeout_int-- && (RA1==0)); //wait up to 491512us for port RA1 to go high
// - this is the max timeout

*/

#ifndef __DELAY_H
#define __DELAY_H

extern unsigned char delayus_variable;

//*****
//delay routine
#define PIC_CLK 20000000

#if PIC_CLK == 4000000
#define DelayDivisor 4
#define WaitFor1Us asm("nop")
#define Jumpback asm("goto $ - 4") //on PIC18F, it is asm("goto $ - 4") and on PIC16F core it is asm("goto $ - 2")
#elif PIC_CLK == 8000000
#define DelayDivisor 2
#define WaitFor1Us asm("nop")
#define Jumpback asm("goto $ - 4")
#elif PIC_CLK == 16000000
#define DelayDivisor 1
#define WaitFor1Us asm("nop")
#define Jumpback asm("goto $ - 4")
#elif PIC_CLK == 20000000
#define DelayDivisor 1
#define WaitFor1Us asm("nop"); asm("nop")
#define Jumpback asm("goto $ - 6")
#elif PIC_CLK == 32000000
#define DelayDivisor 1
#define WaitFor1Us asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop")
#define Jumpback asm("goto $ - 12")
#else
#error delay.h - please define PIC_CLK correctly
#endif

#define DelayUs(x) { \
delayus_variable=(unsigned char)(x/DelayDivisor); \
asm("movlb (_delayus_variable) >> 8"); \
WaitFor1Us; } \
asm("decfsz (_delayus_variable)&0ffh,f"); \
Jumpback;

/*

timeouts:

C code for testing with ints:

unsigned int timeout;
timeout=4000;
PORT_DIRECTION=OUTPUT;
while(1)
{
PORT=1;
timeout=8000;
while(timeout-- >= 1); //60ms @ 8Mhz, opt on, 72ms @ 8Mhz, opt off
PORT=0;
}

Time taken: optimisations on: 16cyc/number loop, 8us @ 8Mhz
optimisations off: 18cyc/number loop, 9us @ 8Mhz
with extra check ie: && (RB7==1), +3cyc/number loop, +1.5us @ 8Mhz

C code for testing with chars:

similar to above

Time taken: optimisations on: 9cyc/number loop, 4.5us @ 8Mhz
with extra check ie: && (RB7==1), +3cyc/number loop, +1.5us @ 8Mhz

Formula: rough timeout value = (<us desired>/<cycles per loop>) * (PIC_CLK/4.0)

To use: //for max timeout of 1147us @ 8Mhz
#define LOOP_CYCLES_CHAR 9 //how many cycles per loop, optimizations on
#define timeout_char_us(x) (unsigned char)((x/LOOP_CYCLES_CHAR)*(PIC_CLK/4.0))
unsigned char timeout;
timeout=timeout_char_us(1147); //max timeout allowed @ 8Mhz, 573us @ 16Mhz
while((timeout-- >= 1) && (<extra condition>)); //wait

To use: //for max 491512us, half sec timeout @ 8Mhz
#define LOOP_CYCLES_INT 16 //how many cycles per loop, optimizations on
#define timeout_int_us(x) (unsigned int)((x+/LOOP_CYCLES_INT)*(PIC_CLK/4.0))
unsigned int timeout;
timeout=timeout_int_us(491512); //max timeout allowed @ 8Mhz
while((timeout-- >= 1) && (<extra condition>)); //wait
*/
#define LOOP_CYCLES_CHAR 9 //how many cycles per loop, optimizations on
#define timeout_char_us(x) (long)(((x)/LOOP_CYCLES_CHAR)*(PIC_CLK/1000000/4))

#define LOOP_CYCLES_INT 16 //how many cycles per loop, optimizations on
#define timeout_int_us(x) (long)(((x)/LOOP_CYCLES_INT)*(PIC_CLK/1000000/4))

//if lo byte is zero, faster initialization by 1 instrucion
#define timeout_int_lobyte_zero_us(x) (long)(((x)/LOOP_CYCLES_INT)*(PIC_CLK/4.0)&0xFF00)

//function prototypes
void DelayBigUs(unsigned int cnt);
void DelayMs(unsigned char cnt);
void DelayMs_interrupt(unsigned char cnt);
void DelayBigMs(unsigned int cnt);
void DelayS(unsigned char cnt);

#endif
maxNTF вне форума   Ответить с цитированием
Старый 05.01.2010, 19:12   #3
Andrey_Fly
Senior Member
 
Аватар для Andrey_Fly
 
Регистрация: 11.03.2008
Адрес: Kazakhstan, Ridder
Возраст: 40
Сообщений: 140
Вес репутации: 128/46
Andrey_Fly will become famous soon enoughAndrey_Fly will become famous soon enough
По умолчанию Re: delay под pic16?

Попробуйте найти ответ на http://forum.eldigi.ru/index.php?showtopic=662
__________________
Одна голова хорошо, а две .... не красиво
Andrey_Fly вне форума   Ответить с цитированием
Старый 05.01.2010, 19:23   #4
urry
Senior Member
 
Аватар для urry
 
Регистрация: 11.10.2007
Возраст: 57
Сообщений: 462
Вес репутации: 228/52
urry has a spectacular aura abouturry has a spectacular aura abouturry has a spectacular aura about
По умолчанию Re: delay под pic16?

поиск есть на форуме - это под 16 пики
http://www.microchip.su/showthread.p...F6%E8%FF+delay
urry вне форума   Ответить с цитированием
Старый 05.01.2010, 19:31   #5
SSH
Banned
 
Регистрация: 27.02.2007
Адрес: Красноярск
Возраст: 50
Сообщений: 2,387
Вес репутации: 950/0
SSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to behold
По умолчанию Re: delay под pic16?

А из под HI-TECH STD delay.c и delay.h не работают? Там всё по стандарту, вроде, без всяких прагм...Препроцессор и компилятор...Или необходимо такты ловить??? Функций и нужно-то, всего две! К чему вся эта "клюква"? :-)

Последний раз редактировалось SSH; 05.01.2010 в 19:36.
SSH вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двухстрочный ЖКИ WH1602A-YGH-CTK Konoplaud Общетехнические вопросы 15 08.01.2013 14:55
pic16f84a - ds3231 не работают часы andrix Продукция MICROCHIP 10 23.09.2009 17:21
PIC16F877 и LCD svg67 Продукция MICROCHIP 7 15.09.2009 10:58
Bootloader под MCC18 NeoKlin Продукция MICROCHIP 2 04.05.2009 00:12
Вложенные прерывания на PIC16 в СИ под CCS olegator Вопросы начинающих 40 25.02.2009 21:17


Часовой пояс GMT +3, время: 19:08.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot