Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
08.04.2009, 12:45
|
|
Прописка
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Вывод частоты на ногу Меги88
Извиняюсь, может повторюсь, но прошу мне объяснить (а не сделать, хотя от куска кода и не откажусь ![Валяюсь от смеха](images/smilies/icon_biggrin.gif) ) как коректно вывести частоту на ногу микроконтролера я вроде бы часть сделал но не врубаюсь в некоторые ньюансы. Вот часть кода-вставки на асме
Код не мой
Код:
|
.def inc_buf_lo =r6
.def inc_buf_hi =r7
.def sum_lo =r19
.def sum_hi =r20
.def timeout1 =r5
clr sum_lo
clr sum_hi
loop_run:
out PORTB,out_prep
loop_count:
add sum_lo,inc_buf_lo
adc sum_hi,inc_buf_hi
brcc loop_count
out PORTB,out_noprep
sbis PIND,4 ; проверяем ESC. Если не нажата, то skip
rjmp to_set
tst timeout1
brne loop_run |
Где inc_buf_lo, inc_buf_hi я так понял это мл. и ст. байты
вверху есть такая строка
inc_buf=freq2inc(freq[x]); где x это число
freq[20]{0x2714...0x2714};
Код:
|
unsigned int freq2inc(unsigned int freq) // Преобразование частоты в инкремент синтезатора частоты
{
unsigned int delta;
unsigned long int temp_1, temp_2, f, frac;
// delta=131072/(16384/f-3)
if (freq›=0x8000U)
{ // частота = (freq-0x8000)/10
f=(unsigned long int)freq-0x0080UL;
temp_2=1638400UL-f*3;
} else
f=(unsigned long int)freq; // f - это частота*100
temp_2=1638400UL-f*3;
};
temp_1=(32768UL*f)‹‹2;
delta=(unsigned int)(temp_1/temp_2);
frac=temp_1%temp_2;
if ((frac‹‹1)›=temp_2) delta++;
return delta;
} |
Вот эта функция мне уже плешь проела как ее "настроить" или дело не в ней. например пишется в ЕЕПРОМ частота 77 Гц имеющая вид 14 27 выводит стоит поменять на 1 Гц (64 00) начинаются глюки как их избежать. И вообще что такое инкремент.
[/code]
|
|
|
|
08.04.2009, 13:29
|
|
Прописка
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Вот блин кажется догадался только вот не где ни могу найти как из кучи вида 0x141E взять только 0x1E или 0x14 8O
|
|
|
|
08.04.2009, 15:06
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Сообщение от FedorChek
|
Вот блин кажется догадался только вот не где ни могу найти как из кучи вида 0x141E взять только 0x1E или 0x14 8O
|
Код:
|
0x141E & 0x00FF = 0x1E
0x141E ›› 8 = 0x14 |
|
|
|
|
10.04.2009, 00:04
|
|
Временная регистрация
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Может проще и надежней генерировать частоту на ноге с помощью таймера в режиме CTC.
|
|
|
|
11.04.2009, 14:14
|
|
Прописка
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Что за режим?
|
|
|
|
11.04.2009, 17:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 09.12.2007
Адрес: Новосибирск
Сообщений: 1,021
Сказал спасибо: 10
Сказали Спасибо 70 раз(а) в 63 сообщении(ях)
|
Почитайте у Евстифеева о CTC - это
сброс счетчика при совпадении
http://lord-n.narod.ru/walla.html
а в даташите конкретно.
__________________
И на камнях растут деревья!
|
|
|
|
11.04.2009, 17:44
|
|
Временная регистрация
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Режим CTC (сброс при совпадении).
Максимально возможное значение счетного регистра и, следовательно, разрешающая способность счетчика определяются либо регистром сравнения блока A OCRnA ,либо регистром захвата ICRn.Если настроить
вывод OCnA на изменение логического уровня на противоположное значение, то генерировать частоту
можно полностью на аппаратном уровне, а если генерировать прерывание, то в обработчике можно управлять любым выводом и на нем генерировать частоту.Определить генерируемую частоту можно по формуле:
Fген = Fclk/2*N*(1+X) ,
где X - значение записанное в регистре сравнения
N - коэффициент деления предделителя
Вот несколько способов реализации(CodeVisionAVR)
Прикрепленный файл: 6994734.rar
|
|
|
|
12.04.2009, 17:43
|
|
Прописка
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Совсем запутался... Как же заставить выводить нужную частоту если она задается в виде 1Гц=0x0064 2Гц=0x00C8
Fген = Fclk/2*N*(1+X)
не могу понять чему равен N и X
Fclk=0,032768 MHz (внешний)
|
|
|
|
12.04.2009, 18:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 09.12.2007
Адрес: Новосибирск
Сообщений: 1,021
Сказал спасибо: 10
Сказали Спасибо 70 раз(а) в 63 сообщении(ях)
|
Сообщение от FedorChek
|
виде 1Гц=0x0064 2Гц=0x00C8
|
А что такое 64 и С8?
Но для того чтобы получить требуемое нужно -
в OCR1A записать число 16384,
а вывод OC1A настроить на изменению на противоположное при совпадении.
В OCR1B записать 16284/2 и вывод OCR1B устанавливать
в 1 при совпадении.
Таймер1 в реж. СТС.
__________________
И на камнях растут деревья!
|
|
|
|
12.04.2009, 18:42
|
|
Прописка
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Повторюсь и приведу части кода
register unsigned char timeout1 @5;
register unsigned int inc_buf @6;
далее идет сама процедура вывода
Код:
|
inc_buf=0x2710; // эти данные читаются из EEPROM сдесь 0x2710 равна 100Гц
timer_counter1_start();
#asm
.def ee =r23
.equ pin_in_bit =1
.equ pin_out_bit =0
.equ pin_in =(1‹‹pin_in_bit)
.equ pin_out =(1‹‹pin_out_bit)
.equ PORTB =$05 // Mega8 $18
.equ PIND =$09 //Mega8 $10
.def out_prep =r3
.def out_noprep =r4
.def prep =r17
.def inc_buf_lo =r6
.def inc_buf_hi =r7
.def sum_lo =r19
.def sum_hi =r20
.def timeout1 =r5
.def i =r21
ldi ee, eea_preparats
add ee,sel
ee_read:
sbic eecr,eewe
rjmp ee_read
out eearl,ee
out eearh,reg_00
sbi eecr,eere
in prep,eedr
rjmp end_eeRead
rcall ee_read
end_eeRead:
// Сдесь читается и выводится одна ячейка имеющая значения 1 или 0 в зависимости от этого генерируется частота 1-0--1-0 и наоборот этот кусок можно покак я так думаю пропустить
in out_prep,PORTB
set
nop
clt
nop
set
nop
bst prep,0
bld out_prep,0;!!!!!!!!
mov out_noprep,out_prep
ldi prep,pin_out
eor out_noprep,prep
// вот отсюда и начинается вывод самой частоты
clr sum_lo
clr sum_hi
loop_run:
out PORTB,out_prep
loop_count:
add sum_lo,inc_buf_lo
adc sum_hi,inc_buf_hi
brcc loop_count
out PORTB,out_noprep
sbis PIND,4 ; проверяем ESC. Если не нажата, то skip
rjmp to_set
tst timeout1
brne loop_run
// clr i
// rjmp to_end
to_set:
// ser i
to_end:
#endasm |
те значения 0x0064=1Гц и т.д. (пишутся в еепром и потом считываются оттуда) и с ними ничего нельзя поделать т.е. они будут фигурировать именно в таком виде поскольку запись осуществляется через "инфрокрасник" (прога на компе››устройство››мое устройство)
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Микросхема К561ИЕ16 и частоты Меги88
|
FedorChek |
Микроконтроллеры, АЦП, память и т.д |
0 |
13.04.2009 00:29 |
Импульсный вывод с порта-пина на основе частоты
|
retcom |
Микроконтроллеры, АЦП, память и т.д |
24 |
27.10.2007 15:11 |
Вывод инфо.
|
SpL |
Микроконтроллеры, АЦП, память и т.д |
21 |
30.01.2007 22:40 |
Вывод состояния через 1 вывод
|
DL36 |
Микроконтроллеры, АЦП, память и т.д |
0 |
16.11.2006 14:27 |
Вывод на экран букв...
|
Купидон |
Микроконтроллеры, АЦП, память и т.д |
2 |
27.07.2003 21:03 |
Часовой пояс GMT +4, время: 11:36.
|
|