Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

PIC16F628 is sneller met dezelfde kristal als F84?

Pagina: 1
Acties:

  • Oguz286
  • Registratie: Juni 2002
  • Laatst online: 17-11 12:21
Hallo iedereen,

Ik heb laatst een pic16f628 aangeschaft om daar eens mee te gaan stoeien en het eerste wat ik merkte is dat de timing niet hetzelfde is als mijn 16f84 op 4Mhz. Ik heb dus meerdere manieren geprobeerd om een halve seconde te delayen (wat heel goed werkt op de f84), maar niet op de 628. Bijde hebben een 4Mhz kristal en ik heb ook de interne rc osc van de 628 geprobeerd die ook op 4Mhz werkt en in beide gevallen telt ie sneller dan de 84. Zover ik weet draait alles wat op een pic16f84 draait ook op een 16f628 (uitzonderingen daargelaten natuurlijk). Weten jullie wat het kan zijn?

Verwijderd

Het zou inderdaad niets uit moeten maken, echter is je TS nogal magertjes.

Hoeveel scheelt het?
Gebruikte code?
Programmer(software)?
Gebruikte config word?

  • naftebakje
  • Registratie: Februari 2002
  • Laatst online: 19:33
Het interne kristal kan redelijk afwijken, daarom ook dat er een special calibratieregister is om deze iets sneller/trager te laten gaan.
Met een extern kristal moet de snelheid normaal erg goed gelijk liggen, grote temperatuursverschillen kunnen wel wat effect hebben, maar veel mag dat normaal niet schelen.

Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.


  • Oguz286
  • Registratie: Juni 2002
  • Laatst online: 17-11 12:21
Ok sorry, ik zal het wat duidelijker proberen aan te geven.

1. het scheelt een paar tiende van een seconde (hoeveel precies weet ik niet)
2.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
; A simple roomtimer
; Oguz Meteer <oguz286@gmail.com>
; 03-03-2006

    list p=16f628
    #include <p16f628.inc>
    #include "[O]P16F628.inc"
    ERRORLEVEL -302
    __CONFIG _INTRC_OSC_NOCLKOUT & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_OFF

f           EQU 1

CodeTemp    EQU 20h
Counter     EQU 21h
Delay       EQU 22h
    
    ORG 0x00

Main
    Bank1                       ; Selecteer Bank1
    clrf TRISA
    clrf TRISB
    movlw B'00000100'
    movwf OPTION_REG
    Bank0

    bcf STATUS, 0
    clrf PORTA
    clrf PORTB
    clrf Delay
    movlw 0x0D
    movwf PORTB
    
Loop1
    movlw 61
    movwf Counter
    rlf PORTB, f
Loop2
    btfss INTCON, T0IF
    goto Loop2
    bcf INTCON, T0IF
    decfsz Counter, f
    goto Loop2
    goto Loop1

    END

3. Software is IC-Prog
4. Woord is gewoon wat in de code staat (met en zonder XT_OSC

Edit:
Toelichting: ik zet een timer op met een prescaler van 1:32 en laat timer 0 (8-bit timer) tot 255 tellen, en dat laat ik dus 61 keer doen. Dat komt dan neer op 32*256*61 = ong 0.5 sec maar hij wijkt dus behoorlijk af (ik schat zo rond de 0.3 - 0.4 seconde).

[ Voor 19% gewijzigd door Oguz286 op 05-03-2006 21:41 ]


Verwijderd

Hallo,
Wat het natuurlijk ook kan zijn is dat de 628 bepaalde instructies in minder clockcycles kan afwerken dan de 84. Ik weet niet of het in dit geval zo is, maar ik programmeer veel op de 6809 van Motorola, en daar zijn er bv al veel verschillen tussen het storen van een waarde uit de accumulator naar een geheugenplaats met directe of geïndexeerde addresseringswerkwijze.

Je zou eigenlijk eens in de datasheet van die 2 controllers moeten kijken, en dan zien op hoeveel clockcycles ze de apparte instructies kunnen uitvoeren. Een verschil van 1 clockcycle kan al veel verschil geven als die instructie heel vaak moet worden uitgevoerd.

Zoek bv naar de branches, de store-instructies, etc. Het zou eigenlijk in alle instructies kunnen liggen.

Hope this helps
MvG
Jan

[ Voor 8% gewijzigd door Verwijderd op 05-03-2006 22:42 ]


Verwijderd

Nee, dat is niet van toepassing hier. Bijna alle PICs voeren 1 instructie per clockcycle uit. Ik gok dat er nog ergens een pre/postscaler fout ingesteld staat voor de timer die gebruikt wordt voor het interrupt, maar daar zou je de datasheets even op na moeten slaan.

  • Oguz286
  • Registratie: Juni 2002
  • Laatst online: 17-11 12:21
Nou ik ben er achter wat het probleem is... Ik ben veel te slordig geweest.

code:
1
movlw 61
laadt zoals je zou verwachten 61 in W. Maar dat doet ie bij mij dus niet, er wordt steeds een andere waarde geladen in W. Het moet zijn
code:
1
movlw .61
Dat punt zorgt ervoor dat het getal als een decimaal getal wordt behandeld et voila! Het werkt perfect.

Het vreemde is dat exact dezelfde code op een pic16f84(a) wel goed werkt. Er zit of een bug in de compiler of ik doe iets heel erg fout, maargoed het is nu wel opgelost.

Even voor de mensen die net nieuw zijn met mcu programmeren, of mensen die slordig zijn geweest zoals ik:

1. zet boven aan je code R=dec (als je standaard met decimale getallen wil werken)
of
2. zet er een punt voor (b.v. .61 voor decimale getallen)

Nu kan ik verder werken aan mijn project :D (ik open wel een topique wanneer ik het af heb :P)

[ Voor 19% gewijzigd door Oguz286 op 06-03-2006 14:20 ]

Pagina: 1