Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

Generating one pulse per second using MSP430 and an external oscillator

Status
Not open for further replies.

omerdf

New Member
Hello ,
I'm new to this field of microcontroller and i need you quick help with a new project of mine.
I will explain a little about the project :
My main goal is to generate a 1 pulse per second using a duty cycle of 50% by a 12.8MHz external oscillator.
I already have a printed PCB for that project which means i got to understand what the previous designer had done and implement it into my CCS program in order to program my micro controller.
i am still new to this whole microcontroller world and im eager to know more , although im short in time.

I have attached an electrical wiring of the PCB to help you understand a little bit more about the project.

A little explanation of the electrical wiring:
An external toggle switch (from connector J6 "Internal/External Selection") switch between an external 1pps (From an external GPS) or internal 1pps (by the msp430).
if we choose an internal mode then (input P2.2) a '1' (or '0' if its an active low mode which is an active low mode) sends from PJ.3 (ouput) to U4 and a 1 pulse per second gets out of P2.4 output to connectors J8 and J9 (same pulse different connectors).

I can Switch signals to ON/BAD/OFF by using an external toggle switch(pins 1,2 of J3 connector) or a descrete (pin 3 of J3 connector).
if i toggle the switch to on mode it sends '1'(or '0' if its an active low mode which is an active low mode) through P1.6 to U5 ( And Gate) and enables the pulse it also sends '1' through PJ.0 to U6 and converts the pulse from TTL to RS422 (differetial).
The descrete switching option switches the pulse (ON/OFF) the same as the external toggle switch.
This is refers to PULSE 1 , i need to implement the same thing for PULSE 2.

although im still not sure what RST/NMI/SBWTDIO and TEST/SBWTCK are wired for , are these for downloading the program into the msp?
im also not sure about the PJ.2 pin (FUNCTIONALITY DISABLE).

I know its a lot to read but im really short in time about this project and i dont have much time to study everything.
so i would be very glad if you could read the code and help me implement the functions into the code.

here's the code :
#include <msp430.h>
#include <intrinsics.h>




unsigned int timerCount = 0;

int main(void) {


WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P2OUT &= ~(BIT4); //preload 1pps to '0'


// set I/O pins directions
P1DIR |=BIT6+BIT7; //set p1.x to 11000000
P2DIR |=BIT4; // Set P2.4 to output direction
PJDIR |=BIT0+BIT1+BIT3; // set pj.x output 0000 1011
P2SEL |= BIT4; //select the option of using TD0.0 in pin 2.4
P2IES |= BIT4; // high -> low is selected with IES.x = 1.
P2IFG &= ~(BIT4); // To prevent an immediate interrupt, clear the flag for
// P1.3 before enabling the interrupt.
P2IE |= BIT4; // Enable interrupts for P1.3

// Configure XT1 (external oscillator)
PJSEL |= BIT4+BIT5; // port select for xt1
UCSCTL6 &= ~(XT1OFF); //xt1 is on
UCSCTL3 = 0; // FLL REFERENCE CLOCK REFERENCE = XT1

// configure TD0.0 to output of 1 pulse per second

TD0CCR0=16000-1; // setting TAR count up value 16000 (12.8MHz / 8 = 1.6MHz , 1.6MHz / 100 = 16000 Hz) when 100 is passed means 1 second has passed as well
//TD0CCR1= //DUTY CYCLE OF 50%
//TD0CCTL1=CCIE + OUTMOD_7; //enabling interuption + RESET/SET OUTPUT MODE
TD0CTL0 =MC_2+ID_3+TDSSEL_0+TAIE; //defining timer d TD0.0 (P2.4)

__enable_interrupt();


for(;;){ // main loop (looping forever)



// EXTERNAL / INTERNAL SELECTION BY SW4

if ((P2IN & BIT2)==0){ // INTERNAL MODE
PJOUT |=BIT3; // sends '1' from pj.3 output to the multiplexer U4 (uses the internal 1pps)

//PULSE 1 : DESCRETE ON/OFF AND SWITCH ON/BAD/OFF

if ((P2IN & BIT0)==0 || (P1IN & BIT0)==0) { //NORMAL SIGNAL OF 1PPS checks if descrete source is on or 1pps sw pulse 1 is on
P1OUT |= BIT6; //ENABLES PULSE BY THE 'AND' GATE
PJOUT |= BIT0; //ENABLES TTL TO RS232 CONVERTER (FOR DIFF OUTPUT)
#pragma vector = TIMER0_D0_VECTOR
__interrupt void TIMER0_D0(void){
if (++timerCount > 20) { // checks if the incrementation of timerCount reaches 50 (means 0.5 second has passed)
P2OUT ^=BIT4; //generates 1pps out of p2.4
timerCount = 0; // resets the timer count
}
P2IFG &=~(BIT4); // clears the fl
}

}
}
else {
P1OUT |= ~(BIT6); //DISABLES PULSE BY SENDING A '0' TO THE AND GATE
}

if ((P1IN & BIT2)==0) { //PULSE 1 BAD SIGNAL ???
// CODE HERE FOR BAD SIGNAL PULSE 1//
}

//PULSE 2 : DESCRETE ON/OFF AND SWITCH ON/BAD/OFF


if ((P2IN & BIT1)==0 || (P1IN & BIT0)==0){ //NORMAL SIGNAL OF 1PPS checks if descrete source is on or 1pps sw pulse 2 is on
P1OUT |= BIT7; //ENABLES PULSE BY THE 'AND' GATE
PJOUT |= BIT1; //ENABLES TTL TO RS232 CONVERTER (FOR DIFF OUTPUT)
#pragma vector = TIMER0_D0_VECTOR //GENERATES 1PPS EVERY 1s
__interrupt void TIMER0_D0 (void){
if (++timerCount > 20) { // checks if the incrementation of timerCount reaches 100 (means 1 second has passed)
P2OUT ^=BIT4; //generates 1pps out of p2.4
timerCount = 0; // resets the timer count
}
P2IFG &= ~(BIT4); // clears the fl
}


}
else {
P1OUT |= ~(BIT7); //DISABLES PULSE BY SENDING A '0' TO THE AND GATE
}

if ((P1IN & BIT3)==0){ //PULSE 1 BAD SIGNAL ???
// CODE HERE FOR BAD SIGNAL PULSE 1//
}


}

else { //EXTERNAL MODE
PJOUT |= ~(BIT3); //sends '0' from pj.3 output to the multimplexer U4 (uses the external 1pps)
P1OUT |= BIT6; // ENABLES PULSE 1
P1OUT |= BIT7; //ENABLES PULSE 2
PJOUT |= BIT0; //ENABLES RS422 DIFF OUTPUT FOR PULSE 1
PJOUT |= BIT1; // ENABLES RS422 DIFF OUTPUT FOR PULSE 2
}
}
}


return 0;



thanks in advance.
 

Attachments

  • PCB electrical wiring.pdf
    33.1 KB · Views: 200
It's been a few years since I've worked on MSP430.

Put your code in []code tags so that it's readable.

although im still not sure what RST/NMI/SBWTDIO and TEST/SBWTCK are wired for , are these for downloading the program into the msp?
Yes, this is where the FET programmer or ez430 programmer connects to in order to program/debug the chip. It's a spy-bi-wire interface.

im also not sure about the PJ.2 pin (FUNCTIONALITY DISABLE).
PJ.2 does not look like it's connected to anything other than a standard GPIO pin. If it's not referenced in the code it likely doesn't do anything.

You don't seem to have any other questions and I'm not going into the timing in depth. I assume this is code that already works.
If you have any specific questions you might want to ask on https://forum.43oh.com/ .
 
My main question is : the function #pragma is used outside of the code and not within the code , so how am i gonna use it while i have multiple conditions that every condition should generate the 1pps using that ISR function?
maybe there is another way instead of using interupts?

thanks.
 
The pragma is not code it is simply telling the linker that the function TIMER0_D0 is to be assigned to the service routine for the timer.
As far as I can tell this code just wont work. You cannot define the service routine TIMER0_D0 twice, or define it within another function (main).

You can only have one Timer0 service routine and in that routine you should be checking what processing you should be doing. Dynamically assigning the TIMER0 vector can be done, but this isn't how it's done.
 
seems like an easier way to poll an IFG instead of those interupts , i have encountered this code :

#include <io430x11x1.h> // Specific device
// Pins for LEDs
#define LED1 BIT3
#define LED2 BIT4
void main (void)
{
WDTCTL = WDTPW|WDTHOLD; // Stop watchdog timer
P2OUT = ˜LED1; // Preload LED1 on , LED2 off
P2DIR = LED1|LED2; // Set pins for LED1 ,2 to output
TACTL = MC_2|ID_3|TASSEL_2|TACLR; // Set up and start Timer A
// Continuous up mode , divide clock by 8, clock from SMCLK , clear timer
for (;;) { // Loop forever
while (TACTL_bit.TAIFG == 0) { // Wait for overflow
} // doing nothing
TACTL_bit.TAIFG = 0; // Clear overflow flag
P2OUT ˆ= LED1|LED2; // Toggle LEDs
} // Back around infinite loop

although im not familiar with this funcition: TACTL_bit.TAIFG and if i want to set the flag to the amount of counts i want , how do i do that?

thanks
 
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top