ajuda num programa em C no 8051?

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

ajuda num programa em C no 8051?

Mensagempor renan-papaco » 25 Dez 2012 08:33

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?
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: ajuda num programa em C no 8051?

Mensagempor andre_luis » 25 Dez 2012 19:37

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.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor KrafT » 25 Dez 2012 20:47

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...
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Mensagempor andre_luis » 25 Dez 2012 23:39

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.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor KrafT » 26 Dez 2012 07:08

André, isso se a variavel "contador" for maior que 8 bits. Se não o nosso amigo vai ficar mais perdido ainda, hehehe....
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: ajuda num programa em C no 8051?

Mensagempor ze » 26 Dez 2012 12:48

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)
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: ajuda num programa em C no 8051?

Mensagempor renan-papaco » 28 Dez 2012 12:55

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.
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Mensagempor mastk » 01 Jan 2013 22:45

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.
Avatar do usuário
mastk
Dword
 
Mensagens: 4407
Registrado em: 14 Out 2006 20:43

Mensagempor msamsoniuk » 02 Jan 2013 01:07

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.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor ze » 02 Jan 2013 08:22

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor deniro » 14 Jan 2013 19:32

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;
}
Avatar do usuário
deniro
Byte
 
Mensagens: 135
Registrado em: 19 Out 2006 20:18
Localização: Rio de Janeiro


Voltar para 8051

Quem está online

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

x