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?
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
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).
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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%)]
klein is fijn
Moderator
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.
EdwinNadorp
Koop hier uw kristallen bol - in 2008 ga ik m'n projecten afmaken, echt waar ....... nouja in 2009 dan ..... ehh 2010 ....
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.
theove
Take care to get what you like or you will be forced to like what you get
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.
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl
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.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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.
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl
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.
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl
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.
