Inhaltsverzeichnis:

MSP430 Sekundenzähler - Gunook
MSP430 Sekundenzähler - Gunook

Video: MSP430 Sekundenzähler - Gunook

Video: MSP430 Sekundenzähler - Gunook
Video: TI Launchpad MSP430 G2553 : 7-Segment-Anzeige: Aufwärtszähler 2024, November
Anonim
MSP430 Sekundenzähler
MSP430 Sekundenzähler

Willkommen! Making of Sekundenzähler: Verwendung von CCStudio 8 und MSP430F5529 für das Projekt.

C-Sprache zum Codieren des Mikrocontrollers. Anwenden von Low-Power-Modi, Timern und Interrupts. Die Ausgabe wird über 7 Segmente angezeigt.

Schritt 1: Einblick

Einblick
Einblick

Lass uns anfangen!

Initialisieren Sie den Watchdog-Timer mit dem erforderlichen Passwort für den Watchdog-Timer in den AUS-Zustand (es hilft, Endlosschleifen zu überprüfen und den Prozessor zu schützen).

#enthalten

/** * Haupt c */

int main(void)

{

WDTCTL = WDTPW | WDTHOLD; // Watchdog-Timer stoppen

0 zurückgeben;

}

Schritt 2: Port-Initialisierung

{

P3DIR=0xFF; // P3DIR=0x00;

P6DIR=0xFF;

P4VERZ |=0x00;

P4REN |=0xFF;

P4OUT |=0xFF;

}

P3DIR |=0x00 sagt uns, dass der gesamte PORT-3 initialisiert ist, um Eingaben zu empfangen.

P3DIR |=0xFF sagt uns, dass der gesamte PORT-3 initialisiert ist, um Ausgaben zu geben.

P3DIR |=0x01 nur der Pin P3.0 wird zur Ausgabe in PORT-3 initialisiert. Dies folgt einer Hexadezimal-Port-Zuordnung.

P4REN |=0xFF, dies zeigt an, dass die Pull-Up/Down-Widerstände der Pins von PORT-4 aktiviert sind.

Um sie zwischen Pull UP oder Pull DOWN auszuwählen, wird die Anweisung P$OUT |=0xFF verwendet.

Wenn 0xFF verwendet wird, konfigurieren sie als Pull-UP-Widerstände und wenn 0x00 als Pull-DOWN-Widerstände.

Schritt 3: Ultra Low Power

Mit MSP430F5529 können wir die Verlustleistung des Prozessors reduzieren. Dies ist in eigenständigen Anwendungen nützlich.

Dies erfordert die Deklaration aller Pins oder Ports für die Ausgabe.

{

P7VERZ |= 0xFF;

P6DIR |= 0xFF;

P5DIR |= 0xFF;

P4DIR |= 0xFF;

P3DIR |= 0xFF;

P2DIR |= 0xFF;

P1DIR |= 0xFF;

}

Schritt 4: TIMER

Verwendung des Timers zur Verzögerungserzeugung von einer Sekunde. Dies verwendet den SMCLK von 1MHz, auch der Timer läuft im Low-Power-Modus (im nächsten Schritt wird nach seiner Zählung von LPM unterbrochen). Dieser Vorgang spart Strom und entlastet den Prozessor

TA0CCTL0=CCIE;

TA0CCR0=999;

TA0CTL = TASSEL_2 + MC_1;

Der Wert ist 999, da der Zähler eine weitere Zählung benötigt, um im Timer-Register auf Null zurückzusetzen.

Schritt 5: Energiesparmodus

_BIS_SR(LPM0_bits+GIE);

Dadurch wird General Interrupt Enable (GIE) aktiviert und die CPU auf LPM0 gesetzt, wobei MCLK, das die CPU unterstützt, ausgeschaltet ist und SMCLK und ACLK ausgeführt werden, die den Timer laufen lassen. So können wir sehen, dass die CPU ausgeschaltet ist, um dort Strom zu sparen.

Schritt 6: ISR-Timer

ESR-Timer
ESR-Timer

#pragma vector=TIMER0_A0_VECTOR

_interrupt void Timer_A (void)

{

z++;

if(z>Verzögerung)

{

P3OUT=Code[x];

P6OUT=code1[y];

x++;

wenn(x==10)

{

x=0;

y++;

}

wenn(y==6)

y = 0;

z=0;

}

}

Pragma-Vektor ist für die ISR-Darstellung in C embd.

code[x] und code1[y] sind die Arrays, die Ausgabewerte für die beiden sieben Segmente enthalten, um den 60-Sekunden-Zähler anzuzeigen.

Schritt 7: Hardware-Unterbrechung

P2DIR=0x00;

P2REN=0x02;

P2OUT=0x02;

P2IE |=BIT1;

P2IES |=BIT1;

P2IFG &= ~BIT1;

Hier wird P2.1 als Prozessalarm deklariert, wird der Taster gedrückt, wird der Zähler auf den Wert zurückgesetzt.

das Restprogramm wird in den ISR dieses Interrupts geschrieben.

Schritt 8: ISR-Reset / Drucktaste

#pragma vector=PORT2_VECTOR

_ungültiger Port_2 unterbrechen (void)

{

P2IFG &=~BIT1;

x=0; y = 0;

P3OUT=Code[x];

P6OUT=code1[y];

v++;

für(i=0;i

{

P1OUT |= BIT0; //P1.0 = umschalten

_delay_cycles(1048576);

P1OUT &=~BIT0; // P1.0 = umschalten

_delay_cycles(1048576);

}

Dieser ISR setzt den Zähler zurück und zählt, wie oft der Rest gedrückt wurde.

(Hier erfolgt die Anzeige über LED-Toggle, kann auch ein anderes Array und einen Timer verwenden, um diese Werte als Ausgabe in 7 Segmenten anzuzeigen).

Schritt 9: CODE

CODE
CODE

#enthalten

#define Verzögerung 1000

Zeichencode={0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xE6};

Zeichencode1={0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B};

flüchtig unsigned int x=0, y=0, z=0;

volatile unsigned int v=0, i=0;

void main()

{

WDTCTL = WDTPW | WDTHOLD; // Watchdog-Timer stoppen

P7VERZ |= 0xFF;

P7OUT |= 0x00;

P8DIR |= 0xFF;

P8OUT |= 0x00;

P4DIR |= 0xFF;

P4OUT |= 0x00;

P5DIR |= 0xFF;

P5OUT |= 0x00;

P1DIR=0xFF;

P3DIR=0xFF;

P6DIR=0xFF;

P2DIR=0x00;

P2REN=0x02;

P2OUT=0x02;

P2IE |=BIT1;

P2IES |=BIT1;

P2IFG &= ~BIT1;

TA0CCTL0=CCIE;

TA0CCR0=999;

TA0CTL = TASSEL_2 + MC_1;

_BIS_SR(LPM0_bits+GIE);

}

// Timer A0 Interrupt-Service-Routine

#pragma vector=TIMER0_A0_VECTOR

_interrupt void Timer_A (void)

{

z++;

if(z>Verzögerung)

{

P3OUT=Code[x];

P6OUT=code1[y];

x++;

wenn(x==10)

{

x=0;

y++;

}

wenn(y==6)

y = 0;

z=0;

}

}

// Hardware-Interrupt-Service-Routine

#pragma vector=PORT2_VECTOR

_ungültiger Port_2 unterbrechen (void)

{

P2IFG &=~BIT1;

x=0;

y = 0;

P3OUT=Code[x];

P6OUT=code1[y];

v++;

für(i=0;i

{ P1OUT |= BIT0; // P1.0 = umschalten

_delay_cycles(1048576);

P1OUT &=~BIT0; // P1.0 = umschalten

_delay_cycles(1048576);

}

}

Schritt 10: Referenzcode

Referenzcode
Referenzcode

GitHub-Repository