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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

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

Сообщение hd44780 »

cat-dog-god0 писал(а):А в каком месте программы настраиваются порты на вход/выход ???


См. даташит.

например, DDRA = 0x01 - бит 0=1 - нога 0 - выход. Если в бите 0 - вход.
Реклама
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

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

Сообщение *Trigger* »

cat-dog-god0 писал(а):Абстрактный вопрос. МК зажигает 4 светодиода (скажем эффект бегущего огня), как кнопкой менять частоту эффекта ???

Светодиоды зажигать в прерывании по таймеру в режиме сравнения. В основном цикле опрашивать кнопку и при нажатии изменять значение регистра сравнения таймера в нужную сторону (увеличивать или уменьшать). Ещё следить за тем, чтобы регистр сравнения принимал только значения в определённом диапазоне.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Реклама
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

пытаюсь переделать один проект "под себя" - термометр на динамике
Лишнее повырезал, теперь вот есть 2 вопроса
При всключении термометра
delay_ms(100);
str[0] = '.';
str[1] = '';
str[2] = '';
str[3] = '';
delay_ms(500);
str[0] = '';
str[1] = '.';
str[2] = '';
str[3] = '';
delay_ms(500);
str[0] = '';
str[1] = '';
str[2] = '.';
str[3] = '';
delay_ms(500);
str[0] = '';
str[1] = '';
str[2] = '';
str[3] = '.';
delay_ms(500);

- "бежит" точка, возможно ли сократить?

второе, как-то странно выводится температура на сегменты - нет постоянно горящих 4 цифр\знаков. происходит поочерёдное включение сегментов. Как победить?

while (1)
{
for (i=0;i<devices;i++)
{

#asm("cli");
znach=ds1820_temperature_10(&rom_codes[i][0])/10;
#asm("sei");
itoa((int)znach, str);
str1[0] = '+';
strcat(str, str1);
delay_ms(5);

};
};
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

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

Сообщение hd44780 »

levaclaus писал(а):При всключении термометра
.............
str[0] = '.';
str[1] = '';
str[2] = '';
str[3] = '';
........
- "бежит" точка, возможно ли сократить?


Так в детском саде пишут. А если у Вас будет 30-значный дисплей? 30 одинаковых операторов будете писать?

char str[5];

strcpyf(str, ". ");
strcpyf(str, " . ");
strcpyf(str, " . ");
strcpyf(str, " .");

delay между ними подразумеваются. От них не избавишься ...

Про динамическую индикацию сложно и долго рассказывать.
Прилагаю описание собственного градусника с динамической индикацией - если хотите - смотрите. Девайс успешно работал в течении года, пока я его не разломал в целях модернизации.
Теперь он у меня сделан иначе ...
Вложения
Termometer.zip
(100.38 КБ) 182 скачивания
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

ясно. спасибо.
а как победить почерёдное переключение матриц?
Реклама
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

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

Сообщение hd44780 »

Ваш код вроде нормальный.
Но я бы не стал связываться с itoa, потом плюсик этот приклеивать...
Используйте sprintf. All-In-One. И гораздо удобнее. На мой взгляд.

Переключения тут никакого нет, это надо смотреть код, который реально выгоняет цифры из буфера str на дисплей. Косяки явно там ...

Посмотрите мой пример, там есть прерывание таймера, которое это всё делает.
Реклама
Аватара пользователя
zhu4er
Вымогатель припоя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

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

Сообщение zhu4er »

Посмотри как это делается у меня: http://mklab.com.ua/2011/11/to4niy-termostt/
Даже у стен есть уши...
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

zhu4er, у вас точка выводится, или десятых нет?

hd44780
спасибо, интересен пример на sprintf, покажите

и всё же хотелось бы добить исходник
мне немножко не понятен способ вывода точки, в переменной строки ведь храниться число с точкой... Счас есть массив десятков+единиц без точки. Надо что-ли ещё массив единиц типа 0.-9. создавать?

вот код

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

#include <tiny2313.h>
#include <stdlib.h>
#include <ctype.h>
#include <delay.h>
#include <string.h>
#asm
   .equ __w1_port=0x12 ;PORTD
   .equ __w1_bit=2
#endasm
#include <1wire.h>
#include <ds1820.h>
#include <delay.h>
#define MAX_DEVICES 6
unsigned char rom_codes[MAX_DEVICES][9];

unsigned char digit_ar[15]      =  {
                                    0b11111100,     //0
                                    0b01100000,     //1
                                    0b11011010,     //2
                                    0b11110010,     //3
                                    0b01100110,     //4
                                    0b10110110,     //5
                                    0b10111110,     //6
                                    0b11100000,     //7
                                    0b11111110,     //8
                                    0b11110110,     //9
                                    0b00000001,     //.
                                    0b00000000,     // empty
                                    0b00000010,     //-
                                    0b11000110,     //*
                                    0b01101110      //N
                                    };
                                     


unsigned char SPlace_ar[4]      = { 0b01000000,
                                    0b00100000,
                                    0b00010000,
                                    0b00001000};

//unsigned char str[5];
//Ãëîáàëüíàÿ ïåðåìåííàÿ äëÿ õðàíåíèÿ ñòðîêè âûâîäà
unsigned char str[4];
//Íîìåð çíàêîìåñòà
unsigned char SignPlace = 0;

void avr_init(void);

//Timer 0 interrupt
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
    unsigned char m;
    bit c;
   
    TCNT0  = 0;
   
    if (str[SignPlace] == '.') {
        m = 10;
        c   = 1;
    };
    if (str[SignPlace] == '+') {
        m = 13;
        c   = 1;
    };
    if (str[SignPlace] == '-') {
        m = 12;
        c   = 1;
    };   
    if (str[SignPlace] == 'N') {
        m = 14;
        c   = 1;
    };
    if (isprint(str[SignPlace]) == 0) {
        m = 11;
        c   = 1;
    };
   
    if (c == 0) {
        m   = toint(str[SignPlace]);
    }
                           
    PORTD   = 0;
    PORTB   = 0;
    PORTB   =   digit_ar[m];
    PORTD   =   SPlace_ar[SignPlace];
   
    c = 0;
    SignPlace = SignPlace + 1;
    if (SignPlace == 4) SignPlace = 0;


void main(void)
{
    float znach;
    unsigned char i,devices;
    unsigned char str1[3];

    avr_init();
   
    #asm("cli");
    devices=w1_search(0xf0,rom_codes); 
    #asm("sei");
   
       
    if (devices == 0) {
        strcpyf(str, "Err.");
        while (1);
    } else {
     strcpyf(str, "N118");  //âûâåñòè ñòðîêó ÍÈÈÁ
     };
     delay_ms(2000);

    while (1)
            {
                 for (i=0;i<devices;i++)
                 { 
                 
                    #asm("cli");
                    znach=ds1820_temperature_10(&rom_codes[i][0])/10;
                    #asm("sei");
                    itoa((int)znach, str);
                    str1[0] = '+';
                    strcat(str1, str);
                    delay_ms(5);
                    };
                   
            };
}

void avr_init(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port D initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0x7F;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x02;//(2)
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;


#asm("sei")
}
alex_avr
Родился
Сообщения: 3
Зарегистрирован: Вс янв 30, 2011 17:41:56

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

Сообщение alex_avr »

Есть вот такая программа:


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

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

unsigned char x;

unsigned char y;

unsigned char status[4] = { 0b10000001,
                        0b01000010,
                        0b00100100,
                        0b00011000 };

unsigned char status2[4] = { 0b11111111,
                        0b01111110,
                        0b00111100,
                        0b00011000 };   

interrupt [EXT_INT0] void ext_int0_isr(void)
{
x=++x;           
    switch (x)
    {
    case 1:
     
     for(y=0;y<3;y++)
            {
                PORTB=status[y];    //output data
                delay_ms(300);  //wait for some time
            }
            PORTB=0;           
           
    break;
    case 2:
    for(y=0;y<3;y++)
            {
                PORTB=status2[y];    //вывод информации
                delay_ms(300);  //задержка
            }
           x=0;
      }
return;
}

// Declare your global variables here

void main(void)
{

// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

PORTD=0xFF;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;



// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: Off
GICR|=0x40;
MCUCR=0b0000011;;
GIFR=0b01000000;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;


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

while (1)
      {
     

      };
}


Столкнулся с проблемой что не могу сделать функции с бесконечным циклом. Если ставлю While(1) то прерывание перестает работать/ Прилагаю исходник и фаил в Proteus 7.6. товарищи коты помогите пожалуйста.
for(y=0;y<3;y++)
{
PORTB=status[y]; //output data
delay_ms(300); //wait for some time
}
PORTB=0; //turn off all LEDs
Вложения
new project.zip
(40.29 КБ) 141 скачивание
ipf
Встал на лапы
Сообщения: 131
Зарегистрирован: Вт сен 20, 2011 18:41:41
Откуда: Вьетнам

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

Сообщение ipf »

Ув. коты . Подскажите пожалуйста. мне нужно чтобы при нажатии кнопки на PINB.1 в коде изменялось определенное значение. Например с 0x00 на 0xFF. Насколько я понял нужно хранить эти значения в массиве, и если кнопка нажимается то подставлять вместо одного другое. Подскажите как лучше сделать на Codevisionavr

Тоесть я создаю масив

flash unsigned char mas[] = {0xFF,0x00};

а вот как при нажатии кнопки подставить значение из масива
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

ururur писал(а):Ув. коты . Подскажите пожалуйста. мне нужно чтобы при нажатии кнопки на PINB.1 в коде изменялось определенное значение. Например с 0x00 на 0xFF. Насколько я понял нужно хранить эти значения в массиве, и если кнопка нажимается то подставлять вместо одного другое. Подскажите как лучше сделать на Codevisionavr

Тоесть я создаю масив

flash unsigned char mas[] = {0xFF,0x00};

а вот как при нажатии кнопки подставить значение из масива

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

char x;
if (PINB.1==0) x=0xFF;

При нажатии на кнопку переменной x присваивается значение 0xFF
«И всё-таки она вертится!»
ipf
Встал на лапы
Сообщения: 131
Зарегистрирован: Вт сен 20, 2011 18:41:41
Откуда: Вьетнам

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

Сообщение ipf »

а если нужно несколько можно сделать так

char x;
if (PINB.1==0) x=0xFF;
else
if (PINB.2==0) x=0x80;
else
if (PINB.3==0) x=0x01;


Тогда при нажатии разных кнопок в X будет записываться разные переменные?
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

ururur писал(а):а если нужно несколько можно сделать так

char x;
if (PINB.1==0) x=0xFF;
else
if (PINB.2==0) x=0x80;
else
if (PINB.3==0) x=0x01;


Тогда при нажатии разных кнопок в X будет записываться разные переменные?

можно без else

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

char x;
if (PINB.1==0) x=0xFF;
if (PINB.2==0) x=0x80;
if (PINB.3==0) x=0x01;
Если в цикле перебирать этот код то при нажатии любой из кнопок будет присвоено соответствующее значение.
Последний раз редактировалось Apparatchik Сб ноя 05, 2011 22:29:32, всего редактировалось 1 раз.
«И всё-таки она вертится!»
ipf
Встал на лапы
Сообщения: 131
Зарегистрирован: Вт сен 20, 2011 18:41:41
Откуда: Вьетнам

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

Сообщение ipf »

Спасибо
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

Apparatchik писал(а):можно без else
можно, только поведение программы будет сильно другим: в исходном варианте при нажатии одновременно нескольких кнопок переменная не изменит своего значения, т.е. реакции на групповое нажатие не будет, а во втором случае - реакция будет.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

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

Сообщение *Trigger* »

Тогда лучше switch.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

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

Сообщение hd44780 »

alex_avr писал(а):Если ставлю While(1) то прерывание перестает работать


Ты что, while(1) в обработчик ставишь? Так я тебе и без протеуса скажу, что оно работать не будет.
Обработчик всегда обязан завершиться. По определению.
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

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

Сообщение hd44780 »

levaclaus писал(а):интересен пример на sprintf, покажите


Лови:

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

int val=-1;

sprintf (sss, "+%d", val);


Знак + означает, что знак будет печататься всегда, а когда просто %d - то без знака.
Размер буфера sss д.б. соответствующим, следите.

Вообще, в CvAVR-овской доке всё это неплохо описано :)) .
Аватара пользователя
servo
Встал на лапы
Сообщения: 88
Зарегистрирован: Вс окт 30, 2011 22:52:51

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

Сообщение servo »

Приветствую :))

Потребовалось написать на CVAVR-е парсер текстовой строки, вот думаю с какой стороны подойти и как лучше сделать :))
Есть строка в текстовом виде"a=10b=20c=30", как ее попроще можно разобрать чтобы присвоить реальным переменным значения, char a=10; char b=20; char c=30;

:solder:
cat-dog-god0
Прорезались зубы
Сообщения: 244
Зарегистрирован: Вс янв 09, 2011 00:34:11

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

Сообщение cat-dog-god0 »

Может быть глупый вопрос: Можно ли загрузить МК по полной, т.е. использовать все порты и выполнять несколько программ ???
Например так, 1) один порт - переключатель гирлянд ( Кстати, можно ли частоту переключения изменять таймером, т.е. вместо задержки delay во включенном состоянии использовать таймер ???), 2-й порт - ЦМУ с прерыванием, 3-й - генератор прямоугольных импульсов с изменяемой частотой ????
Ответить

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