Jump to content

Goodefine

Members
  • Posts

    1565
  • Joined

  • Last visited

Posts posted by Goodefine

  1. Что это за бред? Volatile говорит, что переменная хранится в ОЗУ и может измениться в любой момент.

    А это не одно и то же?

    Между прочим, проверил дизассемблерный код обоих вариантов

    Конкретный код, конкретного компилятора.... Я вам указал потенциальный баг, дальше как хотите. На светофоре тоже на красный иногда получается проскочить

  2. Но в моем примере переполнение не возникает и даже близко к нему не подходит.

    Но компилятор не знает что оно не происходит. Квалификатор volatile ему говорит, что переменная может изменится в любой момент без его ведома, т.е. условие на проверку и обнуление ничего не дает, с точки зрения видения компилятором переполнения знаковой переменной. А как вы видели из примера выше, важно не то, что переполнение наступает, а то что об этом думает компилятор.

  3. Да нет тут неопределенности! То, что при переполнениии знаковое целое может стать -32768, это нормальное поведение,

    Вы ссылку смотрели? Оно может стать чем угодно, более того, логика работы программы, может быть изменена до неузнаваемости. Это наступает еще на этапе компиляции, когда целые куски кода могут быть выкинуты или неадекватно изменены. Поэтому рассуждения, чего там переменная достигает, а чего нет - мимо. В данном случае, пути компилятора, вообще, неисповедимы. Это гораздо более опасно, чем неатомарность доступа, ибо диагностируется куда труднее.. Конечно, можете и далее, если хотите, писать знаковое++, дело хозяйское.

  4. При чем тут запрещены? В вашем примере как раз упор на инкремент в прерывании. Непосредственно к прерываниям относится использование квалификатора volatile. Во втором случае прерывания не при чем - неопределенность в переполнении знакового числа.

  5. Если ацп 8-битный, то всего 256 возможных значений. Потому создаете массив с 256 элементами, и ложите в него требуемую скважность (например при половине напряжения результат АЦП - 127, скважность должна быть к примеру 30, это значит что элемент с порядковым номером 127 должен содержать с себе число, задающее скважность 30). извлекаете элементарно:

    скважность=массив[результат преобразования ацп]

  6. ISR(TWI_vect) в модуле twi есть, но похоже компилятор не понимает что это обработчик и считает что это обычная функция. Почему так, если нет прототипа в хидере, х/з.. В листинге код обработчика есть, но оформлен он в виде обычной функции и на него вроде нет переходов (оптимизация выключена?). Можно попробовать в модуль TWI_Master.c добавить #include <avr/interrupt.h>, по идее должен тогда понять что это обработчик. Насчет отладчика не знаю - студийным никогда не пользовался.

  7. При отладке и коду видно, что библиотека включает прерывания по 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, хотя бы пустой.

  8. Код смотреть некогда, но вероятно, потому что функция где то зависает в вечном цикле ожидая какого либо флага от twi, а мигает - скорее всего потому что ресетится контроллер, по причине сторожевого таймера либо еще какой... Учитесь пользоваться мощнейшими средствами отладки, которые предоставляет Протеус - шагайте по программе, смотрите переменные, делайте точки останова и прочее. Загружать в МК хекс файл в Протеусе при живом проекте... ну это как смотреть кино в сварочной маске...

  9. Игнорируется потому что переменная не меняется после инициализации - компилятор ее заоптимизировал. Если переменная планируется в обработчике, volatile поможет. В других случаях условие само появится, если будет нужно конечно.

  10. Господа критики, все там нормально - почитайте для чего нужен РММ-47:

    Минимальное напряжение срабатывания — 165±10 В, максимальное напряжение срабатывания — 265±10 В. Присоединение к автоматическому выключателю производится справа..

    Используется только для работы с одно-, двух-, трехполюсными выключателями типа ВА47-29, ВА47-29М и одно-, двухполюсными выключателями типа ВА47-100

    Соответственно, предназначен он для работы в многофазной системе (или можете предложить вариант использования трехполюсного автомата в однофазной?).

    Его задача защищать не от обрыва фазы (это, кстати, не самое страшное - ну точило в гараже будет медленнее обычного крутиться под нагрузкой и т.п.) - а в основном от перекоса фаз, когда он проявляется на всех фазах, где повышением, где занижением.

    ЗЫ. Такое ощущение, что защиту не в гараж обсуждают, а куда-нибудь на станцию атомную ))). Раньше, вообще, двумя пробками обходились, и ничего. Другими словами, какой объект, такая и защита.

  11. Goodefine, не рубите с плеча - Вы даже представить себе не можете весь ужас того , что с резистором предлагаете ..

    Да все я представляю. Энергетически, разумеется, Ваша схема экономичнее чем с резистором, а функционально - практически аналог. Плавающее напряжение в неопределенных пределах, зависящих от фазы луны - это плохо. Зарядник - слишком прецизионное устройство, чтоб применять такие решения.

  12. и то что у него , при увеличении тока зарядки снижается напряжение это есть его ГЛАВНОЕ достоинство...

    Чего за бред? Что это даст? Резистор поставьте на выход любого БП, напряжение тоже снижаться будет при увеличении тока.

×
×
  • Create New...