18F14K22 simulatie werk wel, in het echt niet

Ben ik weer, met waarschijnlijk weer een stomme fout...

Ik heb een 18F14K22 met een snelle pulse output voor een project die ik simuleer met Proteus. Dat werkte prima, dus het PICje geprorammeerd en op een breadboardje geplaatst.
Maar je raad het al... Daar doet ie niks.

code:


Device 18F14K22        
Config_Start
    FOSC = ERC 
    PLLEN = On 
    PCLKEN = OFF 
    FCMEN = OFF 
    IESO = OFF
    PWRTEN = OFF 
    BOREN = OFF
    BORV = 30 
    WDTEN = OFF 
    WDTPS = 64
    MCLRE = OFF 
    HFOFST = OFF
    STVREN = OFF 
    LVP = Off
    BBSIZ = OFF	
    XINST = Off	
    Cp0 = OFF
    CP1 = OFF 
    CPB = OFF 
    CPD = OFF 
    WRT0 = OFF 
    WRT1 = OFF 
    WRTB = OFF 
    WRTC = OFF 
    WRTD = OFF 
    EBTR0 = OFF
    EBTR1 = OFF 
    EBTRB = OFF
Config_End
Xtal 64
All_Digital TRUE

OSCCON = %01100010
OSCTUNE.6 = 1

TRISB = %00000000
TRISC = %00000011

Symbol STARTBUT = PORTC.0
Symbol STOPBUT = PORTC.1
Symbol PWRLED = PORTC.4
Symbol RDYLED = PORTC.5
Symbol PULS = PORTB.7
Dim A As Word
Dim B As Word
B = 5

DelayMS 500
High PWRLED

' --- Standby mode ---
standby:
Toggle RDYLED
DelayMS 250
If STARTBUT = 0 Then
    GoTo safetyloop
EndIf
GoTo standby

' --- Safety loop of 5 seconds before running ---
safetyloop:
For A = 0 To 50
    If STOPBUT = 0 Then
        GoTo endloop
    EndIf
    Toggle RDYLED
    DelayMS 100    
Next A
High RDYLED
GoTo pulseloop

' --- Pulse loop ---
pulseloop:
If STOPBUT = 0 Then
    GoTo endloop
EndIf
Toggle PULS
For A = 1 To B
    DelayUS 1
Next A
GoTo pulseloop

' --- Stop ---
endloop:
Low PULS
GoTo standby

End

Simpel start en stop knopje als input via een pullup weerstand aan de 5V. Knopje zet de poort laag bij indrukken.
Ik heb er een extra LED tussen gezet (PWRLED) die aan moet gaan op het moment dat de PIC spanning krijgt, zoals te zien is in het programma, maar zelfs dat doet ie al niet, en in Proteus wel.
Er hangt een oscillator aan van 64MHz.

Ik doe uiteraard iets enorm fout, maar zie zo niet wat...
Iemand een idee ?

In the beginning there was nothing, but even that exploded
Arco

Special Member

Voor inputs gebruik je PORTx, maar voor outputs moet je LATx gebruiken... (maar dat zal het probleem niet zijn)
Oscillator van 64MHz kan niet, met PLL_ON krijg je dan 256MHz!
De simulator zal wel geen rekening houden met de fysieke (snelheids)beperkingen van de MCU, da's aan de programmeur... ;)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 31 december 2016 15:56:32 schreef Arco:
Oscillator van 64MHz kan niet, met PLL_ON krijg je dan 256MHz!

Ik had juist met PLLEN op OFF problemen met de simulatie. Daarom had ik die op ON gezet.
Dus als ik een externe oscillator gebruik en ik 64MHz wil gebruiken moet ik PLLEN toch gewoon op OFF zetten ?

Gaan we proberen...

In the beginning there was nothing, but even that exploded
Arco

Special Member

Ik weet niet of de externe oscillator direct op 64MHz kan. Meestal gebruikt men 16MHz plus de PLL. (geeft ook een stuk minder EMC uitstraling)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Gelukkig nieuwjaar allemaal...
Ik denk dat ik gek geworden ben...

Heb LATx gebruikt ipv Portx, en PLL veranderd, maar nog steeds niks.

Ik gebruik mijn oude JDM programmer voor de 18F14K22 omdat de Wisp648 deze niet ondersteund (krijg ik elk geval een fout dat de target niet compatible is).
Om even snel te testen of de programmer nog lekker werkt even snel een 16F628A met een knipperend LEDje geprobeerd, maar ook dat deed niks.
Breadboard gaar ? Dus de LED rechtsteeks aan de PIC gesoldeerd en 2 draadjes voor de spanning... Helaas.
Andere 16F geprobeerd met de JDM, niks.
16F met de Wisp geprogrammeerd, niks.
Ander breadboard, niks.
LEDje is goed, werkt.
Andere PSU geprobeerd (allebij gewoon werkend), niks.

Er gaat ergens iets hopeloos fout, maar ik ben nu totaal de kluts krijt waarom zelfs een simpele 16F al niet meer werkt ??

Even om mijn geestelijke gesteldheid gerust te stellen. Het programma zou normaal gesproken nu goed moeten zijn ?
Of moet ik als ik een external osc van 16 eraan hang de XTAL ook op 16 zetten ?

code:


Device 18F14K22        
Config_Start
    FOSC = HS 
    PLLEN = OFF 
    PCLKEN = OFF 
    FCMEN = OFF 
    IESO = OFF
    PWRTEN = OFF 
    BOREN = OFF
    BORV = 30 
    WDTEN = OFF 
    WDTPS = 64
    MCLRE = OFF 
    HFOFST = OFF
    STVREN = OFF 
    LVP = Off
    BBSIZ = OFF	
    XINST = Off	
    Cp0 = OFF
    CP1 = OFF 
    CPB = OFF 
    CPD = OFF 
    WRT0 = OFF 
    WRT1 = OFF 
    WRTB = OFF 
    WRTC = OFF 
    WRTD = OFF 
    EBTR0 = OFF
    EBTR1 = OFF 
    EBTRB = OFF
Config_End
Xtal 64
All_Digital TRUE

OSCCON = %01100010
OSCTUNE.6 = 1

PORTB = %00000000
PORTC = %00000011
LATB = %00000000
LATC = %00000011

Symbol STARTBUT = PORTC.0 ' START button
Symbol STOPBUT = PORTC.1 ' STOP button
Symbol PWRLED = LATC.4 ' Power LED
Symbol RDYLED = LATC.5 ' Ready LED / Status LED
Symbol PULS = LATB.7 ' Pulse output
Dim A As Word
Dim B As Word
B = 5

DelayMS 500
High PWRLED

' --- Standby mode ---
standby:
Toggle RDYLED
DelayMS 250
If STARTBUT = 0 Then
    GoTo safetyloop
EndIf
GoTo standby

' --- Safety loop of 5 seconds before running ---
safetyloop:
For A = 0 To 50
    If STOPBUT = 0 Then
        GoTo endloop
    EndIf
    Toggle RDYLED
    DelayMS 100    
Next A
High RDYLED
GoTo pulseloop

' --- Pulse loop ---
pulseloop:
If STOPBUT = 0 Then
    GoTo endloop
EndIf
Toggle PULS
For A = 1 To B
    DelayUS 1
Next A
GoTo pulseloop

' --- Stop ---
endloop:
Low PULS
GoTo standby

End
In the beginning there was nothing, but even that exploded
diebobo

Golden Member

Ik kan je maar beperkt helpen op het moment.. Maar mijn Config die ik gebruik voor 64mHz met de INTERNE osc.

pic basic code:

Xtal = 64   ' = 16 mhz interne OSC * 4 PLL

Config_Start
    FOSC = IRC ;HS	; Internal RC oscillator
    PLLEN = On ; PLL is under software control
    PCLKEN = OFF ; Primary clock is under software control
    FCMEN = OFF ; Fail-Safe Clock Monitor disabled
    IESO = Off ; Oscillator Switchover mode enabled
    PWRTEN = Off ; PWRT enabled
    BOREN = Off ; Brown-out Reset enabled and controlled by software (SBOREN is enabled)
    BORV = 30 ; VBOR set to 2.2 V nominal
    WDTEN = OFF ; WDT is controlled by SWDTEN bit of the WDTCON register
    WDTPS = 64
    MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
    HFOFST = On ; The system clock is held off until the HF-INTOSC is stable.
    STVREN = Off ; Stack full/underflow will cause Reset
    LVP = Off	; Single-Supply ICSP enabled
    BBSIZ = OFF	; 1kW boot block size
    XINST = Off	; Instruction set extension and Indexed Addressing mode enabled
    Cp0 = Off	; Block 0 code-protected
    CP1 = Off ; Block 1 (002000-003FFFh) code-protected
    CPB = Off ; Boot block (000000-0007FFh) code-protected
    CPD = Off ; Data EEPROM code-protected
    WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected
    WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected
    WRTB = OFF ; Boot block (000000-0007FFh) not write-protected
    WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
    WRTD = OFF ; Data EEPROM not write-protected
    EBTR0 = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
    EBTR1 = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
    EBTRB = OFF ; Boot block (000000-0007FFh) not protected from table reads executed in other blocks
Config_End

            '  76543210        
OSCCON      = %01110000 ' 16MHz, Internal oscillator  ' Bit 1 en 0 moeten allebei op 0 staan om PPL te KUNNEN activeren.
OSCTUNE.6   = 1         ' Daadwerkelijk PLL Activeren
Arco

Special Member

@TS: In je code staat de clocksource op 8MHz (*4) interne oscillator, dus kristal eraan hangen is zinloos dan.
Instellen van PORTB/C is ook zinloos, omdat LATB/C dat weer overschrijft. (ik zou de datasheet toch eens goed doorlezen)
XTAL moet ingesteld op de frequentie na de PLL, dus in dit geval 32MHz.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Heb alles nog een keer nagelopen...
De JDM programmer, mijn breadboard en power supply zijn toch gewoon goed. Allemaal getest met een 16F628A.
Geen garantie natuurlijk dat de JDM programmer ook goed werkt met de 18F, maar daar moeten we maar even vanuit gaan, zolang de Wisp de 18F14K22 niet ondersteund.

Op 1 januari 2017 10:17:32 schreef diebobo:
Ik kan je maar beperkt helpen op het moment.. Maar mijn Config die ik gebruik voor 64mHz met de INTERNE osc.

Dat heb ik nu ook geprobeerd, om de externe clock even weg te laten, maar dat maakt niks uit.
Het lijkt wel of het programma gewoon niet start ?

In the beginning there was nothing, but even that exploded

Ik heb dit programma er nu in geladen.
Een simpel knipperend LEDje op C4 en een LED die meteen aan gaat (om te testen of de PIC überhaupt iets doet) op C5.

code:

Device 18F14K22        
Config_Start
    FOSC = IRC 
    PLLEN = On 
    PCLKEN = OFF 
    FCMEN = OFF 
    IESO = OFF
    PWRTEN = OFF 
    BOREN = OFF
    BORV = 30 
    WDTEN = OFF 
    WDTPS = 64
    MCLRE = OFF 
    HFOFST = On
    STVREN = OFF 
    LVP = Off
    BBSIZ = OFF	
    XINST = Off	
    Cp0 = OFF
    CP1 = OFF 
    CPB = OFF 
    CPD = OFF 
    WRT0 = OFF 
    WRT1 = OFF 
    WRTB = OFF 
    WRTC = OFF 
    WRTD = OFF 
    EBTR0 = OFF
    EBTR1 = OFF 
    EBTRB = OFF
Config_End
Xtal 64
All_Digital TRUE

OSCCON = %01110000
OSCTUNE.6 = 1

LATC = %00000000

High LATC.5
DelayMS 500

loop:

Toggle LATC.4
DelayMS 250
GoTo loop

End

Resultaat:
C5 is aan, verder gebeurd er niks...

In the beginning there was nothing, but even that exploded
diebobo

Golden Member

Normaal als de kloksnelheid niet goed staat werkt het wel maar kloppen de delays niet.

Maar kijk eens naar je OSSCON en kijk dan eens naar de datasheet. Je hebt m nu ingesteld op 8mHz. Ook met PLL actief wordt dat geen 64mHz, die zal je dus op zijn minst op 16 moeten zetten. Daarnaast zeg je dat je een extern crystal hebt aangesloten maar je FOSC staat op IRC en dat is de Interne Osc dacht ik..

Ook heb ik in mijn opmerkingen dit gezet : ' 16MHz, Internal oscillator ' Bit 1 en 0 moeten allebei op 0 staan om PPL te KUNNEN activeren. .. Dat zal ik destijds niet voor niks hebben gedaan. Bij jou staat deze op 10 en niet op 00.

Op 2 januari 2017 10:41:42 schreef diebobo:
Daarnaast zeg je dat je een extern crystal hebt aangesloten maar je FOSC staat op IRC en dat is de Interne Osc dacht ik..

Ik heb die nu in mijn test programmatje inderdaad op interne clock gezet om te kijken of er überhaupt iets gebeurd... Dan kan ik de externe oscillator uitsluiten in mijn test setup.

In the beginning there was nothing, but even that exploded
Sine

Moderator

Moet dat ding zo snel zijn ?

Met al die delays er in vermoed ik van niet.

Op 2 januari 2017 11:00:48 schreef Sine:
Moet dat ding zo snel zijn ?
Met al die delays er in vermoed ik van niet.

Nogmaals, dit is een test programma, omdat het originele programma niet wilde werken.
In het originele programma zit ik met microseconden en hoge frequenties op een output.

In the beginning there was nothing, but even that exploded

Je moet in ieder geval altijd de Fosc goed configureren.
Dus voor een externe oscillator EC, voor een kristal/resonator HS en voor de interne klok INTRC. (een oscillator is niet hetzelfde als een kristal/resonator).
OSCCON, bits 4-6, en OSCTUNE hebben alleen betekenis voor INTRC.
PLLEN heeft betrekking op alles, maar de chip kan niet sneller dan 64 MHz. PLLEN werkt bij INTRC alleen op een interne klok van 8 of 16 MHz.
Als je de oscillator configureert op INTRC lijkt het me verstandig dat je er geen externe oscillator of kristal/resonator aan hangt.

Tenslotte, hopelijk overbodig, XTAL wordt door de compiler gebruikt voor tijdsafhankelijke berekeningen, zoals delays en de UART.

Just find out what you like and let it kill you

Op 2 januari 2017 13:07:31 schreef hadv:
Als je de oscillator configureert op INTRC lijkt het me verstandig dat je er geen externe oscillator of kristal/resonator aan hangt.

Ik heb nu in mijn test setup alleen de 18F en 2 LEDjes (met weerstand uiteraard). En dan het korte test programma.
1 LEDje meteen aan, en de andere knipperen.
Maar zelf dat lijkt al niet te werken, dus er zit meer fout in het programma.
Iets in de config over het hoofd gezien misschien ?

In the beginning there was nothing, but even that exploded
diebobo

Golden Member

Heb je al iets veranderd aan je programma ? Ikzelf en hadv hebben al aangegeven dat zoiets je het nu ingesteld hebt in ieder geval niet goed is.

Arco

Special Member

Volgens mij moet deze hexfile werken. (kan niet proberen, heb geen k22 controllers). MB source:

code:


program LED_Blinking

Symbol PWRLED = LATC.4
Symbol RDYLED = LATC.5

main:
  TRISC   = 0
  LATC    = 0
  PWRLED  = 1
  OSCCON  = %01100010
  OSCTUNE = %01000000
  while TRUE
    RDYLED = 1
    Delay_ms(500)
    RDYLED = 0
    Delay_ms(500)
  wend
end.
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 2 januari 2017 14:39:36 schreef Arco:
Volgens mij moet deze hexfile werken. (kan niet proberen, heb geen k22 controllers). MB source:

Werkt wel, maar niet zoals verwacht.
Net als bij mijn eigen programma is de ene LED gewoon aan.
De andere LED knippert inderdaad met jouw programma wel, maar veel te langzaam. Lijkt op halve snelheid of misschien zelf 1/4 snelheid te knipperen.

Heb overigens het test programma aangepast aan de hand van de config van "diebobo", maar blijft het zelfde resultaat.
Lijkt alsof er na de eerste delay van 500ms niks meer gebeurd.

In the beginning there was nothing, but even that exploded
Arco

Special Member

Knipper tempo is niet zo belangrijk (zal wel iets in de clocksetting verkeerd staan), het gaat erom dat alles nu wel werkt...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 2 januari 2017 13:58:01 schreef diebobo:
Heb je al iets veranderd aan je programma ? Ikzelf en hadv hebben al aangegeven dat zoiets je het nu ingesteld hebt in ieder geval niet goed is.

Ik heb nu de config het zelfde als bij jouw code, maar resultaat blijft het zelfde.
Als aangegeven in andere post, lijkt alsof er na de eerste delay niks meer gebeurd, of dat het command "delayms" ervoor zorgt dat het programma stopt.
Ik heb de delay van 500ms eruit gehaald, zodat het programma meteen naar Toggle LATC.4 gaat, en dan gaat inderdaad de 2e LED ook aan.
Maar verder gebeurd er dus niks omdat er dan weer een delay komt.

Erg raar.
Heb met diverse PICje gewerkt (alleen 10F, 12F en 16F) en nooit problemen gehad.

Deze verzet zich daarentegen behoorlijk...

In the beginning there was nothing, but even that exploded
Arco

Special Member

Clock stond verkeerd, aangepast.

[edit]
Heb je de interne oscillator wel op 8MHz staan? Moet volgens datasheet als PLL aan staat:

PLLEN: Frequency Multiplier PLL bit
1 = PLL enabled (for HFINTOSC 8 MHz only)
0 = PLL disabled

[Bericht gewijzigd door Arco op maandag 2 januari 2017 17:17:12 (77%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
diebobo

Golden Member

Probeer onderstaande code eens.. Naast hetgeen ik eerder stuurde zit er hier ook nog het een en ander aan IO instellingen bij (ANSEL) in combinatie met je Test Led Stukje.. Dit zou toch echt moeten werken.

pic basic code:


Device 18F14K22

Xtal = 64   ' = 16 mhz interne OSC * 4 PLL

Config_Start
    FOSC = IRC ;HS	; Internal RC oscillator
    PLLEN = On ; PLL is under software control
    PCLKEN = OFF ; Primary clock is under software control
    FCMEN = OFF ; Fail-Safe Clock Monitor disabled
    IESO = Off ; Oscillator Switchover mode enabled
    PWRTEN = Off ; PWRT enabled
    BOREN = Off ; Brown-out Reset enabled and controlled by software (SBOREN is enabled)
    BORV = 30 ; VBOR set to 2.2 V nominal
    WDTEN = OFF ; WDT is controlled by SWDTEN bit of the WDTCON register
    WDTPS = 64
    MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
    HFOFST = On ; The system clock is held off until the HF-INTOSC is stable.
    STVREN = Off ; Stack full/underflow will cause Reset
    LVP = Off	; Single-Supply ICSP enabled
    BBSIZ = OFF	; 1kW boot block size
    XINST = Off	; Instruction set extension and Indexed Addressing mode enabled
    Cp0 = Off	; Block 0 code-protected
    CP1 = Off ; Block 1 (002000-003FFFh) code-protected
    CPB = Off ; Boot block (000000-0007FFh) code-protected
    CPD = Off ; Data EEPROM code-protected
    WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected
    WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected
    WRTB = OFF ; Boot block (000000-0007FFh) not write-protected
    WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
    WRTD = OFF ; Data EEPROM not write-protected
    EBTR0 = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
    EBTR1 = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
    EBTRB = OFF ; Boot block (000000-0007FFh) not protected from table reads executed in other blocks
Config_End

            '  76543210        
OSCCON      = %01110000 ' 16MHz, Internal oscillator  ' Bit 1 en 0 moeten allebei op 0 staan om PPL te KUNNEN activeren.
OSCTUNE.6   = 1         ' Daadwerkelijk PLL Activeren

ANSEL       = %00000000 ' Analoge kanalen instellen = 1, 0 = digitaal
ANSELH      = %00000000 ' Idem

All_Digital TRUE          ;Alle ingangen digitaal

            ;  76543210
PORTA       = %00000000 
PORTB       = %00000000 
PORTC       = %00000000 

TRISA       = %00000000 ;
TRISB       = %00000000 ;
TRISC       = %00000000 ; 

High LATC.5
DelayMS 500

loop:


Toggle LATC.4
DelayMS 250
GoTo loop

End
Arco

Special Member

@diebobo: volgens datasheet mag interne osc. + PLL alleen op 8MHz (zie boven)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
diebobo

Golden Member

Op 2 januari 2017 19:16:16 schreef Arco:
@diebobo: volgens datasheet mag interne osc. + PLL alleen op 8MHz (zie boven)

Wauw, bijzonder... Ik zie het staan, ik neem dat het een copy/paste is ? Nu is een "oh bij mij werkt het al 2 jaar" niet echt een goede graadmeter of iets mag of niet, maar toch het werkt al 2 jaar :D.. Datasheet is tegenstrijdig : http://ww1.microchip.com/downloads/en/DeviceDoc/41365E.pdf

In de summary bovenaan staat :

• Precision 16 MHz Internal Oscillator Block:
- Factory calibrated to ± 1%
- Software selectable frequencies range of
31 kHz to 16 MHz
- 64 MHz performance available using PLL –
no external components required

Dat interpreteer ik een beetje als Interne Osc.

Verderop staat :

• A Phase Lock Loop (PLL) frequency multiplier,
available to both the high-speed crystal and internal
oscillator modes, which allows clock speeds of
up to 64 MHz. Used with the internal oscillator, the
PLL gives users a complete selection of clock
speeds, from 31 kHz to 32 MHz – all without using
an external crystal or clock circuit..

Dus weer 32mHz :/

En in de OSCCTUNE Register staat :

bit 6 PLLEN: Frequency Multiplier PLL bit
1 = PLL enabled (for HFINTOSC 8 MHz and 16 MHz only)
0 = PLL disabled

Ik neem aan dat dit je Copy/Paste stukje was waar alleen 8 mHz stond ? Of ik lees het verkeerd maar met deze tekst zou het dan weer wel mogen toch ?

Arco

Special Member

Misschien heb ik hier een oudere datasheet en is het veranderd?...

[edit]
Ik zie dat ik de 'B' versie heb en jij de 'E'. Ik zal ook de nieuwe eens downloaden... ;)

[Bericht gewijzigd door Arco op maandag 2 januari 2017 19:41:18 (43%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com