สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ยินดีต้อนรับ! การสร้างตัวนับวินาที: การใช้ CCStudio 8 และ MSP430F5529 สำหรับโครงการ
ภาษา C เพื่อเข้ารหัสไมโครคอนโทรลเลอร์ การใช้โหมดพลังงานต่ำ ตัวจับเวลา และอินเตอร์รัปต์ เอาต์พุตจะแสดงผ่าน 7 Segment
ขั้นตอนที่ 1: ข้อมูลเชิงลึก
เอาล่ะ!
เริ่มต้นตัวจับเวลาจ้องจับผิดเป็นสถานะ OFF โดยใช้รหัสผ่านที่จำเป็นสำหรับตัวจับเวลาจ้องจับผิด (ช่วยในการตรวจสอบการวนซ้ำที่ไม่สิ้นสุด ทำให้โปรเซสเซอร์ปลอดภัย)
#รวม
/** * main.c */
int หลัก (เป็นโมฆะ)
{
WDTCTL = WDTPW | WDTHOLD; // หยุดนาฬิกาจับเวลา
กลับ 0;
}
ขั้นตอนที่ 2: การเริ่มต้นพอร์ต
{
P3DIR=0xFF; // P3DIR=0x00;
P6DIR=0xFF;
P4DIR |=0x00;
P4REN |=0xFF;
P4OUT |=0xFF;
}
P3DIR |=0x00 บอกเราว่า PORT-3 ทั้งหมดถูกเตรียมใช้งานเพื่อรับอินพุต
P3DIR |=0xFF บอกเราว่า PORT-3 ทั้งหมดถูกเตรียมใช้งานเพื่อให้เอาต์พุต
P3DIR |=0x01 เฉพาะพิน P3.0 เท่านั้นที่เริ่มต้นเพื่อส่งออกใน PORT-3 สิ่งนี้เป็นไปตามการแมปพอร์ตเลขฐานสิบหก
P4REN |=0xFF แสดงว่าพินของ PORT-4 เปิดใช้งานตัวต้านทานแบบดึงขึ้น/ลง
ในการเลือกระหว่าง Pull UP หรือ Pull DOWN จะใช้คำสั่ง P$OUT |=0xFF
หากใช้ 0xFF จะกำหนดค่าเป็นตัวต้านทานแบบดึงขึ้น และหาก 0x00 จะถูกกำหนดค่าเป็นแบบดึงลง
ขั้นตอนที่ 3: พลังงานต่ำเป็นพิเศษ
MSP430F5529 ช่วยให้เราลดการสูญเสียพลังงานจากโปรเซสเซอร์ สิ่งนี้มีประโยชน์ในแอปพลิเคชันแบบสแตนด์อโลน
สิ่งนี้เรียกร้องให้มีการประกาศพินหรือพอร์ตทั้งหมดเพื่อส่งออก
{
P7DIR |= 0xFF;
P6DIR |= 0xFF;
P5DIR |= 0xFF;
P4DIR |= 0xFF;
P3DIR |= 0xFF;
P2DIR |= 0xFF;
P1DIR |= 0xFF;
}
ขั้นตอนที่ 4: TIMER
การใช้ตัวจับเวลาสำหรับการสร้างการหน่วงเวลาหนึ่งวินาที สิ่งนี้ใช้ SMCLK ที่ 1MHz และตัวจับเวลาจะทำงานในโหมดพลังงานต่ำ (ในขั้นตอนต่อไป หลังจากนับถูกขัดจังหวะจาก LPM) กระบวนการนี้ช่วยประหยัดพลังงานและภาระของโปรเซสเซอร์
TA0CCTL0=CCIE;
TA0CCR0=999;
TA0CTL = TASSEL_2 + MC_1;
ค่าคือ 999 เนื่องจากต้องใช้เวลาอีกหนึ่งครั้งเพื่อย้อนกลับเป็นศูนย์ในการลงทะเบียนตัวจับเวลา
ขั้นตอนที่ 5: โหมดพลังงานต่ำ
_BIS_SR(LPM0_bits+GIE);
สิ่งนี้จะเปิดใช้งาน General interrupt Enable (GIE) และทำให้ CPU เป็น LPM0 โดยที่ MCLK ที่รองรับ cpu ปิดอยู่ และ SMCLK และ ACLK จะทำงานเพื่อให้ตัวจับเวลาทำงานต่อไป ดังนั้นเราจึงสามารถเห็นได้ว่า CPU ถูกปิด โดยการประหยัดพลังงาน
ขั้นตอนที่ 6: ISR-Timer
#pragma vector=TIMER0_A0_VECTOR
_interrupt โมฆะ Timer_A (โมฆะ)
{
z++;
ถ้า(z>ล่าช้า)
{
P3OUT=รหัส[x];
P6OUT=code1[y];
x++;
ถ้า(x==10)
{
x=0;
ย++;
}
ถ้า(y==6)
y=0;
z=0;
}
}
เวกเตอร์ Pragma ใช้สำหรับการแสดง ISR ใน C embd
code[x] และ code1[y] คืออาร์เรย์ที่มีค่าเอาต์พุตสำหรับสองเซ็กเมนต์เจ็ดส่วน สำหรับการแสดงตัวนับ 60 วินาที
ขั้นตอนที่ 7: ฮาร์ดแวร์ขัดจังหวะ
P2DIR=0x00;
P2REN=0x02;
P2OUT=0x02;
P2IE |=BIT1;
P2IES |=BIT1;
P2IFG &= ~BIT1;
ที่นี่ P2.1 ถูกประกาศเป็นการขัดจังหวะของฮาร์ดแวร์ หากกดปุ่ม ตัวนับจะรีเซ็ตเป็นค่า
โปรแกรมที่เหลือเขียนอยู่ใน ISR ของการขัดจังหวะนี้
ขั้นตอนที่ 8: ISR- รีเซ็ต/ กดปุ่ม
#pragma vector=PORT2_VECTOR
_interrupt โมฆะ port_2(โมฆะ)
{
P2IFG &=~BIT1;
x=0; y=0;
P3OUT=รหัส[x];
P6OUT=code1[y];
วี++;
สำหรับ(i=0;i
{
P1OUT |= BIT0; //P1.0 = สลับ
_delay_cycles(1048576);
P1OUT &=~BIT0; // P1.0 = สลับ
_delay_cycles(1048576);
}
ISR นี้จะรีเซ็ตตัวนับ และนับจำนวนครั้งที่กดที่เหลือ
(นี่คือการแสดงผลโดยใช้การสลับแบบ LED นอกจากนี้ยังสามารถใช้อาร์เรย์และตัวจับเวลาอื่นเพื่อแสดงค่าเหล่านั้นเป็นเอาต์พุตใน 7 เซ็กเมนต์)
ขั้นตอนที่ 9: รหัส
#รวม
#define ดีเลย์ 1000
รหัสถ่าน={0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xE6};
รหัสถ่าน1={0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B};
int ที่ไม่ได้ลงนามที่ระเหยได้ x=0, y=0, z=0;
int ที่ไม่ได้ลงนามผันผวน v=0, i=0;
เป็นโมฆะหลัก ()
{
WDTCTL = WDTPW | WDTHOLD; // หยุดนาฬิกาจับเวลา
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);
}
// ตัวจับเวลา A0 ขัดจังหวะบริการประจำ
#pragma vector=TIMER0_A0_VECTOR
_interrupt โมฆะ Timer_A (โมฆะ)
{
z++;
ถ้า(z>ล่าช้า)
{
P3OUT=รหัส[x];
P6OUT=code1[y];
x++;
ถ้า(x==10)
{
x=0;
ย++;
}
ถ้า(y==6)
y=0;
z=0;
}
}
// ฮาร์ดแวร์ขัดจังหวะบริการรูทีน
#pragma vector=PORT2_VECTOR
_interrupt โมฆะ port_2(โมฆะ)
{
P2IFG &=~BIT1;
x=0;
y=0;
P3OUT=รหัส[x];
P6OUT=code1[y];
วี++;
สำหรับ(i=0;i
{ P1OUT |= BIT0; // P1.0 = สลับ
_delay_cycles(1048576);
P1OUT &=~BIT0; // P1.0 = สลับ
_delay_cycles(1048576);
}
}
ขั้นตอนที่ 10: รหัสอ้างอิง
GitHub Repository