roboforum.ru

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

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

Ответить

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

chu » 21 май 2012, 20:51

хех, похоже, бедолага споткнулся о те самые грабли, которые я упоминал:
http://www.element14.com/community/message/49218

in the mean time i compiled the 4.8 version.
but after flashed it to my arduino notting is output after a reset
even when I reset , the transmit led is not blinking!

when i press the keybord i see activities on the receive led
that concludes that the serial connection is okee.

do you have a clou?

thanks in avance for any help

Jan
Последний раз редактировалось chu 21 июн 2012, 18:31, всего редактировалось 1 раз.

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

ilya73 » 22 май 2012, 02:16

chu писал(а): коренным образом перелопатил свой модулёчек tttt1.f - захотелось мне параметр для ?delay
всетаки нарисую весь код tttt1.f, прошу простить:
Код: Выделить всёРазвернуть
\
\ tttt1.frt - timer1 tools for timing tests
\   : ?delay ( n -- ) begin dup 0= not while 1- again drop ;

: <t1>  t1> 0 dup TCNT1H c! TCNT1L c! $3c TIFR c! ;


\ ( -- ? ) check timer1 overflow
: tov1?
        TIFR  dup c@ $4 and   \ test  TOV1 flag
        swap over swap  c!   \ clear TOV1 by writing'1'
        ;





Чёйто не заработало у меня!?
А именно интерпретатор выругался на TIFR нашёл файлик с константами atmega328p.frt
Код: Выделить всёРазвернуть
35 constant TIFR0   \ Timer/Counter0 Interrupt Flag register

Результат 0-й :(

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

chu » 23 май 2012, 09:39

ilya73 писал(а): интерпретатор выругался на TIFR

об этом я тоже упоминал.
аппаратно-зависимый код, имена регистров и битов, адреса регистров и номера битов...
изучение даташитов настоятельно рекомендуется
аппаратно-зависимый код по необходимости обязательно изменяется.
именно по этой причине ( при сборке amforth'а)
Код: Выделить всёРазвернуть
    имею 5 ошибок, 0 предупреждений == не найдены (не определены) символы
    "WDTCSR", "SMCR". файлы words\no-wdt.asm words\sleep.asm соответственно

мне пришлось переписывать оригинальные
sleep.asm и no-wdt.asm ( ...core\words\) ( дописал условную компиляцию .ifdef .else .endif)

просмотр файлов (...core\devices\) atmega32a.frt и atmega328.frt показывает:
Код: Выделить всёРазвернуть

\ mega32.frt

\ TIMER_COUNTER_1
47 constant ICR1H   \ Timer/Counter1 Input Capture Register High Byte
46 constant ICR1L   \ Timer/Counter1 Input Capture Register Low Byte
4B constant OCR1AH   \ Timer/Counter1 Output Compare Register High Byte
4A constant OCR1AL   \ Timer/Counter1 Output Compare Register Low Byte
49 constant OCR1BH   \ Timer/Counter1 Output Compare Register High Byte
48 constant OCR1BL   \ Timer/Counter1 Output Compare Register Low Byte
4F constant TCCR1A   \ Timer/Counter1 Control Register A
4E constant TCCR1B   \ Timer/Counter1 Control Register B
4D constant TCNT1H   \ Timer/Counter1 High Byte
4C constant TCNT1L   \ Timer/Counter1 Low Byte


\ mega328.frt
\ TIMER_COUNTER_1
87 constant ICR1H   \ Timer/Counter1 Input Capture Register High Byte
86 constant ICR1L   \ Timer/Counter1 Input Capture Register Low Byte
89 constant OCR1AH   \ Timer/Counter1 Output Compare Register High Byte
88 constant OCR1AL   \ Timer/Counter1 Output Compare Register Low Byte
8B constant OCR1BH   \ Timer/Counter1 Output Compare Register High Byte
8A constant OCR1BL   \ Timer/Counter1 Output Compare Register Low Byte
80 constant TCCR1A   \ Timer/Counter1 Control Register A
81 constant TCCR1B   \ Timer/Counter1 Control Register B
82 constant TCCR1C   \ Timer/Counter1 Control Register C
85 constant TCNT1H   \ Timer/Counter1 High Byte
84 constant TCNT1L   \ Timer/Counter1 Low Byte
36 constant TIFR1   \ Timer/Counter Interrupt Flag register
6F constant TIMSK1   \ Timer/Counter Interrupt Mask Register



в даташите на мегу328 обнаруживается:
Код: Выделить всёРазвернуть
For the Extended I/O space from 0x60 - 0xFF in SRAM,
only the ST/STS/STD and LD/LDS/LDD instructions can be used.


а вот итог:
Код: Выделить всёРазвернуть

\ ==========================================
\ some changes (registers names) for mega328
\ ==========================================

\ For the Extended I/O space from 0x60 - 0xFF in SRAM,
\ only the ST/STS/STD and LD/LDS/LDD instructions can be used.

\ stop timer1
  code t1>   
        TCCR1B  R2  sts,   
  end-code


\ ( n -- )
\ start timer1 with n clock source

  code <t1
        R16    $7     ldi,   \ mask for Clock Select bits
        R16    R24    and,

        R24    Y+      ld,
        R25    Y+      ld,

        R17    TCCR1B lds,

        R17    $F8   andi,   \ clear Clock Select bits
        R17    R16     or,   \ set   Clock source

        TCCR1B R17    sts,
  end-code

0 TCCR1A c!
0 TCCR1B c!
\ The PRTIM1 bit in ”PRR – Power Reduction Register” (on page 45) must be
\ written to zero to enable Timer/Counter1 module.
0 PRR    c! \ на всякий случай


\  stop timer1 & zero counter
: <t1>  t1> 0 dup TCNT1H c! TCNT1L c!
         $27 TIFR1 c! \ сбросить TOV1 (и остальные флаги до кучи)
         ;

\ ( -- ? ) check timer1 overflow
: tov1?
         TIFR1  dup c@ 1 and   \ test  TOV1 flag
         swap  over swap  c!   \ clear TOV1 by writing'1'
         ;

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


вот, как-то так...(должно работать, но проверить немогу - нету меги328)
рекомендуется самостоятельно поправить tttt1.f, и да поможет вам marker :)
go forth

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

ilya73 » 24 май 2012, 01:45

chu писал(а):...........
об этом я тоже упоминал.
аппаратно-зависимый код, имена регистров и битов, адреса регистров и номера битов...
изучение даташитов настоятельно рекомендуется
аппаратно-зависимый код по необходимости обязательно изменяется.
именно по этой причине ( при сборке amforth'а)
..........
рекомендуется самостоятельно поправить tttt1.f, и да поможет вам marker :)
go forth

Учтём! Последний раз программировал на ассемблере во времена Радио-86РК, ZX-Spectrum :pardon:
Поправил, залил и вот результат
Код: Выделить всёРазвернуть
> : test10us <t1> 1 <t1 [ 10 us/ ] literal ?delay t1> t1@ ;
ok
> test10us dup .ticks .us

(0xA1 ) 161 ticks = 10.062500 us

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

chu » 24 май 2012, 07:26

ilya73 писал(а):
Код: Выделить всёРазвернуть
(0xA1 ) 161 ticks = 10.062500 us

"дополнительный" такт ( в сравнении с моим примером) появляется по причине разной длительности машинных команд, примененных в слове остановки таймера t1> : out - 1 такт, sts - 2 такта

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

ilya73 » 25 май 2012, 18:39

Уважаемый тов. Chu? Тут решил попробовать 1-вайре, но ведь нет а amforth слова --?
Вот как быть тов. начинающим?
Не все, начинающие - Фортеры! Смогут понять "не совместимость" разных веток Форт-а!? :)

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

chu » 26 май 2012, 07:20

Код: Выделить всёРазвернуть
: -- create over , + does> i@ + ;

определение этого слова можно найти в моих первых постах

Добавлено спустя 48 минут 4 секунды:
ilya73 писал(а): Тут решил попробовать 1-вайре

там еще понадобятся twi-модули, я упоминал уже что использую 24c512 ( и еще ds1307)
twi-my.zip
(2.5 КиБ) Скачиваний: 0

оригинальные не пойдут - кое-что переделал, в основном добавил расчет битрейта twi из тактовой частоты микроконтроллера. порядок загрузки: twi.frt twi-eeprom.frt i2c-24c512.f

ilya73 писал(а):Вот как быть тов. начинающим?

начинающим (а так же всем) существенно помогает чтение иходников :pardon:

Добавлено спустя 55 минут 5 секунд:
у меня сейчас загружено следущее в таком порядке:
Код: Выделить всёРазвернуть

marker.frt
postpone.frt
vocabulary.frt
assembler.frt
multitask.frt
bitnames.frt
atmega32.frt
misc.frt

tttt1.f
portbit.f
struct.f
twi.frt
twi-eeprom.frt
i2c-24c512.f
ascii_lcd.f
lcd.f
ds1307.f
crc.f
1w++.f
1w-search.f
1w-sensors.f



примерно 7К байт еще свободно

portbit.f - определение portbit#:, struct.f - определение --

moving forth

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

ilya73 » 29 май 2012, 01:44

Забавно, в стандартной сборке забыли присоединить слово nip !? :shock:
Бум попытаться пере-компилировать.

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

chu » 29 май 2012, 06:07

ilya73 писал(а):Забавно, в стандартной сборке забыли присоединить слово nip !? :shock:
Бум попытаться пере-компилировать.

nip довольно редко используется, можно и не пересобирать из-за него всю систему. можно заменять в исходниках на swap drop или определить:
Код: Выделить всёРазвернуть
: nip swap drop ;

или так:
Код: Выделить всёРазвернуть
code  nip
      YL 2 adiw,
end-code

если будешь перекомпилировать amforth, добавь -rot, у них это слово отсутствует напрочь, а я его частенько использую, удобно.
просто замени оригинальный rot.asm на этот
Код: Выделить всёРазвернуть
; ( n1 n2 n3 -- n2 n3 n1) 
; Stack
; rotate the three top level cells
VE_ROT:
    .dw $ff03
    .db "rot",0
    .dw VE_HEAD
    .set VE_HEAD = VE_ROT
XT_ROT:
    .dw PFA_ROT
PFA_ROT:
    movw temp0, tosl
    ld temp2, Y+
    ld temp3, Y+
    loadtos
       
    st -Y, temp3
    st -Y, temp2
    st -Y, temp1
    st -Y, temp0

    jmp_ DO_NEXT

;;;;;;;;;;;;;;;;;;;;;;;;;;;;; chu 11:23 25.03.2012

; ( n1 n2 n3 -- n3 n1 n2)
; Stack
; rotate the three top level cells
VE_MROT:
    .dw $ff04
    .db "-rot"
    .dw VE_HEAD
    .set VE_HEAD = VE_MROT
XT_MROT:
    .dw PFA_MROT
PFA_MROT:
    movw temp0, tosl
    loadtos
    ld temp2, Y+
    ld temp3, Y+

       
    st -Y, temp1
    st -Y, temp0
    st -Y, temp3
    st -Y, temp2

    jmp_ DO_NEXT

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


хм, чего-то вложением не получилось...
go forth

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

ilya73 » 30 май 2012, 02:05

chu писал(а):если будешь перекомпилировать amforth, добавь -rot, у них это слово отсутствует напрочь, а я его частенько использую, удобно.
go forth

Разобрался, добаил nip & -rot, перекомпилил (в релизи был косячок), вроде фунцикулирует! :D

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

chu » 30 май 2012, 08:51

ilya73 писал(а):..., перекомпилил (в релизи был косячок),...

про косячки бы чуток подробнее, хотя бы коротко, мы тут все-таки не одни, может ещё кто подтянется и будет ему полезно знать 8)
например, как то так:
компилер ругается - код не лезет в память - перетасовал includ'ы, проблема решена

тоже, кстати, случается ...
and so forth

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

ilya73 » 30 май 2012, 16:45

chu писал(а):
ilya73 писал(а):..., перекомпилил (в релизи был косячок),...

про косячки бы чуток подробнее, хотя бы коротко, мы тут все-таки не одни, может ещё кто подтянется и будет ему полезно знать 8)
например, как то так:
компилер ругается - код не лезет в память - перетасовал includ'ы, проблема решена

тоже, кстати, случается ...
and so forth

Вкратце: изначально "код не лезет в память", подменяем файл dict_appl_core.inc, на аналогичный из ветки "trunk"- заработало :) , но не всё :( .
Вот мой вариант dict_appl_core.inc (для Arduino UNO):
Код: Выделить всёРазвернуть
.include "dict_core.inc"

.include "words/store-e.asm"
.include "words/fetch-e.asm"

.include "words/store-i.asm"
.include "words/store-i_nrww.asm"
.include "words/fetch-i.asm"
;.include "dict_interrupt.inc"
.include "dict_compiler.inc"
;.include "dict_usart.inc"
.include "dict_wl.inc"
;.include "dict_mcu.inc"
;.include "dict_minimum.inc"

.include "words/fill.asm"
.include "words/d-2star.asm"
.include "words/d-plus.asm"
.include "words/d-minus.asm"
.include "words/d-invert.asm"
.include "words/udot.asm"
.include "words/dot-s.asm"

.include "words/dotstring.asm"
.include "words/squote.asm"

.include "words/edefer.asm"
.include "words/rdefer.asm"
.include "words/is.asm"

.include "words/applturnkey.asm"
.include "words/1ms.asm"
.include "words/ms.asm"
.include "words/show-wordlist.asm"
.include "words/words.asm"
;.include "device.inc"

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

ilya73 » 01 июн 2012, 19:55

Ув. тов. Chu!
Для целей в которых я решил использовать Атмегу, весьма было-бы кстати применение ds1307.f (это позволит отказаться от "сервера"). Т.е. хочется иметь привязку событий по времени.
Как у Вас с данной либой дела? ;)

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

chu » 03 июн 2012, 08:32

упс, слегка выпал из потока событий - бился с Winlock капканом. Я его забодал, но еще не все организационные мероприятия выполнил ( ищу ключи для NIS2012 19.1.1.3 )
ну да ладно...

вот ds1307.f

Код: Выделить всёРазвернуть
\
\ 11:13 12.10.2011 vum chu
\
\ ====================================================
\
\ ds1307 64x8 Serial Real-Time Clock
\
\  anew =ds1307=
marker =ds1307=
\
\ ====================================================
\  ds1307 operates in the regular mode (100kHz) only !
\ ====================================================
\

  $d0  constant  twi.ds1307 \ device address on i2c bus

\
\ ds1307 address map
\

  $00  constant  RTC_SECONDS
  $01  constant  RTC_MINUTES
  $02  constant  RTC_HOURS
  $03  constant  RTC_DAY
  $04  constant  RTC_DATE
  $05  constant  RTC_MONTH
  $06  constant  RTC_YEAR
  $07  constant  RTC_CONTROL
 
  $08  constant  RTC_RAM
  $3f  constant  RTC_RAM_LAST
 
\
\    ds1307 control register
\ mask ................... bit

  $01  constant  BIT_RS0  \ 0
  $02  constant  BIT_RS1  \ 1
  $10  constant  BIT_SQWE \ 4
  $80  constant  BIT_OUT  \ 7

\ clock halt bit==1, oscillator is disabled 
  $80  constant  clock_halt \ 7

\ 1== 12-hour mode is selected
  $40  constant  12/24    \ 6

\
\
\

  : twi.rtc! ( c addr -- )

      \ send device address
        twi.ds1307
        twi.start
        twi.tx      $18 twi.status?

      \ send ds1307 cell address
        twi.tx      $28 twi.status?

      \ send data byte
        twi.tx      $28 twi.status?
        twi.stop
        ;

  : twi.rtc@ ( addr -- c )

        twi.ds1307
        twi.start
        twi.tx      $18 twi.status?
        twi.tx      $28 twi.status?

      \ repeated start to read the data byte
        twi.start   $10 twi.status?
        twi.ds1307  set-rw
        twi.tx      $40 twi.status?
        twi.rxn     $58 twi.status?
        twi.stop
        ;


\
  : rtc-cold
        clock_halt RTC_SECONDS twi.rtc! \ osc disabled
        $00        RTC_HOURS   twi.rtc! \ 24-hour mode
        BIT_OUT    RTC_CONTROL twi.rtc! \ sqw/out pin==1, 1Hz rate
        ;

\
  : rtc+
        RTC_SECONDS twi.rtc@
        clock_halt  invert and
        RTC_SECONDS twi.rtc!
        ;
     
\
  : rtc-
        RTC_SECONDS twi.rtc@
        clock_halt  or
        RTC_SECONDS twi.rtc!
        ;     
     

\
  : rtc-clear
      \ send device address
        twi.ds1307
        twi.start
        twi.tx       $18 twi.status?  \ set ds1307

        $00 dup
        twi.tx       $28 twi.status?  \      address pointer

        $40 0
             do   dup
              twi.tx $28 twi.status?  \ send data byte
             loop drop
     
        twi.stop
        ;

\
\
\ ====================================================
\
: >rtc ( ramaddr cnt rtc.addr -- )

        twi.ds1307
        twi.start   
        twi.tx     $18 twi.status?    \ set ds1307
        twi.tx     $28 twi.status?    \     address pointer
   
        over + swap
        ?do
            i c@
            twi.tx $28 twi.status?
        loop

        twi.stop
        ;

: rtc> ( ramaddr cnt rtc.addr -- )

        twi.ds1307
        twi.start   
        twi.tx     $18 twi.status?    \ set ds1307
        twi.tx     $28 twi.status?    \     address pointer
   
      \ repeated start to receive the data bytes
        twi.start  $10 twi.status?
        twi.ds1307 set-rw
        twi.tx     $40 twi.status?
   
        over + dup 1- rot
        ?do
            twi.rx $50 twi.status?
            i c!
        loop
        twi.rxn    $58 twi.status?
        swap c!

        twi.stop
        ;



\  anew =clock=
marker =clock=

   \ c!+ required
   : c!+ ( addr c -- addr+ ) over c! 1+ ;

  variable #stamp $20 allot   \ bufffor string

\  : bcd>asci ( c -- cl ch )   
\    dup  >< $0f and $30 +
\    swap    $0f and $30 +
\    ;

  : bcd>asci $0f and $30 + ;

  0        \ timekeeper registers
  1   --    <seconds>
  1   --    <minutes>
  1   --    <hours>
  1   --    <day>
  1   --    <date>
  1   --    <month>
  1   --    <year>
  1   --    <control>
  constant /rtc

  here dup /rtc dup allot erase constant [rtc]

  : clock@

        [rtc] /rtc $0 rtc>
        #stamp 1+
        [rtc] <day>     c@  $7 and bcd>asci c!+
        [char] . c!+
        [rtc] <date>    c@ $3f and
        dup >r 4 rshift  bcd>asci c!+ r> bcd>asci c!+
        [char] . c!+
        [rtc] <month>   c@ $1f and
        dup >r 4 rshift  bcd>asci c!+ r> bcd>asci c!+
        [char] . c!+ [char] 2 c!+ [char] 0 c!+
        [rtc] <year>    c@ $ff and
        dup >r 4 rshift  bcd>asci c!+ r> bcd>asci c!+

        bl c!+

        [rtc] <hours>   c@ $3f and
        dup >r 4 rshift  bcd>asci c!+ r> bcd>asci c!+
        $3a c!+
        [rtc] <minutes> c@ $ff and
        dup >r 4 rshift  bcd>asci c!+ r> bcd>asci c!+
        $3a c!+
        [rtc] <seconds> c@ $3f and
        dup >r 4 rshift  bcd>asci c!+ r> bcd>asci c!+

        bl c!+

        #stamp - #stamp c!
        ;

\
\
  : rstr>lcd   ( ramaddr count -- )
        over + swap
        ?do i c@ lcd! loop
        ;
\
  : time?
        lcd_clear clock@
        #stamp  dup $0e rstr>lcd
        1 0 lcd_xy! $0e + 8 rstr>lcd
        ;


выглядит довольно ужасно. но.
писалось все это исключительно с целью "понять принцып", пошшупать эту самую ds1307 - просто оказалась под рукой.
чуть не забыл:
The DS1307 operates in the regular mode (100kHz) only.


иными словами, перед обменом не забывайте: regular +twi

go forth...

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

ilya73 » 08 июн 2012, 03:10

Подключил 1-wire, железку (и даже 2-е) определяет, а вот с 1w_convert - проблемка.
Читает 0х0550. Куда копать?


cron
Rambler\'s Top100 Mail.ru counter