Полная версия этой страницы:
AVR и ПК
dim_OK
Mar 12 2007, 19:20
состыкавал плату с МК и MAX232 с ПК по COM-порту написал прогу на ассемблере. Отправляю с компа утилитой COMPortToolKit определённое число, МК его принимает и тут же отправляет обратно. Этой же утилитой можно смотреть что пришло в порт. А приходит ноль, причём независимо от того какое число отправлял. Прогу писал без всяких протоколов.
Подскажите от чего такое может быть и в каком направлении надо думать.
Kuzmi4
Mar 12 2007, 19:25
2 dim_OK - чтобы было проще и вам и нам не моглы бы вы привести листинг этой злополучной проги??
Igor26
Mar 12 2007, 20:31
Цитата
и тут же отправляет обратно
...с этого момента подробней пожалуйста. Я зачастую тоже пользуюсь этой утилитой и подобных вещей не наблюдал. Такое было, когда не совпадали скорости приёма/передачи.
OFF P.S. Котейка все ноги искорябал!!! Так ему и хочется на клавиатуру запрыгнуть!
bodja74
Mar 12 2007, 21:51
Думаю лучше начать с того ,чтобы МК вообще что нибудь отправлял на комп например при включении питания МК,так легче определить несовпадение скоростей.
GDaniloff
Mar 12 2007, 22:29
ничего не имею против max232, но можно обойтись и без него - см. app.note avr910
Волощенко
Mar 13 2007, 10:05
Цитата(dim_OK @ Mar 12 2007, 20:20)

... А приходит ноль, причём независимо от того какое число отправлял...
....в каком направлении надо думать.
Какая задана скорость UART и правильно ли она задана.
Часто ошибки возникают в загрузке регистров UBRRH и UBRRL (задают скорость обмена). Надо помнить, что UBRRH и UCSRC (регистр управления и статуса) имеют общий адрес, а разделение выполняется битом URSEL.
Возможно по этому приходят нули, так как реально, из-за ошибки в обращении к UBRRH и UCSRC, задана очень низкая скорость.
dim_OK
Mar 13 2007, 11:10
Вот она! Причём если задан правильный делитель, т. е. скорости в 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
;***************
Волощенко
Mar 13 2007, 11:34
Цитата(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
Mar 13 2007, 11:49
Тут нуна действительно посмотреть на инициализацию усарта..
код нуля в принципе писать не обязательно но желательно(хотя если он стартует с ресета - то там точно нули).
на асме вот листинг с утра компилил - дЫвайс отзывается
@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
Mar 13 2007, 12:45
Было бы еще неплохо знать, что за МК, так как у разных МК регистры 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
Mar 13 2007, 13:37
Да придётся Си изучать ибо я в нём не силён. Ну а я сделал как писалось в последнем сообщении
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
Mar 13 2007, 13:44
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
Mar 13 2007, 21:51
Ага, а что значит сделать проверку. Вот этого честно скажу я не понимаю. Что надо сделать с принятой инфой конкретно? Я ведь пишу прогу без всяких протоколов. Делаю это в AVRStudio и так как написано в последнем примере вижу первый раз. Не могли бы вы прокоментировать его.
Dopler
Mar 13 2007, 22:44
Цитата(dim_OK @ Mar 13 2007, 21:51)

Ага, а что значит сделать проверку. Вот этого честно скажу я не понимаю. Что надо сделать с принятой инфой конкретно? Я ведь пишу прогу без всяких протоколов. Делаю это в AVRStudio и так как написано в последнем примере вижу первый раз. Не могли бы вы прокоментировать его.
Вам надо просто написать здесь, какой у вас контроллер и кварц на нем, а я вам дам листинг готового примера (как я приводил выше, но полностью готовый), вы его откомпилируете, зашьете в контроллер и увидите работоспособность железа (или не увидите). А дальше делайте с ним, что хотите.
dim_OK
Mar 14 2007, 10:08
[/quote]
Вам надо просто написать здесь, какой у вас контроллер и кварц на нем, а я вам дам листинг готового примера (как я приводил выше, но полностью готовый), вы его откомпилируете, зашьете в контроллер и увидите работоспособность железа (или не увидите). А дальше делайте с ним, что хотите.
[/quote]
Спасибо огромное. Кварц на 12МГц на контроллере ATMega8535.
Есть такая программа, называется AvrCalc.exe(прикрепить что то не удается - гугль в помощь) так вот, согласно этой программы при кварце 12МГц и скорости 115200 получается ошибка установки скорости 7.84% при том что даташит рекомендует иметь 0,5%, а при больших говорит, что возрастет влияние помех. А при таких ошибках и не будет никогда работать нормально. Для использования УАРТа, особенно на высоких скоростях используют специальные кварцы: 7.3728МГц, 11.0592МГц, 14.7456МГц и другие, в даташите есть раздел Examples of Baud Rate Setting - там указаны некоторые частоты кварцев и ошибки, которые с ними получаются на разных скоростях.
dim_OK
Mar 14 2007, 19:10
Цитата(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
Mar 15 2007, 10:25
Как и обещал, готовый проект в прикрепленном файле. 12 МГц - не очень удачная частота для UART, кстати, вы уверены, что работаете от кварца а не от внутреннего генератора? Для работы примера, вам надо установить fuse биты так, чтобы работа шла от внутреннего генератора 1 МГц, причем эта частота в кристале выставлена по умолчанию (т.е. если в fuse битах вы ничего не меняли, то и не надо этого делать). Программа инициализирует UART на скорость 2400, и в цикле непрерывно шлет данные.
Сергей Борщ
Mar 15 2007, 10:55
Цитата(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%
Выкиньте такую программу, считайте сами.
Цитата
Мама! Откуда столько?
int(12000000/8/115200) = 13.
12000000/8/13 = 115384.
(115384 - 115200)/115200 * 100 = 0.16%
Выкиньте такую программу, считайте сами.
Да уж...

Но я все равно ставлю 11,0592 или 14,7456 если работаю с УАРТом.
dim_OK
Mar 15 2007, 15:08
Цитата(Dopler @ Mar 15 2007, 10:25)

Как и обещал, готовый проект в прикрепленном файле. 12 МГц - не очень удачная частота для UART, кстати, вы уверены, что работаете от кварца а не от внутреннего генератора? Для работы примера, вам надо установить fuse биты так, чтобы работа шла от внутреннего генератора 1 МГц, причем эта частота в кристале выставлена по умолчанию (т.е. если в fuse битах вы ничего не меняли, то и не надо этого делать). Программа инициализирует UART на скорость 2400, и в цикле непрерывно шлет данные.
Спасибо огромное, работает. Но что же получается усарт работает не от кварца, а от внутреннего генератора. Я то думал наооборот, и расчитывал делители для 12 МГц. И теперь если я захочу поменять скорость передачи\приёма то надо будет расчитывать делитель для 1 МГц а не для 12?
УСАРТ работает от того генератора что вы выберите, просто по-умолчанию новые кристаллы работают от встроенного RC генератора на 1МГц, а для того чтобы переключится на другой генератор(RC генератор на 2, 4 или 8МГц или внешний кварц) - надо фьюзы прошить согласно даташиту.
Dopler
Mar 15 2007, 17:34
На этом этапе я рекомендовал бы вам огласить пргограмматор, которым вы пользуетесь (какой программой шьете), так как программирование fuse может привести к тому, что больше вы контроллер не увидите (всмысле не сможете перепрограммировать).
Цитата(Сергей Борщ @ Mar 15 2007, 10:55)

Мама! Откуда столько?
int(12000000/8/115200) = 13.
12000000/8/13 = 115384.
(115384 - 115200)/115200 * 100 = 0.16%
Выкиньте такую программу, считайте сами.
У вас просто двойная скорость UART, а в программе видно одиночная.
Сергей Борщ
Mar 15 2007, 20:33
Цитата(Dopler @ Mar 15 2007, 16:34)

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

Судя по всему, автор только начинает работать с контроллерами, по-этому лучше сразу поставить кварц с которым ошибка скорости будет = 0, а потом с приобретением опыта можно будет ставить кварцы на 12 или 12.8МГц, играться с двойными скоростями, плевать на небольшое увеличение ошибки, уметь оценить эту ошибку и т.д.
Вот с таким развернутым ответом соглашусь безоговорочно!
Kovrov
Mar 16 2007, 13:54
Цитата(Сергей Борщ @ 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
я про калк
Сергей Борщ
Mar 16 2007, 15:30
Цитата(Kovrov @ Mar 16 2007, 12:54)

наверное она так считает ведь она незнает что в мегах есть U2x=1
я про калк
И я про него:
Цитата(Сергей Борщ @ Mar 15 2007, 09:55)

Выкиньте такую программу, считайте сами.
И показал в цифрах, что знание простейшей методики расчета и "ручной" настройки регистров гораздо плодотворнее тупого следования результатам программы. Ведь сложного там ничего нет - прочитать три страницы и понять.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.