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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

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

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Projekt -> Edit Projekt
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg 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...
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg 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);
            }

       }

}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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) ?
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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" ??
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

kollar genom det en gång till o ser om jag kan förstå det bättre
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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 ?
barbarossa
EF Sponsor
Inlägg: 544
Blev medlem: 8 december 2006, 11:18:14
Ort: Tågarp, Svalöv

Inlägg av barbarossa »

Borde funka om du infogar:

OSCCON=0b01100001;

i koden
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
barbarossa
EF Sponsor
Inlägg: 544
Blev medlem: 8 december 2006, 11:18:14
Ort: Tågarp, Svalöv

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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.
Skriv svar