Вероятно что то не так, надо иcкать и исправлять.kip96 писал(а):В чём проблема?, подскажите плиз. Как побороть?
BASCOM AVR в вопросах и ответах
Последний раз редактировалось amv2000 Пн окт 01, 2012 21:28:05, всего редактировалось 1 раз.
- Реклама
Хелпните пожалуйста
У меня такая ситуация, использовал N и P полевые транзисторы, работаю с ними на Atmega8 через ir4427s, всё бы ничего, но N типа открыватся согласно логическому уровню "1", а вот P типа открываются логическим уровнем "0" (инверсно).
Есть информация, как сделать типа следующего:
F1 Alias Nop Portd.0
Вообщем просто порт сразу знал, что нужно инвертировать? Голова взрывается, хочу сделать шим 3х фазный, инвертор (ЛН1) припаивать как-то незачем, программно можно сделать.
У меня такая ситуация, использовал N и P полевые транзисторы, работаю с ними на Atmega8 через ir4427s, всё бы ничего, но N типа открыватся согласно логическому уровню "1", а вот P типа открываются логическим уровнем "0" (инверсно).
Есть информация, как сделать типа следующего:
F1 Alias Nop Portd.0
Вообщем просто порт сразу знал, что нужно инвертировать? Голова взрывается, хочу сделать шим 3х фазный, инвертор (ЛН1) припаивать как-то незачем, программно можно сделать.
Очень надо, так NOT не работает:
F2 = Not Faza(p + 1)
и так тоже.
F1 = Not Faza(p)
F1-F2 фазовращатель 1 ступень, точней два полевика, которые запускают двигатель, в дальнейшем будет электромобиль, если справлюсь, я не просто как справочную зашёл, совета прошу, как инвертировать порт сразу, чтоб не парится с дополнительными кодами, микроконтроллер не резиновый ))) А ещё с АЦП и гироскопом работать.
F2 = Not Faza(p + 1)
и так тоже.
F1 = Not Faza(p)
F1-F2 фазовращатель 1 ступень, точней два полевика, которые запускают двигатель, в дальнейшем будет электромобиль, если справлюсь, я не просто как справочную зашёл, совета прошу, как инвертировать порт сразу, чтоб не парится с дополнительными кодами, микроконтроллер не резиновый ))) А ещё с АЦП и гироскопом работать.
Спасибо! Не занл о нём.Moto_v3x писал(а):ev3658
А TOGGLE не пробовали
А изначально состояние порта можно задать инверсным? К примеру я ему:
PORTD.0= 1
А на выходе ноль. А TOOGGLE при повторном выполнении сделает плохое дело с инвертором.
- Реклама
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Всем привет. Прошу помощи. Я не программист как и большинство здесь. Пытаюсь учиться самостоятельно.
Вопрос вот в чем. есть контроллер, к нему подключены 3 светодиода, кнопка (работает в прерывании) Нужно чтоб при нажатии на кнопку по очереди загорались светодиоды, те- 1 + 2 + 3. Дальнейшие нажатия игнорируются(если горят уже все 3). Не важно сколько горит светодиодов, нужно чтоб через 3-4 секунды они погасли. Пожалуйста дайте пример кода. Уже второй день бьюсь. Все встало именно на этой задаче...
Вопрос вот в чем. есть контроллер, к нему подключены 3 светодиода, кнопка (работает в прерывании) Нужно чтоб при нажатии на кнопку по очереди загорались светодиоды, те- 1 + 2 + 3. Дальнейшие нажатия игнорируются(если горят уже все 3). Не важно сколько горит светодиодов, нужно чтоб через 3-4 секунды они погасли. Пожалуйста дайте пример кода. Уже второй день бьюсь. Все встало именно на этой задаче...
А Ваш код можно посмотреть? и тогда будет понятнее, что не получается.осторожно! леоныч!!! писал(а):Пожалуйста дайте пример кода. Уже второй день бьюсь. Все встало именно на этой задаче...
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
В нем пока всего две строчки. Реакция на нажатие кнопки. Так что и выложить то нечего.
$regfile = "attiny2313.dat"
$Crystal=4000000
$hwstack=40
$swstack=16
$framesize=32
Config Pinb.3 = Input
Config Portb.2 = Output
Config Portb.1 = Output
Wait 1
Do
If Pinb.3 = 0 Then Portb.2 = 0
If Pinb.3 = 1 Then Portb.2 = 1
Loop
End
$regfile = "attiny2313.dat"
$Crystal=4000000
$hwstack=40
$swstack=16
$framesize=32
Config Pinb.3 = Input
Config Portb.2 = Output
Config Portb.1 = Output
Wait 1
Do
If Pinb.3 = 0 Then Portb.2 = 0
If Pinb.3 = 1 Then Portb.2 = 1
Loop
End
Что-то странное, даже нормальной обработки кнопки нет. Не похоже на плод двухдневных трудов.
Вашу задачу можно решить например так:
- Вложения
-
- 3leds.rar
- (8.88 КБ) 229 скачиваний
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Дико извиняюсь! Я не то кинул. Это я вообще кусок кода сохранял. Облажалсо
Сейчас изучу ваш пример.
Сейчас изучу ваш пример.
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Посмотрел в протеусе, посмотрел сам код... Код конечно впечатлил
Грамотно все
Мда. Мне еще учиться и учиться.
СПАСИБО ЗА ПОМОЩЬ!!!
Теперь буду разбираться с вашим кодом, мне ведь надо понять что и как работает.
Попробую написать комментарии к каждой сроке кода. Думаю так быстрее освоюсь.
Мда. Мне еще учиться и учиться.
СПАСИБО ЗА ПОМОЩЬ!!!
Теперь буду разбираться с вашим кодом, мне ведь надо понять что и как работает.
Попробую написать комментарии к каждой сроке кода. Думаю так быстрее освоюсь.
Я бы это решением "в лоб" скорее назвал. Простой перевод из алгоритма человеческого в Бейсик. А так и другие способы решения придумать можно. Тут же все просто: по нажатию выбираем какой светодиод включать. А так как начальное значение переменной всегда равно 0, то и реализация проще. Таймер же отсчитывает нужные 3 секунды. Как только время будет отсчитано - светодиоды будут погашены. При нажатии кнопки так же сбрасывается счетный регистр таймера, чтоб дать возможность светить светодиодам полное время.
Таймер отрабатывает прерывание по совпадению с регистром сравнения. При тактовой частоте 4МГц и предделителе 256 таймер будет увеличивать свое значение каждые 256 / 4 000 000 = 0,064 мс. Нам нужно отсчитать 3 секунды, значит таймер насчитает за это время 3000 / 0,064 = 46875 = &HB71B. Вот это значение и записываем в регистр сравнения. При совпадении счетного регистра таймера с этим значением программа уйдет на выполнение прерывания 3sec, а счетный регистр таймера будет обнулен.
Таймер отрабатывает прерывание по совпадению с регистром сравнения. При тактовой частоте 4МГц и предделителе 256 таймер будет увеличивать свое значение каждые 256 / 4 000 000 = 0,064 мс. Нам нужно отсчитать 3 секунды, значит таймер насчитает за это время 3000 / 0,064 = 46875 = &HB71B. Вот это значение и записываем в регистр сравнения. При совпадении счетного регистра таймера с этим значением программа уйдет на выполнение прерывания 3sec, а счетный регистр таймера будет обнулен.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Эх... Так вот у меня ничего и не получалось потому что с таймером (таймерами их там 2) и прерываниями еще не совсем разобрался. С прерываниями вроде понятно, а вот таймеры надо изучать. Да вообще еще много команд надо изучить... Но я думаю на практике учиться куда лучше. Это хорошо сейчас есть различные средства симуляции и отладки. Представляю как раньше мучились программисты.
Пробуй без прерывания, учитывай дребезг кнопки, контроллер выполняет много миллионов команд в секунду, тебе нужно сделать задержку, чтоб при нажатии сгладить помехи от кнопки. Точней любая кнопка барахлит, одно нажатие может вызвать кучу нажатий, тебе нужну написать программу так, чтоб после первого сигнала значение кнопки сохранялось к примеру пока не пропашет переменная Integer, а там сново проверяется и ждётся ещё раз нажатие, если нажатия не было ещё раз, пока прошла опять переменная типа Integer, то значит это была помеха. Типа того короче. А паузы в твоём случае Wait 3, так для начала легче.осторожно! леоныч!!! писал(а):Эх... Так вот у меня ничего и не получалось потому что с таймером (таймерами их там 2) и прерываниями еще не совсем разобрался. С прерываниями вроде понятно, а вот таймеры надо изучать. Да вообще еще много команд надо изучить... Но я думаю на практике учиться куда лучше. Это хорошо сейчас есть различные средства симуляции и отладки. Представляю как раньше мучились программисты.
- Сообщения: 1156
- Зарегистрирован: Вт дек 09, 2008 20:31:56
Всем доброго времени суток !
А можно как-то по-умному переписАть этот отрывок кода ?
Нужно подать импульс 2 сек. для перевода стрелки на макете железной дороги.
А то стрелок много, каждая две ноги занимает, и все в разное время переводить нужно.
С Pulseout не получилось, там импульсы очень короткие получаются...
А можно как-то по-умному переписАть этот отрывок кода ?
Нужно подать импульс 2 сек. для перевода стрелки на макете железной дороги.
Код: Выделить всё
strelka alias portb.0
strelka = 1
wait 2
strelka = 0С Pulseout не получилось, там импульсы очень короткие получаются...
С уважением,
Алексей.
Алексей.
Как вариант – заводим на каждую стрелку по переменной массива Strelka(x)=0.Gordon Shumway писал(а):А можно как-то по-умному переписАть этот отрывок кода ?
Нужно подать импульс 2 сек. для перевода стрелки на макете железной дороги.
Запускаем таймер 1 с прерыванием по переполнению через время, кратное 0,1 с. В прерывании таймера делаем уменьшение всех переменных Strelka(x), не равных 0.
Как это работает: когда мы хотим перевести стрелку N, мы просто записываем в переменную Strelka(N) значение, соответствующее желаемой задержке перевода (например, 20 для 2 с). После чего подаём высокий уровень на вывод этой стрелки и занимаемся дальше своими делами
В прерывании таймера 1 переменная Strelka(N) каждые 0,1 с будет уменьшаться на 1. Таким образом, через 20 с она станет равна нулю, после чего в этом же прерывании мы снимаем высокий уровень с вывода соответствующей стрелки.
Всё это будет работать "в фоновом режиме" для любого количества стрелок.
P.S. Кстати, а управлять железной дорогой будет Netgear 3500L с WD MyBook? (увидел тут темку на соседнем форуме )
Даже остановленные часы два раза в сутки показывают правильное время.
Спасибо ! Хорошая идея. Сейчас попробую, таймеры не используются пока. А время перевода - константа (2сек.), так что всё просто.Секретный кот писал(а):Как вариант – заводим на каждую стрелку по переменной массива Strelka(x)=0.
Запускаем таймер 1 с прерыванием по переполнению через время, кратное 0,1 с. В прерывании таймера делаем уменьшение всех переменных Strelka(x), не равных 0.
Это не моёСекретный кот писал(а): P.S. Кстати, а управлять железной дорогой будет Netgear 3500L с WD MyBook? (увидел тут темку на соседнем форуме )
С уважением,
Алексей.
Алексей.
Да собсно вот, значит наверно ваш тёзкаGordon Shumway писал(а):Это не моёУ меня будет мега8 работать. А что там обсуждают ?
Даже остановленные часы два раза в сутки показывают правильное время.
Для работы с кнопкой в Баскоме есть готовая команда Debounce, которая учитывает дребезг контактов. Существует возможность настройки задержки антидребезга, установки уровня срабатывания, перехода либо просто по метке либо как вызов подпрограммы... Гибкая и удобная команда.ev3658 писал(а):учитывай дребезг кнопки, контроллер выполняет много миллионов команд в секунду, тебе нужно сделать задержку, чтоб при нажатии сгладить помехи от кнопки.
Угу. Чтобы МК "оглох" на 3 секунды, и ни на что не реагировал... Да и перечитайте задание. Устройство должно реагировать на кнопку. Ваш же совет не только показывает как делать нельзя, но еще до кучи делает устройство неработоспособным.ev3658 писал(а):А паузы в твоём случае Wait 3, так для начала легче.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон


