Código não funciona por causa de uma nova variável

H

hkBattousai

Guest
Estou tentando executar um programa simples que um flash LED.

O código que é executado sem qualquer problema é:
(O led conectado em D1 porta pisca)
Código:

org 0; código começam em 0Delay1 res 1; reserva 1 byte para o Delay1 variável

Delay2 res 1; reserva 1 byte para o Delay2 variávelInício:

CLRF PORTD

CLRF TRISD

CLRF Delay1

CLRF Delay2MainLoop:

BTG PORTD, RD1; Toggle PORT D PIN 1 (20)

Prazo:

DECFSZ Delay1, 1; Decremento Delay1 por 1, vá para a próxima instrução se Delay1 é 0

GOTO Delay

DECFSZ Delay2, 1

GOTO Delay

GOTO MainLoop

fim
 
Usar simulador MPLAB, colocar alguns pontos de interrupção e ver exatamente o que está acontecer.É muito mais fácil do que esperar por alguém para analisar o código ...

 
Que você esperou o tempo inteiro * t 256 para ver se ele pisca ...?

 
XNOX_Rambo escreveu:

Que você esperou o tempo inteiro * t 256 para ver se ele pisca ...?
 
É a execução do cão de guarda?
Pode-se redefinir o PIC antes que ele tem a chance de flash - que você não iria notar com o anterior a piscar rapidamente.

 
XNOX_Rambo escreveu:

É a execução do cão de guarda?

Pode-se redefinir o PIC antes que ele tem a chance de flash - que você não iria notar com o anterior a piscar rapidamente.
 
Eu não sou tão familiarizado com a ficha de CPIs, mas diz:
Citação:

PIC18F2455/2550/4455/4550

dispositivos têm um timer de monitoria, que seja

permanentemente activado através dos bits de configuração ou

software controlado (se configurado como desativado).
 
XNOX_Rambo escreveu:

Eu acho que você desligá-lo com "config WDT = OFF", mas talvez o que substitui a configuração de hardware?

Você pode tentar desativar o bit de configuração e ver o que acontece.
 
Qual compilador você está usando?

Achei isso na documentação do MPLAB C Compiler for PIC18 MCUs:
Citação:

2.9.5.2 EXEMPLO

O exemplo a seguir mostra como a diretiva # pragma config pode ser utilizado.

O exemplo faz o seguinte:

Permite que o temporizador do cão de guarda,

Define o Postscaler Watchdog de 1:128, e

Selecciona o oscilador HS# pragma config WDT = ON, WDTPS = 128

# pragma config OSC = HS

...

void main (void)

(

...

)
 
XNOX_Rambo escreveu:

Talvez você precise inserir # pragma config em cada linha?
 
Ahh, eu vejo.

Desculpe, então não tenho idéia do porquê ele não está funcionando ...

 
Se você compilar o programa e veja o anúncio desmontagem você vai ver:

0007 6a00 CLRF 0, ACCESS 54: CLRF Delay1
0009 6A01 CLRF 0x1, ACCESS 55: CLRF Delay2
000B 6A02 CLRF 0x2, ACCESS 56: CLRF Delay3

Porque é que a variável localizada no endereço 0 em 54 linhas

Você definiu as variáveis apenas após a declaração org, that's why.

utilizar este código, após declarações de configuração:

0x20 Cblock
Delay1; Atribuir um endereço para o rótulo Delay1
Delay2
Delay3
endc

org 0

Isto irá definir as variáveis no endereço 20

Dissasembly então mostra:

0004 6A20 CLRF 0x20, ACCESS 55: CLRF Delay1
0006 6A21 CLRF 0x21, ACCESS 56: CLRF Delay2
0008 6A22 CLRF 0x22, ACCESS 57: CLRF Delay3

O programa então executa com um atraso de 10 segundo.

George

 
Obrigado geore2000, sua idéia resolveu o meu problema.Mas eu ainda não entendo como ele funciona com duas variáveis definidas, mas não com três deles.Alguém pode explicar isso para mim?

De qualquer forma, está abaixo da final e forma de trabalho do meu código:

Código:

org 0x40; Definir variáveis no endereço 0x40Delay1 res 1

Delay2 res 1

Delay3 res 1org 0; Coloque o código do programa, no início da memóriaInício:

CLRF PORTD

CLRF TRISD

CLRF Delay1

CLRF Delay2

; CLRF Delay3

; CLRF Delay4MOVLW 020

MOVWF Delay3, 0

MainLoop:

BTG PORTD, RD1; Toggle PORT D PIN 1 (20)

Prazo:

DECFSZ Delay1, 1; Decremento Delay1 por 1, vá para a próxima instrução se Delay1 é 0

GOTO Delay

DECFSZ Delay2, 1

GOTO Delay

DECFSZ Delay3, 1

GOTO Delay

MOVLW 020

MOVWF Delay3, 0

; DECFSZ Delay4, 1

; GOTO Delay

GOTO MainLoop

fim
 
1.O MPLAB irá gerar "código absoluto" se apenas 1 ASM sem LKR (você não pode usar o objeto File directivas)
2.A 'res' é usado para armazenamento de dados ou de reserva da memória do programa (em código não-relocatable, ela será assumida como uma memória de programa)

Em seu código, o punho 2 'res' vai gerar 1 instrução 0xFFFF (NOP).Na verdade, a 'Iniciar' está localizado no 2, não 0.É por isso que ele irá trabalhar.
Res O 3th 'vai encourter decodificar instrução errado em tempo de execução (Iniciar a 3), mas você deve receber uma advertência para não-alinhados palavra de endereço.

Assim você pode usar 'Cblock' como George2000's post para declarar o armazenamento de dados como:Código:

org 0; código começam em 00x0 Cblock

Delay1: 1, Delay2: 1, Delay3: 1

endcInício:
 
As variáveis no início iniciar o espaço de código como Hex FF

FF FF é tão nop instrução é intensificado ao longo

Com 3 variáveis que têm código de
FF FF para a primeira instrução, mas
FF 83 como segunda instrução para que o programa tenta executar FF 83 que é a instrução BSF

O programa iria trabalhar novamente com 4 variáveis desde então ela se torna 2 instruções NOP.

Este é o problema com variáveis no espaço, o código do chip acha que o seu código.

George

 
Yager escreveu:

Em seu código, o punho 2 'res' vai gerar 1 instrução 0xFFFF (NOP).
Na verdade, a 'Iniciar' está localizado no 2, não 0.
É por isso que ele irá trabalhar.

Res O 3th 'vai encourter decodificar instrução errado em tempo de execução (Iniciar a 3), mas você deve receber uma advertência para não-alinhados palavra de endereço.
 
hkBattousai escreveu:

Mesmo número de declarações de variáveis no início do código não terá nenhum problema neste caso.
Mas não é um bom caminho para fazer declarações, porque o compilador iria colocar arbitrária valores iniciais para as variáveis em vez de 0x00, porque não.
 

Welcome to EDABoard.com

Sponsor

Back
Top