Описание: Реализация протокола связи по радиоканалу |
Поиск в теме | Версия для печати |
vova_gorskih |
Отправлено: 16 Февраля, 2011 - 13:34:20
|
Рядовой
Сообщений всего: 8
Дата рег-ции: Февр. 2011
|
Написал программу, спаял в железе: 2 атмеги8 общаются по UART по проводам, на одной атмеге матричная клавиатура, на второй жк 2х16, нажимаем кнопку на клаве- на жк выводится цифра соответствующей клавиши. по проводам всё работает, припаяли RF модули 423, или 433 мГц не помню, (плата щас не у меня), (RF купили в промэлектронике). Пока клавишу не нажимаем, всё тихо, когда нажимаем клавишу, прилетает всякий мусор из набора случайных чисел. Ознакомился с инфой на просторах инета по этому поводу что такое манчестерский код немного посмотрел, понял, что нужно разбивать каждый передаваемый бит на 2 части, программно реализовать можно, вот только ресурсов у мк хватит лишь на то, чтобы выполнять только ранее перечисленные действия, а это лишь эксперимент на пути создания системы команд (считай протокол связи).Может есть дешёвые средства аппаратной реализации этого дела (манчестерский код). Дело в том, что сам я закончил электрофак и мк знаю всего полтора года в программировании самоучка, в целом представляю, в тонкости не вдаюсь, программы писать научился в CVAVR на С поэтому объясните попроще пожалуйста. В чём может быть дело, помогите кто знает чего нибудь по этому поводу. Вот этот радиомодуль:
http://www.abacom-tech.com/asset...DATA-SAWuser.pdf |
|
|
nest |
Отправлено: 16 Февраля, 2011 - 19:50:50
|
Администратор
Сообщений всего: 4866
Дата рег-ции: Сент. 2009
|
cjA пишет:даташите нарисовано какой кварц за какую скорость отвечает (в правом нижнем углу на последней картинке) Это просто Application Schematic.
Это вот как раз хороший пример плохого даташита
Студенту сказали "Вася, вот модуль, нарисуй схему для его применения". Он и нарисовал. Причём правильно нарисовал, всё чётко указал, какой кварц нужен для какой скорости.
Редактору даташита сказали "Петя, слушай, вот Вася нарисовал схему, ты её в даташит приаттач, что б типа было что". Он и приаттачил, всё как ему сказали.
Весь модуль представляет собой простой модулятор, который "барабанит" несущщую частоту при сигнале на входе. Никакой "микросхемы, задаюшей скорость", ему не нужно.
А микросхема из Application Schematic - аппаратный кодер/декодер Манчестера DPC-64 с ФИФО-буфером. И больше ничего. |
|
|
vova_gorskih |
Отправлено: 17 Февраля, 2011 - 06:09:46
|
Рядовой
Сообщений всего: 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
};
} Прикреплено изображение
|
|
|
vova_gorskih |
Отправлено: 17 Февраля, 2011 - 13:01:47
|
Рядовой
Сообщений всего: 8
Дата рег-ции: Февр. 2011
|
Это только эксперимент, радиомодуля нет потому что в библиотеках Протеуса он отсутствует (по крайней мере я не нашёл), да знаю что в прерывании нельзя так много действий, потом перетащу в МЭЙН, разрешение, запрет прерываний сгенерирован CodeWizardAVR, мне он не мешает провести эксперимент передачи по радиоканалу, поэтому над компановкой и пр. не заморачивался ничо не удалял, не правил, тока добавил кусок кода мне нужный и всё. Сейчас важен принцип, что эта ерунда работает по проводам и никак по радиоканалу, программу отрехтую, поковыряюсь сделаю как надо (времени убью правда много), щас главное с радиоканалом вопрос решить (Отредактировано автором: 17 Февраля, 2011 - 13:06:23) |
|
|
|
Поиск в теме | Версия для печати |
Страниц (3): [1] 2 3 » |
« Делимся опытом » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|