Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.03.2012, 14:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: UART + atmega32
можно поглядеть на скриншот фьюзов?
|
|
|
|
04.03.2012, 18:19
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: UART + atmega32
Там все фьюзы равны 1. Картинку, где фьюзы считаны пришлю позже, сейчас пока есть только картинка на то как я прогал.
|
|
|
|
12.03.2012, 07:23
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: UART + atmega32
Вчера вот обменивался сообщениями МК-ПК по uart, работало только на скорости 1200 бод, вместо ожидаемых в 9600. Непонятно почему, но мк атмега32 работает на 1МГц, хотя фьюзы все единички и установлен внешний кварц на 8МГц.
|
|
|
|
03.04.2012, 12:42
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: UART + atmega32
А не подскажете как передавать и принимать по uart не по одному символу, а все что туда приходит. И как организовать поиск определенного сочетания символов в принятых данных?
Вот код файла где я организую прием данных:
#include "usart.h"
//однобайтный буфер
volatile unsigned char usartRxBuf = 0;
#define RXCIE 7
#define RXEN 4
#define TXEN 3
#define URSEL 7
#define UCSZ1 2
#define UCSZ0 1
//инициализация usart`a
void USART_Init(void)
{
UBRRH = 0;
UBRRL = 51; //скорость обмена 9600 бод
UCSRB = (1‹‹RXCIE)|(1‹‹RXEN)|(1‹‹TXEN); //разр. прерыв при приеме, разр приема, разр передачи.
UCSRC = (1‹‹URSEL)|(1‹‹UCSZ1)|(1‹‹UCSZ0); //размер слова 8 разрядов
}
#define UDRE 5
//отправка символа по usart`у
void USART_SendChar(unsigned char sym)
{
while(!(UCSRA & (1‹‹UDRE)));
UDR = sym;
}
//чтение буфера
unsigned char USART_GetChar(void)
{
unsigned char tmp;
unsigned char saveState = SREG;
#asm("cli");
tmp = usartRxBuf;
usartRxBuf = 0;
SREG = saveState;
return tmp;
}
//прием символа по usart`у в буфер
interrupt [USART_RXC] void usart_rxc_my(void)
{
usartRxBuf = UDR;
}
|
|
|
|
05.04.2012, 15:27
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: UART + atmega32
Ну или может кто знает как написать код, чтобы по uart мк принимал все что ему передают и отдавал не по символу?
|
|
|
|
06.04.2012, 01:03
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: UART + atmega32
Сообщение от kruftin
|
#define RXCIE 7
#define RXEN 4
#define TXEN 3
#define URSEL 7
#define UCSZ1 2
#define UCSZ0 1
|
Зачем вы это всё пишете?
Биты и регистры периферии обычно идут в комплекте с компилятором.
пишите так:
Код:
|
#include ‹ioavr.h› // ну или как у вашего компилятора называется |
Сообщение от kruftin
|
#include "usart.h"
|
А этот файл зачем? У вас там реализация приёма/передачи?
|
|
|
|
06.04.2012, 01:15
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: UART + atmega32
Сообщение от kruftin
|
Ну или может кто знает как написать код, чтобы по uart мк принимал все что ему передают и отдавал не по символу?
|
А что там знать-то?
Делаете буферы на сколько нужно байт и пишете/читаете в них.
В соответствующем прерывании передаёте и принимаете данные.
В основной программе или ещё где обрабатываете принятые данные не по одному дайту,, а все что есть в буфере.
Запись на передачу - пишете строку/массив сразу сколько нужно передать.
Код:
|
struct TTxBuffer {
unsigned char Buf[BUFFER_SIZE];
volatile unsigned char Next, First;
};
struct TTxBuffer TxBuffer;
void SendByte(unsigned char new_byte)
{
TxBuffer.Buf[TxBuffer.Next++]=new_byte;
if (TxBuffer.Next==BUFFER_SIZE)
TxBuffer.Next=0;
EnableTxBufferEmptyInterrupt();
}
void SendString(unsigned char *ptr, unsigned char length)
{
while (length--) SendByte(*ptr++);
}
void SendISR(void)
{
if (TxBuffer.Next!=TxBuffer.First) {
UDR=TxBuffer.Buf[TxBuffer.First++];
if (TxBuffer.First==BUFFER_SIZE) TxBuffer.First=0;
if (TxBuffer.Next==TxBuffer.First)
DisableTxBufferEmptyInterrupt();
}
} |
|
|
|
Сказали "Спасибо" _Артём_
|
|
|
06.04.2012, 20:20
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: UART + atmega32
А нельзя это сделать без структур? Если просто есть строка на N байт и её надо передать. То как-нить попроще можно считывать из строки по байту и передавать?
|
|
|
|
07.04.2012, 01:33
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: UART + atmega32
Сообщение от kruftin
|
А нельзя это сделать без структур? Если просто есть строка на N байт и её надо передать.
|
Можно.
Код:
|
unsigned char StringForSend[N+1];//
volatile unsigned char TxNext, TxFirst;
void SendString(void)
{
TxFirst=0;
TxNext=N;
EnableUartBufferEmptyInterrupt();
}
void UartBufferEmptyInterrupt(void)
{
if (TxNext!=TxFirst) {
UDR=StringForSend[TxFirst++];
if (TxFirst==TxNext) DisableUartBufferEmptyInterrupt();
}
} |
|
|
|
|
07.04.2012, 13:44
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: UART + atmega32
Не это то понятно, а для avr нету в си строковых типов переменных?
Чтобы unsigned string StringForSend; - и в строке лежит несколько байт
И вот ее надо передать.
unsigned char StringForSend[N+1] - это же массив как я понимаю, хотя могу и ошибаться. Руководство по написанию программ на си для atmega32 существует официльное или надо читать переводы на русском?
_Артём_, большое спасибо за код.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Прошивка atmega32
|
kruftin |
Микроконтроллеры, АЦП, память и т.д |
10 |
17.02.2012 17:22 |
Atmega32 и энкодер
|
Pevek80 |
Микроконтроллеры, АЦП, память и т.д |
21 |
06.03.2011 20:46 |
Atmega32 и LCD
|
DEJL1985 |
Делимся опытом |
8 |
20.06.2010 14:35 |
ATmega32
|
NCy |
Микроконтроллеры, АЦП, память и т.д |
20 |
28.04.2007 00:44 |
Внутренее АЦП в ATmega32
|
Ztman |
Микроконтроллеры, АЦП, память и т.д |
0 |
25.04.2007 22:51 |
Часовой пояс GMT +4, время: 09:49.
|
|