180 likes | 190 Views
EE 319K Introduction to Embedded Systems. 2-D Arrays, Bitmaps, Sprites, Game Engines. Agenda. Agenda Software design 2-D array Bitmaps Wav Files Game Engines Lab 9. Software Design. Modular programming Make it easier to understand Each screen is a complete story without scrolling
E N D
EE 319KIntroduction to Embedded Systems 2-D Arrays, Bitmaps, Sprites, Game Engines
Agenda Agenda Software design 2-D array Bitmaps Wav Files Game Engines Lab 9
Software Design Modular programming Make it easier to understand Each screen is a complete story without scrolling Maximize the number of modules Minimize the interdependency Bandwidth of data passed from one to another Control coupling: actions in one cause effects in another Shared variables (very bad) Book Section 5.2
Software Design Design for test Consider how it will be tested while designing Module has three files Header: What the module does Code: How it works Test: A main program used to test the module Manage resources LCD graphics Time (processor cycles) A fun game requires careful control of time Input/Output Switches, slide pot, DAC, LCD
2-D Array or Matrix What: 2 rows and 3 columns, 8 bits each unsigned char M[2][3]; Why: Images Maps How: (C uses row major) C code to access M[i][j] = 5; Write this in assembly (R0=i, R1=j) i = row j = column n= # of columns Base+n*i+j Base+2*(n*i+j) Base+4*(n*i+j) Num of bytes/element
2-D Array or Matrix • What: 6 rows and 7 columns • short Connect4[6][7]; • Why: • Images • Maps • How: (row major) • Write C code to set array values to 0 j i Base+2*(7*i+j)
2-D Array or Matrix Assuming C[6][7] j // check the rows for(i=0;i<6;i++){ for(j=0;j<4;j++){ if((C[i][j]==1) &&(C[i][j+1]==1) &&(C[i][j+2]==1) &&(C[i][j+3]==1)){ Iwin(); } } } i 0 means free 1 means me -1 means you
Nokia 5110 Graphics Format Column 0 Row 0 Row 48 LCD is 48 rows, 84 columns, 1 bits/pixel Column 84
BMP File Format • Sprites as objects moving across screen Sprites are monochrome W pixels wide by H pixels high
BMP File Format Nokia5110_PrintBMP(48,24,SmallEnemy10pointA,0); 16 wide, 10 high Placed at x=48, y=24 F F F F FFFFFFFFFF FFFFFFFFFFFF FFF FFFF FFF F FFFFFFFF F F F F F F F The raw data from BMP file to illustrate how the image is stored (0s replaced with spaces).
BMP File Format const unsigned char Enemy10Point1[] = { 0x42,0x4D,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80, 0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x80, 0x00,0x00,0x80,0x80,0x80,0x00,0xC0,0xC0,0xC0,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF, 0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF,0xFF,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0F,0x00,0x00,0x00,0x00,0xF0,0x00, 0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00, 0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xF0,0x00, 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, 0x00,0xFF,0xF0,0xFF,0xFF,0x0F,0xFF,0x00, 0x00,0xF0,0xFF,0xFF,0xFF,0xFF,0x0F,0x00, 0x00,0xF0,0x0F,0x00,0x00,0xF0,0x0F,0x00, 0x00,0x00,0xF0,0x00,0x00,0x0F,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFF }; • Example BMP file written as C constant • Header (w x h) • Pixel data We use 4-bit BMP but all values above a threshold are deemed 1 for monochrome.
Timer 2A Periodic interrupt • Resolution: bus period • Precision: 32 bits • Max period: 53 sec (80 MHz) 0) activate timer2 clock 1) disable timer2A 2) Precision to 32 bits 3) periodic mode 4) TAILR value 5) clock resolution 6) clear timeout flag 7) arm timeout 8) priority 4 9) enable in NVIC 10) enable timer2A
Vector address Number IRQ ISR name inStartup.s NVIC Priority bits 0x00000038 14 -2 PendSV_Handler NVIC_SYS_PRI3_R 23 – 21 0x0000003C 15 -1 SysTick_Handler NVIC_SYS_PRI3_R 31 – 29 0x00000040 16 0 GPIOPortA_Handler NVIC_PRI0_R 7 – 5 0x00000044 17 1 GPIOPortB_Handler NVIC_PRI0_R 15 – 13 0x00000048 18 2 GPIOPortC_Handler NVIC_PRI0_R 23 – 21 0x0000004C 19 3 GPIOPortD_Handler NVIC_PRI0_R 31 – 29 0x00000050 20 4 GPIOPortE_Handler NVIC_PRI1_R 7 – 5 0x00000054 21 5 UART0_Handler NVIC_PRI1_R 15 – 13 0x00000058 22 6 UART1_Handler NVIC_PRI1_R 23 – 21 0x0000005C 23 7 SSI0_Handler NVIC_PRI1_R 31 – 29 0x00000060 24 8 I2C0_Handler NVIC_PRI2_R 7 – 5 0x00000064 25 9 PWMFault_Handler NVIC_PRI2_R 15 – 13 0x00000068 26 10 PWM0_Handler NVIC_PRI2_R 23 – 21 0x0000006C 27 11 PWM1_Handler NVIC_PRI2_R 31 – 29 0x00000070 28 12 PWM2_Handler NVIC_PRI3_R 7 – 5 0x00000074 29 13 Quadrature0_Handler NVIC_PRI3_R 15 – 13 0x00000078 30 14 ADC0_Handler NVIC_PRI3_R 23 – 21 0x0000007C 31 15 ADC1_Handler NVIC_PRI3_R 31 – 29 0x00000080 32 16 ADC2_Handler NVIC_PRI4_R 7 – 5 0x00000084 33 17 ADC3_Handler NVIC_PRI4_R 15 – 13 0x00000088 34 18 WDT_Handler NVIC_PRI4_R 23 – 21 0x0000008C 35 19 Timer0A_Handler NVIC_PRI4_R 31 – 29 0x00000090 36 20 Timer0B_Handler NVIC_PRI5_R 7 – 5 0x00000094 37 21 Timer1A_Handler NVIC_PRI5_R 15 – 13 0x00000098 38 22 Timer1B_Handler NVIC_PRI5_R 23 – 21 0x0000009C 39 23 Timer2A_Handler NVIC_PRI5_R 31 – 29 0x000000A0 40 24 Timer2B_Handler NVIC_PRI6_R 7 – 5 0x000000A4 41 25 Comp0_Handler NVIC_PRI6_R 15 – 13 0x000000A8 42 26 Comp1_Handler NVIC_PRI6_R 23 – 21 0x000000AC 43 27 Comp2_Handler NVIC_PRI6_R 31 – 29 0x000000B0 44 28 SysCtl_Handler NVIC_PRI7_R 7 – 5 0x000000B4 45 29 FlashCtl_Handler NVIC_PRI7_R 15 – 13 0x000000B8 46 30 GPIOPortF_Handler NVIC_PRI7_R 23 – 21 0x000000BC 47 31 GPIOPortG_Handler NVIC_PRI7_R 31 – 29 0x000000C0 48 32 GPIOPortH_Handler NVIC_PRI8_R 7 – 5 0x000000C4 49 33 UART2_Handler NVIC_PRI8_R 15 – 13 0x000000C8 50 34 SSI1_Handler NVIC_PRI8_R 23 – 21 0x000000CC 51 35 Timer3A_Handler NVIC_PRI8_R 31 – 29 0x000000D0 52 36 Timer3B_Handler NVIC_PRI9_R 7 – 5 0x000000D4 53 37 I2C1_Handler NVIC_PRI9_R 15 – 13 0x000000D8 54 38 Quadrature1_Handler NVIC_PRI9_R 23 – 21 0x000000DC 55 39 CAN0_Handler NVIC_PRI9_R 31 – 29 0x000000E0 56 40 CAN1_Handler NVIC_PRI10_R 7 – 5 0x000000E4 57 41 CAN2_Handler NVIC_PRI10_R 15 – 13 0x000000E8 58 42 Ethernet_Handler NVIC_PRI10_R 23 – 21 0x000000EC 59 43 Hibernate_Handler NVIC_PRI10_R 31 – 29 0x000000F0 60 44 USB0_Handler NVIC_PRI11_R 7 – 5 0x000000F4 61 45 PWM3_Handler NVIC_PRI11_R 15 – 13 0x000000F8 62 46 uDMA_Handler NVIC_PRI11_R 23 – 21 0x000000FC 63 47 uDMA_Error NVIC_PRI11_R 31 – 29 Lab 7 Lab 8 Lab 9 77 total INTERRUPT VECTORS
Timer 2A Periodic interrupt Max is 53 sec unsigned long TimerCount; void Timer2_Init(unsigned long period){ unsigned long volatile delay; SYSCTL_RCGCTIMER_R |= 0x04; // 0) activate timer2 delay = SYSCTL_RCGCTIMER_R; TimerCount = 0; TIMER2_CTL_R = 0x00000000; // 1) disable timer2A TIMER2_CFG_R = 0x00000000; // 2) 32-bit mode TIMER2_TAMR_R = 0x00000002; // 3) periodic mode TIMER2_TAILR_R = period-1; // 4) reload value TIMER2_TAPR_R = 0; // 5) clock resolution TIMER2_ICR_R = 0x00000001; // 6) clear timeout flag TIMER2_IMR_R = 0x00000001; // 7) arm timeout NVIC_PRI5_R = (NVIC_PRI5_R&0x00FFFFFF)|0x80000000; // 8) priority 4 NVIC_EN0_R = 1<<23; // 9) enable IRQ 23 in TIMER2_CTL_R = 0x00000001; // 10) enable timer2A } Output sound at 11.025 kHz
Timer 2A plays sounds // trigger is Timer2A Time-Out Interrupt // set periodically TATORIS set on rollover void Timer2A_Handler(void){ TIMER2_ICR_R = 0x00000001; // acknowledge TimerCount++; // run some background stuff here } void Timer2A_Stop(void){ TIMER2_CTL_R &= ~0x00000001; // disable } void Timer2A_Start(void){ TIMER2_CTL_R |= 0x00000001; // enable } TATORIS Ack Output sounds here Stuff Call to stop sound Call to start sound
Lab9 – Space Invaders, Pipe Dreams … • There must be at least one button and one slide pot. • There must be at least three images on the LCD display that move. • There must be sounds appropriate for the game. • The score should be displayed on the screen (but it could be displayed before or after the game action). • At least two interrupt ISRs must used in an appropriate manner. • The game must have a “time” aspect to it (For e.g., if you don’t move a sprite within a certain time it could be killed). Contrast with ConnectFour which is a taking “turns” game • The game must be both simple to learn and fun to play.
Lab 9 – Grading • The TA will certify your game and put you into one of two groups. Group A or B • Lab 9 will be graded subjectively by other students • During class we will setup two groups of stations each • One team member demonstrates • The other team member scores other 7 games in group • Games are rank-ordered according to level of fun. Score is based on rank in group. • 80 if 0th to 49th percentile • 90 if 50th to 74th percentile • 100 if 75th to 100th percentile