Ponteiro para Porta 8051

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Ponteiro para Porta 8051

Mensagempor Iran » 12 Mar 2010 09:49

Eu NÃO posso ter um ponteiro para uma porta(sfr) do 8051 ?

unsigned char *port;

port = &P2;
*port = 0x00;

Tá compilando mas nao executa.


Grato,
Zé Iran.
Editado pela última vez por Iran em 12 Mar 2010 14:13, em um total de 1 vez.
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor lopesjm » 12 Mar 2010 10:53

Olá Iran,

Você chegou a ver o asm ou lst que foi gerado ?

No SDCC ele substituiu por mov P2, #00h.


Código: Selecionar todos
                            378 ;   Pteste.c:10: port = &P2;
                            379 ;   Pteste.c:11: *port = 0x00;
   0000 75 A0 00            380    mov   _P2,#0x00
                            381 ;   Pteste.c:12: while(1);
   0003                     382 00102$:
   0003 80 FE               383    sjmp   00102$



E executou no mcu.

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

Mensagempor Francesco » 12 Mar 2010 11:16

Então, P2 não é um ponteiro... é quase como um define.
São sei que compilador você está usando, mas que tal testar algo assim:

unsigned char porta ;

porta = ( unsigned char ) P2 ;

( __sft )( porta ) = 0x00 ;


Não sei se funciona, nunca testei. Mas não custa verificar.
Isso aqui foi para SDCC, o nome de SFR pode mudar para seu compilador.

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

Mensagempor Iran » 12 Mar 2010 14:21

Jorge e Francesco

Estou usando o SDCC e simulando no PDS51


Digitei o programinha simplei abaixo:


Código: Selecionar todos

#include <at89s8252.h>

unsigned char *port;

void main(void)
{
    port = &P2;
    *port = 0x00;
    while(1);
}



o LST gerado foi diferente do Jorge

Código: Selecionar todos
553 ;   main.c:34: void main(void)
                            554 ;   -----------------------------------------
                            555 ;    function main
                            556 ;   -----------------------------------------
   0000                     557 _main:
                    0002    558     ar2 = 0x02
                    0003    559     ar3 = 0x03
                    0004    560     ar4 = 0x04
                    0005    561     ar5 = 0x05
                    0006    562     ar6 = 0x06
                    0007    563     ar7 = 0x07
                    0000    564     ar0 = 0x00
                    0001    565     ar1 = 0x01
                    0000    566     C$main.c$36$1$1 ==.
                            567 ;   main.c:36: port = &P2;
   0000 75*00 A0            568     mov _port,#_P2
   0003 75*01 00            569     mov (_port + 1),#0x00
   0006 75*02 40            570     mov (_port + 2),#0x40
                    0009    571     C$main.c$37$1$1 ==.
                            572 ;   main.c:37: *port = 0x00;
   0009 AA*00               573     mov r2,_port
   000B AB*01               574     mov r3,(_port + 1)
   000D AC*02               575     mov r4,(_port + 2)
   000F 8A 82               576     mov dpl,r2
   0011 8B 83               577     mov dph,r3
   0013 8C F0               578     mov b,r4
   0015 74 00               579     mov a,#0x00
   0017 12s00r00            580     lcall   __gptrput
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor Francesco » 12 Mar 2010 14:44

Iran,

Escrevi este código e, segundo a listagem, funcionou:

Código: Selecionar todos
void main( void )
{
        __sfr * porta ;

        porta = &P2 ;

        *porta = 0x5A ;
        P2    = 0xA5 ;

        for( ; ; )
                ;
}


A listagem indica o seguinte:

Código: Selecionar todos
...

                            324 ;   teste.c:7: porta = &P2 ;
                            325 ;   teste.c:9: *porta = 0x5A ;
   0000 75 A0 5A            326    mov   _P2,#0x5A
                            327 ;   teste.c:10: P2    = 0xA5 ;
   0003 75 A0 A5            328    mov   _P2,#0xA5
   0006                     329 00102$:
   0006 80 FE               330    sjmp   00102$


...[quote]

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

Mensagempor Viktor » 25 Abr 2010 18:50

Não existe ponteiro para registrador (SFR) ! SFR só pode ser endereçado diretamente. Isto é o básico do básico do básico da arquitetura do 51
Viktor
Byte
 
Mensagens: 281
Registrado em: 12 Out 2006 11:33

Mensagempor Iran » 25 Abr 2010 23:13

É verdade Viktor, é básico.
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor Francesco » 26 Abr 2010 01:38

Chegou a fazer o teste para verificar se funciona?
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor Iran » 26 Abr 2010 09:02

sim, funciona o seu código Francesco.
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor Francesco » 26 Abr 2010 09:09

Iran, agora fiquei curioso... faz sentido o que o Viktor falou.
O código que te mandei pode ter sido otimizado e o ponteiro ter sido substituído por um valor constante.

Acredito que um código como o abaixo seria melhor para ser testado...
Código: Selecionar todos
void escrevePorta( __sfr * porta , unsigned char valor )
{
  *porta = valor ;
}

void main( void )
{
  escrevePorta( &P0 , 0x55 ) ;
  escrevePorta( &P1 , 0xAA ) ;

  for( ; ; )
    ;

}


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

Mensagempor Iran » 26 Abr 2010 10:45

É Francesco, esse último código não funcionou. Não sei pq.

Mas era isso que eu queria, criar uma funçao para escrever numa porta e definir qual porta na chamada da função.
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor Francesco » 26 Abr 2010 10:50

Parece que o segredo estaria em uma função chamada gptrput, mas não sei se vale a pena insistir.

O que você pode fazer é criar um tipo... algo assim:

Código: Selecionar todos
#define PORTA_0     0
#define PORTA_1     1
#define PORTA_2     2
#define PORTA_3     3

void escrevePorta( unsigned char porta , unsigned char valor )
{
    switch( porta )
    {
        case PORTA_0 :
            P0 = valor ;
            break ;

        case PORTA_1 :
            P1 = valor ;
            break ;

        case PORTA_2 :
            P2 = valor ;
            break ;

        case PORTA_3 :
            P3 = valor ;
            break ;


    }
}


Aí o resto permanece igual.

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


Voltar para 8051

Quem está online

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

x