Wechselblinker

Wer kann wann, welche Bauteile werden benötigt? Hier werden die Crashkurs-Tage geplant.
Post Reply
DL1CR
Posts: 13
Joined: Tue 10. Dec 2013, 19:25

Wechselblinker

Post by DL1CR » Thu 19. Dec 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: Select all

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

DL9GFA
Posts: 66
Joined: Thu 12. Apr 2012, 22:30

Re: Wechselblinker

Post by DL9GFA » Sat 21. Dec 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: Select all

#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

DL1CR
Posts: 13
Joined: Tue 10. Dec 2013, 19:25

Re: Wechselblinker

Post by DL1CR » Sun 22. Dec 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

Post Reply