[an error occurred while processing this directive]
Я не могу понять как пощагово реализовать алгоритм в CodeVisionAVR
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено dred73 22 июля 2006 г. 22:35
В ответ на: MODBUS, он и в Африке - MODBUS. В чем затык, то? отправлено ETM 22 июля 2006 г. 22:19

Есть проц атмега16 есть руки как модбас работает знаю
Свой протокол обмена МК и ПК писал все работает но не могу (может просто думаю не в том направлении) модбас реализовать

получать байты из уарта получаю но по одному функцией getchar()из буфера а как дальще и что с ними делать ума не приложу в частности не
пойму как мне выхватить целый пакет и просчитать для него CRC
И ТАК уже 3 дня

исходник ниже


#include

// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=0
#endasm
#include <1wire.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<#define PARITY_ERROR (1<#define DATA_OVERRUN (1<#define DATA_REGISTER_EMPTY (1<#define RX_COMPLETE (1<// USART Receiver buffer
#define RX_BUFFER_SIZE 256
#define RX_BUFFER_SIZE2 128
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,data;
status=UCSRA;
data=UDR;
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

#define DS1990_FAMILY_CODE 1
#define SEARCH_ROM 0xF0

#define MAX_DEVICES 8
unsigned char rom_code[MAX_DEVICES][9];
unsigned char i,j,devices;
unsigned char n=1;

// Declare your global variables here

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

// Input/Output Ports initialization
// Port A 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
PORTA=0x00;
DDRA=0x00;

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

// Port C 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
PORTC=0x00;
DDRC=0x00;

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

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=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
// INT2: Off
MCUCR=0x00;
MCUCSR=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: 4800
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;

// èíèöèàëèçèðóåì 1-ware âûõîä
w1_init();

// ðàçðåøàåì ãëîáàëüíûå ïðåðûâàíèÿ
#asm("sei")
#define CRC_BYTE 1 // Êîëè÷åñòâî áàéò CRC (áåç CRC - 0, äëÿ 8 áèòíîãî - 1, äëÿ 16 áèòíîãî - 2)
while (1)
{
/*çäåñü ìà íà÷èíàåì ïðèåì ïàêåòà â ñîîòâåòñòâèè ñ íàøèì îëãîðèòìîì ðàáîòû */

char ADRES; // ýòà ïåðåìåííàÿ íîìåðà óñòðîéñòâà êîòîðàÿ ñ÷èòûâàåòñÿ ñ ïîðòà À
char UPRAV; // ýòî áàéò óïðàâëåíèÿ
char RX_Start; // ñòàðòîâûé áàéò
char RX_Stop; // Áàéò ïèçíàêà êîíöà ïàêåòà
char RX_start_p;// ïðèíèìàåìûé áàéò ñòàðòà
char RX_stop_p;// ïðèíèìàåìûé áàéò ñòoïà
char rx_u;// áàéò óïðàâëåíèÿ
char rx_s;// áàéò ñîñòîÿíèÿ
char rx_w1,rx_w2,rx_w3,rx_w4,rx_w5,rx_w6;//ïðèíÿòûå áàéòû ôóíêöèè ñ öåíòðàëüíîãî ïóëüòà ó íàñ îíè íå èñïîëüçóþòñÿ
char tx_w1,tx_w2,tx_w3,tx_w4,tx_w5,tx_w6;//ïåðåäàâàåìûå áàéòû ôóíêöèè (ñþäà ìû áóäåì ïèñàòü ëèáî 0000000000 ëèáî íîìåð êëþ÷à)
char tx_led; //èíäèêàöèÿ ðåæèìà ïðèåìà
char rx_CRC; // Ïðèíÿòûé CRC
char tx_CRC; // ïåðåäàííûé ÑRÑ
char ADRES_RX;// ïðèíÿòûé áàéò àäðåñà


ADRES=PINA; // ñ÷èòûâàåì ñ ïîðòà À íîìåð êîíòðîëëåðà





RX_Start=0xAA;//ñòàðòîâûé áaèò ïðèíèìàåì ðàâíûì â íàùåì ïðîòîêîëå 0b10101010
RX_Stop=0xE7; //ñòîïîâûé áaèò 0b11100111


/* íà÷èíàåì ñàì ïðèåì*/


RX_start_p=getchar(); //íà÷àëî ïðèåìà ïàêåòà, ïðèåì áàéòà ñòàðòà ïðèåìà(âûõâàòûâàåì 1 áàéò èç áóôåðà)

if (RX_start_p==RX_Start) //åñëè ñòàðòîâûé áàéò ñîâïàäàåò ñ íàøèì òî èäåì äàëüøå

{

ADRES_RX=getchar();// ïðèíèìàåì áàéò àäðåñà

if (ADRES_RX==ADRES)

{
rx_u=getchar(); //ïðèíèìàåì áàéò óïðàâëåíèÿ

rx_s=getchar();//ïðèíèìàåì áàéò ñîñòîÿíèÿ

rx_w1=getchar();// ïðèíèìàåì áàéò 1 êëþ÷à
rx_w2=getchar();// ,,,,,,,,,,,,,,,,,,,,,,
rx_w3=getchar();// ,,,,,,,,,,,,,,,,,,,,,,
rx_w4=getchar();// ,,,,,,,,,,,,,,,,,,,,,,
rx_w5=getchar();// ,,,,,,,,,,,,,,,,,,,,,,
rx_w6=getchar();// ïðèíèìàåì áàéò 6 êëþ÷à

rx_CRC=getchar();//ïðèíèìàåì îò ãëàâíîãî ðàñ÷èòàííîå èì ÑRC 8

RX_stop_p=getchar();//ïðèíèìàåì ñòîïîâûé áàéò










/* äàëüøå íà÷èíàåì ñ÷èòàòü*/









};



};














}


}


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание