Sida 1 av 3

Lite hjälp, med min c-kod till en fuktmätare.

Postat: 9 oktober 2008, 19:02:00
av newbadboy
Använder en 16F690.. och ska mäta en utspänningen från en fuktsensor som ger ut en viss spänning vid viss fukthalt. Detta ska ADC och sedan skall det presenteras på en 7seg display.

Min första fråga är.. Hur sätter jag att det ska va intern oscillator. Jag använder MikroC som kompilator.. Jag har gjort det innan men jag kommer fan inte ihåg det.

Postat: 9 oktober 2008, 19:26:54
av Icecap
Projekt -> Edit Projekt

Postat: 9 oktober 2008, 20:04:58
av newbadboy
hehe jag var inte tillräckligt tydlig. Jag vet att det är i den menyn.. men jag vet inte vilken av alternativen som ska var förbockade samt avbockade.

sen är det en grej till Jag har lyckats tända alla segment på displayen utom tre. två av segmenten är kopplad till just de oinnarna som annars kristallen skulle suttit på dvs pinne 2,3 (Ra5/Ra6). Kan detta bero på att den inte är satt som intern oscillator?

Sista segmentet som jag inte lyckats tända är kopplad till pinne 16 (RC7).. men här har jag inte ngn förklaring...

Postat: 9 oktober 2008, 20:06:33
av newbadboy
Här är min kod... den funkar ännu inte. Mitt första steg är iaf att tända rätt segment för att visa siffror.



/ Fuktmätare för luftfuktighet.
// Pic16f690. Intern oscillator 4Mhz. Extern MCLR



Kod: Markera allt

unsigned int Value;
unsigned int Vbat;

void main(){

ANSEL = 0b00000110;                      //an1 och an2 analog in, resten I/O
ANSELH = 0b00000000;                     //I/O
ADCON1 = 0b00110000;                     //Frc klocka vald

TRISC = 0b00000000;                     //PORTC är utgångar
TRISB = 0b00000000;                     //PORTB är utgångar
TRISA = 0b00000110;                     //PORTA, RA1/RA2= ADC ingång, andra utgång

PORTA = 0b11011111 ;                    //Skriver RH på display  i 10sek
PORTB = 0b11010000 ;
PORTC = 0b00100000 ;
Delay_ms(10000);

/*
while(1){                          //testloop

             PORTA = 0b11111111 ;
             PORTB = 0b11111111 ;
             PORTC = 0b11111111 ;
             delay_ms(2000);
             
             PORTA = 0;
             PORTB = 0;
             PORTC = 0;
             delay_ms(2000);
         }
              */

while(1){

         ADCON0 = 0b11000111;            //Sätter AN1 till inläsning
         Vbat = ADC_read(1);
         
         if(Vbat < 0x028E ){             //Läser av Vbat. Skriver ut LO om den
             PORTA = 0b01110001 ;        //understiger 654Dec (3,2V)
             PORTB = 0b01110000 ;
             PORTC = 0b00110000 ;
             delay_ms(2000);
             }


         ADCON0 = 0b11001011;            //Sätter AN2 till inläsning
         Value = ADC_read(2);            //Read ADC channel 2.
         
         
                                                        //**5**
         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);
             }
             
          if( 0xCD < Value <= 0xEB ){                   //**10**

            PORTA = 0b00110000 ;
            PORTB = 0b01110000 ;
            PORTC = 0b01010001 ;
            delay_ms(5000);
             }
             
             
             if( 0xEB < Value <= 0x010E ){                //**15**

            PORTA = 0b00100000 ;
            PORTB = 0b11100000 ;
            PORTC = 0b01010001 ;
            delay_ms(5000);
            }

            if( 0x010E < Value <= 0x0129 ){                 //**20**

            PORTA = 0b00110000 ;
            PORTB = 0b01110000 ;
            PORTC = 0b10111101 ;
            delay_ms(5000);
            }
            
            if( 0x0129 < Value <=0x014B ){                   //**25**

            PORTA = 0b00110000 ;
            PORTB = 0b11100000 ;
            PORTC = 0b10111101 ;
            delay_ms(5000);
            }
            
            if( 0x014B < Value <= 0x0166){                   //**30**

            PORTA = 0b00110000 ;
            PORTB = 0b01110000 ;
            PORTC = 0b10101111 ;
            delay_ms(5000);
            }
            
            if( 0x0166 < Value <= 0x018D ){                   //**35**

            PORTA = 0b00100000 ;
            PORTB = 0b11100000 ;
            PORTC = 0b10101111 ;
            delay_ms(5000);
            }
            
            if( 0x018D < Value <= 0x01A7 ){                   //**40**

            PORTA = 0b00110000 ;
            PORTB = 0b01110000 ;
            PORTC = 0b01001111 ;
            delay_ms(5000);
            }
            
            if( 0x01A7 < Value <= 0x01CC ){                  //**45**

            PORTA = 0b00100000 ;
            PORTB = 0b11100000 ;
            PORTC = 0b01001111 ;
            delay_ms(5000);
            }
            
            if( 0x01CC < Value <= 0x01E1 ){                  //**50**

            PORTA = 0b00110000 ;
            PORTB = 0b01110000 ;
            PORTC = 0b11101011 ;
            delay_ms(5000);
            }
            
            if( 0x01E1 < Value <= 0x01FB ){                  //**55**

            PORTA = 0b00110000 ;
            PORTB = 0b11100000 ;
            PORTC = 0b11101011 ;
            delay_ms(5000);
            }
            
            if( 0x01FB < Value <= 0x0222 ){                  //**60**

            PORTA = 0b00110000 ;
            PORTB = 0b01110000 ;
            PORTC = 0b11111011 ;
            delay_ms(5000);
            }
            
            if( 0x0222 < Value <= 0x0241 ){                  //**65**

            PORTA = 0b00110000 ;
            PORTB = 0b11100000 ;
            PORTC = 0b11111011 ;
            }
            
            if( 0x0241 < Value <= 0x025D ){                  //**70**

            PORTA = 0b00000000 ;
            PORTB = 0b01110000 ;
            PORTC = 0b00110000 ;
            delay_ms(5000);
            }
            
            if( 0x025D < Value <= 0x027E ){                  //**75**

            PORTA = 0b00100000 ;
            PORTB = 0b11100000 ;
            PORTC = 0b10000111 ;
            delay_ms(5000);
            }
            
            if( 0x027E < Value <= 0x0298 ){                  //**80**

            PORTA = 0b00110000 ;
            PORTB = 0b01110000 ;
            PORTC = 0b11111111 ;
            delay_ms(5000);
            }

            if( 0x0298 < Value <= 0x02C2 ){                  //**85**

            PORTA = 0b00100000 ;
            PORTB = 0b11100000 ;
            PORTC = 0b11111111 ;
            delay_ms(5000);
            }
            
            if( 0x02C < Value <= 0x02E2 ){                  //**90**

            PORTA = 0b00110000 ;
            PORTB = 0b01110000 ;
            PORTC = 0b11001111 ;
            delay_ms(5000);
            }

            if( 0x02E2 < Value <= 0x02FF ){                  //**95**

            PORTA = 0b00100000 ;
            PORTB = 0b11100000 ;
            PORTC = 0b11001111 ;
            delay_ms(5000);
            }
            
            if( Value > 0x02FF ){                            //**99**

            PORTA = 0b00000000 ;
            PORTB = 0b11110000 ;
            PORTC = 0b11001111 ;
            delay_ms(5000);
            }

       }

}

Postat: 9 oktober 2008, 21:17:03
av sodjan
> Kan detta bero på att den inte är satt som intern oscillator?

Ja, i alla fall enligt databladet. Kör du INTOSCIO ?

> men jag vet inte vilken av alternativen som ska var förbockade samt avbockade.

Hur menar du ? Vad är det som är oklart ? Vad har du för alternativ ?
Stämmer de inte överens med databladet (och device INC filen) ?

Postat: 10 oktober 2008, 08:56:41
av newbadboy
Kolla bilderna där är alla alternativ som finns. De som är förbockade är default. Där finn ju en som heter INTOSC och jag antar att det är vel den som ska bockas i.

Jag vet inte cvad device inc filen är :oops:

http://www.ladda-upp.com/bilder-a/piccccc-871.JPG

http://www.ladda-upp.com/bilder/10561/piccccc

Postat: 10 oktober 2008, 09:02:44
av sodjan
Det ser ju helt OK ut. Vad är problemet ? Att du inte ka köra med HS_OSC
är väll uppenbart, eller hur ?

> Jag vet inte cvad device inc filen är

P16F690.INC
Den finns i din MPLAB installation och där finns det ytterligare en
beskrivning av CONFIG inställningarna. Kolla där också.

Men annars vet jag inte varför du inte bara väljer det du vill
ha på den där bilden du länkade till...

Postat: 10 oktober 2008, 09:36:35
av newbadboy
mmmm provade igår lite snabbt med att klicka av hs_osc och ha intosc förbockad och det gick inte ändå.. Ska kolla mer på det så jag inte gjort ngt annat misstag.

Postat: 10 oktober 2008, 10:49:17
av sodjan
> intosc

Nu fattar jag inte rilktigt...
Varför just INTOSC ?
Var det inte INTOSCIO du ville ha !?

Det hela låter som om du inte har läst CONFIG delan av databladet,
och i så fall är det ju ingen mening att fortsätta.

Vad är det som är oklart i
"REGISTER 14-1: CONFIG: CONFIGURATION WORD REGISTER"
under "bit 2-0 FOSC<2:0>: Oscillator Selection bits" ??

Postat: 10 oktober 2008, 12:47:48
av newbadboy
kollar genom det en gång till o ser om jag kan förstå det bättre

Postat: 10 oktober 2008, 13:05:19
av sodjan
bit 2-0 FOSC<2:0>: Oscillator Selection bits
111 = RC oscillator: CLKOUT function on RA4/OSC2/CLKOUT pin, RC on RA5/OSC1/CLKIN
110 = RCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, RC on RA5/OSC1/CLKIN
101 = INTOSC oscillator: CLKOUT function on RA4/OSC2/CLKOUT pin,
I/O function on RA5/OSC1/CLKIN
100 = INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin,
I/O function on RA5/OSC1/CLKIN
011 = EC: I/O function on RA4/OSC2/CLKOUT pin, CLKIN on RA5/OSC1/CLKIN
010 = HS oscillator: High-speed crystal/resonator on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN
001 = XT oscillator: Crystal/resonator on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN
000 = LP oscillator: Low-power crystal on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN
Alltså :
"100 = INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN"

Var det inte så du ville ha det ?

Postat: 10 oktober 2008, 15:50:01
av barbarossa
Borde funka om du infogar:

OSCCON=0b01100001;

i koden

Postat: 10 oktober 2008, 16:20:29
av sodjan
Jag vet inte riktigt hur du menar med "funkar", men
Oscillator Control (OSCCON) har inget direkt med CONFIG
av oscillatorn att göra. Om CONFIG är fel, så kan det inte
"fixas" m.h.a OSCCON...

Postat: 10 oktober 2008, 16:25:27
av barbarossa
Jag är ganska säker på att MikroC inte skriver till OSCCON utan bara till CONFIG när man editerar projekt.

Efter att jag skrev förra inlägget såg jag att även INOSCIO inte var valt, så det är nog det som ställer till det.

//A

Postat: 10 oktober 2008, 16:55:38
av sodjan
> 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.