OberonCore https://forum.oberoncore.ru/ |
|
Примеры программ Oberon-07 для МК https://forum.oberoncore.ru/viewtopic.php?f=115&t=4066 |
Страница 1 из 1 |
Автор: | Иван Денисов [ Суббота, 01 Сентябрь, 2012 22:14 ] |
Заголовок сообщения: | Примеры программ Oberon-07 для МК |
Не все аспекты использования языка и железа охвачены примерами из Astrobe. Поэтому, предлагаю добавлять разные примеры программ в этот раздел. |
Автор: | Иван Денисов [ Суббота, 01 Сентябрь, 2012 22:16 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
При нажатии кнопки, переключается цифра на LED-индикаторе. Пример использует готовый модуль Led7 из примеров Astrobe. Код: MODULE Buttontest; Чтобы понять почему именно именно 28, 29 биты устанавливаются в 0, нужно прочитать главу 8 в Редькине про PINSEL0 и PINSEL1.
(* Ivan Denisov, d.ivan.krsk@gmail.com, 2 September 2012 Button Press for Embedded Artists LPC2103 Education Board. *) IMPORT SYSTEM, LPC, Timer, Led7, Main; PROCEDURE Run; VAR counter: INTEGER; selection: SET; pushed: BOOLEAN; BEGIN (* Making sure that P0.14 is configured as GPIO *) SYSTEM.GET(LPC.PINSEL0, selection); SYSTEM.PUT(LPC.PINSEL0, (selection - {28, 29})); (* Preconditions *) counter := 0; Led7.Display(0); pushed := FALSE; (* Main loop *) WHILE TRUE DO (* Get state of all pins *) SYSTEM.GET(LPC.IOPIN0, selection); (* If P0.14 button has been pushed *) IF ~ (14 IN selection) THEN IF ~ pushed THEN IF counter = 9 THEN counter := 0 ELSE INC(counter) END; Led7.Display(counter) END; pushed := TRUE ELSE pushed := FALSE END END END Run; BEGIN Led7.Init; Run END Buttontest. |
Автор: | Иван Денисов [ Воскресенье, 14 Октябрь, 2012 08:24 ] | ||
Заголовок сообщения: | Интерпретатор | ||
Программа-Интерпретатор: принимает пакеты информации размером до 1кб, анализирует пакет и, в зависимости от его содержимого, включает или выключает те или иные ножки МК. Программа позволяет создавать упорядоченные во времени паттерны сигналов на нескольких ножках с точностью 1мкс, и может быть использована для управления устройствами, электромагнитами, реле и т.п. с ПК. Программа-интерпретатор идет в паре с модулем ББ для генерации и отправки команд на МК. Формат пакета: Код: с 1 до 5 байта - индикатор начала пакета (слово "START"); с 6 до 9 байта - длина данных после 9го байта в формате INTEGER = X; с 10 до (9+X) - данные (последовательность команд) в следующем формате: 1ый байт: 1 - включить; 2 - выключить; 3 - добавить включение в очередь; 4 - добавить выключение в очередь. 2ой байт - номер пина к которому относится команда; если 1ый = 3 или 4, то с 3го по 6ой байт - время в мкс в формате INTEGER через которое выполнится команда с момента выполнения последней команды в очереди. Таким образом, длина команды либо 2 байта либо 6 байт. Выкладываю модуль ББ, в конце модуля текст программы для МК и закодированный архив с скомпилированной программой готовой для прошивки МК.
|
Автор: | Иван Денисов [ Воскресенье, 14 Октябрь, 2012 09:10 ] |
Заголовок сообщения: | Змейка |
Пример для платы EA-EDU009. В зависимости от положения потенциометра змейка бегает по LED-дисплею с различной скоростью. Код: MODULE Snake;
(** Ivan Denisov, d.ivan.krsk@gmail.com 26 August 2011 The speed of the "snake" on LED-display dependent of resistance. **) IMPORT SYSTEM, LPC, Timer, ADC, Main; VAR pos: INTEGER; iTo7Segment: ARRAY 6 OF SET; pinMap: ARRAY 7 OF INTEGER; PROCEDURE Next; VAR i: INTEGER; segments, pin: SET; BEGIN IF pos < 5 THEN INC(pos) ELSE pos := 0 END; segments := iTo7Segment[pos]; FOR i := 0 TO LEN(pinMap) - 1 DO pin := {pinMap[i]}; IF i IN segments THEN SYSTEM.PUT(LPC.IOSET, pin) ELSE SYSTEM.PUT(LPC.IOCLR, pin) END END END Next; PROCEDURE Run; VAR i, speed: INTEGER; BEGIN WHILE TRUE DO Next; ADC.Read(0, speed); Timer.MSecDelay(speed + 10); END END Run; PROCEDURE Setup; VAR selection, direction: SET; BEGIN (* 0 ___ 5 | | 1 | 6 | --- 4 | | 2 | 3 | --- *) iTo7Segment[0] := -{0,1}; iTo7Segment[1] := -{1,2}; iTo7Segment[2] := -{2,3}; iTo7Segment[3] := -{3,4}; iTo7Segment[4] := -{4,5}; iTo7Segment[5] := -{5,0}; (* Configure pin P0.22 connected to potentiometer as ADC (AD0.0) input PINSEL1 13:12 = 11 *) (* Pins P0.16..P0.18, P0.26..P0.29 are GPIO Outputs *) SYSTEM.GET(LPC.PINSEL1, selection); SYSTEM.PUT(LPC.PINSEL1, selection + {13, 12} - {0..5, 20..27}); (* Configure pins P0.16..P0.18, P0.26..P0.29 as outputs *) SYSTEM.GET(LPC.IODIR, direction); SYSTEM.PUT(LPC.IODIR, direction + {16..18, 26..29}); ADC.PowerUp; (* Each segment is conected to pin P0.n *) (* pinMap[segment] := n *) pinMap[0] := 16; pinMap[1] := 17; pinMap[2] := 18; pinMap[3] := 26; pinMap[4] := 27; pinMap[5] := 28; pinMap[6] := 29; END Setup; BEGIN Setup; pos := 0; Run END Snake. |
Автор: | Иван Денисов [ Пятница, 21 Декабрь, 2012 16:49 ] |
Заголовок сообщения: | Оцифровка всех восьми каналов АЦП LPC2103 |
Оцифровка всех восьми каналов АЦП LPC2103 раз в секунду и вывод на компьютер через COM-порт. Код: MODULE Pressure;
IMPORT SYSTEM, LPC, ADC, Main, Out, Timer; PROCEDURE Init; VAR s: SET; BEGIN (* Configure pins connected to potentiometer as ADC inputs *) SYSTEM.GET(LPC.PINSEL0, s); s := s + {21,20}; (* P0.10, AD0.3, PINSEL0 21:20 = 11 *) s := s + {23,22}; (* P0.11, AD0.4, PINSEL0 23:22 = 11 *) s := s + {25,24}; (* P0.12, AD0.5, PINSEL0 25:24 = 11 *) SYSTEM.PUT(LPC.PINSEL0, s); SYSTEM.GET(LPC.PINSEL1, s); s := s + {13,12}; (* P0.22, AD0.0, PINSEL1 13:12 = 11 *) s := s + {15,14}; (* P0.23, AD0.1, PINSEL1 15:14 = 11 *) s := s + {17,16}; (* P0.24, AD0.2, PINSEL1 17:16 = 11 *) s := s + {19,18}; (* P0.25, AD0.6, PINSEL1 19:18 = 11 *) s := s + {21,20}; (* P0.26, AD0.7, PINSEL1 21:20 = 11 *) SYSTEM.PUT(LPC.PINSEL1, s); ADC.PowerUp END Init; PROCEDURE Run; VAR data: ARRAY 8 OF INTEGER; i: INTEGER; BEGIN WHILE TRUE DO FOR i := 0 TO 7 DO ADC.Read(i, data[i]) END; FOR i := 0 TO 7 DO Out.Int(data[i], 5) END; Out.Ln; Timer.MSecDelay(1000) END END Run; BEGIN Init; Run END Pressure. |
Автор: | Иван Денисов [ Воскресенье, 26 Октябрь, 2014 21:58 ] | ||
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК | ||
Обновил подсистему для интерпретатора (см. сообщение выше). Новых функций не добавилось, но я улучшил интерфейс взаимодействия с компонентом, а также написал документацию. Подсистема позволяет управлять пинами контроллера LPC2103, не программируя при этом контроллер, просто прошив его прилагаемой программой-интерпретатором команд. Из Блэкбокса возможно выполнять точно согласованные по времени операции с напряжением пинов. Система выдержала проверку для формирования морзянки на электромеханических-актуаторах. А сейчас мы пробуем применить это для управления пневматическими клапанами Camozzi, а также для автоматизации одной установки с гидравлическим прессом. Пример кода на Компонентном Паскале, который заставит светодиод, подключенный к pin, мигать с паузами delay четыре раза: Код: PROCEDURE Flash* (pin, delay: INTEGER);
VAR m: McuTalk.Message; BEGIN m := McuTalk.dir.NewMessage(); m.ClrLater(pin, delay); m.SetLater(pin, delay); m.ClrLater(pin, delay); m.SetLater(pin, delay); m.ClrLater(pin, delay); m.SetLater(pin, delay); m.ClrLater(pin, delay); m.SetLater(pin, delay); m.Send END Flash;
|
Автор: | Роман М. [ Вторник, 28 Октябрь, 2014 01:31 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
Этот код нельзя просто так оставлять: Иван Денисов писал(а): Код: m.ClrLater(pin, delay); m.SetLater(pin, delay); m.ClrLater(pin, delay); m.SetLater(pin, delay); m.ClrLater(pin, delay); m.SetLater(pin, delay); m.ClrLater(pin, delay); m.SetLater(pin, delay); |
Автор: | Александр Ильин [ Вторник, 28 Октябрь, 2014 01:48 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
Роман М. писал(а): Этот код нельзя просто так оставлять: Почему нет? Это же развёрнутый цикл, пусть будет.
|
Автор: | Роман М. [ Вторник, 28 Октябрь, 2014 02:01 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
Александр Ильин писал(а): Роман М. писал(а): Этот код нельзя просто так оставлять: Почему нет? Это же развёрнутый цикл, пусть будет.То есть компилятор не сможет это развернуть цикл сам? |
Автор: | Александр Ильин [ Вторник, 28 Октябрь, 2014 02:25 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
Роман М. писал(а): То есть компилятор не сможет это развернуть цикл сам? Не знаю, это вы у компилятора спросите : ))
|
Автор: | Иван Денисов [ Вторник, 28 Октябрь, 2014 07:09 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
Роман М. писал(а): Этот код нельзя просто так оставлять: Роман тут это так сделано, чтобы показать, что легко, паттерны менять.Код: m.ClrLater(pin, delay); m.SetLater(pin, delay); m.ClrLater(pin, delay + 100); m.SetLater(pin, delay); m.ClrLater(pin, delay + 300); m.SetLater(pin, delay); m.ClrLater(pin, delay + 200); m.SetLater(pin, delay); А в пример вставлен частный случай, когда равномерное мигание. А так то я понимаю, что с виду это образец китайского стиля |
Автор: | Евгений Темиргалеев [ Среда, 16 Ноябрь, 2016 19:36 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
Иван, проверите, как на арме отрабатывают операции с множествами? Код: n := 33; s := {1}; b := n IN s
|
Автор: | Artyemov [ Пятница, 14 Апрель, 2017 16:37 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
Прошу прощения, что встреваю, просто чуть плотнее занялся O7: Код: (* ============================================
MODULE HelloWord; VAR s, b, n :SET; BEGIN n := 33; (* pos 57*) s := {1}; b := n IN s; (* pos 84*) END HelloWord. =============================================== *) HelloWord pos 57 illegal assignment pos 84 not Integer compilation FAILED |
Автор: | Александр Ильин [ Пятница, 14 Апрель, 2017 17:00 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
Artyemov писал(а): Код: VAR s, b, n :SET; ... n := 33; (* pos 57*) ... pos 57 illegal assignment Однако, n должна быть типа INTEGER. Иначе как вы ей 33 присвоите? Вторая ошибка о том же. |
Автор: | Artyemov [ Пятница, 14 Апрель, 2017 23:27 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
"Был неправ, вспылил" Код: (* =========================================================
MODULE HelloWorld; VAR b, n :INTEGER; s :SET; BEGIN n :=33; s := {1}; b := n IN s; (* pos 95*) END HelloWorld. ====================================================== *) O7ARMv7MP unloaded Oberon?ARMv7-M Compiler 16.11.2016 HelloWorld pos 95 illegal assignment compilation FAILED |
Автор: | Александр Ильин [ Пятница, 14 Апрель, 2017 23:47 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
Artyemov писал(а): Код: VAR b, n :INTEGER; s :SET; BEGIN b := n IN s; (* illegal assignment *) |
Автор: | Artyemov [ Суббота, 15 Апрель, 2017 15:17 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
Стереть бы два моих предыдущих поста, что-то "затормозил" я совсем. Евгений же идентификаторами переменных на их тип указывал. Код: (* ================================================================== MODULE HelloWorld; VAR n :INTEGER; s :SET; b :BOOLEAN; BEGIN n := 33; s := {1}; b := n IN s; END HelloWorld. ================================================================== *) Oberon -> ARMv7-M Compiler 13.4.2017 HelloWorld 20 12 DFDC2123 OARMv7MLinker 11.1.2017 linking HelloWorld Ok HelloWorld 256 ROM: 584 B; RAM: 20 B O7ARMv7MTool 19.9.2014 decode HelloWorld.hex 00400000H: 0 00003FEC SUBS r7, #236 1 00002000 MOVS r0, #0 2 00000229 LSLS r1, r5, #8 3 00000040 LSLS r0, r0, #1 256 0000BF00 NOP 257 0000B500 PUSH {LR} 258 00002021 MOVS r0, #33 259 0000F8D6 ... 260 00003000 LDR.W r3, [r6] 261 00006018 STR r0, [r3] (* n := 33 -- 4 команды *) 262 00002002 MOVS r0, #2 263 00006058 STR r0, [r3, #1] ; 4 (* s := {1} -- 2 команды *) 264 00006858 LDR r0, [r3, #1] ; 4 (* R0 <- s *) 265 00006819 LDR r1, [r3] (* R1 <- n *) 266 00001C49 ADDS r1, r1, #1 (* R1 <- 34 *) 267 000041C8 RORS r0, r1 (* 34 сдвига вправо числа 2 --> 80000000H и выставлены флаги рез-та команды N = 1 *) 268 0000D501 BPL 1 ; 2 (* ветвление если рез-тат положительный, те флаг N = 0 *) 269 00002001 MOVS r0, #1 (* тк флаг N = 1, то R0 <- 1 *) 270 0000E000 B 0 ; 1 271 00002000 MOVS r0, #0 272 0000F8D6 ... 273 00003000 LDR.W r3, [r6] 274 00007218 STRB r0, [r3, #8] (* результат сохранён в ОЗУ *) 275 0000BD00 POP {PC} (* That's all folks *) 276 0000F643 ... 277 000076FC MOVW r6, #16380 ; 0x3FFC 278 0000F2C2 ... 279 00000600 MOVT r6, #8192 ; 0x2000 280 00001F30 SUBS r0, r6, #4 281 00002100 MOVS r1, #0 282 00006001 STR r1, [r0] 283 0000F643 ... 284 000070EC MOVW r0, #16364 ; 0x3FEC 285 0000F2C2 ... 286 00000000 MOVT r0, #8192 ; 0x2000 287 00006030 STR r0, [r6] 288 0000F7FF ... 289 0000FFDF BL -66 ; -33 290 0000E7FE B -2 ; -1 291 0000BF00 NOP start linear address: 00400001H Проц в данный момент недоступен, посему не обессудьте: "пешим по-конному". Вот как-то так… |
Автор: | Иван Денисов [ Суббота, 15 Апрель, 2017 17:46 ] |
Заголовок сообщения: | Re: Примеры программ Oberon-07 для МК |
Код: PROCEDURE Receive (id: CHAR; a: ARRAY OF CHAR; len: INTEGER); VAR n :INTEGER; s :SET; b :BOOLEAN; BEGIN n := 33; s := {1}; ASSERT(n IN s); ASSERT(~(n IN s)); END Receive; Срабатывает второй ASSERT |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |