Pin 16 är RC0newbadboy skrev:Sista segmentet som jag inte lyckats tända är kopplad till pinne 16 (RC7).. men här har jag inte ngn förklaring...
Lite hjälp, med min c-kod till en fuktmätare.
-
- EF Sponsor
- Inlägg: 544
- Blev medlem: 8 december 2006, 11:18:14
- Ort: Tågarp, Svalöv
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!
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!
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...
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

Fast jag är inte helt övertygad om hur man ska skirva det annars..
Senast redigerad av newbadboy 10 oktober 2008, 20:28:28, redigerad totalt 1 gång.
barbarossa skrev:Pin 16 är RC0newbadboy skrev:Sista segmentet som jag inte lyckats tända är kopplad till pinne 16 (RC7).. men här har jag inte ngn förklaring...
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
Senast redigerad av newbadboy 10 oktober 2008, 20:43:02, redigerad totalt 1 gång.
Kanske så här:newbadboy skrev:Fast jag är inte helt övertygad om hur man ska skirva det annars..
Kod: Markera allt
if((Value > 0x010E) && (Value <= 0x0129))
{
}
Eller använd "else if" såhär:
och så vidare.
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);
}
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.
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.
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.vfr skrev:Kanske så här:newbadboy skrev:Fast jag är inte helt övertygad om hur man ska skirva det annars..Kod: Markera allt
if((Value > 0x010E) && (Value <= 0x0129)) { }
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?