Programme Stack Overflow

S

SkeeterB08

Guest
quelqu'un peut m'aider?J'ai un problème avec le code sur lequel je travaille.Pour un coup de pied alors
qu'il était sur le programme lors de RA0 et RA1 sont à la fois faible.J'ai joué avec lui et maintenant quand RA0 et RA1 sont faibles, il tourne un peu puis me donne une erreur de dépassement de pile sur Pic Simulator IDE.Où vais-je tort?Oh, et un peu au début avec errorlevel jette moi lors de la compilation,
et j'ai donc il commenté.

Voici le schéma logique de mon circuit

(Opération)
Haut (RA0) Basse-Sensor (RA1) = 1 Ensuite, l'opération (RB6) = 1; Warn (RB5) = 0; Refill (RB3, RB4) = 0
Haut de capteur = 0 Lower Sensor = 1 Ensuite, l'opération = 1; Warn = 1; Refill = 0

(Remplissage)
Haut Bas capteur = 0 Then opération = 0; Warn = clignotant; Refill = 1
Si le Haut-Sensor = 0 Then opération = 0, Warn = clignotant, Refill = 1
Si le Haut-Sensor = 1 Ensuite, l'opération = 1; Avertir = 0; Refill = 0
(Fin de remplissage)

Voici le code tel
qu'il est.C'est pour le PIC16F628

Code:liste p = 16F628; liste de directive visant à définir processeur

# include <p16f628.inc>; processeur spécifique la définition des variables

; Errorlevel -302; cacher bancaire message

;*****

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

;*****

; interne osc paramètres

;*****

; '__CONFIG «Directive est utilisée pour intégrer les données de configuration de l'intérieur. Asm fichier.

; Les étiquettes ci-après la directive se trouvent dans les. Fichier inc.

; Voir fiche technique pour plus d'informations sur la configuration mot.;***** VARIABLE DÉFINITIONS

w_temp EQU 0x70; variable utilisée pour contexte d'économie

status_temp EQU 0x71; variable utilisée pour contexte d'économie

Count1 EQU 0X72 Premier retard pour Counter Loops

Count2 EQU 0X73; le deuxième pour cause de retard Loops;************************************************* *********************

ORG 0x000; reset processeur vectoriel

goto Start; aller au début du programme

;*****

ORG 0x004; vecteur d'interruption emplacement

movwf w_temp; mettre hors cours W enregistrer le contenu

movf STATUS, w; registre d'état de se déplacer registre W

movwf status_temp; mettre hors contenu du registre d'état

movf status_temp, w; récupérer copie du registre d'état

movwf STATUS; restauration pré-isr STATUS register contents

swapf w_temp, f

swapf w_temp, w, restaurer isr W pré-enregistrer le contenu

retfie; retour d'interrompre;*****

Démarrer

clrf PORTA

clrf PORTB

MOVLW B'00000111 '

MOVWF CMCON; Éteignez comparateur

bsf STATUS, RP0; une banque

movlw 0xFF

movwf PORTA, porte d'entrée tous les

movlw 0x00

movwf PORTB; portb toutes les sorties

bcf STATUS, RP0; retour à la banque 0

;*****

movlw b'00000000 »Voir la fiche de préféré

movwf OPTION_REG; paramètres de OPTION_REG

bsf PORTB, 7; Allumez Power LEDbtfss PORTA, 0; Vérifiez si Upper Sensor = 1

Goto pré; Si pas de pré subroutine

bsf PORTB, 6

Goto Run

;*****Pré

bsf PORTB, 5; Allumez Warning LED

bsf PORTB, 4; Allumez Refill LED

bsf PORTB, 3; Activer relais Sous-Circuit

btfsc PORTA, 0; Si Upper Sensor = 1

Goto Run; Aller à la Mode de fonctionnementCourirbtfss PORTA, 0; Si Upper Sensor = 0

bsf PORTB, 5; Ensuite, le virage à LED d'alerte

btfsc PORTA, 0; Si Upper Sensor = 1

decfsz Count1, 1; Ne pas Decrement Compteur 1

btfss PORTA, 1; Si Lower Sensor = 0

Recharge appel; Go To Refill SUBROUTINE

btfsc PORTA, 1; Si Lower Sensor = 0

decfsz Count2, 1; Ne pas décrément Counter2

goto RunRefill

bsf PORTB, 4; Allumez Refill LED

bsf PORTB, 3; Allumez Refill Sous-Circuit

btfsc PORTA, 0; Si Upper Sensor = 1

bcf PORTB, 3; Désactiver Refill Sous-Circuit

btfsc PORTA, 0; Si Upper Sensor = 1

bcf PORTB, 4; Éteignez Refill LED

btfsc PORTA, 0; Si Upper Sensor = 1

bcf PORTB, 5; Éteignez Warning LED

bsf PORTB, 6

goto Run;*****

FIN

 
La première chose que vous devez faire lorsque survient une interruption, est de désactiver les interruptions de compensation par le "GIE" flag.Si vous ne le faites pas, alors que vous êtes dans une routine d'interruption (Program Counter valeur stockée sur un niveau de pile), il arrive que l'autre mai interruption se produit, dans ce cas, le nouveau PC valeur sera stockée dans la pile.Si cela se produit plus de 8 fois (sur un Mid-Range MCU) ou 32 fois sur PIC18F (et assimilés) MCU un dépassement de pile se produise.Interrompre votre routine ne semble pas faire quoi que ce soit (autre que d'enregistrer et de statut de W, puis les récupérer), mais c'est quand même quelque chose que l'on doit toujours mettre en œuvre lors de l'utilisation des interruptions.

Ah, effectivement, je pense que le problème est avec le "Refill"
de routine.Vous êtes CALL-ing "Refill", mais au lieu d'utiliser RETOUR, vous utilisez "GOTO" qui
n'est pas pop la pile.Par conséquent, après 8 appelle à "Refill" de votre pile de débordement.Vous devez vous assurer que vous avez toujours mettre fin à une routine de retour si vous êtes CALL-ment.

 
J'ai pensé
qu'il était la recharge subroutine, je
suis toujours de la difficulté à obtenir le code et le nombre de bogues a été créé quand
j'ai créé cette sous-routine.Je
suis un newbie, et vous ne savez pas à propos de cette merde, mais que
j'essaie d'écrire de code, mais son lent cours.Les versions antérieures de mon programme, mais un peu travaillé les lumières à l'écran tend à cligner des yeux,
à cause de mon mauvais code.Je crois que je
suis peu à peu le faire, mais cela prend du temps et beaucoup de travail.

 
Skeeter,
il vous suffit de remplacer "GOTO Run" avec "RETOUR".

Autrement dit, RETURN est l'opposé de la CALL.Lorsque vous appelez une routine, l'UCM fait "gagner" à la position actuelle (du programme compteur) dans la pile, et ensuite de faire ce que la routine ne.Puis, quand il
s'agit de revenir, il reviendra à la valeur sauvegardée de programme de lutter contre, ce qui centre la pile.

Vous êtes constamment CALL-ment, mais jamais de retour (au lieu de cela, vous utilisez GOTO Run).

Il ya deux façons de résoudre ce problème.Soit remplacer "CALL Refill" avec "GOTO Refill" ou son remplacement "GOTO Run" avec "RETOUR".Si vous ne le second, il faut noter que la "principale" peu de programme continuera d'où il était avant l'appel à CALL.Dans la première solution, il sera de nouveau à partir de "Run" et les années suivantes.Voici un graphique qui explique comment «les sous-routines
de travail.Il suffit de regarder les deux premières colonnes.Imaginez que Sub1 est "Refill" et principale est "Run"

Crédit va à PicList.com site<img src="http://www.piclist.com/images/www/hobby_elec/gif/pic2_3.gif" border="0" alt=""/>
 
Alors que
c'est là que
j'allais mal?Ok, je vais faire ces modifications à mon programme et de les tester en utilisant OshonSoft
du Pic Simulator IDE.Ma première tentative de création de ce circuit, sans l'utilisation d'un microcontrôleur est un échec total.Il a utilisé un 4093 et 4011 CMOS circuits.Il
m'a incité à tenter le PIC quand
j'ai pas réussi à obtenir les résultats escomptés.Il a été un moment, mais je pense que je suis quelque part avec ce programme.La plupart du code a été écrit par moi, mais certaines d'entre elles provenaient de l'aide que j'ai reçu au fil du temps.Certains d'entre elle est plus récente, mais son aide néanmoins.Je vous remercie tous pour votre aide.Mais
j'ai besoin de plus d'aider mai si je ne rencontrez des problèmes plusAjouté après 12 minutes:Ok c'est bizarre, je
avons maintenant une pile underflow erreur.J'allais dans le cadre du programme étape par étape, et je venais juste de désactiver l'entrée représentant le Bas-Sensor et à quelques pas plus tard,
j'ai reçu une pile underflow erreur.Ok, c'est un autre bug, je dois squash avec un peu d'aide de y'all.

Edit:
j'ai trouvé le problème,
en changeant l'appel à Goto dans le programme principal,
en appelant la sous-routine a été Recharge de me donner cette erreur.Il a disparu quand
j'ai remplacé le goto avec appel.Je
suis encore de la difficulté à obtenir les résultats désactivé lorsque les conditions sont remplies dans le Préremplir section.Il passe à la place le programme principal au lieu d'éteindre les sorties quand
j'ai fait les entrées de haut.Où vais-je tort?Que ferais-je pour le corriger?

 
SkeeterB08, pile underflow est le contraire d'un dépassement de pile.Avant les changements, vous avez été CALL-ment, mais jamais RETURN-tion de sorte que la pile a toujours plein.Maintenant, vous avez supprimé tous les appels, mais gardé la rentabilité signifie
qu'il essaie de prendre des données à partir d'une pile vide -
ce qui ne marche pas non plus

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Sourire" border="0" />Vous
n'avez finalement arriver à la solution correcte, mais je voudrais vraiment vous suggérons de regarder de plus près ces choses si vous avez l'intention de continuer à développer avec firmware PIC MCU.Il est
beaucoup plus facile et le temps de conservation Si vous savez comment faire quelque chose, plutôt que d'utiliser la méthode d'essais et d'erreurs

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Sourire" border="0" />EDIT: Oshonsoft
du PIC Simulator est un des meilleurs outils que
j'ai trouvé quand je commence avec PIC MCU.Great stuff pour le développement lorsque vous
n'êtes pas 100% sûrs que vous ne
s'est pas trompé la première fois.Vous devez passer par le menu "Outils", car il ya beaucoup de choses là que vous trouverez peut-être utile, entre autres - une EMPILEMENT contrôler qui peut vous aider à déterminer combien de pile "niveaux" que vous utilisez à un moment donné.

 
Merci pour votre soutien.

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

Bugs sur popping up garder sur moi, notamment le saut de bug, lorsque le MCU saute de mon programme de temps en temps.Je
suis toujours en train d'essayer de voir comment faire retourner les produits à faible lorsque le capteur de rendement supérieur à son taux élevé d'État.Ajouté après 5 heures 32 minutes:J'ai autorisé la pile d'erreurs maintenant je
vais avoir du mal avec lui, soit désireux de rester dans la mauvaise section ou de saut à revenir à la page principale du programme avant de remplir d'autres tâches.Je joue avec l'aide de binaire pour définir le statut de PORTB, et je crois que j'ai trouvé le code binaire nécessaires pour mode de fonctionnement, d'alerte, et le mode de rechange.

Code:Mode de fonctionnement

0 1 2 3 4 5 6 7

0 0 0 0 0 0 1 1Avertissement

0 1 2 3 4 5 6 7

0 0 0 0 0 1 1 1Recharge Mode

0 1 2 3 4 5 6 7

0 0 0 1 1 1 0 1
 
Je ne sais pas si vos commentaires sont les passe-t-il ce que vous voulez, mais si elles le sont, l'une des erreurs
j'ai repéré était:

Code:Refill

1 movlw b'00011101 '

2 btfsc PORTA, 0; Si Upper Sensor = 0

3 movlw b'00000011 '; Output "Mode"

4 movfw PORTB, sinon, "Refill mode"

5 btfss PORTA, 0; Si supérieure du capteur = 0

6 goto Refill; Continuer re-remplissage

7 movlw b'00011101 '

8 movwf PORTB

Retour 9; Retour à ExécuterFIN

 
J'essaie de commenter les lignes, mais parfois
j'ai oublié de mettre des commentaires quand je poste le code.Pour mon code binaire,
j'ai dû créer une crèche pour les deux fiche Port A et B. Ce que
j'ai posté est venu tout droit de mon berceau Binary fiche,
j'ai eu à faire pour déterminer le codage en binaire.Testing,
j'ai remarqué à quel point certains des LED
n'est pas venu et a dû retravailler le binaire par l'inversion de 0 1 2 3 4 5 6 7 7 6 5 4 3 2 1 0.Je
suis en train de travailler sur l'essayer, mais je suis peu à peu.(LOL, l'avis de la blague?)Ajouté après 57 minutes:J'ai réalisé quelque chose après avoir posté la précédente réponse, vous avez répondu, que
j'ai eu le code binaire inversé.Il devrait être:

1 0 1 1 1 0 0 0

au lieu de:

0 0 0 1 1 1 0 1

J'ai remarqué quand je l'ai testé le programme et de l'opération et LED Power LED
n'est pas venu sur le moment où il est entré mode de fonctionnement et il serait probablement la même manière en mode de recharge.

 
EUREKA !!!!!Je l'ai fait!Je suis le programme de travail!J'ai eu l'Préremplir section de travail, puis copié / collé dans la section pré-remplir la section et il a de travail, je l'ai testé et pas d'erreurs et pas à coups de pied du programme par le MCU.J'ai courir à des vitesses différentes à partir de l'étape par étape,
jusqu'à l'ultime simulateur de PIC et pas de problèmes.Je
suis attacher le code ci-dessous

Code:liste p = 16F628; liste de directive visant à définir processeur

# include <p16f628.inc>; processeur spécifique la définition des variables

errorlevel -302; cacher bancaire message

;*****

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

;*****

; interne osc paramètres

;*****

; '__CONFIG «Directive est utilisée pour intégrer les données de configuration de l'intérieur. Asm fichier.

; Les étiquettes ci-après la directive se trouvent dans les. Fichier inc.

; Voir fiche technique pour plus d'informations sur la configuration mot.;***** VARIABLE DÉFINITIONS

w_temp EQU 0x70; variable utilisée pour contexte d'économie

status_temp EQU 0x71; variable utilisée pour contexte d'économie

Count1 EQU 0X20 Premier retard pour Counter

Count2 EQU 0x21; le deuxième pour cause de retard

Count3 EQU 0x22; Troisième pour le retard;************************************************* *********************

ORG 0x000; reset processeur vectoriel

goto Start; aller au début du programme

ORG 0x004; vecteur d'interruption emplacement

movwf w_temp; mettre hors cours W enregistrer le contenu

movf STATUS, w; registre d'état de se déplacer registre W

movwf status_temp; mettre hors contenu du registre d'état

movf status_temp, w; récupérer copie du registre d'état

movwf STATUS; restauration pré-isr STATUS register contents

swapf w_temp, f

swapf w_temp, w, restaurer isr W pré-enregistrer le contenu

retfie; retour d'interrompreDémarrer

clrf PORTA

clrf PORTB

MOVLW B'00000111 '

MOVWF CMCON; Éteignez comparateur

bsf STATUS, RP0; une banque

movlw 0xFF

movwf TRISA; porte d'entrée tous les

movlw 0x00

movwf TRISB; portb toutes les sorties

bcf STATUS, RP0; retour à la banque 0movlw b'00000000 »Voir la fiche de préféré

movwf OPTION_REG; paramètres de OPTION_REGbtfss PORTA, 0; Vérifiez si Upper Sensor = 1

Appel pré; Si pas de pré SUBROUTINE

Goto Exécuter, puis allez à la Mode de fonctionnementPré

movlw b'10111000 '; Recharge Set Mode

btfsc PORTA, 0; Check Si Upper Sensor = 1

movlw b'11000000 »Puis Set Mode de fonctionnement

movwf PORTB; Déplacer à PORTB

btfss PORTA, 0; Check Si Upper Sensor = 1

goto pré; Si Non Retourner au haut de la sous-routine

Retour; Retour au débutCourir

movlw b'11000000 »Set Mode de fonctionnement

btfss PORTA, 0; Vérifiez si Upper Sensor = 1

movlw b'11100000 »Attention Mode Set

movwf PORTB; Déplacer à PortB

btfss PORTA, 1; Check Si Lower Sensor = 1

Appel de rechange; Aller à la sous-Recharge

Goto Run; Retour au débutRefill

movlw b'10111000 '; Recharge Set Mode

btfsc PORTA, 0; Check Si Upper Sensor = 1

movlw b'11000000 »Puis Set Mode de fonctionnement

movwf PORTB; Déplacer à PORTB

btfss PORTA, 0; Check Si Upper Sensor = 1

goto Refill; If Not Retour au début de la sous-routine

Retour; Retour au débutFIN

 
Optimisation 101: Oui,
le MCU a actuellement beaucoup d'espace pour les instructions, mais cela ne signifie pas que vous devez les déchets.Si pré Refill et faire la même chose, de les remplacer par une procédure, appelée "Fill", par exemple, et ne font appel à deux reprises dans le code (une fois au lieu de "pré CALL" et une fois au lieu de "CALL Refill").Cela vous permettra d'économiser environ 7 octets de mémoire programme,
ce qui - dans votre cas - est à plus de 10%

<img src="http://www.edaboard.com/images/smiles/icon_razz.gif" alt="Razz" border="0" />
 
J'ai ajouté beaucoup plus de lignes de codes pour faire un indicateur de test qui fonctionne avant de commencer la pré-section.Et
j'ai fait enlever la section pré-et vient de l'appel à la sous-routine de recharge au lieu de préremplissage.Voici mon nouveau code.

Code:liste p = 16F628; liste de directive visant à définir processeur

# include <p16f628.inc>; processeur spécifique la définition des variables

errorlevel -302; cacher bancaire message

;*****

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

;*****

; interne osc paramètres

;*****

; '__CONFIG «Directive est utilisée pour intégrer les données de configuration de l'intérieur. Asm fichier.

; Les étiquettes ci-après la directive se trouvent dans les. Fichier inc.

; Voir fiche technique pour plus d'informations sur la configuration mot.;***** VARIABLE DÉFINITIONS

w_temp EQU 0x70; variable utilisée pour contexte d'économie

status_temp EQU 0x71; variable utilisée pour contexte d'économie

Count1 EQU 0X20 Premier retard pour Counter

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

ORG 0x000; reset processeur vectoriel

goto Start; aller au début du programme

ORG 0x004; vecteur d'interruption emplacement

movwf w_temp; mettre hors cours W enregistrer le contenu

movf STATUS, w; registre d'état de se déplacer registre W

movwf status_temp; mettre hors contenu du registre d'état

movf status_temp, w; récupérer copie du registre d'état

movwf STATUS; restauration pré-isr STATUS register contents

swapf w_temp, f

swapf w_temp, w, restaurer isr W pré-enregistrer le contenu

retfie; retour d'interrompreDémarrer

clrf PORTA

clrf PORTB

MOVLW B'00000111 '

MOVWF CMCON; Éteignez comparateur

bsf STATUS, RP0; une banque

movlw 0xFF

movwf TRISA; porte d'entrée tous les

movlw 0x00

movwf TRISB; portb toutes les sorties

movlw b'00000000 »Voir la fiche de préféré

movwf OPTION_REG; paramètres de OPTION_REG

bcf STATUS, RP0; retour à la banque 0

appel Systest

btfss PORTA, 0; Vérifiez si Upper Sensor = 1

Appel de rechange; le cas contraire, allez à la sous-Recharge

Goto Exécuter, puis allez à la Mode de fonctionnementSystest

movlw b'10000000 '; PortB Set, 7 haut-bas les autres

movwf PORTB

movlw 0x05; Set Count1 à 05H

movwf Count1

Délai d'appel, l'appel sous-Delay

movlw b'01000000 '; PortB Set, 6 haut-bas les autres

movwf PORTB

movlw 0x05; Reset Counter1 à 05H

movwf Count1

Délai d'appel, l'appel sous-Delay

movlw b'00100000 '; PortB Set, 5 haut-bas les autres

movwf PORTB

movlw 0x05; Reset Counter1 à 05H

movwf Count1

Délai d'appel, l'appel sous-Delay

movlw b'00010000 »Set PortB, 4 haut-bas les autres

movwf PORTB

movlw 0x05; Counter Reset à 05H

movwf Count1

Appel Delay; Call Delay SUBROUTINE

movlw b'11110000 »Ensemble, tous les indicateurs de haut

movwf PORTB

movlw 0x05; Last Counter Reset à 05H

movwf Count1

Délai d'appel, l'appel sous-Delay

movlw b'10000000 '; Allumez Power LED

movwf PORTB

RETURN; Retour au programme principalCourir

movlw b'11000000 »Set Mode de fonctionnement

btfss PORTA, 0; Vérifiez si Upper Sensor = 1

movlw b'11100000 »Attention Mode Set

movwf PORTB; Déplacer à PortB

btfss PORTA, 1; Check Si Lower Sensor = 1

Appel de rechange; Aller à la sous-Recharge

Goto Run; Retour au débutRefill

movlw b'10111000 '; Recharge Set Mode

btfsc PORTA, 0; Check Si Upper Sensor = 1

movlw b'11000000 »Puis Set Mode de fonctionnement

movwf PORTB; Déplacer à PORTB

btfss PORTA, 0; Check Si Upper Sensor = 1

goto Refill; If Not Retour au début de la sous-routine

Retour; Retour au début

Retard

decfsz Count1, 1; décrément Count1 1

goto Delay; Si Count1> 0 Retour en haut de la page

Retour; précédente Retour à la placeFIN
 

Welcome to EDABoard.com

Sponsor

Back
Top