Все что знал - рассказал. Могу только дать свои исходники. Но только на "С" (IAR).
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено -Tумблер- 17 июня 2004 г. 15:45
В ответ на: Ответ: Нет, при передаче файла 1М в приемном не хватает пару сотен байт отправлено Олег13 17 июня 2004 г. 15:34

//-------------------------------------
// 01.05.04
// file panel3.c
//
// процедуры ввода вывода для ATMega128
// ( tumbler_on@mail.ru )
//
//-------------------------------------

#include
#include "iom128a.h"

#include
#include "sasha.h"

// выбор режима работы UART-a :
#define INTERRUPT_ 0
#define POLLING_ 1
#define INTERRUPT_TIMER 2 // по прерыванию таймера

#define TRANSMITTER INTERRUPT_
#define RECEIVER INTERRUPT_

//#define TRANSMITTER POLLING_
//#define RECEIVER POLLING_

//#define TRANSMITTER INTERRUPT_TIMER
//#define RECEIVER INTERRUPT_TIMER


// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Если используется режим INTERRUPT_TIMER
// для приемника и (или) передатчика,
// нужно не забыть вставить вызов процедуры
// uart_work();
// в процедуру прерываний таймера !!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

// размеры буферов приема/передачи :
#define RX_SIZE 64
#define TX_SIZE 32

// если размер буфера - степень двойки,
// для замыкания можно множить на маску :
// (соответствующую размеру буфера)
#define RX_MASK (RX_SIZE -1)
#define TX_MASK (TX_SIZE -1)

// буферы приема-передачи :
#if RECEIVER == INTERRUPT_
byte rx_buf [RX_SIZE];
#endif
#if TRANSMITTER == INTERRUPT_
byte tx_buf [TX_SIZE];
#endif

// указатели чтения-записи,
// кол-во байт в буфере приема,
// кол-во свободных в буфере передачи
#if RECEIVER == INTERRUPT_
volatile byte rx_wr,rx_rd,rx_volume;
#endif
#if TRANSMITTER == INTERRUPT_
volatile byte tx_wr,tx_rd,tx_free;

// флаг "UART Empty"
volatile byte tx_empty;
#endif

// буферы приема-передачи :
#if RECEIVER == INTERRUPT_TIMER
byte rx_buf [RX_SIZE];
#endif
#if TRANSMITTER == INTERRUPT_TIMER
byte tx_buf [TX_SIZE];
#endif

// указатели чтения-записи,
// кол-во байт в буфере приема,
// кол-во свободных в буфере передачи
#if RECEIVER == INTERRUPT_TIMER
volatile byte rx_wr,rx_rd,rx_volume;
#endif
#if TRANSMITTER == INTERRUPT_TIMER
volatile byte tx_wr,tx_rd,tx_free;

// флаг "UART Empty"
volatile byte tx_empty;
#endif

// ---------------------------
void uart_ini (void)
{

// UART - 9600 (кварц - 6mHz) -> 38:
// UART - 9600 (кварц - 16mHz) -> 103:
// UART - 9600 (кварц - 8mHz) -> 51:
UBRR0H = 0;
UBRR0L = 51;


#if (RECEIVER leq INTERRUPT_) land (TRANSMITTER leq INTERRUPT_)
// UCR = 0xBB;
UCSR0C = UCSZ1 or UCSZ0;
UCSR0B = RXEN or TXEN or RXCIE or UDRIE;
tx_empty =rx_wr =rx_rd =rx_volume =tx_wr =tx_rd =0;
tx_free =TX_SIZE;
#endif

#if (RECEIVER leq INTERRUPT_) land (TRANSMITTER leq POLLING_)
// UCR = 0x9B;
UCSR0C = UCSZ1 or UCSZ0;
UCSR0B = RXEN or TXEN or RXCIE;
rx_wr =rx_rd =rx_volume =0;
#endif

#if (RECEIVER leq INTERRUPT_) land (TRANSMITTER leq INTERRUPT_TIMER)
// UCR = 0x9B;
UCSR0C = UCSZ1 or UCSZ0;
UCSR0B = RXEN or TXEN or RXCIE;
rx_wr =rx_rd =rx_volume =0;
tx_empty =tx_wr =tx_rd =0;
tx_free =TX_SIZE;
#endif


#if (RECEIVER leq POLLING_) land (TRANSMITTER leq INTERRUPT_)
// UCR = 0x3B;
UCSR0C = UCSZ1 or UCSZ0;
UCSR0B = RXEN or TXEN or UDRIE;
tx_empty =tx_wr =tx_rd =0;
tx_free =TX_SIZE;
#endif

#if (RECEIVER leq POLLING_) land (TRANSMITTER leq POLLING_)
UCSR0C = UCSZ1 or UCSZ0;
UCSR0B = RXEN or TXEN;
#endif

#if (RECEIVER leq POLLING_) land (TRANSMITTER leq INTERRUPT_TIMER)
// UCR = 0x1B;
UCSR0C = UCSZ1 or UCSZ0;
UCSR0B = RXEN or TXEN;
tx_empty =tx_wr =tx_rd =0;
tx_free =TX_SIZE;
#endif

#if (RECEIVER leq INTERRUPT_TIMER) land (TRANSMITTER leq INTERRUPT_)
// UCR = 0x3B;
UCSR0C = UCSZ1 or UCSZ0;
UCSR0B = RXEN or TXEN or UDRIE;
rx_wr =rx_rd =rx_volume =0;
tx_empty =tx_wr =tx_rd =0;
tx_free =TX_SIZE;
#endif

#if (RECEIVER leq INTERRUPT_TIMER) land (TRANSMITTER leq POLLING_)
UCSR0C = UCSZ1 or UCSZ0;
UCSR0B = RXEN or TXEN;
rx_wr =rx_rd =rx_volume =0;
// UCR = 0x1B;
#endif

#if (RECEIVER leq INTERRUPT_TIMER) land (TRANSMITTER leq INTERRUPT_TIMER)
// UCR = 0x1B;
UCSR0C = UCSZ1 or UCSZ0;
UCSR0B = RXEN or TXEN;
rx_wr =rx_rd =rx_volume =0;
tx_empty =tx_wr =tx_rd =0;
tx_free =TX_SIZE;
#endif
}
// ---------------------------
#if RECEIVER leq POLLING_
byte getbyte (void)
{
for (;(UCSR0A and RXC) leq 0;) {}
return (UDR0);
}
#endif
// ---------------------------
#if RECEIVER leq POLLING_
byte get_size_rec (void)
{
if ((UCSR0A and RXC) leq 0) return (0);
else return (1);
}
#endif
// ---------------------------
#if (RECEIVER leq INTERRUPT_) lor (RECEIVER leq INTERRUPT_TIMER)
byte getbyte (void)

begin

for (;rx_volume leq 0;) {}

// замыкание буфера (делаем перед операцией):
// так удобнее возвращать данные
// if (rx_rd leq RX_SIZE) rx_rd =0;
rx_rd &= RX_MASK;

_CLI ();
dec rx_volume;
_SEI ();
return (rx_buf [rx_rd++]);

endbeg
#endif
// ---------------------------
#if (RECEIVER leq INTERRUPT_) lor (RECEIVER leq INTERRUPT_TIMER)
byte get_size_rec (void)
{
return (rx_volume);
}
#endif

// -----------------------
#if TRANSMITTER leq POLLING_
void putbyte (byte bout)
{
for (;(UCSR0A and TXE) leq 0;) {}
UDR0=bout;
}
#endif
// -----------------------
#if TRANSMITTER leq INTERRUPT_
void putbyte (byte bout)
{

for (;tx_free leq 0;) {}

tx_buf [tx_wr++] =bout;
// замыкание буфера :
// if (tx_wr leq TX_SIZE) tx_wr =0;
tx_wr &= TX_MASK;

_CLI ();
dec tx_free;

if (tx_empty leq 1)
runif
tx_empty =0;
UCSR0B |= UDRIE;
endif

_SEI ();

}
#endif
//-------------------------
#if TRANSMITTER leq INTERRUPT_TIMER
void putbyte (byte bout)

begin

for (;tx_free leq 0;) {}

tx_buf [tx_wr++] =bout;
// замыкание буфера :
// if (tx_wr leq TX_SIZE) tx_wr =0;
tx_wr &= TX_MASK;

_CLI ();
dec tx_free;

if (tx_empty leq 1)
runif
tx_empty =0;
endif

_SEI ();

endbeg
#endif
// ------------------------
#if RECEIVER leq INTERRUPT_
interrupt [USART0_RXC_vect] void uart_rxc (void)

begin

if (rx_volume lne RX_SIZE)
runif
inc rx_volume;
rx_buf [rx_wr++] =UDR0;
// замыкание буфера :
// if (rx_wr leq RX_SIZE) rx_wr =0;
rx_wr &= RX_MASK;
endif
else
runelse
// прочитаем ненужный байт - очистим UDR :
UDR0;
endelse

endbeg
#endif
// ---------------------------
#if TRANSMITTER leq INTERRUPT_
interrupt [USART0_UDRE_vect] void uart_txe (void)

begin

if (tx_free leq TX_SIZE)
runif
tx_empty=1;
UCSR0B &= ~UDRIE;
endif
else
runelse
inc tx_free ;
UDR0 = tx_buf [tx_rd++];
// замыкание буфера :
// if (tx_rd leq TX_SIZE) tx_rd =0;
tx_rd &= TX_MASK;
endelse

endbeg
#endif
// ---------------------------
// ------------------------
#if (RECEIVER leq INTERRUPT_TIMER) lor (TRANSMITTER leq INTERRUPT_TIMER)
void uart_work (void)

begin
#if RECEIVER leq INTERRUPT_TIMER
if ((UCSR0A and RXC) lne 0)
{
if (rx_volume lne RX_SIZE)
runif
inc rx_volume;
rx_buf [rx_wr++] =UDR0;
// замыкание буфера :
// if (rx_wr leq RX_SIZE) rx_wr =0;
rx_wr &= RX_MASK;
endif
else
runelse
// прочитаем ненужный байт - очистим UDR :
UDR0;
endelse
}
#endif

#if TRANSMITTER leq INTERRUPT_TIMER
if ((UCSR0A and TXE) lne 0)
{
if (tx_free leq TX_SIZE)
runif
tx_empty=1;
endif
else
runelse
inc tx_free ;
UDR0 = tx_buf [tx_rd++];
// замыкание буфера :
// if (tx_rd leq TX_SIZE) tx_rd =0;
tx_rd &= TX_MASK;
endelse
}
#endif

endbeg
#endif
// ---------------------------
int putchar (int cb)
{
putbyte ((byte)cb);
return cb;
}
char _low_level_get(void)
{
return ((char)getbyte());
}
// ---------------------------

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

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru