Странное последовательное поведение на 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 выходит.

Даже сжигание нового загрузчика терпит неудачу на этих платах

, 👍1

Обсуждение

Это действительно похоже на какую-то аппаратную проблему. Я видел чипы 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


1 ответ


Лучший ответ:

1

Отвечая на мой собственный вопрос - здесь немного стыдно.

Я отключил внутренний TIMER0_OVF_vect в коде ядра arduino, чтобы написать свой собственный (для другого проекта). Я завернулся в #if 0, чтобы пойти и принести его обратно, когда он мне понадобится.

Сегодня я узнал, что прерывания atmega по умолчанию не заполняются IRET, а вместо этого попадают в вектор сброса, сбрасывая плату. Все, что я скомпилировал в этой библиотеке, сбрасывалось всякий раз, когда TIMER0 переполнялся, потому что мои ifdefs также не покрывали настройку TIMSK в ядре arduino

"Serial.println не выходит" на самом деле означало "плата сбрасывается до завершения работы" и объясняет, почему более быстрые боды могут печатать больше данных.

Иногда не намного умнее безволосых обезьян.

,