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

Обсуждаем контроллеры компании Atmel.
pavel1979
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

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

Сообщение pavel1979 »

коты,а кто либо пробовал писать программы проигрывания простых мелодий?к примеру "в лесу родилась елочка"?на си есть пример,а вот как сделать на баском?чисто спортивный интерес,можно в какую разработку вставить
Спойлер#include <tiny2313.h>
#include <delay.h>

// Declare your global variables here

// Таблица задержек
flash unsigned int tabz[] = {32,64,128,256,512,1024,2048};

// Таблица коэффициентов деления
flash unsigned int tabkd[] = {0,4748,4480,4228,3992,3768,3556,3356,3168,2990,2822,
2664,2514,2374,2240,2114,1996,1884,1778,1678,1584,1495,1411,1332,1257,
1187,1120,1057, 998,942,889,839,792};
// Таблицы мелодий
// В траве сидел кузнечик
flash unsigned char mel1[] = {109,104,109,104,109,108,108,96,108,104,108,104,108,
109,109,96,109,104,109,104,109,108,108,96,108,104,108,104,108,141,96,109,
111, 79, 79,111,111,112,80,80,112,112,112,111,109,108,109,109, 96,109,111,
79,79,111,111,112,80,80,112,112,112,111,109,108,141,128,96,255};
// Песенка крокодила Гены
flash unsigned char mel2[] = {109,110,141,102,104,105,102,109,110,141,104,105,107,
104,109,110,141,104,105,139,109,110,173,96,114,115,146,109,110,112,109,
114,115,146,107,109,110,114,112,110,146,109,105,136,107,105,134,128,128,102,
105,137,136,128,104,107,139,137,128,105,109,141,139,128,110,109,176,112,108,
109,112,144,142,128,107,110,142,141,128,105,109,139,128,173,134,128,128,109,
112,144,142,128,107,110,142,141,128,105,109,139,128,173,146,128,255};
// В лесу родилась елочка
flash unsigned char mel3[] = {132,141,141,139,141,137,132,132,132,141,141,142,139,
176,128,144,146,146,154,154,153,151,149,144,153,153,151,153,181,128,96,255};
// Happy births day to you
flash unsigned char mel4[] = {107,107,141,139,144,143,128,107,107,141,139,146,144,
128,107,107,151,148,146,112,111,149,117,117,148,144,146,144,128,255};
// С чего начинается родина
flash unsigned char mel5[] = {99,175,109,107,106,102,99,144,111,175,96,99,107,107,
107,107,102,104,170,96,99,109,109,109,109,107,106,143,109,141,99,109,109,109,
109,104,106,171,96,99,111,109,107,106,102,99,144,111,143,104,114,114,114,114,
109,111,176, 96,104,116,112,109,107,106,64,73,143,107,131,99,144,80,80,112,
111,64,75,173,128,255};
// Из кинофильма "Веселые ребята"
flash unsigned char mel6[] = {105,109,112,149,116,64,80,148,114,64,78,146,112,96,105,
105,109,144,111,64,80,145,112,64,81,178,96,117,117,117,149,116,64,82,146,112,
64,79,146,144,96,105,105,107,141,108,109,112,110,102,104,137,128,96,105,105,
105,137,102,64,73,142,105,107,109,64,75,137,96,105,105,105,137,102,105,142,112,
64,82,180,96,116,116,116,148,114,112,142,109,64,78,146,144,96,105,105,107,141,
108,109,112,110,102,104,169,96,96,255};
// Улыбка
flash unsigned char mel7[] = {107,104,141,139,102,105,104,102,164,128,104,107,109,109,
109,111,114,112,111,109,144,139,128,109,111,144, 96,111,109,104,107,105,173,128,
111,109,112,107,111,109,109,107,102,104,134,132,128,100,103,107,107,107,107,139,
112,100,103,102,102,102,134,102,103,107,105,107,108,108,108,108,107,105,107,108,
144,142,128,112,107,110,140,112,105,108,107,107,107,105,140,139,139,112,103,102,
103,105,108,107,105,103,128,112,107,110,108,108,108,140,112,105,108,107,107,107,
139,112,103,102,103,105,108,107,105,103,105,139,132,128,96,96,96,255};

// Таблица начал всех мелодий
flash unsigned char *tabm[] = {mel1, mel2, mel3, mel4, mel5, mel6, mel7};


void main(void)
{
unsigned char count; // Определяем переменную count
unsigned char temp; // Определяем переменную temp
unsigned char fnota; // Код тона ноты
unsigned char dnota; // Код длительности ноты
flash unsigned char *nota; // Ссылка на текущую ноту

PORTB=0x08; // Игициализация порта PB
DDRB=0x08;

PORTD=0x7F; // Игициализация порта PB
DDRD=0x00;

TCCR1A=0x00; // Инициализация таймера счетчика T1
TCCR1B=0x09;

ACSR=0x80; // Инициализация аналогового компаратора

while (1)
{
// Сканирование клавиатуры
m1: temp=PIND; // Чтение кода с клавиатуры
for (count=0; count<7; count++) // Цикл сканирования
{
if ((temp&1)==0) goto m3; // Если кнопка нажата, выходим
temp >>= 1; // Сдвиг считанного кода
}
m2: TCCR1A=0x00; // Выключаем звук
goto m1;

// Воспроизведение мелодии
m3: nota = tabm[count]; // Устанавливаем указатель на первую ноту
m4: if (PIND==0x7F) goto m2; // Если ни одна кнопка не нажата, закончить
if (*nota==0xFF) goto m3; // Проверка на конец мелодии
fnota = (*nota)&0x1F; // Определяем код тона
dnota = ((*nota)>>5)&0x07; // Определяем код длительности
if (fnota==0) goto m5; // Если пауза не воспроизводим звук
OCR1A=tabkd[fnota]; // Программируем частоту звука
TCCR1A=0x40; // Включаем звук
m5: delay_ms (tabz[dnota]); // Формируем задержку
TCCR1A=0x00; // Выключаем звук
delay_ms (tabz[0]); // Задержка между нотами
nota++; // Перемещаем указатель на следующую ноту
goto m4; // К началу цикла
};
}
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Мелодии в BASCOM AVR.
Автор: Рубашка Василий.
Вложения
SOUND_BASCOM.rar
(19.41 КБ) 590 скачиваний
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
pavel1979
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

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

Сообщение pavel1979 »

edm2007 писал(а):Мелодии в BASCOM AVR.
Автор: Рубашка Василий.

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

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

Сообщение edm2007 »

Ну это да. В массивах ловко (сам на Си так писал). Вот статья неплохая, ноты дефайнами прописаны. Микроконтроллер играет мелодию.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

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

Сообщение Lavad »

Igor_67 писал(а):
...вставляем в прогу библиотеку "mcsbyte.lbx", перекомпилируем, и...

По поводу переменных полностью согласен! Уже успел несколько раз порадоваться уменьшению кода после более внимательного разбора их размерностей. Но с библиотекой "mcsbyte.lbx" не всегда получается ожидаемое :(. Например, на днях, в одном из проектов воспользовался ею, код съежился с 17% до 14%, и в то же время получил от Баскома такое замечание:

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

Error : 61  Line : xxx  Label not found [_PRINTWORD           ]  , in File xxx

В действительности, этих строк 4, по две на каждую строку моего кода:

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

Locate 1 , 1 : Lcd "Tm= " ; Temp ; " s"
Locate 2 , 1 : Lcd "Us= " ; UstSec

Переменные Temp и UstSec - Word.
61-ая ошибка расшифровывается как "Метка не найдена". Другими словами, я понял, что в библиотеке нет поддержки вывода переменных Word. Заглянул в библиотеку, а она на Асме :(.
В другом проекте гавкнул на переменную Integer:

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

Error : 61  Line : xxx  Label not found [_PRINTSDECW           ]  , in File xxx

Может, у кого-то есть соображения, как подкорректировать библиотеку? Или, может, какой другой вариант? Пытался сменить пол переменных, но ниже Word-а спустить не могу (числа в программе в пределах 0...65536), а поднимать выше (до Long-а) - что с библиотекой, что без нее, проценты увеличивались, и те же сообщения, но уже про Long.
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

Глюки есть во всех компиляторах. И что-то делать с ними может стать себе дороже. Лучше смириться. За 20 лет программирования много чего перепробовал. В том числе и правил исходники системных библиотек. Часто правка вылазит в самом неожиданном месте. Так что по мне, так ну их на ... Всегда получалось, что быстрее, проще и менее болезненно обойти ошибку.
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

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

Сообщение Lavad »

Согласен. Если неудачно подправил, потом будем гоняться за бОльшим количеством зайцев/глюков.
Тогда другой вопрос - с Баском-ом идут куча всяких библиотек... Не с бухты-барахты они появились. Их первая цель - помочь разработчику; у каждой имеется свое предназначение. Наверняка, где-то на просторах сети можно ознакомиться с этим. Пытался искать, но с собачим (английским) языком не дружу (и не стремлюсь!), а на Великом и Могучем что-то не нашел ничего (или проморгал?).
Может, кто-то сможет помочь ДОКами или ссылками?
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
pavel1979
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

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

Сообщение pavel1979 »

у вас не найдена метка,скорее всего
а что именно вас интересует?
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

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

Сообщение Lavad »

pavel1979 писал(а):...а что именно вас интересует?

pavel1979! Ваш ответ, вопрос и ответ на него, мои вопросы - все это имеется в моих 2-ух предыдущих сообщениях.
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
pavel1979
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

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

Сообщение pavel1979 »

Lavad писал(а):
pavel1979 писал(а):...а что именно вас интересует?

pavel1979! Ваш ответ, вопрос и ответ на него, мои вопросы - все это имеется в моих 2-ух предыдущих сообщениях.

у вас ошибка-Locate 1 , 1 : Lcd "Tm= " ; Temp ; " s"-метка не найдена,для справки-двоеточие это ставится в метках,вам нужно либо переделать в 2 строки,либо попробовать прописать через точку с запятой (только я такого не встречал) ;;;;;;;;;
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

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

Сообщение Lavad »

pavel1979 писал(а):...,для справки-двоеточие это ставится в метках,...

Для справки: в метках ставится двоеточие БЕЗ ПРОБЕЛА (перед двоеточием)! Точка с запятой ставится для соединения выражений в одно целое (аналогия в Бейсике: & или +).
В моем же коде явно виден пробел! И, следовательно, ошибки тут нет. Что касается этой злополучной библиотеки, то ей по фигу - в одну строку прописано, или в десять строк :(. Она цепляется именно к переменной, отправляемой на дисплей. Уже проверял, прежде чем сюда задавать вопрос.

pavel1979, Вы пытались мне помочь по голой теории, не прогнав код в программе :(.
Спасибо за попытку!
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
pavel1979
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

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

Сообщение pavel1979 »

спасибо,про пробел не знал,читаю хелп
извини что парил мозг-не знал,а полез,наверно меня забанят..хсн
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

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

Сообщение Lavad »

pavel1979 писал(а):...не знал,а полез,...

Не Боги горшки обжигают! :)
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

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

Сообщение Lavad »

Кажется нашел ответ по библиотеке mcsbyte.lbx:
This library can only print Bytes
У меня она не сработала по причине ее работы только с переменной типа Byte.
Для обработки переменных Integer и Word имеется библиотека mcsbyteint.lbx.
Что ж, проверим...
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
TIP
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс июл 03, 2011 06:27:35

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

Сообщение TIP »

Доброго вечера всем котам!
Подскажите как сделать что бы основная работа портов на выход не прерывалась ни под каким предлогом пока идет обработка кнопок. После обработки кнопок, измененные данные должны вставляться в код проги. Сам не догоняю как это сделать. Вот код проги.

Do

Set Portd.2
Waitms Nac
Reset Portd.2
Waitms Pac
Set Porta.0
Waitms Sac
Reset Porta.0
Waitms Pac

If Sa = 0 Then
Gosub Saz
End If

If Sc = 0 Then
Gosub Scz
End If

If Pa = 0 Then
Gosub Paz
End If

If Pc = 0 Then
Gosub Pcz
End If

Loop
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

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

Сообщение Lavad »

Написали две строки, не сказав ничего! :) Вы бы чуть подробностей добавили... Какой контроллер, где основная программа,... Наличие дуэта Do...Loop еще ничего не говорит. В программе их может быть несколько. Но в любом случае, из того, что вы выдрали откуда-то...
На сколько знаю, выполнение программы подразумевает последовательность действий: от строки к строке, от команды к команде. Одно то, что в коде имеется Gosub (и не один!), основной программе подписан приговор.
Может быть я ошибаюсь, но пока весь мой мизерный опыт с МК говорит об этом.

P.S. А основной программой, видимо, называете 8 строк по переключению выходов D.2 и A.0?
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
TIP
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс июл 03, 2011 06:27:35

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

Сообщение TIP »

Вот вся прога, это меня научили писать без проблем. Но пока работал с низким напряжением на полевиках все было нормально. Но пришлось перейти на ключевание напряжения до 500 вольт и при не хилом токе. Ребята подсказали, что когда прога уходит на обработку прерывания, может так получиться что в этот момент полевик останется в открытом положении пока идет обработка прерывания. Не трудно догадаться что полевик сдохнет моментально. Было раньше так, не с того не с сего полевики взрывались, не мог понять в чем причина. Вот и прошу помощи у знающих. Надо переделать прогу так, что бы когда прога уходит на обработку прерываний, полевики продолжали работать в штатном режиме. А после обработки прерываний сразу приняли внесенные изменения в прогу.

$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config Portc.2 = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Porta.0 = Output

Config Pinb.0 = Input
Config Pina.1 = Input
Config Pina.2 = Input
Config Pina.3 = Input
Config Pina.4 = Input
Config Pina.5 = Input
Config Pinc.0 = Input
Config Pind.7 = Input

Set Pina.1
Set Pina.2
Set Pina.3
Set Pina.4
Set Pina.5
Set Pinb.0
Set Pinc.0
Set Pind.7

Razrjd Alias Pinb.0
Sa Alias Pina.1
Sc Alias Pina.2
Pa Alias Pina.3
Pc Alias Pina.4
Udar Alias Pina.5
Na Alias Pinc.0
Nc Alias Pind.7



Dim Sac As Integer
Sac = 2
Dim Pac As Integer
Pac = 2
Dim Nac As Integer
Nac = 2


Do

Set Portd.2
Waitus Nac
Reset Portd.2
Waitms Pac
Set Porta.0
Waitus Sac
Reset Porta.0
Waitms Pac

If Razrjd = 0 Then
Gosub Razrjdz
End If

If Sa = 0 Then
Gosub Saz
End If

If Sc = 0 Then
Gosub Scz
End If

If Pa = 0 Then
Gosub Paz
End If

If Pc = 0 Then
Gosub Pcz
End If

If Udar = 0 Then
Gosub Udarz
End If

If Na = 0 Then
Gosub Naz
End If

If Nc = 0 Then
Gosub Ncz
End If

Loop

Naz:
Waitms 200
Nac = Nac + 2
Return

Ncz:
Waitms 200
If Nac = 2 Then
Return
Else
Nac = Nac - 2
End If
Return

Saz:
Waitms 200
Sac = Sac + 2
Return

Scz:
Waitms 200
If Sac = 2 Then
Return
Else
Sac = Sac - 2
End If
Return

Paz:
Waitms 200
Pac = Pac + 2
Return

Pcz:
Waitms 200
If Pac = 2 Then
Return
Else
Pac = Pac - 2
End If
Return

Udarz:
Waitms 200
Set Portd.1
Waitus Nac
Reset Portd.1
Return

Razrjdz:
Waitms 200
Set Portc.2
Waitus Sac
Reset Portc.2
Return

End
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

Что то я не врубаюсь, как порты должны работать.
Если любой вызов подпрограммы делает задержку в 0.2 секунды, это штатный режим? Если нет, то это не программа, а набор команд.
Если да, то почему этой задержки нет в основном цикле? И что будет с портами, если нажато несколько кнопок одновременно? И в последних, а какие прерывания программа обрабатывает? Нажатие кнопки? А если она залипнет? Прерывание бесконечно? И нажатие кнопки не прерывание а "событие".
Короче - так писать нельзя! Особенно при управлении не светодиодами дома, а мощной нагрузкой на производстве.
TIP
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс июл 03, 2011 06:27:35

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

Сообщение TIP »

vem566 писал(а):Короче - так писать нельзя! Особенно при управлении не светодиодами дома, а мощной нагрузкой на производстве.

Это я понял когда мощные полевики взрывались в натуральном смысле. Кто знает как правильно написать,, помогите пожалуйста.
С ув. Вадим.
_Vasilij_
Встал на лапы
Сообщения: 124
Зарегистрирован: Пт янв 25, 2013 02:48:32

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

Сообщение _Vasilij_ »

TIP писал(а):Кто знает как правильно написать,, помогите пожалуйста.
С ув. Вадим.
Вам написать или помочь разобраться ?
Вам нужно изучить прерывания по таймеру, очень рекомендую почитать http://decada.org.ru/project/lessons/bascom_avr/10/ , в частности очень понадобится умение переводить счетчик таймера в реальные нано-микро-секунды.

Потом поменьше пользоваться waitms, и еще команда waitus, насколько помнится, работает только с константами, да и не очень точно...ну эт так ремарка.

Изучить что такое функция debounce и как ей пользоваться.

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

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

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