Прежде всего, вы должны сделать start
равным volatile
, так как он используется как главным циклом, так и прерыванием.Ключевое слово volatile
сообщает компилятору о том, что переменная может быть изменена вне ее контроля, поэтому она не может оптимизировать чтение или запись в переменную:
volatile bool start = false;
Во-вторых, вы, вероятно, захотите удалить эту строку, которую вы написали в конце loop
:
while(1){}
Эта строка плохая, поскольку она заставляет вашу программу идти в бесконечный цикл, где она ничего не делает.Я думаю, что вы действительно хотите, чтобы код, который вы написали об этом в функции loop
, выполнялся несколько раз.
Во-вторых, после того, как вы обнаружите, что установлен флаг start
, вам, вероятно, нужно установить его на0, иначе это будет просто навсегда.
В-третьих, установка start
в false в INT0 ISR может быть плохой идеей, потому что она может быть установлена в false, прежде чем у вашего основного цикла появится шанснаблюдать, как это правда, и справиться с событием.Я думаю, это действительно зависит от того, что вы пытаетесь сделать.Вы можете попытаться добавить детали к своему вопросу о том, какую именно проблему вы пытаетесь решить с помощью AVR.См. В чем проблема XY? .
Вероятно, существуют другие проблемы с вашим кодом, которые необходимо отладить.Можете ли вы придумать какие-нибудь способы сделать это проще?Может быть, вы можете уменьшить количество используемых прерываний.Для отладки вы можете попробовать мигать несколькими светодиодами, чтобы выяснить, какие части вашей программы выполняются.