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

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

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

Сообщение amv2000 »

константин_KoSS_89 писал(а):Да на пальцах я понимаю, нужно в деле, продолжаем поиск...

http://radiokot.ru/circuit/light/run/22/ еще здесь есть светодиодный диммер, не совсем то...но может пригодится для общего развития
http://radioded.ru/shema/dvuhkanalnyy-s ... nyy-dimmer - двухканальный
http://www.roboternetz.de/community/thr ... com-Dimmer
http://electronix.ru/forum/lofiversion/ ... 13860.html
http://cxem.net/house/1-168.php
http://easyelectronics.ru/ik-distancion ... lenie.html
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

Появилась у меня вот проблема. 2 месяца тому сделал блок управления насосом с электро-механическим манометром. Насос стоит в санатории, качает минеральную воду с давлением 6 кг/см2 (включен через блок плавного пуска). Так вот, манометр не дает качественный сигнал и стрелка при небольшой разнице давлений (мин-макс) прыгает и контроллер постоянно меняет состояние устройства плавного пуска и двигатель воет.
Сейчас сделано в прошивке так -
При поступлении сигнала (мин.давл.) мк ждет 1 сек и дает сигнал на устройство плавного пуска - старт.
И при сигнале (макс.давл.) мк дает сигнал на остановку.

Как думаете, если по кнопке манометра запускать таймер и считать импульсы с него пока есть сигнал и если насчитает там н-количество то насос к старту, если нет то игнорировать. И наоборот для остановки.

Как я это вижу:
Сделать цикл с опросом кнопок. Если с появился лог на какой то кнопке, то включить таймер, отправить в другой цикл и проверять не отпущена ли кнопка. Если кнопка была отпущена и таймер не насчитал требуемого количества импульсов то вернуть в цикл опроса кнопок снова. Если есть требуемое количество то действие.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

vanyap1 писал(а):Появилась у меня вот проблема. 2 месяца тому сделал блок управления насосом с электро-механическим манометром. Насос стоит в санатории, качает минеральную воду с давлением 6 кг/см2 (включен через блок плавного пуска). Так вот, манометр не дает качественный сигнал и стрелка при небольшой разнице давлений (мин-макс) прыгает и контроллер постоянно меняет состояние устройства плавного пуска и двигатель воет.

Честно говоря я так и не понял в чем проблема и чего надо...
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

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

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

Сообщение edm2007 »

Так это не аппарат слишком быстро реагирует, Вы же сами сказали:

vanyap1 писал(а):манометр не дает качественный сигнал и стрелка при небольшой разнице давлений (мин-макс) прыгает и контроллер постоянно меняет состояние устройства


Как манометр сигнал дает, так устройство и работает. Как тут может быть "слишком быстро". Вопрос-то вот в чем, ПОЧЕМУ манометр даже при таких небольших изменениях давления выдает сигнал? Он так отрегулирован? Или просто неисправен? Действительно в таких границах должно быть давление (и как тогда устройство должно реагировать иначе), или это Вы обычный дребезг контактов не устранили всего лишь?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

На манометре установлено давление включения насоса 5,6 кг/см2 а отключение при 6. Так вот при включении насос дает толчок давление такой, что манометр отрубает его. Если принудительно включить насос, то стрелка пригнет к 6 и возвращается к нормальному давлению. Надо сделать чтобы отключение насоса происходило если с манометра есть устойчивый сигнал хоть 2-3 секунды. Своего рода подавление дребезга.

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

If Min_p = 1 Then : Waitms 200 : Set Nasos : End If
If Max_p = 1 Then : Waitms 200 : Reset Nasos : End If
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Ну тогда вариантов решения масса. От простейшей проверки в цикле WHILE .. WEND (до тех пор пока сигнал есть, через мелкую задержку увеличиваем переменную. там же проверяем ее значение. если насчитали нужное количество - сбрасываем счетчик и идем включаться. иначе (сигнал пропал) - просто сбрасываем счетчик), и до реализаций на том же таймере...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

Ну так я и предложил сначала. Появился сигнал > ждем и считаем пока есть сигнал > досчитали до заданного значения > включить на сос. Если недосчитали пока был сигнал то вертаем к началу программы, тоесть снова кнопки опрашивать.
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

Сделал, вроде работает.

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

A = 50
1:
Do
If Plus = 1 Then : Goto Sta_t : End If
If Minus = 1 Then : Goto St_p : End If
Gosub Displey
Loop

Sta_t:
C = 0
Do
If Plus = 1 Then
If Plus = 1 And Minus = 1 Then : Waitms 200 : Goto Conf_g : End If
Incr C
If C > A Then
C = 0
X = 255
Goto 1
End If
Gosub Displey
Else
Goto 1
End If
Loop

St_p:
C = 0
Do
If Minus = 1 Then
If Plus = 1 And Minus = 1 Then : Waitms 200 : Goto Conf_g : End If
Incr C
If C > A Then
C = 0
X = 0
Goto 1
End If
Gosub Displey
Else
Goto 1
End If
Loop

Displey:
Locate 1 , 1
Lcd "Nasos  c=" ; C ; "  "
Locate 2 , 1
Lcd "status = " ; X ; "     "
Pwm1a = X
Return

Conf_g:
Cls
Do
Incr C
If Plus = 1 Then : Waitms 75 : C = 0 : Incr A : End If
If Minus = 1 Then : Waitms 75 : C = 0 : Decr A : End If
If C = 150 Then : Goto 1 : End If
Locate 1 , 1 : Lcd "Set"
Locate 2 , 1 : Lcd "wait =  " ; A ; "  "
Loop


Изображение
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

назрел такой вопрос, решил я попробовать изучить VISUAL BASIC и написать программу для работы с COM PORT, чтоб связать железяку с с ПК, можно ли оператором PRINT отправлять данные на ПК, смогу ли я их в таком виде обработать?
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

Сможете. Print отсылает байты, а то как уж вы их будете интерпретировать - то дело ваше. Со стороны ПК они прибудут как последовательность байт.

Кстати, может кому интересно как можно выводить русские символы из флеш-памяти на бейсике. Вот тут я наваял свой пример:
PBIIDemo.bas

Я это делаю при помощи таблицы перекодировки, которую тоже храню во флеш. Эта таблица переводит символы CP1251 (WIN) в кодировку драйвера HD44780. Т.о. можно прямо в коде .bas файла задавать строки по-русски для вывода на LCD. Я там написал свои функции для работы с LCD, т.к. первый раз пишу на Bascom AVR и понятия не имею как запустить библиотечные для моей конфигурации. Также я не понял есть ли такое понятие как "проект". Когда я разъединил файлы и вставил директивы $include, то всё перестало работать, поэтому весь исходник в одном файле (это напрягает).
Вложения
Screen04.PNG
Отладка кода в Proteus
(93.32 КБ) 548 скачиваний
Россия навсегда!
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

uni писал(а):Я там написал свои функции для работы с LCD, т.к. первый раз пишу на Bascom AVR и понятия не имею как запустить библиотечные для моей конфигурации.


И вот нужен Вам после этого какой-то бейсик? :)) Это же бубльгум Си чистой воды. :)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

Да видел в рунете как народ мучался с русским текстом, какие-то сторонние программки использовал и пр. премудрости. И где у меня тама Си? Чистейший бейсик с примесью Bascom'а. Хотел среду VB6 использовать, да он, собака, текст автоматом форматирует, из-за чего у меня кое-где выравнивание поползло.

Захотелось поиграться, я то сам на объектном Си пишу (IAR EC++ и AVR GNU C++). Не сразу индикатор завёлся, долго искал проблему с осциллографом. Оказалось, что задержки формируются коряво в Bascom'е. А так, да, это переделанный код моего набора функций. По тому же адресу есть более полный проект, но уже на С++.

Для меня было удивительным, что код бейсика можно отлаживать при помощи JtagICE mkII через AVR Studio 4. Немного коряво, но что-то там шагает и даже можно посмотреть на состояние портов и пр. периферии. Не ожидал от Bascom'а. В Proteus тоже можно объектный файл подгрузить и пройтись по функциям бейсика, это забавно.

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

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

Сообщение edm2007 »

uni писал(а):И где у меня тама Си?


Ну в коментариях хотя бы. :) Я же не имел ввиду что код на Си, я к тому что _delay_us, ==, PROGMEM и прочее не спутаешь ни с чем. Вообще спасибо, интересно покопаться будет.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

Комментарии - это как вспомогательное средство для точного перевода с оригинала, чтобы не ошибиться. У меня есть уже отлаженный код и я просто поэлементно переводил его на бейсик. Так проще. Я его оставил, чтобы понятнее было. Функции задержек меня сильно огорчили, поэтому я написал свои. Бейсик в отличие от Си притормаживает немного и задержки на самом деле не такие, как хотелось бы. Если в Си я задал константу 40 мкс, то и будет примерно 40 мкс, а тут я долго соображал как передавать переменную в функцию задержки. Идеально было бы, если бы эти функции были где-то на асме написаны в какой-нибудь библиотеке, т.к. мои варианты меня тоже не очень устраивают, хотя это работает (в железе).

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

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

'    // Port C Data Direction Register
'    // [ Регистр направления порта C ][ATmega16]
'    //          00000000 - Initial Value
        DDRC = &B01000000
'    //          ||||||||
'    //          |||||||+- 0, rw, DDC0: (SCL)   - SCL
'    //          ||||||+-- 1, rw, DDC1: (SDA)   - SDA
'    //          |||||+--- 2, rw, DDC2: (TCK)   - JTAG
'    //          ||||+---- 3, rw, DDC3: (TMS)   - JTAG
'    //          |||+----- 4, rw, DDC4: (TDO)   - JTAG
'    //          ||+------ 5, rw, DDC5: (TDI)   - JTAG
'    //          |+------- 6, rw, DDC6: (TOSC1) - LCD RS / Dig1
'    //          +-------- 7, rw, DDC7: (TOSC2) - Ch B (энкодер)
'    // Примечание:

Заодно и схему как бы вижу сразу, что и куда подключено.

Моя схема есть тут: https://mysvn.ru/schoolbell/pbiidemo/proteus/
Мне бы очень хотелось знать как должна выглядеть программа на бейсике при использовании стандартной библиотеки для работы с индикатором по 4-проводной шине. У меня не получилось написать конфигурацию для своей схемы. Точнее я написал, как в примерах, но ничего не работало. Ноль реакции.

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

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

Сообщение edm2007 »

uni писал(а):Мне бы очень хотелось знать как должна выглядеть программа на бейсике при использовании стандартной библиотеки для работы с индикатором по 4-проводной шине.


Например ТАК. Вообще примеров довольно много. Да и справка у Баскома сильная.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

Кириллица в HD44780

Одна из главных проблем, с который могут столкнуться русскоязычные пользователи - нестандартная кодировка кириллических символов. То есть если вы отправите в ЖКИ обычную строку с русскими символами, вместо них на экран будут выведены абраказябры. Связано это с тем, что для экономии места в памяти контроллера тупоголовые разработчики вместо увеличения объема (можно было просто занять свободные ячейки) решили оставить лишь по одной ячейке для символов со сходным начертанием. Так например, буква O или P выглядят одинаково как в кириллице, так и латинице. Неумные инженеры подумали, что так они неистово сократят объем используемой памяти, но сократили лишь функциональность дисплея. И теперь при необходимости вывести русские символы, каждый раз возникает неприятная неприятность в виде несовместимости таблиц HD44780 и ASCII. Выхода есть два, у обоих свои плюсы и минусы:

1. Написать подпрограмму для контроллера, которая на лету будет декодировать ASCII коды и выводить уже правильные символы на ЖКИ. Удобна тем, что позволяет передавать любые строки без опасения, что они будут выведены впоследствии неправильно. Но этот способ требует лишних ресурсов на перекодировку, а также нужно постоянно хранить в памяти таблицу символов.
2. Использовать утилиту для ПК, которая сама переконвертирует нужные строки в нужный формат, которые сразу подставляются в код для вывода. Удобно тем, что не занимает память контроллера, работает быстро и вообще не требует ресурсов для перекодировки. Но минус в том, что в коде программы нужные строки уже не разобрать. Вывод символов в этом фиксированный, то есть выводить можно только заранее выбранный набор строк. При использовании ввода, например, с RS-232, русские символы будут отображены некорректно.

О наличии подпрограмм для первого случая мне известно, но я не встречал ни одной библиотеки или функции на Basom, которая бы выполняла это. Если вы встречали что-то подобное, убедительная просьба прислать это мне.

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

А конфигурацию я делал так же, только вот "Config lcdmode = PORT" не писал. Попробую ещё раз. Спасибо за наводку на такое полное руководство.

П.С. Пояснение к тому как это работает. Вот код перекодирования:

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

'/**
' * Вывод символа из ОЗУ
' */
Sub LCD_PutChar(ByVal Ch As Byte)

    Dim CharFromTable As Byte

    '// Заглушка, если драйвер не выбран
    'if ( Driver == LCD_DRIVER_NONE ) return;

    '// Если есть перевод каретки, то переходим на следующую строку
    If Ch = Asc( "|" ) Then

        LCD_Goto 1, 0

    Else

        ' CharFromTable = CP1251_TO_CPHD44780(Ch)
        CharFromTable = Lookup( Ch, CP1251_TO_CPHD44780 )

        ' Выводим символ, который соответствует таблице индикатора
        LCD_WriteData TYPE_DATA, CharFromTable

    End If

End Sub
Самая главная часть здесь вот эта:

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

        ' CharFromTable = CP1251_TO_CPHD44780(Ch)
        CharFromTable = Lookup( Ch, CP1251_TO_CPHD44780 )
Смысл здесь в том, что CP1251_TO_CPHD44780(256) - массив во флеш-памяти. Используя индекс, численно равный коду символа в кодировке CP1251, мы перемещаемся по таблице символов индикатора и возвращаем код символа в кодировке индикатора.

Пример. Допустим, что мы хотим вывести буковку "ё". Прикинем, какой символ мы должы получить при перекодировании. См. в прикреплённую табличку. Буковка "ё" должна иметь код: HLHH LHLH, что в переводе на русский означает: 1011 0101 или &HB5

А теперь посмотрим, что выдаст мой код. Открываем charmap.exe в Windows. Выбираем любой шрифт с кириллицей. Там найдётся буковка "ё" с кодом: Alt+184. Т.е. это означает, что если вы сейчас где-нить в поле ввода удерживая Alt наберёте 0184, то там появится буковка "ё" (можете это проверить). В hex'е это будет 0184 = &HB8. Теперь смотрим в мою табличку в конце файла: по строкам ищем &HB0, а по столбцам &H08 - там будет число &HB5 (!), т.е. перекодирование произойдёт и мы получим нашу любимую букву "ё", которую вроде как Екатерина ввела в наш обиход и по поводу использования которой есть целое Письмо Минобрнауки РФ от 20.07.2009 N ИК-971/03.

П.С2. Поскольку я не нашёл способа добавить в строку управляющий символ перевода каретки, то использовал символ вертикальной черты для перевода строки. В таблице ЖКИ это второй символ после буквы "z" (12 в верхнем регистре). В коде произошли некоторые изменения.

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

' В качестве разделителя строк используется символ вертикальной черты "|".
' Он отсутствует в таблице ЖКИ, поэтому был выбран вместо управляющего
' символа перевода каретки с кодом &H0D, который не удаётся задать в
' строке Bascom.
Text00:
    Data "Pinboard II Демо|Bascom AVR"
'         |<-  Строка1  ->||<Строка2>|

' Вывод на индикатор будет таким:
'
' +----------+
' |Pinboard II Демо|
' |Bascom AVR      |
' +----------+


RusText:
    Data "Россия навсегда!|Ура, друзья!"
Так гораздо удобнее хранить "интерфейс" окошка.

Исходник: PBIIDemo.bas
Вложения
Таблица LCD.gif
Таблица HD44780
(70.34 КБ) 524 скачивания
Последний раз редактировалось uni Ср мар 14, 2012 17:31:24, всего редактировалось 7 раз.
Россия навсегда!
implex
Родился
Сообщения: 15
Зарегистрирован: Пт фев 17, 2012 23:19:13

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

Сообщение implex »

Всем привет. Подскажите, пожалуйста, как правильно организовать сброс таймера при изменении одной из ножек МК с 0 на 1 и наоборот?
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

implex писал(а):Всем привет. Подскажите, пожалуйста, как правильно организовать сброс таймера при изменении одной из ножек МК с 0 на 1 и наоборот?

Копать тут: 10. Прерывания
Там есть примеры работы с прерываниями, в том числе с остановкой таймера, к примеру. Доработать под себя напильником.
Россия навсегда!
implex
Родился
Сообщения: 15
Зарегистрирован: Пт фев 17, 2012 23:19:13

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

Сообщение implex »

uni писал(а):Копать тут: 10. Прерывания
Там есть примеры работы с прерываниями, в том числе с остановкой таймера, к примеру. Доработать под себя напильником.


Спасибо, но прерывания не подходят, т.к. эти ножки уже заняты под другие цели. Пока есть одна идея, буду проверять. В результате должно получиться следующее: на три ножки приходят сигналы, при переходе сигнала на первой ножке с 0 на 1 и наоборот сбрасывается таймер0, на второй ножке таймер1 и т.д.
Ответить

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