Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Различни въпроси
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=8583
Страница 1 от 2

Автор:  Mhz [ Пет Фев 25, 2011 4:36 pm ]
Заглавие:  Различни въпроси

Може ли някой да ми обясни точно работи тази функция.И как се "оразмерява" да работи в us, ms и s.

Автор:  ike [ Пет Фев 25, 2011 4:50 pm ]
Заглавие: 

Почни малко по от далече - Платформа, IDE, компилатор, процесор и т.н.

Автор:  Mhz [ Пет Фев 25, 2011 5:02 pm ]
Заглавие: 

ike написа:
Почни малко по от далече - Платформа, IDE, компилатор, процесор и т.н.

PIC16F84A
HI-TECH C
MPLAB
идеята е да управлявам 7 сегментен индикатор , правейки брояч от 0 до 9 секунди , ясно ми е всичко как трябва да стане , освен как да го направя да изчаква 1 секунда, а и като цяло искам да разбера как работи тази функция.

Автор:  relsys [ Пет Фев 25, 2011 5:59 pm ]
Заглавие: 

Mhz написа:
ike написа:
Почни малко по от далече - Платформа, IDE, компилатор, процесор и т.н.

PIC16F84A
HI-TECH C
MPLAB
идеята е да управлявам 7 сегментен индикатор , правейки брояч от 0 до 9 секунди , ясно ми е всичко как трябва да стане , освен как да го направя да изчаква 1 секунда, а и като цяло искам да разбера как работи тази функция.


Калкулира няколко цикъла, според тактовата честота и я пльосва 'inline' за да не се губи/пресмята и времето за викане на функция. От където пък следва, че ако я използваш на няколко места кодът ще нараства линейно на броя извиквания. Като цяло не е това подхода, защото така ще загубиш 1s процесорно време. Използвай таймер. Просто му проверявай стойността и при достигане на необходимата стойност сменяй цифрата и нулирай таймера.

Автор:  Cekins [ Пет Фев 25, 2011 6:23 pm ]
Заглавие: 

Недай си боже и ако се обработват прекъсвания - тая 1 секунда става + Х микро/мили секунди, където Х е голямо неизвестно :)

Проверката на таймера пък също не е най-удачния вариант - прави се със запис на предварително изчислена стойност в таймера и той като се препълни да цъкне прекъсване. А ако сложи кварц 2.097152 MHz с таймер1 ще може да прави и 1 секунда точно. А 4.194304 MHz има да се продават - с него става 2 Hz.

Автор:  relsys [ Пет Фев 25, 2011 9:20 pm ]
Заглавие: 

Cekins написа:
Недай си боже и ако се обработват прекъсвания - тая 1 секунда става + Х микро/мили секунди, където Х е голямо неизвестно :)

Проверката на таймера пък също не е най-удачния вариант - прави се със запис на предварително изчислена стойност в таймера и той като се препълни да цъкне прекъсване. А ако сложи кварц 2.097152 MHz с таймер1 ще може да прави и 1 секунда точно. А 4.194304 MHz има да се продават - с него става 2 Hz.


Това е ясно Цекинс, ама сметнах, че ще го хвърлим много надълбоко.

Автор:  Cekins [ Пет Фев 25, 2011 11:17 pm ]
Заглавие: 

Че то плитко има ли? То тва да не е РС?

От самото начало трябва да се свиква да се броят инструкциите :D

Автор:  relsys [ Съб Фев 26, 2011 12:42 pm ]
Заглавие: 

Cekins написа:
Че то плитко има ли? То тва да не е РС?

От самото начало трябва да се свиква да се броят инструкциите :D


Не е точно така. Обучението трябва да бъде последователно и методично, от по-лесно към по сложно. И да се повтарят нещата с цел получаване на трайни познания. Като съответно трябва да е съобразено с текущото ниво на развитие на мозъка в дадената област.

Автор:  Mhz [ Съб Фев 26, 2011 5:52 pm ]
Заглавие: 

От известно време се боря с Timer0 ама без успех ,
Код:
int Count=0;
int main(void)
{
TMR0=0;
T0CS=0;
T0SE=0;
PSA=0;
PS0=1;
PS1=0;
PS2=1;
while(1)
{
while(!T0IF);
T0IF=0;
Count++;
RB1=0;
if(Count==61)
{
Count=0;
}
}
}

Дайте някоя идея как да го направя да дели до 1hz ...
4Mhz ми е кварца

Автор:  fan [ Съб Фев 26, 2011 8:17 pm ]
Заглавие: 

Ами това, което си написал върши работа, но за да го видиш визуално трябва лека преработка. :)
Код:
#include <pic.h>

__CONFIG(WDTDIS & XT & UNPROTECT);

int Count=0;

void main(void)
{

   TRISB    = 0;
   TMR0   = 0;
   T0CS   = 0;
   T0SE   = 0;
   PSA      = 0;
   PS0      = 1;
   PS1      = 0;
   PS2      = 1;
   while(1)
   {
      while(!T0IF);
      T0IF=0;
      Count++;       
      if(Count==61)
      {
         RB1=!RB1;
         Count=0;
      }
   }

}

Автор:  relsys [ Съб Фев 26, 2011 8:57 pm ]
Заглавие: 

И за да не разхищаваме процесорното време, аз бих го написал така:

Код:
  if (T0IF)
    {   
      T0IF=0;
      Count++;       
      if(Count==61)
        {
           RB1=!RB1;
           Count=0;
        }
    } 

Автор:  Mhz [ Съб Фев 26, 2011 9:52 pm ]
Заглавие: 

Сменям името на темата, защото мисля да задавам тук и други глупави въпроси. :) Та още един въпрос някаква конкретна формула за изчисляване на делението на честотата от кварца?И как тази програма да я вкарам като функция и да я викам примерно като ми трябва закъснение 1s?

Автор:  a_stankov [ Нед Фев 27, 2011 10:45 am ]
Заглавие: 

За TMR0:

Tover=(256-(TMR0)) x 1/Kpc x 4/Fosc

Fosc - е в Mhz

Променяйки стойността на регистъра TMR0 и/или коефициента на прескалера (Kpc), можеш да променяш времето са препълване на таймера.

Автор:  Mhz [ Нед Фев 27, 2011 7:09 pm ]
Заглавие: 

Добре как да изравня дължината на импулса и паузата... защото получавам дълъг импулс и къса пауза и обратното? Също как да го направя така че да го викам като функция като ми трябва закъснение 1 секунда?

Автор:  a_stankov [ Нед Фев 27, 2011 10:02 pm ]
Заглавие: 

Я постни някакъв примерен код от това което пишеш за да ти помогнем практически. Принципно точно HI-Tech точно не съм ползвал но CCS и MicroC имат готови функции за време закъснение от ms и us.

Delay_ms(x);

Delay_us(x);

Като х може да има стойност до 65536.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/