Sida 2 av 6

Postat: 30 november 2006, 22:26:16
av Kalf
jag är inte riktigt övertygad om jag förstog ditt inlägg helt, sodjan. Förklarade du bara vad bearing tidigade skrev eller skall Jag ändra på något?

Jag fattade iaf det som, precis som bearing säger nu, att jag kan köra fler saker samtidigt. Men nu är det så att jag inte vill det. Det jag skall göra är att ifall allting stämmer så skall en Led tändas. Annars inget annat, ingen LCD eller något.

Jag sitter här och räknar, men får bara konstiga, enligt mig, svar.

formeln: Tid [ms] = period * 1000 * 4 * prescaler / Klockfrekvens

Tid: 18.5mS
Prescaler 1:8
Klockfrekvens: 4mhtz

18.5 = period * 1000 * 4 * 0.125(1 åttondel) / 4
18.5 = period * 125
18.5/125 = period
0.148 = period

Vad menas med detta, jag trodde jag skulle få ett högre värde. 18.5mS är nämligen den längsta pulsen som jag kommer att mäta och den kortaste är 115uS

//Kalf

Postat: 30 november 2006, 22:28:19
av bengt-re
uS=Mohm eller ?

Postat: 30 november 2006, 22:45:26
av bearing
Processorn går i 4 * 10^6 Hz, inte 4 Hz. EDIT: Och prescalern är 8, inte 1/8.
(Du behöver inte använda prescaler med så korta pulser.)

Postat: 30 november 2006, 23:07:24
av Kalf
Tack, då blev det ett mer realistiskt tal.

bengt-re: uS = mikrosekunder = 1/1000 000 sekund om jag inte misstar mig.

Jag har kodat vidare nu. Men det verkar inte fungera som jag vill. Jag använder en ultraljudsmodul som skickar ut pulsen. för att aktivera den så skickar man in en kort puls på 5uS, detta ligger i funktionen start_pulse() när jag bara kör denna funktionen i en loop så lyser aktivitetslampan på modulen, men när jag kör hela programmet, så funkar det inte alls. Vad kan det vara? Är det mina while(PIR1.CCP1IF == 0)
{
void;
}

Eller vad kan det vara?

Här är iaf hela min kod:

Kod: Markera allt

/****************************************
*                                       *
*    Safety Electronics UF              *
*                                       *
*    Programerad av: Karl-fredrik       *
*    Datum: 2006-11-30                  *
*    Version: V.0.3                     *
*                                       *
****************************************/

void start_pulse(void);
void recive(void);
void count(void);

unsigned int CCP_Value_1_L;
unsigned int CCP_Value_1_H;
unsigned int CCP_Value_2_L;
unsigned int CCP_Value_2_H;
unsigned int CCP_Result_L;
unsigned int CCP_Result_H;
unsigned int CCP_Result;

void main()
     {
     TRISA = 0;
     while(1)
             {
             TRISB = 0;
             start_pulse();
             TRISB = 1;                 //PORTB.3 blir ingång
             recive();
             if(CCP_Result <= 0x0908)
                 {
                 PORTA = 0b00000100;
                 }
             else
                 {
                 PORTA=0x00;
                 }
             }
     }

void start_pulse(void)
     {
     PORTB = 0x00;
     PORTB = 0b00001000;                //1 skickar en puls till ping)))...
     delay_us(5);                       //...Som varar i 5us
     PORTB = 0x00;                      //0'ställer igen
     }
     
void recive(void)
     {
     T1CON = 0b00110001;                //startar timer 1 med prescaler 1:8
     CCP1CON = 0b00000101;              //Sätter igång CCP'n, positiv flank
     while(PIR1.CCP1IF == 0)            //Väntar på flank
                       {
                       void;
                       }
     PIR1.CCP1IF = 0;
     CCP_Value_1_L = CCPR1L;            //Stoppar in värdet på CCPR1L i en varabel...
     CCP_Value_1_H = CCPR1H;            //Samma med CCPR1H
     CCPR1L = 0x00;                     //Nollställer dessa två
     CCPR1H = 0x00;
     CCP1CON = 0b00000100;              //Ställer om för negativa flanker
     while(PIR1.CCP1IF == 0)            //Väntar igen
                       {
                       void;
                       }
     PIR1.CCP1IF = 0;                   //Nollställer interuppt registret
     CCP_Value_2_L = CCPR1L;            //Stoppar in i varablar
     CCP_Value_2_H = CCPR1H;
     T1CON = 0x00;                      //Stoppar timern
     count();
     }
     
void count(void)
     {
     CCP_Result_L = CCP_Value_2_L - CCP_Value_1_L;
     CCP_Result_H = CCP_Value_2_H - CCP_Value_1_H;
     CCP_Result = CCP_Result_H << 8 + CCP_Result_L;
     }

Postat: 30 november 2006, 23:13:21
av bengt-re
Konduktans mäts i enheten siemens, 1 S = 1 Ω-1.

sekund betecknas med lilla s....

uS --> mOhm....

Postat: 30 november 2006, 23:16:19
av Kalf
aha, det visste inte jag, men det stog med stort S i databladet för min sensor.

//Kalf

Postat: 30 november 2006, 23:19:24
av bearing
Jag ser att du bytt till frilöpande nu, varför det?
Och varför inte låta CCP-enheten nollställa?

Subtraktionen du gör är inte korrekt. Du måste ta hänsun till carry. Detta gör kompilatorn automatiskt om du först lägger CCPR1 i en 16-bitsvariebel och sedan kör subtraktionen.

TRISB = 1 sätter väl bara RB0 till ingång?

EDIT: Vad tycker IR-modulens utgångssteg om att "kämpa" mot picens utgång?

Postat: 30 november 2006, 23:19:50
av bengt-re
*ler* Bara lite irriterande när man använder SI-enhter fel. Fast är nog mest som fd. lärare man stör sig ;)

Jo jag har hittat lysdioder som skall tåla MA också, men det stämde inte - jag kunde bara prestera några tiondels kA och inte ens det tålde de.... Skumt.....

Postat: 30 november 2006, 23:25:22
av Kalf
Frilöpande?
Jag hade nog glömt att nolställa den.
Carry?
Hur skriver man en 16bitars varaibel då?

Måste inte PORTB vara ingång ifall man vill läsa ifrån den?

Usäkat ifall det kanske är dumma frågor, men det är väll därför detta forumet finns eller?

bengt-re: Mitt misstag, eller att jag inte visste det, jag får väll skylla på att jag bara är elev:-p
//Kalf

Postat: 30 november 2006, 23:36:35
av bengt-re
Det gör inget - jag slutar att störa tråden.

Märkligt sätt att skriva till TRISregisterna... oftast lämpligast att binärnotera när man skriver till TRISrigerna för bättre läsbarhet på koden..

Postat: 30 november 2006, 23:41:49
av bearing
Frilöpande - man låter den gå runt-runt och man påverkar den inte, menar jag.

Jag får be om ursäkt, kollade databladet och det fanns inte möjligheten att ställa in så att timern nollställs vid capture. Måste ha blandat ihop. Då är ditt/vfr:s sätt rätt, men du behöver inte nollställa CCPR1.

Carry har/kommer du läsa om på digitaltekniken. När ett register slår runt sätts carryflaggan så att man kan addera/subtrahera biten i nästa register.

Antagligen skriver man: unsigned int variabelnamn. Kolla manualen.

Sätt ingångarna till 1 och utgångarna till 0 i trisregistret vid initieringen. Du verkar inte behöva växla in/utgång under programmets gång.

Jo, man kan fråga. Dock tror jag att man utvecklas på många sätt bättre om man själv gör sitt yttersta för att själv finna lösningen innan man frågar/löser det.

Postat: 1 december 2006, 00:06:26
av sodjan
Jag har i och för sig inte skrivit mycket kod i C, men det här förstår jag inte alls :

> TRISB = 1; //PORTB.3 blir ingång

Hur fungerar det ??
Hur ser assembler-koden ut som genereras av detta C-kommando ?

Postat: 1 december 2006, 00:39:36
av bearing
I min kompilator (CC5X) skulle det bli:
BANKSEL TRISB
MOVLW 1
MOVWF TRISB

Så i den skulle inte kommentaren stämma överens med koden. Antagligen inte i andra kompilatorer heller.

Postat: 1 december 2006, 00:49:27
av Kalf
jag har klippt lite, tyvärr och efter det har nog kommentaren hamnat fel bara.

//Kalf

Postat: 1 december 2006, 07:37:34
av Kalf
bearing skrev:Jag ser att du bytt till frilöpande nu, varför det?
Och varför inte låta CCP-enheten nollställa?

Subtraktionen du gör är inte korrekt. Du måste ta hänsun till carry. Detta gör kompilatorn automatiskt om du först lägger CCPR1 i en 16-bitsvariebel och sedan kör subtraktionen.

TRISB = 1 sätter väl bara RB0 till ingång?

EDIT: Vad tycker IR-modulens utgångssteg om att "kämpa" mot picens utgång?
Såg inte ditt tilläg färens nu. Det är en ultraljuds modul. Det finns bara en signalpine på den. Så det är så man skall göra.