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

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

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

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


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


помогите с кодом элементарной программы

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

1

есть задача прошить МК типа attiny13 или ей подобной (8 ног), суть программы следующая
встроенный компаратор в контроллер и внешний светодиод, когда на компаратор приходит AIN0- 0 вольт и AIN1- 0 вольт (кнопка не нажата) на выходе PB2 логический ноль
на входе в компаратор появляется AIN0  - +0.3 вольт AIN1 - 0 вольт надо чтобы светодиод (выход PB2) моргнул 0.04 секунды и больше не моргал не смотря на  то что напряжение на компараторе не меняется (типа кнопка нажата)
потом на компараторе напряжение на обоих выводах становится опять 0\0 вольт (кнопку отпустили) и светодиод не моргает, на выходе PB2 0 вольт
когда кнопку опять нажимают светодиод должен опять моргнуть один раз и ждать пока кнопку не отпустят, т.е. он должен сразу моргнуть при нажатии кнопки и дожидаться следующего нажатия

проблема в том что мне не понятно как организовать сам алгоритм, если сделать циклически чтобы моргал постоянно это понятно, а как сделать чтобы на нажатие кнопки был только одиночный импульс на выходе PB2

использование компаратора связано с тем что напряжение всего 0.3 вольта (кнопка в готовом устройстве) и дребезга там нет (типа оптической или магнитной кнопки)
а затем стоит задача прицепить аналоговый датчик температуры LM335 на  вход PB4 и в зависимости от напряжения на входе PB4 (ипользовать ацп) автоматически менялась длительность импульса на светодиод
питание всей схемы 5 вольт стабилизированное напряжение, так что можно использовать для ацп его как опорное

0

2

у нас и ADC может померять 0,3в )) и по условию чтот сделать. если вы знаете как  реализовать циклически, то вам надо сделать флаг который будет запрещать пока его не сбросить.

0

3

а если сигнал который приходит с кнопки пропустить через компаратор lm311 и он уже через транзистор подаст напряжения на микроконтроллер, и на термодатчик lm355
как только напряжение придет на процессор то запустится программа ацп внутри процессора и вывод длительности импульса в зависимости он напряжения пришедшего на ацп
надо только чтобы программа отработала один раз и ждала пока опять напряжение не пропадет и не появится
на процессоре
а еще лучше чтобы процессор не обесточивался полностью, а например сбрасывался RESET как это организовать?

0

4

Зачем такие крайности? какие то транзисторы , операционники, для такой простой функции..

Код:
$regfile = "m8def.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32


Config Portc.3 = Output : Led Alias Portc.3 : Reset Portc.3
Config Adc = Single , Prescaler = Auto , Reference = Avcc


Dim Dat As Word
Dim Flag As Byte
Start Adc
Flag = 0

Do

Dat = Getadc(0)
If Dat > 62 And Flag = 0 Then
  Set Led
  Waitms 40
  Reset Led
  Flag = 1
End If
If Dat < 62 Then Flag = 0

Loop

End

Отредактировано Yuriy.pv (2016-06-15 21:18:53)

0

5

Я вот как написал, идея что на микроконтроллер будет подаваться напряжение только когда кнопка нажата, когда кнопка отпущена то питания на МК не поступает, и программа должна прогоняться один раз а не циклически. Нормально написано или лучше по другому?

$regfile = "attiny13.dat"
$hwstack = 8
$swstack = 16
$framesize = 16

Config Portb.4 = Input
Config Portb.2 = Output
Portb.2 = 0
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim R As Word
Dim B As Word
Start Adc
Waitms 30
R = Getadc(2)
If R >= 20 Then Portb.2 = 1
B = 152 - R
Waitms B
Portb.2 = 0
End

0

6

Config Portc.3 = Output : Led Alias Portc.3 : Reset Portc.3    Здесь мне не понятна команда Alias? и когда команда
Config Adc = Single , Prescaler = Auto , Reference = Avcc      reset идет то сбрасывается в ноль (0 на выходе)?

Dim Dat As Word      присвоить имя Dat  - 2 байта памяти
Dim Flag As Byte      присвоить имя Flag - 1 бит памяти
Start Adc                    старт АЦП
Flag = 0

Do                              Do это начало цикличекой программы или просто начало программы?

Dat = Getadc(0)                             записать в ячейку Dat значение считанной АЦП
If Dat > 62 And Flag = 0 Then        если Dat  > 62 и Flag = 0 тогда
  Set Led                                           Set - что за команда?
  Waitms 40                                       задержка 40 мс
  Reset Led                                       сбросить Led (alias это наверное присвоить имя Led на порт)?
  Flag = 1
End If                                                  конец условия
If Dat < 62 Then Flag = 0                   если Dat < 62 Then Flag = 0

Loop                                                    вернуться в начало цикла Do

End

0

7

Alias эт чтоб обозвать порт как нам удобно, do loop эт обычный цикл это не С тут можно в любом цикле сделать начало программы, ну остальное догадки верны.
программы пишет кто как может и как нравится))
вы объявили как word а если R будет больше 152..
B = 152 - R

Отредактировано Yuriy.pv (2016-06-15 23:54:20)

0

8

ацп с термодатчика всегда приходит (если я на него напряжение подаю) так что условие с If Dat > 62  и If Dat < 62
не подойдет.
Тут еще как вариант всегда подавать напругу на термодатчик (всегда приходит напряжение на ацп)и на сам процессор, пока кнопка не нажата там 0 вольт, когда она нажата на ней +0.3 вольт, когда нажата другая кнопка на ней -0.3 вольт. надо чтобы Led 1 раз моргнул с условием B=152-данные с ацп (так меняется время открытия автоматически в зависимости от температуры) когда на кнопке с 0 вольт стало +0.3 вольт, потом вторая кнопка может быть нажата а может и нет (+0.3 вольта держится или -0.3 вольт если зажали вторую кнопку)
когда все кнопки отпустили то тогда надо повторить цикл
т.е. Led должен моргать только один раз когда нажимается первая кнопка (+0.3 вольта) и не реагировать на удержание а также нажатие второй кнопки (-0.3 вольт)

0

9

надо компаратор использовать чтобы отследить эти 0.3 вольта (дребезга нет,кнопки хитрые)
он находится на выводах Pb0 и Pb1 , надо на вывод Pb1 подключить землю а на вывод Pb0 подавать выход с кнопки
Pb0 еще назвается на схеме AIN0    а   Pb1  AIN1

0

10

как прописать условие для компаратора встроенного в attiny13 ? и как вообще запустить компаратор перед началом программы?

0

11

вы объявили как word а если R будет больше 152..
B = 152 - R   
не будет больше никак, так как там у меня через резистивный делитель будет и температура больше 50 градусов не поднимется и R не сможет быть больше 140 просто физичеки

0

12

Flag = 1
End If                                                 
If Dat < 62 Then Flag = 0
наконец то доперло до меня как флаг работает !!! а как теперь к компаратору это применить?

0

13

в прерывании от компаратора прописать свое условие
Вот тут почитай
и тут

Увидеть бы схему и принцип строящего Вами "коллайдера" )) было бы проще ..

Отредактировано Yuriy.pv (2016-06-16 00:22:30)

+1

14

Что такое флаг прерывания от компаратора ?
Бит 4 - ACI: флаг прерывания компаратора. "1" - прерывание было, "0" - прерывания не было.
Бит 3 - ACIE: разрешение прерывания от компаратора. "1" - разрешено, "0" - запрещено.

что он прерывает и как это использовать?

0

15

И еще я хочу кварц повесить внешний
http://easyelectronics.ru/podklyuchenie … ikbez.html
так вот вопрос как мне его в программе прописать?
судя по документации мне можно ставить кварц 0-10Мгц, какой посоветуешь?
и чем кварц отличается от осцилятора? и вообще у кварца есть такой параметр как напряжение или можно любой воткнуть?

0

16

Бизон, ответы находятся в даташите.
ищется за 1-2 минуты
Евстифеев А.В. Микроконтроллеры AVR

0

17

Спасибо за ответ, разбираюсь, читаю

0

18

Вот сейчас кварц выбираю, мне максимум можно 10 Мгц поставить, можно ли ставить кварц с дробными значениями, например 4.1940 Мгц ? и частота используемого кварца в самой шапке программы должна указываться ?

0

19

решил поставить кварц 8 Мгц

-1

20

бизон
На тини13 кварц не поставить.

+1

21

решил применить Attiny 85, туда можно кварц воткнуть?

0

22

вот код написал, проверьте кто может. условия
питание микроконтоллера стабилизировано 3.3 вольт, опорное напряжение для ацп = 3.3 вольт
PORTb.1  выход на светодиод

Portb.2 это вход с кнопки , пока на кнопке 2.5 вольт то светодиод не светит, как упало напряжение ниже 2.36 вольт то светодиод должен моргнуть один раз (ниже 2.3 вольта не падает на кнопке, поэтому ацп нужен) пока кнопка нажата то светодиод не светит,кнопку отпустили и опять 2.5 вольт.Светодиод должен моргнуть один раз с заданной задержкой (ацп portb.5) только в момент нажатия кнопки

portb.3 и portb.4 поставлю кварц на 8 Мгц
portb.5 это вход с аналогового термодатчика, разная температура - разное значение ацп, должна быть разная задержка свечения светодиода

Что интересует для вашей проверки, как ацп будет обрабатывать 2 ноги контроллера, нет ли здесь где ошибки в коде, и правильно ли я поставил в ацп  ADC = single или надо было ставить ADC = free

0

23

$regfile = "attiny85.dat"
$crystal = 8000000
$hwstack = 8
$swstack = 16
$framesize = 16

Config Portb.1 = Output
Config Portb.2 = Input
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Input

Portb.1 = 0
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim R As Word
Dim B As Word
Dim C As Word
Dim D As Bit
D = 0

Start Adc
Do
R = Getadc(0)
Select Case R
Case 1 : B = 43               тут пока значения от балды, потом другие будут, это пока костяк программы
Case 2 : B = 46                но все значения поместятся в промежуток от 1 до 1023
Case 3 : B = 42
Case 4 : B = 43
Case 5 : B = 44
Case 6 : B = 45
Case 7 : B = 46
Case 8 : B = 47
Case 9 : B = 48
Case Else : B = 0
End Select

C = Getadc(1)
If C < 732 And D = 0 Then        здесь уже реальные значения, просчитанные на калькуляторе
Portb.1 = 1
Waitms B                                  задержка с изменяемым значением времени, зависит от ацп (0)
Portb.1 = 0
D = 1                                       поставили запрет (чтобы светодиод моргнул только один раз в момент нажатия)
End If

If C > 760 Then D = 0           отпустили кнопку(напряжение выросло),сбросили запрет

Loop
End

0

24

Чтобы не мешали мои комментарии в коде закинул еще раз

$regfile = "attiny85.dat"
$crystal = 8000000
$hwstack = 8
$swstack = 16
$framesize = 16

Config Portb.1 = Output
Config Portb.2 = Input
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Input

Portb.1 = 0
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim R As Word
Dim B As Word
Dim C As Word
Dim D As Bit
D = 0

Start Adc
Do
R = Getadc(0)
Select Case R
Case 1 : B = 43
Case 2 : B = 46
Case 3 : B = 42
Case 4 : B = 43
Case 5 : B = 44
Case 6 : B = 45
Case 7 : B = 46
Case 8 : B = 47
Case 9 : B = 48
Case Else : B = 0
End Select

C = Getadc(1)
If C < 732 And D = 0 Then
Portb.1 = 1
Waitms B
Portb.1 = 0
D = 1
End If

If C > 760 Then D = 0

Loop
End

0

25

два раза думаю лишне будет, а для кодов у нас теги есть "код"

0

26

бизон написал(а):

решил применить Attiny 85, туда можно кварц воткнуть?

Бизон,ты принципиально даташиты игнорируешь? ;)
http://sf.uploads.ru/t/1Gk2E.jpg

0

27

Я даташиты не игнорирую, просто мне тут ответили что для attiny13 нельзя кварц подключить, хотя по выводам она как и attiny 85. первоначально хотел attiny13 использовать, но потом передумал-код не влазит

0

28

бизон написал(а):

...просто мне тут ответили что для attiny13 нельзя кварц подключить, хотя по выводам она как и attiny 85

Так и есть:
http://s5.uploads.ru/t/W8Vor.jpg

Но если бы сам сравнил даташиты,то сразу бы увидел,что к 85 кварц можно прицепить.
Просто, как и на многих других форумах,народ охотней откликается на просьбы о помощи,когда видят,что человек использовал все возможности,а справиться не может. Когда же человек задает простейшие вопросы,на которые легко может ответить сам,количество помощников минимально. Я ТАК думаю  :)

0

29

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

0

30

остался основной вопрос по коду программы для работы ацп. сможет ли правильно работать считывая попеременно значение входящего напряжения с двух разных ножек контоллера?

0


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