Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR и ПК
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
dim_OK
состыкавал плату с МК и MAX232 с ПК по COM-порту написал прогу на ассемблере. Отправляю с компа утилитой COMPortToolKit определённое число, МК его принимает и тут же отправляет обратно. Этой же утилитой можно смотреть что пришло в порт. А приходит ноль, причём независимо от того какое число отправлял. Прогу писал без всяких протоколов.
Подскажите от чего такое может быть и в каком направлении надо думать.
help.gif help.gif help.gif
Kuzmi4
2 dim_OK - чтобы было проще и вам и нам не моглы бы вы привести листинг этой злополучной проги??
Igor26
Цитата
и тут же отправляет обратно

...с этого момента подробней пожалуйста. Я зачастую тоже пользуюсь этой утилитой и подобных вещей не наблюдал. Такое было, когда не совпадали скорости приёма/передачи.

OFF P.S. Котейка все ноги искорябал!!! Так ему и хочется на клавиатуру запрыгнуть!
bodja74
Думаю лучше начать с того ,чтобы МК вообще что нибудь отправлял на комп например при включении питания МК,так легче определить несовпадение скоростей.
GDaniloff
ничего не имею против max232, но можно обойтись и без него - см. app.note avr910 smile.gif
Волощенко
Цитата(dim_OK @ Mar 12 2007, 20:20) *
... А приходит ноль, причём независимо от того какое число отправлял...
....в каком направлении надо думать.

Какая задана скорость UART и правильно ли она задана.
Часто ошибки возникают в загрузке регистров UBRRH и UBRRL (задают скорость обмена). Надо помнить, что UBRRH и UCSRC (регистр управления и статуса) имеют общий адрес, а разделение выполняется битом URSEL.
Возможно по этому приходят нули, так как реально, из-за ошибки в обращении к UBRRH и UCSRC, задана очень низкая скорость.
dim_OK
Вот она! Причём если задан правильный делитель, т. е. скорости в ToolKit и МК заданы одинаковые то ToolKit отправляет и ничего не принемает. Если же установить делитель 1 и скорость 1200 в ToolKit, то ToolKit отправляет определённое число, а принимает ноль. При делителе 51 скорость равна 4800, для кварца на 4МГц.
;ИНИЦИАЛИЗАЦИЯ
ldi r16,51
out UBRRH, r16
ldi r16, (1<<URSEL)|(0<<USBS)|(3<<UCSZ0);Set frame format: 8data, 1stop bit
out UCSRC,r16
ldi r16, (1<<RXEN)|(1<<TXEN) ;Enable Receiver and Transmitter
out UCSRB,r16
;*************************
LOOP:
rcall WAIT_small ;это
sbi portb,pb3 ;типа
rcall WAIT_small ;светодиод
cbi portb,pb3 ;моргает

sbi UCSRA,TXC
rec: sbis UCSRA,RXC
rjmp rec
rcall RECIVE
rcall TRANSMIT
sbic UCSRA,TXC
rjmp IND1
rjmp LOOP

IND1:
ldi r26,cod_2
out porta,r26
sbi portb,pb0
sbi portb,pb1
rjmp LOOP

;****************
RECIVE:
clr r18
in r18,UDR

sbic UCSRA,RXC
rjmp RECIVE
ret
;***************
TRANSMIT:
out UDR,r18
ret
;***************
Волощенко
Цитата(dim_OK @ Mar 13 2007, 12:10) *
ldi r16,51
out UBRRH, r16
Здесь надо записывать код 51 в UBRRL, а в UBRRH записать код нуля.

На С это выглядит так (xtal,baud это константы):
void init_uart(void)
{UBRRH = (byte)((xtal/16/baud-1)>>8); //Set baud rate for UART
UBRRL = (byte)(xtal/16/baud-1);
UCSRB=((1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN)); //Enable RX & TX (RXEN,TXEN)
//and interrupt (RXCIE,TXCIE)
UCSRC=(1<<URSEL)|(1<<USBS)|(3<<UCSZ0);}//Frame format: 2stop bit, 8data (Select 1<<URSEL)
Kuzmi4
Тут нуна действительно посмотреть на инициализацию усарта..
код нуля в принципе писать не обязательно но желательно(хотя если он стартует с ресета - то там точно нули).
на асме вот листинг с утра компилил - дЫвайс отзывается smile.gif
@00000438: USART_INIT
1805: {
+00000438: 921000C1 STS 0x00C1,R1 Store direct to data space
1811: UCSR0A = 0x00;
+0000043A: 921000C0 STS 0x00C0,R1 Store direct to data space
1812: UCSR0C = 0x06;
+0000043C: E086 LDI R24,0x06 Load immediate
+0000043D: 938000C2 STS 0x00C2,R24 Store direct to data space
1814: UBRR0L = EEPROM_DATA._def_UBRR0L; //set baud rate lo --------- тут конечно своё..
+0000043F: 9180036F LDS R24,0x036F Load direct from data space
+00000441: 938000C4 STS 0x00C4,R24 Store direct to data space
1815: UBRR0H = EEPROM_DATA._def_UBRR0H; //set baud rate hi --------- тут конечно своё..
+00000443: 91800370 LDS R24,0x0370 Load direct from data space
+00000445: 938000C5 STS 0x00C5,R24 Store direct to data space
1819: UCSR0B = 0x98;
+00000447: E988 LDI R24,0x98 Load immediate
+00000448: 938000C1 STS 0x00C1,R24 Store direct to data space
+0000044A: 9508 RET


вот....

Сделайте в программе так - проинициализируйте усарт, отправте символ, если получите - тогда надо двигаться далее...
Dopler
Было бы еще неплохо знать, что за МК, так как у разных МК регистры USART могут выпадать из IO области. Вот код инициализации на передачу для меги8, дальше, как уже советовали, в цикле передавайте байт и смотрите на ПК.

Код
    clr        zero

;инициализация UARTa
    ldi     tmp,    3    ; скорость 115200 для кварца 7.3728 мегагерц

    out     UBRRH, zero
    out     UBRRL, tmp

    ldi     tmp,    (1<<TXEN)    ; разрешена передача
    out     UCSRB,    tmp
    ldi     tmp,    (1<<URSEL)|(3<<UCSZ0); 8data, 1stopbit
    out     UCSRC,    tmp


;передаем данные в компьютер
SendLoop:
    sbis    UCSRA,    UDRE
    rjmp    SendLoop
    
    ldi     tmp,    0x85        
    out    udr,    tmp
rjmp    SendLoop
dim_OK
Да придётся Си изучать ибо я в нём не силён. Ну а я сделал как писалось в последнем сообщении

clr zero
out UBRRH,zero
ldi r16,6
out UBRRL, r16
ldi r16, (1<<URSEL)|(0<<USBS)|(3<<UCSZ0);Set frame format: 8data, 1stop bit
out UCSRC,r16
ldi r16, (1<<RXEN)|(1<<TXEN) ;Enable Receiver and Transmitter
out UCSRB,r16

Но чё то не очень заработало, т. е. я ToolKit'ом отправляю, МК принимает но посылает обратно всё равно нули. Хотя скорости теперь в МК и ToolKit совпадают 115200.
Kuzmi4
2 dim_OK - всё же советую вам всё таки построить программу так - мк стартует инициализирует усарт а потом по циклу отсылает байт...
ну а если уж очень хочется по своему методу - то хоть сделайте в программе проверку что вы приняли то что отправили....
вот вам ещё пример сгенерённый ЦВ для инициализации - не может оно не работать -
//При кристалле 7.372800
//
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART0 Mode: Asynchronous
// USART Baud rate: 9600
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x2F;
dim_OK
Ага, а что значит сделать проверку. Вот этого честно скажу я не понимаю. Что надо сделать с принятой инфой конкретно? Я ведь пишу прогу без всяких протоколов. Делаю это в AVRStudio и так как написано в последнем примере вижу первый раз. Не могли бы вы прокоментировать его.
Dopler
Цитата(dim_OK @ Mar 13 2007, 21:51) *
Ага, а что значит сделать проверку. Вот этого честно скажу я не понимаю. Что надо сделать с принятой инфой конкретно? Я ведь пишу прогу без всяких протоколов. Делаю это в AVRStudio и так как написано в последнем примере вижу первый раз. Не могли бы вы прокоментировать его.


Вам надо просто написать здесь, какой у вас контроллер и кварц на нем, а я вам дам листинг готового примера (как я приводил выше, но полностью готовый), вы его откомпилируете, зашьете в контроллер и увидите работоспособность железа (или не увидите). А дальше делайте с ним, что хотите.
dim_OK
[/quote]
Вам надо просто написать здесь, какой у вас контроллер и кварц на нем, а я вам дам листинг готового примера (как я приводил выше, но полностью готовый), вы его откомпилируете, зашьете в контроллер и увидите работоспособность железа (или не увидите). А дальше делайте с ним, что хотите.
[/quote]

Спасибо огромное. Кварц на 12МГц на контроллере ATMega8535.
GDI
Есть такая программа, называется AvrCalc.exe(прикрепить что то не удается - гугль в помощь) так вот, согласно этой программы при кварце 12МГц и скорости 115200 получается ошибка установки скорости 7.84% при том что даташит рекомендует иметь 0,5%, а при больших говорит, что возрастет влияние помех. А при таких ошибках и не будет никогда работать нормально. Для использования УАРТа, особенно на высоких скоростях используют специальные кварцы: 7.3728МГц, 11.0592МГц, 14.7456МГц и другие, в даташите есть раздел Examples of Baud Rate Setting - там указаны некоторые частоты кварцев и ошибки, которые с ними получаются на разных скоростях.
dim_OK
Цитата(GDI @ Mar 14 2007, 12:22) *
Есть такая программа, называется AvrCalc.exe(прикрепить что то не удается - гугль в помощь) так вот, согласно этой программы при кварце 12МГц и скорости 115200 получается ошибка установки скорости 7.84% при том что даташит рекомендует иметь 0,5%, а при больших говорит, что возрастет влияние помех. А при таких ошибках и не будет никогда работать нормально. Для использования УАРТа, особенно на высоких скоростях используют специальные кварцы: 7.3728МГц, 11.0592МГц, 14.7456МГц и другие, в даташите есть раздел Examples of Baud Rate Setting - там указаны некоторые частоты кварцев и ошибки, которые с ними получаются на разных скоростях.

Спасибо полезная инфа, в книжках про такой кварц ни чего не сказано.
Dopler
Как и обещал, готовый проект в прикрепленном файле. 12 МГц - не очень удачная частота для UART, кстати, вы уверены, что работаете от кварца а не от внутреннего генератора? Для работы примера, вам надо установить fuse биты так, чтобы работа шла от внутреннего генератора 1 МГц, причем эта частота в кристале выставлена по умолчанию (т.е. если в fuse битах вы ничего не меняли, то и не надо этого делать). Программа инициализирует UART на скорость 2400, и в цикле непрерывно шлет данные.
Сергей Борщ
Цитата(GDI @ Mar 14 2007, 11:22) *
Есть такая программа, называется AvrCalc.exe(прикрепить что то не удается - гугль в помощь) так вот, согласно этой программы при кварце 12МГц и скорости 115200 получается ошибка установки скорости 7.84%
Мама! Откуда столько?
int(12000000/8/115200) = 13.
12000000/8/13 = 115384.
(115384 - 115200)/115200 * 100 = 0.16%

Выкиньте такую программу, считайте сами.
GDI
Цитата
Мама! Откуда столько?
int(12000000/8/115200) = 13.
12000000/8/13 = 115384.
(115384 - 115200)/115200 * 100 = 0.16%

Выкиньте такую программу, считайте сами.

Да уж... smile.gif Но я все равно ставлю 11,0592 или 14,7456 если работаю с УАРТом.
dim_OK
Цитата(Dopler @ Mar 15 2007, 10:25) *
Как и обещал, готовый проект в прикрепленном файле. 12 МГц - не очень удачная частота для UART, кстати, вы уверены, что работаете от кварца а не от внутреннего генератора? Для работы примера, вам надо установить fuse биты так, чтобы работа шла от внутреннего генератора 1 МГц, причем эта частота в кристале выставлена по умолчанию (т.е. если в fuse битах вы ничего не меняли, то и не надо этого делать). Программа инициализирует UART на скорость 2400, и в цикле непрерывно шлет данные.


Спасибо огромное, работает. Но что же получается усарт работает не от кварца, а от внутреннего генератора. Я то думал наооборот, и расчитывал делители для 12 МГц. И теперь если я захочу поменять скорость передачи\приёма то надо будет расчитывать делитель для 1 МГц а не для 12?
GDI
УСАРТ работает от того генератора что вы выберите, просто по-умолчанию новые кристаллы работают от встроенного RC генератора на 1МГц, а для того чтобы переключится на другой генератор(RC генератор на 2, 4 или 8МГц или внешний кварц) - надо фьюзы прошить согласно даташиту.
Dopler
На этом этапе я рекомендовал бы вам огласить пргограмматор, которым вы пользуетесь (какой программой шьете), так как программирование fuse может привести к тому, что больше вы контроллер не увидите (всмысле не сможете перепрограммировать).


Цитата(Сергей Борщ @ Mar 15 2007, 10:55) *
Мама! Откуда столько?
int(12000000/8/115200) = 13.
12000000/8/13 = 115384.
(115384 - 115200)/115200 * 100 = 0.16%

Выкиньте такую программу, считайте сами.


У вас просто двойная скорость UART, а в программе видно одиночная.
Сергей Борщ
Цитата(Dopler @ Mar 15 2007, 16:34) *
У вас просто двойная скорость UART, а в программе видно одиночная.
Ну так если одиночная не подходит, надо включать двойную а не снижать скорость обмена со словами "не получилось". К тому же сообщение, на который писался ответ звучало:
Цитата
Есть такая программа, называется AvrCalc.exe(прикрепить что то не удается - гугль в помощь) так вот, согласно этой программы при кварце 12МГц и скорости 115200 получается ошибка установки скорости 7.84%
Тут ни про какую двойную скорость не говорится.
P.S. у меня прекрасно работает 115200 при кварце 12.8МГц.
GDI
Так и у автора одиночная скорость, UCSRA = 0x00, во всех приведенных выше листингах, вернее бит U2X нигде не устанавливается.
Цитата
Ну так если одиночная не подходит, надо включать двойную а не снижать скорость обмена со словами "не получилось".

Никто и не предлагает снижать скорость, я предлагал использовать другой кварц, а еще точнее я высказал версию в ответ на вопрос автора - почему не работает. Судя по всему, автор только начинает работать с контроллерами, по-этому лучше сразу поставить кварц с которым ошибка скорости будет = 0, а потом с приобретением опыта можно будет ставить кварцы на 12 или 12.8МГц, играться с двойными скоростями, плевать на небольшое увеличение ошибки, уметь оценить эту ошибку и т.д.
Сергей Борщ
Цитата(GDI @ Mar 16 2007, 09:46) *
Судя по всему, автор только начинает работать с контроллерами, по-этому лучше сразу поставить кварц с которым ошибка скорости будет = 0, а потом с приобретением опыта можно будет ставить кварцы на 12 или 12.8МГц, играться с двойными скоростями, плевать на небольшое увеличение ошибки, уметь оценить эту ошибку и т.д.
Вот с таким развернутым ответом соглашусь безоговорочно!
Kovrov
Цитата(Сергей Борщ @ Mar 15 2007, 10:55) *
Мама! Откуда столько?
int(12000000/8/115200) = 13.
12000000/8/13 = 115384.
(115384 - 115200)/115200 * 100 = 0.16%

Выкиньте такую программу, считайте сами.

пусть U2x=0
выбираем UBRR:
[12000000/(16*115200)]-1 = 5.5
1) пусть будет 5
вычисляем реальный бодрейт:
[12000000/(16*(5+1))]=125000
вычисляем погрешность:
{(125000/115200)-1}*100% = 8.5%
если взять UBRR=6 то чуть меньше...
или я недоперепил?
наверное она так считает ведь она незнает что в мегах есть U2x=1
я про калк
Сергей Борщ
Цитата(Kovrov @ Mar 16 2007, 12:54) *
наверное она так считает ведь она незнает что в мегах есть U2x=1
я про калк

И я про него:
Цитата(Сергей Борщ @ Mar 15 2007, 09:55) *
Выкиньте такую программу, считайте сами.
И показал в цифрах, что знание простейшей методики расчета и "ручной" настройки регистров гораздо плодотворнее тупого следования результатам программы. Ведь сложного там ничего нет - прочитать три страницы и понять.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.