реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Проблема с UART в atmega128
Whosthere
сообщение Dec 6 2011, 07:04
Сообщение #1





Группа: Новичок
Сообщений: 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. Стоп-бит использую один.

Буду благодарен за любые идеи. Заранее спасибо.

Go to the top of the page
 
+Quote Post
Whosthere
сообщение Dec 6 2011, 08:11
Сообщение #2





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



Микроконтроллер установлен на плате savvy128

Принципиальная схема


Программирую через AVR Dragon

Сообщение отредактировал Whosthere - Dec 6 2011, 08:12
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 6 2011, 09:40
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Whosthere @ Dec 6 2011, 11:04) *
Буду благодарен за любые идеи.

При работе с этим МК - типичная ошибка: не снят fuse M103C. C завода этот fuse приходит запрограммированным, необходимо его (fuse) снять!
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 6 2011, 11:05
Сообщение #4


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Палыч @ Dec 6 2011, 13:40) *
...C завода этот fuse приходит запрограммированным, необходимо его (fuse) снять!


точно так же как и делитель на 8.
короче говоря - fuse в студию

(круглый)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 6 2011, 11:14
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(kolobok0 @ Dec 6 2011, 15:05) *
точно так же как и делитель на 8.

Только делитель на 8 в этом МК (ATmega128) отсутствует, это для других типов AVR. А то, ТС будет его тщетно искать...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Dec 6 2011, 16:12
Сообщение #6


Профессионал
*****

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



Код
ldi r16, 18; устанавливаем режим приема

Когда разберётесь с fuse 103C , разберитесь и с - зачем Вы пишите 1 в бит который предназначен для приема 9 бита и записать в него невозможно


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Whosthere
сообщение Dec 7 2011, 17:46
Сообщение #7





Группа: Новичок
Сообщений: 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битной последовательности (со стоп и старт битами) с единицей в любом из битов.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 7 2011, 18:33
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Флаг RXC кто сбрасывать будет ?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Dec 7 2011, 19:26
Сообщение #9


Профессионал
*****

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



Код , плиз , приведите конечный


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 7 2011, 19:48
Сообщение #10


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 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 битного регистра скорости!!!

удачи вам
(круглый)
Go to the top of the page
 
+Quote Post
Whosthere
сообщение Dec 8 2011, 13:54
Сообщение #11





Группа: Новичок
Сообщений: 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.

Как только меня бдет возможность проверить правильность работы конечного варианта, обязательно отпишусь о наличии ошибки.
Go to the top of the page
 
+Quote Post
Whosthere
сообщение Dec 13 2011, 07:17
Сообщение #12





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



Увы,проблема не решилась, но я заметил очень странную вещь. Если при пустом UDR выполнить команду in r15,UDR0, то МК запишет в r15 значение FF, а не 00. Возможно я чего-то не понимаю. А также, поставив брейкпойнт на строчку in r15, UDR0, я заметил вот что. При пересылке с компьютера последовательности битов микроконтроллер "наступал" на брейкпоинт, но UDR всё равно оставался пустым вне зависимости от того, что я ему передавал.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 13 2011, 07:50
Сообщение #13


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Whosthere @ Dec 13 2011, 11:17) *
Увы,проблема не решилась...


дык блин. Вы даташиты не читаете принципиально. Что вы хотите то?
регистры

UCSRnB
UCSRnC

опять странно инициализорованы.
Вы напишите, что Вы там хотите вкл/выкл?
А то смотришь в ваш код и в даташит - понимаешь что вы ленитесь. Ну и нафига вам помогать?

(круглый)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 13 2011, 08:13
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Whosthere @ Dec 13 2011, 11:17) *
При пересылке с компьютера последовательности битов микроконтроллер "наступал" на брейкпоинт, но UDR всё равно оставался пустым вне зависимости от того, что я ему передавал.

Надеюсь, что "снимали" с Breakpoint до того, как ничинали передавать очередной байт.
Хорошо бы при останове, перед чтением UDR посмотреть регистр UCSRnA и огласить результат.
Go to the top of the page
 
+Quote Post
Whosthere
сообщение Dec 13 2011, 10:39
Сообщение #15





Группа: Новичок
Сообщений: 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.

Я нашел источник проблемы. Суть в том, что я глуп. Посмотрев во фьюзах откуда тактируется МК, я неожиданно понял, что настроен он не верно. Простите за ввод вас в заблуждение. Спасибо всем за помощь
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 14 2011, 11:04
Сообщение #16


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 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бит?

(круглый)
Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 15 2011, 12:22
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 16 2011, 07:57
Сообщение #18


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(slavik.ksu @ Dec 15 2011, 16:22) *
...но на PB4 и PB7 всегда лог.1...


очень смахивает на конфликт с настройками.
1) посмотрите фуз бит SPIEN отключен SPI?
2) попробуйте вывести в другой порт и посчупать осцилом.


(круглый)
Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 19 2011, 06:53
Сообщение #19


Участник
*

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



Цитата(kolobok0 @ Dec 16 2011, 11:57) *
очень смахивает на конфликт с настройками.
1) посмотрите фуз бит SPIEN отключен SPI?
2) попробуйте вывести в другой порт и посчупать осцилом.

пробовал на порта А подключать, та же ситуация.
Fuse вкладка выглядит так:
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 19 2011, 11:17
Сообщение #20


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(slavik.ksu @ Dec 19 2011, 10:53) *
пробовал на порта А подключать, та же ситуация....


программку всю.
инициализация порта со стороны форточек правильная(скорость, чётность и т.п.)?

(круглый)
Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 19 2011, 18:00
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 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 +++++++++++++++++
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Dec 19 2011, 18:21
Сообщение #22


Профессионал
*****

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



Частота проца , что 4 мгц?



--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 19 2011, 18:43
Сообщение #23


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(slavik.ksu @ Dec 19 2011, 22:00) *
ldi temp,25 ; задаем скорость UART = 9600
out UBRRL, temp



тут уже прозвучал вопрос про частоту МК. С какой тактовой частотой работает камень?
ну и не вижу инициализацию верхней половинки регистра UBRR. они 12 разрядные усе...


Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 20 2011, 14:12
Сообщение #24


Участник
*

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



Да, МК работает на 4МГц.
Добавил инициализацию верхней половинки регистра UBRR
ldi temp, 0
out UBRRH,temp
работает также с ошибкой.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Dec 20 2011, 18:51
Сообщение #25


Профессионал
*****

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



Цитата(slavik.ksu @ Dec 20 2011, 18:12) *
Да, МК работает на 4МГц.
Добавил инициализацию верхней половинки регистра UBRR
ldi temp, 0
out UBRRH,temp
работает также с ошибкой.


1. После Init: поставьте cli

2. Прочтите регистры UBRRH и UCSRC после записи в них


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 21 2011, 11:11
Сообщение #26


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 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 или С (как пример)

(круглый)

Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 22 2011, 05:57
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 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 или С (как пример)


вывел порт С, та же ситуация! видимо что то другое..
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Dec 22 2011, 12:15
Сообщение #28


Профессионал
*****

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



Здесь , где жолжна быть cli
CODE
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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 23 2011, 07:06
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 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
Все вроде правильно?
Go to the top of the page
 
+Quote Post
V_G
сообщение Dec 23 2011, 07:14
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Фсе ниасилил, НО:
Перед чтением UDR настоятельно рекомендуется считывать регистр статуса для сброса флагов ошибок. Заодно и ошибки приема проанализируйте. Повторяю, чтение статуса ДО чтения UDR
Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 23 2011, 08:30
Сообщение #31


Участник
*

Группа: Участник
Сообщений: 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, то есть ошибок получается нет?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Dec 23 2011, 10:21
Сообщение #32


Профессионал
*****

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



И уточните ещё , 4 мгц - внешний или внутренний


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 23 2011, 10:33
Сообщение #33


Участник
*

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



внутренний
Go to the top of the page
 
+Quote Post
V_G
сообщение Dec 23 2011, 11:39
Сообщение #34


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(slavik.ksu @ Dec 23 2011, 18:30) *
PortB показывает 11100000, то есть ошибок получается нет?

Если функции пинов порта B все на вывод и не переопределены для другой периферии, и если такая комбинация возникает сразу после отсылки байта из компьютера в атмегу, то ошибок приема получается нет. Вы до того светодиодики сбрасываете как-то?
И данные-то из UDR куда выводите?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Dec 23 2011, 12:39
Сообщение #35


Профессионал
*****

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



Цитата(slavik.ksu @ Dec 23 2011, 14:33) *
внутренний


Возможно в этом все и проблемы, ни есть какое хорошее решение для USART, поиграйтесь подстроечным регистром Oscillator Calibration Register – OSCCAL



--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 23 2011, 12:48
Сообщение #36


Участник
*

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



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

данные из UDR вывожу так же на портВ, только уж вы не подумайте что совсем дурак sm.gif Когда проверял состояние регистра UCSRA, данные из UDR не куда не скидывал, так как не имею технической возможности одновременно посмотреть и данные и состояние регистра.
Go to the top of the page
 
+Quote Post
V_G
сообщение Dec 23 2011, 14:21
Сообщение #37


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Возможно, я неправильно сформулировал вопрос, перефразирую и разделю на 2:
1. Если предварительно сбросить все единицы в порту В, то при приеме ОДНОГО байта выставляется ли сразу единица, отвечающая за RXC?
2. В программе с предварительным чтением статуса данные все равно принимаются с ошибками?

Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 24 2011, 11:24
Сообщение #38


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
V_G
сообщение Dec 24 2011, 11:35
Сообщение #39


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



1. А старший разряд в нуле когда-нибудь бывает? Может, снаружи где замыкание? Выведите напрямую 0 в проблемные разряды, посмотрите.
2. С блокировками все в порядке?
Go to the top of the page
 
+Quote Post
zombi
сообщение Dec 24 2011, 14:50
Сообщение #40


Гуру
******

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



Цитата(slavik.ksu @ Dec 24 2011, 14:24) *
$01 приходит 10000001
$02 приходит 10000010
.....
$82 приходит 11000010 вместо 10000010
$41 приходит 10100001 вместо 01000001


В работоспособности "терминал 1.9" и COM портa PC уверены?
Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 26 2011, 04:31
Сообщение #41


Участник
*

Группа: Участник
Сообщений: 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 // показываются все еденички!
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Dec 26 2011, 10:11
Сообщение #42


Профессионал
*****

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



Поставьте кварц из перечисленных в таблице , "заточенных" под USART и проверьте


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
V_G
сообщение Dec 26 2011, 12:17
Сообщение #43


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(slavik.ksu @ Dec 26 2011, 14:31) *
не совсем понял про какие блокировки идет речь?

Блокировочные конденсаторы по питанию, номинал и расположение в соответствии с рекомендациями изготовителя

Ну, и верно, с кварцем неплохо бы для начала проверить. Внутренний генератор у этих процев не сильно точный
Go to the top of the page
 
+Quote Post
zombi
сообщение Dec 27 2011, 19:07
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 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) спращивал.
Go to the top of the page
 
+Quote Post
slavik.ksu
сообщение Dec 28 2011, 07:51
Сообщение #45


Участник
*

Группа: Участник
Сообщений: 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, думаю там все по госту разведено.
То есть мне надо внешний кварц поставить? я даже не наю где его взять? у нас в городе есть только одна точка по таким элементам, напишите пожалуйста точное название кварца, я спрошу имеется ли у него в продаже.
Go to the top of the page
 
+Quote Post
V_G
сообщение Dec 28 2011, 10:30
Сообщение #46


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Так и называется, кварц (или кварцевый резонатор, не путать с генератором!) на 4 МГц. Самый распространенный корпус HC/49U, некоторые так и кварц называют. Стоить должен 10-20 руб.
Вот ссылка с картинкой: http://www.platan.ru/cgi-bin/qwery.pl/id=4...amp;group=10801


Сообщение отредактировал V_G - Dec 28 2011, 10:33
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 12:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01996 секунд с 7
ELECTRONIX ©2004-2016