роботы робототехника микроконтроллеры


 Страниц (3): [1] 2 3 »   

> Описание: Реализация протокола связи по радиоканалу
vova_gorskih Post Id



Рядовой


Сообщений всего: 8
Дата рег-ции: Февр. 2011  



Написал программу, спаял в железе: 2 атмеги8 общаются по UART по проводам, на одной атмеге матричная клавиатура, на второй жк 2х16, нажимаем кнопку на клаве- на жк выводится цифра соответствующей клавиши. по проводам всё работает, припаяли RF модули 423, или 433 мГц не помню, (плата щас не у меня), (RF купили в промэлектронике). Пока клавишу не нажимаем, всё тихо, когда нажимаем клавишу, прилетает всякий мусор из набора случайных чисел. Ознакомился с инфой на просторах инета по этому поводу что такое манчестерский код немного посмотрел, понял, что нужно разбивать каждый передаваемый бит на 2 части, программно реализовать можно, вот только ресурсов у мк хватит лишь на то, чтобы выполнять только ранее перечисленные действия, а это лишь эксперимент на пути создания системы команд (считай протокол связи).Может есть дешёвые средства аппаратной реализации этого дела (манчестерский код). Дело в том, что сам я закончил электрофак и мк знаю всего полтора года в программировании самоучка, в целом представляю, в тонкости не вдаюсь, программы писать научился в CVAVR на С поэтому объясните попроще пожалуйста. В чём может быть дело, помогите кто знает чего нибудь по этому поводу. Вот этот радиомодуль:


http://www.abacom-tech.com/asset...DATA-SAWuser.pdf
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



vova_gorskih, на какой скорости соединяетесь?

и прикрепите части кода, отвечающие за настройку UART и передачу/приём.

Ну и схему тоже показывайте.
 
 Top
vova_gorskih Post Id



Рядовой


Сообщений всего: 8
Дата рег-ции: Февр. 2011  



Пробовал скорости 600, 1200, 2400, 4800. По проводам все работает корректно, как только прицепляю RF начинается такая вот ботва. Программу писал в CVAVR скорость настраивал с помощью CodeWizardAVR (автоматический генератор начального кода CVAVR). По ДШ радиомодули поддерживают скорости 1200, 2400, 4800 и RS-232. Мож поставить между радиомодулями и МК согласователь уровней MAX-232

Вот ссылочка на ДШ радиомодулей:

http://www.abacom-tech.com/asset...DATA-SAWuser.pdf
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



Остальные просьбы кто будет удовлетворять?
и прикрепите части кода, отвечающие за настройку UART и передачу/приём.
Ну и схему тоже показывайте.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



vova_gorskih пишет:
согласователь уровней MAX-232

вообщета по даташиту там стоит еще одна микросхема которая скорость и задает. У вас она есть?
(Добавление)
ну и к тому же- так таки и случайные? Из пятидясити нажатий ни одного совпадения?
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



cjA пишет:
по даташиту там стоит еще одна микросхема которая скорость и задает
с чего это вы взяли, что она скорость задаёт?
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



в даташите нарисовано какой кварц за какую скорость отвечает (в правом нижнем углу на последней картинке)
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



cjA пишет:
даташите нарисовано какой кварц за какую скорость отвечает (в правом нижнем углу на последней картинке)
Это просто Application Schematic.

Это вот как раз хороший пример плохого даташита Улыбка
Студенту сказали "Вася, вот модуль, нарисуй схему для его применения". Он и нарисовал. Причём правильно нарисовал, всё чётко указал, какой кварц нужен для какой скорости.
Редактору даташита сказали "Петя, слушай, вот Вася нарисовал схему, ты её в даташит приаттач, что б типа было что". Он и приаттачил, всё как ему сказали.


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

А микросхема из Application Schematic - аппаратный кодер/декодер Манчестера DPC-64 с ФИФО-буфером. И больше ничего.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



может больше и ничего но vova_gorskih пишет что если делать его программно- больше ни на что ресурсов не останется.
я бы попробовал вначале посылать не один байт, а пясят- если не получится- тогда уже с этим манчестером прыгать. ИМХО

vova_gorskih пишет:
дешёвые средства аппаратной реализации этого дела (манчестерский код).

nest пишет:
аппаратный кодер/декодер Манчестера DPC-64 с ФИФО-буфером.
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



да хватит там ресурсов и на манчестер и на LCD и на клавиатуру и ещё моторчиками управлять с ШИМ. только как следует аглоритм продумать.
 
 Top
vova_gorskih Post Id



Рядовой


Сообщений всего: 8
Дата рег-ции: Февр. 2011  



я пишу на Си а не на Асме, размер hex файла большой получится (больше 8кб) если затолкать туда всё что задумано, вот схема (пытался вчера вечером отправить, ничо не вышло)
(Добавление)
ВОТ ЛИСТИНГ ПЕРЕДАТЧИКА:

/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 16.02.2011
Author :
Company :
Comments:


Chip type : ATmega8
Program type : Application
Clock frequency : 2,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>

// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
// Declare your global variables here
int a=200;
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=P State2=P State1=P State0=P
PORTC=0x0F;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=1 State6=1 State5=1 State4=1 State3=T State2=T State1=T State0=T
PORTD=0xF0;
DDRD=0xF0;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 2400
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

while (1)
{
PORTD.4=0;

if (PINC.3==0){a=4;;delay_ms(400); PORTD.4=1; }
if (PINC.2==0){a=8;;delay_ms(400); PORTD.4=1; }
if (PINC.1==0){ }// ОПРЕДЕЛИТЬ КОМАНДУ КНОПКА >
if (PINC.0==0){ }
PORTD.4=1;

PORTD.5=0;
if (PINC.3==0){a=3;;delay_ms(400); PORTD.5=1; }
if (PINC.2==0){a=7;;delay_ms(400); PORTD.5=1; }
if (PINC.1==0){ }// ОПРЕДЕЛИТЬ КОМАНДУ КНОПКА <
if (PINC.0==0){ }// РЕЗЕРВНАЯ КНОПКА
PORTD.5=1;

PORTD.6=0;
if (PINC.3==0){a=2;delay_ms(400); PORTD.6=1; }
if (PINC.2==0){a=6;delay_ms(400); PORTD.6=1; }
if (PINC.1==0){a=0;delay_ms(400); PORTD.6=1; }
if (PINC.0==0){ }// ОПРЕДЕЛИТЬ КОМАНДУ КНОПКА ESCAPE
PORTD.6=1;

PORTD.7=0;
if (PINC.3==0){a=1;delay_ms(400); PORTD.7=1; }
if (PINC.2==0){a=5;delay_ms(400); PORTD.7=1; }
if (PINC.1==0){a=9;delay_ms(400); PORTD.7=1; }
if (PINC.0==0){ }// ОПРЕДЕЛИТЬ КОМАНДУ КНОПКА ENTER
PORTD.7=1;




if(a!=200){UDR=a;delay_ms(50);};

a=200;

};


}
(Добавление)
/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 16.02.2011
Author :
Company :
Comments:


Chip type : ATmega8
Program type : Application
Clock frequency : 2,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <stdio.h>
char data;
char lcd_buffer[33];
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status;
status=UCSRA;
data=UDR;
sprintf(lcd_buffer,"%d",data);
lcd_puts(lcd_buffer);
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli"Подмигивающий
--rx_counter;
#asm("sei"Подмигивающий
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 2400
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

// Global enable interrupts
#asm("sei"Подмигивающий

while (1)
{
// Place your code here

};
}
Прикреплено изображение
Безымянный.JPG

 
 Top
vova_gorskih Post Id



Рядовой


Сообщений всего: 8
Дата рег-ции: Февр. 2011  



а что думаете вот об этой штуке

http://cxem.net/rmodem/rmodem14.php

а то на форумах и хорошее и плохое пишут, сам баги паял на 90-108 МГц , настраивал с помощью осциллографа (благо был таковой под руками, FLUK вроде), а это чудо 400 с лишним, а осциллографа под руками нет вобще никакого не то чтобы на 400-500, вот и сомневаюсь в надежности, простоте настройки и пр. о чём там написано.
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



а где у вас на схеме подключён модуль?
и зачем вам два МК?
(Добавление)
CODE:
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void) {
char status;
status=UCSRA;
data=UDR;
sprintf(lcd_buffer,"%d",data);
lcd_puts(lcd_buffer);

Это у вас тут в прерывании всё?! убрать!
В прерывании только кладите в буфер принятый байт и увеличивайте счётчик символов.

CODE:
#asm("cli";)
--rx_counter;
#asm("sei";)

А это зачем так? чем мешают прерывания в данном случае?

Вы уже пробовали просто отправить голый байт через трансивер? Без всяких клавиатур и прочего.
 
 Top
vova_gorskih Post Id



Рядовой


Сообщений всего: 8
Дата рег-ции: Февр. 2011  



Это только эксперимент, радиомодуля нет потому что в библиотеках Протеуса он отсутствует (по крайней мере я не нашёл), да знаю что в прерывании нельзя так много действий, потом перетащу в МЭЙН, разрешение, запрет прерываний сгенерирован CodeWizardAVR, мне он не мешает провести эксперимент передачи по радиоканалу, поэтому над компановкой и пр. не заморачивался ничо не удалял, не правил, тока добавил кусок кода мне нужный и всё. Сейчас важен принцип, что эта ерунда работает по проводам и никак по радиоканалу, программу отрехтую, поковыряюсь сделаю как надо (времени убью правда много), щас главное с радиоканалом вопрос решить

(Отредактировано автором: 17 Февраля, 2011 - 13:06:23)

 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Поддерживаю nest: напишите программу отсылающую 1 байт, а на стороне приёмника посмотрите байт в бинарном виде.
 
 Top
Страниц (3): [1] 2 3 »
« Делимся опытом »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru