UART без кварцевого резонатора
Re: UART без кварцевого резонатора
[uquote="GoldenAndy",url="/forum/viewtopic.php?p=3942250#p3942250"]У меня была мега8, которая при 5 вольтах, комнатной температуре работала на частоте 8.55 МГц (проверил, запустив таймер и посмотрев, чего на выходе таймера).[/uquote]
Ну да, тяжело подстраиваться под дефектную мега8.) Но вообще intrc можно калибровать относительно образца, RTC например. Либо самый простой вариант - от ПК.
Ну да, тяжело подстраиваться под дефектную мега8.) Но вообще intrc можно калибровать относительно образца, RTC например. Либо самый простой вариант - от ПК.
- Реклама
- GoldenAndy
- Поставщик валерьянки для Кота
- Сообщения: 1925
- Зарегистрирован: Чт июл 28, 2016 07:58:37
- Откуда: Kyiv, UA
- Контактная информация:
Re: UART без кварцевого резонатора
OKF, так никто не обещает же точный генератор. Обещают калибровочную константу, которую нужно вычитать программатором.
А потом записать в нужный регистр в программе. Так что мега никакая не дефектная.
Вот как по мне - самокалибровка по принимаемому сигналу рулит. Но тут или калибровочный байт ловить, или поломать голову, что бы понять, сколько бит прошло от старта до перепада.
А потом записать в нужный регистр в программе. Так что мега никакая не дефектная.
Вот как по мне - самокалибровка по принимаемому сигналу рулит. Но тут или калибровочный байт ловить, или поломать голову, что бы понять, сколько бит прошло от старта до перепада.
Re: UART без кварцевого резонатора
Здрасте! Почитали бы хотя бы, что ли.
- GoldenAndy
- Поставщик валерьянки для Кота
- Сообщения: 1925
- Зарегистрирован: Чт июл 28, 2016 07:58:37
- Откуда: Kyiv, UA
- Контактная информация:
Re: UART без кварцевого резонатора
Что именно почитать? Покажите, почитаем...
Re: UART без кварцевого резонатора
Да, забыл я о калибровке старых мег, с несколькими генераторами(. Согласен, для меги8 родная калибровка для 8мгц ничего не гарантирует. Извиняюсь.) Я же всё по новым равняю, у которых 8 мгц по умолчанию и которые уже откалиброваны.
- Реклама
Re: UART без кварцевого резонатора
очень хороший проект, частично по теме, втч
- термокомпенсация внутр. генератора
- калибровка для UART
RTC без RTC, но с батарейкой
- термокомпенсация внутр. генератора
- калибровка для UART
RTC без RTC, но с батарейкой
Енот - это кот, только инкогнито!
p.s. держитесь обоими руками, а то прорвет...
p.s. держитесь обоими руками, а то прорвет...
Re: UART без кварцевого резонатора
Здравствуйте!
Подскажите пожалуйста.
У меня ATiny4313 работает на 1MHz, внешнего кварца нет. Подключена к компьютеру, на компьютере стоит Terminal v1.9, скорость обмена 9600.
При передачи небольшого числа байт проблем нет. При передачи более 13...20 байт начинается ерунда. При установке временной задержке проблема уходит.
Я так подозреваю (почитав эту ветку) что проблема в несогласованности скоростей передатчика и приемника, но возможно и ошибки в программе.
Опыта и возможности сейчас нет чтобы ставить внешний кварц или настроить внутренний и проверить где ошибка. Поэтому может глянете код и тогда хотя бы его исключу из догадок.
Заранее спасибо.
Подскажите пожалуйста.
У меня 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*/
Re: UART без кварцевого резонатора
Посмотрите.
Спойлер
Код: Выделить всё
.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
Re: UART без кварцевого резонатора
[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
- калибровка для 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
Re: UART без кварцевого резонатора
Прошу прощения что так коряво вставил код. Попробую еще раз.
Спойлер
Код: Выделить всё
//При получении по 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
*/
Re: UART без кварцевого резонатора
По мне, в программе некорректный выход из прерывания
Чистый буфер передатчика не значит окончания передачи последнего байта
Спойлер
Код: Выделить всё
// Обработчик принятых данных.
//----------
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
Re: UART без кварцевого резонатора
akl спасибо за замечания по коду, но это не помогло. Вместо значений от 0 до 255 получаю такой вот список (каждый раз разный)
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 и др. это какие-то теоретические частоты? На таких частотах сам МК будет функционировать?
Спойлер
01
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 и др. это какие-то теоретические частоты? На таких частотах сам МК будет функционировать?
Re: UART без кварцевого резонатора
Правильно. Не обязательно искать кварц с удобной частотой, важнее правильно задать значение предделителя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
Эти частоты кратны 600Гц и позволяют получать целое значение UBRR для всех "стандартных" скоростей обмена.Troechnik писал(а):...это какие-то теоретические частоты
Re: UART без кварцевого резонатора
Поставил внешний кварц 1Mhz, ситуация не изменилась - принимаю мусор. Поставил внешний кварц 7,3728 Mhz, также принимается мусор. Одинарная скорость, двойная - безразлично.
Проверяю двадцатый раз код, снова читаю теорию, начинают развиваться комплексы...
Но в какой-то момент случайно заметил что если в программе Terminal_1.93b (20141030) включить дополнительные столбцы DEC, BIN или HEX то при приёме будет МУСОР!!Можно не включать эти столбцы либо пользоваться старой версией 20130116 там вроде всё нормально.
Зато теперь у меня два кварца есть.
Проверяю двадцатый раз код, снова читаю теорию, начинают развиваться комплексы...
Но в какой-то момент случайно заметил что если в программе Terminal_1.93b (20141030) включить дополнительные столбцы DEC, BIN или HEX то при приёме будет МУСОР!!Можно не включать эти столбцы либо пользоваться старой версией 20130116 там вроде всё нормально.
Зато теперь у меня два кварца есть.
Re: UART без кварцевого резонатора
Возможно, терминалка как-то неправильно настроена.
Загрузил программу в tiny2313a с кварцем 8.000МГц. Все работает без сбоев.
Включил предделитель CKDIV8. Не работает
Выключил CKDIV8 и подключил встроенный генератор 8МГц
Получил такую картинку
Загрузил программу в tiny2313a с кварцем 8.000МГц. Все работает без сбоев.
Включил предделитель CKDIV8. Не работает
Выключил CKDIV8 и подключил встроенный генератор 8МГц
Получил такую картинку
Спойлер
- Вложения
-
- TEST_TN2313.PNG
- (47.87 КБ) 117 скачиваний
Re: UART без кварцевого резонатора
Вот то как получается прием значений от 0 до 255 в программе Terminal v1.93b при отключенном отображении BIN, DEC, HEX
а вот так при включенном
В предыдущей версии этой программы работает нормально.





