Página 1 de 1

ajuda num programa em C no 8051?

MensagemEnviado: 25 Dez 2012 08:33
por renan-papaco
escrevi esse programa aqui:

#include<at89x52.h>
#include<delay.h>

void main(){
int contagem=0;
while(1){
P2=contagem;
contagem++;
delay_ms(1000);
if(contagem<255)P0=15;


}
}


quando a porta P2 chegar a 255, o valor 15 deve ser escrito na porta P0... mas a contagem não inicia, a compilação roda sem problemas.
sou bem leigo na programação ainda e não consigo entender muita coisa nos livros.. q tenho...podem me ajudar?

Re: ajuda num programa em C no 8051?

MensagemEnviado: 25 Dez 2012 19:37
por andre_luis
Renan,

Declare a variável contagem como unsigned char.
A magnitude do tipo int por ser de 16 bits - e não 8 (que é o tamanho das portas Px), pode estar interferindo.


+++

MensagemEnviado: 25 Dez 2012 20:47
por KrafT
Não manjo muito dessas paradas de programação e mcu, mas acho falta um else para a comparação (ou inicializar o P0) e a comparação está invertida.

Teu delay pode estar bem curto e te enganando...

MensagemEnviado: 25 Dez 2012 23:39
por andre_luis
Kraft,


Acertou na mosca quanto á falta do else para a reinicialização da Porta P0, e também da lógica invertida no "<".
Da maneira como o programa está, o valor de P0 nunca vai mudar depois da primeira passada nos 255.

Quanto á temporização, parece estar muito alta, pois é 1s para cada contagem, sendo necessário 4min15s (255s) para o valor da Porta mudar.


+++

MensagemEnviado: 26 Dez 2012 07:08
por KrafT
André, isso se a variavel "contador" for maior que 8 bits. Se não o nosso amigo vai ficar mais perdido ainda, hehehe....

Re: ajuda num programa em C no 8051?

MensagemEnviado: 26 Dez 2012 12:48
por ze
renan-papaco escreveu:escrevi esse programa aqui:

#include<at89x52.h>
#include<delay.h>

void main(){
int contagem=0;
while(1){
P2=contagem;
contagem++;
delay_ms(1000);
if(contagem<255)P0=15;


}
}


quando a porta P2 chegar a 255, o valor 15 deve ser escrito na porta P0... mas a contagem não inicia, a compilação roda sem problemas.
sou bem leigo na programação ainda e não consigo entender muita coisa nos livros.. q tenho...podem me ajudar?


se minha análise superficial estiver correta:
-verifique se este MC tem watch dog e desbilite-o
-simule com proteus p.ex.
-sim pode ser int sem problemas. O MC vai desconsiderar os MSB nos ports. Mas convenhamos que MC de 8 bits gosta + de char (8bits)
-P0 vai ser 15 o tempo todo.
-Voce teria que esperar 255 segundos pra acontecer... nada
-troque <255 por >5 p.ex.
-tente if (!(contagem % 5)) P1^=0xff; pra voce ver algo mágico acontecer

Depois disso já pode pensar em dominar o (micro) mundo

P.A.N.! (preguiça de escrever Próspero Ano Novo)

Re: ajuda num programa em C no 8051?

MensagemEnviado: 28 Dez 2012 12:55
por renan-papaco
lellis escreveu:
renan-papaco escreveu:escrevi esse programa aqui:

#include<at89x52.h>
#include<delay.h>

void main(){
int contagem=0;
while(1){
P2=contagem;
contagem++;
delay_ms(1000);
if(contagem<255)P0=15;


}
}


quando a porta P2 chegar a 255, o valor 15 deve ser escrito na porta P0... mas a contagem não inicia, a compilação roda sem problemas.
sou bem leigo na programação ainda e não consigo entender muita coisa nos livros.. q tenho...podem me ajudar?


se minha análise superficial estiver correta:
-verifique se este MC tem watch dog e desbilite-o
-simule com proteus p.ex.
-sim pode ser int sem problemas. O MC vai desconsiderar os MSB nos ports. Mas convenhamos que MC de 8 bits gosta + de char (8bits)
-P0 vai ser 15 o tempo todo.
-Voce teria que esperar 255 segundos pra acontecer... nada
-troque <255 por >5 p.ex.
-tente if (!(contagem % 5)) P1^=0xff; pra voce ver algo mágico acontecer

Depois disso já pode pensar em dominar o (micro) mundo

P.A.N.! (preguiça de escrever Próspero Ano Novo)



hum... bem, primeiramente P.A.N pra voces tbm hehe!

essa sua arte-manha de coocar "if (!(contagem % 5)) P1^=0xff;" parece funcionar...ate pq vcs são bem mais profissionais na programação do q eu.

vc podia me explicar a função desses operadores nesse comando?


a variavel "contagem" devo declarar como unsigned char?

e pra eu fazer um "carry out" usando outro port do MCU, por exemplo o port P2, se o port P0 atingir FF(255) o port P2 é acrescentado em 1...como se fosse um contador binário de 16 bits.

MensagemEnviado: 01 Jan 2013 22:45
por mastk
porque se ele não for unsigned vai ter o bite de sinal e sua variavel vai de -127 a 128 em vez de 0 a 255, como deseja.

MensagemEnviado: 02 Jan 2013 01:07
por msamsoniuk
soh uma observacao: esse negocio de variavel%valor nao funciona muito bem hein... pensa soh, se for um unsigned char e for variavel%5, vamos ter:

...
250%5->0 -> muda
251%5->1
252%5->2
253%5->3
254%5->4
255%5->0 -> muda
0%5->0 -> muda
1%5->1
2%5->2
3%5->3
4%5->4
5%5->0 -> muda
...

pode usar um unsigned short ou unsigned long, mas sempre vai ter uma aberracao estranha no rollover da variavel. de fato, esse negocio soh funciona com numeros de base 2 e daih vc pode usar variavel&valor, que eh mais eficiente que variavel%valor (se um and eh mais eficiente que um div em processadores q tem div, imagina entao nos que nao tem!). mas se nao for base 2, o negocio nao funciona direito.

melhor mesmo, na minha opiniao, seria decrementar uma variavel:

unsigned char variavel=5;

while(1)
{
if(!variavel--)
{
variavel=5;
P0 ^= 0xff;
}
delay_ms(1000);
}

ele vai decrementando ateh a variavel zerar. quando isso ocorre, ele reinicializa a variavel e roda algum evento. pq eh melhor decrementar e comparar com zero? pq normalmente eh mais eficiente para o compilador e alguns processadores conseguem fazer isso com apenas uma instrucao.

MensagemEnviado: 02 Jan 2013 08:22
por ze
o menino ainda vai chegar lá. o 5 foi pra ele ter uma visão humana da coisa (p.ex. temos 5 dedos). Mas o taquigráfico if (!(contagem % 5)) P1^=0xff diz: quando não (!) houver resto da divisão (%) da contagem por 5, inverta com 'ou exclusivo' (^0xff) a porta P1. São essências do c. (isso parece peido...)
Saindo do humano e indo pro lógico, considere também o que o bom amigo propôs (base 2) tem muito sentido pois se o compilador for tão (as vezes mais) inteligente quanto um programador assembly, ele vai fazer operações com bit que são + rápidas. Para efeito de comparação, faça contagem%5 e contagem%4 e veja o asm que ele gera. Também crie o decremento que o amigo propôs. (Apesar que este tipo de comparação não ser muito relevante neste seu estágio inicial. Só curioso)

"unsigned char"

Alguns compiladores voce especifica "por fora" que toda char vai ser unsigned. Para que seja com sinal +- voce teria que ser explício 'signed char contagem;'. Eu paticularmente gosto de ser explícito em tudo o que nos leva a...

"unsigned int contagem;"
agora tem que ser int. para coloca-la em 2 ports basta conhecer outra essência do c... o ">>"
P1=contagem;//contagem tem 2 bytes=16bits os 8 da esquerda serão ignorados pois só cabem 8 em P1
P2=contagem>>8; //>>8 bits da direita em P2. Seu 'carry out'.
Não tá tão explícito mas enfim...

Caso seu estágio evolutivo não lhe permita visualizar os bits sendo manipulados sem usar nenhum alucinógeno, use algum simulador que mostre os registros e rode passo a passo e veja a mer... magia saindo do c.
abç

MensagemEnviado: 14 Jan 2013 19:32
por deniro
Você quer que o programa execulte eternamente ou uma unica vez? Este exemplo ele execulta uma unica vez. Vê se dá certo porque não testei e procurei fazer o mais simples possivel já que você é inicante no assunto.

#include<at89x52.h>
#include<delay.h>

void main()
{
int contagem;

for(contagem=0;contagem<256;contagem++)
{
P2=contagem;
delay_ms(1000);
}

P0 = 15;
}