Autor Tema: lpc2148 + keil problemas  (Leído 3043 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
lpc2148 + keil problemas
« en: 20 de Febrero de 2008, 10:08:31 »
Hola pshykon,

ya he empezado a jugar con la placa de evaluacion, y programar el arm7, esta resultando mas sencillo de lo que pensaba. Ya he tocado los puertos I/O normales y fast, las interrupciones externas (con su isr), y el puerto serie 0 y 1 (autobad detection, enviar y recibir bytes con o sin FIFO, por polling o con interrupcion), y el timer 0,1 (con una isr que se ejecuta cada X milisegundos).

Tb estoy empezando a tener ya dudas y algunos problemas. Te cuento:
1) Cuando activo la interrupcion de la uart0 para recepcion, solo me entra una vez, y ademas me desactiva el resto de interrupciones (no entra en ninguna ya). No acabo de entender que me falta.

esta es mi interrupcion:
void Uart0_interrupt(void) __irq
{
//   unsigned char a;

//   a= U0LSR;
   if((U0IIR & 0x0000007)== 0x00000004)
   {
       U0THR = U0RBR;   // un eco de prueba
   }
}

esta es mi inicializacion:
void Ini_uart0(void)
{
  PINSEL0 |= 0x00000005;
  U0LCR = 0x83;   // 8 bit, 1 stop bit, no paridad, activamos acceso a DLL
  U0DLL = 8;
  U0LCR = 0x03; // desactivamos acceso a DLL
  U0IER = 0x01;   // activamos interrupcion de recepcion
  U0FCR = 0x41;   // Habilitamos FIFO, y trigger a 4 bytes
 
  VICVectAddr3 = (unsigned) Uart0_interrupt;
  VICVectCntl3 = 0x00000026;   // Habilitamos este vector de interrupcion y asociamos a uart0
  VICIntEnable |= 0x00000040;   // Habilitamos interrupcion uart0 
}   

Pues bien, cuando entra la primera vez, ya no no vuelve a entrar. El programa en el bucle principal sigue ejecutandose normal (vuelve bien de la interrupcion), pero algo hago que desactivo las interrupciones. He revisado en modo depuracion, y los valores de los registros que inicializo (como VICIntEnable, etc...) no han cambiado.

2) a veces me da la sensacion que el puerto serie se la va la pinza, y que sin regrabar, a veces no va o reseteas y va... pero esto lo digo asi en voz baja, porque posiblemente sea alguna metida de pata mia, algo que no acabo de entender bien.

De todos modos, sigo dandole vueltas, a ver si averiguo que ocurre.

Un saludo

Desconectado psykhon

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 823
Re: lpc2148 + keil problemas
« Respuesta #1 en: 20 de Febrero de 2008, 10:28:26 »
fijate en este codigo que anda

Código: [Seleccionar]

static void UART0ISR(void) __attribute__ ((interrupt ("IRQ")));
static void UART0ISR(void) {
   unsigned char c;
   c=U0IIR;          // read the interrupt ID register to clear pending interrupts   
   if (U0LSR & 0x80) // If error
      c=U0RBR;       // clear the error
   if (U0LSR & 0x01){// if character
        lastrecievedbyte=U0RBR;
        uart0_rx_buffer[uart0_rx_inptr]=lastrecievedbyte;
        uart0_rx_inptr++;
        uart0_rx_inptr &= (UART0_RX_BUFFER_SIZE-1);
        UARTTimer=UARTTIME;
   }
   // if (c & 0x02){// if tx buffer empty
   if (U0LSR & 0x20)   {
      if (uart0_tx_inptr == uart0_tx_outptr){
           U0IER = 1; // Turn off Interrupts
      } else {
           c=uart0_tx_buffer[uart0_tx_outptr];
           uart0_tx_outptr++;
           uart0_tx_outptr &= (UART0_TX_BUFFER_SIZE-1);
           U0THR = c;
           if (UARTTimer < 2)
              UARTTimer=2;
      }
   }
   VICVectAddr = 0; // Update VIC priorities
   lastinterrupt=SERIALINTERRUPT;
}
No, no se lo que estoy haciendo. Nadie sabe que estoy haciendo. Por eso se llama "Investigacion".

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: lpc2148 + keil problemas
« Respuesta #2 en: 20 de Febrero de 2008, 10:36:58 »
Hola Psykhon,

gracias por tu codigo. Nada mas mirarlo, me he dado cuenta de mi error, y eso que hay que hacer lo mismo en todas las interrupciones. Mira que lo he puesto en la ISR de la interrupcion externa, y en la del timer,: Pues aqui se me olvida. Pufff menos mal, llevaba desde ayer tarde dandole vueltas jeje:

no habia puesto al final de la ISR lo de:
VICVectAddr = 0x00000000;   // Dummy write to address

Un saludo

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: lpc2148 + keil problemas
« Respuesta #3 en: 04 de Marzo de 2008, 18:20:51 »
Hola Psykhon, como va la cosa...aqui voy con otra dudilla. Se trata del SPI.

He probado a enviar un byte mediante polling (osea miro el flag SPIF del registro de estado, para saber que puedo escribir otro byte y no sobreescribir el anterior). Esto es OK.

Como segundo paso, hago que cada vez que se envia un byte, me salte una interrupcion. Dentro de la interrupcion envio un nuevo caracter. El problemilla que surge, es que al 3º o 4º caracter me salta el flag de COLISION (WCOL). Solucion: dentro de la interrupcion leo el registro de estado, y espero a que este a '1' el bit SPIF, que me indica que puedo escribir un nuevo byte).

Mi pregunta es si es necesario esto? segun el datasheet tengo entendido que la interrupcion solo ocurre si:
- has activado la interrupcion (SPIEN)
- si se ha puesto a '1' el flag SPIF(byte enviado) o WCOL (has escrito un byte, cuando todavia no ha salido el anterior)

Osea escribo el primer byte a mano, estando la interrupcion activada (SPIEN='1'). Si activa la interrupcion es porque ha salido el byte (colision no puede haber porque solo he enviado 1). Entonces envio un nuevo byte dentro de la interrupcion. La proxima vez que se activa deberia ser por que ha salido (no puede haber colision, porque el que acabo de escribir ha sido sabiendo que habia salido el anterior). Y asi sucesivamente.... Porque me da error de WCOL?
es decir porque ocurre la colision?

Un saludo.


 

anything