Innehållsförteckning:
2025 Författare: John Day | [email protected]. Senast ändrad: 2025-01-13 06:58
Välkommen! Making of Seconds Counter: Använda CCStudio 8 och MSP430F5529 för projektet.
C -språk för att koda mikrokontrollern. Tillämpa lågeffektlägen, timers och avbrott. Utgången visas via 7 segment.
Steg 1: Insikt
Låt oss börja!
Initiera vakthundstimern till AV -läge med hjälp av det nödvändiga lösenordet för vakthundstimern (Det hjälper till att hålla koll på oändliga slingor och hålla processorn säker).
#omfatta
/** * main.c */
int main (void)
{
WDTCTL = WDTPW | WDTHOLD; // stopp vakthund timer
returnera 0;
}
Steg 2: Portinitialisering
{
P3DIR = 0xFF; // P3DIR = 0x00;
P6DIR = 0xFF;
P4DIR | = 0x00;
P4REN | = 0xFF;
P4OUT | = 0xFF;
}
P3DIR | = 0x00 berättar att hela PORT-3 initieras för att ta in ingångar.
P3DIR | = 0xFF berättar att hela PORT-3 initieras för att ge utdata.
P3DIR | = 0x01 initialiseras endast stiftet P3.0 för utmatning i PORT-3. Detta följer en hexadecimal portmappning.
P4REN | = 0xFF, detta indikerar att stiften på PORT-4 har sina upp-/nedmotstånd aktiverade.
För att välja dem mellan Pull UP eller Pull DOWN används instruktionen P $ OUT | = 0xFF.
Om 0xFF används konfigureras de som Pull UP -motstånd och om 0x00 konfigureras de som Pull DOWN.
Steg 3: Ultra Low Power
MSP430F5529 gör att vi kan minska strömförlusten från processorn. Detta är användbart i fristående applikationer.
Detta kräver deklaration av alla stift eller portar för utmatning.
{
P7DIR | = 0xFF;
P6DIR | = 0xFF;
P5DIR | = 0xFF;
P4DIR | = 0xFF;
P3DIR | = 0xFF;
P2DIR | = 0xFF;
P1DIR | = 0xFF;
}
Steg 4: TIMER
Användning av timer för fördröjning av en sekund. Detta använder SMCLK på 1 MHz, även timern körs i Low Power Mode (i nästa steg, efter dess räkning avbröts det från LPM). Denna process sparar kraft och börda på processorn
TA0CCTL0 = CCIE;
TA0CCR0 = 999;
TA0CTL = TASSEL_2 + MC_1;
Värdena är 999, eftersom det tar ytterligare en räkning för att rulla tillbaka till noll i timerregistret.
Steg 5: Low Power Mode
_BIS_SR (LPM0_bits+GIE);
Detta möjliggör General Interrupt Enable (GIE) och sätter CPU: n till LPM0, där MCLK som stöder cpu är avstängd, och SMCLK och ACLK -körning som håller timern igång. så vi kan se att CPU är avstängd, där genom att spara ström.
Steg 6: ISR-timer
#pragma vektor = TIMER0_A0_VECTOR
_interrupt void Timer_A (void)
{
z ++;
om (z> fördröjning)
{
P3OUT = kod [x];
P6OUT = kod1 [y];
x ++;
om (x == 10)
{
x = 0;
y ++;
}
om (y == 6)
y = 0;
z = 0;
}
}
pragma -vektorn är för ISR -representation i C embd.
kod [x] och kod1 [y] är matriserna som innehåller utgångsvärden för de två sju segmenten, för att visa 60 sekunders räknare.
Steg 7: Hårdvaruavbrott
P2DIR = 0x00;
P2REN = 0x02;
P2OUT = 0x02;
P2IE | = BIT1;
P2IES | = BIT1;
P2IFG & = ~ BIT1;
Här deklareras P2.1 som ett hårdvaruavbrott, om knappen trycks in återställs räknaren till värdet.
resten program skrivs inuti ISR för detta avbrott.
Steg 8: ISR- Återställ/ tryckknapp
#pragma vektor = PORT2_VECTOR
_interrupt void port_2 (void)
{
P2IFG & = ~ BIT1;
x = 0; y = 0;
P3OUT = kod [x];
P6OUT = kod1 [y];
v ++;
för (i = 0; i
{
P1OUT | = BIT0; //P1.0 = växla
_fördröjning_cyklar (1048576);
P1OUT & = ~ BIT0; // P1.0 = växla
_fördröjning_cyklar (1048576);
}
Denna ISR återställer räknaren och räknar med hur många gånger resten trycktes.
(Här visas displayen via LED -växling, kan också använda en annan array och timer för att visa dessa värden som utmatning i 7 segment).
Steg 9: KOD
#omfatta
#definiera fördröjning 1000
char kod = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xE6};
char code1 = {0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B};
flyktig osignerad int x = 0, y = 0, z = 0;
flyktig osignerad int v = 0, i = 0;
void main ()
{
WDTCTL = WDTPW | WDTHOLD; // stopp vakthund timer
P7DIR | = 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 avbryter servicerutinen
#pragma vektor = TIMER0_A0_VECTOR
_interrupt void Timer_A (void)
{
z ++;
om (z> fördröjning)
{
P3OUT = kod [x];
P6OUT = kod1 [y];
x ++;
om (x == 10)
{
x = 0;
y ++;
}
om (y == 6)
y = 0;
z = 0;
}
}
// Maskinvaruavbrottsrutin
#pragma vektor = PORT2_VECTOR
_interrupt void port_2 (void)
{
P2IFG & = ~ BIT1;
x = 0;
y = 0;
P3OUT = kod [x];
P6OUT = kod1 [y];
v ++;
för (i = 0; i
{P1OUT | = BIT0; // P1.0 = växla
_fördröjning_cyklar (1048576);
P1OUT & = ~ BIT0; // P1.0 = växla
_fördröjning_cyklar (1048576);
}
}
Steg 10: Referenskod
GitHub -förvar