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

Обсуждаем контроллеры компании Atmel.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

avrman писал(а):Может это и просто, но без примеров не разобраться, особенно мне. Если не трудно покажите на примере как сделать так, чтобы при превышении напряжения на прямом выводе компаратора относительно инверсного, мк давал признаки жизни, скажем менял уровень на одной из своих ног.
Если напряжение на неинвертирующем входе больше чем на инвертирующем - светодиод зажигается. :)

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

Config Portb.0 = Input                                      ' компаратор
Config Portb.1 = Input
Config Portb.2 = Output                                     ' светодиод

*************[Начало основной программы]*************

Do

Portb.2 = Acsr.5

Loop
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт окт 01, 2010 20:17:58

Сообщение avrman »

спасиб :beer:
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

avrman писал(а):спасиб :beer:
Да не за что. :) Удобнее конечно прерывание использовать. Там тоже все просто.

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

Config Aci = On , Trigger = Toggle   ' настраиваем условие прерывания компаратора
On Aci Comparator                         ' обзываем прерывание

Enable Interrupts                            ' разрешаем прерывания 
Enable Aci

'**********[Начало основной программы]**********

Do

Loop

'**********[Процедуры обработки прерываний]**********

Comparator:

Portb.2 = 1
Waitms 500
Portb.2 = 0

Return
В данном случае светодиод будет мигать каждый раз когда напряжение на входе AIN0 становится больше или меньше чем на AIN1. Разумеется, можно настроить прерывание на что-то одно (rising/falling). :)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт окт 01, 2010 20:17:58

Сообщение avrman »

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

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

comparator:
if timer1<32700 then
   "выполняем один код"
  else 
   "выполняем другой код"
return
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Аватара пользователя
Сообщения: 262
Зарегистрирован: Пт окт 30, 2009 22:33:56
Откуда: Санкт-Петербург

Сообщение Alex_Megavolt_79 »

Товарищи коты, будьте так добры подсказать мне такой вопрос - как после АЦП преобразования значение напряжения выводилось на дисплей с дробной частью. Код дёрнул с обучалки с одного сайта, убрал заставку, да вместо численного значения АЦП по формуле рассчитал значение напруги (нужно в качестве обучения).Теперь показывает целое значение. Исходник прилагаю.
Вложения
ADC_LCD.txt
(2.1 КБ) 244 скачивания
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 262
Зарегистрирован: Пт окт 30, 2009 22:33:56
Откуда: Санкт-Петербург

Сообщение Alex_Megavolt_79 »

Сам дошёл добавил ещё одну переменную. и в теле цикла такой код сделал

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

 
U = W * 5
  U = U / 1023
  Locate 1 , 5                                              ' позиция курсора
  Lcd "ADC(0):" ; Fusing(u , "##.##")
U типа Single
Реклама
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб июн 05, 2010 20:44:58

Сообщение xaker-man »

Помогите ещё вот с чем, можно ли как-нибудь сделать так: waitus N - где N переменная? Просто так не работает, а когда руками вписано значение все ок.
Сверлит текстолит когтями
Сообщения: 1278
Зарегистрирован: Пн июн 18, 2007 21:51:20

Сообщение aleksandr-zh »

xaker-man писал(а):Помогите ещё вот с чем, можно ли как-нибудь сделать так: waitus N - где N переменная? Просто так не работает, а когда руками вписано значение все ок.
вопрос уже поднимался: читайте инструкцию, где сказано о невозможности использования переменной в задержках

я использовал ассм:

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

$asm ; Waitms
 _wait_ms:
        ldi  r20,20
 _wms1:
      ldi  r21,133
 _wms2:
        dec  r21
         brne _Wms2
        dec  r20
         brne _Wms1
        dec  zl
         brne _wait_ms
  ret
$end Asm


ВЫЗОВ:  

    $asm                                                    ' равносильно waitms [color=#FF0000][b]1[/b][/color]
       ldi  zl, [color=#FF0000][b]1[/b][/color]
       rcall  _wait_ms
    $end Asm


для 8 мгц и делал на мега8
Открыл глаза
Сообщения: 66
Зарегистрирован: Пт дек 10, 2010 18:29:26

Сообщение user2007 »

xaker-man писал(а):Помогите ещё вот с чем, можно ли как-нибудь сделать так: waitus N - где N переменная? Просто так не работает, а когда руками вписано значение все ок.

К сожалению, переменная N в данной макрокоманде не может быть использована(см.описание макрокоманды WAITUS в help'е).
Но выход достаточно прост:
в "шапке" записываем:
Const N1 = 1 'или 2,3 и т.д. - N1 задана как постоянная с заданным и неизменяемым значением
Dim N As Word ' N задана как переменная с размерностью WORD - 0...65535

N=10
'В программе записываем цикл:
WHILE N>0 'пока переменная больше ноля
WAITUS N1 'на каждом витке цикла - задержка N1 микросекунд
DECR N 'уменьшение N на единицу
WEND 'выход из цикла при N=10 в данном случае.

Итого - общая задержка = N х N1 микросекунд (в данном случае - 10N1).

Но автор компилятора Марк Альбертс предупреждает при этом, что задержка WAITUS не является прецизионной (см.описание макрокоманды WAITUS в help'е).Чем выше частота процессора, тем точнее результат.В принципе, вместо N1 можно вписать любое число от 1 - задержка будет кратной ему. Естественно, что при задержке больше 1000 мкс лучше использовать WAITMS. :)
Последний раз редактировалось user2007 Пт дек 24, 2010 13:19:57, всего редактировалось 2 раза.
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вс мар 04, 2007 14:38:49

Сообщение Kesha »

Есть у кого пример работы с 74HC595?
Сверлит текстолит когтями
Сообщения: 1278
Зарегистрирован: Пн июн 18, 2007 21:51:20

Сообщение aleksandr-zh »

Kesha писал(а):Есть у кого пример работы с 74HC595?
используете простой сдвиг, команда SHIFTOUT
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вс мар 04, 2007 14:38:49

Сообщение Kesha »

:) Все же хотелось бы на готовый пример посмотреть.
Сверлит текстолит когтями
Сообщения: 1278
Зарегистрирован: Пн июн 18, 2007 21:51:20

Сообщение aleksandr-zh »

у меня нет под Bascom - еще не делал, есть под FastAVR:

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

$Device= m8
$Stack = 32
$Clock = 1

$Def Led7_1 = PORTB.5
$Def Led7_2 = PORTB.4
$Def Led7Load = PORTB.1

$Def Led = PORTB.7

$ShiftOut Data=PORTB.0, Clock=PORTB.2, Lsb

DDRB=255: PORTB =0      ' OUTput

'===  Выводим два числа на 7-сегм. индикатор  ============
Sub Print_7seg(digit01 As Byte, digit02 As Byte)
' Выключены оба индикатора

Led7Load = 0            ' Низкий уровень на "загрузка" регистра

ShiftOut digit01        ' Выдаём байт в регистр
Led7Load = 1            ' Загружаем регистр, вывод данных на ножки регистра
Led7Load = 0

Led7_1 = 1                      ' Включаем первый индикатор
WaitUs 10
'=====

ShiftOut digit02        ' Выдаём байт в регистр
Led7_1 = 0                      ' Выключаем первый индикатор
Led7Load = 1            ' Загружаем регистр, вывод данных на ножки регистра
Led7Load = 0

Led7_2 = 1                      ' Включаем второй индикатор
WaitUs 22
Led7_2 = 0                      ' Выключаем второй индикатор

End Sub

GoTo Start_prog

' ==
'1 = 238
'2 = 146
'3 = 162
'4 = 228
'5 = 161
'6 = 129
'7 = 234
'8 = 128
'9 = 160
'0 = 136

'- = 247
'A = 192
'b = 133
'С = 153
'с = 151
'd = 134
'E = 145
'F = 209
'G = 137
'H = 196
'h = 197
'I = 221
'J = 138
'L = 157
'n = 199
'O = 136
'o = 135
'P = 208
'r = 215
'S = 161
't = 149
'U = 140
'u = 143
'Y = 164

Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вс мар 04, 2007 14:38:49

Сообщение Kesha »

aleksandr-zh спасибо, попробую разобраться.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Вот подкинули мне индикатор-SPC 16010D (на плате вытравленно EC1601D)
Подключил я его и всё заработало, но-
Командой LCD пишит только 8 символов, что-бы перейти на следующие 8 нужно делать ловерлайн.
В Баскоме я ни как не смогу это обойти? Получается Shiftlcd мне уже не применить!
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Сверлит текстолит когтями
Сообщения: 1278
Зарегистрирован: Пн июн 18, 2007 21:51:20

Сообщение aleksandr-zh »

0. Устанавливаешь на входе -RESET (10) уровень 1,
на входах CLK (11), LOAD (12) и -OE (13) уровень 0.

1. Устанавливаешь нужный уровень на входе DATA (14)
2. Подаешь на CLK уровень 1. При этом сдвиговый регистр делает один сдвиг
3. Подаешь на CLK уровень 0.
Пункты 1-3 повторяешь 8 раз.

4. Подаешь на LOAD уровень 1.
При этом содержимое сдвигового регистра переписывается в параллельный регистр

5. Подаешь на LOAD уровень 0

Всё

Если 595-ых будет несколько, выход D7' предыдущего регистра соединяется со входом DATA (14) следующего. -RESET, CLK, LOAD и -OE запараллеливаются.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки

Сообщение Секретный кот »

kip96 писал(а):В Баскоме я ни как не смогу это обойти?
Попробуйте с Config Lcd поиграться (16*1/16*1a).
Даже остановленные часы два раза в сутки показывают правильное время.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вс мар 04, 2007 14:38:49

Сообщение Kesha »

aleksandr-zh, с самой 74HC595 уже разобрался. Теперь осталось как все реализовать в баскоме :)
Но пинок в сторону SHIFTOUT, пример твоего кода и справочник Кулиша многое разъяснил :)
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Секретный кот писал(а):Попробуйте с Config Lcd поиграться (16*1/16*1a).
не помогло.
В Баскоме в симуляторе при 16*1a вообще LCD в две строки выскакивает.
Наверное индикатор какой-то хитрый, ибо и протеусе и в симуляторе без ловерлайн работает нормально. Ещё заметил что при пустом индикаторе и и сильной контрастности только 8 квадратиков темнеют :shock: .
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Сверлит текстолит когтями
Сообщения: 1278
Зарегистрирован: Пн июн 18, 2007 21:51:20

Сообщение aleksandr-zh »

kip96 писал(а):Ещё заметил что при пустом индикаторе и и сильной контрастности только 8 квадратиков темнеют :shock: .
так и должно быть

попробуйте в настройках ЖКИ указать большее количество символов в строке и только одну строку
Например, 20х1 или 40х1
Ответить

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