elmot писал(а):Вопрос - насколько сложно встроить Forth машину
Очень просто.
elmot писал(а):Где ее исходники на C?
Например здесь.
Технический форум по робототехнике.
elmot писал(а):Вопрос - насколько сложно встроить Forth машину
elmot писал(а):Где ее исходники на C?
chu писал(а):а ведь я предлагался (фрилансером) в эту контору с предложением сотрудничества ( тем более у них на сайтике пригласительная объява есть)
предлагал им свои услуги по:
- сборка прошивок amforth'а для различных мег по ихней номенклатуре;
- написание либ (драйверов) для всех ихних "шильдов";
- техподдержка по amforth'у;
- etc.
вышел какой-то тип, даже не представился ( видима менеджер, ага), минут через десять моих пояснений у него произошло переполнение буфера, в глазах появилась глубина(пустота) ( ну точно - менеджер, нифига не технарь. программисты , те хоть иногда говорят: "форт? нахер он кому нужен, фортран этот!") так и расстались... недельки через три я позвонил - хотя бы внятное "нет" услышать - результат тот же самый: "му-хрю". пнятно, недосуг ему, занимается развитием бизнеса и продвижением рынка, не иначе, ну и ладно...
marker =suart=
2 constant INT0rising
1 constant INT0enabled
variable bit-count
variable byte-count
variable inp-byte
variable vx
variable vx1
variable vx0
variable _finish
create inp-buf 20 allot
\ Запускаем таймер
: +timer
$2 TIMSK1 c! \ Прерывание по равенству знач. OCR1A
;
\ stops the timer
: -timer
0 TIMSK1 c!
;
: +int-bs INT0enabled EIMSK c! ;
: -int-bs 0 EIMSK c! ;
: timer-int-isr
\ [ 10 us/ ] literal ?delay
bit-count @ 1- bit-count !
$4 PORTD pin_high? if $200 1 vx1 +! else 0 1 vx0 +! then
bit-count @ rshift
inp-byte @ or inp-byte !
bit-count @ 0= if
inp-byte @ inp-buf byte-count @ + c!
byte-count @ 1+ dup byte-count !
-timer +int-bs
then
;
: _startbit
10 bit-count !
0 inp-byte !
-int-bs
\ [ 10 us/ ] literal ?delay
+timer
13 = if -timer cr ." Stop Reciving!" else +timer then
;
variable pre
: test
cr ." Start!"
inp-buf 20 erase
pre @ 0= if 1 pre ! then
0 _finish !
0 vx !
0 vx1 !
0 vx0 !
0 byte-count !
0 inp-byte !
$b TCCR1B c! \ предделитель на 64 + режим CTC
0 OCR1AH c!
26 OCR1AL c!
['] timer-int-isr TIMER1_COMPAAddr int!
$4 PORTD pin_input
\ $4 PORTD pin_pullup_on
['] _startbit INT0Addr int!
INT0rising EICRA c! \ превывание по спаду
+int-bs \ разрешаем превывания
300 ms
+int
begin
1000 ms
key?
until
-timer -int-bs
inp-buf 10 cr dump
;
marker =suart=
2 constant INT0rising
1 constant INT0enabled
variable bit-count
variable byte-count
variable inp-byte
variable laby
create inp-buf 20 allot
\ Разрешаем прерывния
: +int-bs INT0enabled EIMSK c! ;
\ Запрещаем превывания
: -int-bs 0 EIMSK c! ;
\ Принимаем 1-ин байт
: recv-byte ( -- n )
0 inp-byte !
begin
$4 PORTD pin_low?
until
[ 70 us/ ] literal ?delay
8 0 do
[ 64 us/ ] literal ?delay
$4 PORTD pin_high? if 1 else 0 then
i lshift
inp-byte @ or inp-byte !
loop
[ 90 2* us/ ] literal ?delay
inp-byte @
;
: recv-byte2buf
recv-byte
inp-buf byte-count @ + c!
1 byte-count +!
;
: startbit
-int-bs
14 0 do
recv-byte2buf
loop
1 laby !
;
variable pre
: s>nh
base @ >r hex
>r >r
0 s>d r> r> >number drop drop d>s
r> base !
;
\ Подсчёт контрольной суммы
: csum? ( -- f )
\ base @ hex
0
inp-buf 1+ dup 9 + swap
do
( 0 s>d) i 2 s>nh ( >number drop drop d>s) xor
2
+loop
( 0 s>d) inp-buf $b + 2 s>nh \ >number drop drop d>s
=
\ swap base !
;
: validcard?
0 s>d ( i) 2 >number drop drop d>s
;
: test
cr ." Start!"
0 laby !
0 inp-byte !
$4 PORTD pin_input
$4 PORTD pin_pullup_on
['] startbit INT0Addr int!
INT0rising EICRA c! \ превывание по спаду
+int-bs \ разрешаем превывания
300 ms
\ +int
\ startbit
begin
laby @
if
\ inp-buf 10 cr dump
0 s>d inp-buf 5 + 6 hex >number drop drop cr ." Card number: " decimal d.
0 byte-count !
inp-buf 20 erase
+int-bs
then
key?
until
\ csum? cr ." check-sum=" .
;
... begin ... key? until
... begin ... key? until key drop
ilya73 писал(а):Хочется поделится "наработками" ...
\
\ ilya rfid Soft Serial Receiver
\
\ ==============================
marker =suart=
2 constant INT0rising
1 constant INT0enabled
\ Разрешаем прерывния
: +int-bs INT0enabled EIMSK c! ;
\ Запрещаем превывания
: -int-bs 0 EIMSK c! ;
\ ==============================
\
\ vum@chu
\
\ ==============================
\
: ssrx-bit@ ( c -- c' )
1 lshift
[ 64 us/ ] literal ?delay
1
$4 PORTD pin_high? if
or else
invert and then
;
: ssrx-c@ ( -- с )
begin $4 PORTD pin_low? until \ ожидаем старт бит
[ 70 us/ ] literal ?delay
0 ( c' ) \ тут будем собирать приходящий байт
8 0 do ssrx-bit@ loop
[ 90 2* us/ ] literal ?delay \ видима, стоповый битик тут у нас
;
\
\ Grove_-_125KHz_RFID_Reader.htm
\ принимаемый от rfid card reader'а информационный пакет длиною= /card-packet
\ сохраняется в буфере по адресу ssrx-buf+1ячейка , в переменной ssrx-buf =количество принятых байт
base @
decimal
0 \ структура пакета rfid card reader
1 -- start-flag \ $02
10 -- card-id \ Card number info
2 -- card-cs \ checksum
1 -- end-flag \ $03
constant /card-packet
base ! \ восстановить основание
\ буфер под пакет
variable ssrx-buf /card-packet allot \ типа строки со счетчиком
: inp-buf ssrx-buf 1 cells + ; \ для совместимостис ильей
\ увеличить на 1 счетчик байтов в буфере
: ssrx-buf++ ssrx-buf 1 over @ + swap ! ;
\ добавить принятый байт в буфер
: ssrx-buf+c! ( c -- ) ssrx-buf @ inp-buf + ! ssrx-buff++ ;
\ прочитать весь пакет от ридера
: card-data@ /card-packet 0 do ssrx-c@ ssrx-buf+c! loop ;
\ пакет принят?
: card-data? ( -- f ) ssrx-buf @ /card-packet = ;
\
: startbit -int-bs card-data@ ;
\ ==============================
\ оставил без изменения *chu
\
\ INT0rising INT0enabled
\ -int-bs +int-bs
\ csum? validcard?
\ ==============================
\
: s>nh
base @ >r hex
>r >r
0 s>d r> r> >number drop drop d>s
r> base !
;
\ Подсчёт контрольной суммы
: csum? ( -- f )
\ base @ hex
0
inp-buf 1+ dup 9 + swap
do
( 0 s>d) i 2 s>nh ( >number drop drop d>s) xor
2
+loop
( 0 s>d) inp-buf $b + 2 s>nh \ >number drop drop d>s
=
\ swap base !
;
: validcard?
0 s>d ( i) 2 >number drop drop d>s
;
\
\ ==============================
\
\ определения не менял, просто выделил в отдельное слово
: card-data.
0 s>d inp-buf 5 + 6 hex >number drop drop cr ." Card number: " decimal d.
;
: card-cs. csum? cr ." check-sum=" . ;
\
\ ==============================
\ дальше - опять отсебятина *chu
: test
cr ." Start!"
$4 PORTD pin_input
$4 PORTD pin_pullup_on
['] startbit INT0Addr int!
INT0rising EICRA c! \ прерывание по спаду
+int-bs \ разрешаем прерывания
\ +int
300 ms
0 ssrx-buf ! \ буфер пустой
begin
card-data? if
card-data. \
card-cs. \
0 ssrx-buf ! \ обработано, сбросить счетчик
+int-bs then
key? until
key drop
;
\ ==============================
\
tttt1.frt
chu писал(а):Еще одна дискуссия о форте
\ Software UART
=suart=
marker =suart=
2 constant INT0rising
1 constant INT0enabled
variable bit-count
variable byte-count
variable inp-byte
variable laby
create inp-buf 120 allot
\ Разрешаем прерывния
: +int-bs INT0enabled EIMSK c! ;
\ Запрещаем превывания
: -int-bs 0 EIMSK c! ;
\ Запускаем таймер
: +timer
-int
0 OCR1AH c!
$1a OCR1AL c!
$2 TIMSK1 c! \ Прерывание по равенству знач. OCR1A
+int
;
\ stops the timer
: -timer
-int
0 TIMSK1 c!
0 OCR1AH c!
0 OCR1AL c!
+int
;
: byte2buf ( n -- )
inp-buf byte-count @ + c!
1 byte-count +!
;
: bit-tim
-timer
$4 PORTD pin_high? if 1 else 0 then
bit-count @ lshift
inp-byte @ or inp-byte !
1 bit-count +!
bit-count @ 8 =
if 0 bit-count ! inp-byte @ byte2buf +int-bs
1 laby !
else +timer then
;
: startbit
-int-bs
0 inp-byte !
$4 PORTD pin_low?
\ +timer
if +timer else +int-bs then
;
: testr
cr ." Start!"
0 inp-byte !
0 byte-count !
0 bit-count !
inp-buf 120 erase
$4 PORTD pin_input
$4 PORTD pin_pullup_on
$8 PORTD pin_output
$8 PORTD high
$b TCCR1B c! \ предделитель на 64 + режим CTC
0 OCR1AH c!
$1a OCR1AL c!
['] bit-tim TIMER1_COMPAAddr int!
['] startbit INT0Addr int!
INT0rising EICRA c! \ превывание по спаду
+int-bs \ разрешаем превывания
+int
begin
100 ms
laby @ if inp-byte @ cr ." byte:" . 0 laby ! then
again
cr ." Stop!"
;
create buf 100 allot
variable buf 98 allot
search \ ANS94
elmot писал(а):форт-то сам по себе несложный. Только надо мозги вывернуть наизнанку, и на нем писать аккуратно - а то говнокод будет жуткий
> amforth 5.1 ATmega32 8000 kHz
reset source= 2
> words
=draft= spi@ spi! -spi2x +spi2x spi_clk -spi +spi spi.f/128 spi.f/64 spi.f/16
spi.f/4 spi.mode3 spi.mode2 spi.mode1 spi.mode0 spi.MSTR spi.DORD spi.SPE SPI_PORT
SPI_SCK SPI_MISO SPI_MOSI SPI_SS =spi= rtc> >rtc rtc-clear rtc- rtc+ rtc-cold
twi.rtc@ twi.rtc! 12/24 clock_halt BIT_OUT BIT_SQWE BIT_RS1 BIT_RS0 RTC_RAM_LAST
RTC_RAM RTC_CONTROL RTC_YEAR RTC_MONTH RTC_DATE RTC_DAY RTC_HOURS RTC_MINUTES
RTC_SECONDS twi.ds1307 =ds1307= .buff eeprom> >eeprom ee/page twi.ee-loadblock
twi.ee-saveblock #page>addr twi.ee-c@ twi.ee-c! set-rw page-size twi.ee-addr
=twieeprom= twi.scan twi.ping? twi.status? twi.status twi.rxn twi.rx twi.tx twi.action
twi.stop twi.start twi.wait twi.off twi.init fast regular twi.bitrate =twi= --
=struct= portbit#: (portbit#) =portbit= us/ .us .ticks ?ticks ticks/1decr ticks/1us
?ticks. t1. ?tov1. t1@. tov1? t1@ <t1> ?delay delay <t1 t1> =tttt1= .x u*/mod
m*/ m+ 2! 2@ 2variable 2constant =double= range endcase endof of case evaluate
[evaluate] (evaluate) source-string str strlen .res environment? [environment?]
(environment?) imove =system= pin_pullup_on pin_pullup_off toggle pin@ pin_low?
pin_high? pin_input pin_output pin! wait_high wait_low is_high? is_low? pulse
low high portpin: bitmask: SPM_RDYAddr TWIAddr ANA_COMPAddr EE_RDYAddr ADCAddr
USART__TXCAddr USART__UDREAddr USART__RXCAddr SPI__STCAddr TIMER0_OVFAddr
TIMER0_COMPAddr TIMER1_OVFAddr TIMER1_COMPBAddr TIMER1_COMPAAddr TIMER1_CAPTAddr
TIMER2_OVFAddr TIMER2_COMPAddr INT2Addr INT1Addr INT0Addr TWAR TWDR TWSR_TWPS TWSR_TWS
TWSR TWCR_TWIE TWCR_TWEN TWCR_TWWC TWCR_TWSTO TWCR_TWSTA TWCR_TWEA TWCR_TWINT TWCR
TWBR SPMCR_SPMEN SPMCR_PGERS SPMCR_PGWRT SPMCR_BLBSET SPMCR_RWWSRE SPMCR_RWWSB
SPMCR_SPMIE SPMCR OSCCAL SP SREG_C SREG_Z SREG_N SREG_V SREG_S SREG_H SREG_T SREG_I
SREG PIND DDRD PORTD PINC DDRC PORTC PINB DDRB PORTB PINA DDRA PORTA ADC ADCSRA_ADPS
ADCSRA_ADIE ADCSRA_ADIF ADCSRA_ADATE ADCSRA_ADSC ADCSRA_ADEN ADCSRA ADMUX_MUX
ADMUX_ADLAR ADMUX_REFS ADMUX ACSR_ACIS ACSR_ACIC ACSR_ACIE ACSR_ACI ACSR_ACO
ACSR_ACBG ACSR_ACD ACSR SFIOR_ACME SFIOR UBRRL UBRRH UCSRC_UCPOL UCSRC_UCSZ
UCSRC_USBS UCSRC_UPM UCSRC_UMSEL UCSRC_URSEL UCSRC UCSRB_TXB8 UCSRB_RXB8 UCSRB_UCSZ2
UCSRB_TXEN UCSRB_RXEN UCSRB_UDRIE UCSRB_TXCIE UCSRB_RXCIE UCSRB UCSRA_MPCM
UCSRA_U2X UCSRA_UPE UCSRA_DOR UCSRA_FE UCSRA_UDRE UCSRA_TXC UCSRA_RXC UCSRA UDR
SPCR_SPR SPCR_CPHA SPCR_CPOL SPCR_MSTR SPCR_DORD SPCR_SPE SPCR_SPIE SPCR SPSR_SPI2X
SPSR_WCOL SPSR_SPIF SPSR SPDR ICR1 OCR1B OCR1A TCNT1 TCCR1B_CS1 TCCR1B_WGM1
TCCR1B_ICES1 TCCR1B_ICNC1 TCCR1B TCCR1A_WGM1 TCCR1A_FOC1B TCCR1A_FOC1A TCCR1A_COM1B
TCCR1A_COM1A TCCR1A ASSR_TCR2UB ASSR_OCR2UB ASSR_TCN2UB ASSR_AS2 ASSR OCR2 TCNT2
TCCR2_CS2 TCCR2_WGM21 TCCR2_COM2 TCCR2_WGM20 TCCR2_FOC2 TCCR2 TIFR_TOV0 TIFR_OCF0
TIFR TIMSK_TOIE0 TIMSK_OCIE0 TIMSK OCR0 TCNT0 TCCR0_CS0 TCCR0_WGM01 TCCR0_COM0
TCCR0_WGM00 TCCR0_FOC0 TCCR0 MCUCSR_ISC2 MCUCSR MCUCR_ISC0 MCUCR_ISC1 MCUCR
GIFR_INTF2 GIFR_INTF GIFR GICR_IVCE GICR_IVSEL GICR_INT2 GICR_INT GICR WDTCR_WDP
WDTCR_WDE WDTCR_WDTOE WDTCR EECR_EERE EECR_EEWE EECR_EEMWE EECR_EERIE EECR
EEDR EEAR tasks alsotask onlytask multi single task-init tcb>size tcb>rp0 tcb>sp0
tcb>tid task: activate cell- task-awake task-sleep stop multitaskpause wake pass
follower status =multitask= end-code code assembler vocabulary >name >body postpone
=tiny-core= marker words show-wordlist applturnkey is Rdefer Edefer fill
!@spi c!@spi sleep wdr -wdt order set-order also forth-wordlist forth only wordlist
definitions previous set-current nfa>lfa compare get-order get-current !e[]
@e[] environment end-code code abort abort" [char] immediate recurse user constant
variable [ ] ; :noname : does> latest reveal header create ?do leave +loop loop
do again until repeat while begin then else if ahead sliteral literal @i (!i-nrww)
!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= = <> r@ >r r> nip -rot rot drop over swap ?dup dup !u @u c@ c! ! @ (value)
execute exit .s ." s" ms 1ms dinvert d- d+ d2* init-user ee>ram ee-user source-tib
refill-tib tib 2swap d2/ cmove dnegate dabs d>s j * icompare search-wordlist
defer@ defer! to value unused noop ver ?stack rec-notfound rec-find rec-intnum
interpret depth rp0 sp sp0 warm cold rstf pause quit find-name parse-name /string
source cscan parse >number number char refill accept cskip throw catch handler
' type spaces space cr icount itype s, u>= u<= digit? ud/mod u0.r ud.r ud. u.
. d. .r d.r sign #> #s # <# hold hld tolower toupper within max min abs mod /
negate u/mod */ /mod */mod turnkey bl hex decimal bin ['] , compile ( \ wlscope
(create) allot here edp dp key? key emit? emit pad #tib >in cell+ cells base state
f_cpu int-trap int@ int! -int +int 1w.slot 1w.reset +usart ubrr tx?-poll tx-poll
rx?-isr rx-isr ok
> .res
amforth 5.1 ATmega32 running at 8000 kHz
free FLASH cells 19056
free RAM bytes 1727
used EEPROM bytes 94
used data stack cells 0
used return stack cells 11
free return stack cells 29
ok
>
ok
>