Отговори на тема  [ 41 мнения ]  Отиди на страница Предишна  1, 2, 3
Проблем с таймер 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с таймер
Прав си, но просто така съм свикнал, тъй като да кажем флаговете за бутоните ги ползвам винаги така. Друг е въпроса дали ако извадя част от функциите от таймера, ще успея да променя бързодействието.
Преди малко пробвах нещо друго - Т1 го сложих на 80us и като натисках бутоните импулса се увеличаваше с точно 80us без да се получава някакво отместване. Докато при 1мс на прекъсване, не покачваше стойносттта с точно 1мс.


Вто Сеп 08, 2015 9:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Проблем с таймер
Само не знам защо реши че не можеш да изпозлваш хардуерния. PCA модула може да изпозлва следните сорсове : SYSCLK, SYSCLK/4, SYSCLK/12, Timer 0 overflow.
A timer 0 може да се клоква по sysclk / 12, и може да е в 16 битов режим, което при 2 Mhz sysclk прави 2/(12*65536) = 2.54 hz ориентировъчно, което пък значи че ако клочиш по него PCA който е в 16 битов режим може да получиш импулс с честота мнооого под 1 Hz. Поогледай пак описанието PCA да не би аз да се бъркам нещо, ама едва ли .... както казах тия процесори поне по отношение на PWM иам малко неща които не ги могат.


Сря Сеп 09, 2015 3:11 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Проблем с таймер
Аааа и както колегите съветват разкарай всичко от прекъсването, в прекъсването трябва да имаш минимално изпълним код, всичко трябва да излезе отвън, прекъсванията не са диспечър на процеси, ако искаш да работиш на тоя принцип пусни му RTOS-а, върви с Кейла, но лично за мен е безсмислен за такова въшле.


Сря Сеп 09, 2015 3:13 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с таймер
ТоHu, можеш ли дадеш пример как точно ще стане това защото като разглеждах PCA модула не ми стана ясно. Както го разбирам ще мога да променям само PWM, но не и честотата.


Сря Сеп 09, 2015 7:37 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Проблем с таймер
Настройваш pca да се клочи по препълване на таимер 0, така честотата я регулираш с прелоуда на таймер 0 а pwm от съответния регистър, имаш 4 канала. Ти нямаш ли config toolа на силабс?


Сря Сеп 09, 2015 8:52 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с таймер
Имам го, но просто ми е малко мъгляво как ще стане цялото нещо.


Сря Сеп 09, 2015 8:57 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Проблем с таймер
Погледни там, pca го правиш по таймера, това е най-нормалния начин. Таймера го сетваш както рчти е кеф. Ако 8 битов ти е ок като честота го слагаш да е аутолоад, ако ти е малко го сетваш в 16 битов режим и го зареждаш през прекъсване за нужната честота.
Например на 1 мхц и делител 1, искаш честота 1 кхц.На всяко прекъсване по препълване влизаш и го сетваш на 64535, така той ще изцъка 1000 клока и ще препълни отново и т.н. Ето ти цъкане на 1 кхц. Честотите са съвсем примерни.... Пиша от талафон така че в съкратен вид


Сря Сеп 09, 2015 9:05 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с таймер
Т.е. нагласям Т0 на 1мс, след това слагам PCA като предварително съм го нагласил да се пуска при Timer0 overflow?
Код:
init_PCA()
{
    PCA0CN    = 0x40;
    PCA0MD    = 0x04;

}
void timer0_ISR (void) interrupt 1
{
TH0 = 0xFA;//1ms
TL0 = 0xCB;

    PCA0L     = 0xCB;
    PCA0H     = 0xFA;}


Сря Сеп 09, 2015 9:52 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Проблем с таймер
Е все още съм на талафон не ги помня наизуст регистрите, аз зятова те питах нямаш ли конфиг тула. Като се разсъня след малко ще пусна компо.


Сря Сеп 09, 2015 3:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Проблем с таймер
Ето това мисля че е :

void Timer_Init()
{
TMOD = 0x02;
TH0 = 0x58;
}


void PCA_Init()
{
PCA0CN = 0x40;
PCA0MD = 0x04;
PCA0CPM0 = 0xC2;
PCA0CPH0 = 0x80;
}

Това е при осцилатор 2 Mhz и timer 0 в autoload режим. При по висока тактова честота ще трябва да го сетваш ръчно.


Сря Сеп 09, 2015 5:02 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пет Авг 07, 2009 4:58 pm
Мнения: 273
Мнение Re: Проблем с таймер
Тук има засичане на много бутони, ако искаш, хвърли един поглед. Не е даден кодът на извикващите функции, но мисля, че принципът на работа се разбира.


Код:
/* Function:    io_check_inputs
* Description: Check the input levels of all intrusions and write the changes if any.
* Parameter:   power_state_t power_state: use as indicator if the device is battery powered at the moment.
* Return:      intr_state_t intr_rc: status indicationg input changes:
*                  INTR_STATE_NOT_DETECTED: no input changes detected.
*                  INTR_STATE_RECHECK_DETECTED: a change detected but still not sure it is true. After 19ms will get decision!
*                  INTR_STATE_DETECTED: found changes in one or more inputs.
*/
intr_state_t io_check_inputs(uint8_t *online_status, const power_state_t power_state)
{
    static intr_state_t     intr_state;
    static uint8_t          timer1ms;
    intr_state_t            intr_rc;                        // Signal the caller about the intrusions check progress.
    static uint8_t          old_port[PORT_INDEX_MAX];       // The initial values - 0 - are equal to all doors closed (no intrusion).
    uint8_t                 new_port[PORT_INDEX_MAX];
    uint8_t                 u;

    intr_rc = INTR_STATE_NOT_DETECTED;                      // No change in any intrusion.

    io_read_inputs(new_port);

    switch (intr_state)
    {
        case INTR_STATE_NOT_DETECTED:
            if (memcmp(old_port, new_port, PORT_INDEX_MAX))
            {
                memcpy(old_port, new_port, PORT_INDEX_MAX);

                intr_state  = INTR_STATE_RECHECK_DETECTED;
                intr_rc     = INTR_STATE_RECHECK_DETECTED;
                timer1ms    = g_tmr0_tick1ms;
            }
            break;

        case INTR_STATE_RECHECK_DETECTED:
            intr_rc = INTR_STATE_RECHECK_DETECTED;          // The caller is informed that currently some intrusion is checking!
            u       = g_tmr0_tick1ms - timer1ms;

            if ((u > INTR_RECHECK_INTERVAL) || (POWER_STATE_OFFLINE == power_state))
            {
                intr_state = INTR_STATE_NOT_DETECTED;       // Ready to detect another intrusion.

                if (!memcmp(old_port, new_port, PORT_INDEX_MAX))
                {   // After the required delay the input levels are still the same - door is open/close.
                    intr_rc = INTR_STATE_DETECTED;
                    io_copy_inputs(online_status, new_port);
                }
            }
            break;
    }

    return intr_rc;
}


Пет Сеп 11, 2015 8:33 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 41 мнения ]  Отиди на страница Предишна  1, 2, 3

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни