Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: настройка uart для мега
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
tvell
мучаюсь уже неделю немогу правильно получить данный от mega8 и mega16, пробывал и на СV и на GCC в порт что то выдаёт но не точто нужно, думаю нужно фузы поставить но какие так и немогу разобраться, у кого может есть пример на gcc что бы можно было нормально разобраться.
*SERG
Скорей всего с внутренним генератором работаешь, там заморочки с байтом калибровки(сам так и не разобрался как им пользоваться), то ж долго мучался, смог настроить только с помощью осциллографа.....
А по хорошему конечно бы хотелось узнать методику "правильного" расчёта,при работе от внутреннего генератора, 1, 4, 8, и 16 МГц

зы. прога в cvavr была написана
Petka
приведите свои исходники.
*SERG
С помощью Wizarda в CVAVRсгенерите настройки порта, вот и будет исходник, точнее его часть которая интересует smile.gif
defunct
Цитата(Petka @ Jan 9 2006, 15:48) *
приведите свои исходники.


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

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

а за настройки фузов спасибо, попробую да тактирую от уварца 3,686400 cheers.gif
defunct
Цитата(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% выше от номинальной частоты.
*SERG
А для чего тогда, данные в коллибровочной ячейке, которая как понял предназначенна для внутреннего генератора, там то же число какое то записывается при изготовлении???
defunct
Цитата(*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
> *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
Если кому надо привожу программку для оценки частоты осциллятора спомощью низкочастотного частотомера. (например популярным тестером 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
freux
Вообще, для настройки УСАРТ используется UBRR регистр.
Таблицы для настройки этого регистра приводятся в конце расдела УСАРТ в любом даташите
Так, для кварца 3.6864 МГц при любой настройке гарантируется безошибочный прием/передача (Error 0%). Поэтому, надо определиться , на каком битрейте работать и выбрать соответственное значение для записи в UBRR. Например, для передачи на 115200 bps в UBRR надо заслать 1.
Gennadiy_
Я проверял работу RC генератора на Tiny26, -и решил им не пользоваться, от температуры плывет, чего и следовало ожидать. Таймер вместо 20 минут отсчитывал 17 - 22 минуты.
На сколько я понимаю если условия отличаются от заводских, то программа должна переписывать калибровочный регистр после старта в зависимости от условий. А вам решать будет она писать одно и тоже значение (постоянные условия) после старта или у вас датчик температуры есть => проще поставить кварц, если нужна стабильность.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.