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

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

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

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

Сообщение FreshMan »

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

Сообщение unalex »

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

Сообщение 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(); }
}
}
Если возникнут вопросы - посмотрите на мой аватар.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение pyzhman »

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

Сообщение 0867532 »

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

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

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

Сообщение 0867532 »

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

Сообщение vitalik_1984 »

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

Сообщение 0867532 »

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

Сообщение pyzhman »

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

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

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

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

Сообщение 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'ов за весь код. Это засоряет код, и трудно косяки искать. можетепомочь?!
Если возникнут вопросы - посмотрите на мой аватар.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

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

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

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

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

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

Сообщение oleg110592 »

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

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

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

Сообщение vitalik_1984 »

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

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

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

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