PIC-varvtäknare modell F1

Berätta om dina pågående projekt.
Användarvisningsbild
Helgesson
Inlägg: 298
Blev medlem: 19 november 2008, 22:51:11
Ort: Linköping

Re: PIC-varvtäknare modell F1

Inlägg av Helgesson »

Ska du bara mäta tiden mellan två pulser så är det ju bara vänta på första pulsen sedan starta en timer(hårdvarutimer), sedan ligga o vänta på nästa puls och sedan läsa av hur mycket den han o räkna till.
Går även att ställa in så att en interupt skapas när pulsen kommer så får du ännu bättre uppdatering.

Läs igenom kapitlet i databladet för timrar så får du se hur mycket man kan använda dom till.

När du har bra hårdvarufunktioner i PICen så är ju det ju lika bra att använda dom.
Ska du lösa tidskritiska saker i mjukvara så är det ASM som rekommendera men det känns inte som att du e så sugen på o lära dig de för de här projektet.
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: PIC-varvtäknare modell F1

Inlägg av bearing »

Jag har mätt avståndet mellan pulser i flera program. Bl.a. gjorde jag en "piggyback" tändförskjutare i en PIC. Den använder CCP-enhetens Capture för mätning av orginalsignalens period, samt CCP-enhetens Compare för den förskjutna signalen. Det är inte svårt att använda CCP-enheten för Capture. Man ställer in ett fåtal register (enligt manualen/databladet), och sedan sköts allting automatiskt. Huvudprogrammet behöver bara vänta på att en flagga sätts, vilket betyder att en mätning gjorts, och att resultatet (avståndet mellan pulserna) ligger i ett 16-bit register (två 8-bit). Läs registrena, nollställ flaggan, beräkna varvtalet, och vänta på att flaggan sätts nästa gång.

Jag orkar inte just nu skriva en detaljerad beskrivning på hur man ställer in CCP-enheten, eftersom att det beskrivs rätt bra i databladet. Det finns även mycket info ifall du söker på nätet. Högskolarnas kurser har även bra info om de här grejerna. Jag googlade snabbt nu och upptäcker att min gamla lärare har gjort en powerpoint om CCP-modulen.
http://www.ict.kth.se/courses/IL131V/timer1ccp.ppt
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: PIC-varvtäknare modell F1

Inlägg av bos »

Quinna skrev:men än så länge så tycker jag att det är mer smutskastning och idiotförklaring än hjälp.
Ingen har smutskastat någon. Om det är vad du tror bör du nog revidera dina läsfilter. Folk här har kommit med kommentarer, påpekat fel och gett förslag, men det du har gjort är att avfärda allt som antingen påhopp eller meningslös kritik utan att ens ha försökt förstå eller testat resonemangen i praktiken. Om man kommer hit med inställningen att vara beredd på att ändra sina egna uppfattningar om något som kan vara fel från början så kommer man längre än att tro att världen rättar sig efter en själv.

Men iallafall, som andra har påpekat är det CCP-modulen du kan använda i din PIC18F2455. Närmare bestämt är det Capture-läget som är aktuellt för att mäta tiden mellan två pulser. Sid 143 i databladet (DS3962C), avsnitt 15.2, förklarar Capture-läget mer i detalj. Principen går ut på att du kopplar din puls till CCP-modulens ingång (CCPx) och ställer in hur du vill att modulen ska skicka sina interrupts (varje, var 4:e eller var 16e stigande flank, eller varje fallande flank). Vid interrupt lagras Timer1-värdet i CCPR. För varje interrupt sparar du det värde som finns i CCPR, och vid nästkommande interrupt subtraherar med det nya värdet med det föregående, som du sparade undan.

Ex:

Kod: Markera allt

TMR1 = CCP1R = old_value = pulse_time = 0;
while 1 {
  if (interrupt) {
    pulse_time = CCP1R - old_value;
    old_value = TMR1;
    TMR1 = 0;
}
Svårare är det inte.

Lämpligtvis ser du till att använda lagom prescale på Timer1 för att slippa få en overflow innan en puls hinner komma fram.
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: PIC-varvtäknare modell F1

Inlägg av bearing »

Interrupt är kanske en snyggare lösning, men det behövs inte, utan det duger, som sagt, att kolla CCP-modulens flagga i mainloopen, om man vill göra programmet enkelt och lättförståeligt.
Quinna
Inlägg: 24
Blev medlem: 6 mars 2011, 13:55:57

Re: PIC-varvtäknare modell F1

Inlägg av Quinna »

< Lämpligtvis ser du till att använda lagom prescale på Timer1 för att slippa få en overflow innan en puls hinner komma fram.

Det här med prescale läser jag överallt. Har du tid och lust att ge en snabb förklaring på vad det är för nåt?
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: PIC-varvtäknare modell F1

Inlägg av bos »

Prescale är skalning av aktuell puls.

Som exempel kan du ta Timer0:s register, som per default ökar med 1 vid varje cykel (sid 126 i databladet). Sätter du Timer0:s prescale till 1:32 så kommer istället Timer0 öka med 1 var 32:a cykel.
Quinna
Inlägg: 24
Blev medlem: 6 mars 2011, 13:55:57

Re: PIC-varvtäknare modell F1

Inlägg av Quinna »

Ok. Detta verkar ju som en väldigt vettig väg att gå. Och det verkar vara precis som jag hade föreställt mig att PULSIN-funktionen skulle fungera. Så jag hade tänkt rätt även om det inte fungerade så i praktiken.

Jag har nu suttit (sitter fortfarande) och läst databladet till min PIC och även om det finns en del jag kan ta åt mig så är mycket av det som står där grov överkurs för mig vad det gäller facktermer och liknande. Kodexemplet som "bos" skrev tror jag mig förstå mig innebörden, men det vore mycket uppskattat om du kunde skriva kommentarer i koden peka på vad som är vad.

Sen en fråga. Det känns som att jag är en av få som jobbar i Proton. Hur blir det med "språket"? Det känns som att koden måste vara upplagd på ett särskilt sätt för att fungera? Och många av tecknen som används i era exempel används inte alls i Proton.

Sen en fråga till. Jag såg detta under features på beskrivningen på PICn: Internal Pull Up resistors (D+/D-).
Vad innebär det?
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: PIC-varvtäknare modell F1

Inlägg av bos »

D+/D- hör till USB (sid 15).

Internal pull up-resistors är vad det låter som, och är en feature som kan spara in ett par externa komponenter när man använder en eller fler pinnar ingångar. Pull up-motstånd bör du känna till vad det är (om inte, googla), och de används för att garantera att PIC:en får antingen hög eller låg signal in till sig. Om ingångssignalen är flytande, brusigt eller på något sätt svängande så finns det risk drar igångssteget rätt mycket ström och, som följd, kan förstöra ingången.

Och vad du menar med att Proton har annorlunda "tecken" än våra exempel har jag ingen aning om. Jag vet inte ens vad Proton är, men av din kod att döma är det en Basic-variant.

Att du behöver kommentarer till mitt fåradiga C-exempel får mig dessutom att anta att du inte har någon större programmeringsvana. Inget fel med det, och i ett sådant fall är Basic en bra början, men det känns också att det är ett ganska stort steg att hoppa in i en så avancerat controller som PIC18 som förstaprojekt. Jag skulle istället rekommendera att du börjar med en lite enklare variant, exempelvis en PIC12 (12F510 t.ex), så att du får lite mindre saker att hålla reda på. En PIC12 är, för en nybörjare, tillräckligt komplicerad, men en PIC18 är ett par magnituder värre.

Fast om du bara "vill få det funka" med det här projektet så är det OK det också, men räkna inte med att det blir enkelt. En bra början är att lära dig blinka en LED först.
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: PIC-varvtäknare modell F1

Inlägg av bos »

Men, kodkommentar ville du ha och här kommer det:

Kod: Markera allt

TMR1 = CCP1R = old_value = pulse_time = 0;    // Nollställ registren TMR1, CCP1R
                                              // samt variablerna old_value och pulse_time
while 1 {                                     // Loop:a i all evighet
  if (interrupt) {                            // Om en interrupt inträffat, så...
    pulse_time = CCP1R - old_value;           // ...lägg nuvarande (CCP1R-värde minus det gamla)
                                              // ...i variabeln pulse_time
    old_value = TMR1;                         // ...och spara aktuellt timervärde till old_value
    TMR1 = 0;                                 // ...och nollställ TMR1
  }
}
Jag tvivlar dock att det är till någon hjälp.
Quinna
Inlägg: 24
Blev medlem: 6 mars 2011, 13:55:57

Re: PIC-varvtäknare modell F1

Inlägg av Quinna »

bos skrev:D+/D- hör till USB (sid 15).

Internal pull up-resistors är vad det låter som, och är en feature som kan spara in ett par externa komponenter när man använder en eller fler pinnar ingångar. Pull up-motstånd bör du känna till vad det är (om inte, googla), och de används för att garantera att PIC:en får antingen hög eller låg signal in till sig. Om ingångssignalen är flytande, brusigt eller på något sätt svängande så finns det risk drar igångssteget rätt mycket ström och, som följd, kan förstöra ingången.

Och vad du menar med att Proton har annorlunda "tecken" än våra exempel har jag ingen aning om. Jag vet inte ens vad Proton är, men av din kod att döma är det en Basic-variant.

Att du behöver kommentarer till mitt fåradiga C-exempel får mig dessutom att anta att du inte har någon större programmeringsvana. Inget fel med det, och i ett sådant fall är Basic en bra början, men det känns också att det är ett ganska stort steg att hoppa in i en så avancerat controller som PIC18 som förstaprojekt. Jag skulle istället rekommendera att du börjar med en lite enklare variant, exempelvis en PIC12 (12F510 t.ex), så att du får lite mindre saker att hålla reda på. En PIC12 är, för en nybörjare, tillräckligt komplicerad, men en PIC18 är ett par magnituder värre.

Fast om du bara "vill få det funka" med det här projektet så är det OK det också, men räkna inte med att det blir enkelt. En bra början är att lära dig blinka en LED först.
Vad en pull-up resistor är vet jag, men vad som menades med just den interna va osäkert. Proton är såvitt jag vet bara ett programverktyg för att skriva PIC-Basic. Jag har redan nämnt att jag inte har programmerat något innan utan än så länge linkar mig fram med hjälp av Protons "Help"-avsnitt. Skälet till att jag har "valt" denna processor är att min kollega, han som utvecklar en hel del av systemet på företaget säljer utvecklingskort med såna processorer och jag behövde inte betala många kronor för den + att jag får support med mitt projekt. Dessvärre så ligger han inne på sjukhus för tillfället och kommer inte kunna hjälpa mig på ett tag.

Om du går tillbaka till första sidan i denna tråd så finns det rent av ett filmklipp på jag "blinkar" med dioder, så så långt har jag redan kommit. Tack btw för förklaringarna i ditt exempel. Ska sätta mig ner och försöka förstå dom helt och hållet.
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: PIC-varvtäknare modell F1

Inlägg av bearing »

bos skrev:Ok. Detta verkar ju som en väldigt vettig väg att gå. Och det verkar vara precis som jag hade föreställt mig att PULSIN-funktionen skulle fungera. Så jag hade tänkt rätt även om det inte fungerade så i praktiken.
Skillnaden mellan PULSIN-funktionen och CCP-enheten är att den första antagligen "pollar" (läser om och om igen) pinnen som anges som ingång, medan CCP-enheten är en hårdvaruenhet som arbetar helt parallellt med instruktionsexekveringen och känner av pulserna genom en flanktriggad vippa eller liknande.

PULSIN "blockerar" programmet medan den väntar på en puls, och det gör inte CCP-enheten. I ditt program spelar det inte någon roll ifall mätningen blockerar eller inte, eftersom att programmet i övrigt är ganska trivial. Men ifall programmet t.ex. skulle göra en större beräkning baserat på resultatet av mätningen, skulle beräkningen, ifall den tog lång tid, innebära att en eller flera pulser missas, eftersom att pulserna kommer in samtidigt som beräkningen sker. Med CCP-enheten skulle en puls som kommer in under beräkningen registreras, vilket gör att det värdet inte går förlorat. Tänk på att CCP-enheten bara triggar på en speciell pinne, det går alltså inte att använda PORTA.0 som ingång.

Jag tror att PULSIN kan fungera i din applikation, men det är lite elegantare att använda CCP-enheten.
ToPNoTCH
Inlägg: 5142
Blev medlem: 21 december 2009, 17:59:48

Re: PIC-varvtäknare modell F1

Inlägg av ToPNoTCH »

Vi kanske borde ta reda på vad PULSIN gör i Proton Basic.

Själv trodde jag att det var samma sak som PULSIN i PIC Basic Pro, vilket verkar vara fel.

Här är fakta.

Kod: Markera allt

PULSIN
Syntax
Variable = PULSIN Pin , State
    
Overview 
Change the specified pin to input and measure an input pulse.    

Operators 
Variable is a user defined variable. This may be a word variable with a range of 1 to 65535, or a byte variable with a range of 1 to 255.  
Pin is a Port.Pin constant that specifies the I/O pin to use.  
State is a constant (0 or 1) or name HIGH - LOW that specifies which edge must occur before begin-ning the measurement.    

Example  
DIM VAR1 AS BYTE  Loop:   VAR1 = PULSIN PORTB.0 , 1 ' Measure a pulse on pin 0 of PORTB.   
PRINT DEC VAR1 , " "                                ' Display the reading   
GOTO Loop                                           ' Repeat the process.    

Notes PULSIN acts as a fast clock that is triggered by a change in state (0 or 1) on the specified pin. 
When the state on the pin changes to the state specified, the clock starts counting. 
When the state on the pin changes again, the clock stops. 
If the state of the pin doesn't change (even if it is already in the state specified in the PULSIN instruction), the clock won't trigger. PULSIN waits a maximum of 0.65535 seconds for a trigger, then returns with 0 in variable.    
The variable can be either a WORD or a BYTE . If the variable is a word, the value returned by PULSIN can range from 1 to 65535 units.    
The units are dependant on the frequency of the crystal used. If a 4MHz crystal is used, then each unit is 10us, while a 20MHz crystal produces a unit length of 2us.    
If the variable is a byte and the crystal is 4MHz, the value returned can range from 1 to 255 units of PULSIN always uses a 16-bit timer. 
When your program specifies a byte, PULSIN stores the lower 8 bits of the internal counter into it. Pulse widths longer tlow readings with a byte returns a reading of 256 with a word variable and 0 with a byte variable.  
Quinna
Inlägg: 24
Blev medlem: 6 mars 2011, 13:55:57

Re: PIC-varvtäknare modell F1

Inlägg av Quinna »

Exakt... Och som jag förstår när jag läser den beskrivningen på PULSIN så tycker jag att det verkar som att den fungerar ungefär likadant som CCP. Eller är jag helt off?

Jo, jag förstod att TIMER-funktionen har en "egen" pinne eller vad man ska säga.

Såhär får jag till det i Proton när jag "översätter" bos exempel:

Kod: Markera allt

Dim TIMER1 As TMR1L.Word       '.Word-funktionen slår ihop TMR1H och TMR1L till ett 16bit register
Dim Old_Value As Word             'Deklarerar Old_Value som variabel
Dim Pulse_Time As Word           'Deklarerar Pulse_time som variabel


TIMER1 = 0                    'Sätter variabeln TIMER1 till 0
Old_Value = 0                 'Sätter variabeln Old_Value till 0
Pulse_Time = 0                'Sätter variabeln Pulse_Time till 0
CCPR1 = 0                      'Sätter CCPR1 till 0

Loop:

On_Interrupt GoTo InterruptLoop:

InterruptLoop:

Pulse_Time = CCPR1 - Old_Value
Old_Value = TIMER1
TIMER1 = 0

GoTo Loop
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: PIC-varvtäknare modell F1

Inlägg av bearing »

Som sagt... den ena är mjukvara och blockerar programmet under mätningen, den andra är hårdvara och gör allting parallellt med programmet. Stor skillnad "bakom fasaden", men antagligen ingen skillnad för dig.

Mjukvaran läser antagligen pinnen i en loop som är 10 klockcykler lång, vilket är anledningen till att upplösningen är 10 mikrosekunder med 4MHz klocka, dvs 1 MHz instruktionsfrekvens.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC-varvtäknare modell F1

Inlägg av Icecap »

Och den är definitivt inte som en Capture-enhet! Den mäter pulsbredden - vilket du inte har en skit att använda till, du behöver tiden mellan 2 pulser!

Pulsein kan du alltså direkt skrota.
Skriv svar