CodeVision AVR в вопросах и ответах
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: CodeVision AVR в вопросах и ответах
Читать или писать?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: CodeVision AVR в вопросах и ответах
FreshMan писал(а):а кто быстрее flash или eeprom ?
Flash это продвинутая разновиднось EEPROM
у нее больше емкость(при одинаковой площади кристалла), больше скорость, но меньший ресурс и невозможность перезаписи отдельных байтов(постраничная запись)
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
- 0867532
- Встал на лапы
- Сообщения: 142
- Зарегистрирован: Сб май 25, 2013 21:14:11
- Откуда: Москва
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Всем Привет!
Делаю часы на Ds1307; Всё работает, выводится на сегмент. но моргает сильно, ну заметно по крайней мере.
если убрать rtc_get_time(); то вообще ярко и нормально, вот хочу засунуть rtc_get_time в прерывание, а не работает. само прерывание работает(проверял светодиодом); как быть не знаю. помогите плз!!!
код ниже:
Делаю часы на 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 в вопросах и ответах
В прерывание нужно "засовывать" индикацию, а не rtc_get_time. Тогда индикация будет хорошей и равномерной.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
У вас всё наоборот сделано. Индикацию - в прерывания, опрос - в основное тело.
2Аlex: +
2Аlex: +
Docendo discimus
- 0867532
- Встал на лапы
- Сообщения: 142
- Зарегистрирован: Сб май 25, 2013 21:14:11
- Откуда: Москва
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Спасибо, Но я выяснил что прерывания работают только без работы датчика, то есть если закомментить всё что связанно с ds1307 и TWI Чем это может быть вызвано и как исправить?
Если возникнут вопросы - посмотрите на мой аватар.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Прерывания могут не работать только из-за одного - их запретили. Программа Ваша, по этому Вам виднее где происходит запрет.
А как исправить ? - не запрещать их.
А как исправить ? - не запрещать их.
- 0867532
- Встал на лапы
- Сообщения: 142
- Зарегистрирован: Сб май 25, 2013 21:14:11
- Откуда: Москва
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Всем огромное спасибо, часики работают. оказалось что я вообще не включил прерывания.
Alex, спс ещё разок, я тока учусь.
Alex, спс ещё разок, я тока учусь.
Если возникнут вопросы - посмотрите на мой аватар.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
А про массивы то вам никто не говорил? или про такие команды как switch case?
Почитайте и подумайте как можно упростить код с применением массивов и этих операторов.
Сама индикация уменьшится до размера 4-5 комманд вместо вашей россыпи подпрограмм.
Почитайте и подумайте как можно упростить код с применением массивов и этих операторов.
Сама индикация уменьшится до размера 4-5 комманд вместо вашей россыпи подпрограмм.
- 0867532
- Встал на лапы
- Сообщения: 142
- Зарегистрирован: Сб май 25, 2013 21:14:11
- Откуда: Москва
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
У меня ещё вопрос возник:
как сделать так чтоб мк считал нажатия в течение некоторого времени и выполнял программу в зависимости от кол-ва нажатий. вообще я сам не понял что я щас сказал но я думаю вы поняли.
как сделать так чтоб мк считал нажатия в течение некоторого времени и выполнял программу в зависимости от кол-ва нажатий. вообще я сам не понял что я щас сказал но я думаю вы поняли.
Если возникнут вопросы - посмотрите на мой аватар.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Например так:
Сам не понял, что написал, но, надеюсь, вы поняли суть.
Код: Выделить всё
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 в вопросах и ответах
Всем привет!
у меня серьёзный и одновременно тупой вопрос: как это ужать???
У Меня матрица 8х16 из светодиодов. делаю тетрис на ней. Всё вроде норм но таких "рассылок" куча и получается примерно 580 таких if'ов за весь код. Это засоряет код, и трудно косяки искать. можетепомочь?!
у меня серьёзный и одновременно тупой вопрос: как это ужать???
Код: Выделить всё
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 в вопросах и ответах
это это вообще? опять динамическая индикация ?
может сделать одну функцию вместо миллиона?
И из таблиц считать то, что нужно сделать.
может сделать одну функцию вместо миллиона?
И из таблиц считать то, что нужно сделать.
Re: CodeVision AVR в вопросах и ответах
Первый раз взялся делать проект на меге 168.
Подскажите, для каких случаев нужно устанавливать галочки Отключить цифровые входные буферы

Подскажите, для каких случаев нужно устанавливать галочки Отключить цифровые входные буферы
- Вложения
-
- 432.jpg
- (65.19 КБ) 653 скачивания
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
0867532, покажите функции x1() и y1(). Тогда можно будет подумать.
Сейчас трудно что-то предложить. Разве что создание массива указателей на функции.
Сейчас трудно что-то предложить. Разве что создание массива указателей на функции.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: CodeVision AVR в вопросах и ответах
для каких случаев нужно устанавливать галочки Отключить цифровые входные буферы
Если используем ножку микроконтроллера как аналоговый вход, лучше отключить входной буфер для уменьшения влияния помех на аналоговую часть.
Если используем ножку микроконтроллера как аналоговый вход, лучше отключить входной буфер для уменьшения влияния помех на аналоговую часть.
Re: CodeVision AVR в вопросах и ответах
Извините уточню.. Если я использую АЦП только для РС5, это значит РС0 ------РС4 можно поставить галки?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
нет все с точностью до наоборот если вы используете АЦП на пятой ножке то на ней и нужно цифровой вход выключить. А если остальные выводы совсем не используются, то можно и их выключить.
Re: CodeVision AVR в вопросах и ответах
Чем больше уточняю тем больше путаюсь(((.
Вы хотели сказать вот так?
Галку ставлю на РС5?
Вы хотели сказать вот так?
нет все с точностью до наоборот если вы используете АЦП на пятой ножке то на ней и нужно цифровой вход выключить. А если остальные выводы совсем не используются, то можно и их выключить.
Галку ставлю на РС5?