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
;
\ ==============================
\
Примечания к коду:
- код не тестировал, не отлаживал, мог где-нибудь наврать;
- очень нравится использовать слово
-- . Позаимствовал его из SPF4 - очень удобно.
Его определение где-то тут уже приводил - кстати, прекрасный пример создания
определяющих слов
фраза
ssrx-buf 1 cells + card-id оставит на стеке адрес ( байта в буфере ) Card number info
возможно, его ( слово
-- ) стоило назвать
field;
- выделение памяти сразу же за объявлением переменной - не во всех форт-системах может прокатить.
Ну вот, отметился. Go forth.
PS. так и знал, что где-то наврал. исправил
inp-bufPPS упс, апять косяк, переменные же - двухбайтовые(одна ячейка)..., ща исправлю