Página 1 de 2

Array de Inteiros

MensagemEnviado: 08 Mar 2010 12:59
por mateusmartignon
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

MensagemEnviado: 08 Mar 2010 15:18
por mateusmartignon
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??

MensagemEnviado: 08 Mar 2010 16:07
por Francesco
Mateus,

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

Francesco

MensagemEnviado: 08 Mar 2010 16:37
por mateusmartignon
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??

MensagemEnviado: 08 Mar 2010 16:43
por Francesco
Poste aqui o LIST do seu software, vamos analisar o que ele gerou como assembly.

Francesco

MensagemEnviado: 08 Mar 2010 17:04
por Iran
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 ?

MensagemEnviado: 08 Mar 2010 17:11
por Francesco
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.

MensagemEnviado: 09 Mar 2010 00:57
por mateusmartignon
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)

MensagemEnviado: 09 Mar 2010 01:01
por mateusmartignon
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.

MensagemEnviado: 09 Mar 2010 10:45
por lopesjm
Olá Mateus,

Experimente colocar volatile antes de declarar a variável.

Jorge

MensagemEnviado: 09 Mar 2010 16:03
por barboza
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....

MensagemEnviado: 09 Mar 2010 16:05
por Francesco
Isso é verdade, o 8051 inicia o SP com 07h.

MensagemEnviado: 09 Mar 2010 16:20
por mateusmartignon
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.

MensagemEnviado: 09 Mar 2010 16:22
por barboza
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, ....

MensagemEnviado: 09 Mar 2010 16:42
por mateusmartignon
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.