This is operation test program.
Dependencies: GR-PEACH_video mbed
main.cpp@0:a749dcbc0cf6, 2016-09-02 (annotated)
- Committer:
- TetsuyaKonno
- Date:
- Fri Sep 02 06:53:21 2016 +0000
- Revision:
- 0:a749dcbc0cf6
First program
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TetsuyaKonno | 0:a749dcbc0cf6 | 1 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 2 | //Supported MCU: RZ/A1H |
TetsuyaKonno | 0:a749dcbc0cf6 | 3 | //File Contents: Operation Test Program (GR-PEACH version on the Micon Car) |
TetsuyaKonno | 0:a749dcbc0cf6 | 4 | //Version number: Ver.1.02 |
TetsuyaKonno | 0:a749dcbc0cf6 | 5 | //Date: 2016.02.23 |
TetsuyaKonno | 0:a749dcbc0cf6 | 6 | //Copyright: Renesas Electronics Corporation |
TetsuyaKonno | 0:a749dcbc0cf6 | 7 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 8 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 9 | //This program supports the following boards: |
TetsuyaKonno | 0:a749dcbc0cf6 | 10 | //* GR-PEACH(E version) |
TetsuyaKonno | 0:a749dcbc0cf6 | 11 | //* Motor drive board Ver.5 |
TetsuyaKonno | 0:a749dcbc0cf6 | 12 | //* Camera module (SC-310) |
TetsuyaKonno | 0:a749dcbc0cf6 | 13 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 14 | //Include |
TetsuyaKonno | 0:a749dcbc0cf6 | 15 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 16 | #include "mbed.h" |
TetsuyaKonno | 0:a749dcbc0cf6 | 17 | #include "iodefine.h" |
TetsuyaKonno | 0:a749dcbc0cf6 | 18 | #include "DisplayBace.h" |
TetsuyaKonno | 0:a749dcbc0cf6 | 19 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 20 | //Define |
TetsuyaKonno | 0:a749dcbc0cf6 | 21 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 22 | //Motor PWM cycle |
TetsuyaKonno | 0:a749dcbc0cf6 | 23 | #define MOTOR_PWM_CYCLE 33332 /* Motor PWM period */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 24 | /* 1ms P0φ/1 = 0.03us */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 25 | //Motor speed |
TetsuyaKonno | 0:a749dcbc0cf6 | 26 | #define MAX_SPEED 50 /* motor() set: 0 to 100 */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 27 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 28 | //Servo PWM cycle |
TetsuyaKonno | 0:a749dcbc0cf6 | 29 | #define SERVO_PWM_CYCLE 33332 /* SERVO PWM period */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 30 | /* 16ms P0φ/16 = 0.48us */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 31 | #define SERVO_CENTER 3124 /* 1.5ms / 0.48us - 1 = 3124*/ |
TetsuyaKonno | 0:a749dcbc0cf6 | 32 | #define HANDLE_STEP 18 /* 1 degree value */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 33 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 34 | //LED Color on GR-PEACH |
TetsuyaKonno | 0:a749dcbc0cf6 | 35 | #define LED_OFF 0x00 |
TetsuyaKonno | 0:a749dcbc0cf6 | 36 | #define LED_RED 0x01 |
TetsuyaKonno | 0:a749dcbc0cf6 | 37 | #define LED_GREEN 0x02 |
TetsuyaKonno | 0:a749dcbc0cf6 | 38 | #define LED_YELLOW 0x03 |
TetsuyaKonno | 0:a749dcbc0cf6 | 39 | #define LED_BLUE 0x04 |
TetsuyaKonno | 0:a749dcbc0cf6 | 40 | #define LED_PURPLE 0x05 |
TetsuyaKonno | 0:a749dcbc0cf6 | 41 | #define LED_SKYBLUE 0x06 |
TetsuyaKonno | 0:a749dcbc0cf6 | 42 | #define LED_WHITE 0x07 |
TetsuyaKonno | 0:a749dcbc0cf6 | 43 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 44 | //Status |
TetsuyaKonno | 0:a749dcbc0cf6 | 45 | #define RUN 0x00 |
TetsuyaKonno | 0:a749dcbc0cf6 | 46 | #define SENSOR 0x01 |
TetsuyaKonno | 0:a749dcbc0cf6 | 47 | #define MARK 0x02 |
TetsuyaKonno | 0:a749dcbc0cf6 | 48 | #define STOP 0x03 |
TetsuyaKonno | 0:a749dcbc0cf6 | 49 | #define ERROR 0xff |
TetsuyaKonno | 0:a749dcbc0cf6 | 50 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 51 | //Define(NTSC-Video) |
TetsuyaKonno | 0:a749dcbc0cf6 | 52 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 53 | #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_0) |
TetsuyaKonno | 0:a749dcbc0cf6 | 54 | #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S0_VFIELD) |
TetsuyaKonno | 0:a749dcbc0cf6 | 55 | #define DATA_SIZE_PER_PIC (2u) |
TetsuyaKonno | 0:a749dcbc0cf6 | 56 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 57 | /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128 |
TetsuyaKonno | 0:a749dcbc0cf6 | 58 | in accordance with the frame buffer burst transfer mode. */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 59 | #define PIXEL_HW (320u) /* QVGA */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 60 | #define PIXEL_VW (240u) /* QVGA */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 61 | #define VIDEO_BUFFER_STRIDE (((PIXEL_HW * DATA_SIZE_PER_PIC) + 31u) & ~31u) |
TetsuyaKonno | 0:a749dcbc0cf6 | 62 | #define VIDEO_BUFFER_HEIGHT (PIXEL_VW) |
TetsuyaKonno | 0:a749dcbc0cf6 | 63 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 64 | //Constructor |
TetsuyaKonno | 0:a749dcbc0cf6 | 65 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 66 | Ticker interrput; |
TetsuyaKonno | 0:a749dcbc0cf6 | 67 | DigitalOut Left_motor_signal(P4_6); /* Used by motor fanction */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 68 | DigitalOut Right_motor_signal(P4_7); /* Used by motor fanction */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 69 | Serial pc(USBTX, USBRX); |
TetsuyaKonno | 0:a749dcbc0cf6 | 70 | DigitalOut LED_R(P6_13); /* LED1 on the GR-PEACH board */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 71 | DigitalOut LED_G(P6_14); /* LED2 on the GR-PEACH board */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 72 | DigitalOut LED_B(P6_15); /* LED3 on the GR-PEACH board */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 73 | DigitalIn user_botton(P6_0); /* SW1 on the GR-PEACH board */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 74 | DigitalIn push_sw(P2_13); /* SW1 on the Motor Drive board */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 75 | DigitalOut LED_3(P2_14); /* LED3 on the Motor Drive board */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 76 | DigitalOut LED_2(P2_15); /* LED2 on the Motor Drive board */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 77 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 78 | //Prototype |
TetsuyaKonno | 0:a749dcbc0cf6 | 79 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 80 | void init_MTU2_PWM_Motor( void ); /* Initialize PWM functions */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 81 | void init_MTU2_PWM_Servo( void ); /* Initialize PWM functions */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 82 | void intTimer( void ); /* Interrupt fanction */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 83 | void led_rgb(int led); |
TetsuyaKonno | 0:a749dcbc0cf6 | 84 | unsigned int user_button_get( void ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 85 | void led_status_process( void ); /* Function for only interrupt */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 86 | void led_status_set( int set ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 87 | void led_out(int led); |
TetsuyaKonno | 0:a749dcbc0cf6 | 88 | unsigned int pushsw_get( void ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 89 | void motor( int accele_l, int accele_r ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 90 | void handle( int angle ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 91 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 92 | //Prototype(NTSC-video) |
TetsuyaKonno | 0:a749dcbc0cf6 | 93 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 94 | static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type); |
TetsuyaKonno | 0:a749dcbc0cf6 | 95 | static void WaitVfield(const int32_t wait_count); |
TetsuyaKonno | 0:a749dcbc0cf6 | 96 | static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type); |
TetsuyaKonno | 0:a749dcbc0cf6 | 97 | static void WaitVsync(const int32_t wait_count); |
TetsuyaKonno | 0:a749dcbc0cf6 | 98 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 99 | //Globle |
TetsuyaKonno | 0:a749dcbc0cf6 | 100 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 101 | volatile unsigned long cnt0; /* Used by timer function */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 102 | volatile unsigned long cnt1; /* Used within main */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 103 | volatile int pattern; /* Pattern numbers */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 104 | volatile int status_set; /* Status */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 105 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 106 | //Globle(NTSC-video) |
TetsuyaKonno | 0:a749dcbc0cf6 | 107 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 108 | static uint8_t FrameBuffer_Video_A[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!; |
TetsuyaKonno | 0:a749dcbc0cf6 | 109 | static uint8_t FrameBuffer_Video_B[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!; |
TetsuyaKonno | 0:a749dcbc0cf6 | 110 | static volatile int32_t vsync_count; |
TetsuyaKonno | 0:a749dcbc0cf6 | 111 | static volatile int32_t vfield_count; |
TetsuyaKonno | 0:a749dcbc0cf6 | 112 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 113 | volatile long int Xp; |
TetsuyaKonno | 0:a749dcbc0cf6 | 114 | volatile long int Yp; |
TetsuyaKonno | 0:a749dcbc0cf6 | 115 | volatile int x; |
TetsuyaKonno | 0:a749dcbc0cf6 | 116 | volatile int y; |
TetsuyaKonno | 0:a749dcbc0cf6 | 117 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 118 | //Main |
TetsuyaKonno | 0:a749dcbc0cf6 | 119 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 120 | int main( void ) |
TetsuyaKonno | 0:a749dcbc0cf6 | 121 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 122 | /* NTSC-Video */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 123 | DisplayBase::graphics_error_t error; |
TetsuyaKonno | 0:a749dcbc0cf6 | 124 | uint8_t * write_buff_addr = FrameBuffer_Video_A; |
TetsuyaKonno | 0:a749dcbc0cf6 | 125 | uint8_t * save_buff_addr = FrameBuffer_Video_B; |
TetsuyaKonno | 0:a749dcbc0cf6 | 126 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 127 | /* Create DisplayBase object */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 128 | DisplayBase Display; |
TetsuyaKonno | 0:a749dcbc0cf6 | 129 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 130 | /* Graphics initialization process */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 131 | error = Display.Graphics_init(NULL); |
TetsuyaKonno | 0:a749dcbc0cf6 | 132 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 133 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:a749dcbc0cf6 | 134 | while (1); |
TetsuyaKonno | 0:a749dcbc0cf6 | 135 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 136 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 137 | error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL); |
TetsuyaKonno | 0:a749dcbc0cf6 | 138 | if( error != DisplayBase::GRAPHICS_OK ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 139 | while(1); |
TetsuyaKonno | 0:a749dcbc0cf6 | 140 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 141 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 142 | /* Interrupt callback function setting (Vsync signal input to scaler 0) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 143 | error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_VI_VSYNC, 0, IntCallbackFunc_Vsync); |
TetsuyaKonno | 0:a749dcbc0cf6 | 144 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 145 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:a749dcbc0cf6 | 146 | while (1); |
TetsuyaKonno | 0:a749dcbc0cf6 | 147 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 148 | /* Video capture setting (progressive form fixed) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 149 | error = Display.Video_Write_Setting( |
TetsuyaKonno | 0:a749dcbc0cf6 | 150 | VIDEO_INPUT_CH, |
TetsuyaKonno | 0:a749dcbc0cf6 | 151 | DisplayBase::COL_SYS_NTSC_358, |
TetsuyaKonno | 0:a749dcbc0cf6 | 152 | write_buff_addr, |
TetsuyaKonno | 0:a749dcbc0cf6 | 153 | VIDEO_BUFFER_STRIDE, |
TetsuyaKonno | 0:a749dcbc0cf6 | 154 | DisplayBase::VIDEO_FORMAT_YCBCR422, |
TetsuyaKonno | 0:a749dcbc0cf6 | 155 | DisplayBase::WR_RD_WRSWA_32_16BIT, |
TetsuyaKonno | 0:a749dcbc0cf6 | 156 | PIXEL_VW, |
TetsuyaKonno | 0:a749dcbc0cf6 | 157 | PIXEL_HW |
TetsuyaKonno | 0:a749dcbc0cf6 | 158 | ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 159 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 160 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:a749dcbc0cf6 | 161 | while (1); |
TetsuyaKonno | 0:a749dcbc0cf6 | 162 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 163 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 164 | /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 165 | error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE, 0, IntCallbackFunc_Vfield); |
TetsuyaKonno | 0:a749dcbc0cf6 | 166 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 167 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:a749dcbc0cf6 | 168 | while (1); |
TetsuyaKonno | 0:a749dcbc0cf6 | 169 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 170 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 171 | /* Video write process start */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 172 | error = Display.Video_Start (VIDEO_INPUT_CH); |
TetsuyaKonno | 0:a749dcbc0cf6 | 173 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 174 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:a749dcbc0cf6 | 175 | while (1); |
TetsuyaKonno | 0:a749dcbc0cf6 | 176 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 177 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 178 | /* Video write process stop */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 179 | error = Display.Video_Stop (VIDEO_INPUT_CH); |
TetsuyaKonno | 0:a749dcbc0cf6 | 180 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 181 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:a749dcbc0cf6 | 182 | while (1); |
TetsuyaKonno | 0:a749dcbc0cf6 | 183 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 184 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 185 | /* Video write process start */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 186 | error = Display.Video_Start (VIDEO_INPUT_CH); |
TetsuyaKonno | 0:a749dcbc0cf6 | 187 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 188 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:a749dcbc0cf6 | 189 | while (1); |
TetsuyaKonno | 0:a749dcbc0cf6 | 190 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 191 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 192 | /* Wait vsync to update resister */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 193 | WaitVsync(1); |
TetsuyaKonno | 0:a749dcbc0cf6 | 194 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 195 | /* Wait 2 Vfield(Top or bottom field) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 196 | WaitVfield(2); |
TetsuyaKonno | 0:a749dcbc0cf6 | 197 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 198 | /* Initialize MCU functions */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 199 | init_MTU2_PWM_Motor(); |
TetsuyaKonno | 0:a749dcbc0cf6 | 200 | init_MTU2_PWM_Servo(); |
TetsuyaKonno | 0:a749dcbc0cf6 | 201 | interrput.attach(&intTimer, 0.001); |
TetsuyaKonno | 0:a749dcbc0cf6 | 202 | pc.baud(230400); |
TetsuyaKonno | 0:a749dcbc0cf6 | 203 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 204 | /* Initialize Micon Car state */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 205 | led_out( 0x0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 206 | handle( 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 207 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 208 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 209 | while(1) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 210 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 211 | if( user_button_get() ){ |
TetsuyaKonno | 0:a749dcbc0cf6 | 212 | led_out( 0x0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 213 | handle( 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 214 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 215 | pattern = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 216 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 217 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 218 | switch( pattern ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 219 | case 0: |
TetsuyaKonno | 0:a749dcbc0cf6 | 220 | led_status_set( STOP ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 221 | pc.printf( "GR-PEACH MCR Operation Test Program V1.00\n\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 222 | pc.printf( " 1.LEDs light alternately at 0.5-second intervals\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 223 | pc.printf( " 2.Pushbutton test: OFF: LED0 lit, ON: LED1 lit\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 224 | pc.printf( " 3.Servo test: Repeated switching from 0 to right 30 to left 30 \n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 225 | pc.printf( " 4.Right motor test: Repeated switching from forward to brake\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 226 | pc.printf( " 5.Right motor test: Repeated switching from reverse to brake\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 227 | pc.printf( " 6.Left motor test: Repeated switching from forward to brake\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 228 | pc.printf( " 7.Left motor test: Repeated switching from reverse to brake\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 229 | pc.printf( " 8.Straight running check: Forward at 50 PWM, stop after 2 seconds.\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 230 | pc.printf( " 9.Straight running check: Forward at 50 PWM, stop after 5 seconds.\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 231 | pc.printf( "10.Straight running check: Forward at 100 PWM, stop after 2 seconds.\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 232 | pc.printf( "11.Straight running check: Forward at 100 PWM, stop after 5 seconds.\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 233 | pc.printf( "12.Camera module test\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 234 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 235 | pc.printf( "\n\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 236 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 237 | pc.printf( "No = " ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 238 | pc.scanf( "%d", &pattern ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 239 | pc.printf( "\n\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 240 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 241 | cnt1 = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 242 | led_status_set( RUN ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 243 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 244 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 245 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 246 | case 1: |
TetsuyaKonno | 0:a749dcbc0cf6 | 247 | /* LEDs light alternately at 0.5-second intervals */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 248 | if( cnt1 < 500 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 249 | led_out( 0x1 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 250 | } else if( cnt1 < 1000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 251 | led_out( 0x2 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 252 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 253 | cnt1 = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 254 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 255 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 256 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 257 | case 2: |
TetsuyaKonno | 0:a749dcbc0cf6 | 258 | /* Pushbutton test: OFF: LED0 lit, ON: LED1 lit */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 259 | led_out( pushsw_get() + 1 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 260 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 261 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 262 | case 3: |
TetsuyaKonno | 0:a749dcbc0cf6 | 263 | /* Servo test: Repeated switching from 0° to right 30°to left 30°*/ |
TetsuyaKonno | 0:a749dcbc0cf6 | 264 | if( cnt1 < 1000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 265 | handle( 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 266 | } else if( cnt1 < 2000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 267 | handle( 30 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 268 | } else if( cnt1 < 3000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 269 | handle( -30 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 270 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 271 | cnt1 = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 272 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 273 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 274 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 275 | case 4: |
TetsuyaKonno | 0:a749dcbc0cf6 | 276 | /* Right motor test: Repeated switching from forward to brake */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 277 | if( cnt1 < 1000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 278 | motor( 0, 100 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 279 | } else if( cnt1 < 2000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 280 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 281 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 282 | cnt1 = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 283 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 284 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 285 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 286 | case 5: |
TetsuyaKonno | 0:a749dcbc0cf6 | 287 | /* Right motor test: Repeated switching from reverse to brake */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 288 | if( cnt1 < 1000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 289 | motor( 0, -100 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 290 | } else if( cnt1 < 2000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 291 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 292 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 293 | cnt1 = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 294 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 295 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 296 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 297 | case 6: |
TetsuyaKonno | 0:a749dcbc0cf6 | 298 | /* Left motor test: Repeated switching from forward to brake */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 299 | if( cnt1 < 1000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 300 | motor( 100, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 301 | } else if( cnt1 < 2000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 302 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 303 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 304 | cnt1 = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 305 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 306 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 307 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 308 | case 7: |
TetsuyaKonno | 0:a749dcbc0cf6 | 309 | /* Left motor test: Repeated switching from reverse to brake */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 310 | if( cnt1 < 1000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 311 | motor( -100, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 312 | } else if( cnt1 < 2000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 313 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 314 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 315 | cnt1 = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 316 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 317 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 318 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 319 | case 8: |
TetsuyaKonno | 0:a749dcbc0cf6 | 320 | /* Straight running check: Forward at 50% PWM, stop after 2 seconds */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 321 | if( cnt1 < 2000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 322 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 323 | } else if( cnt1 < 4000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 324 | motor( 50, 50 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 325 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 326 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 327 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 328 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 329 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 330 | case 9: |
TetsuyaKonno | 0:a749dcbc0cf6 | 331 | /* Straight running check: Forward at 50% PWM, stop after 5 seconds. */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 332 | if( cnt1 < 2000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 333 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 334 | } else if( cnt1 < 7000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 335 | motor( 50, 50 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 336 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 337 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 338 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 339 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 340 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 341 | case 10: |
TetsuyaKonno | 0:a749dcbc0cf6 | 342 | /* Straight running check: Forward at 100% PWM, stop after 2 seconds. */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 343 | if( cnt1 < 2000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 344 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 345 | } else if( cnt1 < 4000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 346 | motor( 100, 100 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 347 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 348 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 349 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 350 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 351 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 352 | case 11: |
TetsuyaKonno | 0:a749dcbc0cf6 | 353 | /* Straight running check: Forward at 100% PWM, stop after 5 seconds. */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 354 | if( cnt1 < 2000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 355 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 356 | } else if( cnt1 < 7000 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 357 | motor( 100, 100 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 358 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 359 | motor( 0, 0 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 360 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 361 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 362 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 363 | case 12: |
TetsuyaKonno | 0:a749dcbc0cf6 | 364 | /* Camera module test process 1 */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 365 | pc.printf( "Please push the SW ( on the Motor drive board )" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 366 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 367 | pattern = 13; |
TetsuyaKonno | 0:a749dcbc0cf6 | 368 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 369 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 370 | case 13: |
TetsuyaKonno | 0:a749dcbc0cf6 | 371 | /* SW check */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 372 | if ( pushsw_get() ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 373 | WaitVfield( 2 ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 374 | if (write_buff_addr == FrameBuffer_Video_A) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 375 | write_buff_addr = FrameBuffer_Video_B; |
TetsuyaKonno | 0:a749dcbc0cf6 | 376 | save_buff_addr = FrameBuffer_Video_A; |
TetsuyaKonno | 0:a749dcbc0cf6 | 377 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 378 | write_buff_addr = FrameBuffer_Video_A; |
TetsuyaKonno | 0:a749dcbc0cf6 | 379 | save_buff_addr = FrameBuffer_Video_B; |
TetsuyaKonno | 0:a749dcbc0cf6 | 380 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 381 | /* Change write buffer */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 382 | error = Display.Video_Write_Change( |
TetsuyaKonno | 0:a749dcbc0cf6 | 383 | VIDEO_INPUT_CH, |
TetsuyaKonno | 0:a749dcbc0cf6 | 384 | write_buff_addr, |
TetsuyaKonno | 0:a749dcbc0cf6 | 385 | VIDEO_BUFFER_STRIDE); |
TetsuyaKonno | 0:a749dcbc0cf6 | 386 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 387 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:a749dcbc0cf6 | 388 | while (1); |
TetsuyaKonno | 0:a749dcbc0cf6 | 389 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 390 | pattern = 14; |
TetsuyaKonno | 0:a749dcbc0cf6 | 391 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 392 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 393 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 394 | case 14: |
TetsuyaKonno | 0:a749dcbc0cf6 | 395 | /* Camera module test process 2 */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 396 | pc.printf( "//,X-Size,Y-Size" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 397 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 398 | pc.printf( "#SIZE,320,240" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 399 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 400 | pc.printf( "//,X-Point,Y-Point" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 401 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 402 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 403 | for( Yp = 0, y = 0; Yp < 240; Yp+=1, y++ ){ |
TetsuyaKonno | 0:a749dcbc0cf6 | 404 | for( Xp = 0, x = 0; Xp < 640; Xp+=4, x+=2 ){ |
TetsuyaKonno | 0:a749dcbc0cf6 | 405 | pc.printf( "#YCbCr," ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 406 | /*Xp*/pc.printf( "%d,", x); |
TetsuyaKonno | 0:a749dcbc0cf6 | 407 | /*Yp*/pc.printf( "%d,", y); |
TetsuyaKonno | 0:a749dcbc0cf6 | 408 | /*Y0*/pc.printf( "%d,", save_buff_addr[(Xp+0)+(640*Yp)]);//6 |
TetsuyaKonno | 0:a749dcbc0cf6 | 409 | /*Cb*/pc.printf( "%d,", save_buff_addr[(Xp+1)+(640*Yp)]);//5 |
TetsuyaKonno | 0:a749dcbc0cf6 | 410 | /*Cr*/pc.printf( "%d,", save_buff_addr[(Xp+3)+(640*Yp)]);//7 |
TetsuyaKonno | 0:a749dcbc0cf6 | 411 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 412 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 413 | pc.printf( "#YCbCr," ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 414 | /*Xp*/pc.printf( "%d,", x+1); |
TetsuyaKonno | 0:a749dcbc0cf6 | 415 | /*Yp*/pc.printf( "%d,", y); |
TetsuyaKonno | 0:a749dcbc0cf6 | 416 | /*Y1*/pc.printf( "%d,", save_buff_addr[(Xp+2)+(640*Yp)]);//4 |
TetsuyaKonno | 0:a749dcbc0cf6 | 417 | /*Cb*/pc.printf( "%d,", save_buff_addr[(Xp+1)+(640*Yp)]);//5 |
TetsuyaKonno | 0:a749dcbc0cf6 | 418 | /*Cr*/pc.printf( "%d,", save_buff_addr[(Xp+3)+(640*Yp)]);//7 |
TetsuyaKonno | 0:a749dcbc0cf6 | 419 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 420 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 421 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 422 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 423 | /* Break Point */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 424 | while( !user_button_get() ) led_status_set( STOP ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 425 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 426 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 427 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 428 | default: |
TetsuyaKonno | 0:a749dcbc0cf6 | 429 | /* If neither, return to standby state */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 430 | pattern = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 431 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 432 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 433 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 434 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 435 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 436 | //Initialize MTU2 PWM functions |
TetsuyaKonno | 0:a749dcbc0cf6 | 437 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 438 | //MTU2_3, MTU2_4 |
TetsuyaKonno | 0:a749dcbc0cf6 | 439 | //Reset-Synchronized PWM mode |
TetsuyaKonno | 0:a749dcbc0cf6 | 440 | //TIOC4A(P4_4) :Left-motor |
TetsuyaKonno | 0:a749dcbc0cf6 | 441 | //TIOC4B(P4_5) :Right-motor |
TetsuyaKonno | 0:a749dcbc0cf6 | 442 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 443 | void init_MTU2_PWM_Motor( void ) |
TetsuyaKonno | 0:a749dcbc0cf6 | 444 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 445 | /* Port setting for S/W I/O Contorol */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 446 | /* alternative mode */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 447 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 448 | /* MTU2_4 (P4_4)(P4_5) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 449 | GPIOPBDC4 = 0x0000; /* Bidirection mode disabled*/ |
TetsuyaKonno | 0:a749dcbc0cf6 | 450 | GPIOPFCAE4 &= 0xffcf; /* The alternative function of a pin */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 451 | GPIOPFCE4 |= 0x0030; /* The alternative function of a pin */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 452 | GPIOPFC4 &= 0xffcf; /* The alternative function of a pin */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 453 | /* 2nd altemative function/output */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 454 | GPIOP4 &= 0xffcf; /* */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 455 | GPIOPM4 &= 0xffcf; /* p4_4,P4_5:output */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 456 | GPIOPMC4 |= 0x0030; /* P4_4,P4_5:double */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 457 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 458 | /* Mosule stop 33(MTU2) canceling */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 459 | CPGSTBCR3 &= 0xf7; |
TetsuyaKonno | 0:a749dcbc0cf6 | 460 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 461 | /* MTU2_3 and MTU2_4 (Motor PWM) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 462 | MTU2TCR_3 = 0x20; /* TCNT Clear(TGRA), P0φ/1 */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 463 | MTU2TOCR1 = 0x04; /* */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 464 | MTU2TOCR2 = 0x40; /* N L>H P H>L */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 465 | MTU2TMDR_3 = 0x38; /* Buff:ON Reset-Synchronized PWM mode */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 466 | MTU2TMDR_4 = 0x30; /* Buff:ON */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 467 | MTU2TOER = 0xc6; /* TIOC3B,4A,4B enabled output */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 468 | MTU2TCNT_3 = MTU2TCNT_4 = 0; /* TCNT3,TCNT4 Set 0 */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 469 | MTU2TGRA_3 = MTU2TGRC_3 = MOTOR_PWM_CYCLE; |
TetsuyaKonno | 0:a749dcbc0cf6 | 470 | /* PWM-Cycle(1ms) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 471 | MTU2TGRA_4 = MTU2TGRC_4 = 0; /* Left-motor(P4_4) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 472 | MTU2TGRB_4 = MTU2TGRD_4 = 0; /* Right-motor(P4_5) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 473 | MTU2TSTR |= 0x40; /* TCNT_4 Start */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 474 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 475 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 476 | //Initialize MTU2 PWM functions |
TetsuyaKonno | 0:a749dcbc0cf6 | 477 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 478 | //MTU2_0 |
TetsuyaKonno | 0:a749dcbc0cf6 | 479 | //PWM mode 1 |
TetsuyaKonno | 0:a749dcbc0cf6 | 480 | //TIOC0A(P4_0) :Servo-motor |
TetsuyaKonno | 0:a749dcbc0cf6 | 481 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 482 | void init_MTU2_PWM_Servo( void ) |
TetsuyaKonno | 0:a749dcbc0cf6 | 483 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 484 | /* Port setting for S/W I/O Contorol */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 485 | /* alternative mode */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 486 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 487 | /* MTU2_0 (P4_0) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 488 | GPIOPBDC4 = 0x0000; /* Bidirection mode disabled*/ |
TetsuyaKonno | 0:a749dcbc0cf6 | 489 | GPIOPFCAE4 &= 0xfffe; /* The alternative function of a pin */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 490 | GPIOPFCE4 &= 0xfffe; /* The alternative function of a pin */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 491 | GPIOPFC4 |= 0x0001; /* The alternative function of a pin */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 492 | /* 2nd alternative function/output */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 493 | GPIOP4 &= 0xfffe; /* */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 494 | GPIOPM4 &= 0xfffe; /* p4_0:output */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 495 | GPIOPMC4 |= 0x0001; /* P4_0:double */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 496 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 497 | /* Mosule stop 33(MTU2) canceling */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 498 | CPGSTBCR3 &= 0xf7; |
TetsuyaKonno | 0:a749dcbc0cf6 | 499 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 500 | /* MTU2_0 (Motor PWM) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 501 | MTU2TCR_0 = 0x22; /* TCNT Clear(TGRA), P0φ/16 */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 502 | MTU2TIORH_0 = 0x52; /* TGRA L>H, TGRB H>L */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 503 | MTU2TMDR_0 = 0x32; /* TGRC and TGRD = Buff-mode*/ |
TetsuyaKonno | 0:a749dcbc0cf6 | 504 | /* PWM-mode1 */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 505 | MTU2TCNT_0 = 0; /* TCNT0 Set 0 */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 506 | MTU2TGRA_0 = MTU2TGRC_0 = SERVO_PWM_CYCLE; |
TetsuyaKonno | 0:a749dcbc0cf6 | 507 | /* PWM-Cycle(16ms) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 508 | MTU2TGRB_0 = MTU2TGRD_0 = 0; /* Servo-motor(P4_0) */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 509 | MTU2TSTR |= 0x01; /* TCNT_0 Start */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 510 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 511 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 512 | //Interrupt Timer |
TetsuyaKonno | 0:a749dcbc0cf6 | 513 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 514 | void intTimer( void ) |
TetsuyaKonno | 0:a749dcbc0cf6 | 515 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 516 | cnt0++; |
TetsuyaKonno | 0:a749dcbc0cf6 | 517 | cnt1++; |
TetsuyaKonno | 0:a749dcbc0cf6 | 518 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 519 | led_status_process(); |
TetsuyaKonno | 0:a749dcbc0cf6 | 520 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 521 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 522 | //LED_RGB(on GR-PEACH board) |
TetsuyaKonno | 0:a749dcbc0cf6 | 523 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 524 | void led_rgb(int led) |
TetsuyaKonno | 0:a749dcbc0cf6 | 525 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 526 | LED_R = led & 0x1; |
TetsuyaKonno | 0:a749dcbc0cf6 | 527 | LED_G = (led >> 1 ) & 0x1; |
TetsuyaKonno | 0:a749dcbc0cf6 | 528 | LED_B = (led >> 2 ) & 0x1; |
TetsuyaKonno | 0:a749dcbc0cf6 | 529 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 530 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 531 | //user_button_get(on GR-PEACH board) |
TetsuyaKonno | 0:a749dcbc0cf6 | 532 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 533 | unsigned int user_button_get( void ) |
TetsuyaKonno | 0:a749dcbc0cf6 | 534 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 535 | return (~user_botton) & 0x1; /* Read ports with switches */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 536 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 537 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 538 | //LED_Status(on GR-PEACH board) Function for only interrupt |
TetsuyaKonno | 0:a749dcbc0cf6 | 539 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 540 | void led_status_process( void ) |
TetsuyaKonno | 0:a749dcbc0cf6 | 541 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 542 | static unsigned long led_timer; |
TetsuyaKonno | 0:a749dcbc0cf6 | 543 | int led_set; |
TetsuyaKonno | 0:a749dcbc0cf6 | 544 | int on_time; |
TetsuyaKonno | 0:a749dcbc0cf6 | 545 | int off_time; |
TetsuyaKonno | 0:a749dcbc0cf6 | 546 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 547 | /* setting */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 548 | switch( status_set ){ |
TetsuyaKonno | 0:a749dcbc0cf6 | 549 | case RUN: |
TetsuyaKonno | 0:a749dcbc0cf6 | 550 | led_set = LED_GREEN; |
TetsuyaKonno | 0:a749dcbc0cf6 | 551 | on_time = 500; |
TetsuyaKonno | 0:a749dcbc0cf6 | 552 | off_time = 500; |
TetsuyaKonno | 0:a749dcbc0cf6 | 553 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 554 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 555 | case SENSOR: |
TetsuyaKonno | 0:a749dcbc0cf6 | 556 | led_set = LED_BLUE; |
TetsuyaKonno | 0:a749dcbc0cf6 | 557 | on_time = 50; |
TetsuyaKonno | 0:a749dcbc0cf6 | 558 | off_time = 50; |
TetsuyaKonno | 0:a749dcbc0cf6 | 559 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 560 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 561 | case MARK: |
TetsuyaKonno | 0:a749dcbc0cf6 | 562 | led_set = LED_RED; |
TetsuyaKonno | 0:a749dcbc0cf6 | 563 | on_time = 250; |
TetsuyaKonno | 0:a749dcbc0cf6 | 564 | off_time = 250; |
TetsuyaKonno | 0:a749dcbc0cf6 | 565 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 566 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 567 | case STOP: |
TetsuyaKonno | 0:a749dcbc0cf6 | 568 | led_set = LED_RED; |
TetsuyaKonno | 0:a749dcbc0cf6 | 569 | on_time = 1; |
TetsuyaKonno | 0:a749dcbc0cf6 | 570 | off_time = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 571 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 572 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 573 | case ERROR: |
TetsuyaKonno | 0:a749dcbc0cf6 | 574 | led_set = LED_RED; |
TetsuyaKonno | 0:a749dcbc0cf6 | 575 | on_time = 50; |
TetsuyaKonno | 0:a749dcbc0cf6 | 576 | off_time = 50; |
TetsuyaKonno | 0:a749dcbc0cf6 | 577 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 578 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 579 | default: |
TetsuyaKonno | 0:a749dcbc0cf6 | 580 | led_set = LED_OFF; |
TetsuyaKonno | 0:a749dcbc0cf6 | 581 | on_time = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 582 | off_time = 1; |
TetsuyaKonno | 0:a749dcbc0cf6 | 583 | break; |
TetsuyaKonno | 0:a749dcbc0cf6 | 584 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 585 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 586 | /* Display */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 587 | led_timer++; |
TetsuyaKonno | 0:a749dcbc0cf6 | 588 | if( led_timer < on_time ) led_rgb( led_set ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 589 | else if( led_timer < ( on_time + off_time ) ) led_rgb( LED_OFF ); |
TetsuyaKonno | 0:a749dcbc0cf6 | 590 | else led_timer = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 591 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 592 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 593 | //LED_Status(on GR-PEACH board) Function for only interrupt |
TetsuyaKonno | 0:a749dcbc0cf6 | 594 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 595 | void led_status_set( int set ) |
TetsuyaKonno | 0:a749dcbc0cf6 | 596 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 597 | status_set = set; |
TetsuyaKonno | 0:a749dcbc0cf6 | 598 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 599 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 600 | //led_out(on Motor drive board) |
TetsuyaKonno | 0:a749dcbc0cf6 | 601 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 602 | void led_out(int led) |
TetsuyaKonno | 0:a749dcbc0cf6 | 603 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 604 | led = ~led; |
TetsuyaKonno | 0:a749dcbc0cf6 | 605 | LED_3 = led & 0x1; |
TetsuyaKonno | 0:a749dcbc0cf6 | 606 | LED_2 = ( led >> 1 ) & 0x1; |
TetsuyaKonno | 0:a749dcbc0cf6 | 607 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 608 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 609 | //pushsw_get(on Motor drive board) |
TetsuyaKonno | 0:a749dcbc0cf6 | 610 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 611 | unsigned int pushsw_get( void ) |
TetsuyaKonno | 0:a749dcbc0cf6 | 612 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 613 | return (~push_sw) & 0x1; /* Read ports with switches */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 614 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 615 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 616 | //motor speed control(PWM) |
TetsuyaKonno | 0:a749dcbc0cf6 | 617 | //Arguments: motor:-100 to 100 |
TetsuyaKonno | 0:a749dcbc0cf6 | 618 | //Here, 0 is stop, 100 is forward, -100 is reverse |
TetsuyaKonno | 0:a749dcbc0cf6 | 619 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 620 | void motor( int accele_l, int accele_r ) |
TetsuyaKonno | 0:a749dcbc0cf6 | 621 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 622 | accele_l = ( accele_l * MAX_SPEED ) / 100; |
TetsuyaKonno | 0:a749dcbc0cf6 | 623 | accele_r = ( accele_r * MAX_SPEED ) / 100; |
TetsuyaKonno | 0:a749dcbc0cf6 | 624 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 625 | /* Left Motor Control */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 626 | if( accele_l >= 0 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 627 | /* forward */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 628 | Left_motor_signal = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 629 | MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_l / 100; |
TetsuyaKonno | 0:a749dcbc0cf6 | 630 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 631 | /* reverse */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 632 | Left_motor_signal = 1; |
TetsuyaKonno | 0:a749dcbc0cf6 | 633 | MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_l ) / 100; |
TetsuyaKonno | 0:a749dcbc0cf6 | 634 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 635 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 636 | /* Right Motor Control */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 637 | if( accele_r >= 0 ) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 638 | /* forward */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 639 | Right_motor_signal = 0; |
TetsuyaKonno | 0:a749dcbc0cf6 | 640 | MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_r / 100; |
TetsuyaKonno | 0:a749dcbc0cf6 | 641 | } else { |
TetsuyaKonno | 0:a749dcbc0cf6 | 642 | /* reverse */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 643 | Right_motor_signal = 1; |
TetsuyaKonno | 0:a749dcbc0cf6 | 644 | MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_r ) / 100; |
TetsuyaKonno | 0:a749dcbc0cf6 | 645 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 646 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 647 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 648 | //Handle fanction |
TetsuyaKonno | 0:a749dcbc0cf6 | 649 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 650 | void handle( int angle ) |
TetsuyaKonno | 0:a749dcbc0cf6 | 651 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 652 | /* When the servo move from left to right in reverse, replace "-" with "+" */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 653 | MTU2TGRD_0 = SERVO_CENTER - angle * HANDLE_STEP; |
TetsuyaKonno | 0:a749dcbc0cf6 | 654 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 655 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 656 | //******************************************************************// |
TetsuyaKonno | 0:a749dcbc0cf6 | 657 | // @brief Interrupt callback function |
TetsuyaKonno | 0:a749dcbc0cf6 | 658 | // @param[in] int_type : VDC5 interrupt type |
TetsuyaKonno | 0:a749dcbc0cf6 | 659 | // @retval None |
TetsuyaKonno | 0:a749dcbc0cf6 | 660 | //*******************************************************************/ |
TetsuyaKonno | 0:a749dcbc0cf6 | 661 | static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type) |
TetsuyaKonno | 0:a749dcbc0cf6 | 662 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 663 | if (vfield_count > 0) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 664 | vfield_count--; |
TetsuyaKonno | 0:a749dcbc0cf6 | 665 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 666 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 667 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 668 | //******************************************************************// |
TetsuyaKonno | 0:a749dcbc0cf6 | 669 | // @brief Wait for the specified number of times Vsync occurs |
TetsuyaKonno | 0:a749dcbc0cf6 | 670 | // @param[in] wait_count : Wait count |
TetsuyaKonno | 0:a749dcbc0cf6 | 671 | // @retval None |
TetsuyaKonno | 0:a749dcbc0cf6 | 672 | //*******************************************************************/ |
TetsuyaKonno | 0:a749dcbc0cf6 | 673 | static void WaitVfield(const int32_t wait_count) |
TetsuyaKonno | 0:a749dcbc0cf6 | 674 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 675 | vfield_count = wait_count; |
TetsuyaKonno | 0:a749dcbc0cf6 | 676 | while (vfield_count > 0) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 677 | /* Do nothing */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 678 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 679 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 680 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 681 | //******************************************************************// |
TetsuyaKonno | 0:a749dcbc0cf6 | 682 | // @brief Interrupt callback function for Vsync interruption |
TetsuyaKonno | 0:a749dcbc0cf6 | 683 | // @param[in] int_type : VDC5 interrupt type |
TetsuyaKonno | 0:a749dcbc0cf6 | 684 | // @retval None |
TetsuyaKonno | 0:a749dcbc0cf6 | 685 | //*******************************************************************/ |
TetsuyaKonno | 0:a749dcbc0cf6 | 686 | static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type) |
TetsuyaKonno | 0:a749dcbc0cf6 | 687 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 688 | if (vsync_count > 0) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 689 | vsync_count--; |
TetsuyaKonno | 0:a749dcbc0cf6 | 690 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 691 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 692 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 693 | //******************************************************************// |
TetsuyaKonno | 0:a749dcbc0cf6 | 694 | // @brief Wait for the specified number of times Vsync occurs |
TetsuyaKonno | 0:a749dcbc0cf6 | 695 | // @param[in] wait_count : Wait count |
TetsuyaKonno | 0:a749dcbc0cf6 | 696 | // @retval None |
TetsuyaKonno | 0:a749dcbc0cf6 | 697 | //*******************************************************************/ |
TetsuyaKonno | 0:a749dcbc0cf6 | 698 | static void WaitVsync(const int32_t wait_count) |
TetsuyaKonno | 0:a749dcbc0cf6 | 699 | { |
TetsuyaKonno | 0:a749dcbc0cf6 | 700 | vsync_count = wait_count; |
TetsuyaKonno | 0:a749dcbc0cf6 | 701 | while (vsync_count > 0) { |
TetsuyaKonno | 0:a749dcbc0cf6 | 702 | /* Do nothing */ |
TetsuyaKonno | 0:a749dcbc0cf6 | 703 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 704 | } |
TetsuyaKonno | 0:a749dcbc0cf6 | 705 | |
TetsuyaKonno | 0:a749dcbc0cf6 | 706 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:a749dcbc0cf6 | 707 | // End of file |
TetsuyaKonno | 0:a749dcbc0cf6 | 708 | //------------------------------------------------------------------// |