Как запрограммировать UCSRC у Меги 16?

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Как запрограммировать UCSRC у Меги 16?

Сообщение YuriY » 26 сен 2005, 18:11

В даташите написано что, для программирования UCSRC надо бит URSEL установить в 1, а если он 0 то запишется в UBRRH. А у меня пишется и в UCSRC и в UBRRH одновременно независимо от состояния URSEL.
YuriY
 
Сообщения: 20
Зарегистрирован: 13 май 2005, 17:41
Откуда: Донецк

Сообщение Mike_MA » 27 сен 2005, 12:32

Такого быть не может.  Покажи как ты этого добился в проге...
Mike_MA
 
Сообщения: 367
Зарегистрирован: 07 фев 2005, 17:41
Откуда: Санкт-Петербург

Сообщение YuriY » 27 сен 2005, 12:57

Вот такой текст

clr temp
out UCSRA, temp
ldi temp, 0x10
out UCSRB, temp
ldi temp, 0x86
out           UCSRC, temp
ldi temp, 0x00
out UBRRH, temp
ldi temp, 0x33
out UBRRL, temp

Потом в AVRStudio в отладчике смотрю как записывается в регистры. При записи в  UCSRC 0x86 тоже самое записывается в UBRRH, а потом при обнулении UBRRH они оба обнуляются.
YuriY
 
Сообщения: 20
Зарегистрирован: 13 май 2005, 17:41
Откуда: Донецк

Сообщение Mike_MA » 27 сен 2005, 14:57

Сразу могу предупредить что в AVR Studio ты не сможешь увидеть что записано в каждом из этих регистров по отдельности. Это происходит из-за того что регистры имеют одинаковый адрес.

И самое главное - писать как и читать надо последовательно сначала один, а потом сразу же другой регистр, без посторонних команд между ними. Для проверки того,что записано в регистрах надо просто их прочитать. В дополнение скажу, что точки останова на командах чтения/записи в эти регистры ставить нельзя.
Mike_MA
 
Сообщения: 367
Зарегистрирован: 07 фев 2005, 17:41
Откуда: Санкт-Петербург

Сообщение YuriY » 01 окт 2005, 11:51

Делаю все по даташиту, инициализация, а потом читаю из регистров и там в оба регистра записывается 86:
clr r16
out UCSRA, r16
ldi r17, 0x33             ; уст. скорость 9600

out UBRRH, r16
out UBRRL, r17

ldi r16, (1<<RXEN)   ;разрешаем приемник
out UCSRB, r16

ldi r16, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)   ; данные 8 бит
out UCSRC, r16    

nop

in r19, UBRRH
in r20, UCSRC
YuriY
 
Сообщения: 20
Зарегистрирован: 13 май 2005, 17:41
Откуда: Донецк

Сообщение Mike_MA » 03 окт 2005, 11:58

Хорошо, завтра выложу как делаю это я ... :wink:
Mike_MA
 
Сообщения: 367
Зарегистрирован: 07 фев 2005, 17:41
Откуда: Санкт-Петербург

Сообщение YuriY » 04 окт 2005, 15:02

Да, хотелось бы.
YuriY
 
Сообщения: 20
Зарегистрирован: 13 май 2005, 17:41
Откуда: Донецк

Сообщение Mike_MA » 04 окт 2005, 16:01

YuriY писал(а):Да, хотелось бы.

....Плавно перетекает на завтра...  :lol:  :lol:  :lol:  :wink: склероз, батенька.... :wink:
Mike_MA
 
Сообщения: 367
Зарегистрирован: 07 фев 2005, 17:41
Откуда: Санкт-Петербург

Сообщение Mike_MA » 06 окт 2005, 17:17

Вот например кусок из проги для ATmega162, кусок инициализации УАППа:
"
; инициализация последовательного интефейса USART0
;USART Control and Status Register B ? UCSRB

; 11111000 - full (0xF8)
; 10010000 - only receiver on (0x90)
;

sts UART_bin_Flags_H,r0
sts UART_bin_Flags_L,r0

ldi r16,UBRR_num_L ;
out UBRR0L,r16 ; записываем значение в регистр счётчика

ldi r17,UBRR_num_H ;

ldi r18,0x8E

out UBRR0H,r17 ; записываем значение в регистр счётчика
out UCSR0C,r18

ldi r16,0x90 ; записываем в регистр байт вкл приёмника
out UCSR0B,r16 ; записываем в регистр управления

nop
nop
;----------------------------------------------------

"


Единственное отличие этого контроллера от меги16 - два УАППа. Но пара регистров UBRR0H, UCSR0C находится по одному и тому же адресу.
Проверять в AVR Studio что записано в любом из этих регистров через отладчик - бесполезное занятие. Нужно проверять только на живом контроллере и без точек останова на командах чтения/записи этих регистров.
Mike_MA
 
Сообщения: 367
Зарегистрирован: 07 фев 2005, 17:41
Откуда: Санкт-Петербург

Сообщение YuriY » 06 окт 2005, 21:20

А как проверить на контроллере? Я с меги посылаю на 2313, а он не принимает ничего, а если два 2313 соединяю то все нормально работает
YuriY
 
Сообщения: 20
Зарегистрирован: 13 май 2005, 17:41
Откуда: Донецк

Сообщение Mike_MA » 07 окт 2005, 11:10

А проверяется это очень просто:
Берём кусок кода, например:

ldi r17,UBRR_num_H ;

ldi r18,0x8E

out UBRR0H,r17 ; записываем значение в регистр счётчика
out UCSR0C,r18

ldi r16,0x90 ; записываем в регистр байт вкл приёмника
out UCSR0B,r16 ; записываем в регистр управления

nop
nop
 

и к нему добавляем ещё один кусок:

nop
nop
in r19, UBRR0H
in r20, UCSR0C
nop
nop


главное, ставить точку останова на самой последней команде (nop). И если ты используешь JTAG, то надо запускать этот код до точки останова.  Такая же схема записи регистров была ещё и в серии AT90 при записи в 16-ти разрядный регистр 16-ти разрядного счётчика ...

...А в симуляторе такое я не пробовал т.к. всегда отлаживался на контроллере под интерфейсом JTAG.
Mike_MA
 
Сообщения: 367
Зарегистрирован: 07 фев 2005, 17:41
Откуда: Санкт-Петербург

Сообщение YuriY » 08 окт 2005, 12:25

Пасиба, буду пробовать
YuriY
 
Сообщения: 20
Зарегистрирован: 13 май 2005, 17:41
Откуда: Донецк

Сообщение avr123.nm.ru » 06 ноя 2005, 06:29

Проверяйте проги в симуляторе VMLAB - вам сразу понравится.

пример задачи 3 и 8 курса.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8