$prog &HFF , &HF7 , &HD9 , &HFE 'CKDIV8 = 1 , SUT = 11 , CKSEL = 0111 , BODLEVEL = 1.8V ' ' ************************************** ' * GPS AE-GYSFDMAXB , GT-502MGG-N * ' * 高精度1Hz出力(GPS情報LCD表示版) * ' * Basic Compiler is BASCOM-AVR * ' * Copyright O-Family 2016. 6. 6 * ' ************************************** ' ' Ver. L0.11 初回公開バージョン。2016. 6. 6 ' Ver. L0.12 GT-502MGG-Nに対応。2023.10.17 ' ' Const Prgver = "L0.12" 'プログラム・バージョン。 $regfile = "m328pdef.dat" '使用するAVRを設定。 $crystal = 20000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 32 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' Sw_1 Alias Pinc.0 'スイッチ[1]の接続ポート。 Sw_2 Alias Pinc.1 'スイッチ[2]の接続ポート。 Sw_3 Alias Pinc.2 'スイッチ[3]の接続ポート。 ' ' * 変数の宣言 * ' Dim Rxbyte As Byte '受信データ。 Dim Rxstate As Byte 'データ受信の処理状態。 Dim Index As Byte 'センテンスのデータ・ブロック番号。 Dim Rxlength As Byte '受信ブロック毎の文字数。 Dim Chksum As Byte 'チェックサム。 Dim Chksumstr As String * 2 'チェックサムの文字列。 Dim Rxflag As Byte '受信データの状態フラグ。 Dim Rxnow As Byte '受信中フラグ。 Dim Rxtimeout As Byte '受信タイムアウト検出カウンター。 Dim Hourmode As Byte '12/24時間制表示選択。(0:12時間制 , 1:24時間制) Dim Dispmode As Byte 'LCDの表示モード。(0:時刻表示, 1:位置表示, 2:速度・高度表示) Dim Posimode As Byte '位置の表示モード。(0:[度分], 1:[度分秒], 2:[度]10進) Dim Speedmode As Byte '速度の表示モード。(0:[速度Km/h] ,1:[速度ノット] ,2:[高度]) Dim Rxdata(20) As String * 16 '受信データの保管場所。(16文字*20ブロック) ' Dim Satellite As String * 3 '受信衛星数。 Dim Gpsquality As String * 2 '測位の品質。(0:未測位, 1:単独測位, 2:DGPS) Dim Gpsmode As String * 2 '測位のモード。(1:未測位, 2:2D, 3:3D) Dim Latitude As String * 16 '緯度。 Dim Latitudedir As String * 2 '緯度の方角。 Dim Longitude As String * 16 '経度。 Dim Longitudedir As String * 2 '経度の方角。 Dim Altitude As String * 16 '海抜高度。 Dim Trackdegrees As String * 16 '真北に対する進行方向。 Dim Speedknot As String * 16 '対地速度(ノット)。 Dim Speedkm As String * 16 '対地速度(Km/h)。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Temp3 As Byte '汎用テンポラリ変数 Byte型 No.3 Dim Temp4 As Byte '汎用テンポラリ変数 Byte型 No.4 Dim Templ1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Templ2 As Long '汎用テンポラリ変数 Long型 No.2 Dim Tempstr As String * 20 '汎用テンポラリ変数 String型 No.1 Dim Tempstr2 As String * 20 '汎用テンポラリ変数 String型 No.2 ' Dim Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eephourmode As Eram Byte 'EEPROM 12/24時間制表示選択。(0:12時間制 , 1:24時間制) Dim Eepdispmode As Eram Byte 'EEPROM LCDの表示モード。 Dim Eepposimode As Eram Byte 'EEPROM 位置の表示モード。 Dim Eepspeedmode As Eram Byte 'EEPROM 速度の表示モード。 ' ' * ポートの初期設定 * ' Set Portc.0 'スイッチ[1]の接続ポートをプルアップする。 Set Portc.1 'スイッチ[2]の接続ポートをプルアップする。 Set Portc.2 'スイッチ[3]の接続ポートをプルアップする。 ' Set Portc.3 '未使用ポートをプルアップする。 Set Portc.4 '未使用ポートをプルアップする。 Set Portc.5 '未使用ポートをプルアップする。 Set Portd.2 '未使用ポートをプルアップする。 Set Portd.3 '未使用ポートをプルアップする。 Set Portd.4 '未使用ポートをプルアップする。 ' ' * LCDの初期設定 * ' Config Lcdmode = Port 'LCDを4ビットのポートモードに設定。 Config Lcdbus = 4 'LCDデータバスを4bitに設定。 Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.1 'LCDのポート割り当て。 Config Lcdpin = Pin , Db6 = Portb.4 , Db7 = Portb.5 Config Lcdpin = Pin , E = Portb.3 , Rs = Portd.7 Config Lcd = 16 * 2 'LCD表示を16文字2行に設定。 Cls 'LCD表示をすべて消去。 ' ' * シリアル通信ポートの初期設定 * ' $baud = 9600 'シリアル通信の設定。9,600ボー,パリティー無し,データ・ビット8,ストップビット1 Config Serialin = Buffered , Size = 255 'シリアルデータ受信を、バッファを使用した割り込み処理にする。 ' ' * 時計の初期設定 * ' Config Clock = User '時計をUserモードに設定。 Config Date = Ymd , Separator = / '日付の表現方法(形式)を設定。 ' ' * LCDへ起動メッセージを表示 * ' Cursor Off 'LCDのカーソルをオフにする。 Locate 1 , 1 'LCDにタイトルを表示する。 Lcd "GPS Freq Counter" Locate 2 , 5 'LCDにプログラム・バージョンを表示する。 Lcd "Ver. " ; Prgver Wait 2 '表示の待ち時間。 Cls 'LCD表示をすべて消去。 ' ' * EEPROMのデータを確認する * ' If Eephourmode > 1 Then 'If EEPROMが初期値か? Then Eephourmode = 0 'EEPROM 12/24時間制表示選択。(0:12時間制 , 1:24時間制) Eepdispmode = 0 'EEPROM LCDの表示モード。(0:時刻表示, 1:位置表示, 2:速度・高度表示) Eepposimode = 0 'EEPROM 位置の表示モード。(0:[度分], 1:[度分秒], 2:[度]10進) Eepspeedmode = 0 'EEPROM 速度の表示モード。(0:[速度Km/h] ,1:[速度ノット] ,2:[高度]) End If Hourmode = Eephourmode Dispmode = Eepdispmode Posimode = Eepposimode Speedmode = Eepspeedmode ' ' * 完全コールドスタート(工場出荷時のデフォルト状態) * ' If Sw_3 = 0 Then 'If [SW3]が押されているか? Then Print "$PMTK104*37" '完全コールドスタート(工場出荷時のデフォルト状態)コマンドを送信する。 Locate 1 , 1 Lcd "Full ColdRestart" Locate 2 , 1 Lcd " System Defaults" Bitwait Sw_3 , Set '[SW3]が離されるまで待つ。 Waitms 30 'チャタリング・タイマー。 Cls 'LCD表示をすべて消去。 End If ' ' * Timerの設定 * ' Config Timer0 = Timer , Prescale = 1 , Clear Timer = 1 , Compare A = Toggle 'Timer0の設定。 Compare0a = 10 - 1 '20,000,000Hz / 10カウント * 2 = 1,000,000Hz ' Config Timer2 = Timer , Prescale = 1024 , Clear Timer = 1 'Timer2 20,000,000Hz / 1,024 = 19,531Hz Compare2a = 195 - 1 '19,531Hz / 195 = 100Hz (約10mS) ' ' ************* ' * GPSモード * ' ************* ' Gpsinit: Enable Interrupts 'すべての割り込みを許可。 Rxstate = 0 '受信状態を[ヘッダー]の受信待ちにする。 Rxflag = 0 '受信データの状態フラグを初期化する。 Rxtimeout = 0 '受信タイムアウトのカウンターをクリアする。 Rxnow = 0 '受信中フラグを初期化する。 Clear Serialin 'シリアルバッファ−の内容を初期化する。 Cls 'LCD表示をすべて消去。 Locate 1 , 1 Lcd "---" Locate 2 , 1 Lcd "---" ' ' ************************* ' * GPS用 メイン ルーチン * ' ************************* ' Gpsmain: Gosub Gpsrx 'GPSデータを受信する。 Gosub Gpsdisp 'GPSからの情報をLCDに表示する。 ' Debounce Sw_2 , 0 , Sw2on '[SW2]が押されたか? Debounce Sw_3 , 0 , Sw3on '[SW3]が押されたか? Goto Gpsmain ' ' * [SW2]が押された場合 * ' Sw2on: Dispmode = Dispmode + 1 '表示モードを進める。 If Dispmode > 2 Then 'If 最終値か? Then Dispmode = 0 End If Eepdispmode = Dispmode 'EEPROMに保管する。 Gosub Lcddisp '表示モード毎に受信情報を表示する。 Goto Gpsmain ' ' * [SW3]が押された場合 * ' Sw3on: Select Case Dispmode Case 0 : '[時計表示]の場合。 Hourmode = Hourmode + 1 '12/24時間制表示を変更する。 If Hourmode > 1 Then 'If 最終値か? Then Hourmode = 0 End If Eephourmode = Hourmode 'EEPROMに保管する。 ' Case 1 : '[位置表示]の場合。 Posimode = Posimode + 1 '位置表示モードを変更する。 If Posimode > 2 Then 'If 最終値か? Then Posimode = 0 End If Eepposimode = Posimode 'EEPROMに保管する。 ' Case 2 : '[速度表示]の場合。 Speedmode = Speedmode + 1 '速度表示モードを変更する。 If Speedmode > 2 Then 'If 最終値か? Then Speedmode = 0 End If Eepspeedmode = Speedmode 'EEPROMに保管する。 ' End Select Gosub Lcddisp '表示モード毎に受信情報を表示する。 Goto Gpsmain '------------------------------------------------------------ ' ' *********************** ' * GPSデータを受信する * ' *********************** ' Gpsrx: Rxbyte = Inkey() 'シリアルバッファーから受信データを1バイト取り出す。 If Rxbyte = 0 Then Return 'If 受信データがないか? Then ' Select Case Rxstate '受信状態による処理。 Case 0 : '[ヘッダー]の受信待ち。 If Rxbyte = "$" Then 'If ヘッダーコードか? Then Rxstate = 1 '受信状態を[$〜*]間のデータ受信にする。 For Temp1 = 1 To 20 '受信データ保管ブロックの文字列を初期化する。 Rxdata(temp1) = "" Next Temp1 Index = 1 'センテンスのデータ・ブロック番号を初期化する。 Rxlength = 0 '受信ブロック毎の文字数を初期化する。 Chksum = 0 'チェックサムを初期化する。 End If ' Case 1 : '[$〜*]間のデータを受信。 If Rxbyte = "*" Then 'If データの終了コードか? Then Rxstate = 2 '受信状態をチェックサム1バイト目の受信にする。 Else Chksum = Chksum Xor Rxbyte 'チェックサムを計算する。 If Rxbyte = "," Then 'If ブロックの区切りコードか? Then Index = Index + 1 Rxlength = 0 '受信ブロック毎の文字数を初期化する。 Else If Rxlength < 15 Then 'If 受信ブロックの文字数が15文字以内か? Then Rxdata(index) = Rxdata(index) + Chr(rxbyte) Rxlength = Rxlength + 1 '受信ブロック毎の文字数を加算する。 End If End If End If ' Case 2 : '[チェックサム]の1バイト目を受信。 Chksumstr = Chr(rxbyte) 'チェックサムを文字列に保管する。 Rxstate = 3 '受信状態をチェックサム2バイト目の受信にする。 ' Case 3 : '[チェックサム]の2バイト目を受信。 Chksumstr = Chksumstr + Chr(rxbyte) 'チェックサムを文字列に保管する。 Temp2 = Hexval(chksumstr) 'チェックサムの文字列を16進数値に変換する。 ' If Chksum = Temp2 Then 'If チェックサムが一致したか? Then Gosub Gpsdata 'GPSデータを解析する。 Else 'チェックサムエラーが発生した場合。 Cls 'LCD表示をすべて消去。 Locate 1 , 1 'LCDにエラーを表示する。 Lcd "#Check Sum Error" Locate 2 , 5 Lcd Hex(chksum) ; " <> *" ; Chksumstr Wait 2 Cls 'LCD表示をすべて消去。 Clear Serialin 'シリアルバッファ−の内容を初期化する。 End If ' Rxstate = 0 '受信状態を[ヘッダー]の受信待ちにする。 End Select Return ' ' *********************** ' * GPSデータを解析する * ' *********************** ' Gpsdata: Rxdata(1) = Right(rxdata(1) , 3) 'NMEAコマンド(右3文字)を取り出す。 Select Case Rxdata(1) Case "GGA" : '[GGAセンテンス] Latitude = Rxdata(3) '緯度。 Latitudedir = Rxdata(4) '緯度の方角。 Longitude = Rxdata(5) '経度。 Longitudedir = Rxdata(6) '経度の方角。 ' Gpsquality = Rxdata(7) '測位の品質。(0:未測位, 1:単独測位, 2:DGPS) Satellite = Rxdata(8) '受信衛星数。 ' Altitude = Rxdata(10) '海抜高度。 Set Rxflag.0 '受信フラグをセットする。 ' Case "GSA" : '[GSAセンテンス] Gpsmode = Rxdata(3) '測位のモード。(1:未測位, 2:2D, 3:3D) Set Rxflag.1 '受信フラグをセットする。 ' Case "RMC" : '[RMCセンテンス] Time$ = Mid(rxdata(2) , 1 , 2) + ":" + Mid(rxdata(2) , 3 , 2) + ":" + Mid(rxdata(2) , 5 , 2) '時刻を取り出す。 Date$ = Mid(rxdata(10) , 5 , 2) + "/" + Mid(rxdata(10) , 3 , 2) + "/" + Mid(rxdata(10) , 1 , 2) '日付を取り出す。 Templ1 = Syssec() '日時データから、累計する秒数を算出する。 Templ1 = Templ1 + 32400 'UTCからJSTに変換するため9時間を加算する。(60sec*60min*9hour) Time$ = Time(templ1) '累計秒数から時刻を算出する。 Date$ = Date(templ1) '累計秒数から日付を算出する。 Set Rxflag.2 '受信フラグをセットする。 ' Case "VTG" : '[VTGセンテンス] Trackdegrees = Rxdata(2) '真北に対する進行方向。 Speedknot = Rxdata(6) '対地速度(ノット)。 Speedkm = Rxdata(8) '対地速度(Km/h)。 Set Rxflag.3 '受信フラグをセットする。 End Select Return ' ' ******************************** ' * GPSからの情報をLCDに表示する * ' ******************************** ' Gpsdisp: If Rxnow = 0 Then 'If 受信中ではないか? Then If Rxflag <> 0 Then 'If センテンス・データが1つ以上受信されているか? Then Locate 1 , 1 '受信完了を消す。 Lcd " " Rxnow = 1 End If End If ' If Rxflag = &B0000_1111 Then 'If 受信データがそろったか? Then Locate 1 , 1 '受信完了を表示する。 Lcd "*" Rxnow = 0 ' Locate 1 , 2 Lcd Satellite ; " " '受信衛星数を表示する。 ' Locate 2 , 1 '測位のモードを表示する。 Select Case Gpsmode Case "1" : Lcd "--" '[1]未測位。 Case "2" : Lcd "2D" '[2]2D。 Case "3" : Lcd "3D" '[3]3D。 End Select ' Locate 2 , 3 '測位の品質を表示する。 Select Case Gpsquality Case "0" : Lcd "-" '[0]未測位。 Case "1" : Lcd "S" '[1]単独測位。 Case "2" : Lcd "D" '[2]DGPS。 End Select ' Gosub Lcddisp '表示モード毎に受信情報を表示する。 Rxflag = 0 Rxtimeout = 0 '受信タイムアウトのカウンターをクリアする。 End If ' ' * 受信が終了した状態を検知する(受信データと同期を取る) * ' If Rxstate <> 0 Then 'If 受信処理中か? Then Rxtimeout = 0 '受信タイムアウトのカウンターをクリアする。 Else If Tifr2.ocf2a = 1 Then 'If 10m経過したか? Then Set Tifr2.ocf2a 'Timer2 比較A一致フラグをリセットする。 ' Rxtimeout = Rxtimeout + 1 If Rxtimeout > 9 Then 'If 100ms経過したか? Then Rxtimeout = 0 '受信タイムアウトのカウンターをクリアする。 Rxflag = 0 '受信データをリセットして同期を取る。 End If End If End If Return ' ' ************************************ ' * 表示モード毎に受信情報を表示する * ' ************************************ ' Lcddisp: Select Case Dispmode Case 0 : '時刻表示。 Locate 1 , 5 '[日付]を表示する。 Lcd Date$ ; " " ; Temp1 = Dayofweek() '曜日を計算する。 Lcd Lookupstr(temp1 , Weekdata) '[曜日]を表示する。 ' Locate 2 , 5 '[時刻]を表示する。 Temp1 = _hour If Hourmode = 0 Then 'If 12時間制表示か? Then If Temp1 < 12 Then 'If AM or PM? Lcd "AM "; '[AM]を表示する。 Else Lcd "PM "; '[PM]を表示する。 End If ' If Temp1 = 0 Then Temp1 = 24 '24時間制時刻を12時間制に変換する。 If Temp1 > 12 Then Temp1 = Temp1 - 12 Else '24時間制の場合。 Lcd " "; End If ' Tempstr = Str(temp1) '[時]を表示する。 Lcd Format(tempstr , " 0") Lcd Right(time$ , 6) ; " " '[分:秒]を表示する。 ' Case 1 : '位置表示。 If Gpsquality = "0" Then 'If 未測位状態か? Then Gosub Notfixed '未測位を表示する。 ' Else '測位中の場合。 Locate 1 , 5 '[緯度の方角]を表示する。 Lcd Latitudedir ; Locate 2 , 5 '[経度の方角]を表示する。 Lcd Longitudedir ; ' Select Case Posimode Case 0 : '[度分](DD゚MM.MMMM)表示の場合。 Locate 1 , 6 Lcd " " ; Left(latitude , 2) ; "゚" ; Mid(latitude , 3 , 7) '緯度。 Locate 2 , 6 Lcd Left(longitude , 3) ; "゚" ; Mid(longitude , 4 , 7) '経度。 ' Case 1 : '[度分秒](DD゚MM'SS.S)表示の場合。 Locate 1 , 6 Lcd " " ; Left(latitude , 2) ; "゚" ; Mid(latitude , 3 , 2) ; "'"; '緯度。 Tempstr = Mid(latitude , 6 , 4) '[分]の小数点以下を取り出す。 Templ1 = Val(tempstr) '文字列を数値に変換する。 Templ1 = Templ1 * 60 '[秒]に変換する。 Templ1 = Templ1 / 1000 '下位3桁を切り捨てる。 Tempstr = Str(templ1) '数値を文字列に変換する。 Lcd Format(tempstr , " 0.0") '[秒]を表示する。 ' Locate 2 , 6 Lcd Left(longitude , 3) ; "゚" ; Mid(longitude , 4 , 2) ; "'"; '経度。 Tempstr = Mid(longitude , 7 , 4) '[分]の小数点以下を取り出す。 Templ1 = Val(tempstr) '文字列を数値に変換する。 Templ1 = Templ1 * 60 '[秒]に変換する。 Templ1 = Templ1 / 1000 '下位3桁を切り捨てる。 Tempstr = Str(templ1) '数値を文字列に変換する。 Lcd Format(tempstr , " 0.0") '[秒]を表示する。 ' ' Case 2 : '[度](DD.DDDDDD゚)10進表示の場合。 Locate 1 , 6 Tempstr = Left(latitude , 2) '[度]を取り出す。 Temp1 = Val(tempstr) '文字列を数値に変換する。 Templ2 = Temp1 * 1000000 '[分]と桁を合わせる。 Tempstr = Mid(latitude , 3 , 2) + Mid(latitude , 6 , 4) '[分]を取り出す。 Templ1 = Val(tempstr) '文字列を数値に変換する。 Templ1 = Templ1 * 100 '[度]と桁を合わせる。 Templ1 = Templ1 / 60 '[度]に変換する。 Templ1 = Templ1 + Templ2 '[度]に合算する。 Tempstr = Str(templ1) '数値を文字列に変換する。 Lcd " " ; Format(tempstr , " 0.000000") ; "゚" '[度]を表示する。 ' Locate 2 , 6 Tempstr = Left(longitude , 3) '[度]を取り出す。 Temp1 = Val(tempstr) '文字列を数値に変換する。 Templ2 = Temp1 * 1000000 '[分]と桁を合わせる。 Tempstr = Mid(longitude , 4 , 2) + Mid(longitude , 7 , 4) '[分]を取り出す。 Templ1 = Val(tempstr) '文字列を数値に変換する。 Templ1 = Templ1 * 100 '[度]と桁を合わせる。 Templ1 = Templ1 / 60 '[度]に変換する。 Templ1 = Templ1 + Templ2 '[度]に合算する。 Tempstr = Str(templ1) '数値を文字列に変換する。 Lcd Format(tempstr , " 0.000000") ; "゚" '[度]を表示する。 ' End Select End If ' Case 2 : '速度・高度表示。 If Gpsquality = "0" Then 'If 未測位状態か? Then Gosub Notfixed '未測位を表示する。 ' Else '測位中の場合。 Select Case Speedmode Case 0 : '[速度Km/h]表示の場合。 Gosub Trackdisp '[真北に対する進行方向]を表示する。 Gosub Speedkmdisp '[速度Km/h]を表示する。 ' Case 1 : '[速度ノット]表示の場合。 Gosub Trackdisp '[真北に対する進行方向]を表示する。 Temp1 = Len(speedknot) '文字数を調べる。 Temp1 = Temp1 - 1 '小数点以下を1桁にする。 Temp2 = 6 - Temp1 '桁数に合わせて先頭をスペースにする。 Locate 2 , 5 Lcd "Spd" ; Gosub Spaceout '先頭位置を合わせるスペースを出力する。 Lcd Left(speedknot , Temp1) ; "knt" ' Case 2 : '[高度]表示の場合。 Temp1 = Len(altitude) '文字数を調べる。 Temp2 = 7 - Temp1 '桁数に合わせて先頭をスペースにする。 Locate 1 , 5 Lcd "Alt" ; Gosub Spaceout '先頭位置を合わせるスペースを出力する。 Lcd Altitude ; " m" ' Gosub Speedkmdisp '[速度Km/h]を表示する。 ' End Select End If End Select Return ' ' * [真北に対する進行方向]を表示するサブルーチン * ' Trackdisp: Temp1 = Len(trackdegrees) '文字数を調べる。 Temp1 = Temp1 - 1 '小数点以下を1桁にする。 Temp2 = 5 - Temp1 '桁数に合わせて先頭をスペースにする。 Locate 1 , 5 Lcd "Track " ; Gosub Spaceout '先頭位置を合わせるスペースを出力する。 Lcd Left(trackdegrees , Temp1) ; "゚" Return ' ' * [速度Km/h]を表示するサブルーチン * ' Speedkmdisp: Temp1 = Len(speedkm) '文字数を調べる。 Temp1 = Temp1 - 1 '小数点以下を1桁にする。 Temp2 = 6 - Temp1 '桁数に合わせて先頭をスペースにする。 Locate 2 , 5 Lcd "Spd" ; Gosub Spaceout '先頭位置を合わせるスペースを出力する。 Lcd Left(speedkm , Temp1) ; "kmh" Return ' ' * スペースを出力するサブルーチン * ' Spaceout: If Temp2 = 0 Then Return 'If スペースは無しか? Then Lcd Spc(temp2) ; Return ' ' * 未測位を表示するサブルーチン * ' Notfixed: Locate 1 , 5 Lcd "-not fixed- " Locate 2 , 5 Lcd Spc(12) Return '############################################################ ' ' ************************************************************* ' * [Config Clock = User]で使用される時計設定ルーチン用ラベル * ' ************************************************************* ' Getdatetime: 'RTC等を使用しないので未処理。 Return ' Settime: 'RTC等を使用しないので未処理。 Return ' Setdate: 'RTC等を使用しないので未処理。 Return End ' ' * 曜日 データ・テーブル * ' Weekdata: Data "MON" , "TUE" , "WED" , "THU" , "FRI" , "SAT" , "SUN"