А здесь по предложению Александра Д. будет форум о FastAVR. Как никак а близкий родсвенник BASCOMa 
Исходники FASTa
Сообщений 1 страница 28 из 28
Поделиться12009-12-10 11:52:31
Поделиться22009-12-10 12:17:22
ну, поспорю: не столько родственник, сколько коллега 
СКАЧАТЬ FastAVR: FastAVR-413-Free.zip
начнем:
вот ссылка на введение в среду разработки программ для FastAVR. Скажем, часть Первая. http://pic-avr.narod.ru/FastAVR_Rus-01-03.zip
вот отличительные особенности FastAVR: (позволю себе цитату со своего сайта)
Самым удобным компилятором я считаю "FastAVR" (MicroDESIGN). Синтаксис Basic подобного языка.
Очень удобный и продуманный интерфейс. Встроенны "помощники": "терминал", калькулятор таймеров, знакогенератор для ЖК и другое... Отличительная особенность: генерирует стандартный ассемблер AVR. Можно посмотреть сгенерированный код.
Я пробую переводить фирменное описание к данному этому компилятору. Буду выкладывать частями, по мере перевода материалов. Ссылка http://pic-avr.narod.ru/avr/compilers.htm
Отредактировано Александр Д. (2009-12-10 13:26:20)
Поделиться32009-12-10 12:23:35
первая програма. В FastAVR, как и во многих компиляторах этого уровня, есть встроенная поддержка пультов ДУ (стандарт RC5). Но встроенная функция мне не понравилась. Я написал свою программу.
Она ждет нажатия кнопки на любом пульте, после чего выдает четыре байта в последовательном коде в COM порт со скоростью 19200: первые два символа - адрес (условно назвал) и два -данные. Для того, чтобы привязать пульт к совему устройству достаточно обрабатывать именно эти последние два байта.
как работает программа: она НЕ декодирует RC5! я поставил задачу ОТЛИЧИТЬ одну нажатую на пульте кнопку от другой, поэтому бифазное кодирование (принятое в RC) не стал декодировать. Я поступил проще: длинная пачка импульсов - ноль, короткая - один. ВСЁ. Задача выполнена точно. Программа написана так, чтобы не использовать прерывания и таймер - а вдруг в другой программе я задействую их?
уточнение: четвёртый байт - инверсное значение третьего
' Считываем с фотоприемника данные ИК-пульта
' Выдаем в RS-232 как 4 строки символов (0-255)
' Не использует прерываний и таймера
$Device= attiny2313 ' used device
$Stack = 32 ' stack depth
$Clock = 8 ' adjust for used crystal
$Baud = 19200
$Def in_signal = PIND.6
Declare Function RX () As Byte
Dim temp As Byte
Dim DATA_DISEqC1 As Byte, DATA_DISEqC2 As Byte
Dim DATA_DISEqC3 As Byte, DATA_DISEqC4 As Byte
'- Инициализация всей периферии
DDRD=0: PORTD =0 ' INPut
DDRB=255: PORTB =0 ' OUTput
Print "Start"
start_prog: ' ------- НАЧАЛО ПРОГРАММЫ --- Основной цикл ---
WaitMs 100
While Not in_signal: Wend
aa: temp = 248 ' Ждём _длинную_ паузу в сигнале >7500 us!
ab: If in_signal Then GoTo aa
WaitUs 3 ' Пауза
Decr temp: If temp >1 Then GoTo ab
bb: temp = 110 ' Ждём _длинный сигнал
bc: If Not in_signal Then GoTo bb
WaitUs 3 ' Пауза
Decr temp: If temp >1 Then GoTo bc
While in_signal: Wend ' Ждем завершения сигнала
DATA_DISEqC1 = RX()
DATA_DISEqC2 = RX()
DATA_DISEqC3 = RX()
DATA_DISEqC4 = RX()
Print DATA_DISEqC1
Print DATA_DISEqC2
Print DATA_DISEqC3
Print DATA_DISEqC4
Print
GoTo start_prog
'================== Функции ===================
'===================== примем 8 бит ============
Function RX() As Byte
Local tiki As Byte, temp3 As Byte, DATA_RX As Byte
For temp3 = 7 To 0 Step -1
tiki=0
Shift(Left, 1, DATA_RX)
While Not in_signal: Wend ' Ждем 1
WaitUs 30 ' пауза на часть импульса
While in_signal
Incr tiki: WaitUs 1 ' Пауза 10 мкс
Wend
If tiki >100 Then DATA_RX = DATA_RX Or 1 'длинный -> бит =1
While in_signal: Wend ' Ждем завершения сигнала
Next temp3
Return DATA_RX
End FunctionОтредактировано Александр Д. (2009-12-10 13:28:12)
Поделиться42009-12-10 12:29:08
а вот исходник, в котором принятые с пульта данные выдаются на ЖК индикатор НТ-1613 по два байта
добавлена фишка: мигает свдиод при распознавании посылки от пульта, удобно и красиво 
вот видео работы устройства:
http://narod.ru/disk/24822911000/MOV00014.3gp.html
' Считываем с фотоприемника данные ИК-пульта
' Выдаем на индикатор НТ-1613 по два байта
' Не использует прерываний и таймера
$Device= attiny2313 ' used device
$Stack = 32 ' stack depth
$Clock = 8 ' adjust for used crystal
$Def in_signal = PIND.6
$Def pinLCDdat = PORTB.0
$Def pinLCDclk = PORTB.1
$Def LED = PORTB.2
Declare Sub SendLCD(LCDdataX As Byte)
Declare Sub ScrollLCD(LCDdvigatSinvolov As Byte)
Declare Sub SendLCDstring(LCDdataX As Byte)
Declare Function RX () As Byte
Dim temp As Byte
Dim DATA_1 As Byte, DATA_2 As Byte
Dim DATA_3 As Byte, DATA_4 As Byte
Dim stringS As String*3, stringSv As String*1
'- Инициализация всей периферии
DDRD=0: PORTD =0 ' INPut
DDRB=255: PORTB =0 ' OUTput
start_prog: ' ------- НАЧАЛО ПРОГРАММЫ --- Основной цикл ---
WaitMs 100
While Not in_signal: Wend
aa: temp = 248 ' Ждём _длинную_ паузу в сигнале >7500 us!
ab: If in_signal Then GoTo aa
WaitUs 3 ' Пауза
Decr temp: If temp >1 Then GoTo ab
bb: temp = 110 ' Ждём _длинный сигнал
bc: If Not in_signal Then GoTo bb
WaitUs 3 ' Пауза
Decr temp: If temp >1 Then GoTo bc
While in_signal: Wend ' Ждем завершения сигнала
led =1
DATA_1 = RX()
DATA_2 = RX()
DATA_3 = RX()
DATA_4 = RX()
led =0
ScrollLCD(10) ' Очистим экран
SendLCDstring (DATA_1)
ScrollLCD(1)
SendLCDstring (DATA_2)
ScrollLCD(1): SendLCD (13)
Wait 1
ScrollLCD(10) ' Очистим экран
SendLCDstring (DATA_3)
ScrollLCD(1)
SendLCDstring (DATA_4)
ScrollLCD(1): SendLCD (12)
GoTo start_prog
'------------- символ в число ------------
Sub SendLCDstring(LCDdataX As Byte)
Local temp4 As Byte
stringS = Str(LCDdataX)
For temp4= 1 To Len (stringS)
stringSv= Mid(stringS, temp4, 1)
LCDdataX = Val(stringSv)
SendLCD (LCDdataX)
Next
End Sub
'---------- Один символ на экран ---------
Sub SendLCD(LCDdataX As Byte)
Local tiki As Byte, temp2 As Byte, temp As Byte
If LCDdataX =0 Then LCDdataX =10
pinLCDclk =1 ' CLK
tiki= 128
Shift(Left, 4, LCDdataX)
For temp2 = 0 To 3
temp = LCDdataX & tiki
If temp =0 Then
pinLCDdat =0 ' Data
Else
pinLCDdat =1 ' Data
End If
pinLCDclk = 0: WaitUs 1
pinLCDclk = 1: WaitUs 1
Shift(Right, 1, tiki): If tiki =0 Then tiki = 128
Next
End Sub
'===================== примем 8 бит ============
Function RX() As Byte
Local tiki As Byte, temp3 As Byte, DATA_RX As Byte
For temp3 = 7 To 0 Step -1
tiki=0
Shift(Left, 1, DATA_RX)
While Not in_signal: Wend ' Ждем 1
WaitUs 30 ' пауза на часть импульса
While in_signal
Incr tiki: WaitUs 1 ' Пауза 10 мкс
Wend
If tiki >100 Then DATA_RX = DATA_RX Or 1 'длинный -> бит =1
While in_signal: Wend ' Ждем завершения сигнала
Next
Return DATA_RX
End Function
' --------- Скроллинг экрана на X символов --------
Sub ScrollLCD(LCDdvigatSinvolov As Byte)
Local temp2 As Byte, temp As Byte
pinLCDdat =0 ' Data
For temp = 1 To LCDdvigatSinvolov
For temp2 = 0 To 3
pinLCDclk = 0: WaitUs 1 ' CLK
pinLCDclk = 1: WaitUs 1 ' CLK
Next
Next
End SubОтредактировано Александр Д. (2010-09-13 13:24:39)
Поделиться52009-12-12 11:42:49
А нет ли рабочего кода для обмена данными по RS232 и динамической индикации на таймере?
Поделиться62009-12-12 11:56:25
не понял вопрос, а именно "по таймеру"
поподробнее 
Поделиться72009-12-12 13:18:17
Работу со светодиодными индикаторами обычно организовывают на прерываниях таймера. Допустим каждую 1/100 секунды срабатывает таймер и изменяет информацию на выходах порта.
Поделиться82009-12-12 14:46:46
хм
это две задачи: прием из UART и обновление на индикатор
проблем не вижу, но как реализовать и ЗАЧЕМ _ТАК_ извращаться
пришли данные - принял и выдал, а потом обновляй время от времени...
так можно
Поделиться92009-12-12 14:49:26
вот еще исходник, сегодня сделал
программа иммитирует нажатие кнопок пульта спутникового ресивера: выдает определённую последовательность кнопок.
Устройство подключается к выходу ИК-приемника в подчиненном устройстве (в моем случае - спутниковый ресивер) через резистор 400-600 Ом.
' Устройство иммитирует нажатия клавиш ИК пульта
' сп. ресивера Golden Interstar-8001
' "нажимает" Menu-OK-0000-KeyRight-Info-Info
' Подключать через резистор на выход ИК-приемника в ресивере
$Device= attiny13 ' used device
$Stack = 32 ' stack depth
$Clock = 4.8 ' adjust for used crystal
$Def LED = PORTB.3
$Def SenderPult = PORTB.2
$Def my_Key = PINB.0
Declare Sub SendStart()
Declare Sub Senddata(baitD As Byte)
Declare Sub SendEnd()
Dim temp22 As Byte
Const Down = 0, Up = 1
Const adrPult_1=32, adrPult_2=8
Const Menu_1=48, Menu_2=207
Const OK_1=168, OK_2=87
Const Move_Right_1=200, Move_Right_2=55
Const Info_1=248, Info_2=7
Const Null_1=0, Null_2=255
DDRB=255: PORTB =0 ' OUTput
' ---- Начало программы ----
LED = 0
SenderPult = Up: WaitMs 255
SendStart() ' Передаем преамбулу
Senddata (adrPult_1) ' Передаем данные
Senddata (adrPult_2)
Senddata (Menu_1)
Senddata (Menu_2)
SendEnd()
SendStart() ' Передаем преамбулу
Senddata (adrPult_1) ' Передаем данные
Senddata (adrPult_2)
Senddata (OK_1)
Senddata (OK_2)
SendEnd()
For temp22 = 0 To 3 ' "Вводим" PIN - 0000
SendStart() ' Передаем преамбулу
Senddata (adrPult_1) ' Передаем данные
Senddata (adrPult_2)
Senddata (Null_1)
Senddata (Null_2)
SendEnd()
Next
SendStart() ' Передаем преамбулу
Senddata (adrPult_1) ' Передаем данные
Senddata (adrPult_2)
Senddata (Move_Right_1)
Senddata (Move_Right_2)
SendEnd()
SendStart() ' Передаем преамбулу
Senddata (adrPult_1) ' Передаем данные
Senddata (adrPult_2)
Senddata (OK_1)
Senddata (OK_2)
SendEnd()
SendStart() ' Передаем преамбулу
Senddata (adrPult_1) ' Передаем данные
Senddata (adrPult_2)
Senddata (Info_1)
Senddata (Info_2)
SendEnd()
SendStart() ' Передаем преамбулу
Senddata (adrPult_1) ' Передаем данные
Senddata (adrPult_2)
Senddata (Info_1)
Senddata (Info_2)
SendEnd()
LED = 1
Do
LED = 1
WaitMs 50
LED = 0
WaitMs 50
Loop
'========= Передаем преамбулу ==========
Sub SendStart()
SenderPult = Down
WaitMs 8: WaitUs 65
SenderPult = Up ' ____/----\____
WaitMs 4: WaitUs 28
SenderPult = Down
WaitUs 57
End Sub
'========= Передаем 8 импульсов ==========
Sub Senddata(baitD As Byte)
Dim tiki As Byte, temp2 As Byte, temp As Byte
tiki= 128
For temp2 = 0 To 7
temp = baitD & tiki
SenderPult = Up
WaitUs 51
temp = temp & tiki
If temp <>0 Then WaitUs 106
SenderPult = Down
Shift(Right, 1, tiki)
If tiki =0 Then tiki = 128
WaitUs 59
Next
End Sub
'======== Передаем импульс завершения ========
Sub SendEnd()
SenderPult = Up
WaitMs 45
SenderPult = Down
WaitMs 9
SenderPult = Up
WaitMs 2
SenderPult = Down
WaitUs 58
SenderPult = Up
WaitMs 500 ' Пауза между нажатиями кнопок пульта
End SubОтредактировано Александр Д. (2009-12-12 14:56:37)
Поделиться102009-12-12 15:58:38
хм
это две задачи: прием из UART и обновление на индикатор
проблем не вижу, но как реализовать и ЗАЧЕМ _ТАК_ извращаться пришли данные - принял и выдал, а потом обновляй время от времени...
так можно
Так я и хочу два куска кода по двум задачам, а получилось, что описал как одну...
Поделиться112009-12-12 16:27:38
надо подумать, у меня есть старые исходники, но там ВРОДЕ не по таймеру было сделано...
нет, такого нет
С таким не работаю, хотя как закончу разводить плату, могу и подумать над этим 
вот рабочий пример: мигает свдиод по таймеру
$Device= attiny2313
$Stack = 32
$Clock = 8
$Timer1= Timer, Prescale=256
$Def pinLed = PORTB.2
Declare Interrupt Ovf1()
Dim tiki As Byte
'- Инициализация всей периферии
DDRD=0: PORTD =255 ' INPut
DDRB=255: PORTB =255 ' OUTput
Timer1=&h85ee ' 1 sec time @ 8MHz
Enable Ovf1
Enable Interrupts
Start Timer1
Start_prog: ' ------- НАЧАЛО ПРОГРАММЫ --- Основной цикл ---
GoTo Start_prog
'/////////////////////////////////////////////////////////
Interrupt Ovf1(), Save All
Timer1=&h85ee ' 1 sec time @ 8MHz
Toggle pinLed
End InterruptОтредактировано Александр Д. (2009-12-12 16:53:00)
Поделиться122009-12-14 10:56:13
А где есть не глючный FastAVR?
У меня 4.3.0 при нажатии кнопки програматор всегда закрываеться....
Отредактировано AlexandrM (2009-12-14 11:16:45)
Поделиться132009-12-14 11:45:42

проблема не в FastAVR, а в том что ВЫ НЕ УКАЗАЛИ программе программу- программатор
сделать так:
Tools - Find Programmer
в открывшемся окне указать на файл .exe программы-программатора
После этого Ваша "проблема" исчезнет 
Отредактировано Александр Д. (2009-12-14 14:29:35)
Поделиться142010-08-29 20:22:56
доброго всем дня
Пропадал: дела, дела 
вот, новенькое для новичков:
Программа управления двумя разрядами 7-сегментного индикатора. Но подключен индикатор через сдвиговый регистр 74HC595, а сегменты индикатора подключена не out1=a, out2=b...out7=точка, а так, как было удобно разводить плату
вот сам код и схема:
индикатор с общим анодом, т.е.. диодики загорятся при подаче нуля с выхода сдвигового регистра
$Device= mega8 $Stack = 32 $Clock = 4 $Def Led7_1 = PORTB.5 $Def Led7_2 = PORTB.4 $Def Led7Load = PORTB.1 $Def Led = PORTB.3 $ShiftOut Data=PORTB.0, Clock=PORTB.2, Lsb Dim n As Byte '- Инициализация всей периферии DDRD=0: PORTD =255 ' INPut DDRB=255: PORTB =0 ' OUTput DDRC=0: PORTC =0 ' INput For n = 0 To 4 Toggle Led WaitMs 100 Next n Led7_1 = 0 ' Выключили оба индикатора Led7_2 = 0 n = 164 ' Это данные символа, который необходимо вывести на индикатор ShiftOut n ' Выдаём байт в регистр Led7Load = 0 ' Низкий уровень на "загрузка" регистра WaitMs 1 Led7Load = 1 ' Загружаем регистр, вывод данных на ножки регистра WaitMs 1 Led7Load = 0 Do Led7_1 = 1 ' Включаем первый индикатор WaitMs 1 Led7_1 = 0 WaitMs 10 Toggle Led: WaitMs 10 ' Мигнём св диодом Loop '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
Поделиться152012-07-06 15:19:55
Александр Д. Повторил исходник в 11 посте и эмулировал в протеусе. На тамере1 все работает. Меняю на таймер0, протеус виснет. Тот же код (с необходимыми изменениями) в Bascom'е работает без проблем. Проверить в железе возможности нет.
У вас таймер0 на тиньке 2313 нормально работает от FastAVR?
Поделиться162012-07-06 15:29:26
Вполне возможно что ошибка в коде.
Нужно было выложить вариант с использованием таймера 0.
Поделиться172012-07-06 16:18:46
Жаль это всё не развивается больше, нет поддержки новых кристаллов.
Поделиться182012-07-06 16:20:13
Да, собственно, вместо 1 написал 0 и предустановку таймера изменил на &h64:
$Device= attiny2313
$Stack = 32
$Clock = 8
$Timer0= Timer, Prescale=256
$Def pinLed = PORTB.2
Declare Interrupt Ovf0()
Dim tiki As Byte
'- Инициализация всей периферии
DDRD=0: PORTD =255 ' INPut
DDRB=255: PORTB =255 ' OUTput
Timer0=&h64 '
Enable Ovf0
Enable Interrupts
Start Timer0
Start_prog: ' ------- НАЧАЛО ПРОГРАММЫ --- Основной цикл ---
GoTo Start_prog
'/////////////////////////////////////////////////////////
Interrupt Ovf0(), Save All
Timer1=&h64 '
Toggle pinLed
End InterruptХочется верить, что это только глюк протеуса
Отредактировано MACTEPok (2012-07-06 16:25:16)
Поделиться192012-07-06 16:24:12
FastAVR решил помучать только из за того, что Bascom слишком объемные прошивки компилит для маленьких кристаллов. На тиньке 2313 написал проект в Bascom'е, получилось впритык. А понадобилось добавить обработку нажатия одной кнопки, и все, места уже нет. Надеюсь в FastAVR втолкать.
Поделиться202012-07-08 21:32:29
На меге8 прерывания от таймера0 обрабатываются корректно. на тиньке2313 висит.
Поделиться212012-07-09 14:21:58
Мда, в общем сам нарыл
Пишет :
;-Line--0050----Enable Ovf0 sbrzl,0x01 outTIMSK,zl
А нужно:
;-Line--0050----Enable Ovf0 sbrzl,0x02 outTIMSK,zl
Регистры в библиотеке прописаны правильно:
;***** TIMSK ****** .equ TOIE1 = 7 .equ OCIE1A = 6 .equ OCIE1B = 5 .equ ICIE1 = 3 .equ OCIE0B = 2 .equ TOIE0 = 1 .equ OCIE0A = 0 .equ TICIE = 3
Меня интересует бит TOIE0
Товарищи, как заставить компилятор правильно устанавливать биты?
Менял значение вручную, прошивка в протеусе начинает нормально работать.
Отредактировано MACTEPok (2012-07-09 14:24:09)
Поделиться222015-11-11 21:35:29
Здравствуйте. Проблема с прерываниями в Мега 8.
Мега 8 управляет модулем SIM900D по UART.
Если код без цикла, то прерывание, в данном случае Urxc, работает.
$Device= m8
$Clock = 16.0
$Baud = 19200
$Stack = 32
Declare Interrupt Urxc()
Declare Interrupt Int0()
Declare Sub Sendsms()
Declare Sub Balanse()
.......................
DDRD.1=1 'Порт на выход
PORTD.1 = 0
DDRD.0=0 'Порт на вход
PORTD.0=1
Balanse()
Enable Urxc
Enable Int0
Enable Interrupts
'###########################################################################
'Основная программа
'###########################################################################
'Do
........................
'Loop
End
'============================================================================
'============================================================================
Sub Balanse()
Print "AT+CUSD=1,";Chr(34);"#101#";Chr(34)
WaitMs 100
End Sub
'подпрограмма для разбора сообщения модуля
'=============================================================================
Interrupt Urxc(),Save All
S = ""
Do
InputBin B 'берем символ из буфера
If B=0 Then
Exit Do
End If
If B>31 Then
S=S+Chr(B)
End If
Loop
Otvet = S
Sendsms()
End Interrupt
'подпрограмма отправки смс
'=============================================================================
Sub Sendsms()
K=&h1A
Print "AT+CMGS=";Chr(34);Phonenumber;Chr(34)
WaitMs 200
Print Otvet
PrintBin K
WaitMs 100
End SubЕсли просто запустить цикл, без Balanse() в начале, то после принятия сообщения по UART. скажем "RING", когда звонишь модулю, никакого прерывания не происходит. Внешнее перывание по INT0 не срабатывает. Такое впечатление что прерывания вообще не работают, если запущен бесконечный цикл...... Что делать?
Поделиться232015-11-11 21:39:51
какая версия компилятора?
как изначально инициализируете gsm-модуль? как настраиваете в плане выдачи сообщений о поступлении звонка и/или SMS?
Поделиться242015-11-11 22:52:11
Версия 4.1.3. Пробывал 4.3.0. Не помогает. Изначально модуль через терминал настроен на работу со скоростью 19200 бод, в GSM кодировке и через терминал все работает, в смысле позвонить, СМС и все такое... В плане выдачи сообщений предполагалось читать содержимое буфера по прерыванию Urxc и принимать дальнейшее решение что делать дальше. Но, в процессе отладки, выяснилось, что на прерывания,когда программа в цикле не реагирует.
Поделиться252015-11-11 22:55:29
хм
а что выдатся в asm файл? там подробная расшифровка. Не смотрели, есть разница в инициализации прерывания?
может баг какой у компилятора?
Поделиться262015-11-11 23:52:46
Вот и я хм... Компиляторов использовал две версии 4.1.3 и 4.3.0. В asm выдает
;-Line--0117----Enable Interrupts-- sei ;-Line--0118----Enable Urxc-- sbiUCSRB,7
И все вроде так, как надо. И в AVR Simulator IDE 2.39 все бегает и в SREG бит I устанавливается. И при имитации Urxc переходит на подпрограмму прерывания. Все есть, только не в реале, а если в реале, то не в цикле... Шайтан-железяка какая-то.
Отредактировано Alexlon (2015-11-11 23:55:52)
Поделиться272015-11-12 00:08:25
В коде нет подпрограммы с именем Int0().
Поделиться282015-11-12 00:13:08
Согласен, нет. Просто убрал из листинга. По INT0() должна отправляться СМСка. Отправки нет.
Отредактировано Alexlon (2015-11-12 00:27:12)