Поясните дураку что я не понимаю

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Привет всем. 
Объясните дураку что я не понимаю. 
ссылка: https://radioparty.ru/device/avr/70-ampervoltmeter-attiny13

одни и те же выводы используются и для общения с дисплеем и для приема данных с датчиков. Это мне не понятно и как я не пытался понять код приложенный на бэйсике - я не понял. Вроде назначение ног определяется на стадии инициализации (либо принимает данные либо отправляет). Не могу понять, объясните кто знает и кому не лень. 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Программу на бейсике не сложно предоставить?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я сейчас с планшета, завтра до компьютера доберусь попробую выложить. 
мне интересно - это вообще как возможно то? В отличии от ардуино я там ничего подобного про объявления портов не увидел. Она есть по ссылке выше, не вирус вроде. (Знаю тут не принято по внешним ссылкам ходить, хотя бы в теории пока понять). 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Это нормальная практика использовать порты по двойному назначению. Например в TFT экранах с тачскрином одни и те же порты используются для выдачи данных на экран и для приема данных от тачскрина. Просто переключая их с передачи на прием. Уверен - здесь делается то-же самое. Если экран не увидит правильную последовательность кодов - то он ничего делать не будет. На этом все и построено.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018
'------------------------------------------------------------------------------'
'Program: miniaturowy miernik do zasilacza na procesorze attiny13              '
'kompilator: bascom 1.11.9.0     data: 21.12.2009    autor: Manekinen          '
'strona domowa projektu: http://diy.elektroda.eu/                              '
'wszelkie modyfikacje dozwolone, publikujšc należy zachować ten nagłówek       '
'               WYŁĽCZNIE DO UŻYTKU NIEKOMERCYJNEGO                            '
'------------------------------------------------------------------------------'

Const Napiecie = 62                                         'mnożnik napięcia (62 dla 100V... 19 dla 30V... itp)
Const Prad = 62                                             'mnożnik pršdu (62 dla 10A... j.w.)
Const Temp = 62                                             'mnożnik temperatury, dobrany eksperymentalnie dla vref 1.1V i LM35 (wliczajšc mV poprawkę poniżej)
Const Pullup = 6                                            'ile mV błędu wprowadza pullup wywietlacza podłšczony do gnd poprzez 100ohm...  troche nieeleganckie ale proste i skuteczne :)

$regfile = "attiny13.dat"
'$regfile = "m8def.dat"
$crystal = 1200000
'$crystal = 2000000
$hwstack = 16
$swstack = 16
$framesize = 16
$noramclear

Dim Pomiar As Word
Dim Pokaz As String * 4
Dim Pokaz2 As String * 4
Dim Znak As Byte
Dim Licz As Byte

Declare Sub Formuj_i_mierz
Declare Sub Wyswietl

Config Adc = Single , Prescaler = Auto , Reference = Internal       'off
Start Adc

Config Lcd = 16 * 1
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
'Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portb.1 , Rs = Portb.0
Cursor Off

Do
   Upperline

   Znak = 86
   Pomiar = Pomiar * Napiecie
   'pršd...
   Licz = 3
   Formuj_i_mierz
   Wyswietl
   Znak = 65
   Pomiar = Pomiar * Prad
   'temperatura...
   Licz = 0
   Formuj_i_mierz
   Pokaz2 = Format(pokaz , "0.00")
   Wyswietl
   Pomiar = Pomiar * Temp
   'napięcie...
   Licz = 1
   Formuj_i_mierz
   Wyswietl
Loop

Formuj_i_mierz:

'Ddrc = &B110001
'        543210
Ddrb = &B010011

Shift Pomiar , Right , 6
Pokaz = Str(pomiar)
Pokaz2 = Format(pokaz , "00.0")

Waitms 50
Pomiar = Getadc(licz) - Pullup
Return

Wyswietl:
'Ddrc = &B111111
'        543210
Ddrb = &B111111
Lcd Pokaz2 ; Chr(znak) ; Chr(32)
Return

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Собственно вот код (выше выложил).

Где тут применяется инверсия портов (прием/передача данных)? Где вообще идет чтение данных?

И как бы тоже самое выглядело на дуине (/чистом Си)?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

BOOM пишет:

Собственно вот код (выше выложил).

Где тут применяется инверсия портов (прием/передача данных)? Где вообще идет чтение данных?

И как бы тоже самое выглядело на дуине (/чистом Си)?

Строки 65, 67, 78, 80 - идёт работа с DDR*, т.е. Data Direction Register. Чтение данных - строка 74.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Занятный польский Бейсик.
Чуть мозг не вытек

Green
Offline
Зарегистрирован: 01.10.2015

Когда надо принимаешь, когда надо передаёшь... Затем всё по новой. Совмещение называется. Всё правильно сказали.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А на си (в плане ардуино) так можно? И как именно? Постоянно назначение выводов менять или вообще их никак не объявлять? Не пойму никак все еще....

nik182
Offline
Зарегистрирован: 04.05.2015

Moжно не объявить, а сразу писать в процедурах номер ноги. Можно не определять моду, если прочитать что по сбросу нога в режиме ввод, а тебе это и надо. Можно в любой момент поменять ногу с входа на выход и обратно. Ограничений нет, если ты понимаешь что делаешь и зачем.

sadman41
Offline
Зарегистрирован: 19.10.2016

nik182, он ищет pinMode() и не находит.

BOOM, управление направлением производится напрямую через регистры. 

nik182
Offline
Зарегистрирован: 04.05.2015

Тяжёлое детство, лишенное витаминов, деревянные игрушки, прибитые к полу, волосатые руки няни... понимаю. Мне, кстати, в своё время  рекомендовали в ABR в DDR смотреть как на палочки и дырочки. В дырочку вводишь :-). Соответственно  в строке 67 три ноги переключаются на ввод - вот тут не понятно канала два а ноги три - неувязочка, в 80 всё на вывод. Две подпрограммки - измерения и рисования на LCD, В лупе два измерения - температуры и напряжения с нулевого канала и третьего. Даже 50 мс ждёт после перключения, что бы всё устаканилось. Простая как грабли программа.    

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:
Можно в любой момент поменять ногу с входа на выход и обратно. Ограничений нет, если ты понимаешь что делаешь и зачем.
Ну да. Программный I2C на этом и основан.

Green
Offline
Зарегистрирован: 01.10.2015

nik182 пишет:

Мне, кстати, в своё время  рекомендовали в ABR в DDR смотреть как на палочки и дырочки. В дырочку вводишь :-).


У некоторых наоборот. 0 - Output, 1 - Input, и никаких нездоровых ассоциаций.)

nik182
Offline
Зарегистрирован: 04.05.2015

Green пишет:

У некоторых наоборот. 0 - Output, 1 - Input, и никаких нездоровых ассоциаций.)

Пример приведите пожалуйста. У тинек, лео и 328 так. Другими не пользуюсь. stm актуальнее. А Вы теми которые наоборот пользуетесь или это так, любовь к точности? 

Green
Offline
Зарегистрирован: 01.10.2015

Сейчас у AVR хозяин Microchip. Вот у него PIC мк, и у них как раз таки наоборот. Да, приходится пользоваться, многие любят. Более того, некоторые на дух не переносят AVR.)

nik182
Offline
Зарегистрирован: 04.05.2015

Вон оно что...не помню уже. Я в 90-х с них начинал, но потом на msp430 быстро перешёл. Очень они по архитектуре и командам на PDP-11 были похожи, а PDP я уже знал. Меня даже в армии посылали служить её обслуживать. Но не сложилось. Метров 500 не доехал. А у 430 то же  0 - вход.