por rod_ladeira » 05 Fev 2009 09:09
As interrupcoes IRQ sao nao vetoriadas e esta habilitado as interrupções UART0, PWM e Browm Out detect.
VICIntEnable |= 0x00100170;
Abaixo encontra-se o tratamento da interrupção IRQ
__irq void Trata_IRQ(void){ // timer de 1ms utilizando o pwm
static char Modo_freqA = DOWN, count = 0, count_amostra = 0;
int canal;
int i;
int status;
static int status_a=0;
VICIntEnable |= 0x00000170;
PWMLER = 0x0000007F;
if(PWMIR == 0x00000004){ // interrupção de geração das frequencias de leitura do mux
count++;
if(Modo_freqA == UP){
Modo_freqA = DOWN;
MA_WritePort_GPIO(0,0,PORT_FREQA);
PWMMR2 = PWMTC + ALTO_4051;
}
else if(Modo_freqA == DOWN){ // nivel UP
Modo_freqA = UP;
MA_WritePort_GPIO(0,PORT_FREQA,PORT_FREQA);
PWMMR2 = PWMTC + BAIXO_4051;
}
else{//volta do intervalo
MA_WritePort_GPIO(0,0,PORT_FREQA);
MA_WritePort_GPIO(0,PORT_FREQB,PORT_FREQB);
MA_WritePort_GPIO(0,0,PORT_FREQC);
PWMMR2 = PWMTC + ALTO_4051;
Modo_freqA = DOWN;
count = 0;
}
if(count == BAIXO_B){
MA_WritePort_GPIO(0,0,PORT_FREQB);
}
if(count == ALTO_C){
MA_WritePort_GPIO(0,PORT_FREQC,PORT_FREQC);
}
if(count == COUNT_INTERV){
Modo_freqA = INTERVALO;
PWMMR2 = PWMTC + INTERV_4051;
}
status_a = ~(IO0PIN);
for(i=0;i<100;i++);
MA_WritePort_GPIO(0,0,ReadConv); // faz a coversão do AD
for(i=0;i<100;i++); // aproximadamente 5us
MA_WritePort_GPIO(0,ReadConv,ReadConv); // Converte para asaida do conversor AD
PWMMR3 = PWMTC + TEMPO_CONVERSAO;
PWMTCR &= ~(0x00000001);
PWMIR &= 0x00000004;
PWMTCR |= (0x00000001);
}
else if(PWMIR == 0x00000008){
canal = MASK_CANAL & status_a;
switch(canal){
case MOLEA:
Mole[0] += Valor_AD();
break;
case MOLEB:
Mole[2] += Valor_AD();
break;
case MOLEC:
Mole[4] += Valor_AD();
break;
case DUROA:
Duro[0] += Valor_AD();
break;
case DUROB:
Duro[2] += Valor_AD();
break;
case DUROC:
Duro[4] += Valor_AD();
if(count_amostra < 3)
count_amostra++;
else{
count_amostra = 0;
for(i=0;i<N_CANAIS;i+=2){
Duro[i] /= 4;
Mole[i] /= 4;
}
flag_hab_tratamento = true;
if(flag_hab_portico){ // Portico habilitado
if(!hab_infra){
Trata_Sinal();
for(i=0;i<N_CANAIS;i+=2){
Duro[i] = 0;
Mole[i] = 0;
}
}
else
i = (IO0PIN);
i >>= 15;
i &= 0x00000001;
if(i){
if(!flag_infra_temp)
passagens++;
LigaRelogio(RelInfra,KInfra);
flag_infra = true;
flag_infra_temp = true;
}
else
flag_infra_temp = false;
if(flag_infra){ // infra hab e = 0
Trata_Sinal();
for(i=0;i<N_CANAIS;i+=2){
Duro[i] = 0;
Mole[i] = 0;
}
}
}
if(flag_bargraph){ // Leitura do Bargraph
flag_bargraph = false;
for(i=0;i<N_CANAIS;i+=2){
if(Mole[i] > Duro[i])
Bar[i] = (int)((Mole[i] - Duro[i])/150);
else
Bar[i] = (int)((Duro[i] - Mole[i])/150);
if(Bar[i] > 15)
Bar[i] = 15;
Duro[i] = 0;
Mole[i] = 0;
}
flag_atualiza_barg = true;
}
}
break;
}
PWMTCR &= ~(0x00000001);
PWMIR &= 0x00000008;
PWMTCR |= (0x00000001);
}
else {
PWMTCR &= ~(0x00000001);
PWMIR &= 0x00000002;
PWMTCR |= (0x00000001);
PWMMR1 = PWMTC + TIMER_1ms;
PWMTCR &= ~(0x00000001);
PWMMR0 = PWMTC + 1;
PWMTCR |= (0x00000001);
Relogios ();
if((flag_delay_ms == false) && (count_ms != 0 ))
count_ms--;
else if (count_ms == 0)
flag_delay_ms = true;
}
PWMTCR &= ~(0x00000001);
PWMMR0 = PWMTC + 1; // atualiza registradores
PWMTCR |= (0x00000001);
if(VICIRQStatus & 0x00100000)
Grava_EEPROM();
if(VICIRQStatus & 0x00000040){ //serial
//Trata_Serial();
status = MA_GetChar_UART0(&serial);
if( (status & 0x01) && (count_serial < 30) ){
buffer_serial[count_serial] = serial;
count_serial++;
}
}
VICVectAddr = 0xFFFFFFFF;
}
Tratamento da interrupção FIQ:
__irq void Trata_FIQ(void){
WDFEED = 0xAA;
WDFEED = 0x55;
if(T0IR != 0)
switch(T0IR){
//case 0x00000000:
//break;
case 0x00000002: // canal 1
if(Timer_1 == DOWN){
T0MR1 = T0MR1 + Alto_1;
Timer_1 = UP;
}
T0IR = 0x00000002;
break;
case 0x00000001: // canal 0
if(Timer_0 == DOWN){
T0MR1 = T0MR0 + Baixo_1;
Timer_0 = UP;
Timer_1 = DOWN;
}
else
Timer_0 = DOWN;;
T0MR0 = T0MR0 + Periodo_1;
T0IR = 0x00000001;
break;
case 0x00000008: // canal 3
if(Timer_3 == DOWN){
T0MR3 = T0MR3 + Alto_2;
Timer_3 = UP;
}
T0IR = 0x00000008;
break;
case 0x00000004: // canal 2
if(Timer_2 == DOWN){
T0MR3 = T0MR2 + Baixo_2;
Timer_2 = UP;
Timer_3 = DOWN;
}
else
Timer_2 = DOWN;
T0IR = 0x00000004;
T0MR2 = T0MR2 + Periodo_2;
break;
default:
byte_shadow.BYTE = T0IR;
if(byte_shadow.BIT.BIT1){
if(Timer_1 == DOWN){
T0MR1 = T0MR1 + Alto_1;
Timer_1 = UP;
}
T0IR = 0x00000002;
}
if(byte_shadow.BIT.BIT3){
if(Timer_3 == DOWN){
T0MR3 = T0MR3 + Alto_2;
Timer_3 = UP;
}
T0IR = 0x00000008;
}
if(byte_shadow.BIT.BIT0){
if(Timer_0 == DOWN){
T0MR1 = T0MR0 + Baixo_1;
Timer_0 = UP;
Timer_1 = DOWN;
}
else
Timer_0 = DOWN;;
T0MR0 = T0MR0 + Periodo_1;
T0IR = 0x00000001;
}
break;
}
if(T1IR != 0)
switch(T1IR){
case 0x00000002: // canal 1
if(Timer1_1 == DOWN){
T1MR1 = T1MR1 + Alto_3;
Timer1_1 = UP;
}
T1IR = 0x00000002;
break;
case 0x00000001: // canal 0
if(Timer1_0 == DOWN){
T1MR1 = T1MR0 + Baixo_3;
Timer1_0 = UP;
Timer1_1 = DOWN;
}
else
Timer1_0 = DOWN;
T1MR0 = T1MR0 + Periodo_3;
T1IR = 0x00000001;
break;
default:
if(Timer1_1 == DOWN){
T1MR1 = T1MR1 + Alto_3;
Timer1_1 = UP;
}
T1IR = 0x00000002;
break;
}
VICVectAddr = 0xFFFFFFFF;
}
Obrigado pelos replays........