De rekensnelheid van mijn pic 16f627 valt mij een beetje tegen. Ik kom uit op Ongeveer 81917 berekeningen per sec.
Klopt dit wel, ik dacht dat hij op 4 MHz zou lopen, of zit daar ook die gedeeld door 4 factor in?

Ik had namelijk even een test proggie gemaakt om 5 leds aan te sturen, en daar doet hij ongeveer 4 sec. over.
Wie kan mij daar even meer over vertellen?
Alvast bedankt, Fred

Misschien een horloge/aflees fout?

Proggie:

DEVICE 16F628A        ;Gebruik een 16F628A type 
                            ;MAAR IK GEBRUIK NU EEN 16F627
    
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF


PORTA = %00000000 
PORTB = %00000000 
     ;   76543210
TRISA = %11111111                   
TRISB = %11000000    
DIM x AS WORD            ; kan tot 65535 tellen


SYMBOL LED1 = PORTB.0        
SYMBOL LED2 = PORTB.1         
SYMBOL LED3 = PORTB.2         
SYMBOL LED4 = PORTB.3        
SYMBOL LED5 = PORTB.4        
SYMBOL LED6 = PORTB.5 
 begin:
 WHILE 1 = 1          

 HIGH LED6

REPEAT
x = x + 1
UNTIL x = 65534

IF LED4 = 1  THEN  HIGH LED5
IF LED3 = 1  THEN  HIGH LED4
IF LED2 = 1  THEN  HIGH LED3
IF LED1 = 1  THEN  HIGH LED2
HIGH LED1
IF LED5 = 1 THEN x = 0

IF x = 0 THEN LOW LED1
IF x = 0 THEN LOW LED2
IF x = 0 THEN LOW LED3
IF x = 0 THEN LOW LED4
IF x = 0 THEN LOW LED5






WEND

END                          

Edit: even met een online stopwatch gedaan, en toen kwam ik op 3,5 sec, dus dan kom je op 93620 loops per sec. Dus dat zou dan wel de 1MHz zijn he?!?!?! Of is het nog afhankelijk van hoe groot je programma is????
En als ik er nu eens een 20MHz kristal aan hang, wordt hij dan ook sneller?? Vlgns mij wel..

Op 25 februari 2009 23:16:10 schreef Fredjuhh:
Klopt dit wel, ik dacht dat hij op 4 MHz zou lopen, of zit daar ook die gedeeld door 4 factor in?

Waarom zou daar niet die faktor in zitten? Lees de datasheet.

Op 25 februari 2009 23:22:58 schreef Henry S.:
[...]
Waarom zou daar niet die faktor in zitten? Lees de datasheet.

Ohh niet zo aggresief hoor ;) Ik heb net voor het eerst in mijn leven een pic processor vast :) Ik kijk van mezelf op, dat ik er in 2 uur al een programma heb opgezet ;)
Vorige week wist ik nog niet eens het bestaan van die dingen, dus je kunt niet even verwachten dat ik nu ineens alles weet!!
Maar goed, ik had dus wel de juiste ideeen ;)

Zie ook mijn edit uit de vorige post :)

Op 25 februari 2009 23:27:23 schreef Fredjuhh:
[...]
Ohh niet zo aggresief hoor ;)

Gewoon een logische vraag ;)

Vorige week wist ik nog niet eens het bestaan van die dingen, dus je kunt niet even verwachten dat ik nu ineens alles weet!!

Maar het is wel een echte opzoekvraag.

Processorsnelheid is intern bepaald door een RC-netwerk, extern door X-tal/RC-netwerk/externe clock.

Snelheid varieert dus niet met de lengte van een programma of de stand van de maan.

De faktor 4 ligt ook voor al deze instellingen vast en is gebonden aan de manier hoe de uC de instructies verwerkt.

als je de pic op 4MHz clock dan voert hij 4 miljoen MACHIENETAAL bewerkingen per seconde uit ... sommige MACHIENETAAL instructies hebben 2 of meer clockticks nodig.

als jij een hogere taal gebruikt dan wordt een lijn ocde misschien vertaald in 2 ,5, 10 of zelfs wel honderden instructies.

als jij schrijft print "hello world" , x dan voert te processor makkelijk een paar honderd instructies uit.

Dat is bij de PIC niet waar F_E. De pic voert maar 1 miljoen machine taal instructies uit. De micro code moet eerst uit het gehegen gelezen worden daarna vertaalt dan moeten daarna eventueel nog data opgehaalt worden de instructie uitgevoerd op de data en het resultaat weggeschreven worden. Elke klok tik doet de pic wel wat maar eens in de 4 kloktikken wordt ook daadwerkelijk een instructie afgerond of 8 voor sommige.

Overigens is het commande high led of low led niet aan te bevelen. Met dit commando wordt de poort eerst nog even als output gezet ook al stond deze als output.

Med het commande led1 = 1 zet je hem ook hoog maar dan direkt zonder omwegen. Zo zet led1 = 0 de output weer laag.

Kijk alles begint op zijn plaats te vallen ;) die 0 en een die benleentje zegt wist ik van de picbasic curses :) Maar had dat in dit test proggie nog niet toegepast :(
Wat je het eerst leert onthoud je het best, dus moet dat weer afleren.

Maar als ik er dus een kristal van 20MHz aan hang dan wordt mijn klok dus 5MHz dus ongeveer 5000000 loops per seconden?

Je vergeet even dat er nog een compiler tussen zit. Direct in assembler kun je de snelheid maximaliseren.

En precies getimed met IRQ's.

Op 25 februari 2009 23:50:35 schreef benleentje:
Dat is bij de PIC niet waar F_E. De pic voert maar 1 miljoen machine taal instructies uit.

damn. mijn lage dunk van de pic valt nog lager ... ik dacht dat het ene 2 step machiene was en dat sommige in 1 tick konden. ( zoals bewerkingen in de registers van de processor. ) blijkbaar nit dus.
RISC my ass ... geef mij maar CISC met zoveeeeel mogelijk instructies. das minder werk voor mij :)

[Bericht gewijzigd door free_electron op (11%)]

@F_E, de 16-bit pic reeks (behalve de dsPIC30F en PIC24FJ) hebben idd 2clock cycles nodig voor 1instructie cycle.
(Die andere hebben, net zoals de 8-bitters 4clock cycles nodig voor 1instructie ;-)

Een AVR heeft 1 clockcycle nodig voor een instructie......>:)

Op 26 februari 2009 00:00:17 schreef Fredjuhh:
Maar als ik er dus een kristal van 20MHz aan hang dan wordt mijn klok dus 5MHz dus ongeveer 5000000 loops per seconden?

Tja, tenzij die loop conditional is, dan gaat er ook alweer tijd zitten in het checken daarvan.

Op 20 MHz draait het ding 5 miljoen assemby instructies per seconde af (program branches daargelaten), maar het equivalent in high-language instructies daarvan -kan- veel lager liggen.

Iets als PORTA=255; gaat in 1 instructie, maar als je pakweg 2 floating point getallen op elkaar wilt delen is het eerder 100, zo niet meer.

Als ik me goed herinner, doet een AVR wel 1 instructie (de meeste dan) per clockcycle. Nu gaan de meeste ook maar tot 16MHz, terwijl de meeste PICs met een kristal van 40MHz overweg kunnen, dacht ik. Het is al wel heel lang geleden dat ik iets met een PIC heb gedaan, dus ik kan er best naast zitten.

Daarbij heeft de TS binnen die loop 10 if statements (oftewel branch instructions). Nu is de pipeline van zo'n PIC natuurlijk niet zo groot, maar bij een gebrek aan branch prediction zal die wel regelmatig weggemikt kunnen worden (een zogenaamde pipeline stall).

De onderste 5 if-statements kunnen sowieso vervallen, door van de "IF LED5 = 1 THEN x = 0" een blok te maken. Daarbij kun je alle LEDs tegelijk uitzetten, door direct naar poort B te schrijven, maar dan kun je de LEDs niet meer naar andere pinnen mappen.

Je kunt het hele ding sowieso reduceren tot
PORTB = ( PORTB & 0xC0 ) | ( ( PORTB & 0x20 ? 0 : ( PORTB << 1 ) | 0x01 ) & 0x3F );

Dan heb je er nog maar 1 branch instructie in zitten. Toegegeven, veel leesbaarder wordt het niet. Het kan ook in meer regels, waardoor het leesbaarder wordt, met nog steeds maar 1 branch instructie.

Uitleg: neem eerst de hoogste 2 bits van PORTB, en kopieer die zonder ze te veranderen, controleer vervolgens of bit 5 hoog is, zo ja, vul dan de lage bits met 0, zo nee, schuif dan de lage bits 1 plaats naar links en zet een 1 in het laagste bitje. De laatste AND is om te voorkomen dat je de hoogste 2 bits van PORTB verschuift.

een PIC kan volgens datasheet met maximaal 20 MHz geklokt worden. (ik heb echter een PIC16F688 geklokt met 50 MHz, en dat loopt stabiel)
de instruction clock is 1/4 van de system clock (bij 20 MHz system clock dus 5 MHz instruction clock)
De meeste instructies hebben 1 klockcyclus nodig.
bij PIC12/PIC16 gelden de volgende uitzonderingen daarop:
- Goto: 2 klokcycli
- Call: 2 klokcycli
- Return/Retlw: 2 klokcycli
- BTFSC/BTFSS: 1-2 klokcycli, afhankelijk van de conditie.

Als je in C code gaat schrijven, dan moet je er van uit gaan dat je C-krompiler uit een enkele regel C-code meedere regels assembly maakt.
Dus om nou te zeggen dat een PIC die met 20 MHz (5 MHz instruction clock) 5.000.000 x per seconde een bepaalde regel C-code, of zelfs een hele lus uitvoert is wel heel erg kort door de bocht.

en voor een if-then-else constructie met variabelen van het type bool of char zijn in PIC-assembly toch wel al gauw een 5-tal machine-code instructies nodig. Ga je ints,floats en dergelijke vergelijken, dan wordt het al behoorlijk snel flink ingewikkelder, en zijn dus flink meer instructies nodig.

@free_electron:
een PIC12/16 is vergelijkbaar met een 8080/8085, geen hardware voor vermenidgvuldigen en delen aan boord (itt. de 8051, die een MUL en DIV kent)

Je vergeet retfie (2 cycli) en incfsz en decfsz (1 of 2 instructies, afhankelijk van de conditie)

Op 26 februari 2009 12:45:27 schreef DC2PCC:
een PIC kan volgens datasheet met maximaal 20 MHz geklokt worden.

Dat geldt voor de simpelere PIC's, de baseline en midrange PIC10/12/16: 20MHz, 5 MIPS.

Enhanced midrange (nieuw Q1/Q2 2009) PIC12F1xxx en PIC16F1xxx: 8 MIPS
PIC18: tot 64MHz, 10-16 MIPS

Dat zijn allemaal 8-bitters.

16-bitters: tot 40MHz, 16-40 MIPS
32-bitters: tot 80MHz, tot 125 Dhrystone MIPS

daarbij worden hogere interne snelheden (bijv 80MHz bij 16-bitters) dmv PLL gegenereerd.

Dit overzicht is niet compleet, zie www.microchip.com ;)

en de 32 bitters gaan tot 80Mhz onderhand.
ik ga denk ik zo;n testbordje ervan bestelen, is maar 50 euro ofzo.
maar als je echt snelheid wilt moet je een Arm nemen of een parallax propeller.
die laatste had dacht ik 8 cores, op max 80Mhz en haalde 160 MIPS.
allemaal leuk, maar voor het meeste grut is een simpel picje genoeg.

Bedankt voor alle antwoorden ;)
Het is niet de bedoeling dat ik dit programma ga gebruiken hoor :)
Dit was alleen even een testje voor mij, om te kijken of ik al wat kan programmeren, en natuurlijk even om te kijken hoe snel een pic bepaalde instructies kan doen.

Fred

[Bericht gewijzigd door Fredjuhh op (64%)]

Op 26 februari 2009 10:51:03 schreef shizzle dizzle:
Een AVR heeft 1 clockcycle nodig voor een instructie......>:)

en hoeveel clockpulsen in een cycle ? 200 ?

nee, ook 1. Een AVR op 20mhz doet 20MIPS. Op die paar instructies na dioe 2 kloktikken vragen. Ook een leuke: Attiny26 heeft een 16mhz interne klok (moet je even goed de datasheet voor lezen, PPLCLK oid fuse). Vind maar eens een PIC voor dezelfde prijs die dat heeft (met evenveel codespace, MIPS, en adc,pwm etc) :)

Ik gebruik zowel PIC als AVR, dus best of both worlds.

Dus die PIC heb je nog nooit gebruikt? :p

uhm, jawel. Picbasic progt lekker makkelijk :)

Op 26 februari 2009 19:06:54 schreef Fredjuhh:
Echter als je maar 15Hz hebt, moet je dus 1 Sec. meten voor 15 pulsen, dus kun je pas na 1 sec reageren, en dat is veel te laat.

Of de tijd meten tussen 2 pulsen...

Vind maar eens een PIC voor dezelfde prijs die dat heeft (met evenveel codespace, MIPS, en adc,pwm etc)

PIC24xxx? (40 MIPS)