İçindekiler:

MSP430 Saniye Sayacı: 10 Adım
MSP430 Saniye Sayacı: 10 Adım

Video: MSP430 Saniye Sayacı: 10 Adım

Video: MSP430 Saniye Sayacı: 10 Adım
Video: Getting Started with the MSP430 LaunchPad Workshop Part 4 2024, Kasım
Anonim
MSP430 Saniye Sayacı
MSP430 Saniye Sayacı

Hoş geldin! Saniye Sayacı Yapımı: Proje için CCStudio 8 ve MSP430F5529 kullanımı.

Mikro denetleyiciyi kodlamak için C dili. Düşük Güç Modları, Zamanlayıcılar ve Kesintilerin Uygulanması. Çıktı 7 Segment üzerinden görüntülenir.

1. Adım: İçgörü

İç yüzü
İç yüzü

Hadi başlayalım!

Watchdog zamanlayıcısı için gerekli parolayı kullanarak watchdog zamanlayıcısını OFF durumuna sıfırlayın (İşlemciyi güvende tutarak sonsuz döngülerin kontrolünü sağlamaya yardımcı olur).

#Dahil etmek

/** * ana.c */

int ana(boşluk)

{

WDTCTL = WDTPW | WDTHOLD; // watchdog zamanlayıcısını durdur

0 döndür;

}

2. Adım: Bağlantı Noktası Başlatma

{

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

P6DIR=0xFF;

P4DIR |=0x00;

P4REN |=0xFF;

P4OUT |=0xFF;

}

P3DIR |=0x00 bize PORT-3'ün tamamının girdi almak için başlatıldığını söyler.

P3DIR |=0xFF bize PORT-3'ün tamamının çıktı vermek için başlatıldığını söyler.

P3DIR |=0x01 sadece P3.0 pini PORT-3'te çıkış için başlatılır. Bu, bir Onaltılık Bağlantı Noktası eşlemesini izler.

P4REN |=0xFF, bu PORT-4 pinlerinin yukarı/aşağı çekme dirençlerinin etkin olduğunu gösterir.

Bunları Pull UP veya Pull DOWN arasında seçmek için P$OUT |=0xFF komutu kullanılır.

0xFF kullanılıyorsa, Pull UP dirençleri olarak, 0x00 ise Pull AŞAĞI olarak yapılandırılırlar.

3. Adım: Ultra Düşük Güç

MSP430F5529, işlemciden kaynaklanan güç kaybını azaltmamızı sağlar. Bu, bağımsız uygulamalarda kullanışlıdır.

Bu, çıkış için tüm pinlerin veya Portların bildirilmesini gerektirir.

{

P7DIR |= 0xFF;

P6DIR |= 0xFF;

P5DIR |= 0xFF;

P4DIR |= 0xFF;

P3DIR |= 0xFF;

P2DIR |= 0xFF;

P1DIR |= 0xFF;

}

4. Adım: ZAMANLAYICI

Bir saniyelik gecikme üretimi için zamanlayıcı kullanımı. Bu, 1MHz'lik SMCLK'yi kullanır, ayrıca zamanlayıcı Düşük güç Modunda çalışır (bir sonraki adımda, sayımı LPM'den kesildikten sonra). Bu işlem, işlemci üzerinde güç ve yük tasarrufu sağlar

TA0CCTL0=CCIE;

TA0CCR0=999;

TA0CTL = TASSEL_2 + MC_1;

Değerler 999'dur, çünkü zamanlayıcı kaydında sıfıra geri dönmek için bir sayım daha gerekir.

Adım 5: Düşük Güç Modu

_BIS_SR(LPM0_bits+GIE);

Bu, Genel kesmeyi Etkinleştir'i (GIE) etkinleştirir ve CPU'yu, işlemciyi destekleyen MCLK'nin kapalı olduğu ve zamanlayıcıyı çalışır durumda tutan SMCLK ve ACLK'nin çalıştığı LPM0 konumuna getirir. Böylece güç tasarrufu yaparak CPU'nun kapalı olduğunu görebiliriz.

Adım 6: ISR-Zamanlayıcı

ISR-Zamanlayıcı
ISR-Zamanlayıcı

#pragma vektör=TIMER0_A0_VECTOR

_interrupt void Timer_A (void)

{

z++;

if(z>gecikme)

{

P3OUT=kod[x];

P6OUT=kod1[y];

x++;

eğer(x==10)

{

x=0;

y++;

}

eğer(y==6)

y=0;

z=0;

}

}

pragma vektörü, C embd'deki ISR temsili içindir.

code[x] ve code1[y], 60 saniyelik sayacı görüntülemek için iki yedi segment için çıkış değerlerini içeren dizilerdir.

Adım 7: Donanım Kesintisi

P2DIR=0x00;

P2REN=0x02;

P2OUT=0x02;

P2IE |=BIT1;

P2IES |=BIT1;

P2IFG &= ~BIT1;

Burada P2.1 bir donanım kesintisi olarak bildirilir, butona basılırsa sayaç değere sıfırlanır.

dinlenme programı bu kesmenin ISR'sinin içine yazılır.

Adım 8: ISR-Sıfırlama/Basma Düğmesi

#pragma vektör=PORT2_VECTOR

_interrupt void port_2(void)

{

P2IFG &=~BIT1;

x=0; y=0;

P3OUT=kod[x];

P6OUT=kod1[y];

v++;

for(i=0;i

{

P1OUT |= BIT0; //P1.0 = geçiş

_delay_cycles(1048576);

P1OUT &=~BIT0; // P1.0 = geçiş

_delay_cycles(1048576);

}

Bu ISR, sayacı sıfırlar ve geri kalanına kaç kez basıldığının bir sayımını tutar.

(Burada gösterim led toggle ile yapılır, ayrıca bu değerleri 7 segmentte çıktı olarak göstermek için başka bir dizi ve zamanlayıcı kullanabilir).

9. Adım: KOD

KOD
KOD

#Dahil etmek

#define gecikme 1000

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

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

uçucu işaretsiz int x=0, y=0, z=0;

uçucu işaretsiz int v=0, i=0;

geçersiz ana()

{

WDTCTL = WDTPW | WDTHOLD; // watchdog zamanlayıcısını durdur

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);

}

// Zamanlayıcı A0 kesme servis rutini

#pragma vektör=TIMER0_A0_VECTOR

_interrupt void Timer_A (void)

{

z++;

if(z>gecikme)

{

P3OUT=kod[x];

P6OUT=kod1[y];

x++;

eğer(x==10)

{

x=0;

y++;

}

eğer(y==6)

y=0;

z=0;

}

}

// Donanım kesme servis rutini

#pragma vektör=PORT2_VECTOR

_interrupt void port_2(void)

{

P2IFG &=~BIT1;

x=0;

y=0;

P3OUT=kod[x];

P6OUT=kod1[y];

v++;

for(i=0;i

{ P1OUT |= BIT0; // P1.0 = geçiş

_delay_cycles(1048576);

P1OUT &=~BIT0; // P1.0 = geçiş

_delay_cycles(1048576);

}

}

Adım 10: Referans Kodu

Referans Kodu
Referans Kodu

GitHub Deposu

Önerilen: