RFM22 / RFM22B + AVR

Обсуждаем цифровые устройства...
Ответить
D.i.M.K.i.N.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн дек 10, 2012 10:48:25

RFM22 / RFM22B + AVR

Сообщение D.i.M.K.i.N. »

:)) Доброе время суток коты:)

Собрал на днях модуль RFM22B + AVR ulricha.
http://www.ulrichradig.de/home/index.php/avr/rfm22-und-atmega88
RFM22B + ATmega88 + USB Adapter


Запрограммировал на передатчик.
Фьюэы выставил -U lfuse:w:0xff:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m
Запустился, светодиод мигает...

Второй модуль пока не собирал.
Передает, не передает - не знаю, не проверял...
Больше интересует UART.

Спойлер/*----------
Copyright:
Author: Radig Ulrich
Remarks:
known Problems: none
Version: 14.06.2007
Description: RS232 Routinen
----------*/

#include "usart.h"

//----------
//Init serielle Schnittstelle
void usart_init(unsigned long baudrate)
{
//Enable TXEN im Register UCR TX-Data Enable
UCSRB =(1 << TXEN);

//Teiler wird gesetzt
UBRRH = (unsigned char)((SYSCLK / (baudrate * 16L) - 1)>>8);
UBRRL = (unsigned char)((SYSCLK / (baudrate * 16L) - 1));
}

//----------
void usart_write_P (const char *Buffer,...)
{
va_list ap;
va_start (ap, Buffer);

int format_flag;
char str_buffer[10];
char str_null_buffer[10];
char move = 0;
char Base = 0;
int tmp = 0;
char by;
char *ptr;

//Ausgabe der Zeichen
for(;;)
{
by = pgm_read_byte(Buffer++);
if(by==0) break; // end of format string

if (by == '%')
{
by = pgm_read_byte(Buffer++);
if (isdigit(by)>0)
{

str_null_buffer[0] = by;
str_null_buffer[1] = '\0';
move = atoi(str_null_buffer);
by = pgm_read_byte(Buffer++);
}

switch (by)
{
case 's':
ptr = va_arg(ap,char *);
while(*ptr) { usart_write_char(*ptr++); }
break;
case 'b':
Base = 2;
goto ConversionLoop;
case 'c':
//Int to char
format_flag = va_arg(ap,int);
usart_write_char (format_flag++);
break;
case 'i':
Base = 10;
goto ConversionLoop;
case 'o':
Base = 8;
goto ConversionLoop;
case 'x':
Base = 16;
//****************************
ConversionLoop:
//****************************
itoa(va_arg(ap,int),str_buffer,Base);
int b=0;
while (str_buffer[b++] != 0){};
b--;
if (b<move)
{
move -=b;
for (tmp = 0;tmp<move;tmp++)
{
str_null_buffer[tmp] = '0';
}
//tmp ++;
str_null_buffer[tmp] = '\0';
strcat(str_null_buffer,str_buffer);
strcpy(str_buffer,str_null_buffer);
}
usart_write_str (str_buffer);
move =0;
break;
}

}
else
{
usart_write_char ( by );
}
}
va_end(ap);
}

//----------
//Ausgabe eines Strings
void usart_write_str(char *str)
{
while (*str)
{
usart_write_char(*str++);
}
}

//----------
//Routine fьr die Serielle Ausgabe eines Zeichens
void usart_write_char(char c)
{
if (c == '\n')
usart_write_char('\r');
//Warten solange bis Zeichen gesendet wurde
while(!(UCSRA & (1<<UDRE)));
//Ausgabe des Zeichens
UDR = c;
return;
}


Подключался Terminalом, в ответ тишина...
Никак не могу понять что он должен посылать в UaRT и когда?!
У USB Adapterа - эхо есть...

Коты помогите новичку...
Что в коде UARTa? Для мня С - тьма...
Понял только то что включена передача.

Может я фьюзы неправильно выставил?
Или кто уже собирал?
Вложения
LSS.zip
весь проект ulricha
(514.18 КБ) 165 скачиваний
Реклама
Аватара пользователя
Санек86
Грызет канифоль
Сообщения: 258
Зарегистрирован: Ср сен 19, 2012 18:21:57

Re: RFM22 / RFM22B + AVR

Сообщение Санек86 »

Никак не могу понять что он должен посылать в UaRT и когда?!


в UaRT посылается кадр. Кадр может быть размером в 5-8,9 бит -это зависит от установок(см. даташит таблица 54 помоему.).

Когда кадр собран срабатывает флажок UDRE и выполняется условие
while(!(UCSRA & (1<<UDRE)));


после в UDR = c; заносят кадр и он передается. После передачи флажок UDRE сбрасывается .

как-то так если напутал что-то то меня поправят.

модераторы перенесите тему к авр.
Реклама
D.i.M.K.i.N.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн дек 10, 2012 10:48:25

Re: RFM22 / RFM22B + AVR

Сообщение D.i.M.K.i.N. »

он постоянно повторяет посылку,
без внешней команды?
т.е. подключился к uart и в terminale увидел?

но терминал молчит... :(
Аватара пользователя
Санек86
Грызет канифоль
Сообщения: 258
Зарегистрирован: Ср сен 19, 2012 18:21:57

Re: RFM22 / RFM22B + AVR

Сообщение Санек86 »

а что терминал должен делать??? у вас ведь настроена передача UCSRB =(1 << TXEN); , а не прием... Хотя я сам еще в uart плаваю могу и ошибаться....

если с вражеским тяжело то
http://www.cyberforum.ru/electronics/thread526610.html здесь лежит книга по авр называется даташит attiny2313.zip (5.55 Мб, 55 просмотров) она на русском почитайте там по уарту...
Реклама
Эиком - электронные компоненты и радиодетали
D.i.M.K.i.N.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн дек 10, 2012 10:48:25

Re: RFM22 / RFM22B + AVR

Сообщение D.i.M.K.i.N. »

все равно не понял, что куда и как.
за книжку спасибо...
Реклама
Аватара пользователя
Санек86
Грызет канифоль
Сообщения: 258
Зарегистрирован: Ср сен 19, 2012 18:21:57

Re: RFM22 / RFM22B + AVR

Сообщение Санек86 »

у вас уарт настроен на передачу получается вы в терминале должны что-то ввести ,а гфке берет из терминалаи передает. А если у вас был бы настроен прием, то вы могди бы принять инфу от передатчика и вывести ее в терминале. Я так это понимаю. Смоделируйте в протерусе... у вас проблемы могут быть из-за расхождения в частоте....
UBRRH = (unsigned char)((SYSCLK / (baudrate * 16L) - 1)>>8);
UBRRL = (unsigned char)((SYSCLK / (baudrate * 16L) - 1));

и частоте на которой работает терминал...
Реклама
D.i.M.K.i.N.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн дек 10, 2012 10:48:25

Re: RFM22 / RFM22B + AVR

Сообщение D.i.M.K.i.N. »

получается так:

терминал >>> UART >>> mega88 >>> RFM22 >>> эфир...

т.е. то что я передам в UART уйдет в эфир... так?

case 'c': case 'x': и т.п. - это что?
это и есть "команды" для передачи?
Аватара пользователя
Санек86
Грызет канифоль
Сообщения: 258
Зарегистрирован: Ср сен 19, 2012 18:21:57

Re: RFM22 / RFM22B + AVR

Сообщение Санек86 »

D.i.M.K.i.N. писал(а):получается так:

терминал >>> mega88>>> UART >>> RFM22 >>> эфир...

т.е. то что я передам в UART уйдет в эфир... так?



как я понимаю да

case 'c': case 'x': и т.п. - это что?
это и есть "команды" для передачи?


3.2. Оператор множественного выбора

Язык Си имет встроенный оператор множественного выбора, называемый switch. Основная форма оператора имеет вид:

/* Пример 11 */
switch(выражение){
case constant1:
последовательность операторов;
break;
case constant2:
последовательность операторов;
break;
...
default: последовательность операторов;
}
Сначала вычистяется выражение в скобках за ключевым словом switch. Затем перебирается список меток ( case: ....; и т.д. ) до тех пор, пока не найдется метка, соответствующая значению вычисленного выражения. Далее происходит выполнение последовательности операторов, следующих за двоеточием. Если же не встречается ни одного соответствия, то выполняется default-последовательность.
Допускается конструкция оператора switch, когда слово default и соответствующая последовательность операторов может отсутствовать.
Ещё один не встречавшийся ранее оператор - break. Когда после одного или нескольких операторов встречается ключевое слово break, то его выполнение приводит к выходу из оператора switch и переходу к следующей инструкции. Наличие оператора break в операторе switch необязательно. Оператор break заканчивает последовательность операторов, относящихся к каждой метке. Если же оператор break отсутствует, то выполнение switch продолжается до первого встретившегося break либо до конца самого оператора switch. Рассмотрим две программы с использованием оператора break и без него:

#include<stdio.h>
/* Пример 12 */
main()
{
char ch;
pitntf("Введите заглавную букву русского алфавита ...");
ch=getchar(); /*Вводим один символ*/

if(ch>='A' && ch<='Я') /*Проверяем, пренадлежит ли
значение ch диапазону допустимых значений в программе*/
{
switch(ch)
{
case 'A': printf("Андреев\n");
break;
case 'Б': printf("Булгаков\n");
break;
case 'В': printf("Волошин\n");
break;
case 'Г': printf("Гоголь\n");
break;
default: printf("Достоевский и т.д...\n");
break;
}
else ptintf("Надо было ввести заглавную букву.");
} #include<stdio.h>
/* Пример 13 */

main()
{
char ch;
pitntf("Введите заглавную букву русского алфавита ...");
ch=getchar(); /*Вводим один символ*/

if(ch>='A' && ch<='Я') /*Проверяем, пренадлежит ли
значение ch диапазону допустимых значений в программе*/
{
switch(ch)
{
case 'A': printf("Андреев\n");
case 'Б': printf("Булгаков\n");
case 'В': printf("Волошин\n");
case 'Г': printf("Гоголь\n");
default: printf("Достоевский и т.д...\n");
}
else ptintf("Надо было ввести заглавную букву.");
}

Предположим, вы запустили первую программу и ввели букву Б. Результатом выполнения будет строка: Булгаков. Т.е. выполняется только один оператор, соответствующий метке 'Б .


while(!(UCSRA & (1<<UDRE)));
//Ausgabe des Zeichens
UDR = c;
return;
}
вся переда осуществляется здесь
D.i.M.K.i.N.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн дек 10, 2012 10:48:25

Re: RFM22 / RFM22B + AVR

Сообщение D.i.M.K.i.N. »

осталось понять что это за кусок

СпойлерConversionLoop:
//****************************
itoa(va_arg(ap,int),str_buffer,Base);
int b=0;
while (str_buffer[b++] != 0){};
b--;
if (b<move)
{
move -=b;
for (tmp = 0;tmp<move;tmp++)
{
str_null_buffer[tmp] = '0';
}
//tmp ++;
str_null_buffer[tmp] = '\0';
strcat(str_null_buffer,str_buffer);
strcpy(str_buffer,str_null_buffer);
}
usart_write_str (str_buffer);
move =0;
break;
Аватара пользователя
Санек86
Грызет канифоль
Сообщения: 258
Зарегистрирован: Ср сен 19, 2012 18:21:57

Re: RFM22 / RFM22B + AVR

Сообщение Санек86 »

Код: Выделить всё

ConversionLoop:
//****************************
itoa(va_arg(ap,int),str_buffer,Base);  //хрен его знает
int b=0;                                             //объявляем целочисленую переменную и присваеваем ей нуль   
while (str_buffer[b++] != 0){};          объявляется цикл. Если значения массива str_buffer не равно нулю  то....b++ -это переменная которая
//с каждым шаго мувеличивается на 1. бред како-то потому чтоо цикл открывается и сразу закрывается ничего не делая
b--;      // уменьшаем переменную с каждым шагом на 1
if (b<move) // если переменная b меньше переменной move то
{                 
move -=b;    // переменная move равна переменной  b
for (tmp = 0;tmp<move;tmp++)  //объявлен цикл он будет повторяться от 0 до момента пока не перестанет выполняться условие tmp<move. Перемеменная tmp увеличивается на 1 с кааждым шагом
{
str_null_buffer[tmp] = '0'; // в цикле заполняем массив
}
//tmp ++;                                       //эта строка отключена
str_null_buffer[tmp] = '\0';              // значению tmp массива str_null_buffer присваиваем значение '\0'
strcat(str_null_buffer,str_buffer);     //муть какая-то. видимо данные из одного массива копируются в другой...
strcpy(str_buffer,str_null_buffer);   //муть какая-то. видимо данные из одного массива копируются в другой...
}
usart_write_str (str_buffer);           //хрен его знает
move =0;                                      //присваиваем переменной нуль 
break;                                            //прерывание программы



как-то так...если что-то не правильно пусть меня поправят. Код какой-то бредовый...
D.i.M.K.i.N.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн дек 10, 2012 10:48:25

Re: RFM22 / RFM22B + AVR

Сообщение D.i.M.K.i.N. »

:shock:

может кто собирал? нет таких?
Аватара пользователя
Санек86
Грызет канифоль
Сообщения: 258
Зарегистрирован: Ср сен 19, 2012 18:21:57

Re: RFM22 / RFM22B + AVR

Сообщение Санек86 »

в исходниках я не нашел hex файла. вы сами компилировали? кОМПИЛЯЦИЯ ПРОШЛА БЕЗ ОШИБОК????
D.i.M.K.i.N.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн дек 10, 2012 10:48:25

Re: RFM22 / RFM22B + AVR

Сообщение D.i.M.K.i.N. »

исходник взял у немца http://www.ulrichradig.de/home/index.php/avr/rfm22-und-atmega88.

там проект под AVR Studio,
компиляция прошла без ошибок, запись тоже...
D.i.M.K.i.N.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн дек 10, 2012 10:48:25

Re: RFM22 / RFM22B + AVR

Сообщение D.i.M.K.i.N. »

решил собрать еще один модуль (RX).
посмотрим что получиться...
Аватара пользователя
Санек86
Грызет канифоль
Сообщения: 258
Зарегистрирован: Ср сен 19, 2012 18:21:57

Re: RFM22 / RFM22B + AVR

Сообщение Санек86 »

конечно попробуйте...
D.i.M.K.i.N.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн дек 10, 2012 10:48:25

Re: RFM22 / RFM22B + AVR

Сообщение D.i.M.K.i.N. »

ИТОГ:

http://www.ulrichradig.de/home/index.ph ... d-atmega88
схема + прошивки в статье рабочие.
запускаются модули tx\rx с полпинка.

собирал на:
RFM22B
ATmega88 (-U lfuse:w:0xff:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m)

USBadapter + модуль RX + Terminal = посылка на экране монитора (HAllO).
D.i.M.K.i.N.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн дек 10, 2012 10:48:25

Re: RFM22 / RFM22B + AVR

Сообщение D.i.M.K.i.N. »

:shock:
Ответить

Вернуться в «Цифровая техника»