BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
SAU
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс сен 10, 2006 00:04:03

Re: BASCOM AVR в вопросах и ответах

Сообщение SAU »

edm2007 писал(а):
Вот именно по этой причине я никогда и не выкладываю исходные коды своих законченных творений.

Ну однако ж выложили :) Целую обучалку даже по индикаторам :) Или статья уже не творение, а так, "просвещение"? :)

edm2007 писал(а): Я уж не говорю о том, что фраза "пробовал ставить задержки и в обработке прерывания" говорит о многом. И явно не в пользу автора. :wink:

Не в пользу, так не в пользу..Я вообще к микроконтроллерам подхожу раз в год- полтора, когда надо игрушку очередную для ребенка сделать.. :)
Реклама
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

SAU писал(а):Или статья уже не творение, а так, "просвещение"?


Именно так. :) Статья это лишь информация о вариантах реализации той или иной задачи. Но даже ее нужно использовать с умом. :tea:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Реклама
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение Kill17 »

Здравствуйте! Набросал программку, которая принимает байтный трафик по софтовому УАРТу и передает из контроллера. Но возникла проблема, она не воспринимает 00 байт, те просто его игнорирует. Понимаю что проблема в inkey, но как выйти из ситуации не понимаю. Задача состоит в том, чтобы принимать байты именно по софтовому УАРТу. Подскажите, как можно решить эту проблему?

Код: Выделить всё

$regfile = "m32def.dat"
$crystal = 11059200
$hwstack = 40
$swstack = 16
$framesize = 32



Dim Rx_byte As Byte
Dim Rx_timeout As Long
Dim Chr_count As Byte
Dim Rx_string(20)as Byte
Dim Z As Byte

Open "comd.2:9600,8,n,1" For Input As #1
Open "comd.6:9600,8,n,1" For Output As #2


Config Int0 = Falling
On Int0 Int0_isr
Enable Int0
Enable Interrupts


Printbin #2 , &H445566


Do

  If Chr_count > 0 Then
    For Chr_count = Chr_count To 2 Step -1
     Incr Z
     Printbin #2 , Rx_string(z) ; 1                         
    Next
   Z = 0
  End If


Loop
End


Int0_isr:
  Rx_timeout = 0                                         
  Chr_count = 1                                           

  Do

      Rx_byte = Inkey(#1)

      If Rx_byte > 0 Then
        Rx_timeout = 0                                     
          If Chr_count < 21 Then                           
            Rx_string(chr_count) = Rx_byte
            Incr Chr_count
          Else
            Exit Do
          End If
      End If

      If Rx_timeout = 5000 Then                           
         Exit Do
      End If

  Incr Rx_timeout

  Loop

     Gifr.intf0 = 1                                 

Return

Аватара пользователя
mikbur
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вт ноя 23, 2010 04:18:10
Откуда: Bratsk Russia UIBB

Re: BASCOM AVR в вопросах и ответах

Сообщение mikbur »

Здравствуйте.
Для проекта необходимо реализовать управление через 3 энкодера
кто нибудь делал подобное (1 и 2 подключаются и работают без проблем через INT0-INT1), а как подключить третий ?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Re: BASCOM AVR в вопросах и ответах

Сообщение kip96 »

Откажись от INT0-INT1 а энкодры сканируй по таймеру.
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Реклама
Аватара пользователя
mikbur
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вт ноя 23, 2010 04:18:10
Откуда: Bratsk Russia UIBB

Re: BASCOM AVR в вопросах и ответах

Сообщение mikbur »

kip96 писал(а):Откажись от INT0-INT1 а энкодры сканируй по таймеру.


Не совсем понятно как, можно примерчик какой нибудь ?
Реклама
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Re: BASCOM AVR в вопросах и ответах

Сообщение kip96 »

По прерыванию таймера сканируйте все три энкодера.
К примеру при частоте 8Мгц, делителе на 8, 8-ми битный таймер будет срабатывать каждые 256 мкс
По прерыванию проверяете каждый энкодер,к примеру- стандартной командой баскома.
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Аватара пользователя
htscooter
Вымогатель припоя
Сообщения: 566
Зарегистрирован: Вт ноя 18, 2008 20:33:17
Откуда: г.Луганск

Re: BASCOM AVR в вопросах и ответах

Сообщение htscooter »

Уважаемые спецы! Помогите разобраться со следующей проблемой. Хочу сделать динамическую посегментную индикацию, но затык в том, что все цифры выводятся нормально, а девятка всегда с точкой. Даже если я в массиве делаю так, чтоб разряд полностью потух (вместо отображения 9), то семь сегментов тухнут, а децимальная точка все равно горит. Кусок кода, отвечающий за индикацию ниже. Принцип следующий - для текущего сегмента проверяется, горит ли он в соответствующем разряде, или нет. Если горит, то разряд зажигается. Может это и не эффективно, т.к. сегментов 8, а разрядов всего 4 - можно было бы применить классическую динамическую индикацию, но хочется упростить печатку за счет транзисторов в разрядах и резисторов в сегментах, оставить только 4 резистора в разрядах.

Код: Выделить всё

Indikaciya:
   High_ind = Min_work
   Low_ind = Sec_work
   If Decode_high = 1 Then
                           Cyfra(2) = High_ind Mod 10       'младший разряд минут(12 mod 10 = 2)
                           Cyfra(1) = High_ind / 10         'старший разряд минут(12 / 10 = 1)
   End If
   If Decode_low = 1 Then
                           Cyfra(4) = Low_ind Mod 10
                           Cyfra(3) = Low_ind / 10
   End If
   If Point_on = 1 Then Cyfra(2) = Cyfra(2) + 10            'зажигаем точку, если надо
   If Common_cathode = 1 Then                               'тушим индикаторы
                           Razryad_1 = 1
                           Razryad_2 = 1
                           Razryad_3 = 1
                           Razryad_4 = 1
                           Portd = 0
                         Else
                           Razryad_1 = 0
                           Razryad_2 = 0
                           Razryad_3 = 0
                           Razryad_4 = 0
                           Portd = 1
   End If
   For I = 1 To 4
      Cyfra_work = Cyfra(i)
      Razryad_work = Cyfra_work * 8                         'выбор строки в таблице
      Razryad_work = Segment + Razryad_work                 'выбор столбца
      Razryad_work = Lookup(razryad_work , Cifri)           'забираем данные
      If Common_cathode = 1 Then Razryad_work = Not Razryad_work       'инверсия в случае общего катода
      Razryad(i) = Razryad_work                             'сохраняем результат
   Next I

   Portd = Segment_out                                      'зажигаем нужный сегмент
   Rotate Segment_out , Right                               'проворачиваем дальше для поджига следующего
   Razryad_1 = Razryad(1)                                   'зажигаем разряды
   Razryad_2 = Razryad(2)
   Razryad_3 = Razryad(3)
   Razryad_4 = Razryad(4)
   Incr Segment
   If Segment > 8 Then Segment = 1
Return
End                                                         'end program

Cifri:
'     h   g   f   e   d   c   b   a                      | символ|
Data 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1                          '"0"
Data 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0                          '"1"
Data 0 , 1 , 0 , 1 , 1 , 0 , 1 , 1                          '"2"
Data 0 , 1 , 0 , 0 , 1 , 1 , 1 , 1                          '"3"
Data 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0                          '"4"
Data 0 , 1 , 1 , 0 , 1 , 1 , 0 , 1                          '"5"
Data 0 , 1 , 1 , 1 , 1 , 1 , 0 , 1                          '"6"
Data 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1                          '"7"
Data 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1                          '"8"
Data 0 , 1 , 1 , 0 , 1 , 1 , 1 , 1                          '"9"

Проблема в строке Razryad_work = Lookup(razryad_work , Cifri) - если в разряде девятка, то эта строка всегда возвращает единицу, и соответственно в разряде зажигается точка. Что тут не так?
Хорошо и надежно работающая система безусловно красива
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Re: BASCOM AVR в вопросах и ответах

Сообщение kip96 »

Напишите программу, проверяющую все сегменты поочереди, типа бегущий огонь. Без массивов, тупо зажигать сегменты. Тем самым проверите - нет "сопли" в монтаже или других погрешностей.
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Аватара пользователя
htscooter
Вымогатель припоя
Сообщения: 566
Зарегистрирован: Вт ноя 18, 2008 20:33:17
Откуда: г.Луганск

Re: BASCOM AVR в вопросах и ответах

Сообщение htscooter »

С монтажом все нормально, это рабочие платы, я прошивку переделываю.
Хорошо и надежно работающая система безусловно красива
Аватара пользователя
mikbur
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вт ноя 23, 2010 04:18:10
Откуда: Bratsk Russia UIBB

Re: BASCOM AVR в вопросах и ответах

Сообщение mikbur »

htscooter писал(а):Уважаемые спецы! Помогите разобраться со следующей проблемой. Хочу сделать динамическую посегментную индикацию, но затык в том, что все цифры выводятся нормально, а девятка всегда с точкой. Даже если я в массиве делаю так, чтоб разряд полностью потух (вместо отображения 9), то семь сегментов тухнут, а децимальная точка все равно горит. Кусок кода, отвечающий за индикацию ниже. Принцип следующий - для текущего сегмента проверяется, горит ли он в соответствующем разряде, или нет. Если горит, то разряд зажигается. Может это и не эффективно, т.к. сегментов 8, а разрядов всего 4 - можно было бы применить классическую динамическую индикацию, но хочется упростить печатку за счет транзисторов в разрядах и резисторов в сегментах, оставить только 4 резистора в разрядах.



Здесь посмотрите
http://avrproject.ru/publ/kak_podkljuchit/rabota_s_semisegmentnymi_indikatorami/2-1-0-9
Аватара пользователя
htscooter
Вымогатель припоя
Сообщения: 566
Зарегистрирован: Вт ноя 18, 2008 20:33:17
Откуда: г.Луганск

Re: BASCOM AVR в вопросах и ответах

Сообщение htscooter »

Видел, там классическая динамическая индикация, а у меня посегментная
Хорошо и надежно работающая система безусловно красива
avis_rara
Родился
Сообщения: 16
Зарегистрирован: Вт июн 28, 2011 00:16:55

Re: BASCOM AVR в вопросах и ответах

Сообщение avis_rara »

Доброго времени суток.
Я начинаю только постигать азы программирования и поетому столкнулся с проблемой. Сделал я контроллер для шаговика, написал програму, крутит его в обе стороны, здесь все понятно... но захотел я подключить кнопку и ... не получается((
для 1-го светодиода и кнопки - все просто, а тут не пойму... мне нужно чтобы при ВЫКЛ он крутился в одну сторону, а при ВКЛ в другую. Подскажите, пожалуйста, как мне изменить программу из описанием изминений. Спасибо!
Программа:

$regfile = "attiny13.dat"
$crystal = 9600000

Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Pinb.4 = Input
Enable Interrupts
Enable Int4

Do
If Pinb.4 = 0 Then Goto Label1
If Pinb.4 = 1 Then Goto Label2

Label1 :
Portb.0 = 1
Portb.3 = 0
Waitms 5
Portb.0 = 0
Portb.1 = 1
Waitms 5
Portb.1 = 0
Portb.2 = 1
Waitms 5
Portb.2 = 0
Portb.3 = 1
Waitms 5
Portb.3 = 0
Waitms 5
Label2 :
Portb.0 = 0
Portb.3 = 1
Waitms 5
Portb.3 = 0
Portb.2 = 1
Waitms 5
Portb.1 = 1
Portb.2 = 0
Waitms 5
Portb.1 = 0
Portb.0 = 1
Waitms 5
Portb.0 = 0
Waitms 5

Loop

End
SAU
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс сен 10, 2006 00:04:03

Re: BASCOM AVR в вопросах и ответах

Сообщение SAU »

Можно в цикле опрашивать состояние кнопок с задержкой и вызывать соответствующую подпрограмму
пример опроса кнопки..

Код: Выделить всё

' Кнопка подключена с резистором подтяжки..
 Config Portd.0 = Input

If Pind.0 = 0 Then
Waitms 150 ' задержка на дребезг..
      If Pind.0 = 0 Then
        'Здесь вызов подпрограммы отработки по  0

       End If
End If

If Pind.1 = 0 Then
Waitms 150 ' задержка на дребезг..
      If Pind.0 = 1 Then
        'Здесь вызов подпрограммы отработки по  1

       End If
End If




Есть еще DEBOUNCE - она уже сразу проверяет на дребезг..
Но лучше отслеживать по прерыванию и уже оттуда вызывать подпрограмму..

Использование Goto - плохой стиль программирования..практически всегда можно обойтись без него.
про вызов подпрограмм почитать здесь..http://decada.org.ru/project/lessons/bascom_avr/09/
Там вообще очень хорошая обучалка..

Интересное есть здесь
http://avr.ru/ и здесь http://avrproject.ru/search/bascom-avr/
avis_rara
Родился
Сообщения: 16
Зарегистрирован: Вт июн 28, 2011 00:16:55

Re: BASCOM AVR в вопросах и ответах

Сообщение avis_rara »

Спасибо, SAU! Разобрался...
Аватара пользователя
selco
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пн июл 25, 2011 14:24:34

Re: BASCOM AVR в вопросах и ответах

Сообщение selco »

Люди,подскажите как сделать на LCD 3310 регулировку контраста с кнопок?

Спасибо!
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Re: BASCOM AVR в вопросах и ответах

Сообщение amv2000 »

selco писал(а):как сделать на LCD 3310 регулировку контраста с кнопок?

D3310commandout &HC8 'Средний контраст (Contrast = 72) включить внутренний источник, Vop=0x48(настройки напряжения Vop, позволяющие программно менять контрастность)
Следовательно если вместо значения &HC8, создать переменную и менять её значение, то будет меняться и контрастность.
Аватара пользователя
selco
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пн июл 25, 2011 14:24:34

Re: BASCOM AVR в вопросах и ответах

Сообщение selco »

Спасибо. Попробую.
marss70
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пт май 25, 2012 21:43:14

Re: BASCOM AVR в вопросах и ответах

Сообщение marss70 »

Здравствуйте, товарищи! Подскажите, в чём может быть ошибка? В Протеусе работает, а в железе выводит только "Freq: 20"
Вложения
F_metr_mega8_1601.rar
(28.6 КБ) 193 скачивания
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: BASCOM AVR в вопросах и ответах

Сообщение radio-kot »

Похоже BASCOM AVR очень популярная программа если судить по результатам поиска который гугл выдает
https://www.google.ru/webhp?sourceid=ch ... =699&ion=1
Будете проходить мимо- проходите!
Ответить

Вернуться в «AVR»