ARV писал(а):в этом коде даже температура более 100 градусов не будет отрабатывать - у вас в самом начале стоит "если V < 3.7", а вы про больше 3.9 говорите.
В протеусе все работает, там сначала проверяется (V<3.7) или (V>3.7), если (V>3.7) то работает вот эта часть кода:
if (V > 3.9) // температура больше 125
TCCR2=0x6F;
else if (V < 2.95) // температура меньше 25
TCCR2 = 0x6B;
Такой код должен работать именно как заказано. При превышении верхней границы выставляем одно значение, при падении ниже нижней - другое. А посередине получается гистерезис.
WiseLord писал(а):
Такой код должен работать именно как заказано. При превышении верхней границы выставляем одно значение, при падении ниже нижней - другое. А посередине получается гистерезис.
Про гистерезис я как то не подумал, спасибо.
Сделал как положено, все работает, но не могу теперь светодиод поставить, у меня когда ШИМ (TCCR2=0x6B) моргает светодиод, но он моргает только когда (V > 3.9), а в момент остывания нет, а я бы хотел сделать чтоб он был привязан к TCCR2=0x6B.
Подскажите возможно ли это как-нибудь сделать? Заранее спасибо.
if (V > 3.9) // температура больше 125
{
TCCR2=0x6B;
PORTB.0=1;
delay_ms(312);
PORTB.0=0;
delay_ms(312);
}
else if (V < 2.95) // температура меньше 25
{
TCCR2 = 0x6E;
}
dm211 писал(а):2Kbytes Internal SRAM, наверно достаточно
Оно-то так, но всего года мы не видим - а вдруг там ещё куча массивов в ОЗУ?
2 массива по 84 int-а - это уже 16% RAM. А может Вы там в коде и другие большие массивы завели?
int *mp = massiv;
int *mk = kol1;
for (k=0;k<84;k++) {
*mp++ = *mk++;
}
Т.е. в том смысле, чтобы не отвлекаться на расчёты индексов. Тогда не важно, чему там равно k.
Если массив mk флеш-памяти, то указатель надо будет тоже объявлять как-то вроде int flash *mk. А вообще это ключевое слово flash в CodeVision - оно какое-то странное, и прячет реальную работу с памятью от пользователя. И кто знает, какие подводные камни там зарыты. То ли дело аналогичный pgm_read_word() в avr-gcc - там всё чётко.
После шима, как-то и не соображу. Хочу научиться управлять тиристорами по Zero-Cross. Я так понимаю, нужно регистр OCR2 дикрементировать? В общем буду благодарен за любую подсказку. Заранее спасибо.
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Jman писал(а):Хочу научиться управлять тиристорами по Zero-Cross.
Судя по всему, Zero-Cross вызывает EXT_INT0?
Далее включается таймер2, который, спустя заданное время, генерит прерывание, по которому вызывается код, выдающий импульс поджига на симистор. То есть, для начала, попробуйте плавно менять период таймера2. На следующем шаге можно будет учесть, что длительность полупериода непостоянна, то есть ее нужно все время измерять и отталкиваться именно от измеренной длительности, а не от расчетной.