OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 21:15

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




Начать новую тему Ответить на тему  [ Сообщений: 166 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7, 8, 9  След.
Автор Сообщение
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Вторник, 12 Январь, 2016 00:32 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 473
Откуда: KZ
Иван Денисов писал(а):
Свой код бортового и управляющего модулей прилагаю к сообщению.

Упростил твою бортовую программу:
  • выделил таймер в отдельный модуль
  • задействовал модуль MemFormatters для того, чтобы избавиться от SYSTEM.GET в Receive
  • задействовал модуль PinCfg для настройки ножки микроконтроллера
  • убрал дублирование кода
  • упростил логику работы светодиода

Код:
MODULE IvanTestDAC1;

   IMPORT SYSTEM, ARMv7M := MicroARMv7M, MF := MicroMemFormatters,
      MCU := MicroSTM32F405, PinCfg := MicroSTM32F405PinCfg,
      Sys := MicroSTM32F405System, TP3 := MicroSTM32F405TrimblePort3,
      PeriodicTimer := IvanSysTick0;

   CONST
      periodicTimerFreq = 1024; (* Hz *)

      nChannels = 2;

   VAR
      cnt0: INTEGER;
      both: BOOLEAN;
      channels: ARRAY nChannels OF RECORD
         timeDAC: INTEGER;
         v, ts, te: INTEGER
      END;

   PROCEDURE SetDAC (chn, x: INTEGER);
   BEGIN
      ASSERT(chn DIV 2 = 0);
      IF chn = 0 THEN
         SYSTEM.PUT(MCU.DACDHR12R1, x)
      ELSE
         SYSTEM.PUT(MCU.DACDHR12R2, x)
      END
   END SetDAC;

   PROCEDURE Receive3 (id: CHAR; a: ARRAY OF CHAR; len: INTEGER);
      VAR ok, echo: BOOLEAN; v, t, r: INTEGER;
   BEGIN echo := FALSE;
      IF (id = 11X) OR (id = 12X) THEN
         IF len = 8 THEN
            r := 0;
            MF.ReadIntLE(a, r, v);
            MF.ReadIntLE(a, r, t);
            IF (v >= 0) & (v < 4096) THEN
               IF id = 11X THEN
                  SetDAC(0, v);
                  channels[0].timeDAC := t
               ELSE
                  SetDAC(1, v);
                  channels[1].timeDAC := t
               END;
               echo := TRUE
            END
         END
      ELSIF id = 15X THEN
         IF len = 24 THEN
            r := 0;
            MF.ReadIntLE(a, r, channels[0].v);
            MF.ReadIntLE(a, r, channels[0].ts);
            MF.ReadIntLE(a, r, channels[0].te);
            MF.ReadIntLE(a, r, channels[1].v);
            MF.ReadIntLE(a, r, channels[1].ts);
            MF.ReadIntLE(a, r, channels[1].te);
            both := TRUE;
            echo := TRUE
         END
      END;
      IF echo THEN TP3.Send(id, SYSTEM.ADR(a), len, ok) END
   END Receive3;

   PROCEDURE OnTimer;
      VAR over1, over2: BOOLEAN;
         chn: INTEGER;

      PROCEDURE Test (chn: INTEGER): BOOLEAN;
         VAR over: BOOLEAN;
      BEGIN
         over := FALSE;
         IF channels[chn].ts > 0 THEN
            DEC(channels[chn].ts)
         ELSIF channels[chn].ts = 0 THEN
            DEC(channels[chn].ts);
            SetDAC(chn, channels[chn].v)
         ELSE
            IF channels[chn].te > 0 THEN
               DEC(channels[chn].te)
            ELSIF channels[chn].te = 0 THEN
               DEC(channels[chn].te);
               SetDAC(chn, 0);
               over := TRUE
            ELSE
               over := TRUE
            END
         END;
         RETURN over
      END Test;

   BEGIN
      IF both THEN
         over1 := Test(0);
         over2 := Test(1);
         both := ~ (over1 & over2)
      ELSE
         chn := nChannels;
         REPEAT DEC(chn);
            IF channels[chn].timeDAC > 0 THEN
               DEC(channels[chn].timeDAC)
            ELSIF channels[chn].timeDAC = 0 THEN
               SetDAC(chn, 0);
               DEC(channels[chn].timeDAC)
            END
         UNTIL chn = 0;
         
         INC(cnt0);
         IF cnt0 MOD periodicTimerFreq = 0 THEN
            SYSTEM.PUT(MCU.GPIODBSRR, {12 + 16}) (* !~PD12 *)
         ELSIF cnt0 MOD periodicTimerFreq = periodicTimerFreq DIV 2 THEN
            SYSTEM.PUT(MCU.GPIODBSRR, {12}) (* !PD12 *)
         END               
      END
   END OnTimer;

   PROCEDURE MainLoop;
   BEGIN
      REPEAT
         IF PeriodicTimer.OnTimer() THEN            
            OnTimer
         END;
         TP3.Receive(Receive3);
         ARMv7M.WFI
      UNTIL FALSE
   END MainLoop;

   PROCEDURE Init;
      VAR chn: INTEGER;

      PROCEDURE InitLED;
      BEGIN
         PinCfg.Configure(PinCfg.D, 12, PinCfg.output,
            PinCfg.pushPull, PinCfg.low, PinCfg.noPull, 0)
      END InitLED;

      PROCEDURE InitDAC;
         VAR x: SET;
      BEGIN
         (* enable GPIOA = 0 *)
            SYSTEM.GET(MCU.RCCAHB1ENR, x);
            SYSTEM.PUT(MCU.RCCAHB1ENR, x + {0});
         (* enable DAC clock, DACEN = 29 *)
            SYSTEM.GET(MCU.RCCAPB1ENR, x);
            SYSTEM.PUT(MCU.RCCAPB1ENR, x + {29});
         (* PA4, PA5: AIN *)
            SYSTEM.GET(MCU.GPIOAMODER, x);
            SYSTEM.PUT(MCU.GPIOAMODER, x - {8..11});
         (* Disable buffer BOFF1 = 1, BOFF2 = 16  *)
            SYSTEM.GET(MCU.DACCR, x);
            x := x - {1, 17};
         (* Reset TEN1 = 2 and TEN2 = 18 *)
            x := x - {2, 18};
         SYSTEM.PUT(MCU.DACCR, x);
         (* Enable EN1 = 0, EN2 = 16  *)
         SetDAC(0, 0);
         SetDAC(1, 0);
         SYSTEM.GET(MCU.DACCR, x);
         SYSTEM.PUT(MCU.DACCR, + {0, 16})
      END InitDAC;

   BEGIN
      both := FALSE;
      cnt0 := 0;

      chn := nChannels;
      REPEAT DEC(chn);
         channels[chn].timeDAC := 0
      UNTIL chn = 0;

      InitLED;
      InitDAC;
      TP3.Init(19200, TP3.parityNone);
      PeriodicTimer.Init(periodicTimerFreq)
   END Init;

BEGIN
   Init;
   MainLoop
END IvanTestDAC1.

Код:
MODULE IvanSysTick0;

   (*
      Alexander Shiryaev, 2015.03

      SysTick timer for producing periodic events
   *)

   IMPORT SYSTEM, ARMv7M := MicroARMv7M,
      Sys := MicroSTM32F405System;

   VAR flag: BOOLEAN;

   PROCEDURE* SysTickIntHandler;
   BEGIN flag := TRUE
   END SysTickIntHandler;

   PROCEDURE Init* (freq: INTEGER);
      CONST delay1sec = Sys.HCLK DIV 8; (* STM32F40x *)
         (* SYSTCSR bits: *)
            ENABLE = 0; TICKINT = 1; CLKSOURCE = 2;
      VAR x: INTEGER;
   BEGIN
      SYSTEM.PUT(ARMv7M.SYSTCSR, {}); (* disable SysTick *)
      flag := FALSE;
      (* NOTE: timer is 24-bit! *)
      (* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Babieigh.html *)
         x := delay1sec DIV freq - 1;
         ASSERT(x > 0);
         ASSERT(x < 1000000H);
         SYSTEM.PUT(ARMv7M.SYSTRVR, x);
      SYSTEM.PUT(ARMv7M.SYSTCVR, 0); (* any write to current clears it *)
      SYSTEM.PUT(Sys.VectorsOrg + ARMv7M.SysTick * 4, SysTickIntHandler);
      SYSTEM.PUT(ARMv7M.SYSTCSR, {ENABLE,TICKINT}) (* enable timer with clock source of system clock / 2 with interrupts *)
   END Init;

   PROCEDURE OnTimer* (): BOOLEAN;
      VAR res: BOOLEAN;
   BEGIN
      res := flag; IF res THEN flag := FALSE END
   RETURN res
   END OnTimer;

END IvanSysTick0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Вторник, 12 Январь, 2016 10:42 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
Иван Денисов писал(а):
Artyemov писал(а):
Иван, вы не удивились почему не сработало?

SYSTEM.PUT(SYSTEM.ADR(a1), v1);
и т.д.

Запихнуть 6 INTEGER-ов (адрес каждого должен быть кратен 4-ём - про целевую архитектуру не забываем) в массив SHORTCHAR-ов (который может располагаться (ужас!!!) даже по нечётному адресу) - в общем, строгой типизацией не пахнет (:

Я не совсем понял Вас...


Не вопрос, поясню.
Итак, SYSTEM.PUT(SYSTEM.ADR(a0), v1) (и далее аналогичные выражения) по адресу нулевого элемента массива типа SHORTCHAR помещает величину типа INTEGER.
Фокус в том, что массив типа SHORTCHAR может располагаться по любому (в том числе нечётному - худший случай) адресу, а 32-разрядная величина (INTEGER) по адресу кратному 4. В этом случае SYSTEM.PUT должна вызвать исключение. Не так ли?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Вторник, 12 Январь, 2016 10:46 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Что мешает размещению четырёх байт значения типа INTEGER в четыре байта начиная с SYSTEM.ADR(a0)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Вторник, 12 Январь, 2016 11:55 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
По отдельности - ничего. Как одно целое (слово), да по нечётному (в общем случае) адресу - архитектура процессора не даст. Здесь идёт речь о ARM (напомню).

INTEGER - является одним целым?

SYSTEM.PUT(SYSTEM.ADR(a0), v1): v1 здесь будет разделена на байты?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Вторник, 12 Январь, 2016 12:33 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Ну, в целом, надо сначала уточнить, а потом выдвигать гипотезы, обычно так поступают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Вторник, 12 Январь, 2016 12:43 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
Пётр Кушнир писал(а):
Ну, в целом, надо сначала уточнить, а потом выдвигать гипотезы, обычно так поступают.


Так гипотеза это как раз то, что должно быть уточнено ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Вторник, 12 Январь, 2016 13:03 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Artyemov писал(а):
Здесь идёт речь о ARM (напомню).
Нет, это программа управляющая. Она не на ARM.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Вторник, 12 Январь, 2016 13:41 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
Иван Денисов писал(а):
Artyemov писал(а):
Здесь идёт речь о ARM (напомню).
Нет, это программа управляющая. Она не на ARM.


Теперь получилось: исходно я не понял :) - ветка то про Oberon ARMv7E-M


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Пятница, 04 Март, 2016 00:38 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 473
Откуда: KZ
Добавил реализацию базовых системных модулей для поддержки микроконтроллеров STM32F103x{8,B} (Cortex-M3), являющихся основой для дешёвых плат LeafLabs Maple Mini


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Пятница, 11 Март, 2016 02:06 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 473
Откуда: KZ
Целочисленная реализация ФНЧ:
Код:
MODULE ObxLPFInt;

   (*
      Alexander Shiryaev, 2016.01

      Simple integer implementation of low-pass filter

      https://en.wikipedia.org/wiki/Low-pass_filter
   *)

   TYPE
      LPF* = RECORD (* low-pass filter *)
         rc*, n*: INTEGER
      END;

   PROCEDURE Init* (VAR f: LPF; x, n: INTEGER);
   BEGIN
      f.rc := LSL(x, n);
      f.n := n
   END Init;

   PROCEDURE Set* (VAR f: LPF; x: INTEGER);
   BEGIN
      f.rc := LSL(x, f.n)
   END Set;

   PROCEDURE Put* (VAR f: LPF; x: INTEGER);
   BEGIN
      f.rc := f.rc + x - ASR(f.rc, f.n)
   END Put;

   PROCEDURE Get* (f: LPF): INTEGER;
   BEGIN
   RETURN ASR(f.rc, f.n)
   END Get;

END ObxLPFInt.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Пятница, 29 Апрель, 2016 12:26 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Компилятора Александра Ширяева использую уже в одной лабораторной установке для контроля четырех потоков (давлений, которые создают потоки).

Вложение:
res2.png
res2.png [ 1.07 МБ | Просмотров: 7040 ]


В установке использован микроконтроллер STM32F103C8T6, который управляет по I2C четырьмя 12-битными ЦАП микросхемами MCP4725.

Микроконтроллер принимает команды из Блэкбокса, отправляет команды ЦАПам, которые формируют управляющее напряжение для контроллеров давления ITV. Ну а контроллеры в свою очередь формируют заданное давление на выходе (на входе подается 1.5 атмосферы).

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

Вот тут видео разместил:
https://twitter.com/dia_magnetic/status ... 7347179520


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Пятница, 29 Апрель, 2016 13:55 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
))) Да ты прям дизайнер. Всё у тебя ровно, стаканы в ряд, чистые, и кнопки на форме по линии)) Мой комбат бы оценил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Суббота, 30 Апрель, 2016 18:01 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Симпатично :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Понедельник, 02 Май, 2016 11:46 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
А ардуиновый Оберон сделать насколько сложно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Понедельник, 02 Май, 2016 16:19 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Kubanych писал(а):
А ардуиновый Оберон сделать насколько сложно?
Так AVR компилятор давно лежит здесь http://svn.assembla.com/svn/oberonru/trunk/AVRCompiler
Только не ясно насколько он работоспособен. Я приведённые там примеры компилировал, заливал в Arduino... 2 дня проковырялся но ничего так и не заработало.
По-мому, там компилятор генерирует какую-то хрень. Во всяком случае, дизассемблер показывал странную последовательность инструкций.
PS. Компилятор запускается под A2


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Понедельник, 02 Май, 2016 16:39 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Тут велось обсуждение AVR компилятора http://a2os.org.ua/forums/forums.php?forum=17


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Понедельник, 02 Май, 2016 18:40 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Ярослав Романченко писал(а):
Только не ясно насколько он работоспособен. Я приведённые там примеры компилировал, заливал в Arduino... 2 дня проковырялся но ничего так и не заработало.
Так компилятор поди под AVR32, а ардуины на 8-ми битном


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Понедельник, 02 Май, 2016 19:22 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Kemet писал(а):
Так компилятор поди под AVR32, а ардуины на 8-ми битном
А там ни одного вразумительного комментария, ни документации... Можно только догадываться, какой там компилятор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Вторник, 03 Май, 2016 16:26 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
8 битный ардуиновый Оберон сделать насколько сложно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор Oberon → ARMv6-M, ARMv7E-M
СообщениеДобавлено: Среда, 04 Май, 2016 06:48 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Kubanych писал(а):
8 битный ардуиновый Оберон сделать насколько сложно?

Вот та плата на которой я сделал лабораторную установку она как раз совместима с Ардуино. Так что "ардуиновый Оберон" уже есть, если я правильно понимаю о чем вы говорите. Для 8-битных контроллеров нет особого смысла делать Оберон, так как типы данных плохо ложатся на 8 бит. Вирт специально под 32-битные спецификацию сузил, нету больше SHORTINT. А 32-битные микроконтроллеры уже по 100 рублей есть (хотя есть задачи промышленные, где это дорого...). Так что выкиньте ваш 8-ми битный контроллер и купите новую ARM-v6/v7 плату за 300 рублей.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 166 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7, 8, 9  След.

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


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

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


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

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