-
Posts
1565 -
Joined
-
Last visited
Content Type
Profiles
Forums
Blogs
Posts posted by Goodefine
-
-
По стандарту это неопределенность, и как видно из примера, не только по нему но и в реальной ситуации.
0 -
Но в моем примере переполнение не возникает и даже близко к нему не подходит.
Но компилятор не знает что оно не происходит. Квалификатор volatile ему говорит, что переменная может изменится в любой момент без его ведома, т.е. условие на проверку и обнуление ничего не дает, с точки зрения видения компилятором переполнения знаковой переменной. А как вы видели из примера выше, важно не то, что переполнение наступает, а то что об этом думает компилятор.
0 -
Да нет тут неопределенности! То, что при переполнениии знаковое целое может стать -32768, это нормальное поведение,
Вы ссылку смотрели? Оно может стать чем угодно, более того, логика работы программы, может быть изменена до неузнаваемости. Это наступает еще на этапе компиляции, когда целые куски кода могут быть выкинуты или неадекватно изменены. Поэтому рассуждения, чего там переменная достигает, а чего нет - мимо. В данном случае, пути компилятора, вообще, неисповедимы. Это гораздо более опасно, чем неатомарность доступа, ибо диагностируется куда труднее.. Конечно, можете и далее, если хотите, писать знаковое++, дело хозяйское.
0 -
Атомарность доступа это совершенно другая другая сторона медали, безусловно, о ней нужно помнить. А насчет signed x ... x++; - это и есть неопределенность, с возможными необъяснимыми глюками, например
0 -
При чем тут запрещены? В вашем примере как раз упор на инкремент в прерывании. Непосредственно к прерываниям относится использование квалификатора volatile. Во втором случае прерывания не при чем - неопределенность в переполнении знакового числа.
0 -
... if(y==0x0202)y=0; //"почему-то" y может оказаться 0x0003, 0x0200 или сравнение может не сработать вовсе (в зависимости от компилятора с фазы Луны) }
В принципе ничего удивительного нет, ибо undefined behaviour ...
0 -
Если ацп 8-битный, то всего 256 возможных значений. Потому создаете массив с 256 элементами, и ложите в него требуемую скважность (например при половине напряжения результат АЦП - 127, скважность должна быть к примеру 30, это значит что элемент с порядковым номером 127 должен содержать с себе число, задающее скважность 30). извлекаете элементарно:
скважность=массив[результат преобразования ацп]
0 -
а как быть если...
Либо два проекта в соответствующих папках, либо все исходники в общей папке, на время отладки
0 -
Т.е. не мигает больше? Отладка - под протеусом, для авр. Для stm - отладочные железки, но честно говоря, поменял бы их на протеус, если б там были эти камни. В нем видно все...
0 -
ISR(TWI_vect) в модуле twi есть, но похоже компилятор не понимает что это обработчик и считает что это обычная функция. Почему так, если нет прототипа в хидере, х/з.. В листинге код обработчика есть, но оформлен он в виде обычной функции и на него вроде нет переходов (оптимизация выключена?). Можно попробовать в модуль TWI_Master.c добавить #include <avr/interrupt.h>, по идее должен тогда понять что это обработчик. Насчет отладчика не знаю - студийным никогда не пользовался.
0 -
При отладке и коду видно, что библиотека включает прерывания по TWI.
void TWI_Start_Transceiver_With_Data( unsigned char *msg, unsigned char msgSize ) { unsigned char temp; while ( TWI_Transceiver_Busy() ); // Wait until TWI is ready for next transmission. TWI_msgSize = msgSize; // Number of data to transmit. TWI_buf[0] = msg[0]; // Store slave address with R/W setting. if (!( msg[0] & (TRUE<<TWI_READ_BIT) )) // If it is a write operation, then also copy data. { for ( temp = 1; temp < msgSize; temp++ ) TWI_buf[ temp ] = msg[ temp ]; } TWI_statusReg.all = 0; TWI_state = TWI_NO_STATE ; TWCR = (1<<TWEN)| // TWI Interface enabled. (1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag. (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| // Initiate a START condition. (0<<TWWC); // }
Поскольку обработчик прерывания в программе отсутствует как класс (не описан), да и не только он, то таблица векторов в листинге состоит из заглушек, ведущих на jmp, отсылающий на начало программы (практически сброс, только без переинициализации периферии).
00000000 <__vectors>: 0: 0c 94 34 00 jmp 0x68 ; 0x68 <__ctors_end> 4: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 8: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 10: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 14: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 18: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 1c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 20: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 24: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 28: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 2c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 30: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 34: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 38: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 3c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 40: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 44: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 48: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 4c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 50: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 54: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 58: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 5c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 60: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> 64: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt> .... 000000a2 <__bad_interrupt>: a2: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
Возможно в какой-то момент происходит прерывание по событию spi, дальше путь такой: вектор-заглушка-начало программы. Проверить просто - нужно добавить обработчик прерывания по twi, хотя бы пустой.
0 -
Чтоб не запутать начинающего, следует сказать что PINB надо заменить на PORTB, иначе мигать не будет ))
1 -
Код смотреть некогда, но вероятно, потому что функция где то зависает в вечном цикле ожидая какого либо флага от twi, а мигает - скорее всего потому что ресетится контроллер, по причине сторожевого таймера либо еще какой... Учитесь пользоваться мощнейшими средствами отладки, которые предоставляет Протеус - шагайте по программе, смотрите переменные, делайте точки останова и прочее. Загружать в МК хекс файл в Протеусе при живом проекте... ну это как смотреть кино в сварочной маске...
0 -
А с чего вы взяли что условие игнорируется?
if(flags.ready_to_display){
00000447 SBRC R24,0 Skip if bit in register cleared
00000448 RJMP PC+0x0062 Relative jump
Если бит равен 1, то идет скачок на подпрограмму. Смотрите что там
0 -
Игнорируется потому что переменная не меняется после инициализации - компилятор ее заоптимизировал. Если переменная планируется в обработчике, volatile поможет. В других случаях условие само появится, если будет нужно конечно.
0 -
Найдите в доме розетку и включите. Если слишком боязно, то через автомат подходящий.
0 -
Это, вообще-то, не осциллограф...
0 -
Делаете источник тока 1ma, затеем набор коммутируемых резисторов 1 - 10 Ом. Резисторы брать 1%, ток легко настраивается при помощи мультиметра.
0 -
решённая изменением фьюза RSTDISBL на значение (0)programmed
На живом контроллере так же решать будете?.. ))
0 -
Господа критики, все там нормально - почитайте для чего нужен РММ-47:
Минимальное напряжение срабатывания — 165±10 В, максимальное напряжение срабатывания — 265±10 В. Присоединение к автоматическому выключателю производится справа..
Используется только для работы с одно-, двух-, трехполюсными выключателями типа ВА47-29, ВА47-29М и одно-, двухполюсными выключателями типа ВА47-100
Соответственно, предназначен он для работы в многофазной системе (или можете предложить вариант использования трехполюсного автомата в однофазной?).
Его задача защищать не от обрыва фазы (это, кстати, не самое страшное - ну точило в гараже будет медленнее обычного крутиться под нагрузкой и т.п.) - а в основном от перекоса фаз, когда он проявляется на всех фазах, где повышением, где занижением.
ЗЫ. Такое ощущение, что защиту не в гараж обсуждают, а куда-нибудь на станцию атомную ))). Раньше, вообще, двумя пробками обходились, и ничего. Другими словами, какой объект, такая и защита.
0 -
Goodefine, не рубите с плеча - Вы даже представить себе не можете весь ужас того , что с резистором предлагаете ..
Да все я представляю. Энергетически, разумеется, Ваша схема экономичнее чем с резистором, а функционально - практически аналог. Плавающее напряжение в неопределенных пределах, зависящих от фазы луны - это плохо. Зарядник - слишком прецизионное устройство, чтоб применять такие решения.
0 -
и то что у него , при увеличении тока зарядки снижается напряжение это есть его ГЛАВНОЕ достоинство...
Чего за бред? Что это даст? Резистор поставьте на выход любого БП, напряжение тоже снижаться будет при увеличении тока.
0 -
..у меня есть ответы на все Ваши вопросы , но Вы их не получите..
"У нас есть такие приборы, но мы вам про них не расскажем..." (с) )))
0 -
Оптимизацию не забыли включить?
0
Кто на чем чаще пишет для AVR и не только?
in AVR
Posted
А это не одно и то же?
Конкретный код, конкретного компилятора.... Я вам указал потенциальный баг, дальше как хотите. На светофоре тоже на красный иногда получается проскочить