UNION SFR e STRUCT.

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

UNION SFR e STRUCT.

Mensagempor fabim » 20 Nov 2009 09:16

carambola.
Ja fiz de n formas possiveis mais não to conseguindo fazerme entender pelo keil.

Nas definições do 2148, ja existe o registrador PCONP de controle de alimentação de perifericos.
Eu criei uma struct e estou tentando unir os dois em uma header, para poder chamar no main.

LOOKEN.
Código: Selecionar todos
  #include <LPC214X.h>

#define liga    0x01
#define desliga 0x00
#define _U      unsigned


union flags{

 PCONP;  // registrador que eu quero unir à struct power.

 struct power{ // 1 para abilitar // 0 para desabilitar
_U short  nouse0 : 1  ;   //  sem uso
_U short  timer0 : 1  ;   //  timer 0
_U short  timer1 : 1  ;   //  timer 1
_U short  uart0  : 1  ;     //  serial 0
_U short  uart1  : 1  ;     //  serial 1
_U short  pwm0   : 1  ;     //  pwm 0
_U short  nouse1 : 1  ;   //  sem uso
_U short  i2c0   : 1  ;     //  I²C  0
_U short  spi0   : 1  ;     //  spi 0
_U short  rtc    : 1  ;     //  relogio interno
_U short  ssp_0  : 1  ;     //  spi1 / ssp 0
_U short  nouse3 : 1  ;   //  sem uso
_U short  adc0   : 1  ;     //  conversor adc 0
_U short  nouse4 : 6  ;   //  sem uso
_U short  i2c1   : 1  ;     //  I²C 1
_U short  adc1   : 1  ;     //  conversor adc 1
_U int    nouse5 : 10 ;   //  sem uso
_U short  usb0   : 1  ;     //  usb
        }    
}        


Como raios de forma, se faz isso?

Abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 20 Nov 2009 11:09

isso não responder a tua pergunta. mas se for apenas pra ligar de desligar bits que tal só com aquelas macros idiotas nossas:
#define setbit(var,bitno) ((var) |= 1 << (bitno))
#define clrbit(var,bitno) ((var) &= ~(1 << (bitno)))
#define xorbit(var,bitno) ((var) ^= 1 << (bitno))

#define timer0 1
...
#define usb0 31
setbit (PCONP, timer0)
clrbit (PCON,usb0)

Curiosamente já tentei também criar tal acesso em bits via struct e union mas desisti.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor fabim » 20 Nov 2009 11:45

poisé, veja só que estranho.

Imagine assim, tu não pode criar dois mnemonicos com o mesmo nome, para endereços diferentes.
Porem tu pode criar mnemonicos com nomes diferentes, para um mesmo endereço.
Ou criar um define para um endereço, desde que este endereço esteja dentro da ram, aí a IDE não reclama.

fiquei de várias formas tentando imaginar o seguinte.
Crio uma outra definição de constante para o endereço X, .... Que só olhar no LPC213X.H, para saber o endereço.
E depois de alguma forma faço a união. massss

E aí josé ? cûma ?
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 20 Nov 2009 12:53

poizé mêmo. me lembro que nos includes do IAR havia uma estrutura deste tipo. Mas como me desviei pro keil nem me preocupei muito. Até quase consegui portar iar->keil mas era uma complicação do carái confundindo o teco. mas com aquelas macros tive sucesso. Pistas:
http://www.koders.com/c/fid6FC125ACA516 ... +arm+io#L3
Se você (não você, outro idiota) domina o IAR e quer compartilhar fique a vontade. Me avise se conseguir (agora é você mesmo).
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Djalma Toledo Rodrigues » 20 Nov 2009 14:09

Oi Fabim

Em C esta tudo em Texto

Código: Selecionar todos
#define RBIF INTCON,0
#define INT0IF INTCON,1
#define TMR0IF INTCON,2
#define RBIE INTCON,3
#define INT0IE INTCON,4
#define TMR0IE INTCON,5
#define PEIE INTCON,6
#define GIE INTCON,7
#define TMR1IF PIR1,0
#define TMR2IF PIR1,1


Este trecho é da HI-TECH Software PICC Assembler header file.

e este do C:
Código: Selecionar todos
#define   T0CS   (1<<5)
#define   T0SE   (1<<4)
#define   PSA   (1<<3)
#define   PS2   (1<<2)
#define   PS1   (1<<1)
#define   PS0   (1<<0)

// Configuration Mask Definitions
#define CONFIG_ADDR   0xFFF  // Oscillator
#define RC      0xFFF
#define LP      0xFFC
#define XT      0xFFD
#define HS      0xFFE



São das Pastas:
PICC / INCLUDE / as16f57
PICC / INCLUDE / pic16f5

Tenta, abra, edita
Salva o conteúdo antes, se não der certo ...

http://asm51.eng.br/phpbb/viewtopic.php ... +mal#62998
Editado pela última vez por Djalma Toledo Rodrigues em 20 Nov 2009 14:14, em um total de 2 vezes.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor fabim » 20 Nov 2009 14:13

o DJ valew, mais veja assim como eu tu ja deve ter se deparado com o seguinte.
Assim funca, mais não quero assim, pois sei que a outra forma que é a aque eu quero tambem funca.. Por isto quero da minha forma.
O duro é porqueira da IDE entender o que eu quero dizer, mais duro ainda utilizando meu dialeto caracteristico...


abs[] fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Djalma Toledo Rodrigues » 20 Nov 2009 14:21

Dialeto aquela do

Código: Selecionar todos
Pelo que eu fui enganado, e abusado.

Foi de +++
Te cuida
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor MarcusPonce » 21 Nov 2009 21:51

Aqui tem quase exatamento o que você queria, com algumas diferenças explicadas abaixo:

//main.c

#include <LPC214X.h>
#include <absacc.h>

#define liga 0x01
#define desliga 0x00
#define _U unsigned

volatile union {

_U int tudo; // acessando o conteúdo inteiro

__packed struct { // 1 para habilitar, 0 para desabilitar
_U short nouse0 : 1 ; // sem uso
_U short timer0 : 1 ; // timer 0
_U short timer1 : 1 ; // timer 1
_U short uart0 : 1 ; // serial 0
_U short uart1 : 1 ; // serial 1
_U short pwm0 : 1 ; // pwm 0
_U short nouse1 : 1 ; // sem uso
_U short i2c0 : 1 ; // I²C 0
_U short spi0 : 1 ; // spi 0
_U short rtc : 1 ; // relogio interno
_U short ssp_0 : 1 ; // spi1 / ssp 0
_U short nouse3 : 1 ; // sem uso
_U short adc0 : 1 ; // conversor adc 0
_U short nouse4 : 6 ; // sem uso
_U short i2c1 : 1 ; // I²C 1
_U short adc1 : 1 ; // conversor adc 1
_U int nouse5 : 10 ; // sem uso
_U short usb0 : 1 ; // usb
} flags;
} power __at( 0xE01FC0C4) ;

int main(void)
{
volatile _U int teste;
teste = power.tudo;
power.flags.uart0 = desliga;
power.flags.usb0 = desliga;
teste = power.tudo;
}


A diferença é que não dá para escrever "PCONP" dentro da union, mas podemos colocar a union no endereço do PCONP usando "__at".

Também tem que colocar "__packed" antes de "struct", senão aquele monte de bits não ocupam exatamente 4 bytes consecutivos como desejado.

Outra mudança: eu achei mais fácil de entender se chamarmos a union de "power" e a struct de "flags", então troquei.

Eu testei em debug e funcionou.
MarcusPonce
Byte
 
Mensagens: 166
Registrado em: 12 Fev 2007 13:58
Localização: Campinas - SP

Mensagempor fabim » 22 Nov 2009 09:37

Marcus, são exatamente os dois comandos de compilador que eu estava procurando, e não encontrei no keil..!!
__PACKED;;;;;;;;;;;;

__AT(endereço)...

Como sempre mexi com pic, os compiladores que eu usei eram a sintaxi ansi.
Absolute org
ou
org
ou
const org

brigadão marcos!!
Viu só como esse tipo de struct fica simprão, e muito mais facil pra manipular?

Quando fiz o drive usb para linha 18F, muita coisa antes de fazer fixo, eu precisei fazer essa tecnica pra conseguir entender o tratamento dos flags e etc, depois de feito eu passei para setagem fixa.

Abraços e muito obrigado

OBS, são 32 bit´s, o "tudo" deve ser LONG e não INT.!!!
Mesmo assim parabens, funcionou mesmo !!

[2]´s
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor MarcusPonce » 22 Nov 2009 11:30

Fabim, fico feliz de ter contribuído.
Também acho ruim ficar tentando escrever um trecho de código e não encontrar uma maneira do compilador fazer o que nós queremos.

Sobre o tamanho do "int" e o "long": se você me permitir discordar, o int tem 2 bytes e o long tem 4 quando usamos o Keil para compilar para 8051. Quando o Keil compila para ARM o int tem 4 bytes e long também.

Como trabalho com 8051 e ARM, preciso ficar me lembrando sempre deste detalhe...
MarcusPonce
Byte
 
Mensagens: 166
Registrado em: 12 Fev 2007 13:58
Localização: Campinas - SP

Mensagempor ze » 24 Nov 2009 08:47

ninguém é tão sábio que não tenha nada a aprender e nem tão ingênuo que não tenha a ensinar.

obrigado também marcus ponce.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor MarcusPonce » 25 Nov 2009 07:03

De nada Lellis, valeu !
MarcusPonce
Byte
 
Mensagens: 166
Registrado em: 12 Fev 2007 13:58
Localização: Campinas - SP

Mensagempor fabim » 25 Nov 2009 12:38

now quequieu tofazenu de errado. cassarolas""""
Código: Selecionar todos
 /SÃO 131 BYTES AO TODO..

volatile union{
  char controle[131]

__packed  struct{ //STRT END 0xE0024000
  _u char    ilr;        // Interrupt Location Register
  _u char    _pad0[3];
  _u short    ctc;        // Clock Tick Counter
  _u short   _pad1[2];
  _u char    ccr;        // Clock Control Register
  _u char    _pad2[3];
  _u char    ciir;       // Counter Increment Interrupt Register
  _u char    _pad3[3];
  _u char    amr;        // Alarm Mask Register
  _u char    _pad4[3];
  _u long    ctime0;     // Consolidated Time Register 0
  _u long    ctime1;     // Consolidated Time Register 1
  _u long    ctime2;     // Consolidated Time Register 2
  _u char    sec;        // Seconds Register
  _u char    _pad5[3];
  _u char    min;        // Minutes Register
  _u char    _pad6[3];
  _u char    hour;       // Hours Register
  _u char    _pad7[3];
  _u char    dom;        // Day Of Month Register
  _u char    _pad8[3];
  _u char    dow;        // Day Of Week Register
  _u char    _pad9[3];
  _u short    doy;        // Day Of Year Register
  _u char    _pad10[2];
  _u char    month;      // Months Register
  _u char    _pad11[3];

  _u short    year;       // Years Register // 0xE002403C

  _u long    _pad12[33];//33 BYTES perdidos
 
                  //STRT END 0xE0024060
  _u char    alsec;      // Alarm Seconds Register
  _u char    _pad13[3];
  _u char    almin;      // Alarm Minutes Register
  _u char    _pad14[3];
  _u char    alhour;     // Alarm Hours Register
  _u char    _pad15[3];
  _u char    aldom;      // Alarm Day Of Month Register
  _u char    _pad16[3];
  _u char    aldow;      // Alarm Day Of Week Register
  _u char    _pad17[3];
  _u short    aldoy;      // Alarm Day Of Year Register
  _u short    _pad18;
  _u char    almon;      // Alarm Months Register
  _u char    _pad19[3];
  _u short    alyear;     // Alarm Years Register
  _u short    _pad20;
  _u short    preint;     // Prescale Value Register (integer)
  _u short    _pad21;
  _u short    prefrac;    // Prescale Value Register (fraction)
  _u short    _pad22;      //FIM END 0xE0024087
} configs;
 }controle __at(0xE0024000);
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor fabim » 25 Nov 2009 14:30

about ai encima,.
Tinha esquecido de colocar isto>:
http://www.nxp.com/documents/user_manual/UM10139.pdf

Pagina: 276.

Observe a tabela e endereços.
não consegui descobrir pra onde a bronha foi, avistruis...


ABS fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Viktor » 25 Nov 2009 19:37

Nao sei o que esta errado porem faz deste jeito embaixo (definicao para LM3S6965) que funciona.

Código: Selecionar todos
typedef struct
 {
  volatile U32 I2C_MASTER_MSA_R;
  volatile U32 I2C_MASTER_MCS_R;
  volatile U32 I2C_MASTER_MDR_R;
  volatile U32 I2C_MASTER_MTPR_R;
  volatile U32 I2C_MASTER_MIMR_R;
  volatile U32 I2C_MASTER_MRIS_R;
  volatile U32 I2C_MASTER_MMIS_R;
  volatile U32 I2C_MASTER_MICR_R;
  volatile U32 I2C_MASTER_MCR_R;
  volatile U32 gap0[0x1f7];
  volatile U32 I2C_SLAVE_SOAR_R;
  volatile U32 I2C_SLAVE_SCSR_R;
  volatile U32 I2C_SLAVE_SDR_R;
  volatile U32 I2C_SLAVE_SIMR_R;
  volatile U32 I2C_SLAVE_SRIS_R;
  volatile U32 I2C_SLAVE_SMIS_R;
  volatile U32 I2C_SLAVE_SICR_R;
 } i2c_reg;

#define   I2C0            ((volatile i2c_reg *) 0x40020000)
#define   I2C1            ((volatile i2c_reg *) 0x40021000)
Viktor
Byte
 
Mensagens: 281
Registrado em: 12 Out 2006 11:33

Próximo

Voltar para ARM

Quem está online

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

x