A simple oscilloscope using Adafruit 2.8" TFT with touch. Runs on FRDM-KL25Z, FRDM-K22F, FRDM-K64F, NUCLEO-F411RE. 2 channel analog inputs with 4 trigger modes and time division.

Dependencies:   SPI_STMPE610 UniGraphic mbed vt100

My first attempt of implementing an oscilloscope using FRDM-KL25Z and Adafruit 2.8" TFT with touch.

FRDM-KL25Z と Adafruit 2.8" TFT with touch を使用して作ってみた最初のオシロスコープです。

On 25-Sep-2017, wrong calculation of trigger pos/val fixed.
On 25-Nov-2015, FRDM-K64F and NUCLEO-F411RE platforms were added.
On 26-Nov-2015, FRDM-K22F is added (tested).
Note: Now ch2 is A2 instead of A1!

25-Sep-2017, トリガー値と位置の計算の誤りを修正しました。
25-Nov-2015, FRDM-K64F と NUCLEO-F411RE でも動くようになりました。
26-Nov-2015, FRDM-K22F でも動作確認が出来ました。 ※一身上の都合で、アナログ入力の ch2 は A1 から A2 に変更しましたので、ご注意ください。m(_ _)m

/media/uploads/Rhyme/oscillo_top.jpg

This supports two analog inputs A0 for channel 1 and A2 for channel 2
and four trigger modes (NONE, RISE, FALL, LEVEL),
time division is 30us to 20ms per pixel which will make 300us/div to 200.0ms/div (as 10 pixels per div)

A0と A2 のアナログ2入力にて、
4種類のトリガーモード(NONE: フリーラン RISE: 立ち上がりエッジ、FALL: 立下りエッジ、LEVEL: レベル) 。
サンプリングは30us から 20ms, チャートの1メモリが10ピクセルなので、300us/dev から 200.0ms/div となっています。

The analog signals and gnd was picked at the pins in the picture above.
Note: now you need to pick A0 and A2 instead of A0 and A1.

信号は上記の写真のように、Adafruit のピンからつまみました。
変更により、A0とA2が入力となります。

/media/uploads/Rhyme/freerunmode.jpg

When powered on or reset, the program starts in Trigger Mode = NONE (Free Run Mode)

電源投入、リセット後 プログラムはトリガーモード NONE (フリーランモード) で起動します。

To change trigger mode and/or time division, press run/stop button.

トリガーモードを変えたり、サンプリング時間を変えるのには run/stop ボタンを押してください。

Each time you push Trig button, the trigger mode changes
NONE -> RISE -> FALL -> LEVEL ( -> NONE).

トリガーボタンを押すたびにトリガーモードは
NONE(フリーラン) -> RISE (立ち上がりエッジ) -> FALL (立下りエッジ) -> LEVEL (レベル)
と変化します。

When trigger mode is not NONE,
to specify the trigger position, level and channel, push inside the wave frame.
Then green trigger marks will be shown and value of trigger position and voltage will be printed.

トリガーモードが NONE でないときに、チャネルの枠内をタッチしますと、
その位置がトリガーのポジション、レベル、チャネルになります。 そして、緑色のトリガーマークが表示され、下部にはトリガーの具体的なポジションとボルテージが表示されます。

/media/uploads/Rhyme/usage_screen1.jpg

To change time division push "1/2" to Zoom Out (sampling interval will be bigger) or
"x2" to Zoom In (Sampling interval will be smaller).

サンプリングタイムを変更するのには
"1/2" ズームアウト (サンプリング間隔が長くなります) か
"x2" ズームイン (サンプリング間隔が短くなります。) を押してください。

/media/uploads/Rhyme/helps.jpg

On 7-Mar-2015 updated to UniGraphic library version!

2015年3月7日 UniGraphic ライブラリ使用版にアップデートしました。

/media/uploads/Rhyme/frdm-kl25z-ss.jpg FRDM-KL25Z
/media/uploads/Rhyme/frdm-k64f-ss.jpg FRDM-K64F
/media/uploads/Rhyme/nucleo-f411re-ss.jpg NUCLEO-F411RE

Committer:
Rhyme
Date:
Thu Jul 13 03:58:37 2017 +0000
Revision:
9:657155f03cb8
Parent:
6:c93e2f12b789
Child:
10:bd3d8d71ee73
TFT Backlight was D2 -> PTA12

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:2b9a6c5fcd52 1 /** mbed oscilloscope my implementation of a oscillo scope
Rhyme 0:2b9a6c5fcd52 2 * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab
Rhyme 0:2b9a6c5fcd52 3 *
Rhyme 0:2b9a6c5fcd52 4 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Rhyme 0:2b9a6c5fcd52 5 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Rhyme 0:2b9a6c5fcd52 6 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Rhyme 0:2b9a6c5fcd52 7 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Rhyme 0:2b9a6c5fcd52 8 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Rhyme 0:2b9a6c5fcd52 9 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Rhyme 0:2b9a6c5fcd52 10 * THE SOFTWARE.
Rhyme 0:2b9a6c5fcd52 11 */
Rhyme 0:2b9a6c5fcd52 12 #include "mbed.h"
Rhyme 3:ea0c3cffa988 13 #include <ILI9341.h>
Rhyme 0:2b9a6c5fcd52 14 #include "Arial12x12.h"
Rhyme 0:2b9a6c5fcd52 15 #include "Arial24x23.h"
Rhyme 0:2b9a6c5fcd52 16 #include "Arial28x28.h"
Rhyme 3:ea0c3cffa988 17 #include "Arial43x48_numb.h"
Rhyme 3:ea0c3cffa988 18 #include "SPI_STMPE610.h"
Rhyme 0:2b9a6c5fcd52 19 #include "vt100.h"
Rhyme 0:2b9a6c5fcd52 20 #include "TFTMenu.h"
Rhyme 0:2b9a6c5fcd52 21 #include "menu.h"
Rhyme 0:2b9a6c5fcd52 22 #include "trig.h"
Rhyme 0:2b9a6c5fcd52 23 #include "view.h"
Rhyme 0:2b9a6c5fcd52 24 #include "main.h"
Rhyme 0:2b9a6c5fcd52 25
Rhyme 0:2b9a6c5fcd52 26 vt100 tty ;
Rhyme 0:2b9a6c5fcd52 27 AnalogIn *ach[NUM_MAX_ANALOG_CH] ;
Rhyme 0:2b9a6c5fcd52 28 Ticker timer ;
Rhyme 5:0cffd2b70a1e 29 DigitalOut tsc_cs(PIN_CS_TSC, 1) ;
Rhyme 5:0cffd2b70a1e 30 DigitalOut backlight(PIN_BL_TFT, 0) ;
Rhyme 6:c93e2f12b789 31
Rhyme 3:ea0c3cffa988 32 ILI9341 TFT(SPI_8, 10000000,
Rhyme 3:ea0c3cffa988 33 PIN_MOSI, PIN_MISO, PIN_SCLK,
Rhyme 3:ea0c3cffa988 34 PIN_CS_TFT, PIN_RESET_TFT, PIN_DC_TFT, "Adafruit2.8") ;
Rhyme 0:2b9a6c5fcd52 35 SPI_STMPE610 TSC(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TSC) ;
Rhyme 0:2b9a6c5fcd52 36 TFTMenuItem *menu[NUM_MAX_MENU] ;
Rhyme 0:2b9a6c5fcd52 37 int numMenu = 0 ;
Rhyme 0:2b9a6c5fcd52 38
Rhyme 0:2b9a6c5fcd52 39 float vref = 3.28 ; // input range 0 - 3.3V
Rhyme 0:2b9a6c5fcd52 40 uint16_t udata[2][NUM_MAX_ANALOG_CH][CHART_LEN] ; // data storage ;
Rhyme 0:2b9a6c5fcd52 41 uint16_t bor[2] = {0, 0} ; // begin of ring buffer
Rhyme 0:2b9a6c5fcd52 42 int data_index = 0 ;
Rhyme 0:2b9a6c5fcd52 43 int numAnalogIn = 2 ;
Rhyme 0:2b9a6c5fcd52 44 int memLength = CHART_LEN ;
Rhyme 0:2b9a6c5fcd52 45 int us_interval = MIN_INTERVAL ; // 20us = 50KHz
Rhyme 0:2b9a6c5fcd52 46 bool frame_full = false ;
Rhyme 0:2b9a6c5fcd52 47 int page = 0 ; //
Rhyme 0:2b9a6c5fcd52 48 int prev_page = 0 ;
Rhyme 0:2b9a6c5fcd52 49 int mode = MODE_RUN ;
Rhyme 0:2b9a6c5fcd52 50
Rhyme 0:2b9a6c5fcd52 51 void sampleAD(void) ;
Rhyme 0:2b9a6c5fcd52 52 void drawMenu(void) ;
Rhyme 0:2b9a6c5fcd52 53 // void eraseGraphFrames(void) ;
Rhyme 0:2b9a6c5fcd52 54
Rhyme 0:2b9a6c5fcd52 55 /**
Rhyme 0:2b9a6c5fcd52 56 * u2v unsigned int data value to voltage conversion
Rhyme 0:2b9a6c5fcd52 57 */
Rhyme 0:2b9a6c5fcd52 58 float u2v(uint16_t uvalue)
Rhyme 0:2b9a6c5fcd52 59 {
Rhyme 0:2b9a6c5fcd52 60 return( vref * (float)uvalue / 65535.0 ) ;
Rhyme 0:2b9a6c5fcd52 61 }
Rhyme 0:2b9a6c5fcd52 62
Rhyme 0:2b9a6c5fcd52 63 /**
Rhyme 0:2b9a6c5fcd52 64 * v2u voltage to unsigned int data conversion
Rhyme 0:2b9a6c5fcd52 65 */
Rhyme 0:2b9a6c5fcd52 66 uint16_t v2u(float voltage)
Rhyme 0:2b9a6c5fcd52 67 {
Rhyme 0:2b9a6c5fcd52 68 return(0xFFFF * voltage / vref) ;
Rhyme 0:2b9a6c5fcd52 69 }
Rhyme 0:2b9a6c5fcd52 70
Rhyme 0:2b9a6c5fcd52 71 /**
Rhyme 0:2b9a6c5fcd52 72 * u2f unsigned int to float (0 - 1.0) conversion
Rhyme 0:2b9a6c5fcd52 73 */
Rhyme 0:2b9a6c5fcd52 74 float u2f(uint16_t value)
Rhyme 0:2b9a6c5fcd52 75 {
Rhyme 0:2b9a6c5fcd52 76 return( (float)value / 65535.0 ) ;
Rhyme 0:2b9a6c5fcd52 77 }
Rhyme 0:2b9a6c5fcd52 78
Rhyme 0:2b9a6c5fcd52 79 void initADC(void)
Rhyme 0:2b9a6c5fcd52 80 {
Rhyme 0:2b9a6c5fcd52 81 if (numAnalogIn > 0) {
Rhyme 4:6f3532a1a962 82 ach[0] = new AnalogIn(PIN_ADC_CH0) ;
Rhyme 0:2b9a6c5fcd52 83 }
Rhyme 0:2b9a6c5fcd52 84 if (numAnalogIn > 1) {
Rhyme 4:6f3532a1a962 85 ach[1] = new AnalogIn(PIN_ADC_CH1) ;
Rhyme 0:2b9a6c5fcd52 86 }
Rhyme 0:2b9a6c5fcd52 87
Rhyme 6:c93e2f12b789 88 #if defined (TARGET_KL25Z)
Rhyme 0:2b9a6c5fcd52 89 ADC0->CFG1 = ADC0->CFG1 & (
Rhyme 0:2b9a6c5fcd52 90 ~(
Rhyme 0:2b9a6c5fcd52 91 0x80 // LDLPC = 0 ; no low-power mode
Rhyme 0:2b9a6c5fcd52 92 | 0x60 // ADIV = 1
Rhyme 0:2b9a6c5fcd52 93 | 0x10 // Sample time short
Rhyme 0:2b9a6c5fcd52 94 | 0x03 // input clock = BUS CLK
Rhyme 0:2b9a6c5fcd52 95 )
Rhyme 0:2b9a6c5fcd52 96 ) ; // clkdiv <= 1
Rhyme 0:2b9a6c5fcd52 97 ADC0->CFG2 = ADC0->CFG2
Rhyme 0:2b9a6c5fcd52 98 | 0x03 ; // Logsample Time 11 = 2 extra ADCK
Rhyme 0:2b9a6c5fcd52 99 ADC0->SC3 = ADC0->SC3
Rhyme 0:2b9a6c5fcd52 100 & (~(0x03)) ; // hardware avarage off
Rhyme 6:c93e2f12b789 101 #endif
Rhyme 9:657155f03cb8 102 #if defined (TARGET_MAX32600MBED)
Rhyme 9:657155f03cb8 103 uint32_t *pga_ctrl = (uint32_t*)0x40054004 ; /* ADC_PGA_CTRL */
Rhyme 9:657155f03cb8 104 printf("PGA_CTRL(before) = 0x%08X\n", *pga_ctrl) ;
Rhyme 9:657155f03cb8 105 // *pga_ctrl |= 0x02 ; /* clear bit[1:0] to set gain x1 (default) */
Rhyme 9:657155f03cb8 106 // *pga_ctrl |= 0x40 ; /* skip PGA */
Rhyme 9:657155f03cb8 107 printf("PGA_CTRL(after) = 0x%08X\n", *pga_ctrl) ;
Rhyme 9:657155f03cb8 108 #endif
Rhyme 0:2b9a6c5fcd52 109 }
Rhyme 0:2b9a6c5fcd52 110
Rhyme 0:2b9a6c5fcd52 111 void envChanged(void)
Rhyme 0:2b9a6c5fcd52 112 {
Rhyme 0:2b9a6c5fcd52 113 timer.detach() ;
Rhyme 0:2b9a6c5fcd52 114
Rhyme 0:2b9a6c5fcd52 115 eraseGraphFrames() ;
Rhyme 0:2b9a6c5fcd52 116 drawGraphFrames() ;
Rhyme 0:2b9a6c5fcd52 117
Rhyme 0:2b9a6c5fcd52 118 data_index = 0 ;
Rhyme 0:2b9a6c5fcd52 119 page = 0 ;
Rhyme 0:2b9a6c5fcd52 120 prev_page = 0 ;
Rhyme 0:2b9a6c5fcd52 121 frame_full = false ;
Rhyme 0:2b9a6c5fcd52 122 if (trig_mode == TRIG_MODE_NONE) {
Rhyme 0:2b9a6c5fcd52 123 sampling_status = ST_TRIG_HIT ;
Rhyme 0:2b9a6c5fcd52 124 post_trig_index = 0 ;
Rhyme 0:2b9a6c5fcd52 125 } else {
Rhyme 0:2b9a6c5fcd52 126 sampling_status = ST_PRE_TRIG ;
Rhyme 0:2b9a6c5fcd52 127 }
Rhyme 0:2b9a6c5fcd52 128 /*
Rhyme 0:2b9a6c5fcd52 129 if (mode == MODE_RUN) {
Rhyme 0:2b9a6c5fcd52 130 timer.attach_us(&sampleAD, us_interval) ;
Rhyme 0:2b9a6c5fcd52 131 }
Rhyme 0:2b9a6c5fcd52 132 */
Rhyme 0:2b9a6c5fcd52 133 }
Rhyme 0:2b9a6c5fcd52 134
Rhyme 0:2b9a6c5fcd52 135 bool checkTrigger(void)
Rhyme 0:2b9a6c5fcd52 136 {
Rhyme 0:2b9a6c5fcd52 137 bool result = false ;
Rhyme 0:2b9a6c5fcd52 138 int prev_index ;
Rhyme 0:2b9a6c5fcd52 139 uint16_t current, prev ;
Rhyme 0:2b9a6c5fcd52 140 if (data_index > 0) {
Rhyme 0:2b9a6c5fcd52 141 prev_index = data_index - 1 ;
Rhyme 0:2b9a6c5fcd52 142 } else {
Rhyme 0:2b9a6c5fcd52 143 prev_index = memLength - 1 ; // memLength - 1 ;
Rhyme 0:2b9a6c5fcd52 144 }
Rhyme 0:2b9a6c5fcd52 145 current = udata[page][trig_ch][data_index] ;
Rhyme 0:2b9a6c5fcd52 146 prev = udata[page][trig_ch][prev_index] ;
Rhyme 0:2b9a6c5fcd52 147
Rhyme 0:2b9a6c5fcd52 148 switch(trig_mode) {
Rhyme 0:2b9a6c5fcd52 149 case TRIG_MODE_NONE: // no trigger, return true at the beggining
Rhyme 0:2b9a6c5fcd52 150 trig_index = 0 ;
Rhyme 0:2b9a6c5fcd52 151 result = true ;
Rhyme 0:2b9a6c5fcd52 152 break ;
Rhyme 0:2b9a6c5fcd52 153 case TRIG_MODE_RISE:
Rhyme 0:2b9a6c5fcd52 154 if ((prev < utrig_level)&&(utrig_level <= current)) {
Rhyme 0:2b9a6c5fcd52 155 result = true ;
Rhyme 0:2b9a6c5fcd52 156 }
Rhyme 0:2b9a6c5fcd52 157 break ;
Rhyme 0:2b9a6c5fcd52 158 case TRIG_MODE_FALL:
Rhyme 0:2b9a6c5fcd52 159 if ((prev > utrig_level)&&(utrig_level >= current)) {
Rhyme 0:2b9a6c5fcd52 160 result = true ;
Rhyme 0:2b9a6c5fcd52 161 }
Rhyme 0:2b9a6c5fcd52 162 break ;
Rhyme 0:2b9a6c5fcd52 163 case TRIG_MODE_LEVEL:
Rhyme 0:2b9a6c5fcd52 164 if (current > trig_level_margin) {
Rhyme 0:2b9a6c5fcd52 165 if (((current + trig_level_margin) >= utrig_level)&&(utrig_level >= (current - trig_level_margin))) {
Rhyme 0:2b9a6c5fcd52 166 result = true ;
Rhyme 0:2b9a6c5fcd52 167 }
Rhyme 0:2b9a6c5fcd52 168 } else {
Rhyme 0:2b9a6c5fcd52 169 if ((current + trig_level_margin) >= utrig_level) {
Rhyme 0:2b9a6c5fcd52 170 result = true ;
Rhyme 0:2b9a6c5fcd52 171 }
Rhyme 0:2b9a6c5fcd52 172 }
Rhyme 0:2b9a6c5fcd52 173 break ;
Rhyme 0:2b9a6c5fcd52 174 default:
Rhyme 0:2b9a6c5fcd52 175 printf("Error: Unknown trigger mode %d\n", trig_mode) ;
Rhyme 0:2b9a6c5fcd52 176 break ;
Rhyme 0:2b9a6c5fcd52 177 }
Rhyme 0:2b9a6c5fcd52 178 return( result ) ;
Rhyme 0:2b9a6c5fcd52 179 }
Rhyme 0:2b9a6c5fcd52 180
Rhyme 0:2b9a6c5fcd52 181 void sampleAD(void)
Rhyme 0:2b9a6c5fcd52 182 {
Rhyme 0:2b9a6c5fcd52 183 if (frame_full) {
Rhyme 0:2b9a6c5fcd52 184 return ;
Rhyme 0:2b9a6c5fcd52 185 }
Rhyme 0:2b9a6c5fcd52 186 // timer.detach() ;
Rhyme 0:2b9a6c5fcd52 187 for (int i = 0 ; i < numAnalogIn ; i++ ) {
Rhyme 0:2b9a6c5fcd52 188 udata[page][i][data_index] = ach[i]->read_u16() ;
Rhyme 0:2b9a6c5fcd52 189 }
Rhyme 0:2b9a6c5fcd52 190 // timer.attach_us(&sampleAD, us_interval) ;
Rhyme 0:2b9a6c5fcd52 191 switch(sampling_status) {
Rhyme 0:2b9a6c5fcd52 192 case ST_PRE_TRIG:
Rhyme 0:2b9a6c5fcd52 193 if (data_index >= trig_pos) {
Rhyme 0:2b9a6c5fcd52 194 sampling_status = ST_TRIG_WAIT ;
Rhyme 0:2b9a6c5fcd52 195 } else {
Rhyme 0:2b9a6c5fcd52 196 data_index = (data_index + 1) % memLength ;
Rhyme 0:2b9a6c5fcd52 197 }
Rhyme 0:2b9a6c5fcd52 198 break ;
Rhyme 0:2b9a6c5fcd52 199 case ST_TRIG_WAIT:
Rhyme 0:2b9a6c5fcd52 200 if (checkTrigger()) {
Rhyme 0:2b9a6c5fcd52 201 trig_index = data_index ;
Rhyme 0:2b9a6c5fcd52 202 post_trig_index = 0 ;
Rhyme 0:2b9a6c5fcd52 203 sampling_status = ST_TRIG_HIT ;
Rhyme 0:2b9a6c5fcd52 204 } else {
Rhyme 0:2b9a6c5fcd52 205 data_index = (data_index + 1) % memLength ;
Rhyme 0:2b9a6c5fcd52 206 }
Rhyme 0:2b9a6c5fcd52 207 break ;
Rhyme 0:2b9a6c5fcd52 208 case ST_TRIG_HIT:
Rhyme 0:2b9a6c5fcd52 209 post_trig_index++ ;
Rhyme 0:2b9a6c5fcd52 210 if (post_trig_index >= post_trig_len) {
Rhyme 0:2b9a6c5fcd52 211 sampling_status = ST_BUF_FULL ;
Rhyme 0:2b9a6c5fcd52 212 frame_full = true ;
Rhyme 0:2b9a6c5fcd52 213 bor[page] = (memLength + trig_index - trig_pos) % memLength ;
Rhyme 0:2b9a6c5fcd52 214 post_trig_index = 0 ;
Rhyme 0:2b9a6c5fcd52 215 data_index = 0 ;
Rhyme 0:2b9a6c5fcd52 216 } else {
Rhyme 0:2b9a6c5fcd52 217 data_index = (data_index + 1) % memLength ;
Rhyme 0:2b9a6c5fcd52 218 }
Rhyme 0:2b9a6c5fcd52 219 break ;
Rhyme 0:2b9a6c5fcd52 220 case ST_BUF_FULL:
Rhyme 0:2b9a6c5fcd52 221 printf("mode = ST_BUF_FULL\n\r") ;
Rhyme 0:2b9a6c5fcd52 222 break ;
Rhyme 0:2b9a6c5fcd52 223 default:
Rhyme 0:2b9a6c5fcd52 224 printf("unknown sample status %d\n", sampling_status) ;
Rhyme 0:2b9a6c5fcd52 225 break ;
Rhyme 0:2b9a6c5fcd52 226 }
Rhyme 0:2b9a6c5fcd52 227 }
Rhyme 0:2b9a6c5fcd52 228
Rhyme 0:2b9a6c5fcd52 229
Rhyme 0:2b9a6c5fcd52 230 bool doTrigValue(int x, int y)
Rhyme 0:2b9a6c5fcd52 231 {
Rhyme 0:2b9a6c5fcd52 232 int i, y_offset ;
Rhyme 0:2b9a6c5fcd52 233 bool result = false ;
Rhyme 0:2b9a6c5fcd52 234 for (i = 0 ; i < numAnalogIn ; i++ ) {
Rhyme 0:2b9a6c5fcd52 235 if (inChFrame(i, x, y)) {
Rhyme 0:2b9a6c5fcd52 236 result = true ;
Rhyme 0:2b9a6c5fcd52 237 trig_ch = i ;
Rhyme 0:2b9a6c5fcd52 238 trig_pos = x - left_margin;
Rhyme 0:2b9a6c5fcd52 239 post_trig_len = memLength - trig_pos ;
Rhyme 0:2b9a6c5fcd52 240 y_offset = head_h + (pane_h + 5) * i + 1;
Rhyme 0:2b9a6c5fcd52 241 trig_level = vref *(1 - ((float)(y - y_offset) / (float)(pane_h - 2))) ;
Rhyme 0:2b9a6c5fcd52 242 if (trig_level > vref) {
Rhyme 0:2b9a6c5fcd52 243 trig_level = vref ;
Rhyme 0:2b9a6c5fcd52 244 } else if (trig_level < 0.0) {
Rhyme 0:2b9a6c5fcd52 245 trig_level = 0.0 ;
Rhyme 0:2b9a6c5fcd52 246 }
Rhyme 0:2b9a6c5fcd52 247 utrig_level = v2u( trig_level ) ;
Rhyme 0:2b9a6c5fcd52 248 break ;
Rhyme 0:2b9a6c5fcd52 249 }
Rhyme 0:2b9a6c5fcd52 250 }
Rhyme 0:2b9a6c5fcd52 251 return( result ) ;
Rhyme 0:2b9a6c5fcd52 252 }
Rhyme 0:2b9a6c5fcd52 253
Rhyme 0:2b9a6c5fcd52 254 void hello()
Rhyme 0:2b9a6c5fcd52 255 {
Rhyme 0:2b9a6c5fcd52 256 printf("=== simple oscilloscope ===\n\r") ;
Rhyme 0:2b9a6c5fcd52 257 printf("built: %s\n\r",__DATE__) ;
Rhyme 0:2b9a6c5fcd52 258 }
Rhyme 0:2b9a6c5fcd52 259
Rhyme 0:2b9a6c5fcd52 260 int main()
Rhyme 0:2b9a6c5fcd52 261 {
Rhyme 0:2b9a6c5fcd52 262 int touched ;
Rhyme 0:2b9a6c5fcd52 263 uint16_t x, y ;
Rhyme 0:2b9a6c5fcd52 264 bool result ;
Rhyme 0:2b9a6c5fcd52 265 tty.cls() ;
Rhyme 0:2b9a6c5fcd52 266 backlight = 0 ;
Rhyme 0:2b9a6c5fcd52 267 initTFT() ;
Rhyme 0:2b9a6c5fcd52 268 initADC() ;
Rhyme 0:2b9a6c5fcd52 269 initMenu() ;
Rhyme 0:2b9a6c5fcd52 270
Rhyme 0:2b9a6c5fcd52 271 us_interval = MIN_INTERVAL ;
Rhyme 0:2b9a6c5fcd52 272
Rhyme 0:2b9a6c5fcd52 273 drawGraphFrames() ;
Rhyme 0:2b9a6c5fcd52 274 drawMenu() ;
Rhyme 6:c93e2f12b789 275
Rhyme 0:2b9a6c5fcd52 276 backlight = 1 ;
Rhyme 0:2b9a6c5fcd52 277 hello() ;
Rhyme 0:2b9a6c5fcd52 278 timer.attach_us(&sampleAD, us_interval) ;
Rhyme 0:2b9a6c5fcd52 279 while(1) {
Rhyme 0:2b9a6c5fcd52 280 drawChart() ;
Rhyme 0:2b9a6c5fcd52 281 touched = TSC.getPoint(&x, &y) ;
Rhyme 6:c93e2f12b789 282 if (touched && ((x != 0)||(y != 0))) { // TSC sometimes returns (0,0)
Rhyme 6:c93e2f12b789 283 if (mode == MODE_RUN) {
Rhyme 6:c93e2f12b789 284 timer.detach() ;
Rhyme 6:c93e2f12b789 285 }
Rhyme 0:2b9a6c5fcd52 286 result = doMenu(x, y) ;
Rhyme 0:2b9a6c5fcd52 287 if (result != true) {
Rhyme 0:2b9a6c5fcd52 288 result = doTrigValue(x, y) ;
Rhyme 0:2b9a6c5fcd52 289 if (result) {
Rhyme 0:2b9a6c5fcd52 290 drawTrigMark() ;
Rhyme 0:2b9a6c5fcd52 291 printTrigMode() ;
Rhyme 0:2b9a6c5fcd52 292 }
Rhyme 0:2b9a6c5fcd52 293 }
Rhyme 0:2b9a6c5fcd52 294 if (mode == MODE_RUN) {
Rhyme 0:2b9a6c5fcd52 295 timer.attach_us(&sampleAD, us_interval) ;
Rhyme 0:2b9a6c5fcd52 296 }
Rhyme 0:2b9a6c5fcd52 297 }
Rhyme 0:2b9a6c5fcd52 298 wait(0.1) ;
Rhyme 0:2b9a6c5fcd52 299 }
Rhyme 0:2b9a6c5fcd52 300 }