hello,
can I do multitasking in ARM LPC2148. I want to display on LCD, LED and 7segment at the same time.
is it possible?????
As Andy has already mentioned, multitasking is not necessary for what you've described.
A simple supervisory loop processing each module would almost certainly be sufficient.
I wrote this at 2008.Nov.04 =>
int main (void) { char LFnCR[] = "\n\r"; init_VIC(); UARTInit(9600); /* baud rate setting */ init_timer(); enable_timer(0); PINSEL2 = PINSEL2 & (~0x08); // for GPIO 8LED IODIR1 = LED8SET; // for GPIO 8LED MSPI_init(); while (1) { /* Loop forever */ GPIO8LED_show(); MSPI7LED_show(); UART0rbREAD(); if (cmd_ready) { UART0sbWRITE( (BYTE *)cmd_string, strlen((const char *)cmd_string) ); UART0sbWRITE( (BYTE *)LFnCR , 2 ); UART0sendKICK(); memset( cmd_string, 0x00, 32 ); cmdstr_i = 0; cmd_ready = 0; } KEYS_control(); } // return 0; } void KEYS_check(void) { IOPIN0_last = IOPIN0_this; IOPIN0_this = IOPIN0; IOPIN0_stat = IOPIN0_last ^ IOPIN0_this & IOPIN0_last; if ( ( IOPIN0_stat & KEY1 ) == KEY1 ) KEY1_pressed = 1; if ( ( IOPIN0_stat & KEY2 ) == KEY2 ) KEY2_pressed = 1; if ( ( IOPIN0_stat & KEY3 ) == KEY3 ) KEY3_pressed = 1; if ( ( IOPIN0_stat & KEY4 ) == KEY4 ) KEY4_pressed = 1; if ( ( IOPIN0_stat & KEY5 ) == KEY5 ) KEY5_pressed = 1; if ( ( IOPIN0_stat & KEY6 ) == KEY6 ) KEY6_pressed = 1; timer_KEYpress = 2; } void KEYS_control(void) { static BYTE GPIO8LED_pos = 1; static BYTE MSPI7LED_pos = 0; BYTE const HEX_TAB[16] = { // 0 1 2 3 4 5 6 7 8 9 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, // A b C d E F 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; if ( KEY1_pressed == 1 ) { GPIO8LED_show_on = 1 - GPIO8LED_show_on; KEY1_pressed = 0; } if ( KEY4_pressed == 1 ) { MSPI7LED_show_on = 1 - MSPI7LED_show_on; KEY4_pressed = 0; } if ( GPIO8LED_show_on == 0 ) { if ( KEY2_pressed == 1 ) { if ( GPIO8LED_pos > 1 ) GPIO8LED_pos--; KEY2_pressed = 0; } if ( KEY3_pressed == 1 ) { if ( GPIO8LED_pos < 8 ) GPIO8LED_pos++; KEY3_pressed = 0; } IOCLR1 = 1 << (17+GPIO8LED_pos) ; IOSET1 = ~( 1 << (17+GPIO8LED_pos) ); } if ( MSPI7LED_show_on == 0 ) { if ( KEY5_pressed == 1 ) { if ( MSPI7LED_pos > 0 ) MSPI7LED_pos--; KEY5_pressed = 0; } if ( KEY6_pressed == 1 ) { if ( MSPI7LED_pos < 15 ) MSPI7LED_pos++; KEY6_pressed = 0; } IOCLR0 = HC595_CS; SPI_SPDR = HEX_TAB[MSPI7LED_pos]; while( 0 == (SPI_SPSR & 0x80) ); IOSET0 = HC595_CS; } }
void GPIO8LED_show(void) { static BYTE GPIO8LED_on = 1; static BYTE GPIO8LED_i = 0; if ( ( timer_GPIO8LED == 0 ) && ( GPIO8LED_show_on ) ) { if (GPIO8LED_on) { IOSET1 = ~( LED8SET & ( 7 << (18+GPIO8LED_i) ) ); } else { IOCLR1 = LED8SET & ( 7 << (18+GPIO8LED_i) ); if ( GPIO8LED_i == 7 ) { GPIO8LED_i = 0; } else { GPIO8LED_i++; } } GPIO8LED_on = 1 - GPIO8LED_on; timer_GPIO8LED = 8; } } void MSPI_init(void) { //PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // Connect SPI PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ; IODIR0 = HC595_CS; S0SPCCR = 0x52; // Set SPI Clock S0SPCR = (0 << 3) | // CPHA = 0, [del] (1 << 4) | // CPOL = 1, SCK [del] (1 << 5) | // MSTR = 1, SPI [del] (0 << 6) | // LSBF = 0, SPI [del] (0 << 7); // SPIE = 0, [del] } void MSPI7LED_show(void) { static BYTE MSPI7LED_i = 0; BYTE const HEX_TAB[16] = { // 0 1 2 3 4 5 6 7 8 9 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, // A b C d E F 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; if ( ( timer_MSPI7LED == 0 ) && ( MSPI7LED_show_on ) ) { IOCLR0 = HC595_CS; // 74HC595 SPI_SPDR = HEX_TAB[MSPI7LED_i]; while( 0 == (SPI_SPSR & 0x80) ); // Wait IOSET0 = HC595_CS; if ( MSPI7LED_i == 15 ) { MSPI7LED_i = 0; } else { MSPI7LED_i++; } timer_MSPI7LED = 95; } }
void Timer0Handler (void) __irq { timer_counter++; if ( timer_KEYpress != 0 ) timer_KEYpress--; else KEYS_check(); if ( timer_GPIO8LED != 0 ) timer_GPIO8LED--; if ( timer_MSPI7LED != 0 ) timer_MSPI7LED--; T0IR = 1; /* clear interrupt flag */ VICVectAddr = 0; /* Acknowledge Interrupt */ }
The above code which I posted, is a [low quality] demonstration for: A simple supervisory loop processing each module would almost certainly be sufficient.