www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

MSP430
Pojdi na stran Prejšnja  1, 2, 3
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> 16 bitni mlinčki
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
grizm
Član
Član



Pridružen-a: Pon 09 Nov 2009 20:52
Prispevkov: 12
Aktiv.: 0.07
Kraj: MS

PrispevekObjavljeno: Sob Jun 09, 2012 11:40 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Dorijan
Član
Član



Pridružen-a: Ned 22 Jun 2008 10:48
Prispevkov: 2481
Aktiv.: 12.93
Kraj: južnoprimorska

PrispevekObjavljeno: Ned Jun 10, 2012 12:05 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
grizm
Član
Član



Pridružen-a: Pon 09 Nov 2009 20:52
Prispevkov: 12
Aktiv.: 0.07
Kraj: MS

PrispevekObjavljeno: Ned Jun 10, 2012 12:37 am    Naslov sporočila:   Odgovori s citatom

aham, hvala....
... glede programa dela vse razen timerja mi ne zažene očitno.. pa newem zakaj...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Dorijan
Član
Član



Pridružen-a: Ned 22 Jun 2008 10:48
Prispevkov: 2481
Aktiv.: 12.93
Kraj: južnoprimorska

PrispevekObjavljeno: Ned Jun 10, 2012 9:32 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> 16 bitni mlinčki Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3
Stran 3 od 3

 
Pojdi na:  
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group