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

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

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

Сообщение Eruman » 08 окт 2010, 16:58

Да, у меня дуины на Атмеге8. 16-х нету в местном магазине, а 32- чегото стрёмно детишкам давать, да и денех жалко :D
Соединяй и здравствуй.
Аватара пользователя
Eruman
 
Сообщения: 897
Зарегистрирован: 12 авг 2010, 15:10
Откуда: Астраханская обл.

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

Сообщение chu » 09 окт 2010, 21:53

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

SP-FORTH - ANS FORTH 94 for Win95/98/Me/NT/2k/XP/Vista
Open source project at http://spf.sf.net
Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov
Version 4.20 Build 001 at 21.Jan.2009

>S" d:\ucontrollers\amforth\amforth-4.2\amforth-4.2_uploader.spf" INCLUDED
Ok
>commopen
CommPort handle= 2A8
Ok
>S" D:\uControllers\amforth\amforth-4.2\lib\my\" setdir!
Ok
>S" tttt1.frt" setfile!
Ok
>getfile

source file:
D:\uControllers\amforth\amforth-4.2\lib\my\tttt1.frt
428 loaded: 1113 okay Ok
>download

\
\ tttt1.frt - timer1 tools for timing tests
\ 21:06 09.10.2010   *chu*
\ =============================================================
\

marker -tttt1-


forth only also assembler
decimal

   $2F constant tccr1a
   $2E constant tccr1b



\ stop timer1
  code t1>   
        tccr1b R2 out,   
  end-code

\ start timer1 @ normal mode, prescaler=8 ( 1us counter @8MHz )
  code <t1
        R17    2   ldi,
        tccr1a R2  out,
        tccr1b R17 out,
  end-code

  code delay   \ : delay ( n -- ) begin 1- dup 0= until drop ;
       label>
        R24  1  sbiw,
       <radr    brne,
        R24  Y+   ld,
        R25  Y+   ld,
  end-code

forth only

\  stop timer1 & zero counter
  : <t1>  t1> 0 dup TCNT1H c! TCNT1L c!   ;

\  show t1 counter
  : .t1
        TCNT1L c@ TCNT1H c@ 8 lshift + dup
        ." (0x" .x ." )" bl emit u. ." us"

        TIFR dup c@ $4 and dup      \ test  TOV1 flag
        if bl emit ." overrun"
           over c@ or swap c!      \ clear TOV1 by writing'1'
        else drop drop then cr
        ;

\ timing test using timer1, xt - executable address
  : ?us   <t1> <t1 execute t1> .t1 ;   ( *x xt -- *y )
             

\
\ =============================================================
\
Ok
>closefile CommClose
Ok
>


упс, продолжу в следующий раз.
Последний раз редактировалось chu 04 дек 2010, 07:04, всего редактировалось 4 раз(а).
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

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

Сообщение chu » 10 окт 2010, 09:20

well, moving forth

Обращаю ваше внимание на слово delay. Собственно из-за необходимости иметь такое слово в лексиконе, я и затеял всю эту возню с таймерами и ассемблером. Определено на ассемблере, в комментарии ( после слова '\' ) приведено форт-определение - полный функциональный аналог. Чуть погодя мы сравним "скорострельность" обоих вариантов.

Слово ?us - вот истинный инструмент, о котором я уже упоминал выше. Именно с его помощью возможно оценить временные параметры любого фрагмента кода ( лишь бы он был оформлен в виде одного-единственного слова ). Основную работу выполняет фраза <t1 execute t1>. Привлекает внимание слово execute. Обращаясь к классике жанра ( перевод книги Staring Forth "Начальный курс программирования на языке Форт" (c) Лео Броуди можно взять тут http://fforum.winglion.ru/viewtopic.php?p=20944#20944 ) узнаем, что Слово EXECUTE выполняет определение, адрес которого задается в стеке ( глава 9 ) В этой же главе можно узнать, откуда берется на вершине стека этот самый адрес.

Ну что же, код загружен, приступим к практике. Запускаю HyperTerminal:
Код: Выделить всё

amforth 4.2 ATmega32
> words
?us delay <t1 t1> tccr1b tccr1a -tttt1- run park park park stm2 stm1 .x .rotate
stm? stopoff wave! normal! half! reverse rotate step idx- idx+ init_stm! motor@
stepper: /stepper motor res1 total steps direction dly ststate shft sequence
idx -- normal wave half-step phase -stepper help help-wl -help .base calc-baudrate
.res .( erase -misc twi.scan twi.ping? twi.status? twi.status twi.rxn twi.rx twi.tx
twi.action twi.stop twi.start twi.wait -twi twi.default +twi -spi -spi2x +spi2x +spi
spi.f/128 spi.f/64 spi.f/16 spi.f/4 spi.mode3 spi.mode2 spi.mode1 spi.mode0
spi.MASTER spi.MSB spi.SPE _spi_ ftgl fclr? fset? fclr fset bv flag: pin_pullup_on
pin_highZ toggle pin@ pin_low? pin_high? pin_input pin_output pin! is_high? is_low?
pulse low high bitmask: portpin: tlist alsotask onlytask multi single task activate
cell- task-awake task-sleep stop multitaskpause wake pass follower status dump edump
idump dump> <dump trimm .addr .rcells .ecells .icells ? e? i? .item u.r endcase endof
of case assembler vocabulary Rdefer Rdefer! Rdefer@ Udefer Udefer! Udefer@ Edefer
Edefer! Edefer@ action-of anew possibly move blank nip tuck ? xt>nfa >body chars
char+ c, aligned align restore-input save-input source-id postpone fm/mod sm/rem dabs
?negate ?dnegate dnegate u*/mod sqrt -math m+ 2variable 2constant 2! 2@ 2tuck 2nip
2rot 2swap 2over 2dup 2drop marker i@ (i!) i! e@ e! not s>d up! up@ >< cmove> unloop
i sp! sp@ rp! rp@ +! rshift lshift 1- 1+ xor or and 2* 2/ invert um* um/mod m* + -
log2 d< d> 0> u> u< true 0 0< > < 0<> 0= = <> r@ >r r> rot drop over swap ?dup dup c@
c! ! @ execute exit -int +int UDR UCSRB UCSRA UBRRL UBRRH TWSR TWDR TWCR TWBR TWAR
TCNT2 TCCR2 OCR2 ASSR TCNT1L TCNT1H TCCR1B TCCR1A OCR1BL OCR1BH OCR1AL OCR1AH ICR1L
ICR1H TIMSK TIFR TCNT0 TCCR0 OCR0 SPSR SPDR SPCR PORTD PIND DDRD PORTC PINC DDRC
PORTB PINB DDRB PORTA PINA DDRA GIFR GICR EEDR EECR EEARL EEARH SREG SPL SPH OSCCAL
MCUCSR MCUCR SPMCR ACSR SFIOR ADMUX ADCSRA ADCL ADCH ms 1ms ewords fill #int int@
show-wordlist b> >b b!- b!+ nb! b! b@- b@+ nb@ b@ a> >a a!- a!+ na! a! a@- a@+ na@ a@
wordlist forth definitions previous also forth-wordlist only set-order set-current
spirw sleep wdr -wdt -jtag +usart baud tx? tx rx? rx order get-order get-current
environment? environment end-code code abort abort" [char] immediate recurse user
constant variable [ ] ; :noname : does> create ?do leave +loop loop do again until
repeat while begin then else if literal int! applturnkey is Rdefer Edefer words s" ."
.s u. dinvert d- d+ d2* init-user ee>ram ee-user tib d2/ cmove dnegate dabs d>s j *
defer@ defer! icompare find search-wordlist to value unused noop ver ?stack interpret
depth rp0 sp sp0 cold pause quit place word /string source cscan parse 2swap >number
number char refill accept cskip throw catch handler ' type count spaces space cr
icount itype s, digit? ud/mod ud.r ud. . d. .r d.r sign #> #s # <# hold hld within
max min abs mod / negate u/mod */ /mod */mod turnkey bl hex decimal bin ['] , compile
( \ allot here edp dp /key key? key emit? emit pad #tib >in cell+ cells base state
f_cpu  ok

> .res
amforth 4.2 ATmega32 running at 8000 kHz
free FLASH cells        5357
free RAM bytes          1712
used EEPROM bytes       68
used data stack cells   0
used return stack cells 5
free return stack cells 35
ok
>

Привел состояние системы ( amForth, конечно же ) после загрузки timer1 tools for timing tests. words выводит список всех слов, присутствующих в системе на текущий момент. Количество впечатляет? Это еще не видны слова, находящиеся в словаре assembler. Потестим слово noop:

Код: Выделить всё
> ' noop ?us
(0x9 ) 9  us
ok
>

Как видите, по сравнению с прошлым тестом noop'а, добавились 2 микросекунды - накладные расходы на вызов execute. Это нестрашно. Потестим штатные слова 1ms и ( n -- ) ms:

Код: Выделить всё
> ' 1ms ?us
( 0x3DD ) 989 us
ok
> 1 ' ms ?us
( 0x3F5 ) 1013 us
ok
> 10 ' ms ?us
( 0x26C5 ) 9925 us
ok
> 60 ' ms ?us
( 0xE82E ) 59438 us
ok
> 66 ' ms ?us
( 0xFF64 ) 65380 us
ok
> 67 ' ms ?us
( 0x342 ) 834 us overrun
ok
>

Ну что ж, как видим, временные параметы 1ms и ms близки к заявленым.
Теперь потестим delay. Форт-аналог ассемблерного назову delayf , чтобы они могли совместно присутствовать в словаре:

Код: Выделить всё
> : delayf begin 1- dup 0= until drop ;
ok
> 1 ' delay ?us
( 0xA ) 10 us
ok
> 1 ' delayf ?us
( 0x21 ) 33 us
ok
> 10 ' delay ?us
( 0xE ) 14 us
ok
> 10 ' delayf ?us
( 0xB6 ) 182 us
ok
> 100 ' delay ?us
( 0x3C ) 60 us
ok
> 100 ' delayf ?us
( 0x683 ) 1667 us
ok
> 1000 ' delay ?us
( 0x1FD ) 509 us
ok
> 1000 ' delayf ?us
( 0x4084 ) 16516 us
ok
> 0 ' delay ?us
( 0x800A ) 32778 us
ok
> 0 ' delayf ?us
( 0x8010 ) 32784 us overrun
ok
>

Почувствуйте, как говорится, разницу...

Итого, в сухом остатке - ?us и delay. Минимальная задержка delay = 10 микросекунд, максимальная = 32778. Вполне себе юзабельный результат. Точная подгонка "по месту" обеспечивается ?us. Смею предположить, что ?us может использоваться не только для подбора параметра delay.

Ну вот, можно возвращаться к драйверу мышки пиэспополам.
Скоро будет...moving forth
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

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

Сообщение chu » 08 ноя 2010, 18:57

well, moving forth.

Обещанная писэпопламышь:

Код: Выделить всё

\
\ ps/2 mouse interface
\
\ chu 22:08 07.11.2010 last version
\ chu 10:13 03.10.2010
\
\ =============================================================
\

  marker -ps/2-
 
  forth only also assembler decimal

  code (portbit#)
       R16 R25 mov,
           R25 clr,
       -Y  R25 st,
       -Y  R16 st,
  end-code

  : portbit#:
        create 8 lshift swap $20 - or ,
        does> i@ (portbit#)
   ;

  PORTB 1  portbit#:  ps/2_clk
  PORTB 0  portbit#:  ps/2_data
 
  code +ps/2_clk
        ps/2_clk
        over over 1 -
        swap cbi,   \ set input
        swap sbi,   \ and pull-up
  end-code
 
  code +ps/2_data
        ps/2_data
        over over 1 -
        swap cbi,   \ set input
        swap sbi,   \ and pull-up
  end-code
 
  code -ps/2_clk
        ps/2_clk
        over over 1 -
        swap sbi,   \ set output
        swap cbi,   \ and low
  end-code
 
  code -ps/2_data
        ps/2_data
        over over 1 -
        swap sbi,   \ set output
        swap cbi,   \ and low
  end-code
 
  code ?ps/2_clk+  \ begin ps/2_clk  pin_high? until
       label>
        ps/2_clk  2 - swap sbis,
       <radr rjmp,   
  end-code
 
  code ?ps/2_clk-  \ begin ps/2_clk  pin_low?  until
       label>
        ps/2_clk  2 - swap sbic,
       <radr rjmp,   
  end-code
 
  code ?ps/2_data- \ begin ps/2_data pin_low?  until
       label>
        ps/2_data 2 - swap sbic,
       <radr rjmp,
  end-code
 
  code ?ps/2_data+ \ begin ps/2_data pin_high? until
       label>
        ps/2_data 2 - swap sbis,
       <radr rjmp,
  end-code
 
  code  ps/2_bit        ( p c )
        R16   1 ldi,
        R16 R24 and,    \ get current bit
        R17  Y+ ld,     \ get parity bit
        R17 R16 eor,    \ check parity
        -Y  R17 st,     \ save parity bit
            R24 lsr,    \ next data bit
        -Y  R25 st,
        -Y  R24 st,
        R24 R16 mov,    \ current data bit
  end-code              ( p' c' b )

  code   ps/2_bit@       \ 1 rshift ps/2_data pin_high? if 0x80 or then
        R24 lsr,
        ps/2_data 2 - swap sbic,
        R24 $80 ori,
  end-code


  forth only

  1 constant odd          \ пижонство, ага

  : ps/2!  ( c -- )       \ ps/2 write byte

        odd swap ( p c )
        +ps/2_clk
        +ps/2_data 600 delay        \ idle state
        -ps/2_clk  600 delay        \
        -ps/2_data  18 delay        \ start
        +ps/2_clk                   \     bit

        8 0 do
           ?ps/2_clk- ( p' c' )
            ps/2_bit  if
           +ps/2_data else
           -ps/2_data then
           ?ps/2_clk+
        loop drop ( p )

      \ parity   
        ?ps/2_clk- if
        +ps/2_data else
        -ps/2_data then
        ?ps/2_clk+

      \ stop bit
        ?ps/2_clk-
        +ps/2_data
        ?ps/2_clk+

      \ ack bit
        ?ps/2_clk-
        ?ps/2_data-
        ?ps/2_clk+
        ?ps/2_data+

        -ps/2_clk        \ inhibit transmission
        ;


  : ps/2@  ( -- c )      \ ps/2 read byte

        0                \ room for incoming byte
        +ps/2_data
        +ps/2_clk 80 delay     \ idle ~50us ( хз зачем, где-то вычитал...)
        ?ps/2_clk-             \
        ?ps/2_data-            \ start bit      
        ?ps/2_clk+             \

        8 0 do
           ?ps/2_clk-
            20  delay  ps/2_bit@
           ?ps/2_clk+
        loop

      \ parity bit
        ?ps/2_clk-
        ?ps/2_clk+        \ ignored

      \ stop bit
        ?ps/2_clk-
        ?ps/2_data+
        ?ps/2_clk+   

      \ hold incoming data
        -ps/2_clk
        ;

\
\ =========================================================
\   

  marker -mice-

         $FA constant mice_ack           \ мышкины ответы
         $FF constant mice_reset         ( 1 + 2 )
         $F2 constant mice_id            ( 1 + 1 )
         $F0 constant mice_remote        ( 1 )
         $EB constant mice_read          ( 1 + 3 )
         $E9 constant mice_status        ( 1 + 3 )

         $80 constant y-ovflw
         $40 constant x-ovflw
         $20 constant y-sign
         $10 constant x-sign
          $4 constant m-btn
          $2 constant r-btn
          $1 constant l-btn

\ =========================================================
\ mouse test words

  : m!@ ( n c -- )  ps/2! 0 ?do ps/2@ .x bl emit loop cr ;

  : m0  3 mice_reset m!@ 300 delay 1 mice_remote m!@ 180 delay ;

  : m@  4 mice_read m!@ ;




Мдэ, пиэса пополам в стихах... :o
Будем ожидать связки мышка+шагомоторчики...moving forth.
Последний раз редактировалось chu 04 дек 2010, 07:42, всего редактировалось 1 раз.
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

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

Сообщение chu » 21 ноя 2010, 18:10

In Forth We trust.

Ну-с, помолясь, приступаю...
Мой анабасис по просторам робофорума завершается вполне себе удовлетворительно.
Мыша под контролем, шаговички шевелятся сообразно мышкиным телодвижениям. Кривовато, но но при первом приближении - благостно :roll:

Особо удалось возвращение шаговичков в исходное положение при нажатии правой кнопки мыша - работает исправно. Кривость имеет своей причиной сырой код и проявляется в не всегда адекватном вращении двигателей. Лечится переосмыслением и переработкой stepper12.f и polar.f, а также ( предположительно ) настройкой scaling и resolution параметров мыша. К качеству драйвера мыша ps2m.f лично у меня претензий нет, более того, считаю получившийся код плотным и прозрачным для понимания ( пригодным для применения в других проектах ). Прошивочку не выкладываю по двум причинам: - 1. без бубна не заработает ( необходима инициализация структур двигателей в озу и инициализация multitasker'a ). - 2. зафиксировано отсутствие практического интереса к этой теме у читателей данной периферийной ветки робофорума, иными словами - похоже, что неактуально.
Кстати, бубен к п.1 довольно прост: увидев в консоли amforth'a готовность, необходимо набрать -polar-
Код: Выделить всё
> amforth 4.2 ATmega32
> -polar-
ok
>

после чего amforth "забудет" все, начиная со строчки marker -polar- и до самого конца. После этого скормить amforth'у аплоадером ( штатный uploader лежит в папочке /tools ) файлик polar.f и набрать в консоли polar-go!...
Код: Выделить всё
> polar-go!
FA  AA  0 
FA 
ok
> stm1 stm0 stm? stm?

port.............3B
mask.............F
.................
idx..............0
sequence.........1
delay............2
direction........0
steps to rotate..0
total steps......0
motor status.....0

port.............3B
mask.............F0
.................
idx..............0
sequence.........1
delay............5
direction........-1
steps to rotate..0
total steps......0
motor status.....0
ok
> .res
amforth 4.2 ATmega32 running at 8000 kHz
free FLASH cells        4484
free RAM bytes          1356
used EEPROM bytes       72
used data stack cells   0
used return stack cells 5
free return stack cells 35
ok
> words
polar-go! task-stm? task-azimuth task-altitude task-control polar-stm? polar-azimuth
polar-altitude polar-control azimuth altitude stm_control ?action park? park! run
stm+! steps! stm1 stm0 -polar- m? workout mflags m@ !m m!@ l-btn r-btn m-btn x-sign
y-sign x-ovflw y-ovflw mice_status mice_read mice_remote mice_id mice_reset mice_ack
-mice- ps/2@ ps/2! odd ps/2_bit@ ps/2_bit ?ps/2_data+ ?ps/2_data- ?ps/2_clk-
?ps/2_clk+ -ps/2_data -ps/2_clk +ps/2_data +ps/2_clk ps/2_data ps/2_clk portbit#:
(portbit#) -rot -ps/2- stm? stm_unlock stm_lock stm_lock? lock_stm park stopoff wave!
normal! half! reverse direction! rotate step total- total+ idx- idx+ init_stm! motor@
stepper: motor! /stepper motor res1 total steps direction dly ststate shft sequence
idx -- normal wave half-step phase -stepper- ?us .t1 <t1> delay <t1 t1> tccr1b tccr1a
-tttt1- .x help help-wl -help .base calc-baudrate .res .( erase -misc twi.scan
twi.ping? twi.status? twi.status twi.rxn twi.rx twi.tx twi.action twi.stop twi.start
twi.wait -twi twi.default +twi -spi -spi2x +spi2x +spi spi.f/128 spi.f/64 spi.f/16
spi.f/4 spi.mode3 spi.mode2 spi.mode1 spi.mode0 spi.MASTER spi.MSB spi.SPE _spi_ ftgl
fclr? fset? fclr fset bv flag: pin_pullup_on pin_highZ toggle pin@ pin_low? pin_high?
pin_input pin_output pin! is_high? is_low? pulse low high bitmask: portpin: tlist
alsotask onlytask multi single task activate cell- task-awake task-sleep stop
multitaskpause wake pass follower status dump edump idump dump> <dump trimm .addr
.rcells .ecells .icells ? e? i? .item u.r endcase endof of case assembler vocabulary
Rdefer Rdefer! Rdefer@ Udefer Udefer! Udefer@ Edefer Edefer! Edefer@ action-of anew
possibly move blank nip tuck ? xt>nfa >body chars char+ c, aligned align
restore-input save-input source-id postpone fm/mod sm/rem dabs ?negate ?dnegate
dnegate u*/mod sqrt -math m+ 2variable 2constant 2! 2@ 2tuck 2nip 2rot 2swap 2over
2dup 2drop marker i@ (i!) i! e@ e! not s>d up! up@ >< cmove> unloop i sp! sp@ rp! rp@
+! rshift lshift 1- 1+ xor or and 2* 2/ invert um* um/mod m* + - log2 d< d> 0> u> u<
true 0 0< > < 0<> 0= = <> r@ >r r> rot drop over swap ?dup dup c@ c! ! @ execute exit
-int +int UDR UCSRB UCSRA UBRRL UBRRH TWSR TWDR TWCR TWBR TWAR TCNT2 TCCR2 OCR2 ASSR
TCNT1L TCNT1H TCCR1B TCCR1A OCR1BL OCR1BH OCR1AL OCR1AH ICR1L ICR1H TIMSK TIFR TCNT0
TCCR0 OCR0 SPSR SPDR SPCR PORTD PIND DDRD PORTC PINC DDRC PORTB PINB DDRB PORTA PINA
DDRA GIFR GICR EEDR EECR EEARL EEARH SREG SPL SPH OSCCAL MCUCSR MCUCR SPMCR ACSR
SFIOR ADMUX ADCSRA ADCL ADCH ms 1ms ewords fill #int int@ show-wordlist b> >b b!- b!+
nb! b! b@- b@+ nb@ b@ a> >a a!- a!+ na! a! a@- a@+ na@ a@ wordlist forth definitions
previous also forth-wordlist only set-order set-current spirw sleep wdr -wdt -jtag
+usart baud tx? tx rx? rx order get-order get-current environment? environment
end-code code abort abort" [char] immediate recurse user constant variable [ ] ;
:noname : does> create ?do leave +loop loop do again until repeat while begin then
else if literal int! applturnkey is Rdefer Edefer words s" ." .s u. dinvert d- d+ d2*
init-user ee>ram ee-user tib d2/ cmove dnegate dabs d>s j * defer@ defer! icompare
find search-wordlist to value unused noop ver ?stack interpret depth rp0 sp sp0 cold
pause quit place word /string source cscan parse 2swap >number number char refill
accept cskip throw catch handler ' type count spaces space cr icount itype s, digit?
ud/mod ud.r ud. . d. .r d.r sign #> #s # <# hold hld within max min abs mod / negate
u/mod */ /mod */mod turnkey bl hex decimal bin ['] , compile ( \ allot here edp dp
/key key? key emit? emit pad #tib >in cell+ ceЃ&s base state f_cpu  ok
> stm1 stm0 stm? stm?

port.............3B
mask.............F
.................
idx..............4
sequence.........1
delay............2
direction........0
steps to rotate..0
total steps......-996
motor status.....0

port.............3B
mask.............F0
.................
idx..............2
sequence.........1
delay............5
direction........0
steps to rotate..0
total steps......162
motor status.....0
ok
> stm1 stn m0 stm? stm?

port.............3B
mask.............F
.................
idx..............7
sequence.........1
delay............2
direction........0
steps to rotate..0
total steps......-641
motor status.....0

port.............3B
mask.............F0
.................
idx..............5
sequence.........1
delay............5
direction........0
steps to rotate..0
total steps......589
motor status.....0
ok
> stm1 stm0 stm? stm?

port.............3B
mask.............F
.................
idx..............0
sequence.........1
delay............2
direction........0
steps to rotate..0
total steps......0
motor status.....0

port.............3B
mask.............F0
.................
idx..............0
sequence.........1
delay............5
direction........-1
steps to rotate..0
total steps......0
motor status.....0
ok
> stm1 stm0 stopoff stopoff
ok
>


Ну вот, мой анабасис и завершился. "Полярную" тему я пока отложу, бо нету подходящих задач, вам - безразлично, а мне - стало скучно. Интересно былобы мини-бота поднять на amforth'e, но один - не возьмусь, а энтузиастов не наблюдается ( да и мини-бота у мене немае...). Опять же, ребята с эмбеддерз.орг попеняли мне - чего, мол, не у них выложился ( а нефиг форт гнобить и надсмехаться ;)). Есть еще интерес - camelforth для msp430 пошевелить, но это уже не здесь будет, видимо...
Moving forth...
Исходнички ( для любопытствующих ) приложил.
Вложения
my.zip
(4.39 КиБ) Скачиваний: 0
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

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

Сообщение chu » 05 дек 2010, 11:47

moving forth

фотосенсор на светодиоте: http://robocraft.ru/blog/arduino/70.html

любопытно. поковырялся и я:
Код: Выделить всё

\
\ portbit#: required
\
 
  marker =senseled=
 
  forth only also assembler
 
  PORTC 7 portbit#: -led   \ cathode
  PORTC 6 portbit#: +led   \ anode

  code  -led+
        -led over over 1-
        swap sbi,       \ set output
        swap sbi,       \ and high
  end-code
 
  code  -led-
        -led over over 1-
        swap cbi,       \ set input
        swap cbi,       \ and low
  end-code

  code  +led-
        +led over over 1-
        swap sbi,       \ set output
        swap cbi,       \ and low
  end-code


  code  ?led            ( -- d )
         R16 clr,
         R17 clr,
  label>
         clc,
         R24 1  adiw,
         R16 R2  adc,
         R17 R2  adc,
        -led 2 - swap sbic,
  <radr  rjmp,

         -Y  R25 st,
         -Y  R24 st,
         R24 R16 movw,
  end-code
   
   
  forth only

\ замерить однократно
  : senseled -led+ +led- 0 delay 0  -led- ?led ; ( -- d )

\ замерять и выводить на консоль до нажатия любой клавиши
  : sled  begin senseled 11 ud.r cr key? until ;



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

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

Сообщение Eruman » 05 дек 2010, 22:35

Здорово. Жалко, повторить не на чем...
Соединяй и здравствуй.
Аватара пользователя
Eruman
 
Сообщения: 897
Зарегистрирован: 12 авг 2010, 15:10
Откуда: Астраханская обл.

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

Сообщение chu » 07 дек 2010, 18:37

Разжился датчиком ds1822 . Скоро буду измерять температуру за бортом.
Поисковый алгоритм для сети 1-wire microlan тоже будет, но не сразу.
moving forth.


Код: Выделить всё
\
\ 1-wire
\
\ *chu* 20:41 07.12.2010*
\       20:30 12.12.2010* last
\ =============================================================
\

  marker =1-wire=
 
\
\ базовые примитивы:
\  1w-presence?  1w-bit@  1w-bit0!  1w-bit1!   1w-c!  1w-c@


\ delay_A =   6 us
\ delay_B =  64 us
\ delay_C =  60 us
\ delay_D =  10 us
\ delay_E =   9 us
\ delay_F =  55 us
\ delay_G =   0
\ delay_H = 480 us
\ delay_I =  70 us
\ delay_J = 410 us


  PORTC 5 portbit#: dq   \ assembler name
  PORTC 5 portpin:  DQ   \ highlevel name

  -jtag
 
  forth only also assembler decimal
 
  code  int-restore  ( sreg -- )
        SREG $20 - R24 out,
        R24  Y+ ld,
        R25  Y+ ld,
  end-code
       
  code  dq+
        dq over over 1 -
        swap cbi, \ set input
        swap sbi, \ and pull-up
  end-code
 
  code  dq-
        dq over over 1-
        swap sbi, \ set output
        swap cbi, \ and low
  end-code
 
  code  (1w-bit@) \ 1 rshift DQ pin@ if $80 or then
        R24 lsr,
        dq  $2 - swap sbic,
        R24 $80 ori,
  end-code

  forth only

  : 1w-reset
        dq+ -int
        dq- 940 delay ( H )
        int-restore
        ;

  : 1w-presence?  ( -- f ) \ is anybody alive on 1-wire?
        dq+ -int
        dq- 940 delay ( H )
        DQ
        dq+  70 delay ( I )
        pin@ 0=
        swap int-restore
        ;
       
  : 1w-bit@ ( c -- c' )
        dq+ -int swap
        dq- noop      ( A )
        dq+ noop noop ( E )
       (1w-bit@)
        85  delay     ( F )
        swap int-restore
        ;

  : 1w-0bit!
        dq+ -int
        dq- 101 delay ( C )
        dq+   1 delay ( D )
        int-restore
        ;

  : 1w-1bit!
        dq+ -int
        dq- noop      ( A )
        dq+ 110 delay ( B )
        int-restore
        ;
       
\ byte transmission functions

  : 1w-c!   ( c -- )
        8 0 do
            dup 1 and if
            1w-1bit!  else
            1w-0bit!  then
            1 rshift
        loop drop
        ;
 
  : 1w-c@   ( -- c )
        0 8 0 do 1w-bit@ loop
        ;

\ block transmission functions

  : 1w!  ( addr n -- )
        over + swap
        do i c@ 1w-c! loop
        ;

  : 1w@  ( addr n -- )
        over + swap
        do 1w-c@ i c! loop
        ;
 
\
\ =============================================================

\ ds1822 Econo 1-Wire® Digital Thermometer
\

  marker =ds1822=
 
  $01  constant  DS2401_ID    \ Silicon Serial Number
  $10  constant  DS18S20_ID   \ 1-Wire Parasite-Power Digital Thermometer
  $28  constant  DS18B20_ID   \
  $22  constant  DS1822_ID    \ Programmable Resolution 1-Wire Digital Thermometer
 
\ DS1820/DS1822 ROM COMMANDS
  $F0  constant  SEARCH_ROM
  $33  constant  READ_ROM
  $55  constant  MATCH_ROM
  $CC  constant  SKIP_ROM
  $EC  constant  ALARM_SEARCH

\ DS1820/DS1822 FUNCTION COMMANDS
  $44  constant  CONVERT_T
  $4E  constant  WRITE_SCRATCHPAD
  $BE  constant  READ_SCRATCHPAD
  $48  constant  COPY_SCRATCHPAD
  $B8  constant  RECALL_E2   
  $B4  constant  READ_POWER_SUPPLY

\ структуры памяти ds1822

   0       \ rom
   1   --   1w_family
   6   --   1w_ident
   1   --   1w_crc
  constant /1w_rom

   0       \ scratchpad
   1   --   thermo.templ
   1   --   thermo.temph
   1   --   thermo.threg
   1   --   thermo.tlreg
   1   --   thermo.config
   1   --   thermo.res$FF
   1   --   thermo.res$0C
   1   --   thermo.res$10
   1   --   thermo.crc
  constant /scratchpad

here dup /1w_rom dup allot erase value ds1822
here dup /scratchpad dup allot erase value scratchpad





двигаюсь дальше.
... причесал и приукрасил, датчик определется ( отсутсвие тоже;)
чтение/запись работают...
продолжаю moving forth
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

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

Сообщение Dominus » 28 дек 2010, 18:40

вот и я зарегался а без работы может и время найдется на форт и прочее
Dominus
 
Сообщения: 1
Зарегистрирован: 16 дек 2010, 19:30

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

Сообщение Alex-chin » 01 фев 2011, 23:39

amforth - это интересно. Но как собрать из исходников в AVR Studio понять не удалось. Кто может помочь?
Аватара пользователя
Alex-chin
 
Сообщения: 8
Зарегистрирован: 25 янв 2011, 23:51
прог. языки: prolog?, C++

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

Сообщение chu » 06 фев 2011, 13:34

Я установил AVR Studio, но откомпилировать не смог. постоянно ошибки не найден файл.

я тоже с этим парился. возможное решение - при открытом проекте ( в AVR Studio ) зайти ->Project->Assembler options и поправить Additional include path как-то так: ...\amforth-4.2\core. точнее не скажу, не видел сообщений AVR Studio.

И второй вопрос: на ATMega168 запустится?

запустится, но придется экономить память, лишаясь некоторых удобств. (...\amforth-4.2\lib\files.frt )

на некоторые вопросы можно найти ответы на http://amforth.sourceforge.net/
в разделе FAQ последним пунктом - Compiling amforth under Windows. рекомендую ознакомиться.

прилагаю свою свежую рабочую папочку с проектом AVR Studio 4.18.700 ; AVR ATmega32 @16MHz. работает. библиотечных файлов не загружал (пока). фьюзы - вложены.
в листинге AVR Studio все подробно видно - включенные файлы и использованный ресурс микроконтроллера.
Вложения
template_4.zip
(216.18 КиБ) Скачиваний: 0
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

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

Сообщение Alex-chin » 08 фев 2011, 01:28

Ага все получилось!
путь надо просто прописать полный к core.
буду осваивать. Спасибо!

а слово .res это откуда?
Аватара пользователя
Alex-chin
 
Сообщения: 8
Зарегистрирован: 25 янв 2011, 23:51
прог. языки: prolog?, C++

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

Сообщение chu » 08 фев 2011, 04:56

Alex-chin писал(а):Ага все получилось!

:beer:

Alex-chin писал(а):а слово .res это откуда?

...\amforth-4.2\lib\misc.frt
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

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

Сообщение chu » 09 фев 2011, 05:08

2 Dominus

в SP-Forth 4 (Windows) "надписи на русском языке" выводятся так:
Код: Выделить всё
   S" русское слово из трех буков?"  ANSI>OEM TYPE CR
Аватара пользователя
chu
 
Сообщения: 77
Зарегистрирован: 23 сен 2010, 09:16
прог. языки: Forth

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

Сообщение Alex-chin » 10 фев 2011, 01:30

Начинаю оценивать мощь Форта.
Действительно можно программировать прямо на МК. Это круто!. А режим интерпретации дает вообще неограниченные возможности по интерактивному изучению МК.
Код: Выделить всё
amforth 4.2 ATmega168
> hex
ok
> 1 24 !
ok
> 1 25 !
ok
> 0 25 !
ok
>

помигал светодиодом
Аватара пользователя
Alex-chin
 
Сообщения: 8
Зарегистрирован: 25 янв 2011, 23:51
прог. языки: prolog?, C++

Пред.След.

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

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

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