Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 14:39

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 151 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10, 11  След.
Автор Сообщение
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Пн авг 20, 2012 16:27 
Не в сети

Зарегистрирован: Ср май 10, 2006 13:51
Сообщения: 202
Благодарил (а): 3 раз.
Поблагодарили: 4 раз.
Ethereal писал(а):
Не уверен, что этот вариант самый короткий, но зато он у меня получился
...

Код рабочий, подтверждаю!
Спасибо, а то я весь вечер голову ломал, как отловить переход счетчика через границу :)
Но это что-то из серии "трюков".


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Пн авг 20, 2012 19:20 
Ethereal, видит бог, я всеми силами пытался вычленить хотя бы крупицу осмысленного из вышеприведённой тобой сумасбродной лабуды. Доселе ум мой никогда не работал столь возбуждённо, упорно, я бы даже сказал лихорадочно. Только по прошествии многих минут я наконец понял, что бьюсь словно рыба об лёд, и, учитывая тот феноменальный запал, коим я был объят, решил сфокусироваться на чём-нибудь более тривиальном, но, в отличие от дешифровки алгоритмов мышления имбецила, достижимом. Выбор мой пал на доказательство гипотезы Римана.

Я не питаю иллюзий и хорошо представляю, до чего лакомым объектом выгляжу в глазах всякого, будь то мудрец, невежда, гений или бездарь. Прежде всего это и вынуждает меня крайне щепетильно отсортировывать собеседников. И впрямь, не могу же я тратить своё драгоценное время на всякого представителя из отряда парнокопытных, нет, дело даже вовсе не в тщеславии или высокомерии, но в том, что опыт такого общения окажется бесполезен для обоих. Так что, к сожалению, мне претит уделять внимание человеку, за чьим ником я распознал дурака, - предрассудки, но что сделаешь. Если же говорить о выяснении отношений посредством аргументированного спора на почве расхождения имеющейся у каждого информации, будь он, спор, обоснован или ради себя самого, то я бы с куда большим удовольствием предался ему с законченным софистом, нежели с кирпичом. Имеется масса весёлых занятий, допустим, можно нарисовать смайл на пальце и играть с ним в города, на мой взгляд, это куда продуктивней, чем обмениваться мнениями с квадратным организмом.

Резюмируя замечу, что ты походишь на пьяного вдрызг плотника, которому сунули учебник по информатике, иначе твой бред объяснить невозможно.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Пн авг 20, 2012 22:14 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Зацените какой Зингер выдал поток словоблудия и как он в нем старательно избежал хоть что-нибудь сказать по существу.
oco писал(а):
Код рабочий, подтверждаю!
Спасибо, а то я весь вечер голову ломал, как отловить переход счетчика через границу :)
Но это что-то из серии "трюков".
В этом алгоритме нету трюков. В нем все осмысленно. Смотри.

Представь себе 16-разрядные числа в виде кольца. Пусть точка ноль на этом кольце смотрит прямо тебе в пузо.
На этом кольце есть две особые точки.
1.) Точка ноль. В ней, если при сложении или вычитании число проскочит через переход знаково -1..0 или беззнаково 65535..0, то будет выставлен перенос/заем. Перенос/заем говорит нам, что если сложение/вычитание программист мыслил беззнаковым, то результат его неправильный.
2.) Вторая особая точка 0x8000 - на самом дальнем краю кольца. В ней, если при сложении или вычитании число проскочит через переход знаково 32767..-32768 или беззнаково 32767..32768, то будет выставлено переполнение. Переполнение говорит нам, что если сложение/вычитание программист мыслил знаковым, то результат его неправильный. Короче, представь все то, что не способен понять Zinger. Представил ?

А тогда представляй наш алгоритм.
1.) Первое что мы в нем делаем - это прибавляем к индексу цикла приращение. Ну это нам так и так придется сделать. Потом мы копируем новый индекс цикла во временную переменную TMP. Она нам еще пригодится.
2.) Теперь представь, что где-то на числовом кольце присутствуют точками старый индекс цикла, новый индекс и предел.
3.) Давай вычтем из нового индекса цикла TMP предел цикла. Смысл такого вычитания в том, что мы берем числовое кольцо руками и поворачиваем его так, чтобы предел цикла стал как бы новым нулем и смотрел бы теперь нам в пузо. Вместе с кольцом повернутся и новый индекс цикла и старый. Точнее новый индекс мы повернем вычитанием на деле, а старый индекс и предел давай повернем аналогичным вычитанием, но мысленным.
4.) Если при переходе от старого индекса к новому, индекс проскочит (в любом направлении) переход предел_цикла-1..предел_цикла (стоп, мы же кольцо уже повернули, значит теперь это переход -1..0), то цикл завершился. Но если при переходе от старого индекса к новому индекс цикла проскочил этот переход, то и при обратном переходе от нового индекса к старому он опять его проскочит. Ну так и давай будем проделывать обратный переход и смотреть проскакивается переход или нет. Для прямого перехода нужно было прибавлять приращение, значит для обратного перехода нужно приращение вычесть. Короче говоря, делаем - вычитаем из TMP приращение (в реализации алгоритма я это вычитание заменил сравнением, смотри ниже) и смотрим проскочен ли интервал -1..0 при обратном переходе. Если да - цикл завершен. Если нет, то нет.
5.) Рассмотрим самые критичные и простые случаи - TMP был -1 и стал 0 от приращения 1, TMP был 0 и стал -1 от приращения -1.
Если прямой переход был от -1 к 0, то в прямом направлении было -1+1=0, т.е. 0xFFFF+1=0 - перенос, а в обратном 0-1=-1, т.е. 0-1=0xFFFF - заем. Ура !!! Прохождение интервала -1..0 зафиксировано !
Если прямой переход был от 0 к -1, то в прямом направлении было 0+(-1)=-1, т.е. 0+0xFFFF=0xFFFF - нет переноса, а в обратном -1-(-1)=0, т.е. 0xFFFF-0xFFFF=0 - нет заема. Облом !!! Интервал -1..0 не проходился. Потому-что путь от 0 к 0xFFFF и от 0xFFFF к 0 (беззнаковый путь, потому-что перенос для беззнаковых чисел) прошел не через интервал -1..0, а по всему остальному огромному кольцу кроме этого интервала.
Так-что перенос в качестве подходящего критерия окончания цикла не подходит.
6.) Тогда сделаем вот что - вычтем предварительно из TMP число 0x8000. Т.е. развернем числовое кольцо на 180 градусов. Теперь уже другая особая точка 0x8000 смотрит нам в пузо. И рассмотрим критичные случаи.
Если прямой переход был от -1 к 0, упс.. теперь уже это переход от 0x7FFF к 0x8000, то в прямом направлении было 32767+1=-32768 - переполнение, а в обратном -32768-1=32767 - переполнение. Ура ! Пересечение интервала зафиксировано !
Если прямой переход был от 0 к -1, упс.. теперь уже это переход от 0x8000 к 0x7FFF, то в прямом направлении было -32768+(-1)=32767 - переполнение, а в обратном 32767-(-1)=-32768 - переполнение. Ура ! Пересечение интервала опять зафиксировано !
Значит переполнение прекрасно подходит в качестве критерия пересечения интервала знаменующего собой окончание цикла !

Именно это я на ассемблере и написал. Лишь в самом хвосте алгоритма вместо вычитания использовал сравнение, поскольку сравнение - это то же самое вычитание, только разность не записывается никуда.

Так-что алгоритм был не трюк. В нем каждая команда соответствует замыслу.



За это сообщение автора Ethereal поблагодарил: oco
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Вт авг 21, 2012 01:39 
Не в сети

Зарегистрирован: Ср май 10, 2006 13:51
Сообщения: 202
Благодарил (а): 3 раз.
Поблагодарили: 4 раз.
Спасибо, теперь понятно. Вся соль в флаге переполнения, я же пытался решить задачу "в лоб", не беря его во внимание вообще.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Ср авг 22, 2012 01:53 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Зингер, извиняться будем ?
Или по прежнему будешь стоять на том, что я - плотник, прочитавший учебник по информатике ?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Ср авг 22, 2012 07:49 
Не в сети
Аватара пользователя

Зарегистрирован: Вт май 23, 2006 04:10
Сообщения: 129
Благодарил (а): 44 раз.
Поблагодарили: 5 раз.
Ethereal писал(а):
Зингер, извиняться будем ?
Или по прежнему будешь стоять на том, что я - плотник, прочитавший учебник по информатике ?

Ethereal, здравствуйте!

когда-то Д.Менделеев ответил, (не помню в беседе с кем, но
явно молодым понтовым товарищем) на пренебрежительное
высказывание о некоем плотнике, не имеющем образования,
примерно следующее: "...Вы знаете, а ведь он в своём
деле владеет основами, и при желании легко может добавить к своим знаниям и [...]".

Вот я, к примеру, периодически балуюсь по-плотницкой части
дома, для души, и получаю от этого
весомое удовольствие :shuffle;
http://files.mail.ru/59PCBC

PS Железную пожарную лестницу и посуду :wink:
делал не я, зато всё остальное - своими ручками :oops:

PPS Так шта , просто не берите в голову эти младопонтовые
дешёвые наезды -- zinger'у до плотника
как Собчак-балерине до Волочковой :wink:

PPPS Прошу прощения у Модераторов за лёгкий оффтоп :?



За это сообщение автора zehotello поблагодарил: Ethereal
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Пт авг 24, 2012 19:22 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
To oco :
А чего не выкладываешь исправленный вариант ?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Пн авг 27, 2012 00:57 
Не в сети

Зарегистрирован: Ср май 10, 2006 13:51
Сообщения: 202
Благодарил (а): 3 раз.
Поблагодарили: 4 раз.
Ethereal писал(а):
To oco :
А чего не выкладываешь исправленный вариант ?

По твоему совету тестирую на файле tester.f
Как закончу, выложу.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Вт авг 28, 2012 01:06 
Не в сети

Зарегистрирован: Ср май 10, 2006 13:51
Сообщения: 202
Благодарил (а): 3 раз.
Поблагодарили: 4 раз.
Итак, после всестороннего тестирования :) версия 1.0:

! оптимизированы по литералам DO, ?DO и +LOOP
! слова >> и << изменены на RSHIFT и LSHIFT
! слова: . LEAVE приведены к стандарту
+ добавлены слова: UNLOOP D< D0< FM/MOD SPACE SPACES U. */ <>
- удалены слова: M/MOD
! исправлены слова: MIN CMOVE UM/MOD 2SWAP
! подправлен листинг
! доработан дизассемблер
! исправлен баг в SP-FORTH, когда отдельно взятый знак "-" воспринимается как число 0
+ добавлен пример: examples/tester.spf, программа тестирования правильности выполнения слов

http://compas.com.ua/oco/file/avrforth-1.0.tar.gz

to ethereal: благополучно использовал твой UM/MOD, надеюсь будешь не против :)
Кстати, в твоем viaforth +loop реализовано по другому, без флага переполнения.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Вт авг 28, 2012 02:26 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
oco писал(а):
to ethereal: благополучно использовал твой UM/MOD, надеюсь будешь не против :)
Пользуйся на здоровье. :D
oco писал(а):
Кстати, в твоем viaforth +loop реализовано по другому, без флага переполнения.
Тут есть один нюанс.

Вот это :
Код:
                add     I_lo, PRIR_lo           ;Сосчитаем новый
                adc     I_hi, PRIR_hi           ; индекс цикла
                movw    TMP_hi:TMP_lo, I_hi:I_lo
                sub     TMP_lo, PRED_lo
                sbc     TMP_hi, PRED_hi
                subi    TMP_hi, $80             ;TMP+=0x8000 или TMP-=0x8000
                cp      TMP_lo, PRIR_lo
                cpc     TMP_hi, PRIR_hi
                brvc    Цикл_продолжить         ;Случилось переполнение ?
Цикл_завершить:
строго согласно стандарту ANS-Forth.

А вот это
Код:
                add     I_lo, PRIR_lo           ;Сосчитаем новый
                adc     I_hi, PRIR_hi           ; индекс цикла
                mov     TMP_I_hi, I_hi
                cp      I_lo, PRED_lo
                sbc     TMP_I_hi, PRED_hi
                eor     TMP_I_hi, PRIR_hi       ;У них разный знак ?
                brmi    Цикл_продолжить
Цикл_завершить:
на две команды короче, но не соответствует стандарту ANS-Forth, поскольку написано в предположении, что циклы +LOOP всегда монотонные и приращение в них всегда имеет один и тот-же знак. Кстати, именно такие циклы +LOOP в стандарте FIG-Forth (поскольку исходник FIG-Forth - сам себе стандарт).

Но согласно стандарту ANS-Forth в нем возможны циклы +LOOP вида "два шага вперед, один шаг назад" или вида "шагаем назад, но иногда на месте". Циклы в которых индекс накопительного типа. Циклы в которых приращение меняется на разных оборотах цикла, в т.ч. может менять и свой знак.
Например : DO ... IF -1 ELSE 0 THEN +LOOP
Вот такие циклы с первым вариантом кода работать будут, а со вторым уже нет.

Тут выбор - или строго согласно стандарту ANS-Forth, но на две команды длиннее и потому медленнее или на две команды короче и, соответственно, быстрее, но не по стандарту, хотя и близко.

Мы вели разговор в духе ANS-Forth, я и предложил первый вариант. А в своем Форте для смарт-карт я словари сознательно сделал как в FIG-Forth и Forth-79, т.е. сознательно лепил гибрид, поэтому от того, что я еще и +LOOP сделал как в FIG-Forth хуже не станет.



За это сообщение автора Ethereal поблагодарил: oco
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Сб сен 08, 2012 02:32 
Не в сети

Зарегистрирован: Ср май 10, 2006 13:51
Сообщения: 202
Благодарил (а): 3 раз.
Поблагодарили: 4 раз.
Версия 1.1:
+ заготовка к библиотеке usart (реализован вывод без прерываний)
+ пример tst_usart.spf
! "причесан" tester.spf, добавлен вывод сообщений на терминал
! оптимизировано по литералам слово CELLS
+ новые слова SP" ." CR .SN .S [CHAR]
+ расширены возможности вывода отладочных сообщений
+ дополнена документация

http://compas.com.ua/oco/file/avrforth-1.1.tar.gz


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Вс янв 13, 2013 02:52 
Не в сети

Зарегистрирован: Ср май 10, 2006 13:51
Сообщения: 202
Благодарил (а): 3 раз.
Поблагодарили: 4 раз.
Готова новая версия AVRForth 1.2
Самое значительное обновление в этой версии то, что я собирался сделать уже давно, - облегчение доступа к портам ввода-вывода, группировка линий и организация шин.
К этому меня подтолкнула статья http://easyelectronics.ru/rabota-s-port ... na-si.html
где автор мучает шаблоны С++. В форте гораздо все проще, так как во время компиляции сам форт нам уже доступен.
Вкратце опишу, что получилось и как этим пользоваться.
С самого начала доступ к портам был прост: надо установить определенный бит или биты в PORTx, пишем:
Код:
BITS{ 1 3 5 }BITS PORTB SET

Сразу видно, что происходит, но есть и недостаток. Линии надо настроить на выход или на вход, делается аналогично:
Код:
BITS{ 1 3 5 }BITS DDRB SET

Если нужно поменять порт, к которому подключена периферия, его придется поменять в нескольких местах. А если вдруг нужно будет перебросить одну из линий на другой порт? В этом случае так просто не обойдешься. Хотелось абстрагироваться от способа подключения периферии к контроллеру.
Итак, теперь что вышло.
Есть несколько уровней абстракции:
1. Порты, линии и группы линий (REQUIRE {WRITE} lib/ports.spf)
Порты ввода-вывода теперь описаны структурой
Код:
0x0
CELL -- port
CELL -- ddr
CELL -- pin

Для каждого порта фиксируется соответствующие ему регистры.
Линии порта - Pxx, например PB0, PC1, PD7 и т.д. Они оставляют на стеке системы-хоста маску и адрес соответствующей структуры. Сама линия определяется словом WIRE.
Кроме того, определены слова {SET}, {CLEAR}, {TOGGLE}, которые устанавливают "1", "0" или инвертируют уровень на выходе линии. Словами {INPUT}, {OUTPUT} можно настроить линию на вход или выход, {PULL_UP} - подключить внутренние подтягивающие резисторы.
Читается значение из порта словом {READ}, записывается - {WRITE}.
Пока ничего особенного, есть только одно улучшение - Возможность не использовать напрямую регистры PORTx, DDRx, PINx. Пример:
Код:
\ линии
PB1 WIRE LED
PB4 WIRE BTN

: testport
    LED {OUTPUT}    \\ на выход
    LED {TOGGLE}    \\ переключть
    PB1 {TOGGLE}    \\ или так
    BTN {INPUT}     \\ на вход
    BTN {PULL_UP}   \\ включить подтяжку
    BEGIN
        {PORTB} {READ}  \\ прочитать порт
        BTN GROUP.MASK AND IF
            LED {SET}
        ELSE
            LED {CLEAR}
        THEN
    AGAIN
;

Все очень просто. GROUP.MASK дает маску нужной линии.
Теперь объединим линии в группы:
Код:
\ группы
GROUP{ PD0 PD1 PD2 PD3 }GROUP DATA

: testgroup
    DATA {OUTPUT}   \ настроить все линии на выход
    DATA {SET}      \ на всех линиях лог. "1"
    0x01 DATA GROUP.PORT {WRITE} \ записать значение в порт группы
;

Пока это не очень полезно, так как все линии одной группы должны физически находится на одном порту.

Теперь переходим к главному:
2. Шины (REQUIRE BUS.WRITE lib/bus.spf)
Шины позволяють группировать линии портов ввода-вывода в логическую структуру. Пример:
Код:
\ пример обращения к шинам
\     15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0
BUS{                         PC3 PD7 PD6 PD5 PD4 PD3 PC4 PB3 PB1 PB0 }BUS DATA1

: data1_write ( w -- )
    DATA1 BUS.WRITE
;
: data1_read ( -- w )
    DATA1 BUS.READ
;

Здесь определена шина DATA1, 0-й бит которой подключен к линии 0 порта B, 1-й - к 1 линии порта B, 2-й к 2 линии порта B и т.д.
BUS.WRITE записывает слово со стека в заданную шину (максимальная разрядность - 16 бит). Аналогично производится и чтение.
Я постарался оптимизировать эти операции, где возможно, используется sbi/cbi, bld/bst, при записи константы код получается компактнее.
Слова BUS.INPUT, BUS.OUTPUT настраивают шину на вход или выход, BUS.PULL_UP - включает подтягивающие резисторы.
Фрагмент ассемблерного листинга:
Чтение:
Код:
: data1_read
000C2 93AA   r26 -[Y] st
000C4 93BA   r27 -[Y] st
000C6 B306   r16 0x16 in
000C8 27BB   r27 clr
000CA 27AA   r26 clr
000CC FB03   3 r16 bst
000CE F9A2   2 r26 bld
000D0 2F20   r16 r18 mov
000D2 7023   0x3 r18 andi
000D4 2BA2   r18 r26 or
000D6 B303   r16 0x13 in
000D8 FB03   3 r16 bst
000DA F9B1   1 r27 bld
000DC FB04   4 r16 bst
000DE F9A3   3 r26 bld
000E0 2733   r19 clr
000E2 B320   r18 0x10 in
000E4 7F28   0xF8 r18 andi
000E6 0F22   r18 lsl
000E8 1F33   r19 rol
000EA 2BA2   r18 r26 or
000EC 2BB3   r19 r27 or
000EE 9508   ret

Запись:
Код:
: data1_write
000F0 2700   r16 clr
000F2 FBA2   2 r26 bst
000F4 F903   3 r16 bld
000F6 019D   r26 r18 movw
000F8 7023   0x3 r18 andi
000FA 2B02   r18 r16 or
000FC B3E8   r30 0x18 in
000FE 7FE4   0xF4 r30 andi
00100 2BE0   r16 r30 or
00102 BBE8   r30 0x18 out
00104 2700   r16 clr
00106 FBB1   1 r27 bst
00108 F903   3 r16 bld
0010A FBA3   3 r26 bst
0010C F904   4 r16 bld
0010E B3E5   r30 0x15 in
00110 7EE7   0xE7 r30 andi
00112 2BE0   r16 r30 or
00114 BBE5   r30 0x15 out
00116 019D   r26 r18 movw
00118 9535   r19 asr
0011A 9527   r18 ror
0011C 7F28   0xF8 r18 andi
0011E 2F02   r18 r16 mov
00120 B3E2   r30 0x12 in
00122 70E7   0x7 r30 andi
00124 2BE0   r16 r30 or
00126 BBE2   r30 0x12 out
00128 91B9   [Y]+ r27 ld
0012A 91A9   [Y]+ r26 ld
0012C 9508   ret

Настроить на выход
Код:
\ DATA1 output
002F0 9AB8   0 0x17 sbi
002F2 9AB9   1 0x17 sbi
002F4 9ABB   3 0x17 sbi
002F6 9AA3   3 0x14 sbi
002F8 9AA4   4 0x14 sbi
002FA B3E1   r30 0x11 in
002FC 6FE8   0xF8 r30 ori
002FE BBE1   r30 0x11 out

Если шина элементарная, например
Код:
BUS{                                 PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0 }BUS DATA6

то и чтение/запись вырождаются в такой код:
Код:
: data6_read
0029E 93AA   r26 -[Y] st
002A0 93BA   r27 -[Y] st
002A2 B3A3   r26 0x13 in
002A4 27BB   r27 clr
002A6 9508   ret
: data6_write
002A8 BBA5   r26 0x15 out
002AA 91B9   [Y]+ r27 ld
002AC 91A9   [Y]+ r26 ld
002AE 9508   ret

В файле tst_bus.spf есть несколько тестовых примеров, в папке с ним есть и тестовый файл для протеуса.

Еще изменения в этой версии:
+ новое слово FCONST - обычная константа форта
+ новое слово NIBBLE-SWAP (переставить нибблы в младшем байте слова)
+ комментарии в листинге с помощью слова \\
+ библиотека lcd переписана с помощью шин
+ makefile в папке examples, который позволяет скомпилировать все примеры сразу

В документации пока всего этого еще нет
Скачать можно тут:
http://compas.com.ua/oco/file/avrforth-1.2.tar.gz

P.S. Прошу прощения за несколько сумбурное изложение.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Чт янв 24, 2013 17:29 
Не в сети

Зарегистрирован: Ср май 10, 2006 13:51
Сообщения: 202
Благодарил (а): 3 раз.
Поблагодарили: 4 раз.
Версия 1.3, январь 2013
! исправлены ошибки
! частота CPU теперь задается в герцах
+ оптимизация
+ добавлены слова VECT, IS, EXP2
! слово EMIT переопределено через VECT
! все слова дают ошибку при попытке использовать их не во время целевой компиляции
+ добавлена функция вывода больших цифр и букв в библиотеку LCD (см. пример lcd_big)
+ прерывание таймера переписано на ассемблере, добавлена функция удаления задачи из очереди (eertos)
+ библиотека buttons переписана с помощью групп портов (ports.spf)
+ дополнена документация

Скачать можно тут:
http://compas.com.ua/oco/file/avrforth-1.3.tar.gz


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Пн фев 11, 2013 20:58 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Собирался ли данный Форт для "резидентного" размещения в AVR разных по флешу контроллеров, например, от 8Кб, 16Кб ...
чтобы, по возможности, "уйти" от кросс компиляции отлаживаемого устройства.

P.S. В данный момент интересут сборка под AVR8515 с возможность дозагрузки программы в доп устанавливаемоё ОЗУ, например с SD канала связи
или микросхемы флеш памяти. Смотрел вариант "утаптывания" amForth (пока с версии 4.2) в 8Кб решение где-то близко с минимальным "урезанием"
базиса системы. Далее по возможности рассмотрю что можно переделать в ff303 для возможно гибкой сборки целевых сборок по возможностям
"разных" AVR и не только Форт систем. :shuffle;
Для Atmega8515 набрал файл описания девайся (надеюсь, что не ошибся:) для Уарт можно его именовать, как 0-й т.к. он аппаратно один.
Код:

\ 8515 INITIALISATION

mega8515 CONSTANT DEVICE

0x2000 TO ROM-SIZE
0x0060 TO RAM-BOTTOM
0x0200 TO RAM-SIZE
RAM-BOTTOM RAM-SIZE + TO RAM-TOP

0x0080 TO RSTACK-SIZE
RAM-TOP RSTACK-SIZE - TO SPTR0
0x2    TO VECTOR-SIZE               

HAS_MOVW                           
HAS_MUL  \

\ 001 constant INT_INT0   \ External Interrupt0
\ 002 constant INT_INT1   \ External Interrupt1
\ 003 constant INT_T1CAP  \ Timer1 capture
\ 004 constant INT_T1COMA \ Timer1 compare A
\ 005 constant INT_T1COMB \ Timer1 compare B
\ 006 constant INT_T1OV   \ Timer1 overflow
\ 007 constant INT_T0OV   \ Timer0 overflow
\ 008 constant INT_SPI    \ SPI  Serial Transfer Complete
\ 009 constant INT_URC    \ UART Receive Complete
\ 00A constant INT_UTE    \ UART Data Register Empty
\ 00B constant INT_UTC    \ UART Transmit Complete
\ 00C constant INT_ANA    \ Analog Comparator
\ 00D constant INT_INT2   \ External Interrupt2
\ 00E constant INT_T0COM  \ Timer0 compare
\ 00F constant INT_EER    \ EEPROM Ready
\ 010 constant INT_SPM_READY    \ Store Program Memory Complete

\ 011 constant ROM_FREE   \ code starts here

\ ***** I/O Register Definitions in RAM space  *********************************

\ ***** I/O Register Definitions in I/O space  *********************************

0x5F == SREG  \ Status Register
0x5E == SPH   \ Stack Pointer High
0x5D == SPL   \ Stack Pointer Low

0x5B == GICR  \ General Interrupt Control Register
0x5A == GIFR  \ General Interrupt Flag Register

0x59 == TIMSK \ Timer/Counter Interrupt Mask register
0x58 == TIFR  \ Timer/Counter Interrupt Flag register

0x57 == SPMCR   \ Store Program Memory Control Register
0x56 == EMCUCR  \ Extended MCU Control Register
0x55 == MCUCR   \ MCU Control Register
0x54 == MCUCSR  \ MCU Control And Status Register

0x53 == TCCR0   \ Timer/Counter0 Control register
0x52 == TCNT0   \ Timer/Counter0 register
0x51 == OCR0    \ Timer/Counter0 Output Compare register

0x50 == SFIOR  \ Special Function IO Register

0x4F == TCCR1A \ Timer/Counter Control Register A
0x4E == TCCR1B \ Timer/Counter Control Register B
0x4D == TCNT1H \ Timer/Counter High Byte
0x4C == TCNT1L \ Timer/Counter Low Byte

0x4B == OCR1AH \ Timer/Counter1 Output Compare register A High Byte
0x4A == OCR1AL \ Timer/Counter1 Output Compare register A Low Byte
0x49 == OCR1BH \ Timer/Counter1 Output Compare register B High Byte
0x48 == OCR1BL \ Timer/Counter1 Output Compare register B Low Byte

0x45 == ICR1H  \ Timer/Counter Input Capture Register High byte
0x44 == ICR1L  \ Timer/Counter Input Capture Register Low byte

0x41 == WDTCR  \ WatchDog Timer Control Register
\ 0x40 == UBRRH see down

0x3F == EEARH   \ EEPROM Address Register High Byte
0x3E == EEARL   \ EEPROM Address Register Low Byte
0x3D == EEDR    \ EEPROM Data Register
0x3C == EECR    \ EEPROM Control Register

0x3B == PORTA
0x3A == DDRA
0x39 == PINA

0x38 == PORTB
0x37 == DDRB
0x36 == PINB

0x35 == PORTC
0x34 == DDRC
0x33 == PINC

0x32 == PORTD
0x31 == DDRD
0x30 == PIND

0x27 == PORTE
0x26 == DDRE
0x25 == PINE

0x2F == SPDR  \ SPI Data Register
0x2E == SPSR  \ SPI Status Register
0x2D == SPCR  \ SPI Control Register

0x2C == UDR0    \ USART I/O Data Register
0x2B == UCSR0A  \ USART Control and Status register A
0x2A == UCSR0B  \ USART Control and Status register B
0x40 == UCSR0C  \ U
0x40 == UBRR0H  \ USART Baud Rate Register High byte
0x29 == UBRR0L  \ USART Baud Rate Register Low byte

0x28 == ACSR   \ Analog Comparator Control And Status Register

0x24 == OSCCAL \ Oscillator Calibration Value

\ ***** Bit Definitions ********************************************************

\ $3F ($5F) SREG
\ 0x7 == I
0x6 == T
0x5 == H
0x4 == S
0x3 == V
0x2 == N
0x1 == Z
0x0 == C

\ $3E ($5E) SPH
0x7 == SP15
0x6 == SP14
0x5 == SP13
0x4 == SP12
0x3 == SP11
0x2 == SP10
0x1 == SP9
00 == SP8

\ $3D ($5D) SPL
07 == SP7
06 == SP6
05 == SP5
04 == SP4
03 == SP3
02 == SP2
01 == SP1
00 == SP0

\ $3C ($5C) XDIV reserved

\ $3B ($5B) GICR
07 == INT1
06 == INT0
05 == INT2
01 == IVSEL
00 == IVCE

\ $3A ($5A) GIFR
07 == INTF1
06 == INTF0
05 == INTF2

\ $39 ($59) TIMSK
07 == TOIE1
06 == OCIE1A
05 == OCIE1B
03 == TICIE1
01 == TOIE0
00 == OCIE0

\ $38 ($58) TIFR
07 == TOV1
06 == OCF1A
05 == OCF1B
03 == ICF1
01 == TOV0
00 == OCF0

\ $37 ($57) SPMCR
07 == SPMIE
06 == RWWSB
04 == RWWSRE
03 == BLBSET
02 == PGWRT
01 == PGERS
00 == SPMEN

\ $36 ($56) EMCUCR
07 == SMO
06 == SRL2
05 == SRL1
04 == SRL0
03 == SRW01
02 == SRW00
01 == SRW11
00 == ISC2

\ $35 ($55) MCUCR
07 == SRE
06 == SRW10
05 == SE
04 == SM1
03 == ISC11
02 == ISC10
01 == ISC01
00 == ISC00

\ $34 ($54) MCUCSR
05 == SM2
03 == WDRF
02 == BORF
01 == EXTRF
00 == PORF

\ $33 ($53) TCCR0
07 == FOC0
06 == WGM00
05 == COM01
04 == COM00
03 == WGM01
02 == CS02
01 == CS01
00 == CS00

\ $30 ($50) SFIOR
06 == XMBK
05 == XMM2
04 == XMM1
03 == XMM0
02 == PUD
00 == PSR10

\ $2F ($4F) TCCR1A
07 == COM1A1
06 == COM1A0
05 == COM1B1
04 == COM1B0
03 == FOC1A
02 == FOC1B
01 == WGM11
00 == WGM10

\ $2E ($4E) TCCR1B
07 == ICNC1
06 == ICES1
04 == WGM13
03 == WGM12
02 == CS12
01 == CS11
00 == CS10

\ $21 ($41) WDTCR
04 == WDCE
03 == WDE
02 == WDP2
01 == WDP1
00 == WDP0

\ $20 ($40) UBRRH
07 == URSEL
06 == UMSEL
05 == UPM1
04 == UPM0
03 == USBS
02 == UCSZ1
01 == UCSZ0
00 == UCPOL

\ $1F ($3F) EEARH
00 == EEAR8

\ $1C ($3C) EECR
03 == EERIE
02 == EEMWE
01 == EEWE
00 == EERE

\ $1B ($3B) PORTA
07 == PORTA7
06 == PORTA6
05 == PORTA5
04 == PORTA4
03 == PORTA3
02 == PORTA2
01 == PORTA1
00 == PORTA0

\ $1A ($3A) DDRA
07 == DDA7
06 == DDA6
05 == DDA5
04 == DDA4
03 == DDA3
02 == DDA2
01 == DDA1
00 == DDA0

\ $19 ($39) PINA
07 == PINA7
06 == PINA6
05 == PINA5
04 == PINA4
03 == PINA3
02 == PINA2
01 == PINA1
00 == PINA0

\ $18 ($38) PORTB
07 == PORTB7
06 == PORTB6
05 == PORTB5
04 == PORTB4
03 == PORTB3
02 == PORTB2
01 == PORTB1
00 == PORTB0

\ $17 ($37) DDRB
07 == DDB7
06 == DDB6
05 == DDB5
04 == DDB4
03 == DDB3
02 == DDB2
01 == DDB1
00 == DDB0

\ $16 ($36) PINB
07 == PINB7
06 == PINB6
05 == PINB5
04 == PINB4
03 == PINB3
02 == PINB2
01 == PINB1
00 == PINB0

\ $15 ($35) PORTC
07 == PORTC7
06 == PORTC6
05 == PORTC5
04 == PORTC4
03 == PORTC3
02 == PORTC2
01 == PORTC1
00 == PORTC0

\ $14 ($34) DDRC
07 == DDC7
06 == DDC6
05 == DDC5
04 == DDC4
03 == DDC3
02 == DDC2
01 == DDC1
00 == DDC0

\ $13 ($33) PINC
07 == PINC7
06 == PINC6
05 == PINC5
04 == PINC4
03 == PINC3
02 == PINC2
01 == PINC1
00 == PINC0

\ $12 ($32) PORTD
07 == PORTD7
06 == PORTD6
05 == PORTD5
04 == PORTD4
03 == PORTD3
02 == PORTD2
01 == PORTD1
00 == PORTD0

\ $11 ($31) DDRD
07 == DDD7
06 == DDD6
05 == DDD5
04 == DDD4
03 == DDD3
02 == DDD2
01 == DDD1
00 == DDD0

\ $10 ($30) PIND
07 == PIND7
06 == PIND6
05 == PIND5
04 == PIND4
03 == PIND3
02 == PIND2
01 == PIND1
00 == PIND0

\ $0E ($2E) SPSR
07 == SPIF
06 == WCOL
00 == SPI2X

\ $0D ($2D) SPCR
07 == SPIE
06 == SPE
05 == DORD
04 == MSTR
03 == CPOL
02 == CPHA
01 == SPR1
00 == SPR0

\ $0B ($2B) UCSRA
07 == RXC
06 == TXC
05 == UDRE
04 == FE
03 == DOR
02 == UPE
01 == U2X
00 == MPCM

\ $0A ($2A) UCSRB
07 == RXCIE
06 == TXCIE
05 == UDRIE
04 == RXEN
03 == TXEN
02 == UCSZ2
01 == RXB8
00 == TXB8

\ $08 ($28) ACSR
07 == ACD
06 == ACBG
05 == ACO
04 == ACI
03 == ACIE
02 == ACIC
01 == ACIS1
00 == ACIS0

\ $07 ($27) PORTE
02 == PORTE2
01 == PORTE1
00 == PORTE0

\ $06 ($26) DDRE
02 == DDE2
01 == DDE1
00 == DDE0

\ $03 ($25) PINE
02 == PINE2
01 == PINE1
00 == PINE0

S" isr.spf" INCLUDED

0x0 ORG

INTERRUPT RESET
INTERRUPT EXT_INT0
INTERRUPT EXT_INT1
INTERRUPT TIMER1_CAPT
INTERRUPT TIMER1_COMPA
INTERRUPT TIMER1_COMPB
INTERRUPT TIMER1_OVF
INTERRUPT TIMER0_OVF
INTERRUPT SPI_STC
INTERRUPT UART_RX
INTERRUPT UART_UDRE
INTERRUPT UART_TX
INTERRUPT ANA_COMP

S" init.spf" INCLUDED

Попробовал тестовый пример по уарту с ним. В протеусе заработал, но с какимими то постоянными пересбросами "кристала" (постоянный вывод текста)
(возможно что что неправильно или не было проинициализировано). В реальном железе ещё не совсем определился. например с двумя
регистрами по одному адресу т.к. для AVR с использованием Форта ещё не было приемлемого опыта использования.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередной AVRForth
СообщениеДобавлено: Вт фев 12, 2013 00:55 
Не в сети

Зарегистрирован: Ср май 10, 2006 13:51
Сообщения: 202
Благодарил (а): 3 раз.
Поблагодарили: 4 раз.
KPG писал(а):
Собирался ли данный Форт для "резидентного" размещения в AVR разных по флешу контроллеров, например, от 8Кб, 16Кб ...
чтобы, по возможности, "уйти" от кросс компиляции отлаживаемого устройства.

P.S. В данный момент интересут сборка под AVR8515 с возможность дозагрузки программы в доп устанавливаемоё ОЗУ, например с SD канала связи
или микросхемы флеш памяти. Смотрел вариант "утаптывания" amForth (пока с версии 4.2) в 8Кб решение где-то близко с минимальным "урезанием"
базиса системы. Далее по возможности рассмотрю что можно переделать в ff303 для возможно гибкой сборки целевых сборок по возможностям
"разных" AVR и не только Форт систем. :shuffle;

Это чистый кросс-транслятор, в прошивку попадают слова без заголовков, подпрограммный шитый код, так что в ОЗУ программу не получится запустить. Смотрите в сторону других фортов
KPG писал(а):
Для Atmega8515 набрал файл описания девайся (надеюсь, что не ошибся:) для Уарт можно его именовать, как 0-й т.к. он аппаратно один.

спасибо, включу в проект
KPG писал(а):
Попробовал тестовый пример по уарту с ним. В протеусе заработал, но с какимими то постоянными пересбросами "кристала" (постоянный вывод текста)
(возможно что что неправильно или не было проинициализировано).

Нужно смотреть даташит на 8515, возможно УАРТ не так инициализируется (я ориентировался на меги 8 и х8, с 8515 не знаком)

KPG писал(а):
В реальном железе ещё не совсем определился. например с двумя
регистрами по одному адресу т.к. для AVR с использованием Форта ещё не было приемлемого опыта использования.

Не совсем понял, что имеется в виду


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

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB