Sida 2 av 3

Postat: 10 oktober 2008, 20:09:36
av barbarossa
newbadboy skrev:Sista segmentet som jag inte lyckats tända är kopplad till pinne 16 (RC7).. men här har jag inte ngn förklaring...
Pin 16 är RC0

Postat: 10 oktober 2008, 20:09:58
av SvenW
Jag vet inte vilken kompilator ni har och dess egenheter och finesser, men i vanlig (ANSI) C betyder

if( 0x010E < Value <= 0x0129 )
{
}

inte vad man kanske tror.

Vänstra uttrycket '0x010E < Value' evalueras till 1 eller 0 vilket sedan jämförs med '<= 0x0129' och blir alltså nästan alltid sant. Syntaktiskt korrekt c-kod i och för sig, men inte så bra!

Postat: 10 oktober 2008, 20:22:11
av newbadboy
sodjan skrev:> Jag är ganska säker på att MikroC inte skriver till OSCCON utan bara till CONFIG när man editerar projekt.

OSCCON skrivs enbart från koden.
CONFIG kan sättas i koden (om det stöds) eller från IDE'n.

Och visst är det INTOSCIO som ska väljas, jag har inte riktigt
förstått varför det inte är gjort.

visst är det INTOSCIO och inget annat som skall väljas...

Postat: 10 oktober 2008, 20:23:41
av newbadboy
SvenW skrev:Jag vet inte vilken kompilator ni har och dess egenheter och finesser, men i vanlig (ANSI) C betyder

if( 0x010E < Value <= 0x0129 )
{
}

inte vad man kanske tror.

Vänstra uttrycket '0x010E < Value' evalueras till 1 eller 0 vilket sedan jämförs med '<= 0x0129' och blir alltså nästan alltid sant. Syntaktiskt korrekt c-kod i och för sig, men inte så bra!

Nää jag märker det.. Min krets struntar i if satserna, den bara räknar upp
som en jävla timer :lol: ...

Fast jag är inte helt övertygad om hur man ska skirva det annars..

Postat: 10 oktober 2008, 20:27:24
av newbadboy
barbarossa skrev:
newbadboy skrev:Sista segmentet som jag inte lyckats tända är kopplad till pinne 16 (RC7).. men här har jag inte ngn förklaring...
Pin 16 är RC0

fullständigt rätt,, det är bara jag som yrar genom att blanda ihop siffror i mina anteckningar. Och kablarna på kopplingsdäcket.. det funkar nu

Postat: 10 oktober 2008, 20:38:17
av vfr
newbadboy skrev:Fast jag är inte helt övertygad om hur man ska skirva det annars..
Kanske så här:

Kod: Markera allt

if((Value > 0x010E) && (Value <= 0x0129))
{
}

Postat: 10 oktober 2008, 20:43:46
av newbadboy
:oops:

Postat: 10 oktober 2008, 20:47:46
av EBD
Eller använd "else if" såhär:

Kod: Markera allt

if( Value <= 0xCD) //Läser in värdet value och jämför det
{
	PORTA = 0b00100000;        // med ett värde, ex binärt för 2V
	PORTB = 0b11100000;        //om dessa stämmer tänds olika segment
	PORTC = 0b11110111;        //annars jämförs nästa "if" sats
	delay_ms(5000);
}
else if( Value <= 0xEB ) //**10**
{
	PORTA = 0b00110000;
	PORTB = 0b01110000;
	PORTC = 0b01010001;
	delay_ms(5000);
}
else if( Value <= 0x010E ) //**15**
{
	PORTA = 0b00100000;
	PORTB = 0b11100000;
	PORTC = 0b01010001;
	delay_ms(5000);
}
och så vidare.

Postat: 10 oktober 2008, 20:49:18
av SvenW
Om du har något i stil med

if( Value <= 0xCD){ }
if( 0xCD < Value <= 0xEB ){}
if( 0xEB < Value <= 0x010E ){}
if( 0x010E < Value <= 0x0129 ){}


kan du i stället skriva så här:

if( Value <= 0xCD){; }
else if( Value <= 0xEB ){;}
else if( Value <= 0x010E ){;}
else if( Value <= 0x0129 ){;}


eller om det finns luckor i talserien kan man också deklarera ett makro:

#define IS_WITHIN(a,b,c) ((a < b) && (b <= c))

if ( IS_WITHIN( 0x00CD , Value, 0x00EB )) {;}
if ( IS_WITHIN( 0x00EF , Value, 0x010E )) {;}
if ( IS_WITHIN( 0x010F , Value, 0x0129 )) {;}

PS. om man vill använda en bra programstil, t.ex. gnu-stilen, så bör man skriva 'value' med liten bokstav. STORA bokstäver signalerar att det är ett makro, blandade 'EnTypdef' signalerar att det är en datatyp.
Det finns lite olika stilar, men det underlättar om man använder en och är konsekvent.

Postat: 11 oktober 2008, 18:50:38
av newbadboy
vfr skrev:
newbadboy skrev:Fast jag är inte helt övertygad om hur man ska skirva det annars..
Kanske så här:

Kod: Markera allt

if((Value > 0x010E) && (Value <= 0x0129))
{
}
jag körde denna variant. den verkar funka . Men det är ett problem. Kretsen verkar inte vilja läsa in ADC värdet. Om jag i början av koden sätter value manuellt till ngt värde så visar den rätt på displayen.
Om jag däremot läser in värdet med nedanstående så funkar det inte
Value = ADC_read(2);
Vbat = ADC_read(1)

Det yttrar sig genom att oavsett om jag sätter pinne 18 till jord eller Vcc så skriver den på displayen LO dvs för lågt batteri. Jag har satt pinne 17 till 2V vilket skall motsvara 40% Den visar bara 5%. Lyfter jag upp tråden och låter den hänga i luften så skiftar displayen mellan LO och 5%

Ledtrådar?

Postat: 11 oktober 2008, 18:58:08
av newbadboy
har det ngt att göra med att jag har delar PortA som I/O och delar av den som analoga ingångar och att detta krockar på ngt sätt??

Postat: 11 oktober 2008, 19:14:07
av sodjan
Om det krockar framgår av databladet.
Det beror kanske också på hur ADC_read() fungerar, men det
har du väl läst på, antar jag.

Postat: 11 oktober 2008, 19:29:18
av newbadboy
Det verkar inte vara ADC kommandot som har begränsingen iaf..

Postat: 20 oktober 2008, 11:09:35
av newbadboy
Shit asså... jag vet snart inte vad mer jag ska testa det vill sig inte funka.. har inte gjort ngt framsteg :(

Postat: 20 oktober 2008, 11:36:09
av sodjan
OK, vad har du provat med under dessa 9 dagar sedan sist ?