Página 1 de 3
UNION SFR e STRUCT.

Enviado:
20 Nov 2009 09:16
por fabim
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

Enviado:
20 Nov 2009 11:09
por ze
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.

Enviado:
20 Nov 2009 11:45
por fabim
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 ?

Enviado:
20 Nov 2009 12:53
por ze
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 con
fundindo 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ç

Enviado:
20 Nov 2009 14:09
por Djalma Toledo Rodrigues
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

Enviado:
20 Nov 2009 14:13
por fabim
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

Enviado:
20 Nov 2009 14:21
por Djalma Toledo Rodrigues
Dialeto aquela do
- Código: Selecionar todos
Pelo que eu fui enganado, e abusado.
Foi de +++
Te cuida
.

Enviado:
21 Nov 2009 21:51
por MarcusPonce
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.

Enviado:
22 Nov 2009 09:37
por fabim
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

Enviado:
22 Nov 2009 11:30
por MarcusPonce
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...

Enviado:
24 Nov 2009 08:47
por ze
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.

Enviado:
25 Nov 2009 07:03
por MarcusPonce
De nada Lellis, valeu !

Enviado:
25 Nov 2009 12:38
por fabim
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);

Enviado:
25 Nov 2009 14:30
por fabim
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

Enviado:
25 Nov 2009 19:37
por Viktor
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)