Object Model code with hardware support
Dependencies: mbed
main.cpp@0:2b4bbe9ea495, 2014-09-05 (annotated)
- Committer:
- bgrissom
- Date:
- Fri Sep 05 00:07:44 2014 +0000
- Revision:
- 0:2b4bbe9ea495
Object Model code with Toshiba S0 and S1 routines compiles with ST F401RE board support. If you try to compile this for the F030 or F072, it will run out of SRAM space.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bgrissom | 0:2b4bbe9ea495 | 1 | #include "mbed.h" |
bgrissom | 0:2b4bbe9ea495 | 2 | #include <stdio.h> |
bgrissom | 0:2b4bbe9ea495 | 3 | #include "anthem.hpp" |
bgrissom | 0:2b4bbe9ea495 | 4 | #include "hardware_F072.hpp" |
bgrissom | 0:2b4bbe9ea495 | 5 | |
bgrissom | 0:2b4bbe9ea495 | 6 | // Definitions |
bgrissom | 0:2b4bbe9ea495 | 7 | #define PIN_41 PB_5 |
bgrissom | 0:2b4bbe9ea495 | 8 | #define PIN_46 PB_9 |
bgrissom | 0:2b4bbe9ea495 | 9 | #define PIN_32 PA_11 |
bgrissom | 0:2b4bbe9ea495 | 10 | #define PIN_20 PB_2 |
bgrissom | 0:2b4bbe9ea495 | 11 | #define HEX_ONE_THOUSAND (0x03E8) |
bgrissom | 0:2b4bbe9ea495 | 12 | const int SCLK_ENABLED = 0; |
bgrissom | 0:2b4bbe9ea495 | 13 | |
bgrissom | 0:2b4bbe9ea495 | 14 | // Forward Declarations |
bgrissom | 0:2b4bbe9ea495 | 15 | void display_RthenGthenB_for_1_pixel(uint16_t xON, uint16_t yON); |
bgrissom | 0:2b4bbe9ea495 | 16 | void debug_printf(uint16_t xON, uint16_t yON, int colorRotate); |
bgrissom | 0:2b4bbe9ea495 | 17 | |
bgrissom | 0:2b4bbe9ea495 | 18 | // Globals |
bgrissom | 0:2b4bbe9ea495 | 19 | LEDModule g_mod; |
bgrissom | 0:2b4bbe9ea495 | 20 | DigitalOut ENA(PIN_41); |
bgrissom | 0:2b4bbe9ea495 | 21 | DigitalOut ENB(PIN_46); |
bgrissom | 0:2b4bbe9ea495 | 22 | DigitalOut ENC(PIN_32); |
bgrissom | 0:2b4bbe9ea495 | 23 | DigitalOut EnSclk(PIN_20); |
bgrissom | 0:2b4bbe9ea495 | 24 | |
bgrissom | 0:2b4bbe9ea495 | 25 | |
bgrissom | 0:2b4bbe9ea495 | 26 | int main (int argc, char *argv[]) |
bgrissom | 0:2b4bbe9ea495 | 27 | { |
bgrissom | 0:2b4bbe9ea495 | 28 | uint16_t x = 0; |
bgrissom | 0:2b4bbe9ea495 | 29 | uint16_t y = 0; |
bgrissom | 0:2b4bbe9ea495 | 30 | |
bgrissom | 0:2b4bbe9ea495 | 31 | ENA = 1; |
bgrissom | 0:2b4bbe9ea495 | 32 | ENB = 1; |
bgrissom | 0:2b4bbe9ea495 | 33 | ENC = 1; |
bgrissom | 0:2b4bbe9ea495 | 34 | EnSclk = SCLK_ENABLED; |
bgrissom | 0:2b4bbe9ea495 | 35 | |
bgrissom | 0:2b4bbe9ea495 | 36 | // NOTE: 24MHz is half the 48MHz clock rate. The PWM registers |
bgrissom | 0:2b4bbe9ea495 | 37 | // seem to only allow 24MHz at this point, so I'm matching |
bgrissom | 0:2b4bbe9ea495 | 38 | // the SPI bus speed to be the same. |
bgrissom | 0:2b4bbe9ea495 | 39 | // |
bgrissom | 0:2b4bbe9ea495 | 40 | // 1/24MHz => 1/(24*10^6) => 41.6*10^-9 second period, |
bgrissom | 0:2b4bbe9ea495 | 41 | // which means 41.6ns period and 20.8ns pulse width at |
bgrissom | 0:2b4bbe9ea495 | 42 | // 50% duty cycle (which seems to be right for the SPI clock |
bgrissom | 0:2b4bbe9ea495 | 43 | // line as well as a reasonable choice for the PWM line). |
bgrissom | 0:2b4bbe9ea495 | 44 | |
bgrissom | 0:2b4bbe9ea495 | 45 | // PWMCLK |
bgrissom | 0:2b4bbe9ea495 | 46 | pwmout_t outs; |
bgrissom | 0:2b4bbe9ea495 | 47 | pwmout_init(&outs, PB_4); |
bgrissom | 0:2b4bbe9ea495 | 48 | pwmout_period_ns(&outs, 2); // 24 MHz (not very clean on the scope) |
bgrissom | 0:2b4bbe9ea495 | 49 | // pwmout_period_ns(&outs, 40); // 1.2 MHz on the scope |
bgrissom | 0:2b4bbe9ea495 | 50 | // Very slow! pwmout_period_us(&outs, 2); |
bgrissom | 0:2b4bbe9ea495 | 51 | pwmout_write(&outs, 0.5f); // Duty cycle 50% |
bgrissom | 0:2b4bbe9ea495 | 52 | |
bgrissom | 0:2b4bbe9ea495 | 53 | |
bgrissom | 0:2b4bbe9ea495 | 54 | for (y = 0; y < MODULE_WIDTH; y++) { |
bgrissom | 0:2b4bbe9ea495 | 55 | for (x = 0; x < MODULE_HEIGHT; x++) { |
bgrissom | 0:2b4bbe9ea495 | 56 | display_RthenGthenB_for_1_pixel(x, y); |
bgrissom | 0:2b4bbe9ea495 | 57 | } |
bgrissom | 0:2b4bbe9ea495 | 58 | } |
bgrissom | 0:2b4bbe9ea495 | 59 | |
bgrissom | 0:2b4bbe9ea495 | 60 | return 0; |
bgrissom | 0:2b4bbe9ea495 | 61 | } |
bgrissom | 0:2b4bbe9ea495 | 62 | |
bgrissom | 0:2b4bbe9ea495 | 63 | |
bgrissom | 0:2b4bbe9ea495 | 64 | // This will display 3 "images": |
bgrissom | 0:2b4bbe9ea495 | 65 | // |
bgrissom | 0:2b4bbe9ea495 | 66 | // For one pixel location only, it will: |
bgrissom | 0:2b4bbe9ea495 | 67 | // - Red LED of that pixel ON (all the rest off) |
bgrissom | 0:2b4bbe9ea495 | 68 | // - Green LED of that pixel ON (all the rest off) |
bgrissom | 0:2b4bbe9ea495 | 69 | // - Blue LED of that pixel ON (all the rest off) |
bgrissom | 0:2b4bbe9ea495 | 70 | // |
bgrissom | 0:2b4bbe9ea495 | 71 | void display_RthenGthenB_for_1_pixel(uint16_t xON, uint16_t yON) |
bgrissom | 0:2b4bbe9ea495 | 72 | { |
bgrissom | 0:2b4bbe9ea495 | 73 | PixelColor srcPix; |
bgrissom | 0:2b4bbe9ea495 | 74 | const uint8_t brightness = 0x07; |
bgrissom | 0:2b4bbe9ea495 | 75 | int colorRotate = 0; // 0=Red, 1=Green, 2=Blue |
bgrissom | 0:2b4bbe9ea495 | 76 | uint16_t x = 0; |
bgrissom | 0:2b4bbe9ea495 | 77 | uint16_t y = 0; |
bgrissom | 0:2b4bbe9ea495 | 78 | |
bgrissom | 0:2b4bbe9ea495 | 79 | for (colorRotate = 0; colorRotate < 3; colorRotate++) { |
bgrissom | 0:2b4bbe9ea495 | 80 | debug_printf(xON, yON, colorRotate); |
bgrissom | 0:2b4bbe9ea495 | 81 | for (y = 0; y < MODULE_WIDTH; y++) { |
bgrissom | 0:2b4bbe9ea495 | 82 | for (x = 0; x < MODULE_HEIGHT; x++) { |
bgrissom | 0:2b4bbe9ea495 | 83 | if ( (xON == x) && // Should this pixel be turned on? |
bgrissom | 0:2b4bbe9ea495 | 84 | (yON == y) ) |
bgrissom | 0:2b4bbe9ea495 | 85 | { |
bgrissom | 0:2b4bbe9ea495 | 86 | if (colorRotate == 0) { |
bgrissom | 0:2b4bbe9ea495 | 87 | srcPix._r = brightness; |
bgrissom | 0:2b4bbe9ea495 | 88 | srcPix._g = 0; |
bgrissom | 0:2b4bbe9ea495 | 89 | srcPix._b = 0; |
bgrissom | 0:2b4bbe9ea495 | 90 | } else if (colorRotate == 1) { |
bgrissom | 0:2b4bbe9ea495 | 91 | srcPix._r = 0; |
bgrissom | 0:2b4bbe9ea495 | 92 | srcPix._g = brightness; |
bgrissom | 0:2b4bbe9ea495 | 93 | srcPix._b = 0; |
bgrissom | 0:2b4bbe9ea495 | 94 | } else if (colorRotate == 2) { |
bgrissom | 0:2b4bbe9ea495 | 95 | srcPix._r = 0; |
bgrissom | 0:2b4bbe9ea495 | 96 | srcPix._g = 0; |
bgrissom | 0:2b4bbe9ea495 | 97 | srcPix._b = brightness; |
bgrissom | 0:2b4bbe9ea495 | 98 | } |
bgrissom | 0:2b4bbe9ea495 | 99 | } else { |
bgrissom | 0:2b4bbe9ea495 | 100 | // This pixel should be turned off |
bgrissom | 0:2b4bbe9ea495 | 101 | srcPix._r = 0; |
bgrissom | 0:2b4bbe9ea495 | 102 | srcPix._g = 0; |
bgrissom | 0:2b4bbe9ea495 | 103 | srcPix._b = 0; |
bgrissom | 0:2b4bbe9ea495 | 104 | } |
bgrissom | 0:2b4bbe9ea495 | 105 | g_mod._sourceImage.setPixel(x, y, srcPix); |
bgrissom | 0:2b4bbe9ea495 | 106 | } |
bgrissom | 0:2b4bbe9ea495 | 107 | } |
bgrissom | 0:2b4bbe9ea495 | 108 | g_mod.displayImage(); |
bgrissom | 0:2b4bbe9ea495 | 109 | } |
bgrissom | 0:2b4bbe9ea495 | 110 | } |
bgrissom | 0:2b4bbe9ea495 | 111 | |
bgrissom | 0:2b4bbe9ea495 | 112 | void debug_printf(uint16_t x, uint16_t y, int color) |
bgrissom | 0:2b4bbe9ea495 | 113 | { |
bgrissom | 0:2b4bbe9ea495 | 114 | if (color == 0) { |
bgrissom | 0:2b4bbe9ea495 | 115 | BAGINFO3("\nPICTURE RED x[%d] y[%d]", x, y); |
bgrissom | 0:2b4bbe9ea495 | 116 | } else if (color == 1) { |
bgrissom | 0:2b4bbe9ea495 | 117 | BAGINFO3("\nPICTURE GREEN x[%d] y[%d]", x, y); |
bgrissom | 0:2b4bbe9ea495 | 118 | } else if (color == 2) { |
bgrissom | 0:2b4bbe9ea495 | 119 | BAGINFO3("\nPICTURE BLUE x[%d] y[%d]", x, y); |
bgrissom | 0:2b4bbe9ea495 | 120 | } |
bgrissom | 0:2b4bbe9ea495 | 121 | } |