|
AVR и ПК, AVR и ПК |
|
|
|
Mar 12 2007, 20:31
|

Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544

|
Цитата и тут же отправляет обратно ...с этого момента подробней пожалуйста. Я зачастую тоже пользуюсь этой утилитой и подобных вещей не наблюдал. Такое было, когда не совпадали скорости приёма/передачи. OFF P.S. Котейка все ноги искорябал!!! Так ему и хочется на клавиатуру запрыгнуть!
|
|
|
|
|
Mar 13 2007, 10:05
|
Местный
  
Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377

|
Цитата(dim_OK @ Mar 12 2007, 20:20)  ... А приходит ноль, причём независимо от того какое число отправлял... ....в каком направлении надо думать. Какая задана скорость UART и правильно ли она задана. Часто ошибки возникают в загрузке регистров UBRRH и UBRRL (задают скорость обмена). Надо помнить, что UBRRH и UCSRC (регистр управления и статуса) имеют общий адрес, а разделение выполняется битом URSEL. Возможно по этому приходят нули, так как реально, из-за ошибки в обращении к UBRRH и UCSRC, задана очень низкая скорость.
|
|
|
|
|
Mar 13 2007, 11:10
|

Группа: Новичок
Сообщений: 11
Регистрация: 24-02-07
Из: Воронеж
Пользователь №: 25 622

|
Вот она! Причём если задан правильный делитель, т. е. скорости в 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
|
Местный
  
Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377

|
Цитата(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)
|
|
|
|
|
Mar 13 2007, 11:49
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
Тут нуна действительно посмотреть на инициализацию усарта.. код нуля в принципе писать не обязательно но желательно(хотя если он стартует с ресета - то там точно нули). на асме вот листинг с утра компилил - дЫвайс отзывается @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 вот.... Сделайте в программе так - проинициализируйте усарт, отправте символ, если получите - тогда надо двигаться далее...
Сообщение отредактировал Kuzmi4 - Mar 13 2007, 11:52
|
|
|
|
|
Mar 13 2007, 12:45
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Было бы еще неплохо знать, что за МК, так как у разных МК регистры 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
|
|
|
|
|
Mar 13 2007, 13:37
|

Группа: Новичок
Сообщений: 11
Регистрация: 24-02-07
Из: Воронеж
Пользователь №: 25 622

|
Да придётся Си изучать ибо я в нём не силён. Ну а я сделал как писалось в последнем сообщении
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.
|
|
|
|
|
Mar 13 2007, 21:51
|

Группа: Новичок
Сообщений: 11
Регистрация: 24-02-07
Из: Воронеж
Пользователь №: 25 622

|
Ага, а что значит сделать проверку. Вот этого честно скажу я не понимаю. Что надо сделать с принятой инфой конкретно? Я ведь пишу прогу без всяких протоколов. Делаю это в AVRStudio и так как написано в последнем примере вижу первый раз. Не могли бы вы прокоментировать его.
|
|
|
|
|
Mar 13 2007, 22:44
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(dim_OK @ Mar 13 2007, 21:51)  Ага, а что значит сделать проверку. Вот этого честно скажу я не понимаю. Что надо сделать с принятой инфой конкретно? Я ведь пишу прогу без всяких протоколов. Делаю это в AVRStudio и так как написано в последнем примере вижу первый раз. Не могли бы вы прокоментировать его. Вам надо просто написать здесь, какой у вас контроллер и кварц на нем, а я вам дам листинг готового примера (как я приводил выше, но полностью готовый), вы его откомпилируете, зашьете в контроллер и увидите работоспособность железа (или не увидите). А дальше делайте с ним, что хотите.
|
|
|
|
|
Mar 14 2007, 10:08
|

Группа: Новичок
Сообщений: 11
Регистрация: 24-02-07
Из: Воронеж
Пользователь №: 25 622

|
[/quote] Вам надо просто написать здесь, какой у вас контроллер и кварц на нем, а я вам дам листинг готового примера (как я приводил выше, но полностью готовый), вы его откомпилируете, зашьете в контроллер и увидите работоспособность железа (или не увидите). А дальше делайте с ним, что хотите. [/quote]
Спасибо огромное. Кварц на 12МГц на контроллере ATMega8535.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|