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

|
мучаюсь уже неделю немогу правильно получить данный от mega8 и mega16, пробывал и на СV и на GCC в порт что то выдаёт но не точто нужно, думаю нужно фузы поставить но какие так и немогу разобраться, у кого может есть пример на gcc что бы можно было нормально разобраться.
|
|
|
|
|
Jan 9 2006, 15:47
|

кекс
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 9 2006, 21:09
|
Группа: Новичок
Сообщений: 5
Регистрация: 13-02-05
Пользователь №: 2 615

|
ну я так и предпологал что нужно настраивать фузы только не знал как  ранешье работал с 2313 проблем небыло. А вообще всётаки ещё интересно узнать про калибровочную таблицу, часто в примерах встречаю но немогу разобраться а за настройки фузов спасибо, попробую да тактирую от уварца 3,686400
Сообщение отредактировал tvell - Jan 9 2006, 21:10
|
|
|
|
|
Jan 9 2006, 22:29
|

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

|
Цитата(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% выше от номинальной частоты.
|
|
|
|
|
Jan 10 2006, 14:49
|

кекс
     
Группа: Свой
Сообщений: 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 с осциллографом. Результаты напишу здесь.
|
|
|
|
|
Jan 10 2006, 15:42
|

кекс
     
Группа: Свой
Сообщений: 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 измерения не производил, думаю оно никому и не надо.
|
|
|
|
|
Jan 10 2006, 16:24
|

кекс
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 10 2006, 17:28
|
Участник

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

|
Вообще, для настройки УСАРТ используется UBRR регистр. Таблицы для настройки этого регистра приводятся в конце расдела УСАРТ в любом даташите Так, для кварца 3.6864 МГц при любой настройке гарантируется безошибочный прием/передача (Error 0%). Поэтому, надо определиться , на каком битрейте работать и выбрать соответственное значение для записи в UBRR. Например, для передачи на 115200 bps в UBRR надо заслать 1.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|