Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Изменение длительности импульса


Изменение длительности импульса

Сообщений 1 страница 30 из 38

1

Привет всем, я новичок на вашем сайте, сегодня зарегистрировался!
У меня есть парочка вопросов, очень банальных, но так как новичек в мк - они меня сейчас беспокоят.
Я хочу сделать увеличение длительности импульса нажатием на кнопку через прерывание Int1.
Скажем для начала длительность 1 мкс (объявлена переменная waitus 1), после нажатия - 2 мкс, еще нажатие - 3, и т.д до 5 мкс после чего нажатие на кнопку не приводит к увеличению длительности. Подскажите как сделать код? Где ошибки:

Config Int0 = Falling
Config Pind.3 = Output
Config Pind.4 = Output

   Dim A As Byte
   A = 1

   On Int0 Risefreq

   Enable Int0

            Do
            Set Portd.3
            Waitus A
            Reset Portd.3
            Waitus 5
            Loop

   Risefreq:
   A = A + 1
   Waitms 100
   Gifr = 64
   Return

End

Я также не понимаю как сделать чтобы не присваивалось больше 5 переменной A? А так же не понимаю как сбрасывать кучу прерываний от дребезга кнопки строкой Gifr = 64. Объясните/подскажите литературы мало по баском, большое спасибо!

Отредактировано muhomka (2015-03-03 12:52:16)

0

2

надо ещё включить общее прерывание (Enable interrupt)
Если переменная будет больше 5, то что Вы хотите? Так и пишите if a>5 thhen a=5, (или 1, или стоп, сами решайте)
Gifr = 64 это не Баском, это даташит. Gifr - флаг на 8-й меге и подобных, у 48, к примеру EIFR. Во общем даташит читать. Нажав кнопку, переходите на подпрограмму,  флаг сбрасывается, но дребезг опять вызовет прерывание, и флаг поднимется. После обработки подпрограммы, мк увидит этот флаг, и опять вернётся в подпрограмму. Что бы этого не было, его и сбрасывают (записью единицы)

Отредактировано kip (2015-03-03 15:52:31)

0

3

Спасибо! заработало в протеусе )

0

4

Класс все заработало. У меня остался последний вопрос, решение которого мне даст возможность закончить устройство - как записывать в память контроллера значение переменной которое было - чтобы при включении было значение переменной до выключения Аттни 2313 (считывалось с памяти). СПАСИБО!

0

5

F1

Readeeprom
Writeeeprom

0

6

Спасибо, почитаю вечером про эти команды. Просто фантастика!! Спасибо за помощь, поселюсь тут теперь) Привет из Киева!

0

7

Да самый простой способ, объявите переменную в EEPROM и всё.

Код:
 Dim A as Word , A_eep as Eram Word

В начале программы при загрузке пишите

Код:
A=A_eep

а в "кнопке"

Код:
Risefreq:
   A = A + 1
   Waitms 100
   Gifr = 64
A_eep=A
   Return

и все дела!
З.Ы.
Только у Вас byte, а я word объявил, но сути не меняет

Отредактировано kip (2015-03-03 20:29:50)

0

8

Для Eram нужно вдвое больше переменных.
Иногда это критично.

0

9

ПРИВЕТ ВСЕМ!!
Написал код, сделал на макетке схемку, зашил в мк. Но при первом включении схема работает не так как планировалось, а вот после нажатия кнопки (срабатывания прерывания Инт0) - начинает работать как надо, и EEPROM работает. Вопрос почему так происходит, наверно это моя ошибка, а не глюк мк. Прилагаю содержание кода и осциллограммы сразу после прошивки (первое включение), и после нажатия кнопки (Инт0). Спасибо!!

Config Pind.4 = Output
Config Pind.5 = Output
Config Int0 = Falling
Config Int1 = Rising

Dim A As Byte
Dim A_eeprom As Eram Byte

A = 1
A = A_eeprom

On Int0 Pulse_duration_change
On Int1 Write_to_memory

Enable Interrupts
Enable Int0
Enable Int1

   Do
      Set Portd.4
      Waitus A
      Reset Portd.4
      Waitus 0.1
      Set Portd.5
      Waitus 5
      Reset Portd.5
      Waitus 0.1
   Loop

               Pulse_duration_change:
               A = A + 1
               If A > 5 Then A = 1
               Waitms 100
               Gifr = 64
               Return

               Write_to_memory:
               A_eeprom = A
               Waitms 100
               Gifr = 64
               Return
End

Первое включение после прошивки нога d4
http://se.uploads.ru/t/Q7jpL.png
Нога d4 после нажатия кнопки Инт0:
http://se.uploads.ru/t/S6UPA.png

Отредактировано muhomka (2015-03-10 12:52:45)

-1

10

"работать как надо", простите, а как надо? :D

0

11

Да и вы в курсе, что при такой интенсивности использовании eeprom она довольно быстро сдохнет? )

0

12

Тоесть вы имеете ввиду что это норма, когда прошил, включил - изначально должна быть 1 мкс импульс а у меня черт знает что. Только когда 2 раза клацнул Инт0 - появилось 1мкс как и нужно. Я думаю мне 100 циклов записи хватит из 100 тысяч

-1

13

Кроме насмешки ничего хорошего не услышал от Вас RDW

-1

14

muhomka написал(а):

Config Pind.4 = Output
Config Pind.5 = Output


Доброго Здоровья!

Если вход, надо писать так:

Config Pind.4 = Input
Config Pind.5 = Input

0

15

muhomka написал(а):

Waitus 0.1

Сомнения берут, значение должно быть целым!

0

16

А что это вообще будет, если не секрет?

0

17

muhomka написал(а):

Я думаю мне 100 циклов записи хватит из 100 тысяч

100_000  -  это в случае благоприятного расположения звёзд на небе, а так , смело делите на 2, а то и на 3!

0

18

Доброго Здоров'я!
Да пин д4, д5 - у меня выходы, все верно. В железе все начинает работать после того как 2 раза нажать прерывание Инт0. Далее все нормально работает. не пойму в чем дело. Экспериментально установил что если писать в коде команду waitus 0.1 - действительно будет пауза примерно в 120 нс. А если загнать значение в переменную или константу типа integer - нихрена работать не будет))))

0

19

muhomka написал(а):

Да пин д4, д5 - у меня выходы, все верно


PINx - это вход

PORTx - это выход

0

20

Так и есть, все верно у меня в коде pin - имел ввиду нога МК)

0

21

Вы меня не слышите!

PIN - это вход

PORT - это выход

0

22

А так, работает

Config Pind.2 = Input
  Config Int0 = Falling
  On Int0 Pulse_duration_change       
  Reset Portd.2
  Eifr.0 = 0

  Config Pind.3 = Input
  On Int1 Write_to_memory
  Config Int1 = Rising     
  Reset Portd.3
  Eifr.1 = 0

  Config Pind.4 = Output
  Config Pind.5 = Output

  Dim A As Byte
  Dim A_eeprom As Eram Byte

  A = 1
  A = A_eeprom

  Enable Int0
  Enable Int1
  Enable Interrupts

   Do

      Set Portd.4
      Waitus A
      Reset Portd.4
      Waitus 0.1
      Set Portd.5
      Waitus 5
      Reset Portd.5
      Waitus 0.1

   Loop
  End

  Pulse_duration_change:
    A = A + 1
    If A > 5 Then
        A = 1
    End If
    Waitms 100
    Eifr.0 = 0
  Return

  Write_to_memory:
    A_eeprom = A
    Waitms 100
    Eifr.1 = 0
  Return

0

23

После прошивки , скорее стираете и еепром. Когда Вы его стираете , то A_eeprom принимает значение &HFF т.е. 255. Отсюда и при первом пуске такой импульс. В фьюзах надо галачку поставить, чтоб еепром не стиралось.

sasha_1973 написал(а):

100_000  -  это в случае благоприятного расположения звёзд на небе, а так , смело делите на 2, а то и на 3!

Да неееееет. Если пишут 1000000, значит так оно и есть. 100000 - при любых звёздах. При благоприятном расположении намного больше.

0

24

kip написал(а):

Да неееееет. Если пишут 1000000, значит так оно и есть. 100000 - при любых звёздах. При благоприятном расположении намного больше.

Вот и я так думаю, в Atmel не дураки же сидят, все очень просто проверяется, пишется код, на вход подается импульсы с генератора, по 1 на входе записывается новое значение в EEPROM. В интернете читал - один парень так и сделал для проверки, так там далеко не 100000, а гораздо больше получилось.

-1

25

sasha_1973 написал(а):

Вы меня не слышите!
PIN - это вход
PORT - это выход

Спасибо Саша, я забыл, что прерывание INT это же тоже конфигурирование вывода на вход, некорректно написан код у меня, спасибо!)

Отредактировано muhomka (2015-03-11 09:53:49)

0

26

muhomka написал(а):

Вот и я так думаю, в Atmel не дураки же сидят, все очень просто проверяется, пишется код, на вход подается импульсы с генератора, по 1 на входе записывается новое значение в EEPROM. В интернете читал - один парень так и сделал для проверки, так там далеко не 100000, а гораздо больше получилось.

Вы вначале свой код допилите и научитесь четко, и понятно формулировать задачу/алгоритм, а потом уже разглагольствуйте на темы (нахватавшись вершков).
Откуда нам известно, что вы собрались там подавать на "INT"? Может вы у вас там дребезг контактов будет или вообще генератор или счетчик импульсов... Прежде чем играться с еепромом, надо быть уверенным во всей физике работы вашего железа и программной части!

-1

27

RDW написал(а):

Вы вначале свой код допилите и научитесь четко, и понятно формулировать задачу/алгоритм, а потом уже разглагольствуйте на темы (нахватавшись вершков).
Откуда нам известно, что вы собрались там подавать на "INT"? Может вы у вас там дребезг контактов будет или вообще генератор или счетчик импульсов... Прежде чем играться с еепромом, надо быть уверенным во всей физике работы вашего железа и программной части!

Где твой мундир генерал, твои ордена, спина как струна? (с)

-1

28

RDW написал(а):

Вы вначале свой код допилите и научитесь четко, и понятно формулировать задачу/алгоритм, а потом уже разглагольствуйте на темы (нахватавшись вершков).
Откуда нам известно, что вы собрались там подавать на "INT"? Может вы у вас там дребезг контактов будет или вообще генератор или счетчик импульсов... Прежде чем играться с еепромом, надо быть уверенным во всей физике работы вашего железа и программной части!


muhomka написал(а):

Где твой мундир генерал, твои ордена, спина как струна? (с)

Начали за здравие, продолжаем, как всегда.

0

29

"Отличное" начало у человека  на форуме.)

0

30

RDW
Вы по моему слишком предвзято относитесь ко всему, что то давненько я не слышал от Вас дельного совета , все время пытаетесь "ужалить" , сам знаю что напрягает , когда задают знаещему человеку глупые вопросы, но поверьте он бы не спросил если бы знал , те более человек только учится . Не в обиду сказано!!!
muhomka
Вы так и не отписались получилось ли что у Вас? Вам правельно написли

kip написал(а):

После прошивки , скорее стираете и еепром. Когда Вы его стираете , то A_eeprom принимает значение &HFF т.е. 255. Отсюда и при первом пуске такой импульс. В фьюзах надо галачку поставить, чтоб еепром не стиралось.

сам только что с  таким столкнулся , при первом запуске в епроме просто нету значений .

Отредактировано ptihka (2015-03-12 11:27:31)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Изменение длительности импульса