This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS:Piccolo F2.8027万,换档计数过大

Guru**** 2585275 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/601923/ccs-piccolo-f28027-shift-count-too-large

主题中讨论的其他部件:TMS320F2.8027万

工具/软件:Code Composer Studio

您好,

我正在一个项目中工作,该项目使用一个8x8x8立方体,带74hc138和74hc574以控制LED的点火。

主要问题是管理74hc138输入的中断中的代码段工作不正常。

以下代码负责此零件:

int i;

对于(i=0;i<8;i++)

   GpioDataRegs.GPADAT.all=cube[current_layer][i];

   GpioDataRegs.GPADAT.ALL=(GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(I+1))<16);

}

编译代码时,会出现一则警告:

#64-D班次计数过大

该代码段的目标是管理74hc138输入(A1,A2,A3)的所有组合,如我之前所说。 这些输入位于GPIO16,17和18。

当我调试代码时,只有在这个针脚上,我可以看到所有针脚都有低信号。

PS:很抱歉使用的格式,我正在使用智能手机发布。

提前感谢

此致,

米格尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Miguel Valera 说:
       GpioDataRegs.GPADAT.ALL=(GpioDataRegs.GPADAT.ALL & 0x0.0011万)|(0x07 &(I+1))<16);

    在C2800设备上,int的大小为16位。 子表达式 ((0x07 &(I+1))<<16)的类型为int,因此编译器正确警告应用于int的左移计数16太大,并将导致子表达式值为零。

    您需要转换子表达式才能生成32位结果。 例如,将代码更改为:

    int i;
    
    对于(i=0;i<8;i++)
    {
    GpioDataRegs.GPADAT.all=cube[current_layer][i];
    GpioDataRegs.GPADAT.ALL=(GpioDataRegs.GPADAT.ALL & 0x0.0011万)|(0x07 &(((UINT32) I+1))<<16);
    } 

    我选择了类型为 UINT32的类型类型转换,因为这是 GpioDataRegs.GPADAT.ALL的类型

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Chester,

    感谢您的快速回答。 这对我来说非常有用。

    我还有另一个问题,也许您知道答案。

    调试代码时,无法在输出引脚中获得稳定的高输出。

    负责的代码段是以前的样本:

    GpioDataRegs.GPADAT.all=0x0万FF;

    但如果我在观察表达式窗口中看到GPIO, 则只有GPIO 1和4在高输出中总是存在,其余的GPIO也会变化,当我通过示波器看到引脚时也会发生这种情况。

    提前感谢!

    此致,

    米格尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    但是如果我在监视表达式窗口中看到GPIO, 则只有GPIO 1和4在高输出中总是存在,其余的GPIO也会变化,当我通过示波器看到引脚时,也会发生同样的情况。[/QUOT]我怀疑是硬件问题, 例如,尝试提供比TMS320F2.8027万 GPIO引脚能够提供的更高的电流。

    您能否显示硬件的示意图?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然!

    最初的项目使用Arduino,但我正在尝试适应Piccolo F2.8027万。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    第0层之间的电阻值是多少。 第7层GPIO和2N2222晶体管的基座?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它们都是100欧姆电阻器
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [quote user="Miguel Valera">所有这些都是100欧姆电阻器第1层的每个GPIO。 第8层信号与两个并联2N2222晶体管基座的100欧姆电阻器相连。  

    如果2N2222 基本发射极饱和电压为0.6 (数据表中指定的最小值),则GPIO高将尝试并输出(3.3 - 0.6)/(100 / 2)= 54 mA。

    如果2N2222 基本发射极饱和电压为2.6 (数据表中指定的最小值),则GPIO将尝试高电压并输出(3.3 - 2.6)/(100 / 2)= 14 mA。

    TMS320F2.8027万数据表显示了GPIO高电流可获得的最大电流为4 mA或8 mA,具体取决于引脚:

    试图从GPIO提供超出器件支持范围的电流将导致输出电压不确定,并可能损坏TMS320F2.8027万。

    建议 您添加一个中间器件,该器件可以提供所需的电流来驱动2N2222晶体管的基座,而不是试图让TMS320F2.8027万 GPIO直接驱动2N2222晶体管的基座。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您提供的信息。

    但我的主要问题不是管理层的GPIO,而是直接进入74hc574的数据引脚(D0-D7)。

    这可能是您之前提到的问题影响了这些输出吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    但我的主要问题不是管理层的GPIO,而是直接进入74hc574的数据引脚(D0-D7)。[/QUOT]好的, 多维数据集数组的内容是什么?

    多维数据集数组是否应包含数据引脚D0-D7和层信号layer0.. layer7的值?

    原始帖子的代码如下:

    int i;
    
    用于(i=0;i<8;i++)
    {
    GpioDataRegs.GPADAT.all=cube[current_layer][i];
    GpioDataRegs.GPADAT.all=(GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(I+1))<<16);
    } 

     第一个分配给GpioDataRegs.GPADAT.ALL可能是设置D0的值。 D7和layer0.. layer7信号,但由于掩码 (GpioDataRegs.GPADAT.ALL和0x0.0011万),第二个分配给GpioDataRegs.GPADAT.All将仅保留数据位D1和D4的值。 当代码运行时,可能导致D0,D2-D3,D5-D7和 layer0 ... layer7信号波动,并且在调试器中停止时信号可能为零(取决于停止的位置)。

    此外,由于74HC138地址解码器的输出用于为74HC574器件计时,因此程序需要控制GPIO输出的更改顺序,以确保74HC574时钟输入不会出现不必要的故障,从而导致LED行的更新不正确。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    多维数据集数组的内容是Z和Y坐标(多维数据集[Z][Y]),这些坐标是图层和行,以及信息内容(例如,如果指定了0xFF),则表示所有行都必须处于活动状态(X轴)。

    根据您的解释,我认为掩码是错误的,因为它不保留D0-D7信息,所以它将是0xFF。

    '此外,由于74HC138地址解码器的输出用于为74HC574器件计时,因此程序需要控制GPIO输出的更改顺序,以确保74HC574时钟输入不会出现不必要的故障,从而导致LED行的更新不正确。'

    关于这一点,控制哪个时钟处于活动状态的顺序,我使用以下行:

    GpioDataRegs.GPADAT.ALL=(GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(I+1))<16); 

    为了在74hc574的每一个CLK中激发上升的边缘,您认为这是错误的吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请注意,控制哪个时钟处于活动状态的顺序,我使用以下行:

    GpioDataRegs.GPADAT.ALL=(GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(I+1))<16); 

    为了在74hc574的每一个CLK中激发上升边缘。您认为这是错误的吗? GPIO位18..16映射到74HC138上的地址位A2..A0,其中更改地址位A2..A0将导致74HC574行驱动器锁的时钟脉冲。

    For循环中有两条语句,它们写入地址位A2..A0。 第一个语句将A2..A0设置为所有零,第二个语句将围绕不同的A2..A0组合循环:

    对于(i=0;i<8;i++)
    {
    GpioDataRegs.GPADAT.all=cube[current_layer][i];
    GpioDataRegs.GPADAT.ALL=(GpioDataRegs.GPADAT.ALL & 0x0.0011万)|(0x07 &(((UINT32) I+1))<<16);
    } 

    即以下顺序:

    写入GpioDataRegs.GPDAT.ALL A2..A0 更改为74HC574时钟
    0
    多维数据集[current_layer][i] 
    0 第0行为低
    0
    (GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(((UINT32) I+1))<16) 
    1.

    第0行变为高位
    第1行变低

    1.
    多维数据集[current_layer][i] 
    0 行0变为低
    第1行变高
    1.
    (GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(((UINT32) I+1))<16) 
    第0行变为高位
    第2排变低
    多维数据集[current_layer][i] 
    0 行0变为低
    第2排变高
    (GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(((UINT32) I+1))<16) 
    3. 第0行变为高位
    第3排变低
    3.
    多维数据集[current_layer][i] 
    0 行0变为低
    第3排变高
    3.
    (GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(((UINT32) I+1))<16) 
    4. 第0行变为高位
    第4排变低
    4.
    多维数据集[current_layer][i] 
    0 行0变为低
    第4排变高
    4.
    (GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(((UINT32) I+1))<16) 
    5.

    第0行变为高位
    第5排变低

    5.
    多维数据集[current_layer][i] 
    0 行0变为低
    第5排变高
    5.
    (GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(((UINT32) I+1))<16) 
    6. 第0行变为高位
    第6排变低
    6.
    多维数据集[current_layer][i] 
    0 行0变为低
    第6排变高
    6.
    (GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(((UINT32) I+1))<16) 
    7. 第0行变为高位
    第7排变低
    7.
    多维数据集[current_layer][i] 
    0 行0变为低
    第7排变高
    7.
    (GpioDataRegs.GPADAT.ALL & 0x0.0011万)|((0x07 &(((UINT32) I+1))<16) 
    0 不变
    0
    多维数据集[current_layer][i] 
    0 不变

    上述问题包括:

    A) 74HC574行0时钟上有多个上升时钟边缘,这意味着对行0 LED进行不必要的更改。

    b)数据位D7..d0输入至74HC574的数据位与驱动74HC574时钟的A2.-A0位一起变化,这可能意味着74HC574设置/保持时间被超出,导致行LED输出不确定。

    C)对A2.A0地址位的更改顺序意味着一次更改多个位,如果故障的速度足以在74HC574上生成时钟边缘,则可能导致74HC138出现故障,导致不必要的行LED变化。 为避免这种情况,建议将A2.A0地址位更改为 灰色代码 ,以便一次只更改一个位。

    我可以生成一个计时图,说明代码如何更改LED多维数据集的所有输出,以检查顺序是否正确,包括层驱动程序。 我假设刷新周期需要轮流在每一层。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢切斯特,你的帮助对 我非常有用。

    我更改了掩码,因为它是错误的,它正在执行D0-D7数据位,并通过A2-A0编码进行了更改。

    现在看来工作正常了。

    关于灰色代码的编纂,我不知道怎么做。

    很抱歉耽误我的回答。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    关于灰码编码,我不知道如何进行。[/QUOT]对于灰码修改,我的意思是,不要按0,1,2,3,4的顺序循环浏览A2-A0地址位, 5,6,7改为使用0,1,3,2,6, 7,5,4。

    以灰色代码顺序更改A2-A0地址位的意义在于,一次只更改一个位,以消除在多个地址位同时更改时74HC138地址解码器出现故障的可能性。 当74HC138出现故障时,可能会导致为74HC574错误的行计时。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢切斯特,你的所有信息对我非常有用!