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

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

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

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



Shiftout и Shiftin

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

1

Доброго времени суток. Я недавно начал изучать программирование мк и тут появилась потребность передавать данные из одного мк в другой. Решил попробовать с помощью Shiftout и Shiftin. Вот код.

Передающая часть

Код:
$regfile = "m8def.dat"
$crystal = 16000000

Dim T As Byte
T = 127
Do
   Shiftout Portb.4 , Portb.3 , T , 0 , 8
Loop

End

Принимающая часть

Код:
$regfile = "m8def.dat"
$crystal = 16000000

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcdmode = Port
Cursor Off

Dim T As Byte

Do
   Shiftin Pinb.4 , Portb.3 , T , 0 , 8 , 100
   Locate 1 , 1
   Lcd T ; "               "
Loop

End

Контроллеры соответственно соединены портами 3 и 4.
Данный код не работает, принимает какую-то билибирду.
Я так понимаю,что передачу и прием необходимо синхронизировать, т.е. один передает, а другой принимает, а не делает что-то другое.
Как это сделать?

0

2

Попробуй прерыванием

0

3

На двухпроводке проще и надежней тупо сесть на прерывание типа PinChange на ноге "Clock"  и если он в верхнем уровне, то значит на ноге "IN" выставлен валидный бит. Его нужно принять (зашифтить) при этом инкрементировав/декрементировав счетчик принятых бит. И так до нужного количества в счетчике или до нуля, в зависимости от того, куда будут сдвиг влево или вправо и как работает счетчик, на уменьшение непринятых или на увеличение принятых.
Не знаю на прерываниях ли построен Shiftin/Shiftout...

0

4

Синхронизацию сделал следующим образом. Добавил еще один провод. На передатчике доп пин в 1, потом Shiftout, потом доп пин в 0. На приемнике прерывание по фронту доп пина, в подпрограмме Waitus 86 Shiftin. Waitus 86 - подобрано опытным путем. Но это все пока только в протеусе.

0

5

А чем RS232 не устраивает?

0

6

C ним не получилось, если не трудно приведите пример использования rs-232, более подробней чем в хэлпе к bascom. У меня по сути и получился программный rs-232.

0

7

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

Синхронизацию сделал следующим образом. Добавил еще один провод. На передатчике доп пин в 1, потом Shiftout, потом доп пин в 0. На приемнике прерывание по фронту доп пина, в подпрограмме Waitus 86 Shiftin. Waitus 86 - подобрано опытным путем. Но это все пока только в протеусе.

Линия Clock и есть для синхронизации. Нужно ее только правильно использовать.
RS-232 протокол со стартовым и стоповым битами, он не использует Clock но при это довольно требователен к стабильности частот приемника и передатчика.

0

8

И всё таки это пугалки. У меня мега8 с сотовым общается на внутренем генераторе на 8 МГц-ах. И ни каких проблем. А если кварц поставить кратный, то вообще будет без проблем. Если длинные расстояния, то лучше RS-232, а так и UART справится.

0

9

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

И всё таки это пугалки. У меня мега8 с сотовым общается на внутренем генераторе на 8 МГц-ах. И ни каких проблем. А если кварц поставить кратный, то вообще будет без проблем. Если длинные расстояния, то лучше RS-232, а так и UART справится.

Это не показатель. Общаться с сотовым иначе чем через UART и не получится. Кроме того у телефонов есть автоопределение скорости обмена по префиксу AT. UART хорош для своей цели - относительно медленный обмен между устройствами по стандартному протоколу, достаточно лишь физику подогнать.

0

10

Подскажите, а при данных командах на ноге "Clock" должно быть попеременное изменение уровня: 0-1-0-1-и тд? Тогда почему в моем коде

Код:
Shiftin Sinp , Clock , L , 0

МК выдает но ноге "CLock" постоянную единицу? МК у меня атмега16, клок выведен на ногу PD3. Как только стираю флеш, уровень на ноге переходит в 0.
Выложу на всякий случай весь код, на котором проверял эту функцию

Код:
$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
'---------Конфигурация таймеров-----------------------------
Config Timer1 = Timer , Prescale = 256
On Timer1 Pulse0
Enable Interrupts
Enable Timer1
Start Timer1
'---------Псевдонимы портов----------------------------------
Beep Alias Portc.7
Temper Alias Portc.6
Zima Alias Portd.5                                          'Светодиод "Режим Зима"
Nasos Alias Portd.6                                         'Светодиод "Насос включен"
Rabota Alias Portd.7                                        'Светодиод "Работа"
Config Beep = Output
Config Portc = Output
Config Portb = Output
'Config Portc.4 = Input
Config Zima = Output
Config Nasos = Output
Config Rabota = Output

'-------Инициализация и псевдонимы портов клавиатуры------------------------

Clock Alias Portd.3
Sinp Alias Pind.2
'---------Переменные-------------------------------------
Dim L As Byte                                            'для клавиатуры

Dim Byte0 As Byte
Dim Byte1 As Byte

Dim T As Byte
Dim T1 As Byte
Dim T2 As Byte
Zima = 1
Rabota = 1

Sound Beep , 40 , 320
Waitms 500
Sound Beep , 40 , 800
'---------Старт программы-------------------------------

Do                                                          ' начало цикла

Shiftin Sinp , Clock , L , 0

Loop                                                        ' повторяем цикл

End

Pulse0:                                                     'тут просто мигают светодиодики)))
If Zima = 0 Then
Zima = 1
Nasos = 0
Else
Zima = 0
Nasos = 1
End If

Return

Отредактировано Алексей bird (2013-06-23 22:17:12)

0

11

Алексей bird написал(а):

МК выдает но ноге "CLock" постоянную единицу?


Как узнали?
Не увидел конфигурацию "CLock" на выход. По умалчанию на вход. Если стоит внешняя подтяжка к плюсу , то контроллер не прижмёт к 0.

0

12

Осциллограф показал
А Config Clock =Output никак не влияет на ситуацию

0

13

Что то сразу не увидел, у Вас Shiftin, по идее клок должен с передатчика идти а не с контроллера.

0

14

судя по этой статье http://easyelectronics.ru/podklyuchenie … trax.html, да и по даташиту, клок идёт именно с микроконтроллера

0

15

Ссылка не найдена. А про даташит не понял, что там написанно про бейсиковский Shiftin и клок.

0

16

Ну в ссылке лишняя запятая в конце, а даташит имеется ввиду любого сдвигового регистра. Но данный вопрос решен, был косяк в разводке ПП. Теперь новый вопрос: я считал инфу с двух регистров, получилось 16 битное число(типа WORD) подскажите:
1. как вывести на экран ЖК это число в двоичном формате
2. думаю ддя удобства его разделить(число это) на два 8-битных типа BYTE, вопрос как разделить? Сначала сдвинуть в одну сторону, а потом в другую? Командой Shift ?

0

17

Нет, есть команды LOW и HIGH. Младший и старший байты соответственно.

0

18

sva-don написал(а):

Нет, есть команды LOW и HIGH. Младший и старший байты соответственно.

не могу понять из хелпа, а что делают эти команды? 32-х байтовое число получиться "порезать" этими командами?

0

19

да, но нужно почитать HELP!
пожалуйста, старайтесь задавайте квалифицированные вопросы, на которые нет очевидных ответов в документации

0

20

Привет, Друзья!
Возник вопрос по команде. Вернее не совсем по команде, сколько по преобразованию переменных.
Например, у меня есть две переменные X=&B00011100 и Y=&B11100011. Никак не могу разобраться как мне последовательно вывести эти переменные командой Shiftout, чтобы получить 0001110011100011 на выходе. Тупо в лоб:

Shiftout Portb.2 , Portb.0 , X , 3
Shiftout Portb.2 , Portb.0 , Y , 3
Pulseout Portb , 3 , 5
- Так не хотелось бы. Как мне преобразовать эти мои переменные в например какую-нибудь третью переменную &B0001110011100011 , чтобы вывести всего одной командой?

Благодарю!

0

21

Код:
Dim OutBuff As Word
Dim Y As Byte At OutBuff Overlay
Dim X As Byte At OutBuff + 1 Overlay

X = &B00011100
Y = &B11100011

ShiftOut Portb.2 , Portb.0 , OutBuff , 3

+1

22

О!Вот за это большое Данке Шон! :)

0

23

Доброго времени суток. Вопрос по теме.
У меня есть два сдвиговых регистра (74hc595/74hc597), с выходным проблем нет никаких, а вот с входным не могу разобраться...

Для 595:
Shiftout Portb.3 , Portb.5 , X , 1
Pulseout Portb , 4 , 5
Где Portb.3 на ноге DS,  Portb.5 на SHCP,  Portb.4 на STCP,  отправляю переменную  Х. Здесь все работает.

Помогите для 597 (они подключены к разным ножкам контроллера)
Shiftin Portb.0 , Portb.2 , X , 1
Pulseout Portb , 1 , 5  (или здесь должно быть Pulsein)
Где Portb.0 на ноге DS,  Portb.2 на SHCP,  Portb.1 на STCP,  принимаю значение в переменную  Х.
В общем, как ни пробовал - не работает...

0

24

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

Помогите для 597

По логике, сначала нужно записать данные в промежуточный регистр, а затем считывать их, т. е. сначала Pulseout, а затем уже Shiftin.

0

25

Пётр написал(а):

По логике, сначала нужно записать данные в промежуточный регистр, а затем считывать их, т. е. сначала Pulseout, а затем уже Shiftin.

Что-то я не понял(
У меня есть 597, я ею опрашиваю 8-мь кнопок, мне нужно отслеживать их состояние. На нее я записываю данные (какие?), а потом их считываю... Как-то оно не так...

0

26

На LCK сменить с 0 в 1(фронт). Произойдет защелкивание данных по входам! Затем, и ТОЛЬКО затем ВЫ получите "сохраненные" на входе биты при опросе (при сдвиге) на самОм выходе.
Это про"железо". ТТЛ широкого проименения.

Отредактировано Каримов (2014-03-20 17:14:22)

0

27

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

Как-то оно не так...

Ну а как иначе?

http://matidavid.com/pic/picbook_site/7_07chapter_files/21.gif

Данные нужно поместить в Shift register (Load) и считать их (Clock).

Отредактировано Пётр (2014-03-20 17:18:59)

0

28

ПЁТР
Это дОлжно знать ДО МК!!!
Язык программирования-это способ общения с железом. А железо (НА НИЗКОМ УРОВНЕ) просто НННАААДДДООО! ЗНАТЬ! :blush:

Отредактировано Каримов (2014-03-20 17:40:51)

0

29

Пётр написал(а):

Ну а как иначе?
Данные нужно поместить в Shift register (Load) и считать их (Clock).

У 595 мы отправляем значение переменной (1 байт) командой "Shiftout" , каждый новый входящий бит, сдвигает предыдущий, пока не заполнится 8 бит, далее защелкиваем значение командой "Pulseout". Все понятно. можно в таком же стиле описать и для 597?

Пётр написал(а):

По логике, сначала нужно записать данные в промежуточный регистр, а затем считывать их, т. е. сначала Pulseout, а затем уже Shiftin.

Тут извиняюсь, я не досмотрел... "сначала Pulseout, а затем уже Shiftin", я как-то прочитал что "сначала Shiftout, а затем уже Shiftin"... сорри
Это логично, я так и пробовал, но не работает.
код такой:
Pulseout Portb , 1 , 5  (здесь защелкиваем)
Shiftin Portb.0 , Portb.2 , X , 1  (здесь пытаемся принять)

Shiftout Portb.3 , Portb.5 , X , 1 (здесь передаем значение на 595)
Pulseout Portb , 4 , 5    (защелкиваем)

Где Portb.0 на ноге DS,  Portb.2 на SHCP,  Portb.1 на STCP,  принимаю значение в переменную  Х.

0

30

http://s9.uploads.ru/otEKp.png
смотрите

Отредактировано Каримов (2014-03-20 17:59:34)

0