|
|
  |
Проблема с UART в atmega128 |
|
|
|
Dec 6 2011, 07:04
|
Группа: Новичок
Сообщений: 8
Регистрация: 6-12-11
Пользователь №: 68 700

|
Добрый день. Возникла проблема с приемом по UART от компа на микроконтроллер ATMEGA128. Код программы такой: Код .cseg in r15,UDR0 ldi r17, 47; устанавливаем скорость 9600 out UBRR0L,r17 ldi r16, 18; устанавливаем режим приема out UCSR0B, r16; данных в 8битном пакете Receive: sbis UCSR0A, RXC0; ожидаем приема полного пакета данных rjmp receive in r15, UDR0; загружаем данные в R15 rjmp receive Микроконтроллер тактируется от кварцевого генератора с частотой 7,3728 МГц. Программирую в AVRStudio5. Суть самой проблемы: Сигнал на вход микроконтроллера приходит такой, как надо (проверено осциллографом). Но! Посылая что-то, отличное от 0000 0000, я получаю в регистре R15 0хFF. Скорость передачи и там, и там выставлена 9600. Стоп-бит использую один. Буду благодарен за любые идеи. Заранее спасибо.
|
|
|
|
|
Dec 6 2011, 08:11
|
Группа: Новичок
Сообщений: 8
Регистрация: 6-12-11
Пользователь №: 68 700

|
Микроконтроллер установлен на плате savvy128 Принципиальная схема
Программирую через AVR Dragon
Сообщение отредактировал Whosthere - Dec 6 2011, 08:12
|
|
|
|
|
Dec 6 2011, 11:05
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Палыч @ Dec 6 2011, 13:40)  ...C завода этот fuse приходит запрограммированным, необходимо его (fuse) снять! точно так же как и делитель на 8. короче говоря - fuse в студию (круглый)
|
|
|
|
|
Dec 7 2011, 17:46
|
Группа: Новичок
Сообщений: 8
Регистрация: 6-12-11
Пользователь №: 68 700

|
Насколько я понимаю, fuse 103C у меня отключен (в AVR Studio 5 галочка в нем не стоит). С записью в регистр UCSR0B значения 00010100 разобрался. В этом регистре я устанавливаю RXEN0 и UCSZ02 в 1, а также в регистре UCSR0C устанавливаю UCSZ0 и UCSZ1 в 1. Тогда бит RXB80 установится в единицу при запуске программы.
Но, тем не менее, процессор продолжает записывать в R15 0хFF при передаче на него любой 8битной последовательности (со стоп и старт битами) с единицей в любом из битов.
|
|
|
|
|
Dec 7 2011, 19:48
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Whosthere @ Dec 6 2011, 11:04)  ..ATMEGA128. Код .cseg in r15,UDR0 ldi r17, 47; устанавливаем скорость 9600 out UBRR0L,r17 регистр UBRRxn 16 битный. А вы сколько в него пихаете? В даташите есть примеры. нафига не используете опыт ранее накопленный до вас? правильный код (даташит) (входные регистры r17:r16 - тут приведу инициализацию их) Код ldi r16,low(47) ldi r17,high(47) ; Set baud rate out UBRR0H, r17 out UBRR0L, r16 ышо правильнее за место 47 объявить дефайн константу и юзать её... Цитата(Whosthere @ Dec 6 2011, 11:04)  Код ldi r16, 18; устанавливаем режим приема out UCSR0B, r16; данных в 8битном пакете Давайте посчитаем... 18(10) = 0b00010010(2) это Вы взводите биты RXEN0 и RXB80 как уже было сказано выше - 1 бит - это вы погорячились... достаточно (для поллинга как у вас ниже) бита RXEN0 и ещё. чтоб не путаться и наглядно принято писать такие комбинации: Код ldi r16,(1 << RXEN0) всякие стоп биты, чётности и т.д. инициализируются в регистре UCSR0C этого в вашем примере нет. ещё пять копеек: прерывания надо запрещать перед тем как это всё делать. после - восстанавливать (а не разрешать) - это так к слову.. Цитата(Whosthere @ Dec 6 2011, 11:04)  Код Receive: sbis UCSR0A, RXC0; ожидаем приема полного пакета данных rjmp receive
in r15, UDR0; загружаем данные в R15 rjmp receive Микроконтроллер тактируется от кварцевого генератора с частотой 7,3728 МГц..... это конечно же круто. но лучше пример из даташита: Код USART_Receive: ; Wait for data to be received sbis UCSRA, RXC rjmp USART_Receive ; Get status and 9th bit, then data from buffer in r18, UCSRA in r17, UCSRB in r16, UDR ; If error, return -1 andi r18,(1<<FE)|(1<<DOR)|(1<<UPE) breq USART_ReceiveNoError ldi r17, HIGH(-1) ldi r16, LOW(-1) USART_ReceiveNoError: ; Filter the 9th bit, then return lsr r17 andi r17, 0x01 ret выкинем 9 бит и имеем Код USART_Receive: ; Wait for data to be received sbis UCSRA, RXC rjmp USART_Receive ; Get status then data from buffer in r18, UCSRA in r16, UDR ; If error, return -1 andi r18,(1<<FE)|(1<<DOR)|(1<<UPE) breq USART_ReceiveNoError ldi r16, LOW(-1) USART_ReceiveNoError: .... ; далее ваш текст программы. ретурн, возврат на начало приёма - хз. единственное хочу сказать, что результат надо куда то выпихивать, сохранять, контролировать...а не тупо просто циклить. а то можно и не увидеть самого главного нечаянно. при вашей скорости кварца значения делителя 47. При U2X0 = 0 и указанного кварца - он верный. Fuse выставлен на внешний кварц. из приведённого вами куска, больше всего подозрение вызывает: не правильная инициализация 16 битного регистра скорости!!! удачи вам (круглый)
|
|
|
|
|
Dec 8 2011, 13:54
|
Группа: Новичок
Сообщений: 8
Регистрация: 6-12-11
Пользователь №: 68 700

|
Спасибо за советы. Пока проверить возможности нет. Про 16-битность регистра UBBR я знал, но не загржал в старшие 8 бит ничего, так как по незнанию своему считал, что там изначально нули во всех битах. Не пользовался я копипастой из даташита только потому, что изначально написать мне всегда удобней, а программа небольшая и объем работы практически никакой. Код .cseg in r15,UDR0 ldi r16, low(47); ldi r17, high(47); устанавливаем скорость 9600 out UBRR0L,r16 sts UBRR0H, r17 ldi r16, 20; устанавливаем режим приема ldi r17, 06; данных в 8битном пакете sts UCSR0C, r17 out UCSR0B, r16 Receive: sbis UCSR0A, RXC0; ожидаем приема полного пакета данных rjmp receive in r15, UDR0; загружаем данные в R15 rjmp receive Вот конечный вариант программы. Цитата Флаг RXC кто сбрасывать будет ? Насколько я понимаю, он сбрасывается при прочтении UDR0. Как только меня бдет возможность проверить правильность работы конечного варианта, обязательно отпишусь о наличии ошибки.
|
|
|
|
|
Dec 13 2011, 07:17
|
Группа: Новичок
Сообщений: 8
Регистрация: 6-12-11
Пользователь №: 68 700

|
Увы,проблема не решилась, но я заметил очень странную вещь. Если при пустом UDR выполнить команду in r15,UDR0, то МК запишет в r15 значение FF, а не 00. Возможно я чего-то не понимаю. А также, поставив брейкпойнт на строчку in r15, UDR0, я заметил вот что. При пересылке с компьютера последовательности битов микроконтроллер "наступал" на брейкпоинт, но UDR всё равно оставался пустым вне зависимости от того, что я ему передавал.
|
|
|
|
|
Dec 13 2011, 07:50
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Whosthere @ Dec 13 2011, 11:17)  Увы,проблема не решилась... дык блин. Вы даташиты не читаете принципиально. Что вы хотите то? регистры UCSRnB UCSRnC опять странно инициализорованы. Вы напишите, что Вы там хотите вкл/выкл? А то смотришь в ваш код и в даташит - понимаешь что вы ленитесь. Ну и нафига вам помогать? (круглый)
|
|
|
|
|
Dec 13 2011, 10:39
|
Группа: Новичок
Сообщений: 8
Регистрация: 6-12-11
Пользователь №: 68 700

|
Вероятно такая запись будет больше понятна. Код .cseg in r15,UDR0 ldi r16, low(47); ldi r17, high(47); устанавливаем скорость 9600 out UBRR0L, r16 sts UBRR0H, r17 ldi r16,(1 << RXEN0)|(1 << UCSZ02) ldi r17,(1 << UCSZ01)|(1 << UCSZ00) sts UCSR0C, r17 out UCSR0B, r16 Receive: sbis UCSR0A, RXC0; ожидаем приема полного пакета данных rjmp receive in r14, UCSR0A in r15, UDR0; загружаем данные в R15 out DDRB,r15 rjmp receive В регистре r14 сразу после останова были установлены RXC0 и UDRE0, что соответствует произошедшей передаче и пустому UDR0. Я нашел источник проблемы. Суть в том, что я глуп. Посмотрев во фьюзах откуда тактируется МК, я неожиданно понял, что настроен он не верно. Простите за ввод вас в заблуждение. Спасибо всем за помощь
|
|
|
|
|
Dec 14 2011, 11:04
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Whosthere @ Dec 13 2011, 14:39)  Вероятно такая запись будет больше понятна. Код .. ldi r16,(1 << RXEN0)|(1 << UCSZ02) ldi r17,(1 << UCSZ01)|(1 << UCSZ00) sts UCSR0C, r17 out UCSR0B, r16 ... Посмотрев во фьюзах откуда тактируется МК, я неожиданно понял, что настроен он не верно. Простите за ввод вас в заблуждение. Спасибо всем за помощь я вот специально обращал Ваше внимание на эти регистры... смотрим даташит... Table 80. UCSZn Bits Settings UCSZn2 UCSZn1 UCSZn0 Character Size 0 0 0 5-bit 0 0 1 6-bit 0 1 0 7-bit 0 1 1 8-bit 1 0 0 Reserved 1 0 1 Reserved 1 1 0 Reserved 1 1 1 9-bit как видно - Вы выставили 9 бит. вроде как выше надо было 8бит? (круглый)
|
|
|
|
|
Dec 15 2011, 12:22
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
у меня вопрос очень похожий: что то прием идет не так как надо по UARTу. Использую Atmega8515, отлаживаю на STK500. задача: мк принимает данные и в двоичном коде показывает их на восьми светодиодах. Данные посылаю через програмку “Terminal v1.9b”. число вроде отображает, но на PB4 и PB7 всегда лог.1, то есть посылаю “0″ должен показать 00000000 но показывает 10010000 посылаю “1″ должен показать 00000001 но показывает 10010001 посылаю “2″ должен показать 00000010 но показывает 10010010 и так далее..
обработчик прерывания простейший: PriemZavershen: in r16,UDR out PortB,r16 reti
|
|
|
|
|
Dec 16 2011, 07:57
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(slavik.ksu @ Dec 15 2011, 16:22)  ...но на PB4 и PB7 всегда лог.1... очень смахивает на конфликт с настройками. 1) посмотрите фуз бит SPIEN отключен SPI? 2) попробуйте вывести в другой порт и посчупать осцилом. (круглый)
|
|
|
|
|
Dec 19 2011, 06:53
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
Цитата(kolobok0 @ Dec 16 2011, 11:57)  очень смахивает на конфликт с настройками. 1) посмотрите фуз бит SPIEN отключен SPI? 2) попробуйте вывести в другой порт и посчупать осцилом. пробовал на порта А подключать, та же ситуация. Fuse вкладка выглядит так:
Эскизы прикрепленных изображений
|
|
|
|
|
Dec 19 2011, 11:17
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(slavik.ksu @ Dec 19 2011, 10:53)  пробовал на порта А подключать, та же ситуация.... программку всю. инициализация порта со стороны форточек правильная(скорость, чётность и т.п.)? (круглый)
|
|
|
|
|
Dec 19 2011, 18:00
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
; выполняемые функции: через модуль UART от компьютера принимаем числа ; которые отображаются на 8 СИДах в двоичном коде.
.device ATmega8515 .nolist .include "m8515def.inc" .list
;================ ; Объявления
.def temp = r16
; FLASH =========================================== .CSEG ; Кодовый сегмент
;====== Таблица векторов прерываний================
.ORG 0x0000 ; RESET - Аппаратный сброс RJMP Init .ORG 0x0001 ; INT0 - External Interrupt0 Vector Address; Внешнее прерывание 0 ; RETI .ORG 0x0002 ; INT1 - External Interrupt1 Vector Address; Внешнее прерывание 1 ; RETI ; Ничего не делаем, возвращаемся в основную программу .ORG 0x0003 ; ICP1 - Input Capture1 Interrupt Vector Address; Событие захват Таймера/Счетчика 1 ; RETI .ORG 0x0004 ; OC1A - Output Compare1A Interrupt Vector Address ;Событие "совпадение A" Таймера/Счетчика 1 ; RETI .ORG 0x0005 ; OC1B - Output Compare1B Interrupt Vector Address; Событие "совпадение B" Таймера/Счетчика 1 ; RETI .ORG 0x0006 ; OVF1 - Overflow1 Interrupt Vector Address; Переполнение Таймера/Счетчика 1 ; RETI .ORG 0x0007 ; OVF0 - Overflow0 Interrupt Vector Address; Переполнение Таймера/Счетчика 0 ; RETI .ORG 0x0008 ; SPI - SPI Interrupt Vector Address; Передача данных по SPI завершена RETI .ORG 0x0009 ; URXC - UART Receive Complete Interrupt Vector Address; Прием данных по UART завершена rjmp PriemZavershen ; Переходим к обработчику прерывания .ORG 0x000a ; UDRE - UART Data Register Empty Interrupt Vector Address; Регистр данных UART пуст RETI .ORG 0x000b ; UTXC - UART Transmit Complete Interrupt Vector Address; Передача данных по UART завершен reti; .ORG 0x000c ; ACI - Analog Comparator Interrupt Vector Address; Готов результат аналогового компаратора RETI .ORG 0x000d ; INT2 - External Interrupt2 Vector Address RETI .ORG 0x000e ; OC0 - Output Compare0 Interrupt Vector Address RETI .ORG 0x000f ; ERDY - EEPROM Interrupt Vector Address RETI .ORG 0x0010 ; SPM - SPM complete Interrupt Vector Address RETI ;.ORG 0x0011 ; SPMR - SPM complete Interrupt Vector Address ; RETI
; .ORG INT_VECTORS_SIZE
;================ ; Конец таблицы векторов прерываний===
;============ Блок подпрограмм обработки прерываний =========== PriemZavershen: in temp,UDR out PortB,temp reti
;============ конец Блока подпрограмм обработки прерываний ===========
;=================== Основная программа ====================== Init: ;++++++++++++++ Сдержимое файла INITCORE.INC +++++++++++++++++++++++++ ;==== Инициализация ядра: Память; Регистры; Стек ============= .include "INITCORE.inc" ;++++++++++++++ Конец Содержимого файла INITCORE.INC +++++++++++++++++
;======= Инициализация внутренних периферийных устройств:====== ldi temp , 0b11111111 ; определяем входы\выходы порта В, out DDRB , temp ; 1 делает вывод выходом, 0 - входом! ldi temp , 0b00000000 ; определяем в\в порта D out DDRD , temp
ldi temp , 0b11111111 ; включаем подтяжку (1) для входов порта В out portB , temp ; и задаем начальние состояния выходов ldi temp , 0b00000000 ; то же самое для D out portD , temp
ldi temp, 1<<RXEN|1<<RXCIE ; разрешаем прием и прерывание по приему по UART out UCSRB, temp
ldi temp,25 ; задаем скорость UART = 9600 out UBRRL, temp
ldi r16, (1<<URSEL|1<<UCSZ0|1<<UCSZ1) ; 8-мибитный формат посылки out UCSRC,r16 sei ; глобально разрешаем прерывания!
;==== Коенц Инициализация внутренних периферийных устройств====
;========================= Главный цикл =======================
Start: nop rjmp Start
;++++++++++++++ Сдержимое файла INITCORE.INC +++++++++++++++++++++++++ ;==== Инициализация ядра: Память; Регистры; Стек ============= ;================= Инициализация Памяти ====================== RAM_Flush: LDI ZL,Low(SRAM_START) ; Адрес начала ОЗУ в индекс LDI ZH,High(SRAM_START) CLR R16 ; Очищаем R16 Flush: ST Z+,R16 ; Сохраняем 0 в ячейку памяти CPI ZH,High(RAMEND) ; Достигли конца ОЗУ? BRNE Flush ; Нет! Крутимся дальше! ; Старший байт достиг конца ОЗУ!!! ; Заполняем оставшиеся 255 байт ОЗУ нулями. CPI ZL,Low(RAMEND) ; Младший байт достиг конца ОЗУ? BRNE Flush ; Нет! Крутимся дальше, до конца ОЗУ. ST Z , r16 ; Да? тогда очиаем последний адрес и выходим из цикла ;=============== Инициализация регистров ===================== ; Очищаем 32 индексных регистра R0-R31 ldi ZL, 30 ; ZL есть регистр R30 CLR ZH ; ZH есть регистр R31 dec Zl st Z,ZH BRNE PC-2
;================ Инициализация стека ======================== LDI R16,Low(RAMEND) ; Обязательно!!! OUT SPL,R16 LDI R16,High(RAMEND) OUT SPH,R16 CLR R16 ;++++++++++++++ Конец Содержимого файла INITCORE.INC +++++++++++++++++
|
|
|
|
|
Dec 20 2011, 14:12
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
Да, МК работает на 4МГц. Добавил инициализацию верхней половинки регистра UBRR ldi temp, 0 out UBRRH,temp работает также с ошибкой.
|
|
|
|
|
Dec 21 2011, 11:11
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(slavik.ksu @ Dec 20 2011, 18:12)  ..работает также с ошибкой. у вас в программе стоит вывод в порт B Посмотрите даташит. 2 страницу. распиновку. PB0 = порт B, OC0/T0 PB1 = порт B, T1 PB2 = порт B, AIN0 PB3 = порт B, AIN1 PB4 = порт B, SS PB5 = порт B, MOSI PB6 = порт B, MISO PB7 = порт B, SCK смотрим в фузы SPIEN = включён. (я так понимаю что вы программируете в панельке, можно перейти на программирование не по SPI. читайте инструкцию по STK500) Смотрим, что такое SPI (стр. 123) Это сигналы MISO MOSI SCK SS т.е. пины PB4, PB5, PB6, PB7 юзаются именно как SPI. либо отключайте SPI, либо выводите в порт A или С (как пример) (круглый)
|
|
|
|
|
Dec 22 2011, 05:57
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
Цитата(ILYAUL @ Dec 20 2011, 22:51)  1. После Init: поставьте cli
Init: ;++++++++++++++ Сдержимое файла INITCORE.INC +++++++++++++++++++++++++ ;==== Инициализация ядра: Память; Регистры; Стек ============= .include "INITCORE.inc" ;++++++++++++++ Конец Содержимого файла INITCORE.INC +++++++++++++++++ ;======= Инициализация внутренних периферийных устройств:====== ldi temp , 0b11111111 ; определяем входы\выходы порта В, out DDRB , temp ; 1 делает вывод выходом, 0 - входом! ldi temp , 0b00000000 ; определяем в\в порта D out DDRD , temp ldi temp , 0b11111111 ; включаем подтяжку (1) для входов порта В out portB , temp ; и задаем начальние состояния выходов ldi temp , 0b00000000 ; то же самое для D out portD , temp ldi temp, 1<<RXEN|1<<RXCIE|1<<TXen ; разрешаем прием и прерывание по приему по UART out UCSRB, temp ;ldi temp, 1<<TXEN|1<<TXCIE ; разрешаем передачу и прерывание по передачи по UART ;out UCSRB, temp ldi temp,25 ; задаем скорость UART = 9600 out UBRRL, temp ldi temp, 0 out UBRRH,temp ldi r16, 1<<URSEL|1<<UCSZ0|1<<UCSZ1 ; 8-мибитный формат посылки out UCSRC,r16 in temp , UCSRC ;UBRRH; out POrtB,temp cli дальше там простто цикл: Start: nop rjmp Start Цитата(ILYAUL @ Dec 20 2011, 22:51)  2. Прочтите регистры UBRRH и UCSRC после записи в них вот здесь не пойму как правильно прочитать: ведь эти два регистра с одним адресом памяти, и поэтому читаются странно, показываю все варианты как пробовал считывать: 1вариант ldi temp,25 ; UART = 9600 out UBRRL, temp ldi temp, 0 out UBRRH,temp in temp , UBRRH out POrtB,temp ldi r16, 1<<URSEL|1<<UCSZ0|1<<UCSZ1 out UCSRC,r16 на светодиодах показывает 00000000(как и предполагалось) 2вариант ldi temp, 0 out UBRRH,temp ldi r16, 1<<URSEL|1<<UCSZ0|1<<UCSZ1 out UCSRC,r16 in temp , UBRRH out POrtB,temp на светодиодах показывает 00000000(как и предполагалось) 3вариант ldi temp, 0 out UBRRH,temp ldi r16, 1<<URSEL|1<<UCSZ0|1<<UCSZ1 out UCSRC,r16 in temp , UCSRC out POrtB,temp на светодиодах показывает 00000000(вот здесь уже не то что предполагал) 4вариант ldi temp, 0 out UBRRH,temp ldi r16,1<<URSEL out UCSRC,r16 ldi r16, 1<<URSEL|1<<UCSZ0|1<<UCSZ1 out UCSRC,r16 in temp , UCSRC out POrtB,temp на светодиодах показывает 00000000 5вариант ldi temp, 0 out UBRRH,temp ldi r16,1<<URSEL out UCSRC,r16 ldi r16, 1<<UCSZ0|1<<UCSZ1 out UCSRC,r16 in temp , UCSRC out POrtB,temp на светодиодах показывает 00000110 (добились что надо, НО! если последние две строки заменяем на in temp , UBRRH out POrtB,temp получаем 00000110,то есть то же самое) Вывод: то что мы записываем в UCSRC, то же самое записывается в UBRRH ? получается бит URSELникак е влияет на запись регистров что ли? Цитата(kolobok0 @ Dec 21 2011, 15:11)  выводите в порт A или С (как пример) вывел порт С, та же ситуация! видимо что то другое..
|
|
|
|
|
Dec 22 2011, 12:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Здесь , где жолжна быть cliCODE Init:
cli
;++++++++++++++ Сдержимое файла INITCORE.INC +++++++++++++++++++++++++ ;==== Инициализация ядра: Память; Регистры; Стек ============= .include "INITCORE.inc" ;++++++++++++++ Конец Содержимого файла INITCORE.INC +++++++++++++++++
;======= Инициализация внутренних периферийных устройств:====== ldi temp , 0b11111111 ; определяем входы\выходы порта В, out DDRB , temp ; 1 делает вывод выходом, 0 - входом! ldi temp , 0b00000000 ; определяем в\в порта D out DDRD , temp
ldi temp , 0b11111111 ; включаем подтяжку (1) для входов порта В out portB , temp ; и задаем начальние состояния выходов ldi temp , 0b00000000 ; то же самое для D out portD , temp
ldi temp, 1<<RXEN|1<<RXCIE|1<<TXen ; разрешаем прием и прерывание по приему по UART out UCSRB, temp
;ldi temp, 1<<TXEN|1<<TXCIE ; разрешаем передачу и прерывание по передачи по UART ;out UCSRB, temp
ldi temp,25 ; задаем скорость UART = 9600 out UBRRL, temp ldi temp, 0 out UBRRH,temp
ldi r16, 1<<URSEL|1<<UCSZ0|1<<UCSZ1 ; 8-мибитный формат посылки out UCSRC,r16
in temp , UCSRC ;UBRRH; out POrtB,temp
sei
дальше там простто цикл: Start: nop rjmp Start
2. Прочтите регистры UBRRH и UCSRC после записи в них вот здесь не пойму как правильно прочитать: ведь эти два регистра с одним адресом памяти, и поэтому читаются странно, показываю все варианты как пробовал считывать: Код ldi r16, 1<<URSEL|1<<UCSZ0|1<<UCSZ1 out UCSRC,r16 in temp , UCSRC out PortB,temp ldi temp,25 ; UART = 9600 out UBRRL, temp ldi temp, 0 out UBRRH,temp in temp , UBRRH out PortB,temp Цитата in temp , UCSRC out POrtB,temp на светодиодах показывает 00000110 (добились что надо, НО! если последние две строки заменяем на in temp , UBRRH out POrtB,temp получаем 00000110,то есть то же самое) Вывод: то что мы записываем в UCSRC, то же самое записывается в UBRRH ? получается бит URSELникак е влияет на запись регистров что ли? Вы не изменили направление чтения , поэтому прочитался снова UCSRC
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Dec 23 2011, 07:06
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
Цитата(ILYAUL @ Dec 22 2011, 16:15)  2. Прочтите регистры UBRRH и UCSRC после записи в них вот здесь не пойму как правильно прочитать: ведь эти два регистра с одним адресом памяти, и поэтому читаются странно, показываю все варианты как пробовал считывать: Код ldi r16, 1<<URSEL|1<<UCSZ0|1<<UCSZ1 out UCSRC,r16 in temp , UCSRC out PortB,temp ldi temp,25; UART = 9600 out UBRRL, temp ldi temp, 0 out UBRRH,temp in temp , UBRRH out PortB,temp Вы не изменили направление чтения , поэтому прочитался снова UCSRC По очереди компилирую первое"out PortB,temp" и второе"out PortB,temp",то есть по этому коду сначала на портВ вывожу UCSRC показывает 00000000, потом реистр UBRRH тоже показывает 00000000 Как же все таки правильно их считать и увидеть что мы там записали? in temp , UBRRH in temp , UCSRC out PortB,temp Оказывается так надо считывать! в естеaееве написано на стр 488: " Для выбора регистра при чтении используется временная последова- тельность. При первом обращении по указанным адресам возвращается значение регистра UBRRH (UBRRHn). При повторном обращении по этим адресам в следующем такте возвращается значение регистра UCSRC (UCSRnC), как показано в приведенных ниже примерах. Прерывания при выполнении этой последовательности команд должны быть запре- щены." теперь отвечаю на ваш вопрос Цитата(ILYAUL @ Dec 20 2011, 22:51)  Прочтите регистры UBRRH и UCSRC после записи в них в UBRRH как и предполагалось 00000000 UCSRC = 10000110 Все вроде правильно?
|
|
|
|
|
Dec 23 2011, 08:30
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
Цитата(V_G @ Dec 23 2011, 11:14)  Фсе ниасилил, НО: Перед чтением UDR настоятельно рекомендуется считывать регистр статуса для сброса флагов ошибок. Заодно и ошибки приема проанализируйте. Повторяю, чтение статуса ДО чтения UDR обработчик сделал таким PriemZavershen: in r19,UCSRA in temp,UDR out PortB,r19 reti PortB показывает 11100000, то есть ошибок получается нет?
|
|
|
|
|
Dec 23 2011, 10:33
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
внутренний
|
|
|
|
|
Dec 23 2011, 12:48
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
Цитата(V_G @ Dec 23 2011, 15:39)  Если функции пинов порта B все на вывод и не переопределены для другой периферии, и если такая комбинация возникает сразу после отсылки байта из компьютера в атмегу, то ошибок приема получается нет. Вы до того светодиодики сбрасываете как-то? И данные-то из UDR куда выводите? данные из UDR вывожу так же на портВ, только уж вы не подумайте что совсем дурак  Когда проверял состояние регистра UCSRA, данные из UDR не куда не скидывал, так как не имею технической возможности одновременно посмотреть и данные и состояние регистра.
|
|
|
|
|
Dec 24 2011, 11:24
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
Цитата(V_G @ Dec 23 2011, 18:21)  Возможно, я неправильно сформулировал вопрос, перефразирую и разделю на 2: 1. Если предварительно сбросить все единицы в порту В, то при приеме ОДНОГО байта выставляется ли сразу единица, отвечающая за RXC? Сбросил в порту В все единицы clr temp out PortB, temp При приеме одного байта содержимое UCSRA = 10100000, то есть RXC = 1 Цитата(V_G @ Dec 23 2011, 18:21)  2. В программе с предварительным чтением статуса данные все равно принимаются с ошибками? Да, все равно байт приходит не верно: програмкой терминал 1.9 посылаю: $01 приходит 10000001 $02 приходит 10000010 ..... $82 приходит 11000010 вместо 10000010 $41 приходит 10100001 вместо 01000001
|
|
|
|
|
Dec 26 2011, 04:31
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
Цитата(V_G @ Dec 24 2011, 15:35)  1. А старший разряд в нуле когда-нибудь бывает? Может, снаружи где замыкание? Выведите напрямую 0 в проблемные разряды, посмотрите. Да конечно, когда пишешь clr temp out PortB,temp показываются все нули! Цитата(V_G @ Dec 24 2011, 15:35)  2. С блокировками все в порядке? не совсем понял про какие блокировки идет речь? Цитата(zombi @ Dec 24 2011, 18:50)  В работоспособности "терминал 1.9" и COM портa PC уверены? Саму терминалку менял , другие програмки ставил, так же с этой ошибкой принимает! так что думаю проблема не в ней! COM порт тоже работает так как посылаешь: clr temp out PortB,temp, показываются все нули ldi temp, 0b11111111 out PortB,temp // показываются все еденички!
|
|
|
|
|
Dec 27 2011, 19:07
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(slavik.ksu @ Dec 26 2011, 07:31)  Цитата(zombi @ Dec 24 2011, 17:50)  В работоспособности "терминал 1.9" и COM портa PC уверены?
Саму терминалку менял , другие програмки ставил, так же с этой ошибкой принимает! так что думаю проблема не в ней! COM порт тоже работает так как посылаешь: clr temp out PortB,temp, показываются все нули ldi temp, 0b11111111 out PortB,temp // показываются все еденички! Я про работоспособность ком порта не AVRa a Вашей PC (Personal Computer) спращивал.
|
|
|
|
|
Dec 28 2011, 07:51
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 15-12-11
Пользователь №: 68 876

|
Цитата(zombi @ Dec 27 2011, 23:07)  Я про работоспособность ком порта не AVRa a Вашей PC (Personal Computer) спращивал. Да работает исправно. Цитата(V_G @ Dec 26 2011, 16:17)  Блокировочные конденсаторы по питанию, номинал и расположение в соответствии с рекомендациями изготовителя
Ну, и верно, с кварцем неплохо бы для начала проверить. Внутренний генератор у этих процев не сильно точный я пользуюсь отладочной платой STK500, думаю там все по госту разведено. То есть мне надо внешний кварц поставить? я даже не наю где его взять? у нас в городе есть только одна точка по таким элементам, напишите пожалуйста точное название кварца, я спрошу имеется ли у него в продаже.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|