Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » при выходе из цикла значение в 2 раза больше. Есть прерывания.Так д.б?


при выходе из цикла значение в 2 раза больше. Есть прерывания.Так д.б?

Сообщений 1 страница 10 из 10

1

Добрый вечер :) Хелп, если не затруднит.
Код урезал для хоть какой-нить читабельности.
Принимаемых (и посылаемых) байтов 7. На счетчике на выходе i=14. Увеличивая кол-во in/out байтов увеличивается счетчик в 2 раза.

Свернутый текст

'           !!!  В СЕДЬМОМ ПОСТЕ БОЛЕЕ РАЗВЕРНУТОЕ ОПИСАНИЕ !!!

$Regfile="m8adef.dat"
$Crystal=4000000
$hwstack=64
$swstack=16
$framesize=32
$baud = 9600

'ЖКИ
Config Lcdpin = Pin , Rs = Portd.3 , E = Portd.2 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
Config Lcd = 16 * 2
Config Debounce = 10

'Таймер времени (прерывание)
Config Timer0 = Timer , Prescale = 1024
const Timer0pre =239
stop timer0
Timer0 = timer0Pre
On Timer0 SendTo
start Timer0

dim i as byte                                   'просто счетчик
dim code as byte                             'код принимаемого байта по uart
dim codeSend as byte                      'код отправляемого байта по  uart
dim buf as byte                               'флаг... что байт пришел... нам что-то послали
dim send as byte                             'флаг отправки. Если 1, то уже можно и отправить

'прерывание по rs232
On Urxc FlagCodeIn
Enable Urxc
Enable Timer0
Enable Interrupts

i=1                                        ' !!!!!!!!
Do                                         'Основной цикл
if buf=1 and code<>7  then
      buf=0
       incr i
        codeSend=255-code
   send=1
end if    'если не пуст,... установить флаг отправки

if buf=1 and code=7 then
  buf=0
    i=0
     incr i
    codeSend=255-code
  send=1
end if

loop until code=6                       ' выход по коду 6


locate 1,11  :lcd "i=";i: STOP                 '!!!!!!!!!!!!!!!!!!! i=14 !!!!!!!!!!!!

SendTo:
if send=1 then: send=0 : printbin codeSend :end if:                        ' если отправка готова, то отсылаем
return

FlagCodeIn:
   buf=1:inputbin code: Stop Timer0: Timer0=Timer0Pre: Start Timer0  'флаг "принятия". Считываем. Таймер на "начало"
return

End

Отредактировано andr_Ku (2019-04-12 12:40:20)

0

2

Собственно, в чем вопрос?
Счетчик считает количество принятых байт, условие выхода из цикла: принятый байт = 6.
Что отправляется в МК и в каком виде?

0

3

MACTEPok написал(а):

Собственно, в чем вопрос?
Счетчик считает количество принятых байт, условие выхода из цикла: принятый байт = 6.
Что отправляется в МК и в каком виде?


Код:
i=1             'счетчик
do
if ...... then: .............incr i ....end if
if ...... then: ....i=0....incr i ....end if
loop until code=6      'code - это код последнего из 7ми принимаемых байт


i - на выходе из цикла Do ... Loop  в 2 раза больше. Почему?

В мк шлется 7 байт. 1ый байт с кодом 07,  второй-3-4-5-шестой произвольные, седьмой код байта 06. В МК эти 7 байт поступают побайтно. Ответом от МК следует code=255-code. Затем идет следующий байт. Если "срыв передачи", то повторно посылается в мк байт с кодом "07".

Отредактировано andr_Ku (2019-04-12 10:35:08)

0

4

В МК как выглядит пакет? Точно ли в hex формате идет отправка в МК? Выглядит как передача каждого байта отдельно с символом перевода строки, вот и выходит 14 принятых байт.
МК должен в ответ отправить 14 байт в таком случае.
Сделай эхо, тогда увидишь, что принимает МК:
это

Код:
codeSend=code


вместо

Код:
codeSend=255-code

0

5

MACTEPok написал(а):

В МК как выглядит пакет? Точно ли в hex формате идет отправка в МК? Выглядит как передача каждого байта отдельно с символом перевода строки, вот и выходит 14 принятых байт.
МК должен в ответ отправить 14 байт в таком случае.
Сделай эхо, тогда увидишь, что принимает МК:
это

вместо


Пробовал. Не получилось. Кроме того "i"  никак не связано с "code".

0

6

Код:
i=1             'счетчик
do
if ...... then: .............incr i ....end if
if ...... then: ....i=0....incr i ....end if
loop until code=6  


добавляю около "Incr i" цикл: for temp=1 to i.      И шлем это все в PORTC.5

http://s8.uploads.ru/t/DwVhE.jpg

первый байт с кодом 07. ответ на него F8. Второй принимаемый байт с кодом 01, ответ FE. На порту С.5 (на скрине кол-во импульсов) видим, что "i" изменяется как при получении байта, так и при отправлении.  "i" должно изменяться только перед отправкой с МК байтов, т.е. приняли 07, отправили F8, прибавили к счетчику i+1. Количество принимаемых байтов 7, количество отправляемых байтов тоже 7.

Отредактировано andr_Ku (2019-04-12 11:10:48)

0

7

если кому интересен полный код проги к выше выложенному скрину:

0

$Regfile="m8adef.dat"
$Crystal=4000000
$hwstack=64
$swstack=16
$framesize=32
$baud = 9600

Config Lcdpin = Pin , Rs = Portd.3 , E = Portd.2 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
Config Lcd = 16 * 2
Config Debounce = 10

Config Timer0 = Timer , Prescale = 1024
const Timer0pre =239
stop timer0
Timer0 = timer0Pre
On Timer0 SendTo
start Timer0

dim i as byte                    'просто счетчик
dim code as byte               'код принимаемого байта по uart
dim codeSend as byte       'код отправляемого байта по  uart
dim buf as byte                'флаг... что байт пришел... нам что-то послали
dim send as byte               'флаг отправки. Если 1, то уже можно и отправить

dim temp as byte
Config portc.5 = output
portc=0

On Urxc FlagCodeIn
Enable Urxc
Enable Timer0
Enable Interrupts

i=1
Do                                         'Основная программа
if buf=1 and code<>7  then                 ' если буфер не пуст, а код не 07
    buf=0                                             ' то буфер пуст
      incr i                                             '  счетчик +1
          For temp=1 to i:portc.5=1: waitus 100:portc.5=0: next temp   ' посылка импульсов в портС.5 в кол-ве "i" шт
     codeSend=255-code:                      'преобразование отправляемого байта
   send=1:                                           ' флаг готовности к отправке
end if
if buf=1 and code=7 then                     'если код 07, то сбрасываем счетчик i в ноль
   buf=0
      i=0
        incr i
          For temp=1 to i:portc.5=1: waitus 100:portc.5=0: next temp
     codeSend=255-code
  send=1
end if

loop until code=6                       ' выход по принятому в МК байту с кодом 06

locate 1,11  :lcd "i=";i: STOP                 '!!!!!!!!!!!!!!!!!!! i=14 !!!!!!!!!!!!

SendTo:
if send=1 then
     send=0
       printbin codeSend                ' флаг в "0" и отправка
end if
return

FlagCodeIn:
   buf=1
     inputbin code                           'приняли в мк, флаг в "1"
        Stop Timer0: Timer0=Timer0Pre: Start Timer0
return

End

Отредактировано andr_Ku (2019-04-12 12:38:09)

0

8

глядя на график, как на шине RX МК появляются данные с TX?

0

9

andr_Ku, прокомментируйте, плиз, строки кода.
В ходе этого занятия сами сможете увидеть ляпы...

Разложите маалочитаемые кучи типа:
if buf=1 and code<>7  then: buf=0 : incr i: For temp=1 to i:portc.5=1: waitus 100:portc.5=0: next temp: codeSend=255-code: send=1:end if

... в нормальный вид:
if buf=1 and code<>7  then
    buf=0
    incr i
    For temp=1 to i
        portc.5=1
        waitus 100
        portc.5=0
    next temp
    codeSend=255-code
    send=1
end if

Отредактировано Nord (2019-04-12 12:03:14)

0

10

MACTEPok написал(а):

глядя на график, как на шине RX МК появляются данные с TX?


Уже разобрался. На Rx они появляются потому что общение идет по типа k-line по одному проводу.

do
if.... buf=1  ...... then ....incr i
loop

Получается, что пока "inputbin" слал "code" срабатывало прерывание Urxc, Urxc ставило флаг "buf" в "1" и цикл do-loop повторялся еще раз и еще раз "incr i".

Всем спасибо :)

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » при выходе из цикла значение в 2 раза больше. Есть прерывания.Так д.б?