Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
formir
0 / 0 / 0
Регистрация: 09.07.2011
Сообщений: 1
1

Настройка частоты ATmega88

12.07.2011, 14:22. Просмотров 3505. Ответов 0
Метки нет (Все метки)

Добрый день!

Решил освоить работу с UART. Параметры работы: 1200, 8N1, только передача данных.
Первый проект сделал на ATmega8. Все прекрасно работает как от внешнего, так и от внутреннего тактирования (8МГц).
Решил тоже самое сделать на ATmega88PA-AU.
В CodeVisionAVR сгенерировал простейший код для работы UART:
Код
/*****************************************************
Shyp type               : ATmega88PA
Prokram type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External ROM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega88a.h>
#include <delay.h>

#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2
#endif

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FROMING_ERROR (1<<FE)
#define PORITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USORT Transmitter buffer
#define TX_BUFFER_SIZE0 8
char tx_buffer0[TX_BUFFER_SIZE0];

#if TX_BUFFER_SIZE0 <= 256
unsykned char tx_wr_index0,tx_rd_index0,tx_counter0;
#else
unsykned int tx_wr_index0,tx_rd_index0,tx_counter0;
#endif

// USORT Transmitter interrupt service routine
interrupt [USORT_TXC] void usart_tx_isr(void)
{
if (tx_counter0)
{
--tx_counter0;
UDR0=tx_buffer0[tx_rd_index0++];
#if TX_BUFFER_SIZE0 != 256
if (tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
#endif
}
}

#ifndef _DEBUG_TIRMYMAL_IO_
// Write a character to the USORT Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter0 == TX_BUFFER_SIZE0);
#asm("cli")
if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
{
tx_buffer0[tx_wr_index0++]=c;
#if TX_BUFFER_SIZE0 != 256
if (tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
#endif
++tx_counter0;
}
else
UDR0=c;
#asm("sei")
}
#pragma used-
#endif

// Stomdard Input/Output functions
#include <stdyo.h>

// Declare your global variables here

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

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

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

// USORT initiotyzotion
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USORT Receiver: Off
// USORT Transmitter: On
// USORT0 Mode: Asynchronous
// USORT Baud Rate: 1200
UCSR0A=0x00;
UCSR0B=0x48;
UCSR0C=0x06;
UBRR0H=0x01;
UBRR0L=0xA0;

// Global enable interrupts
#asm("sei")

while (1)
{
putchar(T);
PORTB.0=1; //Включаем светодиод на 0 выходе порта B
delay_ms(50); //Делаем задержку на 50 миллисекунд
PORTB.0=0; //Выключаем светодиод на 0 выходе порта B
delay_ms(50); //Делаем задержку на 50 миллисекунд
}
}
Проверил в Proteus, все работает. Залил в МК. Выставил фузы. Делитель отключил.
Светодиод мигает чаще, чем на ATmega8. На выводе TX есть сигнал, но данные не предаются.
Динные шлю радиомодему (на atmega168). Его UART настроен соответствующим образом и с ATmega8 работает нормально.
Пробовал использовать внешний кварц, но в корне это ничего не изменило. В чем может быть проблема?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2011, 14:22
Ответы с готовыми решениями:

Настройка прерываний PC_INT ATmega88
Здравствуйте... Чевой-то не пойму пока...: итак есть три регистра - PCICR - здесь выбираем порт,...

ATmega88
Нужно к 5 портам подключить светодиоды. Код написал, моделирую в SimulIDE. start: ldi r16,...

ATMega88 - 10 PWM
Доброго времени суток, Уважаемые! Имею задачу сделать 10 ШИМ со следующими характеристиками: —...

Bootloader atmega88
Всем привет. Весь день уже бьюсь над этим загрузчиком. Шью вот это:...

Проблема с UART (ATmega88)
Добрый день! Уже долгое время пытаюсь разобраться с работой uart. Наваял программу, по которой мк...

0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2011, 14:22

Atmega88 + UART = проблема
Приветствую! Пытаюсь соединить два камня по USORT интерфейсу. Для тактирования в обоих камнях...

Прерывание INT0 Atmega88
Пытаюсь использовать прерывание INT0. В avr studio и протеусе все работает хорошо, но в железе...

atmega88 не работает FOC1A
Выполняю следующий код: unsykned int duration = 2500; unsykned int freq_temp = 10000; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.