На днях тут развлекался тем, что соединил два микроконтроллера одним проводом и попытался исследовать возможности передачи информации...
Я собственно хотел приделать свой контроллер к этому:
http://febb.livejournal.com/2997590.htmlи выводить текст по одному проводу. Такой вот красивый минимализм...
Т.е. два 8-битных контроллера (PIC16F505 и PIC16F716), стоящих меньше доллара с кристаллами на 20Mhz соединены проводочком от выхода одного и на вход другого.
Посылающий контроллер имеет две такие простенькие функции на С для инициализации и передачи байта:
typedef unsigned char byte;
static void delay(byte d)
{
while(--d);
}
#define SER_SIGNAL DISP_SER_PORT = \
(DISP_SER_PORT ^ DISP_SER_PIN) ^ 0;
#define SER_DELAY delay(12);
void OutSerByte(byte b)
{
byte mask = 0b10000000;
SER_DELAY
for(;;)
{
SER_SIGNAL
SER_DELAY
if(b & mask)
SER_SIGNAL
SER_DELAY
if(!(mask >>= 1u))
break;
}
}//void OutSerByte(byte b)
void InitSerOutput()
{
OutSerByte(0b01000111);
}
Принимающий немного посложнее, потому, что во время инициализации ему нужно определить
необходимые задержки, т.е. настроиться на частоту передатчика:
byte i, t;
byte serInput, serDelay, serInitCount;
/// TIMER BASED
byte getSerByte()
{
byte b = 0, mask = 0b10000000;
byte del0 = serDelay + serDelay/2u;
for(;;)
{
while(t = SER_INPUT_PORT & SER_INPUT_PIN, t == serInput);
serInput = t;
TMR0 = 0;
for(;;)
{
t = SER_INPUT_PORT & SER_INPUT_PIN;
if(serInput != t)
{
serInput = t;
b |= mask;
if(!(mask >>= 1u))
return b;
break;
}
if(TMR0 > del0)
{
if(!(mask >>= 1u))
return b;
break;
}
}//for(;;)
}//for(;;)
return b;
}
/// TIMER BASED
void initSerInput()
{
serInitCount = 0;
serDelay = 0xff;
serInput = SER_INPUT_PORT & SER_INPUT_PIN;
for(;;)
{
t = SER_INPUT_PORT & SER_INPUT_PIN;
if(t != serInput)
{
i = TMR0;
if(++serInitCount > 1)
{
if(i < serDelay)
serDelay = i;
}
serInput = t;
TMR0 = 0;
}
else
if(serInitCount > 7)// && TMR0 > serDelay + serDelay)
break;
}
}//void initSerInput()
Идея передачи данных такая: каждый бит начинается с изменения напряжения (вверх или вниз),
далее через фиксированную задержу происходит передача 1 или 0. 1 - кодируется изменением напряжения, а ноль - ничем. Ееще через такую же задержку цикл заканчивается.
В общем после некоторой игры и просмотра увлекательных осциллограмм удалось передавать
со скоростью 100 килобод, т.е. примерно 12 КБайт/сек. Что на самом деле весьма неплохо.
Мне ведь надо передавть всего 32 символа на дисплейчик.
Вспомните, как лет этак 20 назад на полках за 100$ гордо стояли всякие Зиксели на 37 Кбод,
т.е. примерно на 5 КБайт/сек, что более чем в 2 раза медленнее.
Ну да разумеется, вся проблема была в жутких аналоговых телефонных линиях и т.п.
20 лет назад у меня дома стоял модем и я заходил на SUN с жуткой скоростью - 9600 килобод, т.е.
с крейсерской скоростью 1 кб/с... :)
А были же ведь еще и BBS... Своего рода Web сайты для телефонных фидошников.
Да, веселое и романтичное было время...