уважаемый форум.
Как на микропаскале роботат с тсоп сенсороми т.е как наставит таимер на 36khz :( ?ну не как неполучаетса.
помогите...благадорю..
roboforum.ruТехнический форум по робототехнике. |
|
|
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);
}
}
настраиваем TIMSK и TCCRx на соответствующий таймер
подсчитываем какую частоту нам нужно получить и выставляем TCNTx
пишем теперь в прерывании(в ВинАВР это так SIGNAL(SIG_OVERFLOWx) - это при переполнении будет выполнено прерывание)
Теперь в нем пишем код, можно написать PORTx ~=&0xXX при этом выставив DDRx, и на эти ножки таким образом будет подаваться сигнал. Или можно еще проще, выбрать режим работы таймера CTC(вроде) и управлять соответствующей ножкой МК подключенной к этому таймеру, и при переполнении или совпадении будет ножка менять состояние, то есть теже импульсы. Отличие от варианта Мура в том что это выполняется на "заднем плане" и не мешает выполнению программы.
[off]Это я бы сказал неграмотный код[/off]
Сергей писал(а):[off]Вопервых экономия памяти: ты будешь вызывать функцию кучу раз и хранение такой функции занимает несколько больше место чем в прерывании.
Воторых чтобы запустить такое прерывание достаточно выставить одно значение в регистре и также можно его остановить и это занимает меньше памяти и скорости.
Втретьих ты когда будешь выполнять действия по таймеру сможешь за это(допустим) короткое время выполнить еще какиенибудь операции, например остановка другово таймера и тд и тп. Понятно?
А не грамотный код это я имел ввиду вышеперечисленное. Но я ни в коем случае не хотел говорить что ты не умеешь писать проги, код выполнен синтаксически правиильно.[/off]
for a=1 to 200
led=1
waitms=14
led1=0
waitms=13
loop
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
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.
$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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3