[ECOS] [ [ECOS] eb40a Interrupt, TC]

Carlos Perilla transfers@phaber.com
Fri Oct 24 19:04:00 GMT 2003


Nick Garnett wrote:

>
> You should not be calling cyg_interrupt_enable(). This is done
> implicitly when the scheduler is started. Calling it before then can
> allow interrupts to be delivered to code that is not yet ready.
>
> The code you have posted seems fine as far as it goes. Check that you
> have used the right vector number.
>
> Your code does not show where you are setting up the timer  device. I
> suspect that this is where the problems are to be found. Have you, for
> example, set the correct interrupt enable bit for the timer mode you
> are using.
>
>
>
>  
>
Well, I got what the problem was, a missplaced bit, now I have the 
problem that the  interrupt is taking over the system.
I disabled the interrupt and created a thread that peeks on RA, and RB, 
and everything it's working.
The signal I'm measuring is 1Khz and I'm placing a Interrupt on the  
rising edge, it's too fast?
I don't think so, but I think it's more about my slow code, any ideas?


Here's the code Interrupt
cyg_uint32 interrupt_TC1_isr(
             cyg_vector_t vector,
             cyg_addrword_t data) //Based  on eCos book, pag 48
{
cyg_interrupt_mask(vector);
cyg_interrupt_acknowledge(vector);
return(CYG_ISR_HANDLED | CYG_ISR_CALL_DSR);

}
void interrupt_TC1_dsr(
            cyg_vector_t vector,
            cyg_ucount32 count,
            cyg_addrword_t data)
{
HAL_IO_REGISTER REGISTER;
cyg_semaphore_post(&TC1_data_ready);
REGISTER=TC_BASE+TC_CHANNEL1+TC_RA;
HAL_READ_UINT16(REGISTER,TC1_PERIOD);
REGISTER=TC_BASE+TC_CHANNEL1+TC_RB;
HAL_READ_UINT16(REGISTER,TC1_HIGH);
cyg_interrupt_unmask(vector);
}

And I have created in the CYG_USER_START

cyg_interrupt_enable();
cyg_interrupt_create(
             intTC1_vector,
             intTC1_priority,
             0,
             &interrupt_TC1_isr,
             &interrupt_TC1_dsr,
             &intTC1_handle,
             &intTC1);
cyg_interrupt_attach(intTC1_handle);
cyg_interrupt_unmask(intTC1_vector);

cyg_semaphore_init(&TC1_data_ready,TC1_data_ready_counter);
cyg_semaphore_init(&TC1_trans,TC1_trans_counter);
cyg_semaphore_init(&TC1_end_trans,TC1_ent_trans_counter);

And here's the configuration Code

 TC_REGISTER=0;
 TC_REGISTER=TC_REGISTER | (TC_CMR_CLSKS_MCK2<<TC_CMR_CLKS);
 TC_REGISTER=TC_REGISTER | (TC_CMR_CLKI_FALLING<<TC_CMR_CLKI);
 TC_REGISTER=TC_REGISTER | (TC_CMR_BURST_MODE<<TC_CMR_BURST);
 TC_REGISTER=TC_REGISTER | (TC_CMR_LDBSTOP_NONE<<TC_CMR_LDBSTOP);
 TC_REGISTER=TC_REGISTER | (TC_CMR_LDBDIS_NONE<<TC_CMR_LDBDIS);
 TC_REGISTER=TC_REGISTER | (TC_CMR_ETREDG_RISING_EDGE<<TC_CMR_ETRGEDG);
 TC_REGISTER=TC_REGISTER | (TC_CMR_ABETRG_TIOA<<TC_CMR_ABETRG);
 TC_REGISTER=TC_REGISTER | (TC_CMR_CPCTRG_NONE<<TC_CMR_CPCTRG);
 TC_REGISTER=TC_REGISTER | (TC_CMR_WAVE_CAPTURE<<TC_CMR_WAVE);
 TC_REGISTER=TC_REGISTER | (TC_CMR_LDRA_RISING_EDGE<<TC_CMR_LDRA);
 TC_REGISTER=TC_REGISTER | (TC_CMR_LDRB_FALLING_EDGE<<TC_CMR_LDRB);

REGISTER=TC_BASE+TC_CMR+TC_CHANNEL1;
HAL_WRITE_UINT32(REGISTER,TC_REGISTER);

 TC_REGISTER=0;
 TC_REGISTER=TC_REGISTER | (TC_IER_ENABLE<<TC_IER_LDRAS);

 REGISTER=TC_BASE+TC_IER+TC_CHANNEL1;
 HAL_WRITE_UINT32(REGISTER,TC_REGISTER);
 REGISTER=TC_BASE+TC_IDR+TC_CHANNEL1;
 HAL_WRITE_UINT32(REGISTER,~TC_REGISTER);

Te purpose of this conf is to do this
PWM
~1Khz
              ________                _________
             |                |              |                  |
       ___|                |_______|                  |_____
          RA              RB        RA
          IRQ                          IRQ
       CV=0                          CV=0



Carlos Perilla


-- 
Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss



More information about the Ecos-discuss mailing list