Página 1 de 1

Variaveis no AD do MC9S08QG8 (migrado)

MensagemEnviado: 17 Out 2006 17:33
por Fábio Pereira
Loser
Professor


Brazil
297 Posts Posted - 04/01/2006 : 09:36:11
--------------------------------------------------------------------------------
Beleza pessoal estou com uma duvida de quem não conhece muito(alias muito pouco de C),estou utilazando o AD do MCU MC9S08QG8 e não sei como juntar os dois registradores do AD (ADCRH e ADCRL) de 8 bits em apenas uma variavel de 16 bits( VALOR_AD) ou seja juntar dois registradores de 8 bits em um de 16 , seria apenas uma soma ou tem um jeito mais correto de juntar duas variaveis?

Falou

LOSER

Fabio Pereira
Conselheiro


Brazil
2205 Posts Posted - 04/01/2006 : 11:39:56
--------------------------------------------------------------------------------
Bom,

Isso tem no meu livro ...

Tópico 1.2, tópico 6.7.2.1, exemplo 6-10.

De qualquer forma, basta utilizar o símbolo ADCR, por exemplo: VALOR_AD = ADCR;

Até +

Fábio Pereira
ScTec - Automação e Projetos Especiais
www.sctec.com.br


Edited by - Fabio Pereira on 04/01/2006 11:44:39

Loser
Professor


Brazil
297 Posts Posted - 04/01/2006 : 12:18:56
--------------------------------------------------------------------------------
Fabio o ADCR não existe como registrador Hardware ele é uma variavel de programa de 16 bits que esta relacionada aos doi registradores do AD certo? Se for isso o meu problema esta solucionado.
Muito obrigado

LOSER

Fabio Pereira
Conselheiro


Brazil
2205 Posts Posted - 04/01/2006 : 13:02:10
--------------------------------------------------------------------------------
Bom,

Na verdade o ADCR existe sim, considerando que uma variável de 16 bits (num sistema de 8) é composta de dois bytes consecutivos e considerando ainda que os registradores ADCRH e ADCRL estão localizados em endereços consecutivos, uma variável de 16 bits alocada no endereço 0x0012 irá retornar o resultado da conversão. Isto é exatamente o que o símbolo ADCR faz, na verdade, o ADCR é uma variável de 16 bits alocada no endereço 0x0012 (o endereço do ADCRH).

Quando você faz uma atribuição de um inteiro como em RES16 = ADCR, o compilador irá fazer a leitura dos dois bytes que compoem a variável ADCR.

Até +

Fábio Pereira
ScTec - Automação e Projetos Especiais
www.sctec.com.br


Loser
Professor


Brazil
297 Posts Posted - 04/01/2006 : 18:35:23
--------------------------------------------------------------------------------
La vai outra duvida estupida , liquei um trimpot no pta1 e configurei ele como ad mudando o valor do trimpot o ADCR muda de valor tambem o problema e que ele fica variando quando vario o trimpot com um valor que pode chegar a 2900 em decimal sendo que 10 bits so permitem ir ate 1023 onde posso estar errando dessa vez

//CONFIG INIT AD
ADCSC1=33;
ADCSC2=0;
ADCCFG=21;
APCTL1=2;

result=ADCR;

LOSER

Fabio Pereira
Conselheiro


Brazil
2205 Posts Posted - 05/01/2006 : 08:02:54
--------------------------------------------------------------------------------
Não vejo nada de errado no trecho de programa que você postou.

Mas o funcionamento que você relata é realmente anormal.

Até +

Fábio Pereira
ScTec - Automação e Projetos Especiais
www.sctec.com.br


Loser
Professor


Brazil
297 Posts Posted - 09/01/2006 : 06:58:12
--------------------------------------------------------------------------------
Beleza

Descobri por que o meu programa não estava rodando de forma correta , a um equivoco na descrição do funcionamento do AD na pagina 146 do sue livor Fabio no item 6.7.2.7 o bite MODE esta escrito de forma equivocada

Livor MICROCONTOLADORES HCS08
00 resultato de 8 bits
01 resultado de 10 bits
10 reservado
11 reservado

Data MC9S08QG8
00 resultato de 8 bits
01 reservado
10 resultado de 10 bits
11 reservado

Apos Escrever conforme o Data MC9S08QG8 o programa funcionou normalmente e pude simular o AD sem nenhum problema.
Valeu pessoal
Falou

LOSER

Edited by - loser on 09/01/2006 07:01:52

Fabio Pereira
Conselheiro


Brazil
2205 Posts Posted - 09/01/2006 : 09:22:08
--------------------------------------------------------------------------------
Realmente,

A informação do livro está incorreta, houve um problema de revisão neste item :-( . Vou incluir esta informação na errata.

De qualquer forma, o arquivo hcs08.h está correto e se utilizar os símbolos que eu tive o cuidado de criar para o livro, seu programa funcionará sem problemas.

Até +

Fábio Pereira
ScTec - Automação e Projetos Especiais
www.sctec.com.br

MensagemEnviado: 20 Out 2006 08:39
por lafourcade
(Aproveitando o assunto)
O que eu vou mencionar agora pode parecer ridiculo, mas... Eu configurei o ad do meu QG4 para 10 bits, Quando eu faço a emulação eu vou ler na variavel que eu guardo o valor de 10 bits e la tem 12bits. Explico: Inicialmente eu estava lendo 10 bits fiz uma logica and para isolar os 10 bits, para pegar somente os dois primeiros bits do High, mas eu reparei que ele chegava em 1023 e eu continuava movimentando o trimpot e ele começava do 0 e ia subindo. Ai eu fiz o teste: isolei os 4bits mais significativos do High e continuei lendo os outros: quando estou na metade do trimpot eu tenho 2047 e quando eu chego no final tem 4095. Tem uma explicação logica para isso? Mesmo que por acaso eu tivesse configurado errado meu ad não teria esplicação para esta resposta ser linear. E se eu configurei errado... Sempre que eu precisar de precisão, vou configurar errado. Isso Ja aconteceu com alguém?

MensagemEnviado: 20 Out 2006 09:32
por Fábio Pereira
Coloque o seu programa aqui para podermos analisar.

Até +

MensagemEnviado: 20 Out 2006 11:38
por fenix3
lafourcade escreveu:(Aproveitando o assunto)
Quando eu faço a emulação eu vou ler na variavel que eu guardo o valor de 10 bits e la tem 12bits.


Ola,
Estou sem o manual aqui, mas parece uma questao de alinhamento/centralizacao dos dados das variaveis ADCRL e ADCRH, que acabei consultando o manual e nao tem esta opcao, entao pode ser que o conversor tenha 12 bits entao!, ou ainda existe um erro na sua mascara para leitura dos valores de AD...

MensagemEnviado: 20 Out 2006 14:15
por lafourcade
Esta rotina esta acontecendo no meu "main" e aqui eu leio tres canais de AD. A variavel temperatura recebe um valor que varia de 0 a 4095. O outro canal eu leio na interrupção.

ADCSC2 = 0B00000000;
ADCSC1 = 0B00000001;

while(!ADCSC1_COCO); //Lê o valor da Analogica das teclas
teclas = ADCRL;

ADCCFG = 0B00000111;
ADCSC1 = 0B00000110;

while(!ADCSC1_COCO); //Lê o valor da Analogica da temperatura
temperatura = ((ADCRH & 0B00001111) * 256) + ADCRL;

ADCCFG = 0B00000011;
ADCSC2 = 0B00110000;
ADCSC1 = 0B01100100;

Eu setei o valor de 2500, para a minha analogica "temperatura", como nível máximo de tensão, e ele chega e passa desse valor.

deem uma olhada ai!

MensagemEnviado: 20 Out 2006 15:29
por fenix3
lafourcade escreveu: while(!ADCSC1_COCO); //Lê o valor da Analogica da temperatura
temperatura = ((ADCRH & 0B00001111) * 256) + ADCRL;


Porque voce esta multiplicando por 256?

Com esta multiplicacao sempre que o valor passar de 8 bits, os bits exedentes irao ser multiplicados por 256, eh isto mesmo que voce quer?

MensagemEnviado: 20 Out 2006 15:59
por lafourcade
Fenix3
Na verdade eu faço isso para transformar este byte no mais significativo.

ex: 1 * 256 = 256;
0x01 * 0xFF = 0x1FF;

ex2: ( (0B00000001) * 256) + 0B00000001 = 257; ou seja
0B 00000001 00000001;

entendeu?

MensagemEnviado: 20 Out 2006 17:28
por fenix3
lafourcade escreveu:entendeu?

A bom!

Mas entao, se os valores estao variando de (b00000000|b00000000) ate (b00001111|b11111111) entao ta dando 12 bits, estranho...

MensagemEnviado: 20 Out 2006 17:57
por Renie
Olá Lafourcade!

O que parece é que a configuração está errada mesmo, ao invés de 10 bits está com 12 bits, já reveu o ponto do seu programa onde configura
para os 10 bits?

MensagemEnviado: 23 Out 2006 07:35
por lafourcade
Renie escreveu:Olá Lafourcade!

O que parece é que a configuração está errada mesmo, ao invés de 10 bits está com 12 bits, já reveu o ponto do seu programa onde configura
para os 10 bits?


Quando eu seto o bit 3 e 2 com 01 no registrador ADCCFG ele fica configurado para AD de 10 bits. se eu colocar 00 fica configurado para 8 bits.
ADCCFG = 0B00000111;

É muito estranho.

MensagemEnviado: 09 Mar 2007 13:44
por eletroinf
Sem querer dar uma de coveiro, mas achei esse tópico procurando outra coisa, então resolvi testar. Com um QG8, o AD configurado pra 10 bit ele funciona @ 12bits!! Será que estão errados os datasheets ? :mrgreen: :mrgreen:
Alguém chegou a alguma conclusão ?!

MensagemEnviado: 12 Mar 2007 20:50
por eletroinf
Oops! Tá lá na errata do Livro do Fábio. Os bits <3:2> do registrador ADCCFG: para o AD funcionar no modo 10bit devem estar em "10" e não em "01".
Pelo menos descobri essa dos 12 bit, até que não é nada mau... resta saber se funciona bem mesmo, heheheh.