OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 23 Октябрь, 2017 01:45

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Суббота, 01 Сентябрь, 2012 22:14 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1922
Откуда: Красноярск
Не все аспекты использования языка и железа охвачены примерами из Astrobe. Поэтому, предлагаю добавлять разные примеры программ в этот раздел.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Суббота, 01 Сентябрь, 2012 22:16 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1922
Откуда: Красноярск
При нажатии кнопки, переключается цифра на LED-индикаторе. Пример использует готовый модуль Led7 из примеров Astrobe.
Код:
MODULE Buttontest;
  (*
    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.
Чтобы понять почему именно именно 28, 29 биты устанавливаются в 0, нужно прочитать главу 8 в Редькине про PINSEL0 и PINSEL1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Интерпретатор
СообщениеДобавлено: Воскресенье, 14 Октябрь, 2012 08:24 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1922
Откуда: Красноярск
Программа-Интерпретатор: принимает пакеты информации размером до 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 байт.


Выкладываю модуль ББ, в конце модуля текст программы для МК и закодированный архив с скомпилированной программой готовой для прошивки МК.


Вложения:
Комментарий к файлу: Интерпретатор
Interpreter.odc [44.86 КБ]
Скачиваний: 180
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Змейка
СообщениеДобавлено: Воскресенье, 14 Октябрь, 2012 09:10 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1922
Откуда: Красноярск
Пример для платы 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 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1922
Откуда: Красноярск
Оцифровка всех восьми каналов АЦП 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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Воскресенье, 26 Октябрь, 2014 21:58 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1922
Откуда: Красноярск
Обновил подсистему для интерпретатора (см. сообщение выше). Новых функций не добавилось, но я улучшил интерфейс взаимодействия с компонентом, а также написал документацию. Подсистема позволяет управлять пинами контроллера 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;


Вложения:
Mcu.7z [28.56 КБ]
Скачиваний: 150
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Вторник, 28 Октябрь, 2014 01:31 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1157
Откуда: Tel-Aviv
Этот код нельзя просто так оставлять:
Иван Денисов писал(а):
Код:
      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);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Вторник, 28 Октябрь, 2014 01:48 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2284
Откуда: Россия, Санкт-Петербург
Роман М. писал(а):
Этот код нельзя просто так оставлять:
Почему нет? Это же развёрнутый цикл, пусть будет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Вторник, 28 Октябрь, 2014 02:01 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1157
Откуда: Tel-Aviv
Александр Ильин писал(а):
Роман М. писал(а):
Этот код нельзя просто так оставлять:
Почему нет? Это же развёрнутый цикл, пусть будет.

То есть компилятор не сможет это развернуть цикл сам?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Вторник, 28 Октябрь, 2014 02:25 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2284
Откуда: Россия, Санкт-Петербург
Роман М. писал(а):
То есть компилятор не сможет это развернуть цикл сам?
Не знаю, это вы у компилятора спросите : ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Вторник, 28 Октябрь, 2014 07:09 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1922
Откуда: Красноярск
Роман М. писал(а):
Этот код нельзя просто так оставлять:
Роман тут это так сделано, чтобы показать, что легко, паттерны менять.
Код:
          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);

А в пример вставлен частный случай, когда равномерное мигание. А так то я понимаю, что с виду это образец китайского стиля :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 19:36 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4404
Откуда: Россия, Орёл
Иван, проверите, как на арме отрабатывают операции с множествами?
Код:
n := 33; s := {1}; b := n IN s


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Пятница, 14 Апрель, 2017 16:37 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 161
Прошу прощения, что встреваю, просто чуть плотнее занялся 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Пятница, 14 Апрель, 2017 17:00 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2284
Откуда: Россия, Санкт-Петербург
Artyemov писал(а):
Код:
VAR
      s, b, n :SET;
...
      n := 33; (* pos 57*)
...
  pos 57 illegal assignment

Однако, n должна быть типа INTEGER. Иначе как вы ей 33 присвоите?
Вторая ошибка о том же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Пятница, 14 Апрель, 2017 23:27 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 161
"Был неправ, вспылил"
Код:
(* =========================================================
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



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Пятница, 14 Апрель, 2017 23:47 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2284
Откуда: Россия, Санкт-Петербург
Artyemov писал(а):
Код:
VAR
   b, n :INTEGER;
   s :SET;
BEGIN
   b := n IN s; (* illegal assignment *)
Однако, IN возвращает значение типа BOOLEAN, а у вас переменная b имеет тип INTEGER.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Суббота, 15 Апрель, 2017 15:17 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 161
Стереть бы два моих предыдущих поста, что-то "затормозил" я совсем. Евгений же идентификаторами переменных на их тип указывал.
Код:
(* ==================================================================
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

Проц в данный момент недоступен, посему не обессудьте: "пешим по-конному".
Вот как-то так…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Примеры программ Oberon-07 для МК
СообщениеДобавлено: Суббота, 15 Апрель, 2017 17:46 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1922
Откуда: Красноярск
Код:
   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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2017, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB