Heb een probleem met de MCLR_PIN van een PIC16F877.
Als het programma draaid wordt het af en toe zomaar gereset, heb daar nog nooit last van gehad.

De pin ligt via een 10K weerstand aan de 5VDC (pull_up), en via 100nF aan de GND. Het gaat toegepast worden in een industriële omgeving. Hoe krijg ik de pin ongevoeliger?

Op 11 december 2010 19:40:33 schreef Lambiek:
Als het programma draaid wordt het af en toe zomaar gereset, heb daar nog nooit last van gehad.

In normale omstandigheden (geen 3-fasen draaibank, booglasapparatuur, etc. in de buurt) moet dat ruimm voldoende zijn. Ik vermoed dat je een ander probleem hebt, bv een stackunderflow (ik noem maar wat, ik heb geen aanwijzing dat het dat precies is).

Of een ondeugdelijke voeding. Of een ander hardware-euvel.

Neem een 2k2 of 3k3, of neem een 16f887. Die is pin-compatible en dan kun je MCLR uitzetten.

Hallo jongens.

Hier een stukje code, volgens mij is dit goed zo.
Heb met het programma verloop ook geen probleem, maar met de reset functie.




Device 16F877                          ; processor type

XTAL 10                                ; crystal 10 Mhz

ON_INTERRUPT timer

Config HS_OSC,_                        ; cristal groter dan 4MHz
       WDT_OFF,_                       ; Watchdog Timer Enable uit
       PWRTE_ON,_                      ; Power-up Timer Enable aan
       BODEN_OFF,_                     ; Brown-out Reset Enable uit
       LVP_OFF,_                       ; Low Voltage Programming uit
       CPD_OFF,_                       ; Memory Code Protection uit
       WRTE_ON,_                       ; Program Memory Write Enable aan
       DEBUG_ON,_                      ; In-Circuit Debugger Mode aan
       CP_OFF                          ; Code Protection uit
       
ALL_DIGITAL true                       ; Alle poorten digitaal

Symbol On  = 1                         ; 1 is hoog
Symbol off = 0                         ; 0 is laag

Symbol GIE = INTCON.7                  ; Enable interrupt
        
Symbol T0IF = INTCON.2                 ; TIMER0 interrupt vlag
Symbol T0IE = INTCON.5                 ; TIMER0 interrupt enabel
        
Symbol PS0  = OPTION_REG.0             ; Instelling prescaler
Symbol PS1  = OPTION_REG.1             ; Instelling prescaler
Symbol PS2  = OPTION_REG.2             ; Instelling prescaler
Symbol PSA  = OPTION_REG.3             ; Instelling oscillator
Symbol T0SE = OPTION_REG.4             ; Instelling puls H/L - L/H
Symbol T0CS = OPTION_REG.5             ; Instelling clock intern of extern

Symbol I_0 = PORTA.0                   ; Ingang_0
Symbol I_1 = PORTA.1                   ; Ingang_1
Symbol I_2 = PORTA.2                   ; Ingang_2
Symbol I_3 = PORTA.3                   ; Ingang_3
Symbol I_4 = PORTA.5                   ; Ingang_4
Symbol I_5 = PORTE.0                   ; Ingang_5
Symbol I_6 = PORTE.1                   ; Ingang_6
Symbol I_7 = PORTE.2                   ; Ingang_7

Symbol Q_0  = PORTB.0                  ; Uitgang_0
Symbol Q_1  = PORTB.1                  ; Uitgang_1
Symbol Q_2  = PORTB.2                  ; Uitgang_2
Symbol Q_3  = PORTB.3                  ; Uitgang_3
Symbol Q_4  = PORTB.4                  ; Uitgang_4
Symbol Q_5  = PORTB.5                  ; Uitgang_5
Symbol Q_6  = PORTD.2                  ; Uitgang_6
Symbol Q_7  = PORTD.3                  ; Uitgang_7
Symbol Q_8  = PORTD.4                  ; Uitgang_8
Symbol Q_9  = PORTD.5                  ; Uitgang_9
Symbol Q_10 = PORTD.6                  ; Uitgang_10
Symbol Q_11 = PORTD.7                  ; Uitgang_11
Symbol Q_12 = PORTC.3                  ; Uitgang_12
Symbol Q_13 = PORTD.0                  ; Uitgang_13
Symbol Q_14 = PORTD.1                  ; Uitgang_14
Symbol Q_15 = PORTC.7                  ; Uitgang_15
Symbol Q_16 = PORTC.6                  ; Uitgang_16
Symbol Q_17 = PORTC.5                  ; Uitgang_17
                                       
Dim puls As Bit                        ; Var_puls_1/10 sec
                   
Dim B_0 As Bit                         ; Var_bit_0
Dim B_1 As Bit                         ; Var_bit_1
Dim B_2 As Bit                         ; Var_bit_2
Dim B_3 As Bit                         ; Var_bit_3
Dim B_4 As Bit                         ; Var_bit_4
Dim B_5 As Bit                         ; Var_bit_5
Dim B_6 As Bit                         ; Var_bit_6
Dim B_7 As Bit                         ; Var_bit_7
Dim B_8 As Bit                         ; Var_bit_8
Dim B_9 As Bit                         ; Var_bit_9
Dim B_10 As Bit                        ; Var_bit_10
Dim B_11 As Bit                        ; Var_bit_11
Dim B_12 As Bit                        ; Var_bit_12
Dim B_13 As Bit                        ; Var_bit_13
Dim B_14 As Bit                        ; Var_bit_14
Dim B_15 As Bit                        ; Var_bit_15
Dim B_16 As Bit                        ; Var_bit_16
Dim B_17 As Bit                        ; Var_bit_17
Dim B_18 As Bit                        ; Var_bit_18
Dim B_19 As Bit                        ; Var_bit_19
                                                        
Dim TMR_1  As Word                     ; Timer1
Dim TMR_2  As Word                     ; Timer2
Dim TMR_3  As Word                     ; Timer3
Dim TMR_4  As Word                     ; Timer4
Dim TMR_5  As Word                     ; Timer5
Dim TMR_6  As Word                     ; Timer6
Dim TMR_7  As Word                     ; Timer7
Dim TMR_8  As Word                     ; Timer8
Dim TMR_9  As Word                     ; Timer9
Dim TMR_10 As Word                     ; Timer10
Dim TMR_11 As Word                     ; Timer11
Dim TMR_12 As Word                     ; Timer12
Dim TMR_13 As Word                     ; Timer13
Dim TMR_14 As Word                     ; Timer14
Dim TMR_15 As Word                     ; Timer15
Dim TMR_16 As Word                     ; Timer16
Dim TMR_17 As Word                     ; Timer17
Dim TMR_18 As Word                     ; Timer18
Dim TMR_19 As Word                     ; Timer19
Dim TMR_20 As Word                     ; Timer20
      
Dim VAL_TIMER As  Word                 ; Variabele waarde timer
Dim LIMITE_TIMER As Word               ; Variabele limite
                                 
GIE = 0                                ; Zet interrupt uit
                                  
GoTo instelling                        ; Ga naar instelling
              
; --------------------------------------------------------------------------
; INTERRUPT ROUTINE                    ; Plaats eerst de interrupt routine
; --------------------------------------------------------------------------

timer:                            

    Inc VAL_TIMER                      ; Increment waarde timer
    T0IF = 0                           ; Wis interrupt flag
    Context Restore

instelling:                            ; Instelling register
    PS0  = 0                           ; Prescaler bit_0
    PS1  = 0                           ; Prescaler bit_1
    PS2  = 1                           ; Prescaler bit_2
    PSA  = 0                           ; Prescaler toegewezen aan TIMER0
    T0SE = 0                           ; Trigger van laag naar hoog
    T0CS = 0                           ; Trigger door interne clock
                               
    LIMITE_TIMER = 3                   ; INT(2500000 /(256*32)) (puls_1/10 sec)
    VAL_TIMER = 0                      ; Variabele waarde timer is 0
                                                   
    TMR0 = 0                           ; Reset TIMER0
    T0IE = 1                           ; TIMER0 Interrupt enabel aan
    GIE  = 1                           ; Zet Interrupt aan
                          
            ;543210                    ; Hulpregel poort_A
    PORTA = %000000                    ; Maak poort_A laag
    TRISA = %111111                    ; Poort_A I/O
    
            ;543210                    ; Hulpregel poort_B
    PORTB = %000000                    ; Maak poort_b laag
    TRISB = %000000                    ; Poort_B I/O
    
            ;76543210                  ; Hulpregel poort_C
    PORTC = %00000000                  ; Maak poort_C laag
    TRISC = %00000000                  ; Poort_C I/O
    
            ;76543210                  ; Hulpregel poort_D
    PORTD = %00000000                  ; Maak poort_D laag
    TRISD = %00000000                  ; Poort_D I/O
    
            ;210                       ; Hulpregel poort_E
    PORTE = %000                       ; Maak poort_c laag
    TRISE = %111                       ; Poort_E I/O
    
;---------------------------------------    
; Zet - Uigangen, Timers, En Bits Laag
;---------------------------------------
    
    Q_0 = 0
    Q_1 = 0
    Q_2 = 0
    Q_3 = 0
    Q_4 = 0
    Q_5 = 0
    Q_6 = 0
    Q_7 = 0
    Q_8 = 0
    Q_9 = 0
    Q_10 = 0
    Q_11 = 0
    Q_12 = 0
    Q_13 = 0
    Q_14 = 0
    Q_15 = 0
    Q_16 = 0
    Q_17 = 0
    
    B_0 = 0
    B_1 = 0
    B_2 = 0
    B_3 = 0
    B_4 = 0
    B_5 = 0
    B_6 = 0
    
    TMR_1 = 0
    TMR_2 = 0
    TMR_3 = 0
    TMR_4 = 0
    TMR_5 = 0
    
;------------------     
; Hoofd programma 
;------------------       
                                                                  
MAIN:                                  

    While 1 = 1                                                         
  
    Include "Programma.bas"
                             
    Wend                           
 
End

@ Wouter.
Wat bedoel je hier mee (Ik vermoed dat je een ander probleem hebt, bv een stackunderflow)

@ Pros.
Heb er een schakelende voeding voor staan 5VDC en 24VDC.
Hardware is bij mijn weten ook ok, extra elco's en goed ontkoppeld.

@ bprosman.
Watcdog sttat ook uit.

@ Arco.
Als je 2K2 of 3K3 neemt krijg je dan geen probleem met programmeren?
De 16F887 zou kunnen, maar die wordt niet ondersteund door mijn programmer gebruik de K8076 van velleman.

Gebruik je de 16F887 zelf ook om de zelfde reden?

2k2 of 3k3 zou geen probleem met ICSP mogen geven. Wij gebruiken o.a. de 16LF870 in industrieele omgeving met veel motor storingen. Daar voldoet 6k8 en 100nF goed. Hangt ook af van de routing van de print en de behuizing.
(Wij gebruiken een geaarde diecast behuizing, en rf beads tussen alle kabels in-uitgaand)

@ Arco.
De hardware zit wel goed denk, alle in en output loopt via optocouplers omdat alle signalen 24VDC zijn, als output gebruik ik de DB680 die sturen dan de relais aan, en overal staan diode's over en alles is ontkoppeld.

Maar die weerstand waarde's ga ik proberen.

EDIT:
Die (rf beads tussen alle kabels in-uitgaand) ferietkernen heb je die op de print staan of zijn het losse waar je je aders door haald?

[Bericht gewijzigd door Lambiek op (21%)]

Op 11 december 2010 21:59:49 schreef Lambiek:
Wat bedoel je hier mee (Ik vermoed dat je een ander probleem hebt, bv een stackunderflow)

Als er iets mis gaat met de stack (de plek waar de return positie wordt opgeslagen als je goto aanroept), dan kunnen er letterlijk vage dingen gebeuren. Of je programma begint opeens ergens in het midden, of in het beste geval wordt de hele handel gewoon gereset.

Zonder de "Programma.bas" te posten, maakt het de geposte code vrij nutteloos om te kijken of er een stavk overflow mogelijk is.

Heb je je mclr aangesloten zoals beschreven in de ds op pagina 148 (figure 14-5)?

Geen oplossing voor je probleem, wel een opmerking.
In een industriële omgeving zou ik persoonlijk juist gebruik gaan maken van de watchdog om te voorkomen dat de boel vastloopt. Je moet er dan wel goed over nadenken wat de applicatie moet doen als de watchdog de boel reset, je wilt geen gevaarlijke situaties laten ontstaan!

Op 12 december 2010 09:56:37 schreef EdwinNadorp:
Zonder de "Programma.bas" te posten, maakt het de geposte code vrij nutteloos om te kijken of er een stavk overflow mogelijk is.

Heb je je mclr aangesloten zoals beschreven in de ds op pagina 148 (figure 14-5)?

Het programma.bas heb ik niet gemaakt, en weet ook niet of dat geplaatst mag worden zal het eens vragen.

Alleen R2 zit er niet tussen, R1 is nu 10K en C1 is 100nF. Zo heb ik het altijd gedaan zonder problemen.

Wat is aan te raden voor R2 2K2 ofzo?

@ KIF.
Het is nog even afwachten of het geheel geplaatst mag worden.

@ mbbneon.
Er kunnen geen gevaarlijke situaties ontstaan.

De pic heeft een 8-deep stack level. Max 4 kunnen er door de compiler zelf gebruikt worden lees ik op de site van picbasic dus heb je er 4 over om te nesten bijvoorbeeld.

Staat de boel al gesoldeerd op print of gebeurt dit op een breadboard?

Sluit de +5V zijde van de weerstand (10k is normaal ruim voldoende) eens direct aan pin 11 (VDD) van de PIC (zo kort mogelijke verbinding houden) en dus 100n naar GND.

Heb je de voeding van de PIC goed ontkoppeld (over beide VDD/Vss pinnen), dus een 100n condensator over de pinnen 11-12 en 31-32?
Bovenstaande regel niet negeren, gewoon uitvoeren omdat dit zo hoort en ook dit kan iets te maken hebben met het resetten van de PIC.

Voer bovenstaande eens uit en laat weten of het helpt.

Afhankelijk van de aard van eventuele stoorpulsen, kan een extra condensator van 1nF over de 100nF helpen.
(Meten met scoop o.i.d. op MCLR en VDD en je weet wat meer)
RF beads tussen de voedingslijnen helpt ook tegen in (en uit) gaande storingen...

Hoi Frits.

Alles staat al op de print, het stomme is dat ik dit al jaren gebruik en nog nooit last gehad heb.

Tekening is later gemmaakt, hier lijkt toch niets mis mee het is recht toe recht aan.

Zie hier:
http://www.uploadarchief.net/files/download/print-16f877.jpg

Oei,

Zo'n mooie antenne om de print heen is absoluut niet aan te raden!...

Op 12 december 2010 14:25:11 schreef Arco:
Afhankelijk van de aard van eventuele stoorpulsen, kan een extra condensator van 1nF over de 100nF helpen.
(Meten met scoop o.i.d. op MCLR en VDD en je weet wat meer)
RF beads tussen de voedingslijnen helpt ook tegen in (en uit) gaande storingen...

Heb ik gedaan, zie daar niets op wat lijkt op stoorpulsen.

Op 12 december 2010 14:36:06 schreef Arco:
Oei,

Zo'n mooie antenne om de print heen is absoluut niet aan te raden!...

Ja dat weet ik, maar als je bij iedere connector 5VDC en GND wil hebben en het is een enkelzijdige print moet je toch wat.

En als je die projecten wel eens ziet die op gaatjes print staan is dit nog heilig toch. Maar ben met je eens het kan beter.

Hmmm, ontkoppel condensatoren moet je niet zo ver weg zetten van de PIC, dan hebben ze al snel geen nut meer...
In cursus deel 1 staat meteen aan het begin al dat je de 100n ontkoppel condensatoren zo dicht mogelijk bij de PIC moet plaatsen.
Waarom heb jij ze zo ver van de PIC af geplaatst?
Heb je daar een reden voor?

Over MCLR:
Ik zie geen 10k pull-up weerstand op de print, alleen een component naar GND, ervan uitgaand dat dat de 100n reset condensator is?

@ Frits.

Nee daar is niet speciaal een reden voor, nooit bij stilgestaan denk.
gebruik dit al een jaar of acht zo, naar alle tevredenheid tot nu toe dan.

MCLR.
Het is precies andersom de weerstand staat er wel op (rechts naast de ICSP connector midden onder de twee andere weerstanden) de 100Nf condensator staat er niet op, maar hij zit er wel.

Probeer eens het volgende:
Aan de onderzijde van je print pin 11 met pin 32 verbinden (Vdd aan Vdd dus) en pin 12 aan pin 31 (Vss aan Vss dus).
Waarschijnlijk is er een te groot spanningsverschil tussen de voedings-pinnen onderling omdat je voedingsbanen helemaal om de print heen lopen (= afrader).

Dus aan de onderzijde van je print waar de PIC zit korte, rechte draden solderen van pin 11 naar 32 en één van pin 12 naar 31.

Ok, dat zal ik proberen. En dat ga ik zeker meenemen voor een hele nieuwe print. Bedankt voor de tip.

Hallo.

Het probleem lijkt opgelost, nu alles is ingebouwd werkt het naar behoren.

Toch aan iedereen die gereageerd heeft bedankt voor de tips, heb het meegenomen en heb een nieuwe print gemaakt.

http://www.uploadarchief.net/files/download/resized/industrie%20-%20controller.gif