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.
#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
}
}
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;
#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
}
}
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