Сообщение от code-by
|
приветствую
Ищу рабочий пример связи между двумя мегами (аля 324) через UART под codevision с отправкой-приемом с использованием кольцевого буфера.
Необходимо отправлять - принимать числа int.
может есть пример с алгоритмом самосинхронизации
типа такого, но под Codevision:
Код:
|
UsartMessage_t *msg;
uint8_t *p, *q, summ, i;
q = (uint8_t *)newMessage;
summ = 0;
if (wsn2usart.size ‹ MAX_USART_MESSAGE_QUEUE_COUNT)
{
wsn2usart.size++;
msg = &wsn2usart.usartMessageQueue[wsn2usart.tail];
if (++wsn2usart.tail ›= MAX_USART_MESSAGE_QUEUE_COUNT)
wsn2usart.tail -= MAX_USART_MESSAGE_QUEUE_COUNT;
p = msg-›payload;
*p++ = 0x10;
*p++ = 0x02;
for (i = 0; i ‹ sizeof(AppMessage_t); i++)
{
if (*q == 0x10)
{
*p++ = 0x10;
summ += 0x10;
}
summ += *q;
*p++ = *q++;
}
*p++ = 0x10;
*p++ = 0x03;
summ += 0x10 + 0x02 + 0x10 + 0x03;
*p++ = summ;
msg-›size = p - msg-›payload;
}
//check sending state
if (true == wsn2usart.isFreeUsart)
{
sendNextMessage();
} |
спасибо!
|
Пример программы передачи данных c COM Potr по USART на Atmega8:
/************************************************** ***
This program was produced by the
CodeWizardAVR V2.03.8a Evaluation
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : USART
Version : 0.1
Date : 21.10.2010
Author : vgtmaster
Company : vgtmaster
Comments: No comment
Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
************************************************** ***/
#include ‹mega8.h›
// Standard Input/Output functions
#include ‹stdio.h›
#include ‹m8_128.h›
unsigned char bcounter=0;
char ReceiveString [32]="duch ";
// Declare your global variables here
interrupt [USART_RXC]void USART_RX_interrupt (void)
{short i;
//UCSRB = (1‹‹RXEN)|(1‹‹TXEN);
bcounter = 0;
ReceiveString[bcounter] = UDR; /* Get and return received data from buffer */
bcounter+=1;
for ( i=0 ; i ‹ 3500 ; i++ )
{if (UCSRA & 0x80)
{i=0;
ReceiveString[bcounter++] = UDR;
}
}
}
////////Функция передачи данных///////////
void USART_Transmit(char count,char * buf) //count колличество передаваемых байт, buf массив.
{unsigned char i=0;
{for (i=0;i‹count;i++)
{while ( !( UCSRA & (1‹‹UDRE)) ){;}
UDR = buf[i];
}
}
}
//////////////////END/////////////////////
void USART_Init( unsigned int ubrr)
{/* Set baud rate */
UBRRH = (unsigned char)(ubrr››8,0);
UBRRL = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSRB = (1‹‹RXCIE |1‹‹RXEN)|(1‹‹TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = ((1 ‹‹ URSEL) | (1 ‹‹ UCSZ1) | (1 ‹‹ UCSZ0));
}
void main(void)
{#asm("sei")
USART_Init( 0x33); //9600 на 8МГц
// USART_Transmit(ReceiveString);
while (1)
{if (bcounter)
{
USART_Transmit(bcounter,ReceiveString); //Передача количества байт (bcounter, массив ReceiveString)
bcounter=0;
ReceiveString[0]=0;
}
};
}