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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Читать или писать?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

читать
Tell Me The Truth
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

FreshMan писал(а):а кто быстрее flash или eeprom ?


Flash это продвинутая разновиднось EEPROM
у нее больше емкость(при одинаковой площади кристалла), больше скорость, но меньший ресурс и невозможность перезаписи отдельных байтов(постраничная запись)
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

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

Сообщение 0867532 »

Всем Привет!
Делаю часы на Ds1307; Всё работает, выводится на сегмент. но моргает сильно, ну заметно по крайней мере.
если убрать rtc_get_time(); то вообще ярко и нормально, вот хочу засунуть rtc_get_time в прерывание, а не работает. само прерывание работает(проверял светодиодом); как быть не знаю. помогите плз!!!
код ниже:

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

#include <mega32.h>
#include <delay.h>
#include <i2c.h>
#include <ds1307.h>
#asm
   .equ __i2c_port=0x12 ;PORTD
   .equ __sda_bit=7
   .equ __scl_bit=6
#endasm
#define wait delay_us(300);

unsigned char hrs,min,sec; 
//unsigned char sec;
int sect,seco;
//int mint;
//ine mino;
//int hrst;
//int hrso;

void A0(void) { PORTB.1 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.2 = 0x00; PORTA.3 = 0x00; PORTA.4 = 0x00; PORTA.5 = 0x00; PORTA.6 = 0x00; wait; PORTB.1 = 0x00; }
void A1(void) { PORTB.1 = 0xFF; PORTA = 0xFF; PORTA.2 = 0x00; PORTA.3 = 0x00; wait; PORTB.1 = 0x00; }
void A2(void) { PORTB.1 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.2 = 0x00; PORTA.4 = 0x00; PORTA.5 = 0x00; PORTA.7 = 0x00; wait; PORTB.1 = 0x00; }
void A3(void) { PORTB.1 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.2 = 0x00; PORTA.3 = 0x00; PORTA.4 = 0x00; PORTA.7 = 0x00; wait; PORTB.1 = 0x00; }
void A4(void) { PORTB.1 = 0xFF; PORTA = 0xFF; PORTA.2 = 0x00; PORTA.3 = 0x00; PORTA.6 = 0x00; PORTA.7 = 0x00; wait; PORTB.1 = 0x00; }
void A5(void) { PORTB.1 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.3 = 0x00; PORTA.4 = 0x00; PORTA.7 = 0x00; PORTA.6 = 0x00; wait; PORTB.1 = 0x00; }
void A6(void) { PORTB.1 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.3 = 0x00; PORTA.4 = 0x00; PORTA.7 = 0x00; PORTA.6 = 0x00; PORTA.5 = 0x00; wait; PORTB.1 = 0x00;}
void A7(void) { PORTB.1 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.2 = 0x00; PORTA.3 = 0x00; wait; PORTB.1 = 0x00; }   
void A8(void) { PORTB.1 = 0xFF; PORTA = 0x00; wait; PORTB.1 = 0x00; }
void A9(void) { PORTB.1 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.2 = 0x00; PORTA.3 = 0x00; PORTA.4 = 0x00; PORTA.7 = 0x00; PORTA.6 = 0x00; wait; PORTB.1 = 0x00; }

void B0(void) { PORTB.0 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.2 = 0x00; PORTA.3 = 0x00; PORTA.4 = 0x00; PORTA.5 = 0x00; PORTA.6 = 0x00; wait; PORTB.0 = 0x00; }
void B1(void) { PORTB.0 = 0xFF; PORTA = 0xFF; PORTA.2 = 0x00; PORTA.3 = 0x00; wait; PORTB.0 = 0x00; }
void B2(void) { PORTB.0 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.2 = 0x00; PORTA.4 = 0x00; PORTA.5 = 0x00; PORTA.7 = 0x00; wait; PORTB.0 = 0x00; }
void B3(void) { PORTB.0 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.2 = 0x00; PORTA.3 = 0x00; PORTA.4 = 0x00; PORTA.7 = 0x00; wait; PORTB.0 = 0x00; }
void B4(void) { PORTB.0 = 0xFF; PORTA = 0xFF; PORTA.2 = 0x00; PORTA.3 = 0x00; PORTA.6 = 0x00; PORTA.7 = 0x00; wait; PORTB.0 = 0x00; }
void B5(void) { PORTB.0 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.3 = 0x00; PORTA.4 = 0x00; PORTA.7 = 0x00; PORTA.6 = 0x00; wait; PORTB.0 = 0x00; }
void B6(void) { PORTB.0 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.3 = 0x00; PORTA.4 = 0x00; PORTA.7 = 0x00; PORTA.6 = 0x00; PORTA.5 = 0x00; wait; PORTB.0 = 0x00; }
void B7(void) { PORTB.0 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.2 = 0x00; PORTA.3 = 0x00; wait; PORTB.0 = 0x00; }   
void B8(void) { PORTB.0 = 0xFF; PORTA = 0x00; wait; PORTB.0 = 0x00; }
void B9(void) { PORTB.0 = 0xFF; PORTA = 0xFF; PORTA.1 = 0x00; PORTA.2 = 0x00; PORTA.3 = 0x00; PORTA.4 = 0x00; PORTA.7 = 0x00; PORTA.6 = 0x00; wait; PORTB.0 = 0x00; }

interrupt [TIM1_OVF] void timer1_ovf_isr(void) { // это всё конечно идёт в While(1)
rtc_get_time(&hrs,&min,&sec);
sect = (sec/10);
seco = (sec%10);
}

void main(void) {

DDRA = 0xFF;
PORTA = 0x00;

DDRB = 0xFF;
PORTB = 0x00; 

TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x04;

TWSR=0x00;
TWBR=0x07;
TWAR=0x00;
TWCR=0x04;

i2c_init();
rtc_init(0,0,0);
delay_ms(10);
rtc_set_time(23,59,33);
//hrs = 0;
//min = 0;
//sec = 32; 
while (1) {
 
if (sect == 0) { A0(); }
if (sect == 1) { A1(); }
if (sect == 2) { A2(); }
if (sect == 3) { A3(); }
if (sect == 4) { A4(); }
if (sect == 5) { A5(); }
if (sect == 6) { A6(); }
if (sect == 7) { A7(); }
if (sect == 8) { A8(); }
if (sect == 9) { A9(); }

if (seco == 0) { B0(); PORTD.4 = 1;}// это мигание точек между сегментами.
if (seco == 1) { B1(); PORTD.5 = 1;}// это мигание точек между сегментами.
if (seco == 2) { B2(); PORTD.4 = 0;}// это мигание точек между сегментами.
if (seco == 3) { B3(); PORTD.5 = 0;}// это мигание точек между сегментами.
if (seco == 4) { B4(); }
if (seco == 5) { B5(); PORTD.4 = 1;}// это мигание точек между сегментами.
if (seco == 6) { B6(); PORTD.5 = 1;}// это мигание точек между сегментами.
if (seco == 7) { B7(); PORTD.4 = 0;}// это мигание точек между сегментами.
if (seco == 8) { B8(); PORTD.5 = 0;}// это мигание точек между сегментами.
if (seco == 9) { B9(); }
}
}
Если возникнут вопросы - посмотрите на мой аватар.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

В прерывание нужно "засовывать" индикацию, а не rtc_get_time. Тогда индикация будет хорошей и равномерной.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

У вас всё наоборот сделано. Индикацию - в прерывания, опрос - в основное тело.
2Аlex: +
Docendo discimus
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

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

Сообщение 0867532 »

Спасибо, Но я выяснил что прерывания работают только без работы датчика, то есть если закомментить всё что связанно с ds1307 и TWI Чем это может быть вызвано и как исправить?
Если возникнут вопросы - посмотрите на мой аватар.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Прерывания могут не работать только из-за одного - их запретили. Программа Ваша, по этому Вам виднее где происходит запрет.
А как исправить ? - не запрещать их.
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

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

Сообщение 0867532 »

Всем огромное спасибо, часики работают. оказалось что я вообще не включил прерывания.
:))
Alex, спс ещё разок, я тока учусь.
Если возникнут вопросы - посмотрите на мой аватар.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

А про массивы то вам никто не говорил? или про такие команды как switch case?
Почитайте и подумайте как можно упростить код с применением массивов и этих операторов.
Сама индикация уменьшится до размера 4-5 комманд вместо вашей россыпи подпрограмм.
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

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

Сообщение 0867532 »

У меня ещё вопрос возник:
как сделать так чтоб мк считал нажатия в течение некоторого времени и выполнял программу в зависимости от кол-ва нажатий. вообще я сам не понял что я щас сказал но я думаю вы поняли.
Если возникнут вопросы - посмотрите на мой аватар.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

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

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

TimeOut= 10; // устанавливаем счетчик времени (он должен уменьшаться в прерывании)
do
    {
    while(PINB.0); // ждем нажатия кнопки
    while(!PINB.0); // ждем отпускания кнопки
    ++counter; // наращиваем счетчик
    } while TimeOut;

switch(counter)
    {
    case 0:
        break;
    }

Сам не понял, что написал, но, надеюсь, вы поняли суть.
Docendo discimus
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

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

Сообщение 0867532 »

Всем привет!
у меня серьёзный и одновременно тупой вопрос: как это ужать???

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

void update(void) {
if (x == 1)  { x1();  }
if (x == 2)  { x2();  }
if (x == 3)  { x3();  }
if (x == 4)  { x4();  }
if (x == 5)  { x5();  }
if (x == 6)  { x6();  }
if (x == 7)  { x7();  }
if (x == 8)  { x8();  }

if (y == 1)  { y1();  }
if (y == 2)  { y2();  }
if (y == 3)  { y3();  }
if (y == 4)  { y4();  }
if (y == 5)  { y5();  }
if (y == 6)  { y6();  }
if (y == 7)  { y7();  }
if (y == 8)  { y8();  }
if (y == 9)  { y9();  }
if (y == 10) { y10(); }
if (y == 11) { y11(); }
if (y == 12) { y12(); }
if (y == 13) { y13(); }
if (y == 14) { y14(); }
if (y == 15) { y15(); }
if (y == 16) { y16(); }
}

У Меня матрица 8х16 из светодиодов. делаю тетрис на ней. Всё вроде норм но таких "рассылок" куча и получается примерно 580 таких if'ов за весь код. Это засоряет код, и трудно косяки искать. можетепомочь?!
Если возникнут вопросы - посмотрите на мой аватар.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

это это вообще? опять динамическая индикация ?
может сделать одну функцию вместо миллиона?
И из таблиц считать то, что нужно сделать.
Aмstroн
Встал на лапы
Сообщения: 107
Зарегистрирован: Сб июл 27, 2013 10:52:37
Откуда: Украина

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

Сообщение Aмstroн »

Первый раз взялся делать проект на меге 168.
Подскажите, для каких случаев нужно устанавливать галочки Отключить цифровые входные буферы
Изображение
Вложения
432.jpg
(65.19 КБ) 653 скачивания
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

0867532, покажите функции x1() и y1(). Тогда можно будет подумать.
Сейчас трудно что-то предложить. Разве что создание массива указателей на функции.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

для каких случаев нужно устанавливать галочки Отключить цифровые входные буферы
Если используем ножку микроконтроллера как аналоговый вход, лучше отключить входной буфер для уменьшения влияния помех на аналоговую часть.
Aмstroн
Встал на лапы
Сообщения: 107
Зарегистрирован: Сб июл 27, 2013 10:52:37
Откуда: Украина

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

Сообщение Aмstroн »

Извините уточню.. Если я использую АЦП только для РС5, это значит РС0 ------РС4 можно поставить галки?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

нет все с точностью до наоборот если вы используете АЦП на пятой ножке то на ней и нужно цифровой вход выключить. А если остальные выводы совсем не используются, то можно и их выключить.
Aмstroн
Встал на лапы
Сообщения: 107
Зарегистрирован: Сб июл 27, 2013 10:52:37
Откуда: Украина

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

Сообщение Aмstroн »

Чем больше уточняю тем больше путаюсь(((.
Вы хотели сказать вот так?
нет все с точностью до наоборот если вы используете АЦП на пятой ножке то на ней и нужно цифровой вход выключить. А если остальные выводы совсем не используются, то можно и их выключить.

Галку ставлю на РС5?
Ответить

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