Programma Stack Overflow

S

SkeeterB08

Guest
kan iemand mij helpen?Ik heb een probleem met de code waar ik aan werk.Voor een tijdje was het schoppen uit het programma wanneer RA0 en RA1 waren beide laag.Ik
heb gespeeld met het nu en toen RA0 en RA1 zijn laag,
maar loopt een beetje geeft me een stack overflow fout op Pic Simulator IDE.Waar ga ik fout?Oh, en dat wat in het begin met errorlevel gooit me uit bij het opstellen van, dus heb ik het commentaar erop.

Hier is de logica van mijn schema schakeling

(Operatie)
Bovenste (RA0) Lagere Sensor (RA1) = 1 Dan Exploitatie (RB6) = 1; Warn (RB5) = 0; Refill (RB3, RB4) = 0
Opper-Sensor = 0 Lagere Sensor = 1 Dan Exploitatie = 1; Waarschuw = 1; Refill = 0

(Hervullen)
Upper Lower Sensor = 0 Then Exploitatie = 0; Waarschuw = Flashing; Refill = 1
Als Upper Sensor = 0 Then Exploitatie = 0, Warn = Knippert, Refill = 1
Als Upper Sensor = 1 Dan Exploitatie = 1; Waarschuw = 0; Refill = 0
(Einde Hervullen)

Hier
is de code, zoals het nu voorligt.Zijn voor de PIC16F628

Code:lijst p = 16F628; lijst richtlijn te definiëren processor

# include <p16f628.inc>; processor specifieke variabele definities

; Errorlevel -302; verbergen bancaire bericht

;*****

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _LVP_OFF

;*****

; interne OSC instellingen

;*****

"; __CONFIG 'Richtlijn wordt gebruikt voor het insluiten configuratie gegevens binnen. Asm bestand.

; De LABLES naar aanleiding van de richtlijn zijn gelegen in de respectieve. Inc bestand.

Zie de respectieve veiligheidsinformatieblad voor bijkomende informatie over de configuratie woord.;***** VARIABELE DEFINITIES

w_temp EQU 0x70; variabele context wordt gebruikt voor het opslaan

status_temp EQU 0x71; variabele context wordt gebruikt voor het opslaan

Count1 EQU 0X72; Eerste Counter for Delay Loops

Count2 EQU 0X73; Tweede Counter for Delay Loops;************************************************* *********************

ORG 0x000; processor reset vector

goto Start, ga naar het begin van het programma

;*****

ORG 0x004; interruptvector locatie

movwf w_temp; slaan uit de huidige W registreren inhoud

movf STATUS, w; verplaatsen status register in W register

movwf status_temp; slaan uit de inhoud van de status register

movf status_temp, w; ophalen kopie van STATUS register

movwf STATUS; herstellen pre-ISR STATUS register inhoud

swapf w_temp, f

swapf w_temp, w; herstellen pre-ISR W register inhoud

retfie; terugkeer uit onderbreken;*****

Start

clrf PORTA

clrf PORTB

MOVLW B'00000111 '

MOVWF CMCON; Zet vergelijkingslocatie

BSF STATUS, RP0; bank een

movlw 0xFF

movwf PORTA; Porta alle Input

movlw 0x00

movwf PORTB; portb alle Output

BCF STATUS, RP0; terug naar bank 0

;*****

movlw b'00000000 'Zie de datasheet van de voorkeur

movwf OPTION_REG; instellingen van OPTION_REG

BSF PORTB, 7; Zet de Power-LEDbtfss PORTA, 0; Controleer of Upper Sensor = 1

Goto Prestart; Als niet naar prestart subroutine

BSF PORTB, 6

Ga naar Uitvoeren

;*****Prestart

BSF PORTB, 5; Zet Waarschuwing LED

BSF PORTB, 4; Zet Refill LED

BSF PORTB, 3; Turn On Relay Sub-Circuit

btfsc PORTA, 0; Als Upper Sensor = 1

Ga naar Uitvoeren; Ga naar Operation ModeRennenbtfss PORTA, 0; Als Upper Sensor = 0

BSF PORTB, 5; Dan zet Waarschuwing LED

btfsc PORTA, 0; Als Upper Sensor = 1

decfsz Count1, 1; niet Decrement Counter 1

btfss PORTA, 1; Als Lagere Sensor = 0

oproep Refill; Go To Refill subroutine

btfsc PORTA, 1; Als Lagere Sensor = 0

decfsz Count2, 1; niet Decrement Counter2

goto RunRefill

BSF PORTB, 4; Zet Refill LED

BSF PORTB, 3; Zet Refill Sub-Circuit

btfsc PORTA, 0; Als Upper Sensor = 1

BCF PORTB, 3; Turn Off Refill Sub-Circuit

btfsc PORTA, 0; Als Upper Sensor = 1

BCF PORTB, 4; Zet Refill LED

btfsc PORTA, 0; Als Upper Sensor = 1

BCF PORTB, 5; Zet Waarschuwing LED

BSF PORTB, 6

goto Run;*****

EINDE

 
Het eerste wat u moet doen wanneer een interrupt optreedt, is het uitschakelen van interrupts door het "GIE" vlag.Als u dit niet doet, terwijl u zich in een interrupt routine (Program Counter waarde opgeslagen op een Stack niveau), kan het gebeuren dat een interrupt optreedt, in welk geval de nieuwe pc waarde wordt opgeslagen in de stack.Als dat gebeurt meer dan 8 keer (op een mid-range MCU) of 32 keer op PIC18F (en soortgelijke) MCU een stack overflow zal optreden.Uw interrupt routine niet lijkt te doen (anders dan het opslaan van W en Status en vervolgens ophalen), maar dat
is nog iets wat je moet altijd uitvoeren bij het gebruik van interrupts.

Ah, inderdaad, ik denk dat het probleem is met de "Refill" routine.U bent CALL-ing "Refill" maar dan in plaats van met behulp van RETURN u gebruik "GOTO" die geen pop de stack.Daarom, na 8 oproepen naar "Refill" uw stapel zal overflow.U moet ervoor zorgen dat u altijd een routine met RETURN als u CALL-ing is.

 
Ik dacht dat het was de REFILL subroutine, ik
ben nog steeds problemen om de code rechts en die fout is gemaakt toen ik geroepen dat subroutine.Ik
ben een totale newbie, en weten niet over deze onzin, maar ik probeer te schrijven van code, maar het gaat langzaam.In eerdere versies van mijn programma enigszins werkte, maar de lichten op het scherm de neiging te knipperen, want van mijn defecte code.Ik denk dat ik
ben langzaam krijgen, maar het kost tijd en veel werk.

 
Skeeter, u hoeft alleen maar te vervangen "GOTO Run" met "return".

Simpel gezegd,
het rendement is het tegenovergestelde van gesprek.Wanneer u een routine, de MCU daadwerkelijk "slaat" de huidige locatie (van het programma teller) in de stack, en vervolgens de opbrengst te doen wat de routine doet.Dan, wanneer het gaat om terug te keren, zal terugkeren naar de opgeslagen waarde van de program counter, waardoor de goedkeuring van de stack.

U bent constant CALL-gen, maar nooit daadwerkelijk terug te keren (in plaats, dat u gebruikt GOTO Run).

Er zijn twee manieren op te lossen.Ofwel vervang "CALL Refill" met "GOTO Refill" of vervang "GOTO Run" met "return".Als je er het laatste, moet u er nota van dat de "belangrijkste" bit programma zal blijven waar het was vóór de CALL-statement.In de eerste oplossing, zal het opnieuw starten van
de "Run" en daarna.Hier
is een afbeelding die uitlegt hoe "subroutines" werk.Kijk maar naar de eerste twee kolommen.Stel dat SUB1 is "Refill" en Main is
de "Run"

Credit goes to PicList.com website<img src="http://www.piclist.com/images/www/hobby_elec/gif/pic2_3.gif" border="0" alt=""/>
 
Dus dat is waar ik ging er mis?Ok, ik zal deze wijzigingen in mijn programma en test ze met OshonSoft
de Pic Simulator IDE.Mijn eerste poging van de oprichting van dit circuit zonder gebruik te maken van een microcontroller is een volslagen mislukking.Het gebruik van een 4093 en 4011 CMOS chips.Zij mij gevraagd om te proberen de PIC wanneer ik niet om de gewenste resultaten.Het is al een tijdje, maar ik denk dat ik ergens
ben je met dit programma.De meeste van de code is geschreven door mij, maar sommige van deze kwam van de hulp die ik
heb gekregen in de tijd.Sommige van het meer recente, maar zijn hulp niet minder.Ik dank u allen voor uw hulp.Maar ik kan eisen meer hulp moet ik doen als ik toch nog meer problemenToegevoegd na 12 minuten:Ok dat
is raar, ik
heb nu een stapel underflow fout.Ik ging door het programma stap voor stap, en ik had net gedeactiveerd de input die de Neder-sensor en een paar stappen later kreeg ik een stapel underflow fout.Ok, dat
is een andere bug die ik moet squash met een beetje hulp van Y'all.

Edit: Ik heb het probleem, het veranderen van de oproep tot Goto in het hoofdprogramma, belt de Refill subroutine was dat ik die fout.Het verdween toen ik de plaats van de goto met bellen.Ik
ben nog steeds problemen om uitgangen uitgeschakeld wanneer de eisen wordt voldaan in de Prefill sectie.Zij sprongen in plaats van de belangrijkste programma in plaats van het uitschakelen van de uitgangen wanneer ik de ingangen hoog.Waar ga ik fout?Wat zou ik doen om te corrigeren?

 
SkeeterB08, stack underflow is het tegenovergestelde van een stack overflow.Voordat de wijzigingen, je was CALL-gen, maar nooit op RETURN-gen, zodat de stack heb altijd vol.Nu, je hebt verwijderd Alle oproepen, maar blijven de opbrengsten die betekent dat het probeert om de gegevens van een lege stapel - die ook niet werkt

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Lachten" border="0" />U heeft uiteindelijk komen tot de juiste oplossing, maar ik zou echt stel je neemt een kijkje op deze dingen als u van plan te blijven ontwikkelen firmware met PIC MCU's.Het
is een stuk gemakkelijker en tijd instandhouding Als je weet hoe je iets,
in plaats van met behulp van de "trial and error methode

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Lachten" border="0" />EDIT: Oshonsoft
de PIC Simulator is een van de beste tools vond ik toen ik begon met PIC MCU's.Ideaal voor het ontwikkelen van dingen als je niet 100% vertrouwen in je hebt het recht de eerste keer.Je moet verder gaan via het menu "Extra", want er zijn veel dingen in dat u er wellicht nuttig vindt, onder andere - een STACK monitor die u kunnen helpen bepalen hoeveel stack "niveaus" gebruikt u op een bepaald moment.

 
Bedankt voor uw steun.

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Lachten" border="0" />

Bugs blijven popping up on me, vooral de sprong uit bug, waar de MCU sprongen uit mijn programma af en toe.Ik
ben nog steeds bezig werken uit hoe u de uitgangen laag rendement bij de Upper Sensor terug naar de hoge stand.Toegevoegd na 5 uur 32 minuten:Ik heb de stack fouten gewist nu Ik heb problemen met het te willen een verblijf in de verkeerde sectie of springen terug naar het belangrijkste programma voor de voltooiing van andere taken.Ik was te spelen met behulp van binair naar de status van PORTB, en ik denk dat ik dacht dat de binaire code die nodig zijn voor de Operatie modus Waarschuwing, en Refill modus.

Code:Operation Mode

0 1 2 3 4 5 6 7

0 0 0 0 0 0 1 1Waarschuwing

0 1 2 3 4 5 6 7

0 0 0 0 0 1 1 1Refill Mode

0 1 2 3 4 5 6 7

0 0 0 1 1 1 0 1
 
Ik weet niet of je commentaar is wat je wilt gebeurt, maar als ze zijn, een van de fouten die ik gespot was:

Code:Refill

1 movlw b'00011101 '

2 btfsc PORTA, 0; Als Upper Sensor = 0

3 movlw b'00000011 '; Output "Operation Mode"

4 movfw PORTB; anders, "Refill modus"

5 btfss PORTA, 0; Als bovenste sensor = 0

6 goto Refill; Doorgaan opnieuw vullen

7 movlw b'00011101 '

8 movwf PORTB

9 Rendement; terugkeren naar UitvoerenEINDE

 
Ik probeer om commentaar de lijnen, maar soms vergeet ik om de reacties toen ik na de code.Voor mijn binaire code had ik voor het maken van een babybedje blad voor zowel Port A en B. Wat ik gepost kwam recht uit mijn Binaire crib sheet had ik te maken om uit de codering in binaire.Testen, merkte ik hoe sommige van de LED's niet kom op en moest opnieuw de binaire door het omkeren van 0 1 2 3 4 5 6 7 tot 7 6 5 4 3 2 1 0.Ik
ben nog steeds bezig met het uit te proberen, maar ik krijg het beetje bij beetje.(LOL, mededeling van de grap?)Toegevoegd na 57 minuten:Besefte ik iets gepost nadat ik het vorige antwoord hierop gereageerd op, dat had ik de binaire code teruggedraaid.Opgemerkt dient te worden:

1 0 1 1 1 0 0 0

in plaats van:

0 0 0 1 1 1 0 1

Ik merkte het toen ik getest heb het programma en de operatie onder leiding en Power-LED's zijn niet op toen het ging lopen modus en het zou waarschijnlijk dezelfde manier REFILL modus.

 
EUREKA !!!!!Ik
heb het gedaan!Ik
heb gekregen van het programma werkt!Ik heb de Prefill sectie werken en vervolgens gekopieerd / geplakt prefill de sectie in het hervullen afdeling en heb hem werken, ik
heb het getest en geen fouten en geen trappen van het programma door de MCU.Ik
heb het draaien op verschillende snelheden van stap-voor-stap tot ultieme PIC Simulator en geen problemen.Ik
ben het bevestigen van de code hieronder

Code:lijst p = 16F628; lijst richtlijn te definiëren processor

# include <p16f628.inc>; processor specifieke variabele definities

errorlevel -302; verbergen bancaire bericht

;*****

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF

;*****

; interne OSC instellingen

;*****

"; __CONFIG 'Richtlijn wordt gebruikt voor het insluiten configuratie gegevens binnen. Asm bestand.

; De LABLES naar aanleiding van de richtlijn zijn gelegen in de respectieve. Inc bestand.

Zie de respectieve veiligheidsinformatieblad voor bijkomende informatie over de configuratie woord.;***** VARIABELE DEFINITIES

w_temp EQU 0x70; variabele context wordt gebruikt voor het opslaan

status_temp EQU 0x71; variabele context wordt gebruikt voor het opslaan

Count1 EQU 0x20; Eerste Counter for Delay

Count2 EQU 0X21; Tweede Counter for Delay

Count3 EQU 0X22; Derde Counter for Delay;************************************************* *********************

ORG 0x000; processor reset vector

goto Start, ga naar het begin van het programma

ORG 0x004; interruptvector locatie

movwf w_temp; slaan uit de huidige W registreren inhoud

movf STATUS, w; verplaatsen status register in W register

movwf status_temp; slaan uit de inhoud van de status register

movf status_temp, w; ophalen kopie van STATUS register

movwf STATUS; herstellen pre-ISR STATUS register inhoud

swapf w_temp, f

swapf w_temp, w; herstellen pre-ISR W register inhoud

retfie; terugkeer uit onderbrekenStart

clrf PORTA

clrf PORTB

MOVLW B'00000111 '

MOVWF CMCON; Zet vergelijkingslocatie

BSF STATUS, RP0; bank een

movlw 0xFF

movwf TRISA; Porta alle Input

movlw 0x00

movwf TRISB; portb alle Output

BCF STATUS, RP0; terug naar bank 0movlw b'00000000 'Zie de datasheet van de voorkeur

movwf OPTION_REG; instellingen van OPTION_REGbtfss PORTA, 0; Controleer of Upper Sensor = 1

Bel Prestart; Als niet naar Prestart subroutine

Ga naar Uitvoeren; Ga vervolgens naar Operation ModePrestart

movlw b'10111000 '; Set Refill Mode

btfsc PORTA, 0; Check Als Upper Sensor = 1

movlw b'11000000 '; Dan Stel Operation Mode

movwf PORTB; Verplaatsen naar PORTB

btfss PORTA, 0; Check Als Upper Sensor = 1

goto Prestart; Als niet terugkeren naar de Top van subroutine

Return; Terug naar StartRennen

movlw b'11000000 '; Stel Operation Mode

btfss PORTA, 0; Controleer of Upper Sensor = 1

movlw b'11100000 '; Set Waarschuwing Mode

movwf PORTB; Verplaatsen naar PortB

btfss PORTA, 1; Check Als Lagere Sensor = 1

Bel Refill; Ga naar Refill subroutine

Ga naar Uitvoeren; Terug naar bovenRefill

movlw b'10111000 '; Set Refill Mode

btfsc PORTA, 0; Check Als Upper Sensor = 1

movlw b'11000000 '; Dan Stel Operation Mode

movwf PORTB; Verplaatsen naar PORTB

btfss PORTA, 0; Check Als Upper Sensor = 1

goto Refill; Als niet terugkeren naar de Top van subroutine

Return; Terug naar StartEINDE

 
Optimalisatie 101: Ja, je MCU heeft momenteel ruimte voor tal van instructies, maar dat betekent niet dat je moet afval hen.Als Prestart en Refill hetzelfde doen, te vervangen door een procedure, genaamd "Vul" bijvoorbeeld, en alleen hij tweemaal in de code (een keer in plaats van "CALL Prestart" en een keer in plaats van "CALL Refill").Dat bespaart u ongeveer 7 bytes van programma-geheugen, die - in uw geval is - meer dan 10%

<img src="http://www.edaboard.com/images/smiles/icon_razz.gif" alt="Razz" border="0" />
 
Ik heb veel meer lijnen van codes aan doen een indicator test die wordt uitgevoerd voordat het begint de prefill sectie.En ik heb verwijder de prefill deel en net wees de oproep aan de REFILL subroutine in plaats van prefill.Hier
is mijn nieuwe code.

Code:lijst p = 16F628; lijst richtlijn te definiëren processor

# include <p16f628.inc>; processor specifieke variabele definities

errorlevel -302; verbergen bancaire bericht

;*****

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF

;*****

; interne OSC instellingen

;*****

"; __CONFIG 'Richtlijn wordt gebruikt voor het insluiten configuratie gegevens binnen. Asm bestand.

; De LABLES naar aanleiding van de richtlijn zijn gelegen in de respectieve. Inc bestand.

Zie de respectieve veiligheidsinformatieblad voor bijkomende informatie over de configuratie woord.;***** VARIABELE DEFINITIES

w_temp EQU 0x70; variabele context wordt gebruikt voor het opslaan

status_temp EQU 0x71; variabele context wordt gebruikt voor het opslaan

Count1 EQU 0x20; Eerste Counter for Delay

;************************************************* *********************

ORG 0x000; processor reset vector

goto Start, ga naar het begin van het programma

ORG 0x004; interruptvector locatie

movwf w_temp; slaan uit de huidige W registreren inhoud

movf STATUS, w; verplaatsen status register in W register

movwf status_temp; slaan uit de inhoud van de status register

movf status_temp, w; ophalen kopie van STATUS register

movwf STATUS; herstellen pre-ISR STATUS register inhoud

swapf w_temp, f

swapf w_temp, w; herstellen pre-ISR W register inhoud

retfie; terugkeer uit onderbrekenStart

clrf PORTA

clrf PORTB

MOVLW B'00000111 '

MOVWF CMCON; Zet vergelijkingslocatie

BSF STATUS, RP0; bank een

movlw 0xFF

movwf TRISA; Porta alle Input

movlw 0x00

movwf TRISB; portb alle Output

movlw b'00000000 'Zie de datasheet van de voorkeur

movwf OPTION_REG; instellingen van OPTION_REG

BCF STATUS, RP0; terug naar bank 0

oproep Systest

btfss PORTA, 0; Controleer of Upper Sensor = 1

Bel Refill; Als niet naar Refill subroutine

Ga naar Uitvoeren; Ga vervolgens naar Operation ModeSystest

movlw b'10000000 '; Stel PortB, 7 Hoog anderen Laag

movwf PORTB

movlw 0x05; Stel Count1 tot 05h

movwf Count1

oproep Delay; Bel Vertraging subroutine

movlw b'01000000 '; Stel PortB, 6 Hoog anderen Laag

movwf PORTB

movlw 0x05; Reset Counter1 tot 05h

movwf Count1

oproep Delay; Bel Vertraging subroutine

movlw b'00100000 '; Stel PortB, 5 Hoog anderen Laag

movwf PORTB

movlw 0x05; Reset Counter1 tot 05h

movwf Count1

oproep Delay; Bel Vertraging subroutine

movlw b'00010000 '; Stel PortB, 4 Hoog anderen Laag

movwf PORTB

movlw 0x05; Reset Counter tot 05h

movwf Count1

Bel Vertraging; Bel Vertraging subroutine

movlw b'11110000 '; Stel alle indicatoren Hoog

movwf PORTB

movlw 0x05; Laatste Counter Reset om 05h

movwf Count1

oproep Delay; Bel Vertraging subroutine

movlw b'10000000 "; Zet de Power-LED

movwf PORTB

RETURN; Terug naar programmaRennen

movlw b'11000000 '; Stel Operation Mode

btfss PORTA, 0; Controleer of Upper Sensor = 1

movlw b'11100000 '; Set Waarschuwing Mode

movwf PORTB; Verplaatsen naar PortB

btfss PORTA, 1; Check Als Lagere Sensor = 1

Bel Refill; Ga naar Refill subroutine

Ga naar Uitvoeren; Terug naar bovenRefill

movlw b'10111000 '; Set Refill Mode

btfsc PORTA, 0; Check Als Upper Sensor = 1

movlw b'11000000 '; Dan Stel Operation Mode

movwf PORTB; Verplaatsen naar PORTB

btfss PORTA, 0; Check Als Upper Sensor = 1

goto Refill; Als niet terugkeren naar de Top van subroutine

Return; Terug naar Start

Vertraging

decfsz Count1, 1; Decrement Count1 1

goto Delay; Als Count1> 0 Terug naar boven

Return; Terug naar de vorige plaatsEINDE
 

Welcome to EDABoard.com

Sponsor

Back
Top