MSP430 Sleep Funktion

Gast #6875113
Lesenswert?
• ▲
▼
Hallo,

für eine Anwendung wird ein MSP430 Mikrocontroller eingesetzt. Bestimmt 
IO Pins müssen unterschiedlich von high auf low und so weiter gesetzt 
werden.
Dazu benötige ich quasi eine Sleep Funktion. mit delay und while 
Schleife möchte ich allerdings nicht benutzen. Gibt es bereits schon 
Implementierungen auf Interrupt Basis die sowas ermöglichen?
Gast #6875385
Lesenswert?
• ▲
▼
Die Variante die dir nicht passt, wäre ja die folgende, oder?
1
#define MCLK (8000000)
2
void delay_ms(unsigned int delay_in_milliseconds) {
3
  do {
4
    __delay_cycles(1000 / MCLK);
5
  } while(--delay_in_milliseconds > 0);
6
}

Geht es darum, dass ein so generiertes "Delay" relativ ungenau ist - 
oder geht es darum, dass der Mikrocontroller so "busy" wartet?
Gast #6875402
Lesenswert?
• ▲
▼
>Gibt es bereits schon
>Implementierungen auf Interrupt Basis die sowas ermöglichen?

Du schickst den MSP in eine der möglichen LOW-Power-Modies
hast aber einen Timer und/oder Port(Interrupt), der ihn periodisch 
aufweckt.

In dieser Timer oder/und Port-ISR schaltest du dene Ports.
Gast #6875429
Lesenswert?
• ▲
▼
Konkret könnte dies so ähnlich wie folgt aussehen:
1
void config_sys_tick(void) {
2
  TB0CTL |= TBSSEL_2;
3
  TB0CCTL0 &= ~CCIE;
4
  TB0CCR0 = 16000000 * 0.01; //T = 10 ms @ SMCLK = 16 MHz
5
  TB0CTL &= ~MC;
6
  TB0CTL |= TBCLR;
7
}
8

9
void start_sys_tick(void) {
10
  TB0CCTL0 |= CCIE;
11
  TB0CTL |= MC_1;
12
  __enable_interrupt();
13
}
14

15
int main(void) {
16
  config_sys_tick();
17
  start_sys_tick();
18
}
19

20
unsigned long Sys_Tick_Count = 0;
21

22
#pragma vector=TIMER0_B0_VECTOR
23
__interrupt void My_Application_Loop(void) {
24
  ++Sys_Tick_Count;
25

26
  {
27
    //Deine Anwendung... Dieser "Loop" wird nun alle 10 ms ausgeführt.
28
    //(Sys_Tick_Count muss da auf jeden Fall noch periodisch irgendwie
29
    //zurückgesetzt werden.)
30
  }
31

32
  __bis_SR_register(LPM0_bits + GIE);
33
}

Andererseits könntest du auch jeweils einen entsprechend konfigurierten 
Timer starten und in einer Schlaufe das Überlauf-Flag pollen. Falls du 
es aber eben nicht "busy" haben möchtest, könntest du statt pollen dann 
auch einfach den Interrupt benutzen, der bei Überlauf "abgefeuert" 
wird...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.