Полная версия этой страницы:
настройка uart для мега
мучаюсь уже неделю немогу правильно получить данный от mega8 и mega16, пробывал и на СV и на GCC в порт что то выдаёт но не точто нужно, думаю нужно фузы поставить но какие так и немогу разобраться, у кого может есть пример на gcc что бы можно было нормально разобраться.
Скорей всего с внутренним генератором работаешь, там заморочки с байтом калибровки(сам так и не разобрался как им пользоваться), то ж долго мучался, смог настроить только с помощью осциллографа.....
А по хорошему конечно бы хотелось узнать методику "правильного" расчёта,при работе от внутреннего генератора, 1, 4, 8, и 16 МГц
зы. прога в cvavr была написана
приведите свои исходники.
С помощью Wizarda в CVAVRсгенерите настройки порта, вот и будет исходник, точнее его часть которая интересует
defunct
Jan 9 2006, 15:47
Цитата(Petka @ Jan 9 2006, 15:48)

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

ранешье работал с 2313 проблем небыло.
А вообще всётаки ещё интересно узнать про калибровочную таблицу, часто в примерах встречаю но немогу разобраться
а за настройки фузов спасибо, попробую да тактирую от уварца 3,686400
defunct
Jan 9 2006, 22:29
Цитата(tvell @ Jan 9 2006, 23:09)

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

хм.. если верить 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), часы я бы на нем не делал

PS: Atmel не рекомендует калибровать генератор более чем на 10% выше от номинальной частоты.
А для чего тогда, данные в коллибровочной ячейке, которая как понял предназначенна для внутреннего генератора, там то же число какое то записывается при изготовлении???
defunct
Jan 10 2006, 14:49
Цитата(*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 с осциллографом. Результаты напишу здесь.
defunct
Jan 10 2006, 15:42
> *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 измерения не производил, думаю оно никому и не надо.
defunct
Jan 10 2006, 16:24
Если кому надо привожу программку для оценки частоты осциллятора спомощью низкочастотного частотомера. (например популярным тестером 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
Вообще, для настройки УСАРТ используется UBRR регистр.
Таблицы для настройки этого регистра приводятся в конце расдела УСАРТ в любом даташите
Так, для кварца 3.6864 МГц при любой настройке гарантируется безошибочный прием/передача (Error 0%). Поэтому, надо определиться , на каком битрейте работать и выбрать соответственное значение для записи в UBRR. Например, для передачи на 115200 bps в UBRR надо заслать 1.
Gennadiy_
Jan 16 2006, 17:49
Я проверял работу RC генератора на Tiny26, -и решил им не пользоваться, от температуры плывет, чего и следовало ожидать. Таймер вместо 20 минут отсчитывал 17 - 22 минуты.
На сколько я понимаю если условия отличаются от заводских, то программа должна переписывать калибровочный регистр после старта в зависимости от условий. А вам решать будет она писать одно и тоже значение (постоянные условия) после старта или у вас датчик температуры есть => проще поставить кварц, если нужна стабильность.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.