Технический форум по робототехнике.
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]