M'n eerste projectje met de 16F628 en picc lite en ik zit al vast bij het programma. 't Is voor 'n 3x3x3 led kubus, pin B5-7 sturen transistors aan om de laag te selecteren, pin A0-7 (zonder A5) en B0-1 worden gebruikt om de leds binnen die laag doen op te lichten. Dit programma zou alle leds een voor een moeten doen oplichten maar het lijkt niet te werken. In proteus lijkt het wel te werken, maar in de schakeling zelf niet, terwijl een programma geschreven in jal het wel deed dus ik vermoed dat de schakeling wel oké is. (maar ik programmeer liever in C dan in jal dus als het kan wil ik picc blijven gebruiken)

Iemand die een oplossing weet?

#include <htc.h>
#include <pic.h>
#include "delay.h"

__CONFIG(INTIO);


long value = 1;
int layer = 0;

void main(void)
{
	CMCON = 0x07;
	TRISA = 0x00;
	TRISB = 0x00;
	


	while (1){
		//TODO Auto-generated main function
		int a = value & 0xFF;
		int b = (value >> 8) & 0x01;
		
		if (layer == 0)
		{
			b = b | 0x20;	
		} else if (layer == 1)
		{
			b = b | 0x40;
		}else if (layer == 2)
		{
			b = b | 0x80;
		}
		
		if ((a & 0x10) > 0)
		{
			b = b | 0x02;	
		}
		
		PORTA = a;
		PORTB = b;
		DelayMs(200);
		value = value << 1;
		if (value > 512)
		{
			value = 1;
			layer = (layer + 1 < 3 ? layer+1 : 0);	
		}
		
	}
}

Zit er niet iets fout in je aansluit schema?

Ik denk het niet, met een simpel programma in jal kreeg ik wel het gewenste resultaat.

Probleem zit hem in de chaos van de magic numbers en in het begrip van wat er in het programm gebeurt.
Niet wat je dénkt dat er gebeurt, maar wat er daadwerkelijk wordt uitgevoerd.
Misschien tijd om nog eens de desk check af te stoffen.

Volgens mij wordt value alleen geshift.
verder ziet de volgende regel er heeft knap uit:

--> layer = (layer + 1 < 3 ? layer+1 : 0); <--

maar zou beter wat leesbaarder geschreven kunnen worden.

De werkernde jal code zou leuk zijn om de verschillen te zien

Op 21 juni 2008 17:41:48 schreef Karijn:
Volgens mij wordt value alleen geshift.
verder ziet de volgende regel er heeft knap uit:

--> layer = (layer + 1 < 3 ? layer+1 : 0); <--

maar zou beter wat leesbaarder geschreven kunnen worden.

De werkernde jal code zou leuk zijn om de verschillen te zien

dat is maar een simpele if ;) als layer + 1 < 3 wordt layer = layer + 1 anders gewoon 0 :)

Vreemd genoeg doet het stuk code in proteus gewoon wat het moet doen. Daarmee dat ik momenteel hoofdzakelijk naar de configuratie ben aan het kijken of daar alles wel goed zit met powerup functies.

denk dat dit al beter is maar kan het niet onmiddelijk testen


__CONFIG(MCLREN & UNPROTECT & WDTDIS & INTIO & PWRTEN & BOREN & LVPEN);

Zou iemand me misschien kunnen vertellen wat die caps en diode in het stroomschema van bv voti.nl blink a led doen? want momenteel gebruik ik de interne osc van de pic en sluit ik gewoon rechtstreeks 'n 5 volt erop aan, voor kleine dingen heb ik hier nooit problemen mee gehad. Maar is misschien noodzakelijk voor grotere dingen?

Je gebruikt toch wel 100nF over de voeding!

En de 47uF moet je ook niet vergeten.