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

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

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

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


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


Простые програмки для начинающих

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

1

Создаю тему для обмена хитростей и для выкладывания маленьких полезных подпрограмм, которые могут быть полезны как начинающим так и профи

0

2

Код:
$regfile = "8515def.dat"
$crystal = 8000000

Dim Chik As Word , Nakop As Single , Temp2 As Word , Tim1 As Word
Dim S As Single
On Ovf0 Tim_isr

Config Timer0 = Timer , Prescale = 1024
Stop Timer0
Reset Ddrb.1                                                'На этот вывод подаем частоту от датчика

Enable Interrupts
Enable Timer0
Start Timer0


 Main:
   Config Timer1 = Counter , Edge = Falling                 'конфигурим таймер 1 как счетчик
   Timer1 = &H0000                                          'обнуляем его
   Enable Timer1                                            'включаем
   Start Timer1                                             'и запускаем

 Do
           'тут выполняем свою программу,не трогая прерывания( так точнее считать будем)
 Loop

Tim_isr:                                                    '

   Temp2 = Timer1                                           'забираем данные, которые пришли за время таймера 0
   Timer1 = 0                                               'оюнулим его
   Incr Chik                                                'это внутренний счетчик
   If Chik = 200 Then                                       'если 200 раз сняли инфу, в зависимости от таймера

   S = Nakop                                                'в S - готовый результат

   Chik = 0
   Nakop = 0
   Else
   Nakop = Nakop + Temp2                                    'данные копим
   End If
   'Короче  суть такова
   ' к примеру запускаем таймер0 на 50 миллисекунд
   'и как раз насчитываем 200 раз, получается
   'в S число тактов за секунду
   '
   '
  Return

Програмка для отсчета частоты до 20 килогерц.Частота накапливается в переменной S. Используется 2 таймера.
Для тех кому непонятна работа с таймером, смотрите и разбирайтесь.
Немного прогу подкорректировал...

Отредактировано Ведущийспециалист (2008-01-19 17:01:18)

0

3

Программа генерирующая сама по себе прямоугольные импульсы

Код:
$regfile = "attiny45.DAT"
$crystal = 8000000

Clkpr = &H80
Clkpr = &H00
Dim A As Byte , B As Byte

Config Portb = Output

Tccr0a = &HB1
Tccr0b = &H09
Tcnt0 = 0


Ocr0a = 5
Ocr0b = 3
'всё, на выходе оcr0b выход генератора
Do
' своя программа
Loop

Значение Ocr0a должно быть больше Ocr0b .
В эти значения загоняем число от 0 до 255 и получаем частоту.

0

4

Программа, генерящая шимом почти чистый синус 50 герц.На выходе порта необходимо поставить RC фильтр.

Код:
$regfile = "m8def.dat"
$crystal = 8000000                                          
Config Portb.0 = Output
Dim Shag As Byte , Dann As Byte
Dim X As Byte , Tik As Byte
Dim Temp As Byte
Config Timer2 = Timer , Prescale = 1
Enable Timer2
On Timer2 Pwms
Start Timer2
Enable Interrupts
Do
 Restore Sin_table
 For Shag = 1 To 10
 Read Dann
 X = Dann
 Waitus 435
 Next

 For Shag = 1 To 10
 Read Dann
 X = Dann
 Waitus 435
 Next
Loop
End
Pwms:
Incr Tik

If Tik = 16 Then
 Tik = 0
 Portb = 0
 End If
If Tik > X Then Portb.0 = 1
Return
Sin_table:
Data 5 , 4 , 3 , 2 , 1 , 1 , 2 , 3 , 4 , 5
Data 6 , 8 , 12 , 13 , 14 , 14 , 13 , 12 , 8 , 6

0

5

Здравствуйте. Надо подключить 32 кнопки на один порт. Как это сделать?

0

6

ПОСТАВИТЬ 32 РЕЗИСТОРА И ЗАМЫКАТЬ .......       ОК.    А через 74HC154?

0

7

Можно пример определения скорости обмена по UART ?  По  Rx определение скорости обмена

Tx->Rx

0

8

Вопрос такой есть код (функция написана на асме с параметрами )   как ее вызвать на васике. Да функция написана как перемещаемая    -  т.е. бинарным едитором  можно вставлять  и работает.

0

9

чистый синус апаратным ШИМом (ниже скриншот)

Код:
$regfile = "m8def.dat"
$crystal = 8000000
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 1
Dim I As Byte , Y As Byte
Do
Incr I
If I = 64 Then I = 1 ' синусоида складывается из 64 точек (ступенек ШИМа)
Y = Lookup(i , Dta) ' выбираем значение из таблици и присваиваем переменной
Pwm1a = Y ' назначаем ШИМу скважность
Waitms 1 ' ждем чтоб задать следующую ступеньку. Тут регулируется частота. Можно это все дело посадить на таймер убрав данную строку, и время срабатывания между таймером и будет задержкой, определяющей частоту
Loop
End


Dta: ' таблица, посчитанная в эксели для функцииy=(sin(x)+1)*126 значения 0 заменены на 1 а 255 на 254 для коректной работы. Так можно задать любую форму кривой, просчитав в экселе или на бумажке нужные точки
Data 3 , 4 , 6 , 8 , 13 , 19 , 27 , 35 , 44 , 54
Data 65 , 76 , 88 , 100 , 113 , 125 , 138 , 151 , 163 , 175
Data 187 , 197 , 208 , 217 , 225 , 233 , 239 , 245 , 249 , 252
Data 253 , 254 , 253 , 252 , 251 , 248 , 244 , 238 , 232 , 224
Data 215 , 206 , 196 , 185 , 173 , 161 , 149 , 136 , 123 , 111
Data 98 , 86 , 74 , 63 , 52 , 42 , 33 , 25 , 18 , 12
Data 7 , 4 , 4 , 3

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

Код:
$regfile = "m8def.dat"
$crystal = 16000000
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 1
Dim Y As Single ,  Alfa As Single , I As Integer , Shim As Byte

Do
Alfa = 0
For I = 0 To 1680 ' кол-во точек, чем больше - тем красивее синусоида и более тяжелая обработка кода
Alfa = Alfa + 0.5 ' угол по которому считается синус
Y = Sin(alfa) : Y = Y + 1 : Shim = Y * 126 ' вычисление синусоиды
If Shim = 0 Then Shim = 1 ' если шим = 0 или 255 то будут глюки на синусоиде, поэтому условие
Pwm1a = Shim
Next
Loop
End

Считываем температуру с DS18B20 и отсылаем ее в UART

Код:
$regfile = "m8def.dat"                                      'определяем контроллер
$crystal = 8000000                                          ' Сообщаем компилятору тактовую частоту задабщего генератора микроконтроллера
$baud = 600                                                 ' use baud rate  тут несколько строк по настройке UART
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space



Config 1wire = Portd.4                                      ' на эту ножку подключим DS18B20 и подтягивающий резистор на 4,7 ком к + питания
Dim T1 As Integer
Dim T2 As Integer
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Signtemperatura As String * 1



 Do
Gosub Ware
Print T1                                                    '; Signtemperatura ; T1
Waitms 500
Loop
 Ware:
1wreset
1wwrite &HCC                                                ' Выдаем команду чтения ПЗУ
1wwrite &H44                                                ' Запуск измерения
Waitms 750                                                  ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE                                                ' Команда чтения ОЗУ датчика
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт
If Byte1 >= 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
T1 = Byte0 / 16                                             ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16                                             ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2                                                ' Формирмируем результам и выдаем его на индикатор. Команда LCD сама преобразует его в десятичный вид
 Return

Поочередно включаем лапу порта (бегущий огонь)

Код:
 $regfile = "m8def.dat"                                     ' мега8
$crystal = 8000000
Config Portb = Output
Set Portb.1
Do
Rotate Portb , Left
Wait 1
Loop

Подключение кнопки с антидребезгом

Код:
$regfile = "m8def.dat"                                      ' мега8
$crystal = 8000000
Config Pinc.4 = Input                                       'конфигурируем порты
Portc.4 = 1                                                 ' включаем внутренний подтягивающий резюк
Dim , X As Byte

Config Debounce = 30                                        ' я так понимаю что тут задаем время опроса кнопки - 30 милесекунд
                                                            ' начало основного цикла
 Do

 Debounce Pinc.4 , 0 , Knopka , Sub                         ' при замыкании кнопкой пина на землю переходим к подпрограмме обработки события

   Loop                                                     'конец основного цикла
End

Knopka:                                                     'обработка кнопки
Incr X
Return                                                      ' возвращаемся  в основной цикл программы
' при нажатии и удержании кнопки - переменная увеличится на единицу, при следующем нажатии еще на единицу.

По дисплею 16х2 от пульта ДУ (RC-5) бегает паровозик при нажатии влево-вправо

Код:
$regfile = "m8def.dat"
$crystal = 8000000
$lib "lcd4.lbx"
Config Rc5 = Pinc.0 : Enable Interrupts
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2 : Cursor Off

Dim Address As Byte , Command As Byte
Deflcdchar 1 , 28 , 4 , 20 , 7 , 16 , 4 , 27 , 4            ' replace ? with number (0-7)
Deflcdchar 2 , 4 , 24 , 24 , 30 , 17 , 5 , 26 , 4           ' replace ? with number (0-7)

Cls : Lcd Chr(1) ; Chr(2)

Do
Getrc5(address , Command)
If Address < 255 Then
Command = Command And &B01111111
If Command = 22 Then Shiftlcd Right
If Command = 21 Then Shiftlcd Left
Waitms 100
Locate 2 , 1
Lcd "    "
Locate 2 , 1
Lcd Command
If Command = 12 Then
Display Off
Powerdown
End If
End If
Loop
End

Использование аналогового компаратора

Код:
$regfile = "m8def.dat"                                      ' мега8
$crystal = 8000000
Ddrb = 1
'Acsr.7 = 0                                                  ' включаем компаратор ( но умолчанию он всегда включен ) (кстати присвоив сюда еденичку - уменьшается энергопотребление меги)

Enable Aci                                                  ' разрешаем прерывание от компаратора
On Aci Analogkomp                                           ' при срабатывании компаратора переходим к подпрограмме
Enable Interrupts

  Do
  ' можно в произвольное время подглядеть значения выхода компаратора (0 или 1) следующим образом
  'portb.0 = Acsr.5 ' в этом регистре находится результат работы компаратора 0 или 1
  Loop

 Analogkomp:
  Toggle Portb.0
 Return

'Acd включение компаратора 0 включен , 1 выключен. По дефолту там ноль , а значит при старте компаратор включен.
'ACBG - подключение к прямому входу компаратора внутреннего источника опорного напряжения (ИОН) на 1.22+(-)0.05V. Если 0 то ИОН не подключен.
'ACO - бит результата. Собственно, это и есть выход компаратора.
'ACI - флаг прерывания. Я думаю, что ты уже привык к тому, что в AVR есть прерывание на каждый чих. Компаратор не исключение. Устанавливается по событию, сбрасывается после ухода на обработчик либо программно, как всегда, записью в него 1.
'ACIE - где есть прерывание там должен быть и бит разрешения. Это он и есть. Установив в 1 мы разрешаем прерывания от компаратора. По дефолту, естественно, нуль.
'ACIC - подключение компаратора к схеме захвата таймера1. При попадании сигнала на схему захвата текущее значение с таймера тут же тырится в специальный регистр захвата, а таймер продолжает считать дальше. А в привязке к компаратору это удобно когда нужно измерять длительности сигналов.
'Биты ACIS1:ACIS0 определяет условие возникновения прерывания от компаратора:
'00 - любое изменение на входе.
'01 - зарезервировано для следующих поколений
'10 - переход с 1 на 0
'11 - переход с 0 на 1
'     Bit     7    6   5   4   3     2    1    0
'            ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0 = ACSR
'Read/Write  R/W R/W   R  R/W R/W  R/W  R/W   R/W
' Для настройки просто присваиваем ACSR нужное из вышевыбранных значений
'ACSR= &b00000000

Индикатор уровня стереосигнала ( кому интересен ADC - аналого цифровой преобразователь)

Код:
$regfile = "m8def.dat"                                      ' Работаем с ATmega8
$crystal = 1000000                                          'Работаем на частоте 8 мГц
Config Portb = Output
Config Portd = Output
Dim Channel1 As Integer , Channel2 As Integer
Config Adc = Single , Prescaler = Auto , Reference = Internal : Enable Adc : Start Adc
Do
Channel1 = Getadc(4) / 127
Channel2 = Getadc(5) / 127
Select Case Channel1
  Case 0 : Portb = 0
  Case 1 : Portb = &H01
  Case 2 : Portb = &H03
  Case 3 : Portb = &H07
  Case 4 : Portb = &H0F
  Case 5 : Portb = &H1F
  Case 6 : Portb = &H3F
  Case 7 : Portb = &H7F
  Case Is > 7 : Portb = &HFF
End Select
Select Case Channel2
  Case 0 : Portd = 0
  Case 1 : Portd = &H01
  Case 2 : Portd = &H03
  Case 3 : Portd = &H07
  Case 4 : Portd = &H0F
  Case 5 : Portd = &H1F
  Case 6 : Portd = &H3F
  Case 7 : Portd = &H7F
  Case Is > 7 : Portd = &HFF
End Select
Waitms 100
Loop

Внешнее прерывание от которого запускается подпрограмма

Код:
$regfile = "m8def.dat"                                      ' мега8
$crystal = 8000000
Ddrb = 1
Config Int0 = Falling : On Int0 Impuls : Enable Int0

Do
Loop


Impuls:
Toggle Portb.0
Return

Работа с семисегментником

Код:
$regfile = "m8def.dat"                                      ' мега8
$crystal = 8000000
Config Portb = Output , Portd = Output : Portc = &H30
Dim I As Byte , X As Byte , Cifri(4) As Byte , Vtoraya As Byte , Pervaya As Byte       'задаем всякие переменные и масивы      '
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse : Enable Timer0       ' конфигурируем таймер 0 чтоб потом на него повесить алгоритм отображения цифр ' назначаем подпрограмму, которая будет запускатся по переполнению 1го таймера

Do
Pervaya = 12                                                ' первые 2 сегмента
Vtoraya = 34                                                ' вторые 2 сегмента
Loop                                                      'конец основного цикла

Pulse:                                                      ' подпрограмма прерываний таймера0
Cifri(1) = Pervaya Mod 10 : Cifri(2) = Vtoraya / 10 : Cifri(3) = _hour Mod 10 : Cifri(4) = _hour / 10       ' вычисляем какому сегменту, какое число (1му один, 2му - два ...)
Portb = &HFF                                                ' гасим сегменты
Incr X : If X > 3 Then X = 0                                ' выбираем какой сегмент зажечь
Portd = Lookup(cifri(x + 1) , Dta)                          ' выводим цифру из таблици, соответствующую данному сегменту
Reset Portb.x                                               ' подаем питание на сегмент
Return                                                      '  возвращаемся на место откуда прервали программу
       Dta:                                                 '  таблица с данными о цифрах зажигает по порядку : 0123456789
       Data &HEF , &H8C , &HB7 , &HBE , &HDC , &H7E , &H7F , &HAC , &HFF , &HFE

Аппаратный шим на лапе OC1A PortB.1. Частота = Fкв/256 (в данном случае f= 8000000/256 = 31,25кГц):

Код:
$regfile = "m8def.dat"
$crystal = 8000000
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 1
Do
Pwm1a = 255                                                 'все время напряжение на лапе
Pwm1a = 128                                                 'меандр 50/50
Pwm1a = 0                                                   ' на лапе 0
Loop
End

Аппаратный ШИМ, генерирующий меандр в 36 кГц

Код:
$regfile = "m8def.dat"
$crystal = 8000000
Set Ddrb.1 : Tccr1a = Bits(1 , 6 , 7) : Tccr1b = Bits(0 , 3 , 4)       ' настройка аппаратного 
Ocr1a = 111                                                 'регистр сравнения
Icr1 = 222                                                  ' верхний предел счетчика
' шим перебрасывает лапу при достижении OCR1A и досчитав до верхнего предела счетчика.
End

Печатаем каждый бит переменной в UART. После процедуры значение переменной сохраняется:

Код:
$regfile = "m48def.dat"                                     ' specify the used micro
$crystal = 8000000                                          ' used crystal frequency
Dim X As Byte , Y As Byte , I As Byte
Y = &B01101000                                              ' = 104
For I = 0 To 7
Rotate Y , Left
X = Y And &B00000001
Print X
Next
Print Y                                                     ' 104
End

Оформление подпрограммы с локальными переменными, которые могут иметь название как глобальные, но это разные переменные и они могут менятся только в подпрограмме:

Код:
$regfile = "m8def.dat"                                      ' specify the used micro
$crystal = 8000000                                          ' used crystal frequency
Dim I As Byte                                               ' объявляем глобальные переменные
Declare Sub Teststr(byval I As Integer)                     ' оформляем подпрограмму с локальной переменной I,не имеющей отношения к переменной I основного цикла. Если хочешь использовать одну и туже переменную то убираешь слово byval

I = 20
Call Teststr(i)                                             ' переходим к подпрограмме передаем ее переменной значение 20
Print I                                                     ' получим 20 уже после выполнения подпрограммы

End

Sub Teststr(byval I As Byte)                                ' подпрограмма, в ней обрабатывается в своя переменная, которой было передано значение 20
  I = I + 1
 Print I                                                    ' получим 21
End Sub

Программа имитации пульта телевизора -  LG 37LV3500. (Расшифровка протокола пульта на картинке
внизу.) На пульте маркировка - AKB72915244:

Код:
'Программа эмуляции кнопки пульта ТВ LG. Код кнопок определял при помощи slyControl
'код кнопок отсылается в виде последовательности, состоящий из 32 бит.
'тут рассматриваю кнопку увиличения громкости
'Задержки P, 8500, 4330 подобраны эксперементально и годятся только конкретно для моей меги, работающие от внутреннего генератора на 8 МГц. На самом деле частота немного другая
' ИК диод должен быть припаян на минус и через резистор в 200 Ом на порт B.1. Лучше использовать транзистор.
$regfile = "m8def.dat"                                      ' мега8
$crystal = 8000000                                          ' 1 tik = 1s/8000000= 0,125mks = 0.000125ms
Dim I As Byte , Ii As Byte , X As Byte , Ir_key As Integer , Print_chr As Integer
Const P = 500 : Const T_vstuplenie = 4000                   ' Задержки в микросекундах для периода бит кода кнопки и для начальной кракозяблы
  Set Ddrb.0                                                ' тут сидит минус ИК диода. Проще схему паять в моем случае
  Set Ddrb.1 : Tccr1a = Bits(1 , 6 , 7) : Tccr1b = Bits(0 , 3 , 4) : Ocr1a = 0 : Icr1 = 222       ' настройка аппаратного ШИМа на 36 кГц для заполнения меандром посылаемых байт
Declare Sub Print_ir                                        ' оформляем подпрограмму отсылки ИК кода

Do
 Ir_key = &B0100000010111111                                ' присваиваем код кнопки
 Print_ir                                                   ' переходим в подпрограмму отсылки ИК кода
 Waitms 100
Loop
End

Sub Print_ir                                                ' подпрограмма отсылки ИК кода
Set Ddrb.1 : Waitus T_vstuplenie : Waitus T_vstuplenie : Reset Ddrb.1 : Waitus T_vstuplenie : Set Ddrb.1 : Waitus P : Reset Ddrb.1 : Waitus P       ' загагулина перед посылкой кода кнопки
Print_chr = &B0010000011011111                              ' первые 16 байт, общая часть для всех кнопок
For I = 0 To 1
  For Ii = 0 To 15                                          ' в этом цикле отсылаем на ИК диод поочередно каждый байт переменной
     Rotate Print_chr , Left
     X = Print_chr And &B0000000000000001                   ' определяем что слать по ИК 0 или 1 (разбираем  Print_chr по битам)
     If X = 1 Then : Waitus P : Waitus P : End If           ' если посылаем 1 то делаем двойную задержку перед периодом
                      Set Ddrb.1 : Waitus P                 '0 отсылка 0 - период без предзадержки
                      Reset Ddrb.1 : Waitus P

  Next
 Print_chr = Ir_key                                         ' по новой будем отсылать оставшиеся 16 бит кода кнопки
Next
End Sub                                                     'возврат в программу

http://s3.uploads.ru/t/vqp3t.png

Подключение матрицы из 64 кнопок на два порта:

Код:
'Подключение матрицы из 64 кнопок на два порта (B, D) микроконтроллера БЕЗ РЕЗИСТОРОВ, Питание кнопок организованно через внутренние "подтягивающие" резисторы МК.
'Код не боится одновременного нажатия двух кнопок (никаких замыканий не будет). Одновременное нажатие проигнорируется, но сработает сначала на первую из двух нажатых а затем на ту, которая была отпущена последней
'e-mail: P-a-h-a@yandex.ru
'Код выполняет опрос кнопок и выдает координаты нажатой кнопки в двух переменных по оси Х и по оси У (как в экселе столбци и строки)
'В железе не тестировался, в протеусе работает хорошо. Возможно для коректной работы в железе прийдется поставить задержки перед строкой X = Pinb Xor &B11111111 : Portb = 0 и перед  X = Pind Xor &B11111111 : Portd = 0
$regfile = "m8def.dat"                                      ' мега8
$crystal = 1000000
Open "comc.0:9600,8,n,1" For Output As #1                   ' для тестирования вывожу коды кнопок в софтовый уарт, т.к. аппаратный занят
Dim Number_x As Byte , Number_y As Byte , I As Byte , Z As Byte , X As Byte
Declare Sub Test_keyboard(byval I As Byte , Byval Z As Byte , Byval X As Byte)       ' Byval для того чтоб эти переменные не изменялись в подпрограмме и их можно было спокойно использовать в основном цикле


 Do                                                         'основной цикл
  Call Test_keyboard(i , Z , X)                             'вызов процедуры обработки кнопок, ее можно повесить на таймер
  If Number_x > 0 Then Print #1 , "Number_x= " ; Number_x ; " Number_y= " ; Number_y       'если код кнопки отличный от ноля то выводим результат, иначе кнопка не нажата
 Loop
End



Sub Test_keyboard(byval I As Byte , Byval Z As Byte , Byval X As Byte)       'процедура обработки кнопок
 Portd = 0 : Ddrd = 255 : Ddrb = 0 : Portb = 255            'конфиг портов на вход и выход + включение подтяжек на входах
  Number_x = 0                                              'переменная, которая будeт выдавать строку нажатой кнопки. Если нули - то кнопки отпущены
  X = Pinb Xor &B11111111 : Portb = 0                       'функция Xor инвертирует 0 и 1 числа. X = &B01111111 Xor &B11111111 результат &B10000000
  If X = 0 Then : Number_x = 0 : Number_y = 0 : Goto Vernutsja : End If       ' если не нажата ни одна кнопка то возвращаем коды кнопок - нули и  пропускаем вычисления
   For I = 0 To 7
       Z = 2 ^ I                                            ' в математике называется потенцирование,обратное действие логарифму
       If Z = X Then : Number_x = I + 1 : Exit For : End If 'есле результат потенцирования совпал с иксом то присваиваем эту степень+1 конечному результату и выходим из цикла
   Next
 Portb = 0 : Ddrd = 0 : Ddrb = 255 : Portd = 255            'Меняем местами порты В и D
  Number_y = 0
  X = Pind Xor &B11111111 : Portd = 0
 If X = 0 Then : Number_x = 0 : Number_y = 0 : Goto Vernutsja : End If       ' если кнопку уже отпустили то возвращаем коды кнопок - нули и  пропускаем вычисления
   For I = 0 To 7
        Z = 2 ^ I
        If Z = X Then : Number_y = I + 1 : Exit For : End If
   Next
 Vernutsja:
End Sub

http://s3.uploads.ru/t/TcEGC.jpg

Генерация частоты в PSK31 кодировке (прога генерирует радиомолчание 0000000...) (ниже скриншот)
о самой кодировке кодировка
граффик

Код:
$regfile = "m8def.dat"
$crystal = 16000000
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 1
Dim Y As Single , Temp As Single , Alfa As Single , Beta As Single , I As Integer , Shim As Byte , Sdvig As Byte , Ii As Byte

Do

Alfa = 0
For I = 0 To 804 ' 0
Alfa = Alfa + 0.5
Temp = Alfa / 64 : Temp = Sin(temp)
Y = Sin(alfa) : Y = Y * Temp : Y = Y + 1
Shim = Y * 126
If Shim = 0 Then Shim = 1
Pwm1a = Shim
Next
Loop
End

увеличить

увеличить

Отредактировано Pasha (2013-03-21 03:10:54)

0

10

Простые алгоритмы с кнопками :

кнопка через цикл. Добовляет переменной w единицу. Каждый раз переходит на метку nn . Работает без задержек на программу...

While Pinc.0 = 0
Incr K
      If K >= 50000 Then
      Incr W3
      K = 0
      Goto Nn
      End If
If W3 => 10 Then
W3 = 0
End If
Wend
k=0

добовляет значения единица переменной w при отжатии кнопки
If Pinc.1 = 0 Then
Waitms 100
  If Pinc.1 = 0 Then
  Flag = 1
  End If
End If

If Flag = 1 And Pinc.1 = 1 Then
Incr W3
Flag = 0
End If

If W3 => 10 Then
W3 = 0
End If



добовляет значения переменной N при нажатии кнопки и добовляет значения другой переменной M при отжатии кнопки
If Pinc.3 = 0 Then
Waitms 100
  If Pinc.3 = 0 Then
  Flag1 = 1
  Incr N
  End If
End If

If N => 10 Then
N = 0
End If

If Flag1 = 1 And Pinc.3 = 1 Then
Incr M
Flag1 = 0
End If

If M => 10 Then
M = 0
End If

Отредактировано vanno44 (2013-02-17 14:32:38)

0

11

Передача данных по UART с АЦП attiny13 на "приёмник" на Attiny 2313 с индикацией значения на ЖК дисплее.

Передатчик:

Код:
$crystal = 9600000
$hwstack = 16
$swstack = 16
$framesize = 16


Config Portb.2 = Output
Led Alias Portb.2
Config Adc = Single , Prescaler = Auto , Reference = Internal

Dim Adcin As Word

Open "comb.0:9600,8,n,1" For Output As #1
Open "comb.1:9600,8,n,1" For Input As #2
Start Adc

Do
  Set Led
  Waitms 500

  'get adc reading on channel 3 (pin 2 on attiny13)
  Adcin = Getadc(3)
  Print #1 , Adcin                                         
  Reset Led
  Waitms 500
Loop
End

Приёмник:

Код:
$regfile = "2313def.dat"
$crystal = 9600000
$hwstack = 40
$swstack = 16
$framesize = 32

Dim Adcin As Word


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


Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcd = 16 * 2

Cursor Off
 Cls
 Lcd "Test UART"
  Waitms 500

Do
 Input #2 , Adcin
Cls
   Lcd "Value:  " ; Adcin
Waitms 1000
Loop
End

0

12

везде используется софтварный уарт, в то время как у 2313 есть аппаратный

0

13

Можно и на "железном" UARTe. Просто этот подход универсальный и более удобный в плане выбора ножек.

0

14

Но весьма и весьма затратный. :no:

0

15

разные задачи диктуют разные методы решения
я бы в МК с аппаратным нормальным UART программный поднимал только в одном случае: плата уже готова, всё спаяно, но надо что-то отладить и выдать данные на свободную ногу

Хватит выяснять отношения :)

0

16

Работа с кнопками:
-быстрый отклик на кнопку(работаем по таймеру)
-при нажатии издаёт писк
- восстанавливает контакт, разрушая окислы на контактах, что даёт возможност работать не в"ДОМАШНИХ УСЛОВИЯХ)
Кнопки подключаются через резистор 300 Ом. В работе задействован 8-ми битный таймер

Код:
Knopka:                    ' 256 uS 
 If Knl = 0 Or Knm = 0 Or Knr = 0 Then 
     If Zv_t > 50 Then                    'антидребезг 
        If Zv_t < 250 Then                    ‘отсюда начинаем писк 
        If Zv_t = 200 Then Portdx = Pind             ‘ значение порта запоминаем 
         Toggle Zv 
        Else 
         Zv_t = 251 
     End If 
     Else 
       

                     ' 
     Ddrd = &B11000011                    ' переключаем ПортД на выход 
     Portd = Portd And &B10000011                             'и пропускаем ток для разрушения окислов. 
     End If 
   Incr Zv_t 
 Else 
   Zv_t = 0 
 End If 

 Ddrd = &B01000000 
 Return

В программе проверяем на нажатие как обычно, но не порт , а переменную Portdx

Код:
If Portdx.7 = 0 Then 
 Portdx = 255 
 ‘чё нибудь делаем. 
 End If

удобно тем, что в программе пишите условие обращения к кнопке и всё. Подпрограмма сама пикнет, очистит контакт, выдержет антидребезг.

0

17

Кому нада... Реализация 3 PWM на Меге8

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

'Конфигурация ног OC1B и OC1B
Config Timer1 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1 
'Конфигурация ноги OC2
Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 1


Pwm1a = 250

Pwm1b = 250

Pwm2 = 250

End

0

18

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

0

19

Не хотел создавать новую тему, решил сюда написать (можно потом удалить), так вот: не могу писать в тему "Примеры применения в среде Баском", так задумано?
Просто там уже начинает накапливаться много полезного, но качество как бы страдает, нет простого и краткого изложения примеров (в самой теме). Я понимаю, что код всё расскажет, но коль есть вероятность изучения одного из направлений, было бы полезно и интересные показания излагать (скажем в теме про АЦП и оверсемплинг, можно было подвести итог о том, что чем выше разрядность - тем медленнее происходит измерение. Возможно привести временные интервалы измерений.)

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

+1

20

RDW написал(а):

не могу писать в тему "Примеры применения в среде Баском", так задумано?


Это чтобы не писали, то не так это не так и т.д.

RDW написал(а):

вообще примеры должны быть по существу, а не сделаны все под копирку и с избыточным наполнением (как можно проще) + переменные по русски - не лучший опыт в познании программирования.


Максим без критики, всё-равно, что птица без крыльев. (не в обиду)

Что значит под копирку, может сошлётесь на копируемый материал?

А на счёт переменных на русском языке, - никто не мешает всем желающим переписать на любой другой язык. Лично мне нравится украинский, но не все его смогут понять в новой редакции нашик языковедов. Форум русскоязычный, Bascom прекрасно воспринимает кирилицу, так почему, я, не могу писать на русском языке?

Отредактировано sasha_1973 (2014-01-20 19:13:49)

0

21

Вопрос всем, кто прочитает!!!

Выкладываемый материал не нравится, больше не выкладывать и удалить то, что выложено с русскими переменными???

Или мнение RDW единственное???

Отредактировано sasha_1973 (2014-01-20 19:34:06)

+1

22

Я только ЗА!
Я считаю положительным что материал для изучения подаётся в удобном и понятном для познающего виде.  Русскоязычные переменные несколько непривычны, но удобны в том плане, что
не надо догадываться о чём переменная.

+1

23

Александр! Спасибо за статейки с примерами это большой "+ " для начинающих, т.к. вопросы у них отпадают....) То что нет писанины в теме тоже думаю хорошо, можно в личку. Зато вся статья как на ладони. По переменным вопрос думаю открытый, читабельность кода затрудняет их длинна. Национальность слов здесь не причем))) это не политика )))
Александр, может и правда переменные чуть покороче, а потом с носочками... если не трудно)
А  за проделанную работу СПАСИБО! труд многого стоит) +100

+1

24

sasha_1973 по Вашим примерам мого чему научился.Спасибо Вам большое!
По поводу русскоязычных переменных не вижу проблемы. Очень удобно для изучения материала.
Никто не  мешает переименовать их на любой другой язык.

+1

25

Нет, за работу - респект, но если она проделывается осмысленно, то почему не развернуто (выше описал суть проблемы).
Я когда открыл один из примеров - всё желание читать отпало. Столько простыни. Короче и проще должно быть (А+В=С). Основной код вообще можно постить в сам форум, а кому надо ещё и симуляцию, то всё  в архиве.
Да, с одной стороны я говрить не имею право, ибо сам ничего для этого не делаю, но с другой стороны "учеников", не должно быть отпугивания.

Отредактировано RDW (2014-01-20 20:57:11)

0

26

RDW написал(а):

Да, с одной стороны я говрить не имею прав


В споре рождается истина!

RDW написал(а):

ибо сам ничего для этого не делаю


А кто мешает, или ты хочешь сказать, что не знаешь, как????????????????????????????

RDW написал(а):

но с другой стороны "учеников", не должно быть отпугивания


Чему там отпугивать, по моему, проще не придумаешь, где спорные моменты, комментирую

+1

27

sasha_1973 написал(а):

А кто мешает, или ты хочешь сказать, что не знаешь, как????????????????????????????

Пока нет интереса, хочется что-то новое, не стандартное - пока не родилось. :D

0

28

RDW написал(а):

Пока нет интереса, хочется что-то новое, не стандартное - пока не родилось.


А поделиться тем, что знаешь и умеешь, просто так, из присущего Славянам, альтруизма???

Отредактировано sasha_1973 (2014-01-20 21:18:28)

+1

29

Хватит Вам, схватились )))  Лично мое мнение, можешь обьяснить и помочь, знаешь как и есть время это сделать, помоги.

0

30

Можно сказать, sasha_1973 голыми руками форум поднимает  :cool:  много нового материала (разжеванного)

+2


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