Array de Inteiros

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Array de Inteiros

Mensagempor mateusmartignon » 08 Mar 2010 12:59

Ola pessoal,
to com um problema muito estranho ao utilizar vetor de inteiros.
Ao tentar utilizar um vetor do tamanho que seja, meu programa simplesmente não fucniona.
exemplo:
-----------------------------------------------------------------------------------------------
#include <REG8253.H>

void main(void)
{
int teste[3]={1,2,3};

P2=teste[0];

while(1)
{
}

}
-----------------------------------------------------------------------------------------------
Mais simples que o programa acima impossível e mesmo assim ele não roda. Se eu fizer de acordo com o segundo exemplo ele funciona perfeitamente:
-----------------------------------------------------------------------------------------------
#include <REG8253.H>

void main(void)
{
int teste=1;

P2=teste;

while(1)
{
}

}
-----------------------------------------------------------------------------------------------

Isso é mto estranho, porque quando utilizava o CCS para trabalhar com PIC nunca tive esse tipo de encrenca. Estou utilizando no caso o compilador Keil uVision3 e gravando em um AT89S8253.
Alguém faz idéia do que pode estar errado.

Obrigado
mateusmartignon
Bit
 
Mensagens: 13
Registrado em: 23 Jan 2010 13:55
Localização: Campo Grande - MS

Mensagempor mateusmartignon » 08 Mar 2010 15:18

Pessoal fiz alguns teste e vo postar aqui mais algumas informações sobre o problema..
Troquei o microcontrolador e a situação continua a mesma.
Tentei fazer uma modificação no programa e me parece que o problema é na inicialização do vetor pois implementando o programa abaixo, o mesmo funciona sem problemas.
-------------------------------------------------------
#include <REG8253.H>

void main(void)
{
int teste[3];

teste[0]=1;

P2=teste[0];

while(1)
{
}

}
-------------------------------------------------------

Agora o que eu não entendo é o porque disso. Sempre declarei um vetor já inicializando ele com valores e nunca tive problema, inclusive funciona na simulação do Proteus. Agora porque esta merd* nao funciona quando gravo no chip fisico??
mateusmartignon
Bit
 
Mensagens: 13
Registrado em: 23 Jan 2010 13:55
Localização: Campo Grande - MS

Mensagempor Francesco » 08 Mar 2010 16:07

Mateus,

Que compilador você está usando?
Fiz um teste aqui com SDCC e funcionou.

Francesco
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor mateusmartignon » 08 Mar 2010 16:37

To usando o Keil uVision3.....o mais estranho que comentei é que na simulação do Proteus também funciona. quando gravo no chip...ae que não funciona...ao terminar de gravar ele fica no estado de reset, todas as IO ficam em nivel alto.
Penso que possa ser alguma configração do compilador, mas nesse caso porque rodaria normalmente no Proteus e no chip nao??
Mateus Martignon S. Mendes
Engenheiro Elétrico/Eletrônico
(67) 9287-6169
mateus.martignon@gmail.com
mateusmartignon
Bit
 
Mensagens: 13
Registrado em: 23 Jan 2010 13:55
Localização: Campo Grande - MS

Mensagempor Francesco » 08 Mar 2010 16:43

Poste aqui o LIST do seu software, vamos analisar o que ele gerou como assembly.

Francesco
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor Iran » 08 Mar 2010 17:04

O que vi no promeiro código que vc postou é que a matriz teste é de inteiros (2 bytes) enquanto P2 (se for a porta P2) tem largura igual a 1 byte (8 bits).

Será isso ?
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor Francesco » 08 Mar 2010 17:11

Iran, na atribuição ele vai descartar a perte mais significativa. No máximo iria aparecer um Warning pela falta do cast. Eu testei num simulador compilado com SDCC, ele transferiu sem problemas... por isso estou achando que é o compilador Keil dele.
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor mateusmartignon » 09 Mar 2010 00:57

C51 COMPILER V8.12 POST 03/08/2010 23:54:33 PAGE 1


C51 COMPILER V8.12, COMPILATION OF MODULE POST
OBJECT MODULE PLACED IN post.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE post.c BROWSE DEBUG OBJECTEXTEND CODE

line level source

1 #include <reg8253.h>
2
3 void main(void)
4 {
5 1 int a[3]={1,2,3};
6 1
7 1 while(1)
8 1 {
9 2 P2=a[0];
10 2 }
11 1
12 1
13 1 }
C51 COMPILER V8.12 POST 03/08/2010 23:54:33 PAGE 2

ASSEMBLY LISTING OF GENERATED OBJECT CODE


; FUNCTION main (BEGIN)
; SOURCE LINE # 3
; SOURCE LINE # 4
; SOURCE LINE # 5
0000 7800 R MOV R0,#LOW a
0002 7C00 R MOV R4,#HIGH a
0004 7D00 MOV R5,#00H
0006 7BFF MOV R3,#0FFH
0008 7A00 R MOV R2,#HIGH _?ix1000
000A 7900 R MOV R1,#LOW _?ix1000
000C 7E00 MOV R6,#00H
000E 7F06 MOV R7,#06H
0010 120000 E LCALL ?C?COPY
0013 ?C0001:
; SOURCE LINE # 7
; SOURCE LINE # 8
; SOURCE LINE # 9
0013 8500A0 R MOV P2,a+07H
; SOURCE LINE # 10
0016 80FB SJMP ?C0001
; FUNCTION main (END)



MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 24 ----
CONSTANT SIZE = 6 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 6
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
Mateus Martignon S. Mendes
Engenheiro Elétrico/Eletrônico
(67) 9287-6169
mateus.martignon@gmail.com
mateusmartignon
Bit
 
Mensagens: 13
Registrado em: 23 Jan 2010 13:55
Localização: Campo Grande - MS

Mensagempor mateusmartignon » 09 Mar 2010 01:01

o problema, é que um programa do tipo postado acima, simplesmente "trava" o uC, ele fica em como em reset, todas as IO´s em nivel alto.
O pior de tudo é que funciona normalmente na simulação do Proteus.
Já troquei o chip e nada. E só iniciar o vetor na sua declaração que da eessa pau..incrivel.
Mateus Martignon S. Mendes
Engenheiro Elétrico/Eletrônico
(67) 9287-6169
mateus.martignon@gmail.com
mateusmartignon
Bit
 
Mensagens: 13
Registrado em: 23 Jan 2010 13:55
Localização: Campo Grande - MS

Mensagempor lopesjm » 09 Mar 2010 10:45

Olá Mateus,

Experimente colocar volatile antes de declarar a variável.

Jorge
lopesjm
Byte
 
Mensagens: 133
Registrado em: 26 Out 2006 12:40

Mensagempor barboza » 09 Mar 2010 16:03

Como esta usando o Keil, vc optou por incluir o startup.s ao projeto?

Não vejo no código gerado onde inicializa o SP, .....

Talvez isso explique porque quando não usa array, funciona, pois não deve ser chamado a função COPY (LCALL ?C?COPY)

E como já dito no Keil, int são 2 bytes....
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor Francesco » 09 Mar 2010 16:05

Isso é verdade, o 8051 inicia o SP com 07h.
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor mateusmartignon » 09 Mar 2010 16:20

Eu sempre opto por não incluir o startup no projeto, pois aprendi em um tutorial assim...
Tem que colocar ele?? É que me parece também que já fiz dos dois jeitos...mas não me recordo...chegando em casa faço um teste e posto o resultado.
Mateus Martignon S. Mendes
Engenheiro Elétrico/Eletrônico
(67) 9287-6169
mateus.martignon@gmail.com
mateusmartignon
Bit
 
Mensagens: 13
Registrado em: 23 Jan 2010 13:55
Localização: Campo Grande - MS

Mensagempor barboza » 09 Mar 2010 16:22

mateusmartignon escreveu:Eu sempre opto por não incluir o startup no projeto, pois aprendi em um tutorial assim...
Tem que colocar ele?? É que me parece também que já fiz dos dois jeitos...mas não me recordo...chegando em casa faço um teste e posto o resultado.



Sempre o adiciono, principalmente por zerar todo o conteúdo da RAM no startup, além de configurar a SP, ....
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor mateusmartignon » 09 Mar 2010 16:42

To lendo aqui no livro agora do autor Mauricio Cardoso de Sá.
Realmente é necessário incluir o startup.
Agora..não sabia de todas essas inicializações.
Ele cita no livro que o arquivo é responsável pelas informações de incialização de variáveis, inicialização do stack, além de outros procedimentos úteis a nossos programas.
Alguém poderia me dizer o que são esses procedimentos e e incializações.? Caso tenha sido abordado em outro tópico ou caso tenha alguma referência na net por favor postem aqui.
Imagino que isso realmente vai resolver o problema...quando chegar em casa faço um teste e já coloco o resultado aqui.
Mateus Martignon S. Mendes
Engenheiro Elétrico/Eletrônico
(67) 9287-6169
mateus.martignon@gmail.com
mateusmartignon
Bit
 
Mensagens: 13
Registrado em: 23 Jan 2010 13:55
Localização: Campo Grande - MS

Próximo

Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x