roboforum.ru

Технический форум по робототехнике.

36khz на микропаскале помогите...

36khz на микропаскале помогите...

bloodaxe » 05 май 2007, 16:12

уважаемый форум.
Как на микропаскале роботат с тсоп сенсороми  т.е как наставит таимер на 36khz :(  :( ?ну не как неполучаетса.
помогите...благадорю..

Myp » 05 май 2007, 16:33

к форуму  бесполезно обращатся
это машина бездушная и она тебе ничего не ответит :)
лучше спрашивай у форумчан или у великого ALL


а вобще надо калькулятор взять и посчитать
один раз в 14 микросекунд должен срабатывать таймер


как там в паскале это будет выглядеть я незнаю но на Си и без таймеров это
выглядит так
Код: Выделить всёРазвернуть
void send(void)
{
for(i=0;i<14;i++)  // количество импульсов минимум 10 но для надёжности я  думаю надо больше, но не больше 70
хотя у меня и с 14 всё отлично работает
{
PORTC.2 = 0;  // начало импульса
delay_us(14);  // задержка чтоб получить 36 кГц
PORTC.2 = 1;  // конец  импульса
delay_us(14);
}
}

Сергей » 05 май 2007, 19:27

Это я бы сказал неграмотный код, тут нужно использовать таймеры, как на паскале это писать я не знаю, но на Си юзаю. смысл примерно такой:
Код: Выделить всёРазвернуть
настраиваем TIMSK и TCCRx на соответствующий таймер
подсчитываем какую частоту нам нужно получить и выставляем TCNTx
пишем теперь в прерывании(в ВинАВР это так SIGNAL(SIG_OVERFLOWx) - это при переполнении будет выполнено прерывание)
Теперь в нем пишем код, можно написать PORTx ~=&0xXX при этом выставив DDRx, и на эти ножки таким образом будет подаваться сигнал. Или можно еще проще, выбрать режим работы таймера CTC(вроде) и управлять соответствующей ножкой МК подключенной к этому таймеру, и при переполнении или совпадении будет ножка менять состояние, то есть теже импульсы. Отличие от варианта Мура в том что это выполняется на "заднем плане" и не мешает выполнению программы.

Myp » 05 май 2007, 19:41

[off]а у меня программе не мешает ни капли=) даже наоборот помогает
это процедура, и вызывается только тогда когда нужна =)

например если робот стоит на месте или управляется в ручную
когда мне совершенно не нужны бамперы я не буду вызывать эту процедуру[/off]
[off]Это я бы сказал неграмотный код[/off]

[off]а почему неграмотный?? =/[/off]

Сергей » 05 май 2007, 19:47

Вопервых экономия памяти: ты будешь вызывать функцию кучу раз и хранение такой функции занимает несколько больше место чем в прерывании.
Воторых чтобы запустить такое прерывание достаточно выставить одно значение в регистре и также можно его остановить и это занимает меньше памяти и скорости.
Втретьих ты когда будешь выполнять действия по таймеру сможешь за это(допустим) короткое время выполнить еще какиенибудь операции, например остановка другово таймера и тд и тп. Понятно?
А не грамотный код это я имел ввиду вышеперечисленное. Но я нивкоем случае не хотел говорить что ты не умеешь писать проги, код выполнен синтаксически правиильно.

Myp » 05 май 2007, 20:10

Сергей писал(а):[off]Вопервых экономия памяти: ты будешь вызывать функцию кучу раз и хранение такой функции занимает несколько больше место чем в прерывании.
Воторых чтобы запустить такое прерывание достаточно выставить одно значение в регистре и также можно его остановить и это занимает меньше памяти и скорости.
Втретьих ты когда будешь выполнять действия по таймеру сможешь за это(допустим) короткое время выполнить еще какиенибудь операции, например остановка другово таймера и тд и тп. Понятно?
А не грамотный код это я имел ввиду вышеперечисленное. Но я ни в коем случае не хотел говорить что ты не умеешь писать проги, код выполнен синтаксически правиильно.[/off]

[off]
гы ну за синтаксиком компилятор следит, за синтаксис я не опасаюсь=)
а за пояснение спасибо

имхо на этой стадии проектирования я ооочень далёк от вопросов экономии памяти и ресурсов
а я накарябал так как мне самому понятней=)

кстати там время совсем и не маленькое... 280 микросекунд на процедуру это вам не хухры мухры =)
тем более что для надёжности надо 2 раза процедуру вызывать а это уже в сумме с паузой 500 мкс на отдых тсопа
будет 0.001 секунды ...[/off]

Сергей » 05 май 2007, 20:28

Самое главное это тебе понятно.

SL_ » 08 май 2007, 10:35

Уважаемый bloodaxe, а какой версией паскаля пользуетесь и есть ли у Вас к ней keygen? Был бы очень признателен если бы Вы выложили keygen где нибудь с соответствующей версией паскаля.

bloodaxe » 09 май 2007, 13:17

вот проблема в том что  на баскомеАВР настроика 36кhz проблем не сотворяет ,так как такои код:
Код: Выделить всёРазвернуть
for a=1 to 200 
led=1
waitms=14
led1=0
waitms=13
loop

в полне роботает а вот на микропаскале непашет вот и всё а как таймеры на паскале вклучат то нигде не нахожу.
а что касаетса кеыген дляп паскаля так первый запрос в гоогле и всё:)

Myp » 09 май 2007, 13:21

Код: Выделить всёРазвернуть
for a=1 to 200
led=1
waitms=14
led1=0
waitms=13
loop

ну это неправильный код =)
надо
Код: Выделить всёРазвернуть
for a = 1 to 10 //достаточно 10-15 , но не больше 70 раз!!!!

во вторых чё это?
включаете один лед а выключаете другой
Код: Выделить всёРазвернуть
led=1
led1=0


вы бы скинули сюда то что у вас не работает а мы бы посмотрели

bloodaxe » 09 май 2007, 14:33

nu vot kod progi:
Код: Выделить всёРазвернуть
program button_test;
var
a:integer;
procedure ir_led; //procedura ir_leda na 36khz.
begin
for a:=1 to 200 do
begin
portd.4:=1;
delay_us(14);
portd.4:=0;
delay_us(14);

end;

end;

begin
DDRD := $FF; // portd vyxod
PORTD := $00;// kidajem 0 na wes portd.
portb.0:=$FF; //podciazka na tsop1
portb.1:=$ff; // podciazka na tsop2
ir_led;

while TRUE do
begin
if Button(PORTB,0,0,0) or Button(PORTB,1,0,0) then // jesli liuboi tsop srabotal togda=>

portd.2:=1 // wkliuciajem portd.2

else // jesli knopka nenazata
begin
portd.2:=0; // vykliuciajem portd.2
ir_led; //i vkliuciajem ir_led

end;
end;
end.

===========================================
a eto kod na baskome a zdes vot wsio pashet:)

Код: Выделить всёРазвернуть
$crystal = 1000000
$regfile = "ATtiny2313.dat"
$lib "mcsbyte.lbx"
Config Pind.2 = Output
Config Pind.1 = Output
Config Pind.4 = Output : Ir_led Alias Portd.4
Config Pinb.1 = Input
Config Pinb.0 = Input
Dim Temp As Byte
Set Portb.0
Set Portb.1
1:

For Temp = 1 To 200
Ir_led = 1
Waitus 14
Ir_led = 0
Waitus 14
Next
S:
Do
Debounce Pinb.0 , 0 , R : Debounce Pinb.1 , 0 , L
Debounce Pinb.0 , 1 , 1 : Debounce Pinb.1 , 1 , 1
R:
Set Portd.2
Wait 2
Reset Portd.2
Goto S
L:
Set Portd.1
Wait 2
Reset Portd.1
Goto S
Loop
End

bloodaxe » 15 май 2007, 14:08

NAROD nu pomogite ze aaa?
Танслит на форуме запрещен. Сергей.

Myp » 15 май 2007, 15:11

[off]посмотрел
имхо по алгоритму всё должно работать
проверить не могу ибо на си пишу
по тому не отвечаю
[/off]
это не компилится или не работает в конечном устройстве???

maktep » 16 май 2007, 21:26

[off]Сергей, пусть покупают русскую клаву? В литве же он...[/off]

Сергей » 16 май 2007, 22:08

[off]Ну дык предыдущие сообщения на русском писал он.[/off]


Rambler\'s Top100 Mail.ru counter