Страница 152 из 421

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

Добавлено: Чт ноя 03, 2011 19:04:26
hd44780
cat-dog-god0 писал(а):А в каком месте программы настраиваются порты на вход/выход ???
См. даташит.

например, DDRA = 0x01 - бит 0=1 - нога 0 - выход. Если в бите 0 - вход.

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

Добавлено: Чт ноя 03, 2011 20:41:29
*Trigger*
cat-dog-god0 писал(а):Абстрактный вопрос. МК зажигает 4 светодиода (скажем эффект бегущего огня), как кнопкой менять частоту эффекта ???
Светодиоды зажигать в прерывании по таймеру в режиме сравнения. В основном цикле опрашивать кнопку и при нажатии изменять значение регистра сравнения таймера в нужную сторону (увеличивать или уменьшать). Ещё следить за тем, чтобы регистр сравнения принимал только значения в определённом диапазоне.

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

Добавлено: Чт ноя 03, 2011 22:06:00
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[0])/10;
#asm("sei");
itoa((int)znach, str);
str1[0] = '+';
strcat(str, str1);
delay_ms(5);

};
};

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

Добавлено: Пт ноя 04, 2011 09:37:03
hd44780
levaclaus писал(а):При всключении термометра
.............
str[0] = '.';
str[1] = '';
str[2] = '';
str[3] = '';
........
- "бежит" точка, возможно ли сократить?
Так в детском саде пишут. А если у Вас будет 30-значный дисплей? 30 одинаковых операторов будете писать?

char str[5];

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

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

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

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

Добавлено: Пт ноя 04, 2011 09:48:50
levaclaus
ясно. спасибо.
а как победить почерёдное переключение матриц?

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

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

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

Посмотрите мой пример, там есть прерывание таймера, которое это всё делает.

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

Добавлено: Пт ноя 04, 2011 20:27:49
zhu4er
Посмотри как это делается у меня: http://mklab.com.ua/2011/11/to4niy-termostt/

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

Добавлено: Пт ноя 04, 2011 21:06:27
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") 
}

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

Добавлено: Пт ноя 04, 2011 21:15:29
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

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

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

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

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

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

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

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

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

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

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

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

char x;
if (PINB.1==0) x=0xFF;
При нажатии на кнопку переменной x присваивается значение 0xFF

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

Добавлено: Сб ноя 05, 2011 22:16:12
ipf
а если нужно несколько можно сделать так

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


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

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

Добавлено: Сб ноя 05, 2011 22:20:27
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;
Если в цикле перебирать этот код то при нажатии любой из кнопок будет присвоено соответствующее значение.

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

Добавлено: Сб ноя 05, 2011 22:23:39
ipf
Спасибо

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

Добавлено: Вс ноя 06, 2011 10:30:29
Мастер Ломастер
Apparatchik писал(а):можно без else
можно, только поведение программы будет сильно другим: в исходном варианте при нажатии одновременно нескольких кнопок переменная не изменит своего значения, т.е. реакции на групповое нажатие не будет, а во втором случае - реакция будет.

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

Добавлено: Вс ноя 06, 2011 10:46:16
*Trigger*
Тогда лучше switch.

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

Добавлено: Вс ноя 06, 2011 12:47:35
hd44780
alex_avr писал(а):Если ставлю While(1) то прерывание перестает работать
Ты что, while(1) в обработчик ставишь? Так я тебе и без протеуса скажу, что оно работать не будет.
Обработчик всегда обязан завершиться. По определению.

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

Добавлено: Вс ноя 06, 2011 12:55:03
hd44780
levaclaus писал(а):интересен пример на sprintf, покажите
Лови:

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

int val=-1;

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

Вообще, в CvAVR-овской доке всё это неплохо описано :)) .

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

Добавлено: Вс ноя 06, 2011 21:11:07
servo
Приветствую :))

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

:solder:

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

Добавлено: Вс ноя 06, 2011 21:30:12
cat-dog-god0
Может быть глупый вопрос: Можно ли загрузить МК по полной, т.е. использовать все порты и выполнять несколько программ ???
Например так, 1) один порт - переключатель гирлянд ( Кстати, можно ли частоту переключения изменять таймером, т.е. вместо задержки delay во включенном состоянии использовать таймер ???), 2-й порт - ЦМУ с прерыванием, 3-й - генератор прямоугольных импульсов с изменяемой частотой ????