• R/O
  • HTTP
  • SSH
  • HTTPS

cpu2010: Commit

サブCPU2010のPICプログラム
ADデータ取得とGPS時刻付けを行いLinux部にデータを出力します。


Commit MetaInfo

Revisão5b0b2332f13a07da29824e66a69a2ee2ce05466b (tree)
Hora2011-12-09 17:21:24
AutorNaoya Takamura <ntaka206@user...>
CommiterNaoya Takamura

Mensagem de Log

adbuf_write() bug fix.

Mudança Sumário

Diff

--- a/main.c
+++ b/main.c
@@ -43,7 +43,7 @@ _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx2 )
4343 * タイムスタンプ
4444 */
4545 #define ADBUF_BYTE 3 // AD 1CH 1sample dataのbyte数
46-#define ADBUF_LEN sizeof(ADbufType) // 1dataの長さ byte
46+#define ADBUF_LEN sizeof(ADbufType) // 1dataの長さ byte $含まず
4747
4848 typedef struct {
4949 UbloxNavTimeUtc t; // タイムスタンプ
@@ -91,7 +91,7 @@ inline void adbuf_write(unsigned char buf_no, unsigned char ch, int cnt, long *d
9191 unsigned char i;
9292
9393 for(i = 0; i < ADBUF_BYTE; i++) {
94- adbuf->data[ch][ADBUF_BYTE*cnt + i] = *(ptr++);
94+ adbuf[buf_no].data[ch][ADBUF_BYTE*cnt + i] = *(ptr++);
9595 }
9696 }
9797 // 1
@@ -181,15 +181,22 @@ static char pps_intf;
181181 #define pps_intf_set() pps_intf = 1
182182 #define pps_is_intf_enable() (pps_intf != 0)
183183
184-/**** SPI2 *********************************************/
184+/**** DataOut SPI2 *********************************************/
185185 #define SPI2CSpin (PORTCbits.RC8)
186+
186187 // SPI2 未送信データバイト数
187188 static int dataout_cnt;
188189 #define dataout_cnt_set(i) dataout_cnt = (i)
189190 #define dataout_cnt_get() dataout_cnt
190191 #define dataout_cnt_minus() (dataout_cnt--)
192+
193+// 送信位置ポインタ
194+static char *dout_ptr;
195+
196+
191197 /**** DRDY OUT ****************************************/
192198 #define DRDY_OUT PORTCbits.RC9
199+
193200 /**** TEST *******************************************/
194201 /*
195202 * SPI FLAG test
@@ -580,10 +587,6 @@ void __attribute__((interrupt, auto_psv)) _SPI1Interrupt(void)
580587 spi1_intf_clear();
581588 c = spi1_getc();
582589 spi1_rx_overrun_clear();
583-//spi1_int_disable();
584-//ad_cs_dis();
585-//return;
586-//c=1;
587590 switch(adint_sts) {
588591 case ADSTS_H:
589592 in[2] = c;
@@ -611,7 +614,7 @@ void __attribute__((interrupt, auto_psv)) _SPI1Interrupt(void)
611614 adint_cnt++;
612615 if (adint_cnt >= AD_SAMPLE) {
613616 // 1secぶんのデータgetした
614- // DRDY->H
617+ // DRDY->H DRDY=Lの時でもDRDYのエッジを作るため
615618 DRDY_OUT = 1;
616619 // 1sec平均する
617620 char ch;
@@ -624,6 +627,7 @@ void __attribute__((interrupt, auto_psv)) _SPI1Interrupt(void)
624627 ring_write_plus();
625628 adint_cnt = 0;
626629 // DRDY->L
630+// TODO: waitカウンタで制限
627631 DRDY_OUT = 0;
628632 }
629633 spi1_int_disable(); // SPI割り込みOFF
@@ -649,26 +653,17 @@ void __attribute__((interrupt, auto_psv)) _SPI1Interrupt(void)
649653 * DataOut SPI2 Interrupt Handler
650654 * TX FIFOに1byteの空きが出来ると発生
651655 */
652-static unsigned char spi2c;
656+//static unsigned char spi2c;
653657 void __attribute__((interrupt, no_auto_psv)) _SPI2Interrupt(void)
654658 {
655659 unsigned char rx;
656- static unsigned int txlen = 512;
657660
658661 spi2_intf_clear();
659-#if 0
660-// static unsigned char c=0;
661- while(!spi2_tx_fifo_is_full())
662- spi2_putc(spi2c++);
663- while(!spi2_rx_fifo_is_empty()) {
664- rx = spi2_getc();
665-// if (rx == '$') c = 0;
666- }
667-#endif
668662 // 送信
669663 while(SPI2_TBF == 0) {
670664 if (dataout_cnt_get() <= 0) break;
671- spi2_putc(spi2c++);
665+// spi2_putc(spi2c++);
666+ spi2_putc(*dout_ptr++);
672667 dataout_cnt_minus();
673668 }
674669 // 受信
@@ -676,32 +671,10 @@ void __attribute__((interrupt, no_auto_psv)) _SPI2Interrupt(void)
676671 rx = spi2_getc();
677672 }
678673
679-#if 0
680- //spi2c = 123;
681-// RX FIFOから読み出し
682-// while(!spi2_rx_fifo_is_empty() || (!spi2_tx_fifo_is_full() && txlen > 0)) {
683- while(!spi2_rx_fifo_is_empty()) {
684- if (!spi2_rx_fifo_is_empty()) {
685- rx = spi2_getc();
686- if (rx == '$') {
687- spi2c = 0;
688- txlen = 3;
689- }
690- }
691- // TX FIFOに書き込み
692- if (!spi2_tx_fifo_is_full()) {
693- if (txlen > 0) {
694- spi2_putc(spi2c++);
695- txlen--;
696- }
697- }
698- }
699-#endif
700674 // オーバーランエラーならばクリアする
701675 // spi2_rx_is_overrun()
702676 if (SPI2STATbits.SPIROV == 1) SPI2STATbits.SPIROV = 0;
703677
704- // TODO:Interrupt Flag@IEC Clear
705678 }
706679 /*
707680 * Overo SPI2 CS Input Change Notification
@@ -724,24 +697,28 @@ void __attribute__((interrupt, no_auto_psv)) _CNInterrupt(void)
724697 // $->TX FIFO
725698 spi2_putc('$');
726699 // リングバッファ読み込み位置+1
727-
700+ ring_read1_plus();
728701 } else {
729702 // CS=L
730- // リングバッファ読み込み位置get?
731-
732- // SPI送信の一番最初なので
733- spi2c = 0;
703+ // リングバッファ読み込み位置get
704+ dout_ptr = (char*)adbuf_get(ring_read1_get());
705+ // SPI送信の一番最初
706+// spi2c = 0;
734707 dataout_cnt_set(ADBUF_LEN);
735708 // SPI2 TX FIFOに送信データ書き込み
736709 while(SPI2_TBF == 0) {
737710 if (dataout_cnt_get() <= 0) break;
738- spi2_putc(spi2c++);
711+// spi2_putc(spi2c++);
712+ spi2_putc(*dout_ptr++);
739713 dataout_cnt_minus();
740714 }
741715 // SPI2割り込みON
742716 spi2_int_enable();
717+ // DRDY=H
718+ DRDY_OUT = 1;
743719 }
744720 }
721+#if 0
745722 /*
746723 * CS0〜15順番にenable
747724 */
@@ -811,6 +788,7 @@ void test_spi2()
811788 // delay();
812789 }
813790 }
791+#endif
814792 /*
815793 void test_ad1()
816794 {
Show on old repository browser