CodeWarrior + MC56F8013

Software e Hardware para uC da Qualcomm, NXP, FreeScale e Motorola

Moderadores: 51, guest2003

CodeWarrior + MC56F8013

Mensagempor JeanPaul » 27 Nov 2006 10:06

Olá pessoal,


É a primeira vez que estou trabalhando com o CodeWarrior, mais especificamente com o MC56F8013 da Freescale.

Dá pra perceber que a IDE do Warrior é bastante poderosa, mas também bastante complicada. Pretendo trabalhar em C, porém não consegui realizar tarefas simples como acesso a portas e periféricos com esta linguagem.

Sei que a IDE disponibiliza o Processor Expert por meio de Beans ou PESL, mas estou acostumado com programação vertical. (Include – Configuração – Programa) :D
Me sinto meio perdido com o PE, parece que perco as “rédeas” do programa e a máquina é quem faz tudo.

Sei que esta duvida já foi levantada, mas gostaria de saber que tipo de solução os colegas do fórum encontraram. Programação hybrida? (ASM/C)

Agradeço qualquer ajuda.

[]’s

Jean Paul
JeanPaul
Byte
 
Mensagens: 182
Registrado em: 12 Out 2006 21:27
Localização: Florianópolis -SC

Mensagempor Maia » 27 Nov 2006 10:47

Me mandaram esse header. Não sei se está correto.
Abraços,
Maia

Código: Selecionar todos
//
// DSP56F8013.h  register definitions for DSP56F8013
//
//
// Use without '*' so f.e.:
//       GPIO_B_DR = 0x0001; // LED on
//


typedef unsigned short WORD;

#define TMR_BASE               0xF000   
#define PWM_BASE               0xF040   
#define ITCN_BASE               0xF060
#define ADC_BASE               0xF080
#define SCI_BASE               0xF0B0
#define SPI_BASE               0xF0C0   
#define IIC_BASE               0xF0D0
#define COP_BASE               0xF0E0   
#define OCCS_BASE               0xF0F0   
#define GPIOA_BASE               0xF100   
#define GPIOB_BASE               0xF110   
#define GPIOC_BASE               0xF120   
#define GPIOD_BASE               0xF130   
#define SIM_BASE               0xF140   
#define PS_BASE                  0xF160   
#define FM_BASE                   0xF400   
   

// Quad Timer Registers Address Map

#define TMR0_CMP1             *(WORD *) (0x00+TMR_BASE)
#define TMR0_CMP2             *(WORD *) (0x01+TMR_BASE)
#define TMR0_CAP              *(WORD *) (0x02+TMR_BASE)
#define TMR0_LOAD             *(WORD *) (0x03+TMR_BASE)
#define TMR0_HOLD             *(WORD *) (0x04+TMR_BASE)
#define TMR0_CNTR             *(WORD *) (0x05+TMR_BASE)
#define TMR0_CTRL             *(WORD *) (0x06+TMR_BASE)
#define TMR0_SCTRL            *(WORD *) (0x07+TMR_BASE)
#define TMR0_CMPLD1           *(WORD *) (0x08+TMR_BASE)
#define TMR0_CMPLD2           *(WORD *) (0x09+TMR_BASE)
#define TMR0_CSCTRL           *(WORD *) (0x0A+TMR_BASE)

#define TMR1_CMP1             *(WORD *) (0x10+TMR_BASE)
#define TMR1_CMP2             *(WORD *) (0x11+TMR_BASE)
#define TMR1_CAP              *(WORD *) (0x12+TMR_BASE)
#define TMR1_LOAD             *(WORD *) (0x13+TMR_BASE)
#define TMR1_HOLD             *(WORD *) (0x14+TMR_BASE)
#define TMR1_CNTR             *(WORD *) (0x15+TMR_BASE)
#define TMR1_CTRL             *(WORD *) (0x16+TMR_BASE)
#define TMR1_SCTRL            *(WORD *) (0x17+TMR_BASE)
#define TMR1_CMPLD1           *(WORD *) (0x18+TMR_BASE)
#define TMR1_CMPLD2           *(WORD *) (0x19+TMR_BASE)
#define TMR1_CSCTRL           *(WORD *) (0x1A+TMR_BASE)

#define TMR2_CMP1             *(WORD *) (0x20+TMR_BASE)
#define TMR2_CMP2             *(WORD *) (0x21+TMR_BASE)
#define TMR2_CAP              *(WORD *) (0x22+TMR_BASE)
#define TMR2_LOAD             *(WORD *) (0x23+TMR_BASE)
#define TMR2_HOLD             *(WORD *) (0x24+TMR_BASE)
#define TMR2_CNTR             *(WORD *) (0x25+TMR_BASE)
#define TMR2_CTRL             *(WORD *) (0x26+TMR_BASE)
#define TMR2_SCTRL            *(WORD *) (0x27+TMR_BASE)
#define TMR2_CMPLD1           *(WORD *) (0x28+TMR_BASE)
#define TMR2_CMPLD2           *(WORD *) (0x29+TMR_BASE)
#define TMR2_CSCTRL           *(WORD *) (0x2A+TMR_BASE)

#define TMR3_CMP1             *(WORD *) (0x30+TMR_BASE)
#define TMR3_CMP2             *(WORD *) (0x31+TMR_BASE)
#define TMR3_CAP              *(WORD *) (0x32+TMR_BASE)
#define TMR3_LOAD             *(WORD *) (0x33+TMR_BASE)
#define TMR3_HOLD             *(WORD *) (0x34+TMR_BASE)
#define TMR3_CNTR             *(WORD *) (0x35+TMR_BASE)
#define TMR3_CTRL             *(WORD *) (0x36+TMR_BASE)
#define TMR3_SCTRL            *(WORD *) (0x37+TMR_BASE)
#define TMR3_CMPLD1           *(WORD *) (0x38+TMR_BASE)
#define TMR3_CMPLD2           *(WORD *) (0x39+TMR_BASE)
#define TMR3_CSCTRL           *(WORD *) (0x3A+TMR_BASE)

// PWM Registers Address Map

#define PWM_CTRL              *(WORD *) (0x0+PWM_BASE)
#define PWM_FCTRL             *(WORD *) (0x1+PWM_BASE)
#define PWM_FLTACK            *(WORD *) (0x2+PWM_BASE)
#define PWM_OUT               *(WORD *) (0x3+PWM_BASE)
#define PWM_CNTR              *(WORD *) (0x4+PWM_BASE)
#define PWM_CMOD              *(WORD *) (0x5+PWM_BASE)
#define PWM_VAL0              *(WORD *) (0x6+PWM_BASE)
#define PWM_VAL1              *(WORD *) (0x7+PWM_BASE)
#define PWM_VAL2              *(WORD *) (0x8+PWM_BASE)
#define PWM_VAL3              *(WORD *) (0x9+PWM_BASE)
#define PWM_VAL4              *(WORD *) (0xA+PWM_BASE)
#define PWM_VAL5              *(WORD *) (0xB+PWM_BASE)
#define PWM_DTIM0             *(WORD *) (0xC+PWM_BASE)
#define PWM_DTIM1             *(WORD *) (0xD+PWM_BASE)
#define PWM_DMAP1            *(WORD *) (0xE+PWM_BASE)
#define PWM_DMAP2            *(WORD *) (0xF+PWM_BASE)
#define PWM_CNFG            *(WORD *) (0x10+PWM_BASE)
#define PWM_CCTRL           *(WORD *) (0x11+PWM_BASE)
#define PWM_PORT              *(WORD *) (0x12+PWM_BASE)
#define PWM_ICCTRL          *(WORD *) (0x13+PWM_BASE)
#define PWM_SCTRL             *(WORD *) (0x14+PWM_BASE)

// Interrupt Controller Registers Address Map

#define ITCN_IPR0         *(WORD *) (0x0+ITCN_BASE)
#define ITCN_IPR1           *(WORD *) (0x1+ITCN_BASE)
#define ITCN_IPR2           *(WORD *) (0x2+ITCN_BASE)
#define ITCN_IPR3           *(WORD *) (0x3+ITCN_BASE)
#define ITCN_IPR4           *(WORD *) (0x4+ITCN_BASE)
#define ITCN_VBA            *(WORD *) (0x5+ITCN_BASE)
#define ITCN_FIM0           *(WORD *) (0x6+ITCN_BASE)
#define ITCN_FIVAL0         *(WORD *) (0x7+ITCN_BASE)
#define ITCN_FIVAH0         *(WORD *) (0x8+ITCN_BASE)
#define ITCN_FIM1           *(WORD *) (0x9+ITCN_BASE)
#define ITCN_FIVAL1         *(WORD *) (0xA+ITCN_BASE)
#define ITCN_FIVAH1         *(WORD *) (0xB+ITCN_BASE)
#define ITCN_IRQP0          *(WORD *) (0xC+ITCN_BASE)
#define ITCN_IRQP1          *(WORD *) (0xD+ITCN_BASE)
#define ITCN_IRQP2          *(WORD *) (0xE+ITCN_BASE)
#define ITCN_ICTL           *(WORD *) (0x12+ITCN_BASE)

// ADC Registers Address Map

#define ADC_CTRL1           *(WORD *) (0x0+ADC_BASE)
#define ADC_CTRL2           *(WORD *) (0x1+ADC_BASE)
#define ADC_ZXCTRL          *(WORD *) (0x2+ADC_BASE)
#define ADC_CLIST1          *(WORD *) (0x3+ADC_BASE)
#define ADC_CLIST2          *(WORD *) (0x4+ADC_BASE)
#define ADC_SDIS            *(WORD *) (0x5+ADC_BASE)
#define ADC_STAT            *(WORD *) (0x6+ADC_BASE)
#define ADC_LIMSTAT         *(WORD *) (0x7+ADC_BASE)
#define ADC_ZXSTAT          *(WORD *) (0x8+ADC_BASE)
#define ADC_RSLT0           *(WORD *) (0x9+ADC_BASE)
#define ADC_RSLT1           *(WORD *) (0xA+ADC_BASE)
#define ADC_RSLT2           *(WORD *) (0xB+ADC_BASE)
#define ADC_RSLT3           *(WORD *) (0xC+ADC_BASE)
#define ADC_RSLT4           *(WORD *) (0xD+ADC_BASE)
#define ADC_RSLT5           *(WORD *) (0xE+ADC_BASE)
#define ADC_RSLT6           *(WORD *) (0xF+ADC_BASE)
#define ADC_RSLT7           *(WORD *) (0x10+ADC_BASE)
#define ADC_LOLIMT0         *(WORD *) (0x11+ADC_BASE)
#define ADC_LOLIMT1         *(WORD *) (0x12+ADC_BASE)
#define ADC_LOLIMT2         *(WORD *) (0x13+ADC_BASE)
#define ADC_LOLIMT3         *(WORD *) (0x14+ADC_BASE)
#define ADC_LOLIMT4         *(WORD *) (0x15+ADC_BASE)
#define ADC_LOLIMT5         *(WORD *) (0x16+ADC_BASE)
#define ADC_LOLIMT6         *(WORD *) (0x17+ADC_BASE)
#define ADC_LOLIMT7         *(WORD *) (0x18+ADC_BASE)
#define ADC_HILIMT0         *(WORD *) (0x19+ADC_BASE)
#define ADC_HILIMT1         *(WORD *) (0x1A+ADC_BASE)
#define ADC_HILIMT2         *(WORD *) (0x1B+ADC_BASE)
#define ADC_HILIMT3         *(WORD *) (0x1C+ADC_BASE)
#define ADC_HILIMT4         *(WORD *) (0x1D+ADC_BASE)
#define ADC_HILIMT5         *(WORD *) (0x1E+ADC_BASE)
#define ADC_HILIMT6         *(WORD *) (0x1F+ADC_BASE)
#define ADC_HILIMT7         *(WORD *) (0x20+ADC_BASE)
#define ADC_OFFST0          *(WORD *) (0x21+ADC_BASE)
#define ADC_OFFST1          *(WORD *) (0x22+ADC_BASE)
#define ADC_OFFST2          *(WORD *) (0x23+ADC_BASE)
#define ADC_OFFST3          *(WORD *) (0x24+ADC_BASE)
#define ADC_OFFST4          *(WORD *) (0x25+ADC_BASE)
#define ADC_OFFST5          *(WORD *) (0x26+ADC_BASE)
#define ADC_OFFST6          *(WORD *) (0x27+ADC_BASE)
#define ADC_OFFST7          *(WORD *) (0x28+ADC_BASE)
#define ADC_PWR             *(WORD *) (0x29+ADC_BASE)
#define ADC_VREF            *(WORD *) (0x2A+ADC_BASE)


// SCI Registers Address Map

#define SCI_RATE             *(WORD *) (0x0+SCI_BASE)
#define SCI_CTRL1           *(WORD *) (0x1+SCI_BASE)
#define SCI_CTRL2           *(WORD *) (0x2+SCI_BASE)
#define SCI_STAT            *(WORD *) (0x3+SCI_BASE)
#define SCI_DATA            *(WORD *) (0x4+SCI_BASE)


// SPI Registers Address Map

#define SPI_SCTRL            *(WORD *) (0x0+SP_BASE)
#define SPI_DSCTRL          *(WORD *) (0x1+SP_BASE)
#define SPI_DRCV            *(WORD *) (0x2+SP_BASE)
#define SPI_DXMIT           *(WORD *) (0x3+SP_BASE)

// IIC Register Address MaP

#define I2C_ADDR            *(WORD *) (0x0+IIC_BASE)
#define I2C_FDIV            *(WORD *) (0x1+IIC_BASE)
#define I2C_CTRL            *(WORD *) (0x2+IIC_BASE)
#define I2C_STAT            *(WORD *) (0x3+IIC_BASE)
#define I2C_DATA            *(WORD *) (0x4+IIC_BASE)
#define I2C_NFILT           *(WORD *) (0x5+IIC_BASE)

// COP Registers Address Map

#define COP_CTRL            *(WORD *) (0x0+COP_BASE)
#define COP_TOUT            *(WORD *) (0x1+COP_BASE)
#define COP_CNTR            *(WORD *) (0x2+COP_BASE)


// OCCS Registers Address Map

#define OCCS_CTRL           *(WORD *) (0x0+OCCS_BASE)
#define OCCS_DIVBY          *(WORD *) (0x1+OCCS_BASE)
#define OCCS_STAT           *(WORD *) (0x2+OCCS_BASE)
#define OCCS_SHUTDN         *(WORD *) (0x4+OCCS_BASE)
#define OCCS_OCTRL          *(WORD *) (0x5+OCCS_BASE)

// GPIO Port A Registers Address Map

#define GPIOA_PUPEN         *(WORD *) (0x0+GPIOA_BASE)
#define GPIOA_DATA          *(WORD *) (0x1+GPIOA_BASE)
#define GPIOA_DDIR          *(WORD *) (0x2+GPIOA_BASE)
#define GPIOA_PEREN         *(WORD *) (0x3+GPIOA_BASE)
#define GPIOA_IASSRT        *(WORD *) (0x4+GPIOA_BASE)
#define GPIOA_IEN           *(WORD *) (0x5+GPIOA_BASE)
#define GPIOA_IEPOL         *(WORD *) (0x6+GPIOA_BASE)
#define GPIOA_IPEND         *(WORD *) (0x7+GPIOA_BASE)
#define GPIOA_IEDGE         *(WORD *) (0x8+GPIOA_BASE)
#define GPIOA_PPOUTM        *(WORD *) (0x9+GPIOA_BASE)
#define GPIOA_RDATA         *(WORD *) (0xA+GPIOA_BASE)
#define GPIOA_DRIVE         *(WORD *) (0xB+GPIOA_BASE)


// GPIO Port B Registers Address Map

#define GPIOB_PUPEN         *(WORD *) (0x0+GPIOB_BASE)
#define GPIOB_DATA          *(WORD *) (0x1+GPIOB_BASE)
#define GPIOB_DDIR          *(WORD *) (0x2+GPIOB_BASE)
#define GPIOB_PEREN         *(WORD *) (0x3+GPIOB_BASE)
#define GPIOB_IASSRT        *(WORD *) (0x4+GPIOB_BASE)
#define GPIOB_IEN           *(WORD *) (0x5+GPIOB_BASE)
#define GPIOB_IEPOL         *(WORD *) (0x6+GPIOB_BASE)
#define GPIOB_IPEND         *(WORD *) (0x7+GPIOB_BASE)
#define GPIOB_IEDGE         *(WORD *) (0x8+GPIOB_BASE)
#define GPIOB_PPOUTM        *(WORD *) (0x9+GPIOB_BASE)
#define GPIOB_RDATA         *(WORD *) (0xA+GPIOB_BASE)
#define GPIOB_DRIVE         *(WORD *) (0xB+GPIOB_BASE)

// GPIO Port C Registers Address Map

#define GPIOC_PUPEN         *(WORD *) (0x0+GPIOC_BASE)
#define GPIOC_DATA          *(WORD *) (0x1+GPIOC_BASE)
#define GPIOC_DDIR          *(WORD *) (0x2+GPIOC_BASE)
#define GPIOC_PEREN         *(WORD *) (0x3+GPIOC_BASE)
#define GPIOC_IASSRT        *(WORD *) (0x4+GPIOC_BASE)
#define GPIOC_IEN           *(WORD *) (0x5+GPIOC_BASE)
#define GPIOC_IEPOL         *(WORD *) (0x6+GPIOC_BASE)
#define GPIOC_IPEND         *(WORD *) (0x7+GPIOC_BASE)
#define GPIOC_IEDGE         *(WORD *) (0x8+GPIOC_BASE)
#define GPIOC_PPOUTM        *(WORD *) (0x9+GPIOC_BASE)
#define GPIOC_RDATA         *(WORD *) (0xA+GPIOC_BASE)
#define GPIOC_DRIVE         *(WORD *) (0xB+GPIOC_BASE)

// GPIO Port D Registers Address Map

#define GPIOD_PUPEN         *(WORD *) (0x0+GPIOD_BASE)
#define GPIOD_DATA          *(WORD *) (0x1+GPIOD_BASE)
#define GPIOD_DDIR          *(WORD *) (0x2+GPIOD_BASE)
#define GPIOD_PEREN         *(WORD *) (0x3+GPIOD_BASE)
#define GPIOD_IASSRT        *(WORD *) (0x4+GPIOD_BASE)
#define GPIOD_IEN           *(WORD *) (0x5+GPIOD_BASE)
#define GPIOD_IEPOL         *(WORD *) (0x6+GPIOD_BASE)
#define GPIOD_IPEND         *(WORD *) (0x7+GPIOD_BASE)
#define GPIOD_IEDGE         *(WORD *) (0x8+GPIOD_BASE)
#define GPIOD_PPOUTM        *(WORD *) (0x9+GPIOD_BASE)
#define GPIOD_RDATA         *(WORD *) (0xA+GPIOD_BASE)
#define GPIOD_DRIVE         *(WORD *) (0xB+GPIOD_BASE)


// SIM

#define SIM_CTRL            *(WORD *) (0x0+SIM_BASE)
#define SIM_RSTAT           *(WORD *) (0x1+SIM_BASE)
#define SIM_SWC0            *(WORD *) (0x2+SIM_BASE)
#define SIM_SWC1            *(WORD *) (0x3+SIM_BASE)
#define SIM_SWC2            *(WORD *) (0x4+SIM_BASE)
#define SIM_SWC3            *(WORD *) (0x5+SIM_BASE)
#define SIM_MSHID           *(WORD *) (0x6+SIM_BASE)
#define SIM_LSHID           *(WORD *) (0x7+SIM_BASE)
#define SIM_PWR             *(WORD *) (0x8+SIM_BASE)
#define SIM_CLKOUT          *(WORD *) (0xA+SIM_BASE)
#define SIM_GPS             *(WORD *) (0xB+SIM_BASE)
#define SIM_PCE             *(WORD *) (0xC+SIM_BASE)
#define SIM_IOSALH          *(WORD *) (0xD+SIM_BASE)
#define SIM_IOSALL          *(WORD *) (0xE+SIM_BASE)

// PS

#define PS_CTRL             *(WORD *) (0x0+PS_BASE)
#define PS_STAT             *(WORD *) (0x1+PS_BASE)

// FM

#define FM_CLKDIV           *(WORD *) (0x0+FM_BASE)
#define FM_CNFG             *(WORD *) (0x1+FM_BASE)
#define FM_SECHI            *(WORD *) (0x3+FM_BASE)
#define FM_SECLO            *(WORD *) (0x4+FM_BASE)
#define FM_PROT             *(WORD *) (0x10+FM_BASE)
#define FM_PROTB            *(WORD *) (0x11+FM_BASE)
#define FM_USTAT            *(WORD *) (0x13+FM_BASE)
#define FM_CMD              *(WORD *) (0x14+FM_BASE)
#define FM_DATA             *(WORD *) (0x18+FM_BASE)
#define FM_OPT1             *(WORD *) (0x1B+FM_BASE)
#define FM_TSTSIG           *(WORD *) (0x1D+FM_BASE)
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor JeanPaul » 27 Nov 2006 16:45

Olá Maia,

Testei o seu header e ele está funcionando sim.
Permite o acesso à porta mas não para cada bit separadamente.
Menos mal, pelo menos dá pra trabalhar com máscaras.
Ainda vou procurar sobre a possibilidade de trabalhar apenas com bits, se encontrar posto aqui.

Agora tenho uma outra dúvida. Quando crio um projeto, o CW inclui outros arquivos além do main.c. Sei que são arquivos de configuração de memória e oscilador, mas um simples programinha de soma, tipo a+b, gera 2K de código. Toh achando muito para o tamanho do programa.

Será que tem como criar um arquivo meu de inicialização ao invés de usar os criados pelo CW?

Valeu pela atenção!

[]'s

Jean Paul
JeanPaul
Byte
 
Mensagens: 182
Registrado em: 12 Out 2006 21:27
Localização: Florianópolis -SC

Mensagempor JeanPaul » 06 Dez 2006 21:45

Olá pessoal,

Decidi utilizar o PE no desenvolvimento dos meus projetos. Tenho uma pergunta.

Qual é a maneira mais rápida para acessar um Canal e fazer a leitura de um sinal?

Estou usando um bean de ADC e com o Measure() e o GetChanValue16() faço a leitura. Porém esta operação está levando aproximadamente 4 ms, um tanto elevado para a tarefa que vou realizar.

Tem jeito de diminuir esse tempo?


Agradeço desde já.

[]'s

Jean Paul.
JeanPaul
Byte
 
Mensagens: 182
Registrado em: 12 Out 2006 21:27
Localização: Florianópolis -SC

Mensagempor Fábio Pereira » 07 Dez 2006 07:32

Jean Paul,

Eu não sou adepto do Processor Expert. Há algum tempo eu fiz experimentos com o 56F8013 e com o CW, criei headers do zero para o mapeamento dos registradores.

Sobre o possibilidade de acesso aos bits individuais, isso seria possível se o compilador suportasse o operador @ como as versões de 8 bits do CW, mas infelizmente, já entrei em contato com o suporte da Freescale nos EUA e eles me disseram que realmente o operador @ não foi implementado neste compilador.

Sobre os arquivos adicionais e o atraso da leitura do ADC, sugiro que você passe a escrever o seu código sem PESL e configure os registradores "a mão".

Até +
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor leandrovilela » 07 Dez 2006 08:19

Também ja tentei acessar os bits individualmente mas sem sucesso. Eu migrei para o CodeWarrior a pouco tempo e estou apanhando um pouco.

Comprei um livro da editora ÉRICA chamado "Controlador Digital de Sinais Família 56F800/E, Baseado no MC56F8013". Atravez dele dá pra se conhecer um pouco o CodeWarrior.
leandrovilela
 
Mensagens: 3
Registrado em: 07 Dez 2006 08:03

Mensagempor JeanPaul » 08 Dez 2006 15:20

Olá Fábio,

Obrigado por responder, suas contribuições para o fórum são sempre muito bem vindas!

Quanto ao PE, tinha decidido trabalhar com ele meio a contra gosto, mas estou vendo que tenho que partir pra outra.

Agora estou configurando tudo na mão mesmo. Já dá pra notar uma boa redução no código, vamos ver mais pra frente como fica na questão velocidade.

Tenho o livro que o Leandro indicou, mas achei meio sem “sal”. Ajuda mais com o CW do que com o controlador em questão. Sem falar nos exemplos que são poucos e mal comentados.

Bom ... quando terminar o programa ........ posto aqui os resultados.

Por enquanto ..... muito obrigado.

[]’s


Jean Paul
JeanPaul
Byte
 
Mensagens: 182
Registrado em: 12 Out 2006 21:27
Localização: Florianópolis -SC

Mensagempor JeanPaul » 10 Dez 2006 16:21

Vamos lá ... mais uma dúvida. :?

Refiz todo o programa sem o auxilio do PE e funcionou tudo direitinho na plaquinha demo.

Porém quando desligo a placa pra levar pra bancada, o programa não fica gravado no uC. O engraçado é que, o mesmo programa feito com o auxilio do PE ... fica gravado, mesmo quando desligo a alimentação da placa.

Já estudei os códigos de inicialização gerados pelo PE e comparei com os códigos do meu programa, mas esta dificil achar onde esta a diferença. A primeira vista parecem ser iguais. :shock:

Alguém tem idéia do que pode estar acontecendo?


Agradeço desde já!

[]'s

Jean Paul.
JeanPaul
Byte
 
Mensagens: 182
Registrado em: 12 Out 2006 21:27
Localização: Florianópolis -SC

Mensagempor Maia » 10 Dez 2006 17:46

Olá Jean,
Infelizmente, por falta de tempo, o único programa que fiz para essa linha foi usando o PE e tudo está funcionando bem até hoje. Tentei fazer usando esse header que te mandei mas não consegui e aí foi com PE mesmo, mas tenho vontade de aprender a configurar esse micro no braço para poder tirar o máximo dele. Seria muito difícil vc me mostrar algumas partes do seu código sem PE pra eu dar uma estudada?
Um grande abraço,
Maia
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor JeanPaul » 10 Dez 2006 21:01

Olá Maia,

Foi exatamente este o motivo de eu ter abandonado o PE, "tirar o máximo dele". :D Eu achei o PE muito bom no que diz respeito a velocidade de desenvolvimento, pelo menos a parte de configuração é feita de forma muito rápida. Quanto ao código gerado ... não deu muita diferença entre o que eu fiz e o que o PE gerou, pensei que fosse ser maior. Para o meu caso, o problema do PE esta no tempo que leva para eu pedir a leitura de um AD e receber o valor. Talvez seja até interessante usar o PE para as configurações e fazer o pedido de leitura e acesso de registradores diretamente ... sem usar as funções disponibilizadas pelo PE. :roll:

Bom ... quanto ao código que eu escrevi ... por exemplo. Abaixo tem a configuração do PWM. Usei o header que você postou. Não tive tempo de comentar direito, mas se olhar os resgistradores dá pra ter uma idéia do que está sendo feito. Criei um arquivo para a configuração de cada periférico, as funções são chamadas no main. Este seria o arquivo pwm.c por exemplo.

Código: Selecionar todos
#ifndef __init_PWM
#define __init_PWM

#include "MC56F8013.h"
#define LDOK 2
#define PWM_EN 1


void init_PWM(void);

void init_PWM(void)
{

/**************************************************************
* ConfiguraçÃo do PWM nos Canais 2 (GPIOA2) e 3 (GPIOA3)
* Frequencia de Trabalho - 50 kHz
* Fonte de Clock - 3x PWM System Clock
* DeadTime Feito Por Software - 1us
**************************************************************/
      
   SIM_GPS = 16384;
   SIM_PCE = 8261;
   SIM_CTRL = 0;
   SIM_CLKOUT = 32;
   
   PWM_FCTRL = 0;
   PWM_CMOD = 960;
   PWM_VAL2 =    0;
   PWM_VAL3 =    960;
   asm (BFCLR #$FFFF,X:$F04E); /* Dasabilita Máscaras */
   asm (BFCLR #$FFFF,X:$F04F); /* Dasabilita Máscaras */
   PWM_DTIM0 = 1;             /*Dead Time == 1*/
   PWM_DTIM1 = 1;             /*Dead Time == 1*/
   PWM_CCTRL = 0b1000000000000000;
   PWM_CCTRL = 49152;
   PWM_OUT = 32780;
   PWM_ICCTRL = 0;
   PWM_SCTRL = 2048;
   PWM_CTRL = 61440;
   PWM_CNFG = 16398;
   PWM_CTRL = (PWM_CTRL | LDOK);   /* Carrega valores dos registradores */
   PWM_CTRL = (PWM_CTRL | PWM_EN); /* Habilita PWM */
   
      
}

# endif



Se tiver dificuldades pra configurar os outros periféricos dá um toque.

Quanto ao problema que relatei no último post ... pesquisando na net encontrei uma possível solução:

http://forums.freescale.com/freescale/board/message?board.id=CWCOMM&message.id=2763&query.id=5430#M2763

Agora o programa fica gravado no uC mas é preciso dar um reset, para que o mesmo rode normalmente, depois de energizar a fonte. Acho que o problema tem a ver com vetor de inicialização, ou esse boot de ROM pra RAM que não peguei direito ainda. :(

Bom ..... aceito qualquer sugestão!

[]'s

Jean Paul
JeanPaul
Byte
 
Mensagens: 182
Registrado em: 12 Out 2006 21:27
Localização: Florianópolis -SC

Mensagempor Fábio Pereira » 11 Dez 2006 07:44

Este problema com relação a gravação na FLASH é na verdade um problema no arquivo de inicialização do chip.

Eu tenho aqui um arquivo de inicialização corrigido, segue a listagem do mesmo:

Código: Selecionar todos
; metrowerks sample code


; PLL defines

CLKGEN      EQU $00F0F0
OSCTL       EQU $00F0F5 ; CLKGEN + 5  ; osc control register
SHUTDOWN    EQU $00F0F4 ; CLKGEN + 4  ; shutdown register
TESTR       EQU $00F0F3 ; CLKGEN + 3  ; test register
PLLSR       EQU $00F0F2 ; CLKGEN + 2  ; pll status register
PLLDB       EQU $00F0F1 ; CLKGEN + 1  ; pll divide-by register
PLLCR       EQU $00F0F0 ; CLKGEN + 0  ; pll control register

speedIndex  EQU $001D



; flash registers  (ref: MC56F8300UM.PDF)

FM_BASE     EQU $00F400
FMCLKD      EQU $00F400 ; FM_BASE + 0   clock divider register

FMOPT1      EQU $00F41B ; FM_BASE + 1B  Reserved for trim cap setting
                        ; of the relaxation oscillator
                        ; (on chips other than 56835/836/837/838)
                                               
fmClkDiv    EQU $0052



; OMR mode bits

NL_MODE         EQU      $8000
CM_MODE         EQU      $0100
XP_MODE          EQU      $0080
R_MODE          EQU      $0020
SA_MODE          EQU      $0010





; init

   section startup

   XREF   F_stack_addr
   
   
   
   
   org   p:

   
   GLOBAL Finit_MC56F801x_

   SUBROUTINE "Finit_MC56F801x_",Finit_MC56F801x_,Finit_MC56F801x_END-Finit_MC56F801x_

Finit_MC56F801x_:

   nop
   
   
   
; Alternative Download Sequence (ALS)
; when target_code_sets_hfmclkd 1 in flash cfg (default is off)
; if ALS is used, set no breakpoints before next instruction

; reset flash Clock Divider Register (FMCLKD) relative to PLL freq
; see MC56F8300UM.PDF 6.5.3.1 and 6.7.1 for value calculation
; this ensures flash breakpoints are set
; with proper flash freq for any PLL freq

   move.w #fmClkDiv,x:>>FMCLKD


   
   
; utility
;***************************************************
; Comment out by C.W. Becasue un-initialized SP
;***************************************************   
 ;   jsr      F__trim                 ; get trim value and set trim reg
   

;********************************************
; Copied from MC56F801x_trim.asm file by C.W.
;********************************************
; get trim value and set trim reg
   
   move.l   #OSCTL,R1    ; set R1 and R0 to OSCTL
   move.l   #OSCTL,R0
   move.w   X:(R0),A     ; set A to current OSCT value
   move.w   #-1024,B     ; set B to mask
   and.w    A,B          ; mask A
   move.l   #FMOPT1,R0   ; set R0 to factory-flashed trim value
   move.w   X:(R0),A     ; set A
   or.w     B,A          ; or A and B to get full OSCTL value
   move.w   A1,X:(R1)    ; set OSCTL


          
; setup the PLL (phase locked loop)
                        
    nop
    bfclr #$0006,x:>>PLLCR          ; select prescaler
    bfset #$0001,x:>>PLLCR

    bfset #$0010,x:>>PLLCR          ; power down PLL

    nop
    bfset #speedIndex,x:>>PLLDB     ; set speed index
    nop

    bfset #$0080,x:>>PLLCR          ; set lock detector on
    bfclr #$0010,x:>>PLLCR          ; power on PLL

    nop

wait_for_lock:
    bftsth #$0020,x:>>PLLSR         ; wait for lock
    jcc wait_for_lock                     
    nop
               
    move.w #$0082,x:>>PLLCR         ; switch system clock to PLL postscalar                   


   
   

; setup the OMR with the values required by C

   bfset   #NL_MODE,omr    ; ensure NL=1  (enables nested DO loops)
   nop
   nop
   
   ; ensure CM=0  (optional for C)
    ; ensure XP=0 to enable harvard architecture
    ; ensure R=0  (required for C)
    ; ensure SA=0 (required for C)
   
   bfclr   #(CM_MODE|XP_MODE|R_MODE|SA_MODE),omr      




; setup the m01 register for linear addressing

   move.w   #-1,x0
   moveu.w   x0,m01      ; set the m register to linear addressing
               
   moveu.w   hws,la      ; clear the hardware stack
   moveu.w   hws,la
   nop
   nop





CALLMAIN:                           ; initialize compiler environment

                                    ; initialize the stack
   move.l #>>F_Lstack_addr,r0
   bftsth #$0001,r0
   bcc noinc
   adda #1,r0
noinc:
   tfra   r0,sp                ; set stack pointer too
   move.w   #0,r1
   nop
   move.w   r1,x:(sp)               ; put zero at top of stack
   adda   #1,sp                   ; increment stack
   move.w   r1,x:(sp)               ; put another zero
   
   

; utilities

   
   
    jsr      F__zeroBSS              ; fill BSS space with zeroes
   jsr     F__romCopy              ; do any rom-to-ram copy
                                   ; LCF sets rom-to-ram flag
   
    nop


; call main()

   move.w   #0,y0                   ; pass parameters to main()
   move.w   #0,R2
   move.w   #0,R3

   jsr       Fmain                   ; call the users program



                                    ; end of program
                                   
;***********************
; Comment out by C.W. in order to reduce RAM usage
;***********************             ; hostIO cleanup with exit_halt
;    jsr     Fexit_halt              ; stationery examples use standard i/o
                                    ; such as printf implemented with hostIO
                                    ; so we use exit_halt here
                                    ; see runtime file exit_dsp.asm
                                    ; comment out exit_halt if not using hostIO
                                                                     
   
    debughlt                        ; or simple end of program; halt CPU   
   rts
Finit_MC56F801x_END:

   endsec


Até +
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor JeanPaul » 11 Dez 2006 08:45

Olá Fábio,

Foi a mesma alteração que fiz no meu arquivo. Valeu pela ajuda.

Mudando um pouco de assunto: :D

No programa faço algumas multiplicações e somatórios entre variáveis do tipo float. Na sua opinião, devo confiar no código gerado pelo CW ou devo arregassar as mangas e tentar otimizar o codigo em assembler?

O uC gasta um pouco de tempo nessas operações, não chega a ser um absurdo, mas qualquer coisinha é um ganho. Nunca trabalhei com floats e não tenho idéia de qual é o esforço ao qual o uC é submetido.

Obrigado mais uma vez!

[]'s

Jean Paul
JeanPaul
Byte
 
Mensagens: 182
Registrado em: 12 Out 2006 21:27
Localização: Florianópolis -SC

Mensagempor Fábio Pereira » 11 Dez 2006 15:01

Não tenho idéia ...

Minha experiência me diz que floats devem ser evitados ao máximo.

Acho que a única alternativa é observar o código ASM gerado pelo compilador e verificar se é possível otimizá-lo. Claro que em se tratando de floats, essa tarefa será realmente penosa.

Até +
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor JeanPaul » 02 Jan 2007 14:48

Só pra dar um feedback pra quem acompanhou ...

Desisti dos floats e passei a trabalhar com variáveis em fract16, o que reduziu e muito o espaço utilizado na memória, e por consequência, aumentou o desempenho do uC. Além disso implementei todas as rotinas críticas em assembler, e as rotinas mais simples em C, criando um código misto. Deu trabalho mas valeu a pena. Uma rotina que levava 2 ms para ser completada em C e com floats, agora leva menos de 10 us em assembler e fract16. E o resultado é o mesmo.

Quando iniciei este projeto pensei que poderia só trabalhar com linguagem C. Não tem jeito! Conhecimento em assembler é realmente necessário!

[]'s

Jean Paul
JeanPaul
Byte
 
Mensagens: 182
Registrado em: 12 Out 2006 21:27
Localização: Florianópolis -SC

Mensagempor msamsoniuk » 04 Jan 2007 11:56

aproveitando... alguem sabe se existe alguma alternativa para desenvolver para o 56F8013 usando linux ?
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Próximo

Voltar para NXP (ex-FreeScale (ex-Motorola))

Quem está online

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

x