Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.73/75: Рейтинг темы: голосов - 75, средняя оценка - 4.73
trym
1

один МК и много вопросов.

26.12.2011, 13:43. Просмотров 13689. Ответов 36
Метки нет (Все метки)

Господа, нуждаюсь в помощи.
Чтобы сразу прояснить некоторые детали - я полный нуб.
хочу сделать себе подсветку в стол (с регулировкой яркости) с дополнительным управлением по юсб.
пытался разобраться с v-usb но ничо не вышло. как то не дорос ещё.
второй способ - usb->uart . его то я и выбрал. но кажется что до уарта я тоже не дорос.
по ходу создания у меня будут возникать много вопросов, но начинать я буду с уарта, потому что для начала в нём затык.
итак, сначала код, потом вопросы.
Код
.divice ATtiny2313
.include "tn2313def.yms"

.equ F_CPU = 8000000
.equ BAUDRATE = 256000
.equ BAUD_DIVIDER = F_CPU/(16*baudrate)-1

.equ LED_DDR = DDRD
.equ LED_PORT = PORTD
.equ LED_0 = 4
.equ LED_1 = 5

.cseg
.org 0x0000
RJMP Riset
.org 0x0007 ; USORT0, RX USORT0, Rx Complete
RJMP RX_sompete
.org 0x0008 ; USORT0, UDRE USORT0 Data Register Empty
RJMP UDR_Empty
.org 0x0009 ; USORT0, TX USORT0, Tx Complete
RJMP TX_somplete

RX_sompete:
LDI      R16, UDR
CPI      R20, 0
BREQ   LED1_on
CPI      R20, 1
BREQ   LED1_off

LED1_on:
LDI      R20, 1
LDI      R16, 1<<LED_1 | LED_PORT
OUT      LED_PORT, R16
RJMP   RX_end

LED1_off:
LDI      R20, 0
LDI      R16, 0<<LED_1 | LED_PORT
OUT      LED_PORT, R16
RX_end:
RETI

UDR_Empty:
RETI

TX_somplete:
RETI

Riset:
; init stack
LDI R16, low(ROMEND)
OUT SPL, R16
; USORT Init
;   LDI      R16, 0
;   OUT      UCSRA, R16  ; clear UCRSA

LDI      R16, 1<<RXCIE | 0<<TXCIE | 1<<RXEN | 1<<TXEN  ;enable interrupts omd receiver/transmitter
OUT      UCSRB, R16

LDI      R16, 1<<UMSEL | 1<<UCSZ0 | 1<<UCSZ1 ; sync, 8 data bits
OUT      UCSRC, R16

LDI      R16, low(BAUD_DIVIDER)
LDI      R17, high(BAUD_DIVIDER)
OUT      UBRRL, R16
OUT      UBRRH, R17

; Timer & PWM init
; in future....

; Pins init
LDI      R16,  1<<LED_0 | 1<<LED_1
OUT      LED_DDR, R16
LDI      R16, 1<<LED_0
OUT      LED_PORT, R16

; USORT flag
LDI      R20, 0
LDI      R21, 5 ;test send byte

; Enable Ymtirrupts
SEI
Main:
/*   sbis   UCSRA, UDRE ;Ожидание, пока буфер передачи очистися
rjmp   Main
OUT      UDR, R21*/
RJMP   Main
чего я пытаюсь добиться от вышеприведённого кода? есть тини2313, к ней подключено два светодиода. один горит постоянно. второй должен делать вкл/выкл по приходу любого байта по уарту. это конечно тупо, но надо ж с чего то начинать...
приём байта не вызывает прерывания (возможно). бесконечная передача байта (в приведённо примере закомменчено) ничего не передаёт.
программатор и usb->uart у меня вот это: http://iosyitistromyss.ru/skorostnoj-av ... llera.html
теперь вопросы:
1. где я пропустил самое важное от чего оно не работает?
2. как проверять больше чем 1 байт?
3. как правильно отправлять больше чем 1 байт?
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2011, 13:43
Ответы с готовыми решениями:

Хочу один системник и много-много мониторов+клавиатур+мышей. Как?
Вопрос: как реализовать возможность одновременной работы на одном системнике нескольким людям...

Много вопросов..
Всем привет! Сразу оговорюсь, Лотусом занимаюсь всего неделю, но требований уже очень много, итак.....

Много вопросов
Приветсвую всех. В-общем, балуюсь сайтами в качестве хобби, а так работаю и учусь совсем в...

Много вопросов
Здравствуйте, доброго времени суток! Как бы я литературу читал, и так, и у вас на форуме, SEO...

36
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
26.12.2011, 13:47 2
всё не проверял, но сразу замечания - в прерываниях надо флаги сохранять в начале, а потом востанавливать на выходе из прерывания

группы байтов получают-отправляют в циклах. Строят очередь из байтов, а потом по одному отправляют-принимают

полезно почитать тут
http://iosyitistromyss.ru/avr-uchebnyj- ... -uart.html
http://rodyoelektr.ru/rabota-s-interfey ... lerah-avr/

а можно набрать в гугле "работа с uart avr" - куча ссылок будет
0
0 / 0 / 0
Регистрация: 12.06.2011
Сообщений: 74
26.12.2011, 13:59 3
> LDI R16, UDR
разве так можно из регистра считывать? Лучше: IN R16,UDR
А, ну судя по алгоритму, это не существенно.
И, кстати, скорость передачи уж слишком большая.
0
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 58
26.12.2011, 14:16 4
по моему такой код не будет работать
LED1_on:
...
LDI R16, 1<<LED_1 | LED_PORT
...
LED1_off:
...
LDI R16, 0<<LED_1 | LED_PORT
...

если в LED_1 стоит единица, то выключить таким макаром ее не удастся
Можно например так
LDI R16, LED_PORT
ANDI R16,~(1<<LED_1)
0
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
26.12.2011, 14:36 5
Для включения/выключения лучше пользоваться такими конструкциями:
SBI LED_PORT, LED_1 ; включить
СBI LED_PORT, LED_1 ; выключить

Или наоборот, в зависимости от схемы включения светодиодов.
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
26.12.2011, 15:37 6
Цитата Сообщение от trym
Код:
.divice ATtiny2313
.include "tn2313def.yms"

.equ F_CPU = 8000000
.equ BAUDRATE = 256000
.equ BAUD_DIVIDER = F_CPU/(16*baudrate)-1

Даже когда исправите все синтаксические и логические косяки, соотношение частоты кварца и скорости передачи не дадут принять/передать данные без ошибок. Отклонение скорости не должно превышать 0.5%. Если применить кварц 4096кГц, при UBRR=0 можно будет работать.
0
trym
26.12.2011, 15:51 7
Johmmy0007, спасибо за ссылки

tyzord66, я пробовал по разному вписывать скорость. и через такое вот вычисление, и напряму вписывал нужную циферку в UBRR которую брал с даташита. разные скорости, разные способы задания скорости. и всё никак.
частота МК задаётся от внутреннего генератора, а не от внешнего. деление на 8 убрано фьюзами.
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
26.12.2011, 16:03 8
Для начала без UARTа проверь, всё ли работает. Пропиши, чтобы светодиоды включились и программа зациклились - посмотри. Потом наоборот. Потом с UARTом разбирайся.

Скорость поставь 9600, и то от внутреннего может ошибки сыпать, но факт приёма должен быть по идее.
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
26.12.2011, 17:10 9
Цитата Сообщение от trym
tyzord66, я пробовал по разному вписывать скорость. и через такое вот вычисление, и напряму вписывал нужную циферку в UBRR которую брал с даташита. разные скорости, разные способы задания скорости. и всё никак.
С внутренним генератором иначе и быть не может, разве что на самых низких скоростях. Цитата из Евстифеева: - "отклонение скорости не должно превышать 0.5%".
0
trym
26.12.2011, 17:22 10
ptoop, без уарта всё работает. диоды загораются, моргают если какую то ручную задержку вставить и на вид вроде всё красиво. это у меня было первым шагом сделано чтобы подтвердить что МК рабочий.
скорость ставил разную, в том числе и 9600.

tyzord66, судя по даташиту на 9600 ошибок 0,2%, на 256000 - 0%. со скоростями я наигрался как только мог.
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
26.12.2011, 20:40 11
Цитата Сообщение от trym
на 256000 - 0%
Хмм... у меня получается 2.4% :)
0
trym
26.12.2011, 20:44 12
tyzord66, число 0% взято с даташита.
как получилось 2,4% ?
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
26.12.2011, 20:56 13
Цитата Сообщение от trym
tyzord66, число 0% взято с даташита.
как получилось 2,4% ?
BAUD=Fck/16(UBRR+1) С Fck=8МГц ближайшее подходящее значение UBRR=1, получаем BAUD=250000. Ну как может быть 0%, если Fck/BAUD(256000) получается, что в UBRR надо дробное число положить?
0
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
26.12.2011, 21:06 14
В терминале ставьте 250000, тогда рассогласования не будет
0
trym
26.12.2011, 23:10 15
вот вернулся с работы теперь могу тестить.
опустил скорость до 9600. исправил недочёты с "IN R16, UDR" и "CBI/SBI LED_PORT, LED_1"
включил TXEN и включил бесконечный посыл байта в комп.
подключился терминалом и... тишина..
когда пытаюсь засылать байты туда - в ответ приходит какая то ерунда (почему оно вообще приходит в ответ???) - первый раз 1D и потом каждый раз 3D
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
26.12.2011, 23:31 16
Пробуйте отключить приём. сделайте выдачу на тх нескольких одинаковых байтов в главном цикле. прерывания отключите пока. Приведите исправленный исходник. Может вы не дожидаетесь при отправке передачи текущего байта? флаги готовности передатчика проверяете?
0
trym
26.12.2011, 23:51 17
вот исправленный код
Код
 .divice ATtiny2313
.include "tn2313def.yms"

.equ F_CPU = 8000000
.equ BAUD = 9600
.equ BAUD_DIVIDER = F_CPU/(16*BAUD)-1

.equ LED_DDR = DDRD
.equ LED_PORT = PORTD
.equ LED_0 = 4
.equ LED_1 = 5

.cseg
.org 0x0000
RJMP Riset
.org 0x0007 ; USORT0, RX USORT0, Rx Complete
RJMP RX_sompete
.org 0x0008 ; USORT0, UDRE USORT0 Data Register Empty
RJMP UDR_Empty
.org 0x0009 ; USORT0, TX USORT0, Tx Complete
RJMP TX_somplete

Riset:
; init stack
LDI R16, low(ROMEND)
OUT SPL, R16
; USORT Init
LDI      R16, 0
OUT      UCSRA, R16  ; clear UCRSA

LDI      R16, 0<<RXCIE | 0<<TXCIE | 0<<RXEN | 1<<TXEN  ;enable interrupts omd receiver/transmitter
OUT      UCSRB, R16

LDI      R16, 1<<UMSEL | 1<<UCSZ0 | 1<<UCSZ1
OUT      UCSRC, R16

LDI      R16, low(BAUD_DIVIDER)
LDI      R17, high(BAUD_DIVIDER)
OUT      UBRRL, R16
OUT      UBRRH, R17

; Timer & PWM init

; Pins init
LDI      R16,  1<<LED_0 | 1<<LED_1
OUT      LED_DDR, R16
SBI      LED_PORT, LED_0

; USORT flag
;   LDI      R20, 0
LDI      R21, 5 ;test send byte

; Enable Ymtirrupts
SEI
Main:
SBIS   UCSRA, UDRE
RJMP   Main
OUT      UDR, R21
RJMP   Main

RX_sompete:
IN      R16, UDR
CPI      R20, 0
BREQ   LED1_on
CPI      R20, 1
BREQ   LED1_off

LED1_on:
LDI      R20, 1
SBI      LED_PORT, LED_1
RJMP   RX_end

LED1_off:
LDI      R20, 0
CBI      LED_PORT, LED_1
RX_end:
RETI

UDR_Empty:
RETI

TX_somplete:
RETI
ещё обнаружил что если подёргать проводочек которым подключен уарт то в комп приходят нолики (0х00) но не очень быстро.
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
27.12.2011, 00:02 18
Может у тя просто что-то не контачит или замыкает?
0
trym
27.12.2011, 00:58 19
перепроверил. пересобрал всё на макетке. поменял все проводочки. проверил как работает ft232r (посадил перемычку на rx-tx, потом замкнул проводочки которые идут к макетке) - нормально работает.
взял ещё одну 2313 на случай если первая покорёженная - не помогло.
чудес не бывает, и проблема явно существует. но я не могу определить где(
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
27.12.2011, 01:05 20
Вот тебе рабочая инициализация уарта. Кстати, бит CKDIV8 не выключал в фузах? Если фузы не трогал, то тактовая частота у тебя не та, что ты думаешь, а ниже в восемь раз.
Код
;=========== UART INIT =======================================================================                                             ; тут идет инициализация УАРТа
.equ XTAL = 8000000                        ; частота процессора. Вроде бы в меге по дефолту 8мгц. Если вдруг не заработает попробуй поставить 4мгц
.equ baudrate = 4800                     ; уарт будет работать на 9600 бод.
.equ bauddivider = XTAL/(16*baudrate)-1         ; тут просто вычисляем необходимую задержку для таймера.

OUTI UBRRL, low(bauddivider)                ; и загружаем ее в регистры уарта вначале младший байт
OUTI UBRRH, high(bauddivider)                ; потом старший байт
OUTI UCSRA, 0                            ; выставляем режим асинхронной приемопередачи, с обычной (не двойной) скоростью.
OUTI UCSRC, 3<<UCSZ0                      ; настраиваем протокол на стандартный. 8 бит, один старт и стоп биты.
OUTI UCSRB, 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE    ; разрешаем прием и передачу
; возврат туда откуда вызвали
; Возврат обратно.

; Разрешаем прерывания

OUTI   TCNT0,0            ; Загружаем в таймер 0 начальное значение
OUTI   TIMSK,1<<TOIE0      ; Разрешаем прерывание по переполнению Т0
Ну и макрос
Код
         .MACRO OUTI                  ; Это описание макроса. Везде где outi встретится в коде, то заменяется на
LDI    R16,@1                ; этот кусок кода, причем @0,@1 это параметры, они заменятся введенными параметрами
OUT    @0,R16                ; макроса. Динный макрос тупо копирует введенное число сначала в регистр R16, а из него
.ENDMACRO
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2011, 01:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Много вопросов
Вопрос 1: Есть ли в SQL такое понятие как, определение имен таблиц. Типа есть БД и в ней нужно...

Много вопросов
ребят подскажите как зделать Panel прозрачной а текст который в ней есть осталься видимым

Много вопросов по WinAPI
Подскажите, пожалуйста 1) Какие нужно задать стили дочернему окну, чтобы оно не было тусклым как...

Много вопросов по stm32
Добрый день, есть задача оцифровки сигнала и дальнейшее его Фурье преобразование, все это на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.