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

 
 
 
Reply to this topicStart new topic
> настройка uart для мега
tvell
сообщение Jan 9 2006, 13:22
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 13-02-05
Пользователь №: 2 615



мучаюсь уже неделю немогу правильно получить данный от mega8 и mega16, пробывал и на СV и на GCC в порт что то выдаёт но не точто нужно, думаю нужно фузы поставить но какие так и немогу разобраться, у кого может есть пример на gcc что бы можно было нормально разобраться.
Go to the top of the page
 
+Quote Post
*SERG
сообщение Jan 9 2006, 13:40
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



Скорей всего с внутренним генератором работаешь, там заморочки с байтом калибровки(сам так и не разобрался как им пользоваться), то ж долго мучался, смог настроить только с помощью осциллографа.....
А по хорошему конечно бы хотелось узнать методику "правильного" расчёта,при работе от внутреннего генератора, 1, 4, 8, и 16 МГц

зы. прога в cvavr была написана
Go to the top of the page
 
+Quote Post
Petka
сообщение Jan 9 2006, 13:48
Сообщение #3


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

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



приведите свои исходники.
Go to the top of the page
 
+Quote Post
*SERG
сообщение Jan 9 2006, 14:10
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



С помощью Wizarda в CVAVRсгенерите настройки порта, вот и будет исходник, точнее его часть которая интересует smile.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 9 2006, 15:47
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Petka @ Jan 9 2006, 15:48) *
приведите свои исходники.


Для начала скажите как планируете тактировать вашу Mega16.
Если от кварца тогда Low Fuse Byte = $EF (SUT1 = 1, SUT0=0, CKSEL3..0 = 1)
Если от внутреннего генератора тогда CKSEL3..0 настраивайте по даташиту на требуемую частоту.
По-умолчанию Mega16 настроен на работу от внутреннего RC генератора с частотой 1Mhz.

Сообщение отредактировал defunct - Jan 9 2006, 15:47
Go to the top of the page
 
+Quote Post
tvell
сообщение Jan 9 2006, 21:09
Сообщение #6





Группа: Новичок
Сообщений: 5
Регистрация: 13-02-05
Пользователь №: 2 615



ну я так и предпологал что нужно настраивать фузы только не знал как smile.gif ранешье работал с 2313 проблем небыло.

А вообще всётаки ещё интересно узнать про калибровочную таблицу, часто в примерах встречаю но немогу разобраться rolleyes.gif

а за настройки фузов спасибо, попробую да тактирую от уварца 3,686400 cheers.gif

Сообщение отредактировал tvell - Jan 9 2006, 21:10
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 9 2006, 22:29
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(tvell @ Jan 9 2006, 23:09) *
А вообще всётаки ещё интересно узнать про калибровочную таблицу, часто в примерах встречаю но немогу разобраться rolleyes.gif


хм.. если верить datasheet'у на mega16, то настройка внутреннего RC генератора сводится к устновке соответствующих Fuse bits:
CKSEL3..0 = 0001 (1 Mhz)
CKSEL3..0 = 0010 (2 Mhz)
CKSEL3..0 = 0011 (4 Mhz)
CKSEL3..0 = 0100 (8 Mhz)

частоту можно подстроить с помощью записи калибровочного байта в OSCAL, при этом значение $0 OSCAL будет соответствовать 50% от номинальной частоты, а значение $FF - 200%. Как я понимаю, написанное в даташите, то при CKSEL3..0 = 0100 (номинальная частота 8 Mhz) и значении OSCAL = $FF внутренний генератор должен работать с частотой 16Mhz. Другие значение частоты подбираются пропорционально. Например, пусть требуется настроить внутренний RC генератор на частоту 7.3728 Mhz, тогда устанавливаем CKSEL3..0 = 0100 (8 Mhz), 8Mhz будет нашей номинальной частотой, 7.3728 Mhz - это 92.16% от номинальной частоты, соответственно в OSCAL надо записать ]128 * 0.9216[ = ]117.9648[ = 118.

Но у внутреннего RC очень высокая нестабильность (+-3% при 25C, и Uпит = 5V), часы я бы на нем не делал smile.gif

PS: Atmel не рекомендует калибровать генератор более чем на 10% выше от номинальной частоты.
Go to the top of the page
 
+Quote Post
*SERG
сообщение Jan 10 2006, 07:09
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



А для чего тогда, данные в коллибровочной ячейке, которая как понял предназначенна для внутреннего генератора, там то же число какое то записывается при изготовлении???
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 10 2006, 14:49
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(*SERG @ Jan 10 2006, 09:09) *
А для чего тогда, данные в коллибровочной ячейке, которая как понял предназначенна для внутреннего генератора, там то же число какое то записывается при изготовлении???


В даташите сказано:
Цитата
The ATmega16 stores four different calibration values for the internal RC Oscillator.
These bytes resides in the signature row High Byte of the addresses 0x0000, 0x0001,
0x0002, and 0x0003 for 1, 2, 4, and 8 Mhz respectively. During Reset, the 1 MHz value
is automatically loaded into the OSCCAL Register.
If other frequencies are used, the
calibration value has to be loaded manually, see “Oscillator Calibration Register – OSCCAL”
on page 28 for details.


Похоже здесь несоответствие какое-то или все так как я написал в предыдущем посте. (выделенное в цитате из даташита особо смущает)
Вечером поэксперементирую с OSCCAL с осциллографом. Результаты напишу здесь.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 10 2006, 15:42
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



> *SERG

Обещанные результаты (пробовал на двух чипах ATmega16-16PI, ATmega16-16AI) как ни странно показания не особо сильно отличались - лишь только в третьем знаке после запятой (т.е на несколько килогерц).
Усредненные результаты (до второго знака после запятой) частично подтверждают сказанное мной ранее, в общем смотрите сами:

CKSEL3..0 = 0100 (номинальная частота 8Mhz)
с разными значениями в OSCCAL получил следующие частоты:
OSCCAL = $FF, F = 13.72MHz (ожидал увидеть 16Mhz - 200% от 8-ми)
OSCCAL = $80, F=5.99Mhz (ожидал увидеть 8Mhz)
OSCCAL = $7F, F = 5.94Mhz
OSCCAL = $0, F = 4.01Mhz (50% от 8Mhz)


CKSEL3..0 = 0011 (номинальная частота 4Mhz)
с разными значениями в OSCCAL получил следующие частоты:
OSCCAL = $FF, F = 7.16 MHz
OSCCAL = $80, F=3.09 Mhz
OSCCAL = $7F, F = 3.05 Mhz
OSCCAL = $0, F = 1.95 Mhz

для более низких частот 2Mhz и 1Mhz измерения не производил, думаю оно никому и не надо.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 10 2006, 16:24
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Если кому надо привожу программку для оценки частоты осциллятора спомощью низкочастотного частотомера. (например популярным тестером UNI-T M890F/G у которых шкала измерений до 20Khz)
частота осциллятора делится на 1000 и результат выводится на все пины порта B.

Код
;***************************************************************************
; Программа деления частоты осциллятора на Fdivisor для измерения
; частоты осциллятора низкочатотными частотомерами
; компилятор: AVR Studio 4 (4.11 SP 3).
;***************************************************************************
.include <m16def.inc>

.equ OSCCALValue = $FF; Значение загружаемое в OSCCAL
.equ Fdivisor = 1000  ; делитель частоты осциллятора
.equ Port = PortB     ; используемый порт ввода-вывода

.def  AL = R16;   Аккумулятор
.def  BL = R18;   вспомогательный регистр

.cseg
.equ PortDDR = Port - 1; регистр настройки направления порта

.org 0x0000

    jmp PSTART    ; Program Start
.org 0x000C
    jmp TIM1_COMPA; Timer1 Compare A Handler
.org 0x002A

PSTART:
    ldi   AL ,high(RAMEND) ; Main program start
    out   SPH, AL            ; Set Stack Pointer to top of RAM
    ldi   AL, low(RAMEND)
    out   SPL, AL

; <-- инициализация портов и регистров
    ldi   AL, $FF
    out   PortDDR, AL
    clr   BL

; <-- инициализация таймера
    ldi   AL, High( Fdivisor >> 1 )
    out   OCR1AH, AL
    ldi   AL, Low( Fdivisor >> 1 )
    out   OCR1AL, AL

    ldi   AL, 1 | (1 << CTC1)
    out   TCCR1B, AL

    ldi   AL, (1 << OCIE1A)
    out   TIMSK, AL

; <-- калибровка осциллятора
    ldi   AL, OSCCALValue
    out   OSCCAL, AL
; <-- инициализация ядра
    ldi   AL, (1 << SE)
    out   MCUCR, AL

    sei

;****************************************************
; Основной цикл программы
;****************************************************
MainCycle:          ; <----------- ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ
    sleep
    rjmp  MainCycle ; <----------- ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ

;****************************************************
; Обработчик прерывания TMR1 (Timer 1 OC)
;****************************************************
TIM1_COMPA:; Timer1 Compare A Handler
    com   BL
    out   Port, BL
    reti
Go to the top of the page
 
+Quote Post
freux
сообщение Jan 10 2006, 17:28
Сообщение #12


Участник
*

Группа: Новичок
Сообщений: 41
Регистрация: 7-02-05
Пользователь №: 2 473



Вообще, для настройки УСАРТ используется UBRR регистр.
Таблицы для настройки этого регистра приводятся в конце расдела УСАРТ в любом даташите
Так, для кварца 3.6864 МГц при любой настройке гарантируется безошибочный прием/передача (Error 0%). Поэтому, надо определиться , на каком битрейте работать и выбрать соответственное значение для записи в UBRR. Например, для передачи на 115200 bps в UBRR надо заслать 1.
Go to the top of the page
 
+Quote Post
Gennadiy_
сообщение Jan 16 2006, 17:49
Сообщение #13


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

Группа: Свой
Сообщений: 79
Регистрация: 13-01-06
Из: Москва
Пользователь №: 13 133



Я проверял работу RC генератора на Tiny26, -и решил им не пользоваться, от температуры плывет, чего и следовало ожидать. Таймер вместо 20 минут отсчитывал 17 - 22 минуты.
На сколько я понимаю если условия отличаются от заводских, то программа должна переписывать калибровочный регистр после старта в зависимости от условий. А вам решать будет она писать одно и тоже значение (постоянные условия) после старта или у вас датчик температуры есть => проще поставить кварц, если нужна стабильность.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 13:25
Рейтинг@Mail.ru


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