UART без кварцевого резонатора

Обсуждаем контроллеры компании Atmel.
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: UART без кварцевого резонатора

Сообщение OKF »

[uquote="GoldenAndy",url="/forum/viewtopic.php?p=3942250#p3942250"]У меня была мега8, которая при 5 вольтах, комнатной температуре работала на частоте 8.55 МГц (проверил, запустив таймер и посмотрев, чего на выходе таймера).[/uquote]
Ну да, тяжело подстраиваться под дефектную мега8.) Но вообще intrc можно калибровать относительно образца, RTC например. Либо самый простой вариант - от ПК.
Реклама
Аватара пользователя
GoldenAndy
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA
Контактная информация:

Re: UART без кварцевого резонатора

Сообщение GoldenAndy »

OKF, так никто не обещает же точный генератор. Обещают калибровочную константу, которую нужно вычитать программатором.
А потом записать в нужный регистр в программе. Так что мега никакая не дефектная.
Вот как по мне - самокалибровка по принимаемому сигналу рулит. Но тут или калибровочный байт ловить, или поломать голову, что бы понять, сколько бит прошло от старта до перепада.
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: UART без кварцевого резонатора

Сообщение OKF »

Здрасте! Почитали бы хотя бы, что ли.
Аватара пользователя
GoldenAndy
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA
Контактная информация:

Re: UART без кварцевого резонатора

Сообщение GoldenAndy »

Что именно почитать? Покажите, почитаем...
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Реклама
Эиком - электронные компоненты и радиодетали
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: UART без кварцевого резонатора

Сообщение OKF »

Да, забыл я о калибровке старых мег, с несколькими генераторами(. Согласен, для меги8 родная калибровка для 8мгц ничего не гарантирует. Извиняюсь.) Я же всё по новым равняю, у которых 8 мгц по умолчанию и которые уже откалиброваны.
Реклама
Аватара пользователя
sunjob
Вымогатель припоя
Сообщения: 618
Зарегистрирован: Ср дек 08, 2010 19:03:17

Re: UART без кварцевого резонатора

Сообщение sunjob »

очень хороший проект, частично по теме, втч
- термокомпенсация внутр. генератора
- калибровка для UART

RTC без RTC, но с батарейкой
Енот - это кот, только инкогнито!
p.s. держитесь обоими руками, а то прорвет...
Реклама
Troechnik
Родился
Сообщения: 15
Зарегистрирован: Пн дек 20, 2021 10:24:59

Re: UART без кварцевого резонатора

Сообщение Troechnik »

Здравствуйте!
Подскажите пожалуйста.
У меня ATiny4313 работает на 1MHz, внешнего кварца нет. Подключена к компьютеру, на компьютере стоит Terminal v1.9, скорость обмена 9600.
При передачи небольшого числа байт проблем нет. При передачи более 13...20 байт начинается ерунда. При установке временной задержке проблема уходит.

Я так подозреваю (почитав эту ветку) что проблема в несогласованности скоростей передатчика и приемника, но возможно и ошибки в программе.
Опыта и возможности сейчас нет чтобы ставить внешний кварц или настроить внутренний и проверить где ошибка. Поэтому может глянете код и тогда хотя бы его исключу из догадок.
Заранее спасибо.

Код: Выделить всё

//При получении по UART символа "r", программа начинает последовательно отсылат в UART значения от 0 до 255.
	
	.DEF	Rt0 = r16
	.DEF	Rdata = r17

//---------------------------------------------------------------------
//   Set Interrupt Vectors
//---------------------------------------------------------------------
	.CSEG
	.ORG	0x0000
	rjmp	Reset
	
	.ORG	0x0007
	rjmp	UART_receive
//-----------------------------------------------------------------------------------
//   Обработчтк Reset
//-----------------------------------------------------------------------------------
	.CSEG
	.ORG	0x0015
Reset:
	cli				;Отключаю прерывания

	ldi	Rt0,	12		;Задаю скорость обмена 9600 bps при 1 MHz микроконтроллера
	out	UBRRL,	Rt0
	ldi	Rt0,	0
	out	UBRRH,	Rt0
	

	ldi	Rt0,	(1<<U2X)		;Задаю двойную скорость
	out	UCSRA,	Rt0
	
	ldi	Rt0,	(1<<RXEN)|(1<<TXEN)|(1<<RXCIE)	;Разрешаю прием/передачу UART и прерывания по приёму данных.
	out	UCSRB,	Rt0
	
	ldi	Rt0,	(1<<USBS)|(3<<UCSZ0)	;Формат обмена: 8 бит информации, 2 стоповых бита.
	out	UCSRC,	Rt0
	
	sei				;Разрешаю глобально прерывания
//------------------------------------------------------------------------------------------------------------
// Permanent programm loop.
//------------------------------------------------------------------------------------------------------------
Start:
	rjmp	start
//------------------------------------------------------------------------------------------------------------
// Обработчик принятых данных.
//------------------------------------------------------------------------------------------------------------
UART_receive:
	cli			;Глобальный запрет прерываний
receive:
	sbis	UCSRA,	RXC	;Дожидаюсь когда будат приняты все 8 бит данных.
	rjmp	receive	
	
	in	Rdata,	UDR	;Считываю принятые по UART данные,
	cpi	Rdata,	'r'	;сравниваю с заданным символом "r",
	brne	gostart		;если символ не равен "r" выхожу из процедуры,
	
	ldi	Rdata,	0	;если принятый по UART символ равен "r" задаю начальное значение Rdata,
	rcall	Print		;и начинаю выводит данные в UART.
gostart:
	sei
	rjmp	Start
//------------------------------------------------------------------------------------------------------------
// Последовательный вывод значений от 0 до 255 в UART.
//------------------------------------------------------------------------------------------------------------
Print:
	sbis	UCSRA,	UDRE	;Дожидаемся освобождения буфера передачи.
	rjmp	print

	out	UDR,	Rdata	;Выводим один байт данных в UART.
	//rcall	wait

	inc	Rdata		;Увеличиваем до тех пор пока не обнулится,
	breq	exit		;т.е. выводим в UART значения от 0 до 255
	rjmp	Print
exit:
	ret

/*Wait:
	ldi  r18, 6
	ldi  r19, 19
	ldi  r20, 174
L1:	dec  r20
	brne L1
	dec  r19
	brne L1
	dec  r18
	brne L1
	rjmp PC+1
	ret*/

akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: UART без кварцевого резонатора

Сообщение akl »

Посмотрите.
Спойлер

Код: Выделить всё

.include "tn4313def.inc"

//При получении по UART символа "r", программа начинает последовательно отсылат в UART значения от 0 до 255.
.equ	Fo=1000000
   
   .DEF   Rt0 = r16
   .DEF   Rdata = r17

//----------
//   Set Interrupt Vectors
//----------
   .CSEG
   .ORG   0x0000
   rjmp   Reset
   
   .ORG   0x0007
	IN   Rdata,   UDR   ;Считываю принятые по UART данные,
	RETI
;   rjmp   UART_receive
//----------
//   Обработчтк Reset
//----------
   .CSEG
   .ORG   0x0015
Reset:
	LDI	R16,0x6F
	OUT	SPL,R16		;для симулятора. Для tiny4313 закомментировать

   cli            ;Отключаю прерывания

	SBI	UCSRC,USBS
;  ldi   Rt0,1<<|1<<UCSZ0   ;Формат обмена: 8 бит информации, 2 стоповых бита.
;  out   UCSRC,   Rt0

;	LDI	XH,HIGH((Fo+4*9600)/9600/8-1)
;	LDI	XL,LOW((Fo+4*9600)/9600/8-1)
	LDI	XH,HIGH((Fo+8*9600)/9600/16-1)
	LDI	XL,LOW((Fo+8*9600)/9600/16-1)
	OUT	UBRRH,XH
	OUT	UBRRL,XL

;   ldi   Rt0,   12      ;Задаю скорость обмена 9600 bps при 1 MHz микроконтроллера
;   out   UBRRL,   Rt0
;   ldi   Rt0,   0
;   out   UBRRH,   Rt0
   

;	SBI   UCSRA,U2X
;   ldi   Rt0,   (1<<U2X)      ;Задаю двойную скорость
;   out   UCSRA,   Rt0
   
   ldi   Rt0,   (1<<RXEN)|(1<<RXCIE)   ;Разрешаю прием/передачу UART и прерывания по приёму данных.
   out   UCSRB,   Rt0
   
	IN   Rdata,UDR   ;ФИКТИВНОЕ чтение для сброса RxC

;  ldi   Rt0,   (1<<USBS)|(3<<UCSZ0)   ;Формат обмена: 8 бит информации, 2 стоповых бита.
;  out   UCSRC,   Rt0

   LDI	R16,1<<SE
   OUT	MCUCR,R16
   
   sei            ;Разрешаю глобально прерывания
//----------
// Permanent programm loop.
//----------
Start:
	SLEEP
;   rjmp   start
//----------
// Обработчик принятых данных.
//----------
;UART_receive:
;   cli         ;Глобальный запрет прерываний
;receive:
;   sbis   UCSRA,   RXC   ;Дожидаюсь когда будат приняты все 8 бит данных.
;   rjmp   receive   





;	in   Rdata,   UDR   ;Считываю принятые по UART данные,
	cpi   Rdata,   'r'   ;сравниваю с заданным символом "r",
	brne   start      ;если символ не равен "r" выхожу из процедуры,
; 	brne   gostart      ;если символ не равен "r" выхожу из процедуры,

   ldi   R16,1<<TXEN   ;Разрешаю передачу UART
   out   UCSRB,   Rt0
   
   SBI	UCSRA,TxC

   ldi   Rdata,   0   ;если принятый по UART символ равен "r" задаю начальное значение Rdata,
;   SBI	UCSRA,TxC
;   rcall   Print      ;и начинаю выводит данные в UART.
;gostart:
;   sei
;   rjmp   Start
//----------
// Последовательный вывод значений от 0 до 255 в UART.
//----------
Print:
   out   UDR,   Rdata   ;Выводим один байт данных в UART.

WAIT_TxC:
   sbis   UCSRA,TxC   ;Дожидаемся передачи байта.
   rjmp		WAIT_TxC

;   sbis   UCSRA,   UDRE   ;Дожидаемся освобождения буфера передачи.
;   rjmp   print

   SBI	UCSRA,TxC

;   out   UDR,   Rdata   ;Выводим один байт данных в UART.
   //rcall   wait

   inc   Rdata      ;Увеличиваем до тех пор пока не обнулится,
	BRNE	PRINT

	RJMP	RESET
;	RJMP	START



;   breq   exit      ;т.е. выводим в UART значения от 0 до 255
;   rjmp   Print
;exit:
;   ret

/*Wait:
   ldi  r18, 6
   ldi  r19, 19
   ldi  r20, 174
L1:   dec  r20
   brne L1
   dec  r19
   brne L1
   dec  r18
   brne L1
   rjmp PC+1
   ret*/
.EXIT
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: UART без кварцевого резонатора

Сообщение OKF »

[uquote="sunjob",url="/forum/viewtopic.php?p=3946525#p3946525"]очень хороший проект...
- калибровка для UART[/uquote]
Не ново. AVR055: Using a 32 kHz crystal to calibrate the internal RC oscillator

Добавлено after 2 minutes 27 seconds:
Troechnik, см. https://radiokot.ru/forum/viewtopic.php ... 5#p3942165
Troechnik
Родился
Сообщения: 15
Зарегистрирован: Пн дек 20, 2021 10:24:59

Re: UART без кварцевого резонатора

Сообщение Troechnik »

Прошу прощения что так коряво вставил код. Попробую еще раз.
Спойлер

Код: Выделить всё

//При получении по UART символа "r", программа начинает последовательно отсылат в UART значения от 0 до 255.        
	.DEF   Rt0 = r16    
	.DEF   Rdata = r17 
//---------- 
//   Set Interrupt Vectors 
//----------    
	.CSEG    
	.ORG   0x0000    
	rjmp   Reset        
	.ORG   0x0007    
	rjmp   UART_receive 
//---------- 
//   Обработчтк Reset 
//----------    
	.CSEG    
	.ORG   0x0015 
Reset:    
	cli			;Отключаю прерывания    
	ldi   Rt0,   12		;Задаю скорость обмена 9600 bps при 1 MHz микроконтроллера    
	out   UBRRL,   Rt0    
	ldi   Rt0,   0    
	out   UBRRH,   Rt0        
	ldi   Rt0,   (1<<U2X)		 ;Задаю двойную скорость    
	out   UCSRA,   Rt0        
	ldi   Rt0,   (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)   ;Разрешаю прием/передачу UART и прерывания по приёму данных.   
	out   UCSRB,   Rt0        
	ldi   Rt0,   (1<<USBS)|(3<<UCSZ0)	;Формат обмена: 8 бит информации, 2 стоповых бита.    
	out   UCSRC,   Rt0        
	sei			;Разрешаю глобально прерывания 
//---------- 
// Permanent programm loop. 
//---------- 
Start:    
	rjmp   start 
//---------- 
// Обработчик принятых данных. 
//---------- 
UART_receive:    
	cli         
;Глобальный запрет прерываний 
receive:    
	sbis   UCSRA,   RXC   ;Дожидаюсь когда будат приняты все 8 бит данных.    
	rjmp   receive           
	in   Rdata,   UDR   ;Считываю принятые по UART данные,    
	cpi   Rdata,   'r'   ;сравниваю с заданным символом "r",    
	brne   gostart      ;если символ не равен "r" выхожу из процедуры,        
	ldi   Rdata,   0   ;если принятый по UART символ равен "r" задаю начальное значение Rdata,    
	rcall   Print      ;и начинаю выводит данные в UART. 
gostart:    
	sei    
	rjmp   Start 
//---------- 
// Последовательный вывод значений от 0 до 255 в UART. 
//---------- 
Print:    
	sbis   UCSRA,   UDRE   ;Дожидаемся освобождения буфера передачи.    
	rjmp   print    
	out   UDR,   Rdata   ;Выводим один байт данных в UART.    
//rcall   wait    
	inc   Rdata      ;Увеличиваем до тех пор пока не обнулится,    
	breq   exit      ;т.е. выводим в UART значения от 0 до 255    
	rjmp   Print 
exit:
	ret 


/*
Wait:    
	ldi  r18, 6    
	ldi  r19, 19    
	ldi  r20, 174 
L1:   
	dec  r20    
	brne L1    
	dec  r19    
	brne L1    
	dec  r18    
	brne L1    
	rjmp PC+1    
	ret
*/

akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: UART без кварцевого резонатора

Сообщение akl »

По мне, в программе некорректный выход из прерывания
Спойлер

Код: Выделить всё

// Обработчик принятых данных.
//----------
UART_receive:   
;   cli   ; делается аппаратно при входе       
;Глобальный запрет прерываний
receive:   
;   sbis   UCSRA,   RXC   ;Дожидаюсь когда будат приняты все 8 бит данных.   
;   rjmp   receive
;программа вошла в прерывание по этому флагу!!!
           
   in   Rdata,   UDR   ;Считываю принятые по UART данные,   
   cpi   Rdata,   'r'   ;сравниваю с заданным символом "r",   
   brne   gostart      ;если символ не равен "r" выхожу из процедуры,       
   ldi   Rdata,   0   ;если принятый по UART символ равен "r" задаю начальное значение Rdata,   
   rcall   Print      ;и начинаю выводит данные в UART.
gostart:   
;   sei
   RETI    ;!!!!!!!!!!!!!!!!!!!!
;   rjmp   Start
//----------
Чистый буфер передатчика не значит окончания передачи последнего байта

Код: Выделить всё

exit:
   sbis   UCSRA,TxC   ;Дожидаемся полной передачи байта
   RJMP	EXIT
   SBI   UCSRA,TxC    ; очистка флага
   RET
Troechnik
Родился
Сообщения: 15
Зарегистрирован: Пн дек 20, 2021 10:24:59

Re: UART без кварцевого резонатора

Сообщение Troechnik »

akl спасибо за замечания по коду, но это не помогло. Вместо значений от 0 до 255 получаю такой вот список (каждый раз разный)
Спойлер0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
246
247
248
249
250
251
252
253
254
255
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
Буду ставить внешний кварц и смотреть.
Подскажите с частотой кварца, в даташите для UART прописаны такие частоты 3.6864 MHz, 7.3728 MHz, 11.0592 MHz и др. это какие-то теоретические частоты? На таких частотах сам МК будет функционировать?
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: UART без кварцевого резонатора

Сообщение akl »

Troechnik писал(а):Буду ставить внешний кварц и смотреть.
Правильно. Не обязательно искать кварц с удобной частотой, важнее правильно задать значение предделителя
UBRR~(Fo+8*BAUD)/BAUD/16-1 с округлением. Простое усечение не всегда дает хороший результат.
СпойлерНапример
Частота встроенного генератора tiny2313A ~914'000+/-200Гц, что дает Fbod=914000/13/8~8788 ??????
Так и просится UBRR=12-1, что даст Fbod=914000/12/8~9520
Troechnik писал(а):...это какие-то теоретические частоты
Эти частоты кратны 600Гц и позволяют получать целое значение UBRR для всех "стандартных" скоростей обмена.
Troechnik
Родился
Сообщения: 15
Зарегистрирован: Пн дек 20, 2021 10:24:59

Re: UART без кварцевого резонатора

Сообщение Troechnik »

Поставил внешний кварц 1Mhz, ситуация не изменилась - принимаю мусор. Поставил внешний кварц 7,3728 Mhz, также принимается мусор. Одинарная скорость, двойная - безразлично.
Проверяю двадцатый раз код, снова читаю теорию, начинают развиваться комплексы...
Но в какой-то момент случайно заметил что если в программе Terminal_1.93b (20141030) включить дополнительные столбцы DEC, BIN или HEX то при приёме будет МУСОР!!Можно не включать эти столбцы либо пользоваться старой версией 20130116 там вроде всё нормально.
Зато теперь у меня два кварца есть.
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: UART без кварцевого резонатора

Сообщение akl »

Возможно, терминалка как-то неправильно настроена.
Загрузил программу в tiny2313a с кварцем 8.000МГц. Все работает без сбоев.
Включил предделитель CKDIV8. Не работает
Выключил CKDIV8 и подключил встроенный генератор 8МГц
Получил такую картинку
СпойлерИзображение
Вложения
TEST_TN2313.PNG
(47.87 КБ) 117 скачиваний
Troechnik
Родился
Сообщения: 15
Зарегистрирован: Пн дек 20, 2021 10:24:59

Re: UART без кварцевого резонатора

Сообщение Troechnik »

Вот то как получается прием значений от 0 до 255 в программе Terminal v1.93b при отключенном отображении BIN, DEC, HEX
СпойлерИзображение
а вот так при включенном
СпойлерИзображение
В предыдущей версии этой программы работает нормально.
Вложения
вкл.PNG
(56.09 КБ) 65 скачиваний
выкл.PNG
(56.14 КБ) 69 скачиваний
Ответить

Вернуться в «AVR»