реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Частота Atmega88, настройка
former
сообщение Jul 13 2011, 09:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 25-04-07
Из: Москва
Пользователь №: 27 306



Добрый день!

Передаю данные по UART на радиомодем (на базе atmega168). Параметры работы: 1200, 8N1, только передача данных.
Первый проект сделал на ATmega8. Все прекрасно работает как от внешнего, так и от внутреннего генератора (8МГц).
Решил тоже самое сделать на ATmega88PA.
В CodeVisionAVR сгенерировал простейший код для работы UART:
CODE
/*****************************************************
Chip type : ATmega88PA
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM 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 FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

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

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

// USART Transmitter interrupt service routine
interrupt [USART_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_TERMINAL_IO_
// Write a character to the USART 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

// Standard Input/Output functions
#include <stdio.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 initialization
// Port B initialization
// 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;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART0 Mode: Asynchronous
// USART 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 сигнал есть, но видимо с другой частотой.
Попробовал поставить внешний кварц. Ничего не поменялось. В чем может быть проблема?

Сообщение отредактировал IgorKossak - Jul 13 2011, 13:25
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
Marto
сообщение Jul 13 2011, 10:02
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 17-05-09
Из: Ижевск
Пользователь №: 49 190



Даташиты читали на мега8 и мега 88? отличия нашли?


--------------------
Шизоидный холерик
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jul 13 2011, 10:04
Сообщение #3


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(former @ Jul 13 2011, 13:55) *
...Выставил фузы ... от внутреннего генератора.... внешний кварц. Ничего...


фузы перекидывали так же? или на внутреннем оставили? если осталвили - и не должно меняться...

если же перекидывали и реакция ноль, то тогда проверить :
питание, ресет, эээээээээээ приборы какими снимаете показания...

питание - нужные уровни по частоте, и без всяких провалов - всплесков.
ресет - нужного уровня, выход в описанных даташитом пределах.
про приборы - тут недавно сам пару часов грохнул, прежде чем увидел что на осциллографе нажата кнопка усреднения показаний sm.gif ...короче говоря внимательней нуна быть...

(круглый)
Go to the top of the page
 
+Quote Post
former
сообщение Jul 13 2011, 10:30
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 25-04-07
Из: Москва
Пользователь №: 27 306



Цитата(Marto @ Jul 13 2011, 14:02) *
Даташиты читали на мега8 и мега 88? отличия нашли?

Marto, извини, случайно нажал.
Читал, читал.
kolobok0
В том то и дело, что фузы выставлял на внешний кварц.

Фузы выставлены следующим образом:
...
CKSEL3…0 = 0000
SUT1..0 = 11
CKOPT = 0
CKOUT = 0

Сообщение отредактировал former - Jul 13 2011, 10:23
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 13 2011, 10:50
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(former @ Jul 13 2011, 14:30) *
В том то и дело, что фузы выставлял на внешний кварц.
...
CKSEL3…0 = 0000
Вы хотели выставить fuses для подключения внешнего кварца? Тогда, не правильно: для m88 CKSEL3…0 = 0000 - External Clock
Go to the top of the page
 
+Quote Post
former
сообщение Jul 13 2011, 11:08
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 25-04-07
Из: Москва
Пользователь №: 27 306



Цитата(Палыч @ Jul 13 2011, 14:50) *
Вы хотели выставить fuses для подключения внешнего кварца? Тогда, не правильно: для m88 CKSEL3…0 = 0000 - External Clock

Дело в том, что фузы выставлял в AVR Studio, а то, что я привел выше, это показал CodeVision.
В AVR Studio для внешнего кварца:


Сообщение отредактировал former - Jul 13 2011, 12:33
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 13 2011, 11:47
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Это случайно не для керамики? И это какая версия STUDIO?

Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
former
сообщение Jul 13 2011, 12:35
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 25-04-07
Из: Москва
Пользователь №: 27 306



Цитата(ILYAUL @ Jul 13 2011, 15:47) *
Это случайно не для керамики? И это какая версия STUDIO?

Прошу прощения, не ту картинку выложил. Заменил. Это не студия, а fuse-калькулятор. Студии просто нет под рукой.))
Дело все в том, что в Datasheet написано, что можно осуществлять программную подстройку частоты, но относится это только к внутреннему rc-резонатору или к внешнему кварцу тоже, непонятно.

Сообщение отредактировал former - Jul 13 2011, 12:38
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jul 14 2011, 03:03
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
Дело все в том, что в Datasheet написано, что можно осуществлять программную подстройку частоты, но относится это только к внутреннему rc-резонатору или к внешнему кварцу тоже, непонятно.


Относится только к внутреннему генератору. Как вы собираетесь корректировать внешний кварц/генератор (если только это не ГУН)?
Go to the top of the page
 
+Quote Post
arttab
сообщение Jul 15 2011, 04:16
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



у 88 точность калиброванного кварца хуже чем у 8. имейте это ввиду, а то может от внутреннего работаете.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01423 секунд с 7
ELECTRONIX ©2004-2016