CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Re: CodeVision AVR в вопросах и ответах

Сообщение kk042fjv »

ARV писал(а):в этом коде даже температура более 100 градусов не будет отрабатывать - у вас в самом начале стоит "если V < 3.7", а вы про больше 3.9 говорите.

В протеусе все работает, там сначала проверяется (V<3.7) или (V>3.7), если (V>3.7) то работает вот эта часть кода:

Код: Выделить всё

                     if (V<3.8)         //температура более 100 градусов         
                              {
                              TCCR2=0x6B;       
                              }
                              if (V>3.95)        //температура более 125 град.
                              {
                              TCCR2=0x6F;
                              }
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

Нет, там и правда со скобками не ладно.

А вообще, kk042fjv0, у if есть такая штука, как else:

Код: Выделить всё

if (V > 3.9)       // температура больше 125
  TCCR2=0x6F;
else if (V < 2.95) // температура меньше 25
  TCCR2 = 0x6B;

Такой код должен работать именно как заказано. При превышении верхней границы выставляем одно значение, при падении ниже нижней - другое. А посередине получается гистерезис.
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Re: CodeVision AVR в вопросах и ответах

Сообщение kk042fjv »

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;
}
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

Например, так

Код: Выделить всё

unsigned char blinkFlag = 0;

void blink() {
  PORTB.0=1;       
  delay_ms(312);   
  PORTB.0=0;
  delay_ms(312);
}

int main() {
  ...

  if (V > 3.9) {         // температура больше 125
    TCCR2=0x6B;
    blinkFlag = 1;
  } else if (V < 2.95) {   // температура меньше 25
    TCCR2 = 0x6E;
    blinkFlag = 0;
  }

  if (blinkFlag)
    blink();

  ...
}
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Re: CodeVision AVR в вопросах и ответах

Сообщение kk042fjv »

Добрый день!
Возник у меня еще вопрос, уже на практике. С вывода Atmega8 (PB2) выходит ШИМ частота 60Гц заполнение импульса 25%

Код: Выделить всё

 TCCR1A=0x21;
 TCCR1B=0x0C;        //частота 60Гц 
 TCNT1H=0x00;
 TCNT1L=0x00;
 ICR1H=0x00;
 ICR1L=0x00;
 OCR1AH=0x00;
 OCR1AL=0x00;
 OCR1BH=0x00;
 OCR1BL=0x40;    // заполнение периода 25%
        ...
if (V < 3){
TCCR1B=0x0C;
}
else if{
TCCR1B=0x00;
}   

Вопрос: иногда при V>3 когда ШИМ откл с вывода выходит 0, как мне и надо, иногда 1
Где ошибка подскажите?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

А к чему относится if в третьей с концв строке? Что за условие такое пустое?
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Re: CodeVision AVR в вопросах и ответах

Сообщение kk042fjv »

Код: Выделить всё

if (V < 3){
TCCR1B=0x0C;
}
else if(V >= 3){
TCCR1B=0x00;
}

При выходе с выхода лог. 1 транзистор получится открытый будет.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: CodeVision AVR в вопросах и ответах

Сообщение Pnjom-Penb »

Что подразумевает этот фрагмент кода?

Код: Выделить всё

...
} else if{
TCCR1B=0x00;
}

Что, CodeNiQaNeVision и в самом деле проглатывает такое неприличное предложение?
Ладно, допустим это как-то работает...
kk042fjv писал(а):... С вывода Atmega8 (PB2) выходит ШИМ частота 60Гц заполнение импульса 25%

Код: Выделить всё

...
 OCR1BL=0x40;    // заполнение периода 25%
...

иногда при V>3 когда ШИМ откл с вывода выходит 0, как мне и надо, иногда 1
Во-первых - с какого вывода? С того же, где ШИМ? Допустим, что с него...
Проверьте - единица выпадает с вероятностью 0.25?
kk042fjv писал(а):Где ошибка подскажите?

Если нужна только единица, сделайте коэффициент заполнения 100% - будет вам единица. Соответственно, к-т заполнения 0% даст нолик.
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dm211 »

Бля,что за херня-не могу понять, в самом начале перед основным циклом ставлю цикл и не выходит из этого цикла :shock:

Код: Выделить всё

 for(k=0;k<84;k++){massiv[k]= kol1[k];} 
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

Ничего криминиального в этом коде нет.

Памяти (RAM) свободной достаточно?
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dm211 »

Ну в даташите на мега32 написано 2Kbytes Internal SRAM, наверно достаточно.
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dm211 »

Так проходит цикл-

Код: Выделить всё

 for(k=0;k<2;k++){massiv[k]= kol1[k];} 

а так-не выходит-

Код: Выделить всё

 for(k=0;k<20;k++){massiv[k]= kol1[k];} 

Что это значит?
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dm211 »

связано с int и char , если оба массива char , то не зависает, но мне int нужен, цифры в массиве больше 256.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

dm211 писал(а):2Kbytes Internal SRAM, наверно достаточно
Оно-то так, но всего года мы не видим - а вдруг там ещё куча массивов в ОЗУ?
2 массива по 84 int-а - это уже 16% RAM. А может Вы там в коде и другие большие массивы завели?
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dm211 »

Массивы не в озу, во флэш засунул, только вот этот massiv[] в озу.

Да думаю,с озу это связано, ведь int больше памяти требует. :(
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dm211 »

Значит ли это,что это-невозможная задача? Какие выходы есть?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

Массив в flash памяти константный, в него писать нельзя.

А почему бы не сделать, например, как-то так:

Код: Выделить всё

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 - там всё чётко.
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Jman »

Всем привет, есть код. Нашел на просторах. Управление симистором. Подскажите, как сделать плавное включение в течении например 10 секунд?

Код: Выделить всё

#include <mega8.h>
#include <delay.h>

// Timer2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
   //подаем импульс на симистор
    PORTD.7 = 1;
    delay_us(50);
    PORTD.7 = 0;
    TCCR2 = 0;
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
    TCNT2=0x00;  //обнуляем таймер
    TCCR2=(1<<CS22) | (1<<CS21) | (0<<CS20);  //включаем таймер
    PORTD.7 = 0; //выключаем ножку
}
void main(void)
{
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(1<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: Off
GICR|=(0<<INT1) | (1<<INT0);
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (1<<ISC00);
GIFR=(0<<INTF1) | (1<<INTF0);

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: CTC top=OCR2A
// OC2 output: Disconnected
// Timer Period: 4,992 ms
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (1<<CTC2) | (1<<CS22) | (1<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(1<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

// Global enable interrupts
#asm("sei")

while (1)
      {
      }
}

После шима, как-то и не соображу. Хочу научиться управлять тиристорами по Zero-Cross. Я так понимаю, нужно регистр OCR2 дикрементировать? В общем буду благодарен за любую подсказку. Заранее спасибо.
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: CodeVision AVR в вопросах и ответах

Сообщение Pnjom-Penb »

Jman писал(а):Хочу научиться управлять тиристорами по Zero-Cross.
Судя по всему, Zero-Cross вызывает EXT_INT0?
Далее включается таймер2, который, спустя заданное время, генерит прерывание, по которому вызывается код, выдающий импульс поджига на симистор. То есть, для начала, попробуйте плавно менять период таймера2. На следующем шаге можно будет учесть, что длительность полупериода непостоянна, то есть ее нужно все время измерять и отталкиваться именно от измеренной длительности, а не от расчетной.
Ответить

Вернуться в «AVR»