Alkeellisia ongelmia LaunchPadin ohjelmoinnissa

En ole vielä oikein päässyt sisälle syntaksiin, joten tälläinen yksinkertainen kysymys. Kokeilen tehdä tälläistä yksinkertaista ledin vilkutinta, jossa vuoron perään pistetään ledi päälle, sammutetaan se ja siirrytään seuraavaan.

Hoitaisin tuon ledin valinnan ja tilan muutoksen fuktiossa changeLED(), mutta tuon dynaamisen muuttujan määrittely tuottaa ongelmia. Ao koodi ei siis toimi koska mm. BIT[currentLED] on ilmaistu väärin.

Miten tuo tulisi kirjoittaa?

[code]#include “msp430G2231.h”

void delay(void);
void changeLED(void);

void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4; //1.0-1.4 ulostuloiksi

while (1) {
changeLED();
}
}

void changeLED() {
unsigned int currentLED;

if (currentLED == 5) {currentLED = 0;}

P1OUT &= ~BIT[currentLED]; // LED päälle
delay();

P1OUT |= BIT[currentLED]; // LED pois

currentLED++;

delay();
}

void delay(void) {
unsigned int count;
for (count=0; count<60000; count++);
}[/code]

En ole varma, koska en ole ehtinyt tekemään omalla alustalla mitään järkevää vielä, mutta luulisin tuon menevän jotenkin näin:

[code]#include “msp430G2231.h”

void delay(void);
void changeLED(void);

void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
//P1DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4; //1.0-1.4 ulostuloiksi
//Tyylikkäämppää kun noita käsittelee OR operaatiolla.
P1DIR |= BIT0|BIT1|BIT2|BIT3|BIT4;
while (1) {
changeLED();
}
}

void changeLED() {
unsigned int currentLED;

if (currentLED == 5) {currentLED = 0;}
/* Tämä ei toimi. Jos BITX on määritelty esim #define BITX (1<<X) Löytyy jostain otsikkotiedostosta.
P1OUT &= ~BIT[currentLED]; // LED päälle
delay();

P1OUT |= BIT[currentLED]; // LED pois
*/
switch(currentLED){
case 0:
P1OUT &= ~BIT0; // LED päälle
delay();
P1OUT |= BIT0;
break;
case 1:
P1OUT &= ~BIT1; // LED päälle
delay();
P1OUT |= BIT1;
break;
}//Kääntäjä parkuu defaultin puuttumisesta…
currentLED++;

delay();
}

void delay(void) {
unsigned int count;
for (count=0; count<60000; count++);
}[/code]
Jos haluaa itse laittaa nuo taulukkoon, pitää ensin tietää miten nuo BITX on määritelty jos ne on 8-bittisiä lukuja, voi tehdä jotain tän tyylistä.

unsigned char portit[] = {BIT0, BIT1, BIT2,BIT3, BIT4, BIT5, BIT6,BIT7};//Menikö taulukon alustus noin?
//Ja indeksointi:
for(i=0;i<8;i++){
 PORT1OUT |= portit[i];
}

Kiitti, tuo switch-casehan tähän onkin toimiva ratkaisu.

Ohessa toimiva, joskin vähän rujo koodi:

[code]#include “msp430G2231.h”

void delay(void);
void changeLED(void);

unsigned int currentLED = 0;

void main(void){
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= BIT0|BIT1|BIT2|BIT3|BIT4;
P1OUT &= ~BIT0; //sammutetaan alkuun kaikki LEDit
P1OUT &= ~BIT1; //Tämänkin voisi varmaan tehdä fiksummin
P1OUT &= ~BIT2;
P1OUT &= ~BIT3; //nämä ei toki ole pakollisia, ledit sammuu
P1OUT &= ~BIT4; //joka tapauksessa ekan kierroksen jälkeen

while (1) {
	changeLED();		//kutsutaan lediä vaihtavaa funktiota
}

}

void changeLED() {
if (currentLED == 5) {currentLED = 0;}

switch(currentLED){
	case 0:
		P1OUT |= BIT0;			// LED päälle
		delay();
		P1OUT &= ~BIT0;			// LED pois
		break;
	case 1:
		P1OUT |= BIT1;			// LED päälle
		delay();
		P1OUT &= ~BIT1;			// LED pois
		break;		
	case 2:
		P1OUT |= BIT2;			// LED päälle
		delay();
		P1OUT &= ~BIT2;			// LED pois
		break;		
	case 3:
		P1OUT |= BIT3;			// LED päälle
		delay();
		P1OUT &= ~BIT3;			// LED pois
		break;
	case 4:
		P1OUT |= BIT4;			// LED päälle
		delay();
		P1OUT &= ~BIT4;			// LED pois
		break;		
}
currentLED++;

}

void delay(void) { //viiveen määrittely
unsigned int count;
for (count=0; count<60000; count++);
}[/code]

Pistän tähän vielä kuvan kytkennästä, sillä haluan kannustaa muitakin tekemään niin. Vaikka projekti olisi näinkin turha ja yksinkertainen, niin jollekin siitä voi olla suuri apu.

Vastukset tuossa ovat 220 ohmisia.

Seuraava harjoitustyö voi olla ihmetellä vaikka, että miten LaunchPadiin liitetään ulkoisia kytkimiä jolla voisi vaikka vaihtaa tuota välkkymissuuntaa… :slight_smile:

Näistähän kirjoittelet helposti myös näpsäkät lukija-artikkelit, niin osallistut kisaankin samalla :wink:

Tässä yksinkertainen toteutus mitä varmaan alunperin haettiin.

    void changeLED() {
       if (currentLED == 5) {currentLED = 0;}
         
       P1OUT |= (1 << currentLED);         // LED päälle
       delay();
       P1OUT &= ~(1 << currentLED);         // LED pois
      
       currentLED++;
    }