А здесь по предложению Александра Д. будет форум о FastAVR. Как никак а близкий родсвенник BASCOMa
Исходники FASTa
Сообщений 1 страница 28 из 28
Поделиться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)