Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
servilad
Родился
Сообщения: 1
Зарегистрирован: Пт янв 20, 2012 16:06:38

Re: Вопросы по С/С++ (СИ)

Сообщение servilad »

как сделать 4-х канальный вольтметр на атмеге 16!!!!!! буду очень благодарен если кто нибудь поделится исходником
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

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

PORTD |=(1<<0)
PORTD.0=1

равнозначны ли по смыслу и по весомости эти оба выражения ?
Tell Me The Truth
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Pika4u »

По идее, да. И там и там мы устанавливаем в 1 0-й бит порта D. В общем, всем спасибо, пойду думать(в железе бага не проявляется и при задержке в 20000 тактов, но пришлось увеличить задержку в опросе кнопок до 300000(думаю, можно обойтись и 250000, 200000 мало). Проект:
Вложения
AVR3.rar
(16.34 КБ) 172 скачивания
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Pika4u »

Ребят, вот такой вопрос-если прерывания запрещены, то TCNT0 продолжает "тикать"? И ещё вопрос-если прерывания разрешены, во время выполнения __delay_cycles(число тактов) может возникнуть прерывание?
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Сообщение vitalik_1984 »

таймер тикает,бит прерывания выставляется.как только маска разрешения допускает прерывание оно обрабатывается.вается посмотрите в даташите там два регистра прерывания,один разрешение прерывания,а второй флаг прерывания.в любой момент времени,когда три бита прерывания (общее,флаг,таймер)равны единице возникает прерывание и флаг снимается аппаратно.
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Pika4u »

Спасибо, то есть во время выполнения задержки прерывание выполняется?
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
evil0o
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Чт мар 31, 2011 21:26:39

Re: Вопросы по С/С++ (СИ)

Сообщение evil0o »

как узнать состояние конкретного ввода например PB1
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

evil0o писал(а):как узнать состояние конкретного ввода например PB1

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

if(PINB & (1<<PB1)){
   // если 1
} else {
   // если 0
}
битва с дураками проиграна, победители торжествуют. слава победителям!
evil0o
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Чт мар 31, 2011 21:26:39

Re: Вопросы по С/С++ (СИ)

Сообщение evil0o »

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

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

int main(void)
  {

   while (1)
   {
      if (PINB!=00000000 )
      break;
      
   };
   
   
   
   if(PINB & (1<<PB0))
   {
      DDRD = 0xff;
      PORTD |= _BV(PD0);//здесь будет немножко другой   код для загорания цифр, но суть этажа.
   }
   else
   if(PINB & (1<<PB1))
   {
      DDRD = 0xff;
      PORTD |= _BV(PD1);
   }
   else
   if(PINB & (1<<PB2))
   {
      DDRD = 0xff;
      PORTD |= _BV(PD2);
   }
   else
   if(PINB & (1<<PB3))
   {
      DDRD = 0xff;
      PORTD |= _BV(PD3);
   }
   else
   if(PINB & (1<<PB4))
   {
      DDRD = 0xff;
      PORTD |= _BV(PD4);
   }
   else
   if(PINB & (1<<PB5))
   {
      DDRD = 0xff;
      PORTD |= _BV(PD5);
   }
   else
   if(PINB & (1<<PB6))
   {
      DDRD = 0xff;
      PORTD |= _BV(PD6);
   }
   else
   if(PINB & (1<<PB7))
   {
      DDRD = 0xff;
      PORTD |= _BV(PD7);
   }
   

  }
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

оптимизировать можно. во-первых, DDRD можно один-единственный раз в самом начале main() установить в 255, и более не трогать. а во-вторых, почитайте вот эту тему http://www.radiokot.ru/forum/viewtopic. ... 97f145271a примерно с 2-3 страницы - там про работу с кнопками все рассказано. кроме этой есть еще просто куча тем на форуме, и все посвящены этой страшной проблеме - обработке нажатий кнопки
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

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

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

#define sa PORTB.0
#define sb PORTB.1
#define sc PORTB.2
#define sd PORTB.3
#define se PORTB.4
#define sf PORTB.5
#define sg PORTB.6
#define dp PORTB.7

#define catod_1 PORTD.1
#define catod_2 PORTD.0

char scr [2]; // экран

//---прототипы функций---------------------------------------------
void setcifra (char i); // включение цифры
//----------


void setcifra (char i) // включение цифры
{
 switch (i)
        {
         case 0: sg=0; sa=1; sb=1; sc=1; sd=1; se=1; sf=1; break;
         case 1: sa=0; sd=0; se=0; sf=0; sg=0; sb=1; sc=1; break;
         case 2: sc=0; sf=0; sa=1; sb=1; sd=1; se=1; sg=1; break;
         case 3: se=0; sf=0; sa=1; sb=1; sc=1; sd=1; sg=1; break;
         case 4: sa=0; sd=0; se=0; sb=1; sc=1; sf=1; sg=1; break;
         case 5: sb=0; se=0; sa=1; sc=1; sd=1; sf=1; sg=1; break;
         case 6: sb=0; sa=1; sc=1; sd=1; se=1; sf=1; sg=1; break;
         case 7: sd=0; se=0; sf=0; sg=0; sa=1; sb=1; sc=1; break;
         case 8: sa=1; sb=1; sc=1; sd=1; se=1; sf=1; sg=1; break;
         case 9: se=0; sa=1; sb=1; sc=1; sd=1; sf=1; sg=1; break;
        }       
}

// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
 catod_1=1; // гасим первый разряд
 catod_2=1; // гасим второй разряд
}

// Timer 2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
 static char digit;
 switch (digit)
        {
         case 0: setcifra (scr[digit]); catod_1=0; break;
         case 1: setcifra (scr[digit]); catod_2=0; break;
        }
 if (++digit==2) digit=0;
}

void main( void )
{
char sec;

DDRB=0xFF;
PORTD=0x03;
DDRD=0x03;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: Fast PWM top=FFh
// OC2 output: Disconnected
TCCR2=0x4B;
OCR2=0x01;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0xC0;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// Global enable interrupts
#asm("sei")

while (1)
 {
  scr[0]=sec/10;
  scr[1]=sec%10;
  if (++sec==60) sec=0;
  delay_ms (500);
 }
}


меня интересует: есть ликакие-то неписанные правила по которым нужно читать прогу ?
может сразу нужно читать с основной ф-ции ?
кто, что скажет по этому поводу
Tell Me The Truth
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Pika4u »

Ребят, в чём проблема. Страницой раньше выкладывал код и проект часов. За 5 часов накопилось опережение, по сравнению с обычными часами в 5 минут. МК настроен на внутреннее тактирование 4 МГц, электролит 200 мкФ по питанию стоит.
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

прочитайте в даташите о стабильности внутреннего тактирования, и все вопросы отпадут. в принципе, с этого нужно было начинать при разработке часов.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Pika4u »

Но у меня PA0 и PA1 задействованы!! Ппц..... а в даташите про это где говорится?
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

в даташите
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Pika4u »

Да я понял :)) :)) :)) а раздел?
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

Typical characteristics или как-то так. ближе к концу.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Pika4u »

Из графика в даташите я понял, что при напряжении питания 5 Вольт и температуре 25 по Цельсию частота внутреннего генератора 4.025 Мгц...Ппц...
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Pika4u »

Следовательно, за 1 секунду на таймер придет 15273 пинка, осталось подобрать регистр сравнения....
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Pika4u »

Оверпостинг: не могу подобрать число...блин, что делать......Похоже, придется юзать 16-битный Т1....
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Ответить

Вернуться в «Разные вопросы по МК»