Gezocht: iemand met verstand van PIC-programmeren.

Ik ben op zoek naar iemand die verstand heeft van pic's, en wel het programmeren in C. Ik heb een klein programma'tje van 20 regels, maar er zit een hyaat in. Volgens mij zie ik wat over het hoofd, maar ik weet niet wat....

--
CU, Rob - 52°8'21"N 4°44'34"E
www.gompy.net - www.news.gompy.net
Meet the BOFH - www.cam.gompy.net
NNTP-tool - www.nntptool.gompy.net
Reply to
Rob / gompy.net
Loading thread data ...

"Rob / gompy.net" schreef in bericht news:443d744e$ snipped-for-privacy@news.gompy.net...

Als het progje toch maar 20 regels heeft kan je het ook wel in de groep brengen. Leren we er mogelijk allemaal wat van.

Hans

Reply to
JT van Es

"JT van Es" schreef in bericht news:6b942$443d7723$3ec27b70$ snipped-for-privacy@news.chello.nl...

Dan maar meteen mijn vraag......waarom start de counter pas bij 1800 rpm ?

-------------------------------------------------------------- void main() {

const char tspark[]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 5, 5, 7, 7, 9, 9, 10, 12, 12, 12, 14, 14, 14, 17, 17, 17, 20, 20, 20, 22, 23, 25, 25, 28, 28, 31, 31, 34, 34, 37, 38, 40, 41, 44, 44, 44, 48, 48, 48, 51, 52, 52, 53, 56, 56, 57, 57, 61, 61, 62, 62, 63, 63, 63, 64, 64, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 106, 106, 107, 107, 108, 108, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 125, 125, 126, 126, 127, 127, 128, 128, 129, 130, 130, 131, 131, 132, 132, 133, 133, 134, 134, 135, 136, 136, 137, 137, 138, 138, 139, 140, 140, 141, 141, 142}; char tspk, i, spark, t0; TRISB = 0x02; // set RB1 for input, all others for output RB0=SCR RB4=Strobe PORTB = 0x11; //JMJ was 0x01 set gate to SCR high i.e pin 6 of PIC +strobe OPTION_REG = 0x06; // JMJ 128pre was 0x06 JMJ tmr0 SOURCE INT CLOCK, 1:64 PRESCALER TMR2 = 0; PR2 = 255; T2CON = 0x07; // start TMR2 counter 1:16 INTCON = 0; //20jmj was0 enable interrupt on timer overflow

// Following table is based on 360 degree timing arc & 40 deg starting arc (South pole of magnet triggers Hall switch) // table based on a polynomial and limits the min delay to 15 TMR2 cycles // the spark flag is a one shot to prevent continuous sparking on a Hall low signal

while(1) // loop forever { while(PORTB & 0x02) // wait for low pulse on Hall switch { spark = 1; } // North pole of magnet has passed while(spark) { t0 = TMR0; TMR0 = 0; // start new rev count tspk = tspark[t0]; // use table lookup for spark delay T2CON = 0x07; // start TMR2 counter 1:16 TMR2= 0; // clear spark timer while(TMR2 < tspk); // loop until timeout to send spark PORTB &= 0xee; // JMJ was 0xfe +strobe sends a ground to the SCR gate delay_us(56); //56 us delay PORTB |= 0x11; // JMJ was 0x01 +strobetake ground off the SCR spark = 0; } // end while spark loop } // end loop forever } // end of program

////Notes // // ; At a engine speed of 1200 RPM; // ; // ; 1200 / 60 = 20 revs per second // ; 1 / 20 = 50mS per rev // ; 1 rev = 360 degrees // ; // ; 36 degrees at 1200 RPM = (36 / 360) X 50 = 5mS // ; // ; 100uS loop time // ; 4MHz clock / 4 = 1MHz instruction cycle // ; cycle time = 1/1MHz = 100uS // ; 100uS/100uS = 100 cycles // ; prescaler set to divide by 4 // ; preset TMR0 = 231, when = 0 = 100uS // ; 231 to 255 = 25 x 4(prescaler) = 100

// ---O--- // RA2 o o RA1 // RA3 o o RA0 // RA4 o o RA7 // RA5 o o RA6 // VSS o o VDD // SCR RB0 o o RB7 // Hall input USART RX RB1 o o RB6 // Test hi/low USART TX RB2 o o RB5 // Test on/off RB3 o o RB4 Strobelight // -------

--
CU, Rob - 52°8'21"N 4°44'34"E
www.gompy.net - www.news.gompy.net
Meet the BOFH - www.cam.gompy.net
NNTP-tool - www.nntptool.gompy.net
Reply to
Rob / gompy.net

Wat bedoel je met "counter"? TMR0? TMR2?

Volgens jou loopt de hoofdcyclus met 100us (ik heb het allemaal niet gecontroleerd, ik neem aan dat het wel zal kloppen). Dan gebeurt er dit: t0 is een char. Dus geeft overflow bij te grote tijd, kan geen grote tijd meten. Wanneer: 256 * 100uS = 0.0256 seconde. Ofwel 1 / 0.0256 =

39 revs/seconde, ofwel 2434 rpm (geen 1800). Je hebt hier toch wel een probleem. Ik denk dat je motor alleen werkt als je flink veel gas geeft...

Ik weet niet welke processortje dit is, of ie interrupts etc heeft, maar wat ik anders zou doen: Je zorgt voor een 16 bit timer. Of run een losse (snelle) timerinterrupt routine met TMR0 die naar een 16 bit getal telt, die je dan weer gebruikt. Er zijn veel mogelijkheden dit te doen.

Pieter

Reply to
Pieter

"Pieter" schreef in bericht news: snipped-for-privacy@4ax.com...

Jep, dat is ook het probleem en inderdaad (net gemeten op de proefbank) zo rond de 2400 rpm. Zelfs het starten, trekstarter, is een kunst op zich ;o(

Ik gebruik een 16F628 waarvan ik dacht dat deze het wel aankon......? Ik ben totaal geen prgrammeur, dit heet ooit iemand voor mij in een paar minuten opgekalkt. Nadeel is, de persoon heb ik uit het oog verloren en kan dus niet even bij hem aankloppen.

--
CU, Rob - 52°8'21"N 4°44'34"E
www.gompy.net - www.news.gompy.net
Meet the BOFH - www.cam.gompy.net
NNTP-tool - www.nntptool.gompy.net
Reply to
Rob / gompy.net

"Rob / gompy.net" schreef in bericht news:443d795a$ snipped-for-privacy@news.gompy.net...

[snip]
[snip]

Ik lees een paar tegenstrijdige zaken, zoals 1:64 prescaler, maar ook "prescaler set to divide by 4" en TMR=0 in de code, en in de notes preset TMR0 = 231.

Verder heb ik me er totaal niet in verdiept, dus neem het met een korrel zout.

--
Thanks, Frank.
(remove 'q' and '.invalid' when replying by email)
Reply to
Frank Bemelman

"Frank Bemelman" schreef in bericht news:443d8573$0$20477$ snipped-for-privacy@dreader24.news.xs4all.nl...

CLOCK,

Prescaler is 128, was 64, was al door mij aangepast.....als ik het tenminste heb goed gedaan.....

--
CU, Rob - 52°8'21"N 4°44'34"E
www.gompy.net - www.news.gompy.net
Meet the BOFH - www.cam.gompy.net
NNTP-tool - www.nntptool.gompy.net
Reply to
Rob / gompy.net

"Rob / gompy.net" schreef in bericht news:443d86b6$ snipped-for-privacy@news.gompy.net...

tenminste

Waarom aangepast? En wat betekent TMR0 = 231 in de notes, als we dat nergens in het programma gebruikt zien?

Heb je een 8MHz crystal in plaats van 4MHz? De notes geven aan dat er een 4MHz crystal in gebruik zou zijn.

En welke compiler is er in gebruik? Hoe wordt de compiler op de hoogte gesteld van de clockfrequentie? Dat moet ergens geregeld zijn, anders kan de delay_us(56); ook weleens fout uitpakken.

Meer info is gewenst ;) Compiler, clockfrequentie?

--
Thanks, Frank.
(remove 'q' and '.invalid' when replying by email)
Reply to
Frank Bemelman

"Frank Bemelman" schreef in bericht news:443d8813$0$20476$ snipped-for-privacy@dreader24.news.xs4all.nl...

En waar is de code die voor void main() staat? Die is minstens zo belangrijk ;)

--
Thanks, Frank.
(remove 'q' and '.invalid' when replying by email)
Reply to
Frank Bemelman

"Frank Bemelman" schreef in bericht news:443d8879$0$20504$ snipped-for-privacy@dreader24.news.xs4all.nl...

Compiler is MicroC, klok 4 MHz intern

Ik wou dat ik het wist, maar zoals al aangegeven....ik ben totaal geen programmeur en al helemaal geen C. De aanpassing naar 128 heb ik gedaan op aanraden van iemand anders. Dit is de orginele code die weinig verschilt van de ander. Enige aanvulling is een output om de puls te meten.

-------------------------------------- void main()

const char tspark[]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 17, 17, 18, 18, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 27, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126};

char tspk, i, spark, t0; TRISB = 0x02; // set RB1 for input, all others for output PORTB = 0x01; // set gate to SCR high i.e pin 6 of PIC OPTION_REG = 0x06; // tmr0 SOURCE INT CLOCK, 1:64 PRESCALER

TMR2 = 0; PR2 = 255; T2CON = 0x07; // start TMR2 counter 1:16 INTCON = 0;

// Following table is based on 360 degree timing arc & 40 deg starting arc (South pole of magnet triggers Hall switch) // table based on a polynomial and limits the min delay to 15 TMR2 cycles

// the spark flag is a one shot to prevent continuous sparking on a Hall low signal

while(1) // loop forever { while(PORTB & 0x02) // wait for low pulse on Hall switch { spark = 1; } // North pole of magnet has passed while(spark) { t0 = TMR0; TMR0 = 0; // start new rev count tspk = tspark[t0]; // ; // use table lookup for spark delay T2CON = 0x07; // start TMR2 counter 1:16 TMR2= 0; // clear spark timer while(TMR2 < tspk); // loop until timeout to send spark PORTB &= 0xfe; // sends a ground to the SCR gate for(i=0; i< 6; i++) { asm nop; } PORTB |= 0x01; // take ground off the SCR spark = 0; } // end while spark loop

} // end loop forever } // end of program

--
CU, Rob - 52°8'21"N 4°44'34"E
www.gompy.net - www.news.gompy.net
Meet the BOFH - www.cam.gompy.net
NNTP-tool - www.nntptool.gompy.net
Reply to
Rob / gompy.net

Op

formatting link
staat de datasheet. Daar staat dat Timer0 8 bit is. Maar Timer 1 is 16 bit, deze zou je moeten gebruiken. Dan moet je je tabel aanpassen of het getal omrekenen, en waarschijnlijk de laagste bits weggooien (met een shift) omdat je anders coderuimte te kort komt. 16 bit geeft

65536*100uS = ongeveer 6.5 seconde, 0.15 revs/sec ofwel 9,1 rpm. Dat moet werken.

email me anders maar op snipped-for-privacy@NOSPAMhoeben.com zonder NOSPAM voor meer hulp.

Groeten, Pieter

Reply to
Pieter

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.