roboforum.ru

Технический форум по робототехнике.


Форт-система

Готовая электроника для самодельного робота. Уровень от начинающих до опытных конструкторов.

Re: Форт-система

Сообщение chu » 30 июн 2012, 08:57

ilya73 писал(а):Вчера проверил ds307.frt - работает!!!

это нормально, ненормально - когда не работает.
кстати, как проверял, на жки смотрел?
ilya73 писал(а):Но, есть предложение (для стандартизации) вынести слова: rstr>lcd и time? в отдельную либу!?

и действительно, слово вывода строки со счетчиком из ОЗУ rstr>lcd на ЖКИ ( по идее) должно находиться в lcd.f - в свое время поленился ( не было нужды), а когда понадобилось - воткнул, где пригодилось. а куда переносить time? - ума не приложу, замыслы твои мне неведомы...
да и clock@ бы переписать аккуратнее, слишком уж оно кракозябистое, вида ужасного...есть там одна фраза: dup >r 4 rshift bcd>asci c!+ r> bcd>asci c!+
, которая постоянно повторяется по всему тексту. практика форта говорит, что такие фразы надо выносить в отдельное определение, вот только внятного имени ему не могу придумать...
and so forth
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

Re: Форт-система

Сообщение chu » 03 июл 2012, 17:12

Вот, нашел в журнале генератор случайных чисел:
Код: Выделить всёРазвернуть
\
\ Forth Dimensions , Volume XXI, Number 1,2
\
\ Linear Congruential Sequences , p.44
\
\ With 16-bit arithmetic Forth, three LCSs should be combined.
\ The following is adapted from a suggestion by L’Ecuyer in 1988.
\

variable random-x
variable random-y
variable random-z

: rand-next ( -- 1..32363 )
       random-x  @  157 32363 */mod drop dup random-x !
       random-y  @  146 31727 */mod drop dup random-y !
       - dup 0> not if  32363 + then
       random-z  @  142 31657 */mod drop dup random-z !
       - dup 0> not if  32363 + then
       ;   

запускал под amforth'ом, работает. Оценить качество генератора немогу - туповат в этих материях. Для чего применить - не имею понятия. Можно для игрушек, хотя какие к сабакам, игрушки на мегах...Или шифровать чего-нибудь.
Так, пост ниочём.
go forth
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

Re: Форт-система

Сообщение ilya73 » 03 июл 2012, 22:09

chu писал(а):
ilya73 писал(а):Вчера проверил ds307.frt - работает!!!

это нормально, ненормально - когда не работает.
кстати, как проверял, на жки смотрел?
ilya73 писал(а):Но, есть предложение (для стандартизации) вынести слова: rstr>lcd и time? в отдельную либу!?

и действительно, слово вывода строки со счетчиком из ОЗУ rstr>lcd на ЖКИ ( по идее) должно находиться в lcd.f - в свое время поленился ( не было нужды), а когда понадобилось - воткнул, где пригодилось. а куда переносить time? - ума не приложу, замыслы твои мне неведомы...
......

Просто смотрел дамп.
LCD у меня нема, зато есть twi-аный oled 96*96 и поскольку пока всё собранно под twi, то решил и его "окучить".
Есть определённые подвижки - сейчас мучаю шрифты.
Ты силён в Сях?

Может time? обозвать ~ time2lcd и запихнуть в lcd.frt или создать словарь lcd и поместить его туда!?
ilya73
 
Сообщения: 35
Зарегистрирован: 26 дек 2011, 23:04

Re: Форт-система

Сообщение chu » 03 июл 2012, 22:51

ilya73 писал(а):Просто смотрел дамп.
LCD у меня нема,

тогда можно было так написать:
Код: Выделить всёРазвернуть
: time? clock@ #stamp dup 1+ swap c@ type ;

выведет в консоль amforth'а
ilya73 писал(а): зато есть twi-аный oled 96*96 ...

клева
ilya73 писал(а):Ты силён в Сях?

читаю со словарем :)
ilya73 писал(а):Может time? обозвать ~ time2lcd и запихнуть в lcd.frt или создать словарь lcd и поместить его туда!?

пофиг
go forth
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

Re: Форт-система

Сообщение ilya73 » 10 июл 2012, 03:24

Я сделал это :D :
Изображение

Осталось только добавить вывод .BMP .
Код: Выделить всёРазвернуть
\ oled96.frt - управление OLED индикатором (96*96) на базе
\ драйвера SSD1327
\ 07.07.2012 ~ilya


\ #include twi.frt

marker =oled96=
$78  constant  twi.oled96 \ device address on i2c bus

$80 constant   OLED_Command_Mode
$40 constant   OLED_Data_Mode
$a4 constant   OLED_Normal_Display_Cmd
$a7 constant   OLED_Inverse_Display_Cmd
$81 constant   OLED_Set_ContrastLevel_Cmd
$ae constant   OLED_Display_Off_Cmd
$af constant   OLED_Display_On_Cmd



variable oled96col   \ Текущий столбец
variable oled96row   \ Текущая строка
variable grayH   
variable grayL


create BasicFont
     $00   , $00   , $00   , $00   , $00   , $00   , $00   , $00   ,
     $00   , $00   , $5F   , $00   , $00   , $00   , $00   , $00   ,
     $00   , $00   , $07   , $00   , $07   , $00   , $00   , $00   ,
     $00   , $14   , $7F   , $14   , $7F   , $14   , $00   , $00   ,
     $00   , $24   , $2A   , $7F   , $2A   , $12   , $00   , $00   ,
     $00   , $23   , $13   , $08   , $64   , $62   , $00   , $00   ,
     $00   , $36   , $49   , $55   , $22   , $50   , $00   , $00   ,
     $00   , $00   , $05   , $03   , $00   , $00   , $00   , $00   ,
     $00   , $1C   , $22   , $41   , $00   , $00   , $00   , $00   ,
     $00   , $41   , $22   , $1C   , $00   , $00   , $00   , $00   ,
     $00   , $08   , $2A   , $1C   , $2A   , $08   , $00   , $00   ,
     $00   , $08   , $08   , $3E   , $08   , $08   , $00   , $00   ,
     $00   , $A0   , $60   , $00   , $00   , $00   , $00   , $00   ,
     $00   , $08   , $08   , $08   , $08   , $08   , $00   , $00   ,
     $00   , $60   , $60   , $00   , $00   , $00   , $00   , $00   ,
     $00   , $20   , $10   , $08   , $04   , $02   , $00   , $00   ,
     $00   , $3E   , $51   , $49   , $45   , $3E   , $00   , $00   ,
     $00   , $00   , $42   , $7F   , $40   , $00   , $00   , $00   ,
     $00   , $62   , $51   , $49   , $49   , $46   , $00   , $00   ,
     $00   , $22   , $41   , $49   , $49   , $36   , $00   , $00   ,
     $00   , $18   , $14   , $12   , $7F   , $10   , $00   , $00   ,
     $00   , $27   , $45   , $45   , $45   , $39   , $00   , $00   ,
     $00   , $3C   , $4A   , $49   , $49   , $30   , $00   , $00   ,
     $00   , $01   , $71   , $09   , $05   , $03   , $00   , $00   ,
     $00   , $36   , $49   , $49   , $49   , $36   , $00   , $00   ,
     $00   , $06   , $49   , $49   , $29   , $1E   , $00   , $00   ,
     $00   , $00   , $36   , $36   , $00   , $00   , $00   , $00   ,
     $00   , $00   , $AC   , $6C   , $00   , $00   , $00   , $00   ,
     $00   , $08   , $14   , $22   , $41   , $00   , $00   , $00   ,
     $00   , $14   , $14   , $14   , $14   , $14   , $00   , $00   ,
     $00   , $41   , $22   , $14   , $08   , $00   , $00   , $00   ,
     $00   , $02   , $01   , $51   , $09   , $06   , $00   , $00   ,
     $00   , $32   , $49   , $79   , $41   , $3E   , $00   , $00   ,
     $00   , $7E   , $09   , $09   , $09   , $7E   , $00   , $00   ,
     $00   , $7F   , $49   , $49   , $49   , $36   , $00   , $00   ,
     $00   , $3E   , $41   , $41   , $41   , $22   , $00   , $00   ,
     $00   , $7F   , $41   , $41   , $22   , $1C   , $00   , $00   ,
     $00   , $7F   , $49   , $49   , $49   , $41   , $00   , $00   ,
     $00   , $7F   , $09   , $09   , $09   , $01   , $00   , $00   ,
     $00   , $3E   , $41   , $41   , $51   , $72   , $00   , $00   ,
     $00   , $7F   , $08   , $08   , $08   , $7F   , $00   , $00   ,
     $00   , $41   , $7F   , $41   , $00   , $00   , $00   , $00   ,
     $00   , $20   , $40   , $41   , $3F   , $01   , $00   , $00   ,
     $00   , $7F   , $08   , $14   , $22   , $41   , $00   , $00   ,
     $00   , $7F   , $40   , $40   , $40   , $40   , $00   , $00   ,
     $00   , $7F   , $02   , $0C   , $02   , $7F   , $00   , $00   ,
     $00   , $7F   , $04   , $08   , $10   , $7F   , $00   , $00   ,
     $00   , $3E   , $41   , $41   , $41   , $3E   , $00   , $00   ,
     $00   , $7F   , $09   , $09   , $09   , $06   , $00   , $00   ,
     $00   , $3E   , $41   , $51   , $21   , $5E   , $00   , $00   ,
     $00   , $7F   , $09   , $19   , $29   , $46   , $00   , $00   ,
     $00   , $26   , $49   , $49   , $49   , $32   , $00   , $00   ,
     $00   , $01   , $01   , $7F   , $01   , $01   , $00   , $00   ,
     $00   , $3F   , $40   , $40   , $40   , $3F   , $00   , $00   ,
     $00   , $1F   , $20   , $40   , $20   , $1F   , $00   , $00   ,
     $00   , $3F   , $40   , $38   , $40   , $3F   , $00   , $00   ,
     $00   , $63   , $14   , $08   , $14   , $63   , $00   , $00   ,
     $00   , $03   , $04   , $78   , $04   , $03   , $00   , $00   ,
     $00   , $61   , $51   , $49   , $45   , $43   , $00   , $00   ,
     $00   , $7F   , $41   , $41   , $00   , $00   , $00   , $00   ,
     $00   , $02   , $04   , $08   , $10   , $20   , $00   , $00   ,
     $00   , $41   , $41   , $7F   , $00   , $00   , $00   , $00   ,
     $00   , $04   , $02   , $01   , $02   , $04   , $00   , $00   ,
     $00   , $80   , $80   , $80   , $80   , $80   , $00   , $00   ,
     $00   , $01   , $02   , $04   , $00   , $00   , $00   , $00   ,
     $00   , $20   , $54   , $54   , $54   , $78   , $00   , $00   ,
     $00   , $7F   , $48   , $44   , $44   , $38   , $00   , $00   ,
     $00   , $38   , $44   , $44   , $28   , $00   , $00   , $00   ,
     $00   , $38   , $44   , $44   , $48   , $7F   , $00   , $00   ,
     $00   , $38   , $54   , $54   , $54   , $18   , $00   , $00   ,
     $00   , $08   , $7E   , $09   , $02   , $00   , $00   , $00   ,
     $00   , $18   , $A4   , $A4   , $A4   , $7C   , $00   , $00   ,
     $00   , $7F   , $08   , $04   , $04   , $78   , $00   , $00   ,
     $00   , $00   , $7D   , $00   , $00   , $00   , $00   , $00   ,
     $00   , $80   , $84   , $7D   , $00   , $00   , $00   , $00   ,
     $00   , $7F   , $10   , $28   , $44   , $00   , $00   , $00   ,
     $00   , $41   , $7F   , $40   , $00   , $00   , $00   , $00   ,
     $00   , $7C   , $04   , $18   , $04   , $78   , $00   , $00   ,
     $00   , $7C   , $08   , $04   , $7C   , $00   , $00   , $00   ,
     $00   , $38   , $44   , $44   , $38   , $00   , $00   , $00   ,
     $00   , $FC   , $24   , $24   , $18   , $00   , $00   , $00   ,
     $00   , $18   , $24   , $24   , $FC   , $00   , $00   , $00   ,
     $00   , $00   , $7C   , $08   , $04   , $00   , $00   , $00   ,
     $00   , $48   , $54   , $54   , $24   , $00   , $00   , $00   ,
     $00   , $04   , $7F   , $44   , $00   , $00   , $00   , $00   ,
     $00   , $3C   , $40   , $40   , $7C   , $00   , $00   , $00   ,
     $00   , $1C   , $20   , $40   , $20   , $1C   , $00   , $00   ,
     $00   , $3C   , $40   , $30   , $40   , $3C   , $00   , $00   ,
     $00   , $44   , $28   , $10   , $28   , $44   , $00   , $00   ,
     $00   , $1C   , $A0   , $A0   , $7C   , $00   , $00   , $00   ,
     $00   , $44   , $64   , $54   , $4C   , $44   , $00   , $00   ,
     $00   , $08   , $36   , $41   , $00   , $00   , $00   , $00   ,
     $00   , $00   , $7F   , $00   , $00   , $00   , $00   , $00   ,
     $00   , $41   , $36   , $08   , $00   , $00   , $00   , $00   ,
     $00   , $02   , $01   , $01   , $02   , $01   , $00   , $00   ,
     $00   , $02   , $05   , $05   , $02   , $00   , $00   , $00   ,


: oled96.send ( d c -- )
   twi.oled96
   twi.start
   twi.tx $18 twi.status?
   twi.tx $28 twi.status?
   twi.tx   $28 twi.status?
   twi.stop
;

\ Посылаем комманду
: oled96.sc ( c -- )
   OLED_Command_Mode oled96.send
;
\ Посылаем данные
: oled96.sd ( c -- )
   OLED_Data_Mode oled96.send
;


: oled96.init
$fd oled96.sc
$12 oled96.sc
$ae oled96.sc
$a8 oled96.sc
$5f oled96.sc
$a1 oled96.sc
$00 oled96.sc
$a2 oled96.sc
$60 oled96.sc
$a0 oled96.sc   \ set remap
$46 oled96.sc
$ab oled96.sc
$01 oled96.sc
$81 oled96.sc
$53 oled96.sc
$b1 oled96.sc
$51 oled96.sc
$b3 oled96.sc
$01 oled96.sc
$b9 oled96.sc
$bc oled96.sc
$08 oled96.sc
$be oled96.sc
$07 oled96.sc
$b6 oled96.sc
$01 oled96.sc
$d5 oled96.sc
$62 oled96.sc
$a4 oled96.sc
$2e oled96.sc
$af oled96.sc
100 ms
$75 oled96.sc
$00 oled96.sc
$5f oled96.sc

$15 oled96.sc
$08 oled96.sc
$37 oled96.sc

$f0 grayH !
$0f grayL !
0 oled96col !
0 oled96row !
;

: oled96.rowaddr ( n -- )
\ Row Address
$75 oled96.sc
oled96.sc
$5f oled96.sc
;

: oled96.coladdr ( n -- )
\ Column Address
$15 oled96.sc
8 + oled96.sc \ Start from 8th Column of driver IC. This is 0th Column for OLED
$37 oled96.sc \ End at  (8 + 47)th column. Each Column has 2 pixels(or segments)
;

: oled96.clear
0 oled96.rowaddr 0 oled96.coladdr
4608 0 do 0 oled96.sd loop
;

: oled96.setgraylevel ( n -- )
dup 4 lshift $f0 and grayH !
$0f and grayL !
;


: oled96.hormode
$a0 oled96.sc
$42 oled96.sc
0 oled96.rowaddr
0 oled96.coladdr
;

: oled96.vertmode
$a0 oled96.sc
$46 oled96.sc
;

\ *********** Вывод текста ***********


: oled96.settextxy ( n1 n -- )
oled96row !
oled96col !
;

: oled96.putchar ( c -- )
dup 32 127 within 0= if drop 32 then
32 - 8 *
   4 0 do
      i oled96col @ 4 * + oled96.coladdr
      oled96row @ 8 * oled96.rowaddr
      8 0 do
      dup BasicFont + j 2 * + @i i rshift 1 and
if grayH @ else 0 then
over BasicFont + j 2 * + 1+ @i i rshift 1 and
if grayL @ else 0 then
or
         oled96.sd
      loop
   loop
drop
;

: oled96.putstring ( adr n -- )
over + swap ?do i c@ oled96.putchar oled96col @ 1+ oled96col ! loop
;

:  oled96.setnormalmode ( -- )
OLED_Normal_Display_Cmd oled96.sc
;

:  oled96.setinversemode ( -- )
OLED_Normal_Inverse_Cmd oled96.sc
;

: oled96.setcontrastlevel ( n -- )
\ n от 0 до 256
OLED_Set_ContrastLevel_Cmd oled96.sc
oled96.sc
;

Пока буду мучить софт UART - сделаю из дурынды часы с термометром (прикручу часики и темп. датчик). :)
ilya73
 
Сообщения: 35
Зарегистрирован: 26 дек 2011, 23:04

Re: Форт-система

Сообщение chu » 10 июл 2012, 12:18

ilya73 писал(а):Я сделал это :D :

Класс! :beer:
Объем таблицы BasicFont можно сократить вдвое, упаковав байты в слова.
А *.bmp лучше хранить во внешней eeprom.
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

Re: Форт-система

Сообщение ilya73 » 14 июл 2012, 01:22

chu писал(а):
ilya73 писал(а):Я сделал это :D :

Класс! :beer:
Объем таблицы BasicFont можно сократить вдвое, упаковав байты в слова.
А *.bmp лучше хранить во внешней eeprom.

Попытался адаптировать "фирменную" сишную либу (втупую переписан BasicFont и init), но в результате: самое важное слово putchar, пришлось "разрбатывать" самому.
Провел эксперимент с прерываниями по таймеру (часики):
Код: Выделить всёРазвернуть
marker =mytimer=

: timer-int-isr
time@
2 2 oled96.settextxy
#stamp count oled96.putstring
;

\ turn on the timer, needs timer-init already in place
: +timer
1 TIMSK1 c!
;
\ stops the timer
: -timer
0 TIMSK1 c!
;


: clock-init
5 TCCR1B c! \ prescaler 1024, check data sheet
['] timer-int-isr
TIMER1_OVFAddr
int!
regular +twi
oled96.init
oled96.clear
+timer
;


Результат: раз ~ 4 сек. обновляем дисплей. Помоги разобраться с таймерами!
Имеем кварц 16МГц / 1024 (5 TCCR1B c! прескалер) = 15625 / 255 (1 TIMSK1 c! переполнение)= 61 прерывание в секунду?
ilya73
 
Сообщения: 35
Зарегистрирован: 26 дек 2011, 23:04

Re: Форт-система

Сообщение chu » 14 июл 2012, 11:31

ilya73 писал(а):Имеем кварц 16МГц / 1024 (5 TCCR1B c! прескалер) = 15625 / 255 (1 TIMSK1 c! переполнение)= 61 прерывание в секунду?

Timer1 - 16 разрядный. 1 / ((16МГц / 1024) / 65536) = 4.194304 сек
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

Re: Форт-система

Сообщение ilya73 » 15 июл 2012, 03:02

chu писал(а):
ilya73 писал(а):Имеем кварц 16МГц / 1024 (5 TCCR1B c! прескалер) = 15625 / 255 (1 TIMSK1 c! переполнение)= 61 прерывание в секунду?

Timer1 - 16 разрядный. 1 / ((16МГц / 1024) / 65536) = 4.194304 сек

Млин! Тупанул я. :o
Атмега - нифига не "плаг энд плай", есчё пересчитывать таймер надо. :D
Владимр, а что произойдёт: если в момент отработки одного прерывания прийдёт другое прерывние? Допустим однопо таймеру, а другое по внешнему входу.
ilya73
 
Сообщения: 35
Зарегистрирован: 26 дек 2011, 23:04

Re: Форт-система

Сообщение chu » 15 июл 2012, 11:08

ilya73 писал(а): а что произойдёт: если в момент отработки одного прерывания прийдёт другое прерывние? Допустим одно по таймеру, а другое по внешнему входу.

Для прояснения этих вопросов крайне желательно тщательно ознакомиться с содержанием двух технических документов:
1. даташит на мегу328 6.7 Reset and Interrupt Handling , стр.14
2. amforth 4.8 Technical Documentation 4.3.5. Interrupts , стр.10

А вот ответ на вопрос: если не предпринимать дополнительных телодвижений, сначала будет обработано прерывание по таймеру, затем - прерывание по внешнему входу.
Если указанные прерывания произойдут одновременно, первым будет обслуживаться прерывание с высшим приоритетом ( с меньшим вектором) - прерывание по внешнему входу.

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

Рискну предположить: прерывание по внешнему входу у тебя используется для приема информационного пакета от ридера RFID, а прерывания от таймера - как "общесистемные метки времени". В этом случае возможна потеря части пакета во время обработки прерывания от таймера. Чтобы избежать этого, имеет смысл предпринять уже упомянутые телодвижения - при вхождении в обработчик прерывания от таймера разрешить глобальные прерывания , установив флаг I в регистре SREG.
К сведению: длительность информационного пакета ридера RFID - не менее 16 миллисекунд = 104мкс(битовая посылка)* 11бит(1старт+8бит+2стоп) * 14байт(длина пакета)

Кстати, опрос 1-проводных датчиков так же создает эту проблему.
Кажется пора осваивать multitasker :)
go forth
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

Re: Форт-система

Сообщение ilya73 » 17 июл 2012, 23:11

chu писал(а):.......
Для прояснения этих вопросов крайне желательно тщательно ознакомиться с содержанием двух технических документов:
1. даташит на мегу328 6.7 Reset and Interrupt Handling , стр.14
2. amforth 4.8 Technical Documentation 4.3.5. Interrupts , стр.10
.......
Рискну предположить: прерывание по внешнему входу у тебя используется для приема информационного пакета от ридера RFID, а прерывания от таймера - как "общесистемные метки времени". В этом случае возможна потеря части пакета во время обработки прерывания от таймера. Чтобы избежать этого, имеет смысл предпринять уже упомянутые телодвижения - при вхождении в обработчик прерывания от таймера разрешить глобальные прерывания , установив флаг I в регистре SREG.
К сведению: длительность информационного пакета ридера RFID - не менее 16 миллисекунд = 104мкс(битовая посылка)* 11бит(1старт+8бит+2стоп) * 14байт(длина пакета)

Кстати, опрос 1-проводных датчиков так же создает эту проблему.
Кажется пора осваивать multitasker :)
go forth


Спасибки! Понял.

- плохо я учился в школе/вузе :oops: и буржуйским владею только со словарём (а в даташите ещё много буков). :)
- пока ещё не хватило времени дойти до софт UART-а, а прерывания по таймеру для треннировки - часики. В будущем - временные метки буду брать по другим событиям.
- и до multitasker дойдёт черёд.

ЗЫ
Модифицировал "часики" - ежесекундное обновление.
Вроде работает, но насколько корректно/правильно?
Код: Выделить всёРазвернуть
: +timer
$4 TIMSK1 c!   \ Output Compare B Match Interrupt Enable NEW!
;
\ stops the timer
: -timer
0 TIMSK1 c!
;


: timer-int-isr
-timer \ NEW!
time@
2 2 oled96.settextxy
#stamp count oled96.putstring
0 TCNT1H c! \ NEW!
0 TCNT1L c! \ NEW!
+timer      \ NEW!
;


: clock-init
5 TCCR1B c! \ prescaler 1024, check data sheet
['] timer-int-isr
TIMER1_COMPBAddr \ NEW!
\ TIMER1_OVFAddr
int!
regular +twi
oled96.init
oled96.clear
$09 OCR1BL c!  \ NEW!
$3d  OCR1BH c! \ NEW!
+timer
;

ilya73
 
Сообщения: 35
Зарегистрирован: 26 дек 2011, 23:04

Re: Форт-система

Сообщение chu » 18 июл 2012, 10:07

ilya73 писал(а):Модифицировал "часики" - ежесекундное обновление.
Вроде работает, но насколько корректно/правильно?
Код: Выделить всёРазвернуть

: timer-int-isr
-timer \ NEW!
time@
2 2 oled96.settextxy
#stamp count oled96.putstring
0 TCNT1H c! \ NEW!
0 TCNT1L c! \ NEW!
+timer      \ NEW!
;



1. В данном случае удобнее использовать Timer1 в режиме 15.9.2 Clear Timer on Compare Match (CTC) Mode. В этом режиме счетчик TCNT1 инкрементируется до совпадения с содержимым либо OCR1A (WGM13:10=4) либо ICR1 (WGM13:10=12), затем сбрасывается в $0000. Соответственно устанавливается флаг прерывания: либо OCF1A либо ICF1. Для этих целей так же возможно использовать Watchdog Timer в режиме интервального таймера. Или, как вариант, можно использовать внешнее прерывание от ds1307 - пин SQW/OUT.
2. Обновление и индикация времени в процедуре обработки прерывания...нуу низнаю, как бы некомильфо такой объемный код выполнять при обработке прерываний. Можно завести какую-нибудь флаг-переменную (семафор), как-то так:
Код: Выделить всёРазвернуть

    : time-update
         time@    2 2 oled96.settextxy
         #stamp count oled96.putstring
        ;

    variable пора false пора !

    : уже? пора @ ;
    : все! false пора ! ;
    : уже! true  пора ! ;

    : timer-int-isr
        ...
        уже!
        ...
        ;

   \ бесконечный цикл
    : какоето-имя
        begin  pause уже? while time-update все! again
        ;


Применение multitasker'а позволяет по-другому решить ту же задачу. Прерывание по таймеру будет "пробуждать" задачу, например: time-update-task task-awake. Задача, отработав, будет "засыпать" (stop). Аналогичным образом multitasker позволит решить проблему с приемом информации от RFID reader'а. Вкратце: при поступленни прерывания по внешнему входу (от ридера) - все активные (обновление времени, опрос датчиков, еще что-то) задачи (task'и) переводятся в неактивный режим (sleep), запрещаются все прерывания, кроме одного - от ридера, индицируется готовность системы к считыванию карты (необязятельно), меняется вектор прерывания от ридера на другой (soft-rx RFID reader), запускается сторожевой таймер в интервальном режиме ( 4-8 секунд достаточно) - не забыть разрешить прерывания от сторожевого таймера. Далее, по тому же прерыванию ( от ридера) происходит прием информационного пакета программным способом (в процессе можно сбрасывать сторожевой таймер - на всякий случай). Если пакет принят - останов сторожевого таймера, запрет прерываний от него, обработка принятого пакета, затем - все восстанавливаем, как было: выключаем индикацию, восстанавливаем прежний вектор прерывания от ридера, разрешаем потребные прерывания. Если в отведенное время пакет не принят ( произошло прерывание от сторожевого таймера) - делаем все тоже самое, кроме обработки пакета
И все возвращается на круги своя...
Ну да, для того чтобы RFID reader сработал, необходимо дважды подносить карточку - но другое решение: взять дополнительно какую-нибудь тиньку и озадачить ее исключительно на работу с RFID ридером...нуу тоже можно, конечно...
Собственно говоря - это ты должен подробно описать функционирование системы, которую строишь...( ТЗ называется - очень помогает наличие такого документа)

Хотелось бы добавить - без изучения технической литературы - никуда!
Одна из многих книг по AVR ATmega http://padabum.com/d.php?id=2819

go forth
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

Re: Форт-система

Сообщение ilya73 » 20 июл 2012, 19:32

chu писал(а):..............
1. В данном случае удобнее использовать Timer1 в режиме 15.9.2 Clear Timer on Compare Match (CTC) Mode.
..............
2. Обновление и индикация времени в процедуре обработки прерывания...нуу низнаю, как бы некомильфо такой объемный код выполнять при обработке прерываний.
..............
Применение multitasker'а позволяет по-другому решить ту же задачу.
..............
Собственно говоря - это ты должен подробно описать функционирование системы, которую строишь...( ТЗ называется - очень помогает наличие такого документа)

Хотелось бы добавить - без изучения технической литературы - никуда!
Одна из многих книг по AVR ATmega http://padabum.com/d.php?id=2819

go forth


1) Я пока в стадии тренировки - отрабатываю возможности amforth-atmega.
Переписал на CTC - работает, но пришлось полазить почитать статейки, ибо надо
Код: Выделить всёРазвернуть
 $3d  OCR1AH c!
$09 OCR1AL c!
, а я сделал в обратном порядке и соотв. OCR1AH был в нулях!!!
2) Согласен! Много раз пользовал потоки под Виндой в spf4, а вот в amforth пока опа. :sorry:
Стандартный пример вроде работает, а вот слегка модифицировал (опять мои любимые часики) и всё, алесс!
Мой поток работает, а консоль пропадает!?
Правда я только вчера вечером стал пробовать, надо разбираться.
ilya73
 
Сообщения: 35
Зарегистрирован: 26 дек 2011, 23:04

Re: Форт-система

Сообщение VoidVolker » 27 авг 2012, 00:42

Прилетело НЛО и опубликовало эту надпись здесь. :D
Так, мимо проходил — решил заглянуть, как тут МиниБот с Фортом уживается :friends: . Смотрю — все отлично :)
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc
Аватара пользователя
VoidVolker
 
Сообщения: 27
Зарегистрирован: 08 авг 2008, 18:47
Откуда: Подмосковье
прог. языки: Форт

Re: Форт-система

Сообщение elmot » 27 авг 2012, 17:43

Господа! Есть желание воткнуть какой-нибудь простецкий язычок в мелкую embedded систему с C. Рассматриваются forth, eLua и колхозный вариант IL. Вопрос - насколько сложно встроить Forth машину? Где ее исходники на C?
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Пред.След.

Вернуться в МиниБот — национальный класс роботов

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

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