роботы робототехника микроконтроллеры


 Страниц (3): [1] 2 3 »   

> Описание: Помогите составить функцию
Artem Post Id


Главнокомандующий


Сообщений всего: 347
Дата рег-ции: Май 2012  



Здравствуйте. Улыбка
Начал программировать на си(мог создавать простых роботов), но теперь перешёл на бейсик в виду того что он проще, но всё же си как-то роднее. Я знаю что в бейсике можно производить опрос двух кнопок одновременно и совершать действие если нажаты обе кнопки:
If Pind.2 = 0 Then and If Pind1 = 0 Then//поправте если я что-то не так написал, потому что увидел на каком-то сайте, но забыл
// и здесь делаем что-то
А можно ли что-то подобное выполнить на СИ, и если да то как?
Заранее спасибо Улыбка
 
 Top
anar Post Id



Главнокомандующий


Сообщений всего: 441
Дата рег-ции: Июнь 2011  



Artem пишет:
If Pind.2 = 0 Then and If Pind1 = 0 Then//поправте если я что-то не так написал, потому что увидел на каком-то сайте, но забыл

Нет надо написать так: If Pind.2 = 0 And Pind.1 = 0 Then
Что-то делаем.
End If
Но я обычно делаю так:
if Pind.2 = 0 Then
if Pind.1 = 0 Then
Что-то делаем.
End If
End If
(Добавление)
В си, я думаю это будет выглядеть вот, так: if (!(PIND & (1<<PIND1)))
{
if (!(PIND & (1<<PIND2)))
{
Что-то делаем.
}
}

(Отредактировано автором: 04 Августа, 2012 - 12:30:25)

 
 Top
Artem Post Id


Главнокомандующий


Сообщений всего: 347
Дата рег-ции: Май 2012  



Я написал программу мигания светодиодом и зашил в мк, всё работает высший восторг
Решил усовершенствовать, поставив два светодиода и две кнопки, но сначала решил попробовать на одном, сделал всё как вы писали:
$regfile = «m8def.dat»
$crystal = 1000000
Config Portb.1 = Output
Config Portc.1 = Input
Do
If Pinc.1 = 0 Then
Set Portb.1
Waitms 100
Reset Portb.1
Waitms 100
End If
Loop
Но компилятор выдаёт ошибку. Пробовал убрать End If не вышло
Затем попробовал заменить порт С на D всё работает, странно, почему так?
(Добавление)
И ещё, при включение микроконтроллера с этой программой светодиод мигает один раз, не по команде, ат потом всё отлично, почему так?
 
 Top
anar Post Id



Главнокомандующий


Сообщений всего: 441
Дата рег-ции: Июнь 2011  



Artem пишет:
$regfile = «m8def.dat»
$crystal = 1000000
Config Portb.1 = Output
Config Portc.1 = Input
Do
If Pinc.1 = 0 Then
Set Portb.1
Waitms 100
Reset Portb.1
Waitms 100
End If
Loop

У меня тоже была такая проблема, все решалось тем, что я вместо «m8def.dat» писал "m8def.dat", и еще вы забыли в конце кода написать End.Проверил ваш код после удаления ошибок, все работает. Когда проверите напишите о результатах.

(Отредактировано автором: 04 Августа, 2012 - 18:03:48)

 
 Top
anar Post Id



Главнокомандующий


Сообщений всего: 441
Дата рег-ции: Июнь 2011  



Кстати не забудьте подтянуть вход мк на минус!
(Добавление)
И еще когда будете проверять высокий уровень на входе мк (это не относится к данной задаче я просто предупреждаю) не забывайте о дребезге.
Прикреплено изображение
untitled.GIF

(Отредактировано автором: 04 Августа, 2012 - 18:12:04)

 
 Top
Artem Post Id


Главнокомандующий


Сообщений всего: 347
Дата рег-ции: Май 2012  



Я проверил код всё работает. Только один странный момент есть: в момент компиляции кода выводится маленькое окошечко в котором в процентах указываются числа, я так понял это кольчество памяти которое занимает код. Странно то что когда я писал «m8def.dat» получалось 6%, а когда я начал писать "m8def.dat" получалось 2%, почему?
 
 Top
anar Post Id



Главнокомандующий


Сообщений всего: 441
Дата рег-ции: Июнь 2011  



Artem пишет:
почему?

Ну это уже вопрос к создателям баском авр.Важно то, что, когда пишешь "m8def.dat" компилятор перестает ругаться Подмигивающий .

(Отредактировано автором: 04 Августа, 2012 - 19:54:18)

 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



Artem пишет:
в бейсике можно производить опрос двух кнопок одновременно и совершать действие если нажаты обе кнопки
Если это можно сделать на basic, то на C и подавно.
CODE:
if( (PIND & (1<<0)) && (PIND & (1<<1)) )
{
/* код */
}

CODE:
if( 0b00000011 == (PIND & 0b00000011) )
{
/* код */
}

+ over9000 вариантов записи
Код, который внутри скобок, выполняется только если на PD1 и PD0 логическая единица.
(Добавление)
По С есть неплохой учебный курс на http://chipenable.ru/ По ассемблеру и С посмотрите учебный курс на http://easyelectronics.ru/ Посмотрите http://easyelectronics.ru/shpak-...ontrollerov.html
 
 Top
Artem Post Id


Главнокомандующий


Сообщений всего: 347
Дата рег-ции: Май 2012  



anar пишет:
Важно то, что, когда пишешь "m8def.dat" компилятор перестает ругаться .
это верно Подмигивающий
mihail пишет:
По С есть неплохой учебный курс

Огромное спасибо это то что нужно!
 
 Top
Artem Post Id


Главнокомандующий


Сообщений всего: 347
Дата рег-ции: Май 2012  



anar, здравствуйте, можно ещё один вопрос
наткнулся на код:
Config Timer1 = Counter , Edge = Rising , Prescale = 8 , Compare A = Toggle
Compare1a = 222
Я понял что это настройка таймера, но больше ничего.
Я понял что Config Timer1-это начало строки в которой мы конфигурируем таймер.
Затем я так понял что-то присваевается: = Counter , но непонятно что, в одной из ссылок которую вы мне дали, есть настройка таймера для шим, так вот там в место = Counter стоит = Pwm, Pwm = 8-это разрядность шим, но порывшись в интернете, я наткнулся на ещё один пример использования таймера так вот там вобще стоит = Timer, я не могу понять что такое присваивается Замешательство
Затем строка Edge = Rising, я вобще не знаю что это такое, но я понял что Rising это не переменная так как она ранее не объявлялась.
Prescale = 8 -это мы выбираем предделитель таймера, здесь всё понятно.
Compare A = Toggle-эта строка тоже не понятна так как в том курсе что вы мне посоветовали в место Toggle было Pwm = Clear Down, было написанно что это конфигурация активного состояния для шим с этим понятнее, а вот что такое Toggle-это тоже не переменная так как нигде не употреблялась. Однако смущает последняя строчка в которой вычсчитывается значение Compare1a, можете объяснить что здесь к чему?
И ещё я так понимаю что всё здесь настраивается регистрами, не могли бы вы дать какую нибудь ссылку в которой все эти регистры бы ли бы упорядоченны?
Заранее спасибо? Улыбка
 
 Top
anar Post Id



Главнокомандующий


Сообщений всего: 441
Дата рег-ции: Июнь 2011  



Artem пишет:
Config Timer1 = Counter , Edge = Rising , Prescale = 8 , Compare A = Toggle

Сейчас уже поздно, почитайте вот это(если знаете английский)http://avrhelp.mcselec.com/index...onfig_timer1.htm .Потом напишите про то, чего не поняли.
 
 Top
Artem Post Id


Главнокомандующий


Сообщений всего: 347
Дата рег-ции: Май 2012  



Так, ну кажется всё ясно:
= Counter в этой строке мы выбираем в каком режиме будет работать таймер(режим таймер и режим счётчик) я так понял что Counter это режим счётчика.
Edge = Rising-этот режим настраивается только для счётчика, и здесь мы выбираем по нарастанию или по спадению импульса будет происходить счёт.
Compare A = -это регистр сравнения, ятак понял что в регистр Compare1a мы записываем переменную с которой будет сравниваться регистр CompareA, если они раавны то таймер презапускается.
Кажется всё понятно.
И можно ещё один вопрос: таймер может работать параллельно с выполняемой программой?
 
 Top
anar Post Id



Главнокомандующий


Сообщений всего: 441
Дата рег-ции: Июнь 2011  



Artem пишет:
И можно ещё один вопрос: таймер может работать параллельно с выполняемой программой?

Напишите конкретно, что вы хотите сделать.
(Добавление)
Вот я тут для интереса поигрался с таймерами.Вот программа включения и выключения диода от 2 нажатий на кнопку - это облегчит вам понимание процесса.
CODE:
$regfile = "m8def.dat"
$crystal = 1000000
Config Portb.1 = Output
Config Portc.1 = Input
Config Timer1 = Counter , Edge = Rising , Prescale = 8 , Compare A = Toggle , Clear Timer = 1



Do
Compare1a = 1
Loop
End

http://www.imageup.ru/img267/101...49/untitledj.gif - вот схема.
 
 Top
Artem Post Id


Главнокомандующий


Сообщений всего: 347
Дата рег-ции: Май 2012  



Я хочу сделать ИК бампер на ТСОПах и хочу что бы генерация нужной частоты производилась с использованием таймера в интернете нашёл схему и код, но хочу попутно изучить работу таймера.
Вот программа:


$regfile = "m8def.dat" 'используем Mega8
$crystal = 16000000 'частота кварцевого резонатора 16mHz

'Генерация частоты 36kHz
'Настраиваем Timer1

Config Timer1 = Counter , Edge = Rising , Prescale = 8 , Compare A = Toggle

' Расчитываем Compare1a
' тактовая частота (kHz) / частота TSOPa (kHz) / 2 = Compare
' 16000 / 36 / 2 = 222

Compare1a = 222

'PortB.1 - выход сигнала
'PinC.0 - считываем состояние TSOPa
'Portd.0 - сигнальный светодиод

Config Pinb.1 = Output
Config Portd.0 = Output
Config Pinc.0 = Input

Start Timer1
Do
If Pinc.0 = 0 Then
Portd.0 = 1
Else
Portd.0 = 0
End If
Loop

End
Но я хочу его усложнить добавив ещё пару датчиков.
И ещё на счёт вашего кода, внём почему то не достаёт процидуры опроса кнопкиЗамешательство Замешательство
 
 Top
anar Post Id



Главнокомандующий


Сообщений всего: 441
Дата рег-ции: Июнь 2011  



Artem пишет:
Но я хочу его усложнить добавив ещё пару датчиков.

Если вы собираетесь использовать датчики одновременно, то можно использовать таймер0 и если есть таймер2.
Artem пишет:
И ещё на счёт вашего кода, внём почему то не достаёт процидуры опроса кнопки

Насчет моего кода в режиме counter, каждый таймер может использовать только один вход( для таймера 1 - это T1). Строка "Compare A = Toggle" отвечает за изменения логического уровня на выводе "А" таймера, так, как мы используем таймер 1, то это строка будет управлять выводом OC1A.
 
 Top
Страниц (3): [1] 2 3 »
« Делимся опытом »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru