Wechselblinker

Wer kann wann, welche Bauteile werden benötigt? Hier werden die Crashkurs-Tage geplant.

Wechselblinker

Beitragvon DL1CR » Do 19. Dez 2013, 23:59

Habe heute abend von Gerrit den MSP430 bekommen - tu - und ich konnte es nicht lassen, sofort mein erstes Projekt zu schreiben.
Nein, es ist kein Automatiktuner geworden, sondern nur ein Wechselblinker, hi.
73 Chris

Hier der Code. Die Formatierung ist beim Einfügen leider durcheinander geraten.

Code: Alles auswählen
#include <msp430g2553.h>         //laden, damit Register mit Namen statt
                           // Adressen verwendet werden können
void main( void)               //das ist die Hauptfunktion,
{                           // die in jedem C-Programm vorkommen muß!
   unsigned int i;               //Deklaration der Variable i (RAM)
    
    WDTCTL = WDTPW + WDTHOLD;       //stop watchdog timer    
    P1DIR = 0x01;               //konfiguriere P1.0 als Ausgang
    P1DIR = P1DIR  | 0x01 << 6;      //konfiguriere P1.6 als Ausgang
    
    while(1)                  //endlose Schleife
    {
       P1OUT = 0x01;            //setze  P1.0 auf 1 -> LED1 EIN  LED2 AUS
       for( i=0; i<0xffff; i++ );   //viele Schleifen zum Warten
       P1OUT = 0x01 << 6;         //setze P1.6 auf 1 -> LED1 AUS  LED2 EIN
      for( i=0; i<0xffff; i++ );   //viele Schleifen zum Warten
    }
}
DL1CR
 
Beiträge: 13
Registriert: Di 10. Dez 2013, 19:25

Re: Wechselblinker

Beitragvon DL9GFA » Sa 21. Dez 2013, 19:27

Hallo Chris,

schön, dass Du gleich losgelegt hast!
Hier folgt eine Variante in nur etwas anderer Schreibweise, die ein XOR (in C "^") zum Kippen der Bits nutzt. Die massive Nutzung von Boolescher/Bit Algebra vermeidet das gesamte Überschreiben von Registern, wie Du es ja in einem Fall auch schon getan hast.

Du wirst in Beispielen immer wieder sehen, dass der Operator vor dem Gleichheitszeichen steht. Das bedeutet aber nichts anderes, als dass die Operation auf das Ziel selbst angewendet wird. Also:

P1OUT |= LED_ROT; ist absolut identisch zu P1OUT = P1OUT | LED_ROT;

Code: Alles auswählen
#include <msp430g2553.h>         //laden, damit Register mit Namen statt Adressen verwendet werden können

#define LED_ROT   BIT0                //BIT0 ist die Bit-Maske 0x0001 und in der Header-Datei oben definiert, LED_ROT wird
#define LED_GRN   BIT6                //...nun überall im Quelltext durch diese Bit-Maske ersetzt

void main( void)               //das ist die Hauptfunktion,die in jedem C-Programm vorkommen muß!
{
   unsigned int i;
   
    WDTCTL = WDTPW + WDTHOLD;       //Stoppe Watchdog Timer    
    P1DIR |= LED_ROT + LED_GRN;      //konfiguriere beide als Ausgang
    P1OUT |= LED_ROT;            //rote LED EINschalten
    P1OUT &= ~LED_GRN;            //grüne LED AUSschalten
    
    while(1)                  //endlose Schleife
    {
       P1OUT ^= LED_ROT + LED_GRN;   //toggle beide LED-Pins
       for( i=0; i<0xffff; i++);   //Warteschleife
    }
}


Weiterhin viel Spaß!

vy 73 de Gerrit, DL9GFA
DL9GFA
 
Beiträge: 66
Registriert: Do 12. Apr 2012, 22:30

Re: Wechselblinker

Beitragvon DL1CR » So 22. Dez 2013, 08:24

Hallo Gerrit,
vielen Dank für deine ausführlichen Infos.
Diese "Tricks" zu erforschen und umzusetzen macht mir viel Spass und der Code wird - wie ich es nenne - eleganter.
Manchmal sitze ich 10 Minuten an einer Zeile, bis sie mir "gefällt", obwohl der Compiler vermutlich bei allen Varianten den gleichen Code erzeugt.
VG Christoph
DL1CR
 
Beiträge: 13
Registriert: Di 10. Dez 2013, 19:25


Zurück zu Der Workshop

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron