1 проводной интефейс для тиньки

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

При работе с тинькой 13 возникает проблема узнать какие то значения для корректировки программы, но памяти мало, выводы ограничены и возникла следующая мысль:

с одного из свободных выводов отсылать инфу по 1 проводному интерфейсу. 1wire библиотека здесь не подойдет изза ограниченного размера флеша. отсылать инфу не проблема. например отправка 2 байт например значений с АЦП

1void SendByte(int c){
2  for(byte i=0;i<16;i++)
3  {
4    if (c & 0x80) wire_on;;
5    else      wire_off;
6    c <<= 1;
7    delay(2); //скорость можно конечно и увеличить
8  }
9}

тинька будет подключена к меге 8 с жк дисплеем nokia 1202 для отображения инфы

предполагаю посылка будет выглядеть так:

первые 3 бита будут идентификаторами того что мы отсылаем

следующие 2 байта данные.

мега в зависимости от идентификатора делает следующие функции:

например:

1. ИД = 1 : Переход в нужные координаты дисплея, координаты находятся в данных: 1 байт X, 2 байт Y

2. ИД = 2 : Вывод значений данных на дисплей

3. ИД = 3: Вывод символа по ASCII кодировке. номер по ASCII находятся в данных

4. ИД = 4: Очистка дисплея

это самое основное. жду ваших предложений

 

 

 

MaksMS
Offline
Зарегистрирован: 11.03.2013

Я сделал так http://homes-smart.ru/index.php/oborudovanie/bez-provodov-433-315mgts/besprovodnoj-datchik-temperatury-i-vlazhnosti-na-baze-radiomodulej-433-315

Там есть примеры отправки и приема данных на страничке алгоритма.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

если правильно написал получается следующее

занимает 318 байт. пока терпимо, но лучше бы меньше

для приемной стороны пока незнаю

но еще не сделал функцию объеденения координат из 2 байт в инт

спасибо за пример. постараюсь разобраться в нем, но судя по коду боюсь места она занимает много, и для основной программы места не останется

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

MaksMS пишет:

Я сделал так http://homes-smart.ru/index.php/oborudovanie/bez-provodov-433-315mgts/besprovodnoj-datchik-temperatury-i-vlazhnosti-na-baze-radiomodulej-433-315

Там есть примеры отправки и приема данных на страничке алгоритма.

 

к сожалению коды просто огромны даже для меги8

но в тиньке даже не будет работать (если я правильно понял, связано с прерываниями), не то что не влезет

MaksMS
Offline
Зарегистрирован: 11.03.2013

А чего тинька должна отправлять конкретно ? состояние аналогового входа ? я насчитал 466 байт всего для этого )

MaksMS
Offline
Зарегистрирован: 11.03.2013

jeka_tm пишет:

MaksMS пишет:

Я сделал так http://homes-smart.ru/index.php/oborudovanie/bez-provodov-433-315mgts/besprovodnoj-datchik-temperatury-i-vlazhnosti-na-baze-radiomodulej-433-315

Там есть примеры отправки и приема данных на страничке алгоритма.

 

к сожалению коды просто огромны даже для меги8

но в тиньке даже не будет работать (если я правильно понял, связано с прерываниями), не то что не влезет

 

отправлять может без проблем, принимать - да не хватит,для этого подойдет только аттини85

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

отправлять уже описал что и где выводить на дисплей, очищать дисплей

данные могут быть любые до 2 байт размером. там и ацп, и шим в данный момент, расчетные данные. на ардуине это проще, в терминал отправил и посмотрел.

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

MaksMS пишет:

А чего тинька должна отправлять конкретно ? состояние аналогового входа ? я насчитал 466 байт всего для этого )

вы скомпилировали для тиньки и у вас получилось 466 байт? приведите код пожалуйста. может я не те примеры смотрел (честно сказать не все посмотрел, только 2)

MaksMS
Offline
Зарегистрирован: 11.03.2013
001#define RC_BIT         3 // пин
002 
003#define periodusec 400 // mcs период
004 
005void sendRC(unsigned long data) { // , unsigned short pin 531 440 max   
006 
007 DDRB |= _BV(RC_BIT);
008 
009data |= 3L << 20;
010 
011unsigned short repeats = 1 << (((unsigned long)data >> 20) & 7);
012 
013data = data & 0xfffff; //truncate to 20 bit
014 
015unsigned long dataBase4 = 0; uint8_t i;
016 
017for (i=0; i<12; i++) {
018 
019dataBase4<<=2;
020 
021dataBase4|=(data%3);
022 
023data/=3;
024 
025}
026 
027unsigned short int j;
028 
029for (j=0;j<repeats;j++) {
030 
031data=dataBase4; uint8_t i;
032 
033for (i=0; i<12; i++) { switch (data & 3) {
034 
035case 0:
036 
037PORTB |= _BV(RC_BIT);
038 
039_delay_us(periodusec);
040 
041PORTB &= ~_BV(RC_BIT);
042 
043_delay_us(periodusec*3);
044 
045PORTB |= _BV(RC_BIT);
046 
047_delay_us(periodusec);
048 
049PORTB &= ~_BV(RC_BIT);
050 
051_delay_us(periodusec*3);
052 
053break; case 1: PORTB |= _BV(RC_BIT);
054 
055_delay_us(periodusec*3);
056 
057PORTB &= ~_BV(RC_BIT);
058 
059_delay_us(periodusec);
060 
061PORTB |= _BV(RC_BIT);
062 
063_delay_us(periodusec*3);
064 
065PORTB &= ~_BV(RC_BIT);
066 
067_delay_us(periodusec);
068 
069break;
070 
071case 2:
072 
073PORTB |= _BV(RC_BIT);
074 
075_delay_us(periodusec);
076 
077PORTB &= ~_BV(RC_BIT);
078 
079_delay_us(periodusec*3);
080 
081PORTB |= _BV(RC_BIT);
082 
083_delay_us(periodusec*3);
084 
085PORTB &= ~_BV(RC_BIT);
086 
087_delay_us(periodusec);
088 
089break;
090 
091}
092 
093data>>=2;
094 
095}
096 
097PORTB |= _BV(RC_BIT);
098 
099_delay_us(periodusec);
100 
101PORTB &= ~_BV(RC_BIT);
102 
103_delay_us(periodusec*31);
104 
105} }

-вот функция пример отправки в троичном коде ,она чуть больше,чем я написал ранее(там двоичный код) ,тут где-то выйдет байт 550..

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

честно сказать не понял про троичный код, почему он троичным называется?

компилировали в чем? в CVAVR или в самой ардуине?

проверил свой код в CVAVR, получилось конечно меньше

EEPROM usage: 0 byte(s), 0,0% of EEPROM
Program size: 104 words (208 bytes), 20,3% of FLASH
2 words (4 bytes), 1,9% reduced by Code Compression

почему вы склоняетесь к троичному коду? в чем его преимущество?

MaksMS
Offline
Зарегистрирован: 11.03.2013

Число раскладывается на троичный код и передается.

пример под avr-gcc ,но в арудине тоже будет работать,тут всего лишь функцию _delay_us надо заменить.

Троичный - просто пример ,взятый из библиотеки RemoteSwitch..

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

нашел следующее, незнаю вы об этом или нет

http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4

MaksMS
Offline
Зарегистрирован: 11.03.2013

Не так просто передать данные ,тут нужна синхронизация и необходимо продумать прием

Я продложил готовый вариант 

Не обязательно использовать троичный ,можно и двоичный -под оба варианта есть библиотеки-приемники

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да над приемом я еще думаю. попробую получше разобраться с вашим примером

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

взял пример отправки данных на ардуине двоичным протоколом

на меге8 он компилируется

на тиньке нет, да даже бы если скомпилировалось врядли бы влезло

тот код что вы давали в 8 посте вообще не нашел, это кусок из библиотеки?

двоичный протокол вроде хорошо подходит. могли бы вы дать код для двоичного протокола как в 8 посте

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013


Для двоичного протокола на базе RCswitch:от  0 до1048576. ( 220.)

подходит отлично. 16 бит данные, 4 бита идентификатор, ну это конечно если я правильно понял

P.S. да нет. как хотел не подойдет. в библиотеке сделано по другому

MaksMS
Offline
Зарегистрирован: 11.03.2013

Если использовать через библиотеки,то не подойдет, вот чистый вариант на си подходит..

Пример из 8 сообщения там же имеется под заголовком "Пример подпрограммы для отправки данных на чистом Си (Передатчик)"

 

Передавать можно всей кучей в 20 битах ваши данные,просто собрав,а потом разбив биты

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

спасибо. но решил уйти от тиньки

я тут прикинул зачем мне нужна вообще тинька. выбор основан был на следующих моментах:

+ компактность

+ цена 15 рублей

+ под мелкие задачи лучше использовать тиньку, чтобы не было стрельбы из пушки по воробьям

+ внутренний опорник на 1.1В. очень удобно для измерения тока, где значения напряжения на шунте очень маленькие

- 2 аппаратных шима, к тому же совпадают с выводами программирования, поэтому требуется отключать от этих выводов оконечные устройства

- мало ножек

- нет аппаратного UART

- мало памяти

но мега 8 по многим параметрам выигрывает

+ размер совсем немного больше тиньки 13

+ цена 27 рублей всего

+ аппаратный UART (удобно отправить в терминал и посмотреть что происходит внутри)

+ много ножек

+ 3 аппаратных шим

+ достаточно памяти

Вот думаю зря я вооще к тинькам 13 полез. Хотя поработав с тиньками теперь проще писать программы для меги, код получается компактнее, с жк дисплеем работать теперь намного проще

поэтому тему закрываю. спасибо за ответы

MaksMS
Offline
Зарегистрирован: 11.03.2013

Никто не мешает отлаживать на одном м/к,а использовать на другом м/к..

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

MaksMS пишет:

Никто не мешает отлаживать на одном м/к,а использовать на другом м/к..

тут сложнее. опорник разный. хотя можно конечно пересчитать при переходе на другой камень. но не нравится что  когда заливаешь прошивку приходится отключать устройства. жутко неудобно

AVL4ARDUINO
Offline
Зарегистрирован: 04.01.2012

Здравствуйте!

Пробую текст для Си из поста номер 8 http://arduino.ru/forum/programmirovanie/1-provodnoi-intefeis-dlya-tinki...

скомпилировать в Кодевижине и получаю ошибки:

Error: F:\Progger\AVR\2262\2313\2262_2313.c(19): undefined symbol '_BV'
Error: F:\Progger\AVR\2262\2313\2262_2313.c(23): must declare first in block
Error: F:\Progger\AVR\2262\2313\2262_2313.c(27): must declare first in block
Error: F:\Progger\AVR\2262\2313\2262_2313.c(27): undefined symbol 'uint8_t'
Error: F:\Progger\AVR\2262\2313\2262_2313.c(29): undefined symbol 'i'
Error: F:\Progger\AVR\2262\2313\2262_2313.c(29): undefined symbol 'i'
Error: F:\Progger\AVR\2262\2313\2262_2313.c(29): undefined symbol 'i'
Error: F:\Progger\AVR\2262\2313\2262_2313.c(41): declaration syntax error
Error: F:\Progger\AVR\2262\2313\2262_2313.c(41): '(' expected
Error: F:\Progger\AVR\2262\2313\2262_2313.c(45): declaration syntax error
 

Первым делом - первая ошибка в этой строке 19:  DDRB |= _BV(RC_BIT);

Как её исправить? Я понимаю, что компилятор не понимает команду _BV. Как "звучит эта команда на Си для AVR?

Ну и следующие тоже подскажите, пожалуйста, что б сто раз не спрашивать.

Спасибо.
 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AVL4ARDUINO, это макрос установки бита. Замените на DDRB |=1<<RC_BIT;

AVL4ARDUINO
Offline
Зарегистрирован: 04.01.2012

Спасибо, я уже сам додумался и написал так  DDRB |= 1<<(RC_BIT);

Но Вы меня опередили. Спасибо!

Разбираем дальше?

Следующая ошибка в строке 23:

Error: F:\Progger\AVR\2262\2313\2262_2313.c(23): must declare first in block

unsigned short repeats = 1 << (((unsigned long)data >> 20) & 7); Чего тут не так?
Думаю, что проблемка в предыдущей строке: data |= 3L << 20;

А именно 3L не нравится. Да? Что это за data и 3L вникаю.