Странное последовательное поведение на atmega2560
ПРАВКА Похоже, это как-то связано с осцилляторами. Переключение на внутренний генератор и запись прямого avr-c позволяет мне запустить базовую программу blink. Написание одного и того же базового мигания в arduino и мигание с помощью IDE (через последовательный порт или usbasp) приводит к нефункциональной программе. Я хотел бы иметь возможность использовать генератор потому что не похоже что я могу сделать все вовремя на частоте 8 МГц
У меня есть arduino mega 2560, который несколько недель назад работал нормально. Теперь я пытаюсь вывести из него некоторые данные и разбил их на очень - очень простое доказательство концепции:
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("hello");
}
Это отпечатки:
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
бесконечность на экране. Если я меняю бод на 115200, то получаю "привет" и новую строку, а потом медленно начинаю получать мусор. Если я переключусь на 234500, то получу несколько отпечатков, а потом ничего.
Добавление задержки после печати не изменяет частоту последовательной печати:
void loop() {
// put your main code here, to run repeatedly:
Serial.println("hello");
delay(100000);
}
Они по-прежнему приходят немедленно.
У меня такое чувство, что это как-то связано с хронометражем прерывания, но я ничего не настраиваю. Я планирую перепрошить и починить предохранители, но мой кабель USBasp прямо сейчас сломан. Есть еще какие-нибудь соображения по поводу того, что здесь может происходить?
Правка: Это происходит на двух разных платах. Первоначально у меня было несколько устройств i2c (mag/gryo/barometer) на борту, но они с тех пор были удалены. Я попробовал два разных USB - кабеля в двух разных USB-портах. Это может быть на стороне хозяина?
Правка: И TX, и Rx огни тверды все это время. Как будто есть петля. Мой другой ноутбук сейчас даже не загрузится. Я обеспокоен тем, что волна от шторма прошлой ночью, возможно, вывела из строя обе эти машины
Больше испытаний: Глядя на выход в области, плата фактически выводит только символ "h". Если я это сделаю:
Serial.println('U');
delay(1000);
Я получаю квадратную волну, так что задержка не работает вообще. Если я это сделаю: Serial.println('U'); Serial.println('U'); //или любая другая задержка символов(1000);
Я получаю символ U поверх области, а затем пустой последовательный кадр. Задержка по-прежнему не выполняется, но похоже, что второй println выходит.
Даже сжигание нового загрузчика терпит неудачу на этих платах
@Brydon Gibson, 👍1
Обсуждение1 ответ
Лучший ответ:
Отвечая на мой собственный вопрос - здесь немного стыдно.
Я отключил внутренний TIMER0_OVF_vect в коде ядра arduino, чтобы написать свой собственный (для другого проекта). Я завернулся в #if 0, чтобы пойти и принести его обратно, когда он мне понадобится.
Сегодня я узнал, что прерывания atmega по умолчанию не заполняются IRET, а вместо этого попадают в вектор сброса, сбрасывая плату. Все, что я скомпилировал в этой библиотеке, сбрасывалось всякий раз, когда TIMER0 переполнялся, потому что мои ifdefs также не покрывали настройку TIMSK в ядре arduino
"Serial.println не выходит" на самом деле означало "плата сбрасывается до завершения работы" и объясняет, почему более быстрые боды могут печатать больше данных.
Иногда не намного умнее безволосых обезьян.
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Это действительно похоже на какую-то аппаратную проблему. Я видел чипы Uart, вызывающие странный выход и действующие так, как будто у них есть петля, но только на реальных Uart, а не на USB-устройствах., @PMF
Была ли какая-нибудь из плат Atmega подключена к чему-либо во время скачка напряжения? Был ли главный компьютер подключен к источнику питания? Это действительно звучит так, как будто общий элемент-это USB вашего компьютера. Не могли бы вы попробовать использовать другой физический USB-порт на ноутбуке? Другой ноутбук?, @JRobert
Я почистил обе платы щеткой, чтобы исключить короткие замыкания. Я бы принял аппаратный сбой, но две ранее работающие платы в один и тот же день?, @Brydon Gibson
платы @jrobert не питались, ноутбук заряжался. Мой другой ноутбук (также заряжающийся) сегодня не загрузится, что усиливает мои подозрения, @Brydon Gibson
добавьте
Serial.println("world"); delay(5000);
в свой код, @jsotola@jstola проблема здесь в том, что он никогда не выходит из оригинальной серийной печати. Мне нужно прочитать код ядра Arduino (и/или просто закодировать его в прямом avr-c), чтобы увидеть, что происходит с обработкой ошибок и почему последовательная печать никогда не выходит, @Brydon Gibson
Это помогло бы напечатать что-то определенное в " setup ()", чтобы узнать, сбрасываются ли платы., @timemage
Подумайте о проведении теста обратной петли. Подключите
СБРОС
кGND
, а " D0 "- к "D1". Это удержит ATmega2560 в состоянии сброса, чтобы он не мешал. В идеале "D0` и" D1 " должны быть соединены малозначимым резистором, скажем, 330 Ом, чтобы защитить устройство от случайного выхода 2560 из режима сброса. Когда подключены " D0 " и "D1", то, что вы посылаете, вы должны получать с любой из стандартных скоростей передачи в бодах. Это скажет вам кое-что о том, находятся ли они до или после последовательного приемопередатчика., @timemage