CodeVision не находит avr/io.h что делать?

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 216
Зарегистрирован: Вс окт 23, 2011 22:18:40

Сообщение djrec »

При написании небольшой программы, а если быть точнее то скопированной в человека у которого все хорошо работает. (http://www.youtube.com/watch?v=FE3NaNO6 ... CqLisJl-W6)
лично у меня не находит avr/io.h.

Так же немного в другой программе при попытке инициализировать прерывание по таймеру на каждую строчку выдает ошибку . программа полностью была скопирована с учебника.
TCCR1A=0x0;
TCCR1B=0xD;
TCNT1H=0x0;
TCNT1L=0x0;
OCR1AH=0xF;

Подскажите пожалуйста где нужно настроить.
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Найдите 10 отличий между CodeVision и средой на видео.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Реклама
Встал на лапы
Сообщения: 100
Зарегистрирован: Пт авг 02, 2013 07:20:04

Сообщение titoFF »

В CVAVR нету такого файла. Поэтому и не находит.
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Но есть файлы с дефайнами для всех регистров (или почти всех) для каждого контроллера. Подключите его. По сути io.h в avr studio это и делает, а вы ручками, ручками...
Реклама
Эиком - электронные компоненты и радиодетали
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Так,для общего развития,откройте файл с дефайнами (можно даже обычным блокнотом),и посмотрите что там понаписано. Думаю первоночальный вектор разбора "почему неработает" будет дан :)
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
Прорезались зубы
Сообщения: 216
Зарегистрирован: Вс окт 23, 2011 22:18:40

Сообщение djrec »

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

Можете подсказать как правильно написать программу с прерыванием по таймеру для вывода например числа 111 на семисегментный индикатор. Использую атмегу8. И какие дополнительные файлы нужно иметь кроме стандартного кодевижена. Могут ли быть проблемы из-за расположения проекта в другой директории чем сама программа кодевижен?
Реклама
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

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

Создаем библиотеку как-то так:
#define _A (1<<4) ;за сегмент _А отвечает 4-й разряд порта
#define _B (1<<2) ;за сегмент _В отвечает 2-й разряд порта
.....
.....

#define _1 _B|_C ;что-бы светилась 1-ка,нужно подать напряжение на ноги _B и _C
....
#define _8 _A|_B|_C|_D|_E|_F|_G ;на эти ноги подаем лог.1 , что-б светилась 8-ка
#define _OFF 0 ;что-бы потушить все сегменты надо на все ноги порта выдать 0
......
....
#define _SEG PORTB ;за управлением сегментов отвечает порт В


Теперь что-бы зажечь светодиоды с ОА в виде цифры 1,нужно просто прописать
такую строчку:
_SEG = _1 ; ноги в портВ отвечающие за сегменты _В и _С станут лог. 1-ками


сделай сначала такую фиговинку для всех цифр,потом дальше копать будем
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Прорезались зубы
Сообщения: 216
Зарегистрирован: Вс окт 23, 2011 22:18:40

Сообщение djrec »

За основу взял то что снизу. Заработало, только у меня частота проца ниже и видно мерцание. (частоту не повышу так как использую без кварца) Где подправить что бы не мерцало? Зачем в "выборе" стоит delay_ms(5), возможно ли обойтись без нее? Если да, то как исправить программу?


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

unsigned int amper_out=0;
unsigned int volt_out=0;
unsigned int temp=0;

volatile int cur_dig ;

char buf[] = { //массив с цифрами
0b00000011, //0
0b10011111, //1
0b00100101, //2
0b00001101, //3
0b10011001, //4
0b01001001, //5
0b01000001, //6
0b00011111, //7
0b00000001, //8
0b00001001, //9
0b11111110, //.
};

void amper_print(unsigned char data){
unsigned char i; //Функция вывода тока
unsigned char temp1;
if (cur_dig == 0) // это если в первом знакоместе
{
temp1 = buf[data] & ~(1<<0); // берем символ из массива и добавляем бит точки
}
else
{
temp1 = buf[data]; // иначе - не трогаем ничего, берем символ из массива
}
for( i=0; i<8; i++){ //Цикл для вывода 8 бит данных из массива

PORTD.0 = temp1 & 1<<i ; //Выводим в линию DATA текущий бит
PORTD.1=0; //Опускаем линию CLK в лог.0
PORTD.1=1; //Поднимаем линию CLK в лог.1
}
}

void volt_print(unsigned char data){
unsigned char i; //Функция вывода тока
unsigned char temp1;
if (cur_dig == 1) // это если в первом знакоместе
{
temp1 = buf[data] & ~(1<<0); // берем символ из массива и добавляем бит точки
}
else
{
temp1 = buf[data]; // иначе - не трогаем ничего, берем символ из массива
}
for( i=0; i<8; i++){ //Цикл для вывода 8 бит данных из массива

PORTD.6 = temp1 & 1<<i ; //Выводим в линию DATA текущий бит
PORTD.7=0; //Опускаем линию CLK в лог.0
PORTD.7=1; //Поднимаем линию CLK в лог.1
}
}

interrupt [TIM2_OVF] void timer2_ovf_isr(void) //Прерывание по переполнению таймера счётчика 2
{
switch (cur_dig) //Выводим ток и напряжение
{
case 0: {PORTD.3=0; PORTD.4=0; PORTD.2=0; //Первый разряд
amper_print( amper_out % 10000 / 1000);
volt_print ( volt_out % 100000 / 10000);
PORTD.2=1; delay_ms(5); break;};

case 1: {PORTD.2=0; PORTD.4=0; PORTD.3=0; //Второй разряд
amper_print( amper_out % 1000 / 100);
volt_print ( volt_out % 10000 / 1000);
PORTD.3=1;delay_ms(5); break;};

case 2: {PORTD.2=0; PORTD.3=0; PORTD.4=0; //Третий разряд
amper_print( amper_out % 100 / 10);
volt_print ( volt_out % 1000 / 100);
PORTD.4=1; delay_ms(5); break;};
}
if (( cur_dig++) > 3) cur_dig = 0;
}

interrupt [ADC_INT] void adc_isr(void)
{
if (ADMUX==1) //Считываем ток
{
delay_ms(5);
temp=ADCW*5-ADCW/10;
amper_out = (temp/5) /0.2; //Вычесляем показание в амперах
}
if (ADMUX==0) //Считываем напряжение
{
delay_ms(5);
temp=ADCW*5-ADCW/10;
volt_out = (temp)*10.98; //Вычесляем показание в вольтах
}

if (ADMUX==0) ADMUX=1;
else ADMUX=0;

}

void init (void)
{
PORTD=0x00;
DDRD=0b11111111;
PORTB=0x00;
DDRB=0b11111111;
TIMSK |= (1 << TOIE2); // Разрешение прерывания по таймеру2
TCCR2 |= (1 << CS21); // Предделитель на 8
ADCSRA = (1 << ADEN) // Разрешение работы АЦП
|(1 << ADSC) // Запуск преобразования
|(1 << ADFR) // Непрерывный режим работы АЦП
|(1 << ADPS2)|(1 << ADPS1)|(0 << ADPS0) // Предделитель на 64
|(1 << ADIE); // Разрешение прерывания
ADMUX=0;
#asm ("sei");
}


void main(void)
{
init();
while(1) //!!!!!!! Пример цадачи в бесконечном цикле: переключение лог. уров.
{
delay_ms(100);
PORTB.0=1;
delay_ms(100);
PORTB.0=0;
PORTB.2=1;
}

}
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Обработчик прерывания по переполнению Т2 медлнно работает(всмысле событие происходит редко),
надо например режим СТС заюзать вместо OVF,что-б чаще вызывался.
А делеи нужны что-б фонарики хоть по чуть-чуть успели посветить :) прежде чем померкнут :)
Эта программулина применяется походу с 16разрядным сдвиговым регистром,отвечающим за сегменты.
Вы разобрались как эта ваша "основа" работает? 8)
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Прорезались зубы
Сообщения: 216
Зарегистрирован: Вс окт 23, 2011 22:18:40

Сообщение djrec »

Если долго мучатся, то что нибудь получится. Поудалял все лишнее и сделал счетчик. Ошибка была в том что я подавал новый сигнал на ноги индикатора не потушив его перед этим, что вызвало затерание, так же в самом первоначальном коде в "выборе" при сравнении числа, получалось что последняя цыфра светилась в три раза дольше чем остальные что приводило к мерцанию, либо не одинакового свечению цыфр. Вот что у меня получилось.

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

unsigned int nom=0;
unsigned int nom1=0;
volatile int cur_dig ;


char buf[] = { //массив с цифрами
0b11000000, //0
0b11111001, //1
0b10100100, //2
0b10110000, //3
0b10011001, //4
0b10010010, //5
0b10000010, //6
0b11111000, //7
0b10000000, //8
0b10010000, //9
};


interrupt [TIM2_OVF] void timer2_ovf_isr(void) //Прерывание по переполнению таймера счётчика 2
{ PORTD=0b11111111;
PORTB=0b11111111;

switch (cur_dig) //Выводим
{
case 0: { //Первый
PORTD=0b11111011;
PORTB=buf[nom%1000/100];

break;};

case 1: { //Второй разряд

PORTD=0b11111101;
PORTB=buf[nom% 100 / 10];

break;};

case 2: { //Третий разряд
PORTD=0b11111110;
PORTB=buf[nom% 100 % 10];

break;};
}
if (( cur_dig++) > 1) cur_dig = 0;
}



void init (void)
{

//PORTD=0x00;
DDRD=0b11111111;
//PORTB=0x00;
DDRB=0b11111111;
TIMSK |= (1 << TOIE2); // Разрешение прерывания по таймеру2

TCCR2 |= (1 << CS21) ; //(1 << CS20) || (1 << CS22) Предделитель на 8

#asm ("sei");
}


void main(void)
{
init();
while(1)
{
if (( nom1++) > 10000)
{
nom1 = 0;
nom=nom+1;
}

}

}
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Я недоволен -
0b11000000, //0
0b11111001, //1 :o
Залей все это дело в макросы.Потому-что завтра тебе понадобиться к другим ногам перепаять или с ОА дисплей использоать.Придется помучиться немного лишний раз
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Прорезались зубы
Сообщения: 216
Зарегистрирован: Вс окт 23, 2011 22:18:40

Сообщение djrec »

Впринцыпе это пока не столь важно, и так уже перепаевал 20 раз. У меня стоят теперь удобные разьемы к которым можно легко менять провода. Хотя завтра попробую написать под макросы, еще не имел с таким делом. Так же только что нашел в уголку ЖКИ wh1602d-yyk-ctk, буду пробовать его использовать. Так что думаю завтра вопросы появятся новые.
Ответить

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