Página 1 de 1

Ponteiro para Porta 8051

MensagemEnviado: 12 Mar 2010 09:49
por Iran
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.

MensagemEnviado: 12 Mar 2010 10:53
por lopesjm
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

MensagemEnviado: 12 Mar 2010 11:16
por Francesco
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

MensagemEnviado: 12 Mar 2010 14:21
por Iran
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

MensagemEnviado: 12 Mar 2010 14:44
por Francesco
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]

MensagemEnviado: 25 Abr 2010 18:50
por Viktor
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

MensagemEnviado: 25 Abr 2010 23:13
por Iran
É verdade Viktor, é básico.

MensagemEnviado: 26 Abr 2010 01:38
por Francesco
Chegou a fazer o teste para verificar se funciona?

MensagemEnviado: 26 Abr 2010 09:02
por Iran
sim, funciona o seu código Francesco.

MensagemEnviado: 26 Abr 2010 09:09
por Francesco
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

MensagemEnviado: 26 Abr 2010 10:45
por Iran
É 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.

MensagemEnviado: 26 Abr 2010 10:50
por Francesco
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