1 проводной интефейс для тиньки
- Войдите на сайт для отправки комментариев
При работе с тинькой 13 возникает проблема узнать какие то значения для корректировки программы, но памяти мало, выводы ограничены и возникла следующая мысль:
с одного из свободных выводов отсылать инфу по 1 проводному интерфейсу. 1wire библиотека здесь не подойдет изза ограниченного размера флеша. отсылать инфу не проблема. например отправка 2 байт например значений с АЦП
1 | void 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: Очистка дисплея
это самое основное. жду ваших предложений
Я сделал так http://homes-smart.ru/index.php/oborudovanie/bez-provodov-433-315mgts/besprovodnoj-datchik-temperatury-i-vlazhnosti-na-baze-radiomodulej-433-315
Там есть примеры отправки и приема данных на страничке алгоритма.
если правильно написал получается следующее
01
#define wire_on PORTB |= 1<<0 //для вывода используем PB0
02
#define wire_off PORTB &= ~(1<<0)
03
04
void
setup
() {
05
DDRB |= 0b000001;
//включаем PB0 на выход
06
}
07
08
void
loop
(){
09
SendLCD(2, 1024);
10
SendLCD(1, 256);
11
SendLCD(2, 458);
12
13
}
14
15
void
SendLCD(
byte
id,
int
data){
16
for
(
byte
i=0;i<3;i++)
17
{
18
if
(id & 0x4) wire_on;
19
else
wire_off;
20
id <<= 1;
21
delay(2);
//скорость можно конечно и увеличить
22
}
23
for
(
byte
i=0;i<16;i++)
24
{
25
if
(data & 0x80) wire_on;
26
else
wire_off;
27
data <<= 1;
28
delay(2);
29
}
30
}
занимает 318 байт. пока терпимо, но лучше бы меньше
для приемной стороны пока незнаю
но еще не сделал функцию объеденения координат из 2 байт в инт
спасибо за пример. постараюсь разобраться в нем, но судя по коду боюсь места она занимает много, и для основной программы места не останется
Я сделал так http://homes-smart.ru/index.php/oborudovanie/bez-provodov-433-315mgts/besprovodnoj-datchik-temperatury-i-vlazhnosti-na-baze-radiomodulej-433-315
Там есть примеры отправки и приема данных на страничке алгоритма.
к сожалению коды просто огромны даже для меги8
но в тиньке даже не будет работать (если я правильно понял, связано с прерываниями), не то что не влезет
А чего тинька должна отправлять конкретно ? состояние аналогового входа ? я насчитал 466 байт всего для этого )
Я сделал так http://homes-smart.ru/index.php/oborudovanie/bez-provodov-433-315mgts/besprovodnoj-datchik-temperatury-i-vlazhnosti-na-baze-radiomodulej-433-315
Там есть примеры отправки и приема данных на страничке алгоритма.
к сожалению коды просто огромны даже для меги8
но в тиньке даже не будет работать (если я правильно понял, связано с прерываниями), не то что не влезет
отправлять может без проблем, принимать - да не хватит,для этого подойдет только аттини85
отправлять уже описал что и где выводить на дисплей, очищать дисплей
данные могут быть любые до 2 байт размером. там и ацп, и шим в данный момент, расчетные данные. на ардуине это проще, в терминал отправил и посмотрел.
принимать тиньке ничего не надо. делается устройство для отладки программ на тиньке в железе, когда нужно знать данные с которыми работает тинька. тинька отправляет, мега принимает и выводит на дисплей
А чего тинька должна отправлять конкретно ? состояние аналогового входа ? я насчитал 466 байт всего для этого )
вы скомпилировали для тиньки и у вас получилось 466 байт? приведите код пожалуйста. может я не те примеры смотрел (честно сказать не все посмотрел, только 2)
001
#define RC_BIT 3 // пин
002
003
#define periodusec 400 // mcs период
004
005
void
sendRC(unsigned
long
data) {
// , unsigned short pin 531 440 max
006
007
DDRB |= _BV(RC_BIT);
008
009
data |= 3L << 20;
010
011
unsigned
short
repeats = 1 << (((unsigned
long
)data >> 20) & 7);
012
013
data = data & 0xfffff;
//truncate to 20 bit
014
015
unsigned
long
dataBase4 = 0; uint8_t i;
016
017
for
(i=0; i<12; i++) {
018
019
dataBase4<<=2;
020
021
dataBase4|=(data%3);
022
023
data/=3;
024
025
}
026
027
unsigned
short
int
j;
028
029
for
(j=0;j<repeats;j++) {
030
031
data=dataBase4; uint8_t i;
032
033
for
(i=0; i<12; i++) {
switch
(data & 3) {
034
035
case
0:
036
037
PORTB |= _BV(RC_BIT);
038
039
_delay_us(periodusec);
040
041
PORTB &= ~_BV(RC_BIT);
042
043
_delay_us(periodusec*3);
044
045
PORTB |= _BV(RC_BIT);
046
047
_delay_us(periodusec);
048
049
PORTB &= ~_BV(RC_BIT);
050
051
_delay_us(periodusec*3);
052
053
break
;
case
1: PORTB |= _BV(RC_BIT);
054
055
_delay_us(periodusec*3);
056
057
PORTB &= ~_BV(RC_BIT);
058
059
_delay_us(periodusec);
060
061
PORTB |= _BV(RC_BIT);
062
063
_delay_us(periodusec*3);
064
065
PORTB &= ~_BV(RC_BIT);
066
067
_delay_us(periodusec);
068
069
break
;
070
071
case
2:
072
073
PORTB |= _BV(RC_BIT);
074
075
_delay_us(periodusec);
076
077
PORTB &= ~_BV(RC_BIT);
078
079
_delay_us(periodusec*3);
080
081
PORTB |= _BV(RC_BIT);
082
083
_delay_us(periodusec*3);
084
085
PORTB &= ~_BV(RC_BIT);
086
087
_delay_us(periodusec);
088
089
break
;
090
091
}
092
093
data>>=2;
094
095
}
096
097
PORTB |= _BV(RC_BIT);
098
099
_delay_us(periodusec);
100
101
PORTB &= ~_BV(RC_BIT);
102
103
_delay_us(periodusec*31);
104
105
} }
-вот функция пример отправки в троичном коде ,она чуть больше,чем я написал ранее(там двоичный код) ,тут где-то выйдет байт 550..
честно сказать не понял про троичный код, почему он троичным называется?
компилировали в чем? в 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
почему вы склоняетесь к троичному коду? в чем его преимущество?
Число раскладывается на троичный код и передается.
пример под avr-gcc ,но в арудине тоже будет работать,тут всего лишь функцию _delay_us надо заменить.
Троичный - просто пример ,взятый из библиотеки RemoteSwitch..
дайте пожалуйста ссылку почитать в чем его преимущество. хоть понять если смысл в такой простой задаче применения троичного кода
нашел следующее, незнаю вы об этом или нет
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
Не так просто передать данные ,тут нужна синхронизация и необходимо продумать прием
Я продложил готовый вариант
Не обязательно использовать троичный ,можно и двоичный -под оба варианта есть библиотеки-приемники
да над приемом я еще думаю. попробую получше разобраться с вашим примером
взял пример отправки данных на ардуине двоичным протоколом
01
#include <RCSwitch.h>
02
03
RCSwitch mySwitch = RCSwitch();
04
05
float
tempout=-25.46;
06
float
tempin=30.64;
07
08
#define key1 300000
09
#define key2 303000
10
11
void
setup
() {
12
mySwitch.enableTransmit(10);
// пин,на который подключен передатчик
13
}
14
15
void
loop
() {
16
17
sendRC(tempout*10+key1+500);
18
19
delay(1000);
20
21
sendRC(tempin*10+key2+500);
22
23
delay(1000);
24
25
}
26
27
// подпрограмма отправки данных
28
void
sendRC(unsigned
long
code) {
29
30
mySwitch.send(code, 20);
31
32
}
на меге8 он компилируется
на тиньке нет, да даже бы если скомпилировалось врядли бы влезло
тот код что вы давали в 8 посте вообще не нашел, это кусок из библиотеки?
двоичный протокол вроде хорошо подходит. могли бы вы дать код для двоичного протокола как в 8 посте
Для двоичного протокола на базе RCswitch:от 0 до1048576. ( 220.)
подходит отлично. 16 бит данные, 4 бита идентификатор, ну это конечно если я правильно понял
P.S. да нет. как хотел не подойдет. в библиотеке сделано по другому
Если использовать через библиотеки,то не подойдет, вот чистый вариант на си подходит..
Пример из 8 сообщения там же имеется под заголовком "Пример подпрограммы для отправки данных на чистом Си (Передатчик)"
Передавать можно всей кучей в 20 битах ваши данные,просто собрав,а потом разбив биты
спасибо. но решил уйти от тиньки
я тут прикинул зачем мне нужна вообще тинька. выбор основан был на следующих моментах:
+ компактность
+ цена 15 рублей
+ под мелкие задачи лучше использовать тиньку, чтобы не было стрельбы из пушки по воробьям
+ внутренний опорник на 1.1В. очень удобно для измерения тока, где значения напряжения на шунте очень маленькие
- 2 аппаратных шима, к тому же совпадают с выводами программирования, поэтому требуется отключать от этих выводов оконечные устройства
- мало ножек
- нет аппаратного UART
- мало памяти
но мега 8 по многим параметрам выигрывает
+ размер совсем немного больше тиньки 13
+ цена 27 рублей всего
+ аппаратный UART (удобно отправить в терминал и посмотреть что происходит внутри)
+ много ножек
+ 3 аппаратных шим
+ достаточно памяти
Вот думаю зря я вооще к тинькам 13 полез. Хотя поработав с тиньками теперь проще писать программы для меги, код получается компактнее, с жк дисплеем работать теперь намного проще
поэтому тему закрываю. спасибо за ответы
Никто не мешает отлаживать на одном м/к,а использовать на другом м/к..
Никто не мешает отлаживать на одном м/к,а использовать на другом м/к..
тут сложнее. опорник разный. хотя можно конечно пересчитать при переходе на другой камень. но не нравится что когда заливаешь прошивку приходится отключать устройства. жутко неудобно
Здравствуйте!
Пробую текст для Си из поста номер 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?
Ну и следующие тоже подскажите, пожалуйста, что б сто раз не спрашивать.
Спасибо.
AVL4ARDUINO, это макрос установки бита. Замените на DDRB |=1<<RC_BIT;
Спасибо, я уже сам додумался и написал так 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 вникаю.