0

これを更新 - math.h (MPIDE コンパイラを使用) の三角関数に問題があるようです - 独自の math.h を使用していたデバッガでこれを確認できなかったのも不思議ではありません。 (正しい解決策)。私はこれをマイクロチップボードで偶然発見し、代わりに「高速サイン/コサイン」アルゴリズムを実装しました (これについては devmaster dot com を参照してください)。ISR と ColourWheel 配列が完全に機能するようになりました。

C/C++ にかなり慣れていない私は、自分のコードのエラーを確認して再確認するのに何時間も費やしてきたと言わざるを得ません。私の頭の中で最後に考えられることは、何十年も前に書かれた疑いのない非常に基本的な関数がそのような問題を引き起こす可能性があるということでした.

実際の配列のスクリーン ダンプにアクセスできていれば、以前に問題に気付いていたと思いますが、チップが led キューブに接続されているため、チップ内のデータに直接アクセスする方法がありません。

ほらほら!! - 機会があれば、プログラムできるようになった波動関数を示す au チューブ ビデオへのリンクを投稿し、LED キューブでかなりよく見えるようにします。

ラッセル

ps ここであなたの助けを本当にありがとう - 追跡するためのいくつかの手段を私に与えることによって、私が完全にあきらめるのを止めました - 確かにこれまでエンディアンについてあまり知らなかったので、それについて学び、堅牢なデバッグを行うためのいくつかの体系的な方法を学びましたアプローチ。

割り込みルーチンで配列にアクセスしようとすると問題が発生します。

以下は、ISroutine 内のコード スニペットです。

if (CubeStatusArray[x][y][Layer]){
    for(int8_t bitpos=7; bitpos >= 0; bitpos--){
        if((ColourWheel[Colour]>>16)&(1<<bitpos)) { // This line seems to cause trouble
            setHigh(SINRED_PORT,SINRED_PIN);
        }
        else {
            setLow(SINRED_PORT,SINRED_PIN);
        }
    }
}
..........

ColourWheel[Colour] は、プログラムの開始時に次のように宣言されています (関数の外側)。

static volatile uint32_t ColourWheel[255]; //this is the array from which
                                           //the colours can be obtained -
                                           //all set as 3 eight bit numbers
                                           //using up 24 bits of a 32bit
                                           //unsigned int.

このコード スニペットが行っているのは、コードの 8 ビット セグメントの各ビットを取得し、それに応じてポート/ピンを MSB ファーストでハイまたはローに設定することです (次に、ハイごとに TLC5940 IC LED ドライバー チップを更新する他のコードがあります)。ピンに /low を入力すると、コードは同様の方法で緑と青の 8 ビットを取得します)。

これは機能せず、LED へのカラー出力が正しく動作しません。

ただし、次のようにコードを変更すると、ルーチンは機能します

if (CubeStatusArray[x][y][Layer]){
    for(int8_t bitpos=7; bitpos >= 0; bitpos--){
        if(0b00000000111111111110101010111110>>16)&(1<<bitpos)) { // This line seems to cause trouble
            setHigh(SINRED_PORT,SINRED_PIN);}
        else {
            setLow(SINRED_PORT,SINRED_PIN);
        }
    }
}
..........

(行の実際の 2 進数は関係ありません (最初の 8 ビットは常にゼロで、次の 8 ビットは赤色を表し、次は青色を表します)

では、配列に保持されている数値を使用しようとすると、なぜ ISR は固定数値で機能するのですか??

以下は、完全な RGB 更新を示す実際のコードです。

                if (CubeStatusArray[x][y][Layer]){
                      for(int8_t bitpos=7; bitpos >= 0; bitpos--){
                        {if((ColourWheel[Colour]>>16)&(1<<bitpos))
                        {setHigh(SINRED_PORT,SINRED_PIN);}
                        else
                        {setLow(SINRED_PORT,SINRED_PIN);}}
                        {if((ColourWheel[Colour]>>8)&(1<<bitpos))
                        {setHigh(SINGREEN_PORT,SINGREEN_PIN);}
                        else
                        {setLow(SINGREEN_PORT,SINGREEN_PIN);}}
                        {if((ColourWheel[Colour])&(1<<bitpos))
                        {setHigh(SINBLUE_PORT,SINBLUE_PIN);}
                        else
                        {setLow(SINBLUE_PORT,SINBLUE_PIN);}}
                        pulse(SCLK_PORT, SCLK_PIN);
                        pulse(GSCLK_PORT, GSCLK_PIN);
                        Data_Counter++;
                        GSCLK_Counter++;                          } 
4

2 に答える 2