|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
grizm Član
Pridružen-a: Pon 09 Nov 2009 20:52 Prispevkov: 12 Aktiv.: 0.07 Kraj: MS
|
Objavljeno: Sob Jun 09, 2012 11:40 pm Naslov sporočila: |
|
|
pozdrav... imam sledeč problem.... seveda z msp430...kako lahko preverim ali timerji delujejo, očitno nekje pride to errora...vendar newem kje.. če mi zna kdo pomagat.
lp, hvala
#include "msp430G2452.h"
#include "LCD_MSP430.h"
#include "toa.h"
#define LED_1 0x01
#define LED_2 0x08
#define LED_2 0x08
/* ************************************************************************** */
/* DEKLARACIJE FUNKCIJ ZA PLK TIMER */
/* ************************************************************************** */
int START_TIMER(int timerNo);
int STOP_TIMER(int timerNo);
int SET_TIMER_INT(int timerNo, int interval);
int TEST_TIMER(int timerNo);
int GET_TIMER(int timerNo);
int main(void){
int i=0, a=0, b=0;
unsigned char str1[]="No. products:";
unsigned char str2[16]="";
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 = CALBC1_1MHZ; // Set DCO 1MHz
DCOCTL = CALDCO_1MHZ;
P1DIR = 0xff;
P2SEL = 0x00;
P2DIR &= ~ 0x01;
P2DIR |= 0x08;
P2DIR |= 0x04;
P2OUT &= ~ 0x01;
P2REN = 0x00;
P2IE |=0x01; // Na pin 2.0 omogočimo prekinitve
P2IES|=0x01; // Na pinu 2.0.7 se proži prekinitev pri prehodu iz 1 v 0
P2IFG=0x00;
/* nastavitev WD casovnika, ura je SMCLK */
WDTCTL = (WDTPW+WDTTMSEL+WDTCNTCL);//WD interval = 32.768ms, zbrisemo WD stevec
IE1 |= WDTIE; // omogocitev WDT prekinitve
SET_TIMER_INT(0, 20);
SET_TIMER_INT(1, 30);
SET_TIMER_INT(2, 30);
SET_TIMER_INT(3, 10);
/* inicializacija LCD */
LcdInit4(2);
/* napisi 1. vrstico */
LcdLine1x(0);
LcdWriteString(str1);
while(1){
/* ustavimo CPU (LPM0) in omogocimo prekinitve */
__bis_SR_register(CPUOFF + GIE ); // preklop v LPM0 + GIE
STOP_TIMER(0);
STOP_TIMER(1);
STOP_TIMER(2);
STOP_TIMER(3);
P1DIR |= LED_1; // Set to output direction
P1OUT &= ~LED_1; // Set the LED of
P2DIR |= LED_2; // Set to output direction
P2OUT &= ~LED_2; // Set the LED of
//////senzor, ko prekine se poveča za 1////////////////////////////////////////
START_TIMER(0);
START_TIMER(1);
switch(a){
case 0:
if (~P2IN&0x01) b = 1;
else b =0;
STOP_TIMER(0);
STOP_TIMER(1);
break;
case 1:
if (~P2IN&0x01) b=1;
else b=0;
STOP_TIMER(0);
STOP_TIMER(1);
break;
}
if ((!a)&(b)){
i=i+1;
}
a=b;
if(TEST_TIMER(0)){
P2OUT |= LED_2;
}
else (STOP_TIMER(0));
/* napisi 2. vrstico */
LcdLine2x(0);
itoa(i,str2);
LcdWriteString(str2);
//LcdShiftDisplayRight();
}
return(0);
}
// Watchdog Timer interrupt service routine
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR(void){
P2IFG&=~0x01;
P1OUT ^= LED_1;
P2OUT ^= 0x04;
__delay_cycles(50000);
//stevec_pulzov++;
__bic_SR_register_on_exit(CPUOFF); // zbudimo procesor
}
/* ************************************************************************** */
/* ************************************************************************** */
/* FUNKCIJE TIMER (PLK casovnik, takt 100ms) */
/* ************************************************************************** */
/* ************************************************************************** */
/* status biti registra casovnika */
#define STOP 0x00 // stop stanje
#define RUN 0x01 // run stanje
#define EOI 0x02 // stanje konec intervala
/* kontrolni biti registra casovnika */
#define RST 0x10 // ukaz reset
#define SET 0x20 // ukaz set
// vrednost casovnika
static unsigned int TIMER[4]={0,0,0,0};
// register casovnika
volatile static unsigned char TIMER_REG[4]={RST+STOP,RST+STOP,RST+STOP,RST+STOP};
// interval casovnika
volatile static unsigned int TIMER_INTERVAL[4]={0,0,0,0};
//******************************************************************************
// Casovnik (TIMER) je izveden v WD prekinitvenem programu:
// v vsakem zagonu prekinitvenega programa se dekrementira za 1, dokler ne
// doseze vrednosti 0.
//
// Podrobnejsi opis
// Casovnik deluje v naslednjih stanjih:
// STOP: osvezi se vrednost casovnika z nastavljenim intervalom;
// prehodni pogoji v stanje RUN: SET & !RST;
// RUN: vrednost casovnika dekrementira, dokler je > 0;
// prehodni pogoji v stanje EOI: vrednost casovnika = 0;
// prehodni pogoji v stanje STOP: RST;
// EOI: ni aktivnosti;
// prehodni pogoji v stanje STOP: RST;
//******************************************************************************
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void){
static char x, j=0;
for(x=0;x<4;x++){
switch(TIMER_REG[x]&0x0F){
case STOP:
TIMER[x]=TIMER_INTERVAL[x];
if(TIMER_REG[x]&SET && ~TIMER_REG[x]&RST)
TIMER_REG[x]|=RUN;
break;
case RUN:
if(TIMER[x] > 0){
TIMER[x]--;
}
else {
TIMER_REG[x]|= EOI;
TIMER_REG[x]&=~RUN;
break;
}
if(TIMER_REG[x]&RST)
TIMER_REG[x]&=~RUN;
break;
case EOI:
if(TIMER_REG[x]&RST){
TIMER_REG[x]&=~ EOI;
}
break;
}
}
//IFG1&=~WDTIFG; // brisi IRQ flag (se brise samodejno!)
if (++j > 30){
P1OUT ^= LED_2;
j=0;
}
// enable main program running
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF from 0(SR)
}
//******************************************************************************
// int START_TIMER()
// Opis: omogoci ponovni zagon casovnika
// Funkcije vrne 1.
//******************************************************************************
int START_TIMER(int timerNo){
TIMER_REG[timerNo]|=SET;
TIMER_REG[timerNo]&=~RST;
return (1);
}
//******************************************************************************
// konec int START_TIMER()
//******************************************************************************
//******************************************************************************
// int STOP_TIMER()
// Opis: omogoci ponastavitev casovnika
// Funkcije vrne 1.
//******************************************************************************
int STOP_TIMER(int timerNo){
TIMER_REG[timerNo]|=RST;
TIMER_REG[timerNo]&=~SET;
return (1);
}
//******************************************************************************
// konec int STOP_TIMER()
//******************************************************************************
//******************************************************************************
// int SET_TIMER_INT(int interval)
// Opis: nastavi casovni interval casovnika
// Funkcije vrne 1.
//******************************************************************************
int SET_TIMER_INT(int timerNo, int interval){
TIMER_INTERVAL[timerNo]=3*interval; // nastavitev zacetne vrednosti TIMERja
return (1);
}
//******************************************************************************
// konec int SET_TIMER_INT(int interval)
//******************************************************************************
//******************************************************************************
// int TEST_TIMER()
//******************************************************************************
int TEST_TIMER(int timerNo){
return(TIMER_REG[timerNo]&EOI);
}
//******************************************************************************
// konec TEST_TIMER()
//******************************************************************************
//******************************************************************************
// int GET_TIMER()
//******************************************************************************
int GET_TIMER(int timerNo){
return(TIMER[timerNo]);
}
//******************************************************************************
// konec GET_TIMER()
//****************************************************************************** |
|
Nazaj na vrh |
|
|
Dorijan Član
Pridružen-a: Ned 22 Jun 2008 10:48 Prispevkov: 2481 Aktiv.: 12.86 Kraj: južnoprimorska
|
Objavljeno: Ned Jun 10, 2012 12:05 am Naslov sporočila: |
|
|
Ko sem tako na hitro preletel me to malo muči
Koda: |
__bis_SR_register(CPUOFF + GIE ); // preklop v LPM0 + GIE |
Če prav vem se to ne uporablja na začetku zanke, predvsem pa ne infinite loop zanke.
Preveri kaj od periferije in interruptov sploh dela v CPUOFF načinu, za testiranje ti priporočam raje kak LPM3
Preveri te stvari, če pa ne bo delalo pa sporoči in se bom malo bolj poglobil.
ali uporabljaš Code Composer Studio, če da imaš tudi http://www.ti.com/tool/msp430ware, to je zbirka primer kode ipd za celotno msp430 družino, da ni potrebno prenašat examplov za vsak čip posebej. _________________ Če nekaj deluje, razstavi in ugotovi zakaj. |
|
Nazaj na vrh |
|
|
grizm Član
Pridružen-a: Pon 09 Nov 2009 20:52 Prispevkov: 12 Aktiv.: 0.07 Kraj: MS
|
Objavljeno: Ned Jun 10, 2012 12:37 am Naslov sporočila: |
|
|
aham, hvala....
... glede programa dela vse razen timerja mi ne zažene očitno.. pa newem zakaj... |
|
Nazaj na vrh |
|
|
Dorijan Član
Pridružen-a: Ned 22 Jun 2008 10:48 Prispevkov: 2481 Aktiv.: 12.86 Kraj: južnoprimorska
|
Objavljeno: Ned Jun 10, 2012 9:32 am Naslov sporočila: |
|
|
datasheet za družinohttp://www.ti.com/lit/ug/slau144i/slau144i.pdf stran 42, ti poveda da v LPM4 ne dela noben clock niti zunanji uporabi raje to:
Koda: |
_BIS_SR(LPM3_bits + GIE); |
ti SET_TIMER_INT(0, 20);, STOP_TIMER, itd. to niso od msp430 ukazi razen, če so v tvojih podknjižnicah(ki jih nimam)
Če pogledaš osnovni datasheet http://www.ti.com/lit/ds/symlink/msp430g2452.pdf piše "One 16-Bit Timer_A With Three capture/Compare Registers" + WDT, ki se ga tudi ne vklaplja dokler ti ostala koda ne dela.
Tukaj imaš primere kode za ta čip, vmes jih je precej takih, ki imajo v imenu "ta".
Na začetku vsake kode lepo v angleščini piše kaj ta koda naredi, najdi si primer, ki ti najbolj odgovarja in ga predelaj. Ko ga spreminjaš redno preverjaj, da vidiš kdaj neha delat, takrat si naredi napako.
pa še to, če ti bo pomagalo
http://www.ti.com/lit/ml/slap113/slap113.pdf
http://www.ccs.neu.edu/home/noubir/Courses/CSU610/S07/MSP430-Clock-Timers.pdf _________________ Če nekaj deluje, razstavi in ugotovi zakaj. |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 76 dni
Powered by phpBB © 2001, 2005 phpBB Group
|