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.

[参考译文] MSP430G2553:MSP430G2553 timer0_A0和 timer0_A1同时触发

Guru**** 2546020 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/567623/msp430g2553-msp430g2553-timer0_a0-and-timer0_a1-triggerering-at-the-same-time

器件型号:MSP430G2553
#include 
#include 
#include "math.h"

#define TXLED BIT0
#define RXLED BIT6
#define TXD BIT2
#define RXD BIT1

int tester1=0;
int tester2=0;
int tester3=0;
int tester4=0;
int tester5=0;
int testerper6=0;
int testerper7=0;
int tester8=0;
int tester9=0;


int TX_DATA[10];

volatile int ten=1;

int iData = 0;//数据计数器
int sayi = 1;//计数
器 volatile int i=0;
volatile int j=0;
int digit=0;
int temp=0;

void 初始化 eGPIO (void)
{
//
P1OUT &= 0x00; //关闭所有内容
P1DIR &= 0x00;
P1DIR |= BIT7;
P1OUT |= BIT7; // P1.7 bizim outputumuz
P1REN |= BIT3; //启用内部上拉/下拉电阻器
P1OUT |= BIT3;
P1IE |= BIT3; // P1.3中断被启用
P1IES |= BIT3; // P1.3高/低边沿
P1IFG &=~BIT3; // P1.3 IFG 已清除


}

void 初始化时钟(void)
{
//
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
DCOCTL = 0;//选择最低 DCOx 和 MODx 设置
BCSCTL1 = CALBC1_1MHz;//设置 DCO
DCOCTL = CALDCO_1MHz;
UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 = 0x08;// 1MHz 115200
UCA0BR1 = 0x00;// 1MHz 115200
}

void 初始化 TimerA (void)
{
//
TA0CTL = 0;
TA0CTL |= TACLR;//reset leyelim
TA0R = 0;// Emin olmak için TAR0'ı daresetleyelim gerçi TACLR bu işi yapıyor
TA0CTL |= tassel_2;// SMCLK CLK 时钟源 olarak secildi
TA0CTL |= tassel_2;// SMCLK CLK 时钟源 olarak secildi
TA0CTL |= ID_0;// aynen bölmeden 1MHz devam
TA0CTL |= MC_1;//向上计数模式 da çalışsın



TA0CCR0 = 417;// 2400Hz için bir periyot bu kadar sayım
TA0CCR1 = 13;//比较 reg1 13 Yani 38.4kHz periodun yarısı
//TA0CCTL0 = 0;

TA0CCTL0 &=~CCIFG;//标记 varsa temizleyelim gerçi başta 0A eşitledik komple registeri ama
TA0CCTL0 |= CCIE;//捕获比较中断使能
TA0CCTL1 &=~CCIFG;//标记 varsa temizleyelim gerçi başta 0A eşitledik komple registeri ama
TA0CCTL1 |= CCIE;//捕捉比较中断使能
TA0CTL |= TAIE;// interrtlar açıldı
//TA0CCTL0 |= CM_0;//bu zaten 00*/|
}

int int_TO_int (unsigned k){
如果(k = 0)返回0;
如果(k = 1)返回1; /*可选*/
返回(k%2)+ 10 * int_TO_int (k / 2);
}

void 初始化数据(int k)
{
//
temp = int_TO_int (k);
数字= log10 (temp)+ 1;
对于(I = 0;I < 10;I++)
{
//
if (i=0)
{
//
TX_DATA[I]=1;
}
其他
{
//
if (i<1+数字&& 1+digit < 9)
{
//
if (i=1)
{
//
TX_DATA[I]=温度% 10;
}
其他
{
//
10 = 1;
对于(j=0;j 

我想通过 IR 感应实现 UART 协议。  一个停止位、8位数据和1位停止位类似如下:

数据速率将为2400、因此我将时钟设置为1MHz 并将其除以417、这是一个位传输的持续时间。 但是、计时器 A 的行为有点奇怪。

您可以在上面的代码中检查、我将 CCR0设置为417、并在 timer0_A0中切换数据。

此外、当数据为零时、我会使 CCR1递增13、这是38KHz 的半周期、并在 timer0_A1中的每个比较中断中切换输出引脚 p1.7

但最重要的是、似乎对于 CCR1的每个比较中断、都会触发 timer0_A0和 timer0_A1中断、并且即使我尝试将 TA0CCR1除以13到417、它也会在最大39处停止。 自上周以来,我一直不知道这一点。 可以帮助我评估此问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可以看到您正在启用 TAIE、但您从未对 TIMER0_A1_Vector 中的 TAIFG 做出反应。 这也意味着 TAIFG 永远不会被复位、所以一旦被置位、ISR 应该继续运行、只会被优先级更高的 TIMER0_A0_VECTOR 中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果不完全了解它的工作原理、
    > IF (TA0IV && TA0IV_TACCR1)
    这是一个飞跃的页面--它几乎肯定不做你想要的,因为(在背景下)它总是真实的。 尝试:
    > IF (TA0IV =TA0IV_TACCR1)
    这不是我编写它的方式、但它应该足够了。

    更普遍的做法是:在1MHz 时、A1 ISR 只有13个时钟需要完成、否则您将看到中断超限和输出抖动。 此 ISR 肯定不会在13个时钟内完成、实际上、您可能无法编写在13个时钟内完成的 ISR。 选项:
    1)找出一种使用计时器比较/PWM 生成38kHz 时钟的方法(您可能需要使用不同的引脚--我前面没有引脚)。 您可以使用 PxDIR 每417个周期打开/关闭此时钟。
    2) 2)将 CPU 时钟(CALDCO 和 Friends)调至例如8MHz、并将 TIMER0时钟除以8 (因此您可以使用相同的常量)。 那么您的 ISR 可能能够运行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您是否能够使用提供的信息解决此问题?

    此致、
    Caleb Overbay