Сбилась частота тактовая или UART или что?

СергейНСК
Offline
Зарегистрирован: 22.11.2014

Добрый день! Сразу извиняюсь, если решение моей проблемы есть на форуме, но я его не нашел.

В один прекрасный день через USB перестали шиться все ардуины, что есть под рукой.

Про "все" я понял потом, потому сначала подумал на загрузчик конкретной платы. Взял "arduino as ISP" прошил загрузчик - плата всё равно по USB на шьётся, но зашилась так "Скетч" - "загрузить через программатор". Плата стала работать, но в 2 раза медленней и если прошить вывод в uart, то при запрограммированной скорости uart 9600 нормальное чтение порта идёт на 4800.

Дальше ещё несколько экспериментов: перепробовал несколько вариантов загрузчиков, 2 программатора (arduino as ISP и USBasp)

В файле boards.txt поменял f_cpu=16000000L на  f_cpu=8000000L. В этом случае камень, который изначально на 16МГц стал работать правильно по времени. uart, зашитый на 9600 читается на 9600, но через USB платы писаться не хотят, пишутся все только через программатор. Тут понятно, что замена  f_cpu - это неправильный костыль.

Вопрос. Что общее в данном случае может делить на 2, все платы если дело не boards и не в программаторе и загрузчике?

Arduino IDE переустанавливал.

СергейНСК
Offline
Зарегистрирован: 22.11.2014

Плата USB-uart в винде выглядит так: "Silicon Labs CP210X tо uart bridge". Таких плат у меня несколько, пробовал даже новую из упаковки. Не помогает.

Драйвера на неё сносил, переустанавливал.

rkit
Offline
Зарегистрирован: 23.11.2016

Регистр делителя сбил, поди. С другим кодом пробовал? Если с ним так же, то переустанавливай IDE.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Фраза "все ардуины, что есть под рукой" ни о чём не говорит. Давайте конкретно название платы, модель МК, и прочие подробности.

СергейНСК
Offline
Зарегистрирован: 22.11.2014

dimax пишет:

Фраза "все ардуины, что есть под рукой" ни о чём не говорит. Давайте конкретно название платы, модель МК, и прочие подробности.

 

все на 328p. клоны pro mini, nano

СергейНСК
Offline
Зарегистрирован: 22.11.2014

 

rkit пишет:

Регистр делителя сбил, поди. С другим кодом пробовал? Если с ним так же, то переустанавливай IDE.

Пробовал разные коды, всегда медленнее в 2 раза

А где этот делитель прописан?

СергейНСК
Offline
Зарегистрирован: 22.11.2014

Для меня сейчас вообще не понятен такой момент: 2 разных компьютера, но на обоих есть портабл версия, синхронизированная чере яндекс диск. Так вот в один прекрасный момент они начали вести себя одинаково. Предполагаю, портабл не совсем портабл, а просто копия с когда-то установленной arduino-1.8.5 и она что-то в реестр пишет.

Так вот, удалял Arduino IDE, перезагружал, проходил CCleaner-ом, снова перезагружал, устанавливал последнюю версию и ничего не поменялось

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Давайте прекратим панику и выражения типа "все". А будем разбираться с одной платой.

Покажите для начала фьюзы.

И ответьте на вопрос: Вы понимаете, что после операции "загрузить через программатор" она не должна шиться обычным способом, т.к. там нет загрузчика?

rkit
Offline
Зарегистрирован: 23.11.2016

Ещё, может быть, неправильная плата выбрана

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Это зависит от того какую прошивку он грузит через программатор. 

Есть еще косяк. Если в обычную UNO залить бутлоадер от трех вольтовой микры, то бутлоадер загрузится и даже будет работать, но скорость UART будет в два раза выше:) Есть и обратные варианты .

А еще начинающие после работы с программатором неправильно возвращаются на UART бутлоадер, тупо не тот программатор в иде выбирают. А если еще учесть что NANO бывают со старым и новым бутлоадером, то ваще караул :)

СергейНСК
Offline
Зарегистрирован: 22.11.2014

ЕвгенийП пишет:

Давайте прекратим панику и выражения типа "все". А будем разбираться с одной платой.

Покажите для начала фьюзы.

И ответьте на вопрос: Вы понимаете, что после операции "загрузить через программатор" она не должна шиться обычным способом, т.к. там нет загрузчика?

1) Конкретная плата: клон про мини 5в.

2) Выбираю в платах: Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328P, то есть ЭТО в тексте boards.txt:

## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328P

## --------------------------------------------------
pro.menu.cpu.16MHzatmega328=ATmega328P (5V, 16 MHz)
pro.menu.cpu.16MHzatmega328.upload.maximum_size=30720
pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048
pro.menu.cpu.16MHzatmega328.upload.speed=57600
pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF
pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDA
pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0xFD
pro.menu.cpu.16MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex
pro.menu.cpu.16MHzatmega328.build.mcu=atmega328p
pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L
 
3) Через USBasp гружу загрузчик.
И всё. В плату через usb ничего не грузится, но читается на вдвое уменьшенной скорости.
 
4) если в файле boards.txt поменять "pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L" на "pro.menu.cpu.16MHzatmega328.build.f_cpu=8000000L", и загрузить загрузчик, то всё работает как обычно. По USB шьётся, читается. Если запрограммировать скорость uart 9600, то и чтение из него идёт на скорости 9600.
Если бы не одно НО: как я понимаю, плата с кварцем 16МГц.
 
По крайней мере раньше с этим загрузчиком всё работало прямо как есть.
 
Или я ошибаюсь насчёт кварца и 16МГц?
 
Feofan
Offline
Зарегистрирован: 28.05.2017

Может плата 8 MHz, 3.3 v? Стабилизатор на 5 или 3.3? Или подать 7-9v на Vin и посмотреть тестером на Vcc.

СергейНСК
Offline
Зарегистрирован: 22.11.2014

Feofan пишет:
Может плата 8 MHz, 3.3 v? Стабилизатор на 5 или 3.3? Или подать 7-9v на Vin и посмотреть тестером на Vcc.

Проверил. Точно 5В

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

СергейНСК пишет:

Feofan пишет:
Может плата 8 MHz, 3.3 v? Стабилизатор на 5 или 3.3? Или подать 7-9v на Vin и посмотреть тестером на Vcc.

Проверил. Точно 5В

а на кварце что написано?
и второе, может проц тактируется от внутреннего RC 8 мегагерц каким-то образом?
и третье - у простых простые неисправности у сложных - сложные (супруга подметила) )))

СергейНСК
Offline
Зарегистрирован: 22.11.2014

ЕвгенийП пишет:

И ответьте на вопрос: Вы понимаете, что после операции "загрузить через программатор" она не должна шиться обычным способом, т.к. там нет загрузчика?

Это я понял, учту.

Вот сейчас выбираю плату "uno" и зашиваю Блинк с задержкой включения светодиода 1 сек через программатор. Получаю совсем не тот результат: 2 сек горит, 2 сек не горит. Что тут участвует в формировании частот?

Тот же результат при плате pro mini 16MHz

Но, если поставить плату pro mini 8MHz, то времена реальные

Но плата pro mini 5v, 16MHz...

СергейНСК
Offline
Зарегистрирован: 22.11.2014

ua6em пишет:

СергейНСК пишет:

Feofan пишет:
Может плата 8 MHz, 3.3 v? Стабилизатор на 5 или 3.3? Или подать 7-9v на Vin и посмотреть тестером на Vcc.

Проверил. Точно 5В

а на кварце что написано?
и второе, может проц тактируется от внутреннего RC 8 мегагерц каким-то образом?
и третье - у простых простые неисправности у сложных - сложные (супруга подметила) )))

Вот про то, как тактируется процессор из фьюзов я не понял. В калькуляторе нет чётко 8МГц или 16МГц. Я выше привёл кусок из файла boards.txt. Там фьюзы написаны.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Для начала поменять кварц

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Для меги328: Cкетч заставит мигать светодиод с частотой 0,5Гц (1сек горит -1 погашен) при кварце 16МГц. Если в 2 раза медленнее, значит кварц на 8. Системные настройки типа F_CPU не используются и не влияют.

void setup(){
CLKPR = 1<<CLKPCE;
CLKPR = 0; 
TCCR1A=0; TIMSK1=(1<<TOIE1);
ICR1=31250; TCCR1B=1<<CS12;
DDRB|=1<<DDB5;
}
ISR (TIMER1_OVF_vect) {PORTB^=1<<PB5; }

void loop() {}

 

Ntrud
Offline
Зарегистрирован: 14.06.2015

   Подключите ардуино к компьютеру, откройте диспетчер устройств, найдите свой виртуальный СОМ порт и посмотрите в свойствах

установленную скорость порта компьютера. Должна быть 9600. Было давно такое, весь мозг вынесло, пока не нашел причину.

Гриша
Offline
Зарегистрирован: 27.04.2014

попробуйте установить MiniCore по ссылке все хорошо описано и понятно. И богатый выбор настроек.

Запишите загрузчик, а потом попробуйте блинк залить.

какая версия IDE?  

Ntrud пишет:

   Подключите ардуино к компьютеру, откройте диспетчер устройств, найдите свой виртуальный СОМ порт и посмотрите в свойствах

установленную скорость порта компьютера. Должна быть 9600. Было давно такое, весь мозг вынесло, пока не нашел причину.

это влияет на загрузку, но к настройке МК никакого отношения не имеет - а тут вообще ничего не понятно...

UPD загляните в эту тему, хоть пробегитесь по ней немного Всё про ATmega328PB

Green
Offline
Зарегистрирован: 01.10.2015

dimax пишет:

void setup(){
CLKPR = 1<<CLKPCE;
CLKPR = 0; 
TCCR1A=0; TIMSK1=(1<<TOIE1);
ICR1=31250; TCCR1B=1<<CS12;
DDRB|=1<<DDB5;
}
ISR (TIMER1_OVF_vect) {PORTB^=1<<PB5; }

void loop() {}


Казалось бы, при чём здесь ICR1? Да ещё с таким ужасным значением.)

Upper
Offline
Зарегистрирован: 23.06.2020

Наверное хотели особо точные часы сделать, но что то не сложилось.

If a fixed TOP value is required, the ICR1 Register can be used

У меня в протеусе "fixed TOP" не заработал, на железе не проверял.

TCCR1B=(1<<WGM13 | 1<<WGM12 | 1<<CS12);
ICR1=31250;

Обновлено. Для варианта с TOP value ICR1 надо использовать другое прерывание.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Значение нормальное 31250*256=8000000, а вот CTC режим не задействован.

Green
Offline
Зарегистрирован: 01.10.2015

Вот и я говорю, почему бы не написать хотя бы 8000000 / 256.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Помощь компилятору ...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Upper пишет:

Наверное хотели особо точные часы сделать, но что то не сложилось.

If a fixed TOP value is required, the ICR1 Register can be used

У меня в протеусе "fixed TOP" не заработал, на железе не проверял.

Код из поста #20 в протеусе работает на ура. 

Протеус 8.5 SP0 (build 22067)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

В примере действительно ошибка, вернее не ошибка, а лишняя строка. :) ICR там не на что не влияет -просто остался от другого примера.  Таймер считает до 65535, и уходит в прерывание. что с учётом делителя как раз около секунды и получается. 

Jaeger
Jaeger аватар
Offline
Зарегистрирован: 23.03.2018

brokly пишет:

А еще начинающие после работы с программатором неправильно возвращаются на UART бутлоадер, тупо не тот программатор в иде выбирают.

Стесняюсь спросить, а какой "правильный" программатор нужно выбирать?

Upper
Offline
Зарегистрирован: 23.06.2020

ЕвгенийП пишет:

Upper пишет:

У меня в протеусе "fixed TOP" не заработал, на железе не проверял.

Код из поста #20 в протеусе работает на ура. 

Протеус 8.5 SP0 (build 22067)

Из поста #20 у меня тоже работает, я писал про  "fixed TOP" не заработал,

Код прикреплен ниже.
Залил на плату - работает, в AtmelStudio7 тоже работает, а в Протеусе 8.6 SP2 светодиод не моргает. 

void setup(){
  CLKPR = 1<<CLKPCE;
  CLKPR = 0; 
  TCCR1A=0;
  TCCR1B=(1<<WGM13 | 1<<WGM12 | 1<<CS12);
  DDRB|=1<<DDB5;
  ICR1=31250;
  TIMSK1=(1<<ICIE1);
}
ISR (TIMER1_CAPT_vect) {PORTB^=1<<PB5;}

void loop() {}

 

СергейНСК
Offline
Зарегистрирован: 22.11.2014

Всем спасибо! Несколько интересных вещей тут прочитал, пригодятся.

Решил свою проблему переустановкой IDE и удалении папки c:\Users\USER\AppData\Local\Arduino15\. Грешу на неё, так как при обычной перестановке она оставалась, а в ней было 15 Гигов. В том числе много гигов логов и кэша.

После этого всё вернулось в нормальную работу.