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:将温度从20度降低至14度

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/987488/msp430g2553-a-decrease-in-temperature-from-20-degrees-to-14-degrees

器件型号:MSP430G2553

大家好、我已经对 mp430g2553微控制器进行了编程、并制作了一个显示时间和温度的电路。我使用了内部温度传感器。但温度有时显示12度、有时显示20度、有时显示18度。考虑到这是由噪声引起的、我连接了一个与输入电压并联的电容器。

如果我使用 Slau144j-page551-page22-15中的电容值、这个问题是否会得到解决? 由于我没有这些值的电容器、我尝试了2.2uF、100uF 的值、但它没有提供任何解决方案。

如果我使用目录中的电容器值、问题是否会得到解决、或者问题是否有其他原因?

这是视频

e2e.ti.com/.../msp430g2553_5F00_hata.mp4 

我在回答部分添加了代码。( 我认为论坛存在问题。 工具菜单已消失、代码插入工具未出现。)

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

    #include <msp430.h>
    /*Author:Özgür TERZİ */
    /* Değişkenlerin Tanımlanması */
    const int dizi[ ] = {0x7E, 0xC, 0xB6, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE,0xC6,0x72};
    long  sicaklik; 		//ADCMEM değerini tutan değişken
    long  derece;			//Sıcaklık Değeri
    int gosterge_onlar;		//Sıcaklık göstergenin onlar basamağı
    int gosterge_birler;	//Sıcaklık göstergenin birler basamağı
    int u=0;				//termometre gösterim dongü sayısı değişkeni
    int v=0;				//termometre gösterim dongü sayısı değişkeni
    unsigned int i=0;		//saniye birler basamağı
    unsigned int k=0;		//saniye onlar  basamağı
    unsigned int l=0;		//dakika birler basamağı
    unsigned int m=0;		//dakika birler basamağı
    unsigned int n=0;		//saat   birler basamağı
    unsigned int p=0;		//saat   onlar  basamağı
    unsigned int z=0;		//butona basılma sayısı
    unsigned int c=0;
    
    	/***** Termometre Göster Fonksiyonu *****/
    	
    	void termometre (void)
    		{
    			for(  u=0;u<1000;u++)
    			{
    			P2OUT |=(BIT2+BIT1+BIT0);
    			P1OUT=0x72;
    			P2OUT&=~BIT3;
    			__delay_cycles(600);
    
    			P2OUT |=(BIT3+BIT1+BIT0);
    			P1OUT=0xC6;
    			P2OUT&=~BIT2;
    			__delay_cycles(600);
    
    			P2OUT |=(BIT2+BIT3+BIT0);
    			P1OUT=dizi[gosterge_birler];
    			P2OUT&=~BIT1;
    			__delay_cycles(600);
    
    			P2OUT |=(BIT2+BIT1+BIT3);
    			P1OUT=dizi[gosterge_onlar];
    			P2OUT&=~BIT0;
    			__delay_cycles(600);
    
    			}
    
    		}
    	/***** Saat Göster Fonksiyonu *****/
    		
    	void  saat_goster(void)
    		{
    			for(v=0;v<1000;v++)
    			{
    			P2OUT |=(BIT2+BIT1+BIT0);
    			P1OUT=dizi[l];
    			P2OUT &=~(BIT3);
    			__delay_cycles(650);  //4.basamak en sağ
    			P2OUT |=(BIT0+BIT1+BIT3);
    			P1OUT=dizi[m];
    			P2OUT &=~(BIT2);
    			__delay_cycles(650);
    			P2OUT |=(BIT0+BIT3+BIT2);
    			P1OUT=dizi[n];
    			P1OUT|=BIT0;
    			P2OUT &=~(BIT1);
    			__delay_cycles(650);
    			P2OUT |=(BIT1+BIT3+BIT2);
    			P1OUT=dizi[p];
    			P2OUT &=~(BIT0);
    			__delay_cycles(650);
    			}
    	
    		}
    	/***** Ana Program *****/	
    
    int main(void)
    {
    	/* Port Ayarlarının  Yapılması */
    	
    	WDTCTL = WDTPW | WDTHOLD;		// stop watchdog durdur. 
    	P2DIR |= BIT0+BIT1+BIT2+BIT3;		// P2 portunun 4 bitini çıkış yap	
    	P2OUT |=(BIT0+BIT1+BIT2+BIT3);	// hepsini söndür
    	P1DIR |= 0xFF;	// P1 portunun tüm bitlerini çıkış olarak ata.
    	P1OUT  =0x00;	// P1 portunun tüm bitlerinin çıkışı lojik 0.
    	P2IES &=~BIT4;	// P2 portunun Bit4 pinini yükselen kenarda tetikle.
    	P2IES &=~BIT5;	// P2 portunun Bit5 pinini yükselen kenarda tetikle.
    	P2IE  |=(BIT4);	// P2 ,Bit4 pininin kesmesini(interrapt) aç.
    	P2DIR &=~(BIT4+BIT5);	//P2 Bit4 ve Bit 5 pinini giriş yap.
    	P2REN |=(BIT4+BIT5);	//P2 Bit4 ve Bit 5 ,PullUp-Down direnci seç.
    	P2OUT |=(BIT4+BIT5);	//P2 Bit4 ve Bit 5 ,Pull-Up direnci aktif . 
    	P2IFG &= ~(BIT4 + BIT5); // P2 Bit4 ve Bit 5 kesme bayrağını temizle.
    
    	/* Timer Ayarlarının  Yapılması */
    	BCSCTL1 |= DIVA_0;            // Harici kristali kullan.ayar
    	BCSCTL3 |= XCAP_3 + LFXT1S_0;	// Harici kristali kullan.ayar
    	TA1CTL = MC_1 + TASSEL_1 + TAIE; // up mode,ACLK,kesme aktif
    	TA1CCR0 =32767;			// 1saniye
    	/****************************************/
    	TA0CTL = MC_1 +TASSEL_1+ID_3;//CCR0 kadar say-CLK/8,ACLK
    	TA0CCTL1|=OUTMOD_7; // Çıkışı tersle
    	TA0CCR1 =100;
    	TA0CCR0 =40959; //10 saniyede bir ölçüm al.
    
    
    	BCSCTL1 |= DIVA_0;              
    	BCSCTL3 |= XCAP_3 + LFXT1S_0;
    	TA1CTL = MC_1 + TASSEL_1 + TAIE;
    	TA1CCR0 =32767;
    
    
    /***** ADC Ayarlarının  Yapılması *****/
    
    	ADC10CTL0 |= ADC10ON +REFON+REF2_5V+SREF_1 + ADC10SHT_3  ;
    	/*ADC Aktif, Referans Gerilim 1,5V, 0-2.5arası, Örneği tutma zamanı 64 x ADC10CLKs,Interrupt Aktif*/
    	ADC10CTL0&=~ REF2_5V; //Ref 1,5V aktif.
    	ADC10CTL1 |= INCH_10 + ADC10SSEL_1 + CONSEQ_2 + SHS_1; 
    	/* Veriyi 10. kanaldan al.Kaynak ACLK,Tek kanal Tekrarlı Çeviri, ADC tetikleme Timer olarak secildi.*/
    	ADC10CTL0 |= ENC + ADC10SC; // Çeviriye izin ver -Çeviriye Başla.
    	__bis_SR_register( GIE);//genel kesmeler aktif
    
    	while(1)
    	{
    		saat_goster();
    		termometre();
    	}
    }
    
    
    
    	/****** ADC Kesmesinin Yazılması ******/
    	#pragma vector=ADC10_VECTOR
    	__interrupt void ADC10_ISR(void)
    	{
    
     		/*Sıcaklığın Hesaplanması*/
    		sicaklik =ADC10MEM;
    		derece = ((sicaklik - 672) * 473) / 1024;
    		gosterge_onlar=derece/10;
    		gosterge_birler=derece% 10;
    	}
    
    
    	/****** Timer Kesmesinin Yazılması ******/
    	#pragma vector=TIMER1_A1_VECTOR
    	__interrupt void TA1_kesme_func(void)
    	{
    		switch (TA1IV){
    		case  2://kullanıılmıyor
    		break;                        
    		case  4://kullanılmıyor
    		break;                        
    		case 10://taşma olduğunda
    			
    		i++;
    		if(i==10){
    		i=0;
    		k ++;
    		
    			if(k==6){
    			k=0;
    			l ++ ;
    			}
    		
    				if(l==10){
    				l=0;
    				m++;
    				}
    		
    					if(m==6){						
    						m=0;
    						if(p==0 | p==1){
    						n ++;
    						
    							if(n==10){
    							n=0;
    							p++;
    							}
    						}
    		
    						else if(p==2){
    						n++;
    							if(n==4){
    							p=0;
    							n=0;
    							}
    						}
    					}
    		}
    
    			break;
    			}
    	}
    	
    		#pragma vector=PORT2_VECTOR
    	__interrupt void Port_2(void)
    {
    		P2OUT |=(BIT0+BIT1+BIT2+BIT3);
    		__delay_cycles(32767);
    		z ++;
    		
    	/********************/
    	while(z==1){
    		__delay_cycles(5000);
    		P2OUT |=(BIT0+BIT1+BIT2);
    		P1OUT=dizi[l];
    		P2OUT &=~(BIT3);
    		
    	if(!(P2IN & BIT5)){
    		while(!(P2IN & BIT5));
    		__delay_cycles(5000);
    		l++;
    		if(l==10){
    		l=0;
    		}
    		P1OUT=dizi[l];
    	}
    	__delay_cycles(5000);
    		if(!(P2IN & BIT4))
    		{  while(!(P2IN & BIT4));
    		__delay_cycles(5000);
    		z++;
    		}
    	}
    	
    	/********************/
    		while(z==2){   
    		__delay_cycles(5000);
    		P2OUT |=(BIT0+BIT1+BIT3);
    		P1OUT=dizi[m];
    		P2OUT &=~(BIT2);
    		if(!(P2IN & BIT5)){
    		while(!(P2IN & BIT5));
    		__delay_cycles(5000);
    		m++;
    		if(m==6){
    		m=0;
    		}
    		P1OUT=dizi[m];
    		}
    		__delay_cycles(5000);
    		if(!(P2IN&BIT4)){  
    		while(!(P2IN & BIT4));
    		__delay_cycles(1000);
    		z++;
    		}
    		}
    	/********************/
    		while(z==3){
    		__delay_cycles(5000);
    		P2OUT |=(BIT0+BIT1+BIT2);
    		P1OUT=dizi[n];
    		P2OUT &=~(BIT1);
    		if(!(P2IN & BIT5)){  
    		while(!(P2IN & BIT5));
    		__delay_cycles(5000);
    		n++;
    		if(n==10){			
    		n=0;
    		}
    		P1OUT=dizi[n];
    		}
    		__delay_cycles(5000);
    		if(!(P2IN&BIT4)){  
    		while(!(P2IN & BIT4));
    		__delay_cycles(5000);
    		z++;
    		}
    		}
    		
    	/********************/
    		while(z==4){
    		__delay_cycles(5000);
    		P2OUT |=(BIT3+BIT1+BIT2);
    		P1OUT=dizi[p];
    		P2OUT &=~(BIT0);
    		if(!(P2IN & BIT5)){
    		  while(!(P2IN & BIT5));
    		__delay_cycles(5000);
    		p++;
    		if(p==3){			
    		p=0;
    		}
    		P1OUT=dizi[p];
    		}
    		__delay_cycles(5000);
    		if(!(P2IN&BIT4)){
    		while(!(P2IN & BIT4));
    		__delay_cycles(5000);
    		z++;
    		}
    		}
    
    		__delay_cycles(5000);
    		z=0;
    		P2IFG &= ~(BIT4 + BIT5);
    		i=0;
    		k=0;
    }
    
    
    
    

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

    为什么没有人回答

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

    您好、Ozgur、

    我在我的一侧测试温度示例代码、它们似乎都正常、您可以尝试以下示例代码:

    https://dev.ti.com/tirex/explore/node?node=AOmyNsG-8T1mD4LKMZKuZg__IOGqZri__LATEST

    此致

    Johnson

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

    约翰逊、您好。首先感谢您。 您是否尝试过我编写的代码? 电路工作不正常。 此问题是否由噪声引起? 如果我使用 MSP430用户手册中指定的电容值、问题是否会得到解决?

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

    您好、Ozgur、

    我认为问题应该由代码引起、您是否在我们的 lanuchpad 中测试了代码?

    如果代码可以在 lanuchpad 中正常运行、但在您的电路板中表现不佳、我们可以专注于噪声、但首先我们可以检查代码或在您的电路板中运行示例代码。

    谢谢!

    此致

    Johnson