Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
12.05.2008, 20:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от double_dash
|
Да уж...
Узнать бы точно чему равен частотный потолок TIMER1
|
Измерить опытным путём у ДАНОГО ЭКЗЕМПЛЯРА или посмотреть в даташите на ВСЕ экземпляры даной серии.
Кстати... в даташитах на AVR таких данных не видел,а у PIC ЕСТЬ! ИМХО, MCHIP всегда даёт более полную инфу на изделия.
Сообщение от double_dash
|
Как то nml сказал что одно из достойств PIC'ов
- то что таймер может работать на частотах,
превышающих тактовую частоту Но если 16 МГц - это максимум,то преимущество, прямо скажем, сомнительное
|
ЧИТАЕМ в даташитах!!
в даташите PIC16F84 указано
Tt0H= минимум 30 НАНОСЕКУНД (верхняя полочка сигнала)
Tt0L= минимум 20 НАНОСЕКУНД (нижняя полочка сигнала)
итого период 50 НАНОСЕКУНД частота 20 МГЦ
в даташите PIC16F628A указано
Tt0H= минимум 10 НАНОСЕКУНД
Tt0L= минимум 10 НАНОСЕКУНД
итого период 20 НАНОСЕКУНД частота 50 МГЦ таймер0
Tt1H= минимум 15 НАНОСЕКУНД
Tt1L= минимум 15 НАНОСЕКУНД
итого период 30 НАНОСЕКУНД частота 33 МГЦ таймер1
УЧИТЕ МАТЧАСТЬ!
А реально у многих экзепляров PIC16F84(A) провереных мною (около 30 шт) частотомер работал до 80-100 МЕГАГЕРЦ, отдельные экземпляры работали до 120-130 МЕГАГЕРЦ (без ИМС делителя частоты на входе).
|
|
|
|
13.05.2008, 10:24
|
|
Частый гость
Регистрация: 25.08.2005
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Сообщение от picavr
|
Кстати... в даташитах на AVR таких данных не видел,а у PIC ЕСТЬ! ИМХО, MCHIP всегда даёт более полную инфу на изделия.
|
У АВРок внешний вход таймера стробируемый, поэтому входной сигнал должен быть ниже рабочей частоты АВР в 2,5 - 3 раза, и на максимальных частотах - меандр.
Так что для частотомеров однозначно - ПИК.
|
|
|
|
13.05.2008, 11:30
|
|
Вид на жительство
Регистрация: 02.02.2006
Сообщений: 472
Сказал спасибо: 2
Сказали Спасибо 12 раз(а) в 10 сообщении(ях)
|
Перед TMR0 в PICах можно включить предделитель,который и может считать с частотой больше тактовой.Для 675,629 максимальная частота 50 мГц по datasheetу.Реально больше.Для включения прямо на вход счетчика нужна синхронизация внешнего сигнала и тактового,которая происходит за два такта.Поэтому входные импульсы должны иметь длительность высокого и низкого уровня не менее 2Тosc плюс 20нс задержки во внутренних RC цепях.Отсюда максимальная входная частота по полному такту 4Тosc+40нс.Для работы с предделителем (4Тosc+40нс)/K ,где К коэффициент деления предделителя.
|
|
|
|
14.05.2008, 01:23
|
|
Прописка
Регистрация: 15.10.2006
Сообщений: 130
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 1 сообщении
|
может у кого есть время
взгЯните на мою программу?
А то собрал -
вообще погоду кажет
Нет, определенная пропорциональность
конечно есть,
но ошибка уж ОЧЕНЬ большая.
Главным образом
хотелось бы узнать -
возможен ли вообще такой алгоритм?
А заключается он вот в чем:
включаем TMR1,
и с этого времени засекаем 10 мс (предполагается
деление входной частоты на 10),
за это время считаем сколько раз переполнится
16-битный TMR1H:TMR1L,
как только время закончится -
сразу же вырубаем счетчик:
количество импульсов поступивших за это время получаем как
(количество переполнений)*0x10000 + (остатки в TMR1H:TMR1L)
Вот такая вот штука.
Код:
|
///// PIC16F877A ///////////
////// кварц 10 МГц ////////
#include ‹pic.h›
#include ‹conio.h›
#include "lcd.h"
#include "delay.h"
static unsigned char Overflow;
static unsigned char Tmp;
static unsigned char Tmp2;
static unsigned char Tmp3;
static unsigned long FreqRes;
static unsigned int Buf;
unsigned char FreqBCD[6];
unsigned char i;
unsigned char j;
//---------------------------
__CONFIG(XT & WDTDIS & PWRTEN & BORDIS & LVPDIS & DUNPROT & DEBUGDIS & UNPROTECT);
void _24BinToBCD(void) ;
void BCDtoStr(unsigned char *bcd);
void output_str(unsigned char *bcd);
void init_ports(void);
void counter(void);
void counter(void)
{
FreqBCD[0]= 0;
FreqBCD[1]= 0;
FreqBCD[2]= 0;
FreqBCD[3]= 0;
FreqBCD[4]= 0;
FreqBCD[5]= 0;
TMR1CS = 1; // стробирование по внешнему сигналу
// входной сигнал и есть строб!
// подключен к T1OSO
FreqRes = 0;
Overflow = 0;
Buf = 0;
TMR1L = 0;
TMR1H = 0;
Tmp = 0;
Tmp2 = 0;
#asm
PIR1 equ 0x0C
T1CON equ 0x10
TMR1L equ 0x0E
TMR1H equ 0x0F
bsf T1CON,0 // TMR1ON = 1
// включили таймер
tmr1_loop: // основной цикл (9982 мкс)
//
nop // 0.4
nop // 0.4
nop // 0.4
movlw 50 // 0.4
movwf _Tmp // 0.4
loop1: // } 1.2 + 3.6*(55)
nop // 0.4
nop // 0.4
movlw 55 // 0.4
movwf _Tmp2 // 0.4
loop2: // }3.6
btfss PIR1,0 // 0.8 // if(TMR1IF==1)
goto label1
incf _Overflow // 0.4
bcf PIR1,0 // 0.4
goto label2 // 0.8
label1:
nop
nop
nop
label2:
decfsz _Tmp2, f // 0.8
goto loop2
nop // 0.4
decfsz _Tmp, f // 0.8
goto loop1
nop // 0.4
// дополнительная задержка 14 мкс
nop // 0.4
nop // 0.4
nop // 0.4
movlw 55 // 0.4
movwf _Tmp // 0.4
loop3:
decfsz _Tmp, f // 0.8
goto loop3
nop // 0.4
// } и еще 4 мкс
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
bcf T1CON,0 // 0.4 (т.к. запись в регистр - в последнем такте)
// TMR1ON = 0
// выключили TMR1
#endasm
///это все вроде работает/////
// подсчет
// FreqRes = Overflow*0x10000 + TMR1H:TMR1L
Buf = TMR1H;
Buf = Buf ‹‹ 8;
Buf = Buf | TMR1L;
FreqRes = Overflow;
FreqRes = FreqRes ‹‹ 16; //FreqRes = Overflow*0x10000;
FreqRes = FreqRes + Buf;
_24BinToBCD(); // преобразование в BCD
BCDtoStr(FreqBCD); // преобразование в строку
output_str(FreqBCD); // вывод на ЖКИ
DelayMs(50);
}
main()
{
init_ports();
lcd_init();
for(;;)
{
counter();
}
} |
|
|
|
|
14.05.2008, 10:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Мне абсолютно непонятны Ваши телодвижения в плане
// FreqRes = Overflow*0x10000 + TMR1H:TMR1L
Переполнение наступает при поступлении 65536 импульсов на 1 таймер, причем здесь 10000?
Вы уверены, что простого сдвига на 16 разрядов достаточно, чтобы правильно записать в лонг ?
По-моему, там совсем другой формат. Или нет ?
Код:
|
typedef union
{
unsigned int Buf; //
struct {
unsigned char lo; //младший байт
unsigned char hi; // старший байт
}Bufb;
}Buf_;
Buf_ Buf;
//------------------------------------------
/* Buf = TMR1H;
Buf = Buf ‹‹ 8;
Buf = Buf | TMR1L;
FreqRes = Overflow;
FreqRes = FreqRes ‹‹ 16; //FreqRes = Overflow*0x10000;
FreqRes = FreqRes + Buf; */
Buf.Bufb.lo=TMR1L;
Buf.Bufb.hi=TMR1H;
FreqRes=Overflow*65536+Buf.Buf; |
И зачем эти ассемблерные вставки ... Прекрасно можно обойтись и без них.
|
|
|
|
14.05.2008, 11:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от UncleSam
|
Сообщение от picavr
|
Кстати... в даташитах на AVR таких данных не видел,а у PIC ЕСТЬ! ИМХО, MCHIP всегда даёт более полную инфу на изделия.
|
У АВРок внешний вход таймера стробируемый, поэтому входной сигнал должен быть ниже рабочей частоты АВР в 2,5 - 3 раза, и на максимальных частотах - меандр.
Так что для частотомеров однозначно - ПИК.
|
А об этом где то сказано? что в 2,5-3 раза меньше? от фонаря что ли указали... или есть точные цифры?
|
|
|
|
14.05.2008, 11:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от urry
|
Мне абсолютно непонятны Ваши телодвижения в плане
// FreqRes = Overflow*0x10000 + TMR1H:TMR1L
Переполнение наступает при поступлении 65536 импульсов на 1 таймер, причем здесь 10000?
.
|
Юра, 0x10000 (шестнадчатиричное) = 65536( десятичное) !!!
|
|
|
|
14.05.2008, 11:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
|
|
|
|
14.05.2008, 11:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от double_dash
|
Код:
|
// } и еще 4 мкс
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
nop // 0.4
bcf T1CON,0 // 0.4 (т.к. запись в регистр - в последнем такте) // TMR1ON = 0
// выключили TMR1
#endasm |
|
ИМХО. после выключения проверь ещё раз флаг переполнения таймера и инкремент счётчика, а вдруг за последние 4 МКС он ещё раз переполнился?
И ещё, проверял? что бы проходы по всем веткам занимают ОДИНАКОВОЕ ВРЕМЯ? при отсчёте времени 10 мсек?
|
|
|
|
14.05.2008, 11:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от urry
|
И зачем эти ассемблерные вставки ... Прекрасно можно обойтись и без них.
|
А моно вопрос? так как время измерения в данной програме отсчитывается прохождением циклов проверки переполнения и отсчётом счётчика или пустых проходов. А как в этом плане на Си, время проходов по веткам 1 ветка -ест переполнение инкрементируем счётчик, 2 ветка -нет переполнения пропускаем) будут одинаковы?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:01.
|
|