Página 1 de 2

como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 24 Out 2013 15:49
por renan-papaco
de acordo com o programa aqui abaixo, eu preciso que P0 faça uma contagem binária rápida enquanto P1 faça uma varredura binária de 0 a 3 e de 3 a 0... só que só funciona ou uma ou outra parte do programa...nunca as duas e já tentei de tudo...parece que os comandos delay e for no mesmo código dão conflito...se eu incluir a função TONE no código, só essa que funciona, a função main fica totalmente sem ação.

Código: Selecionar todos
#include<at89x52.h>
#include<delay.h>
int cont;
char saida;

 void tone(){
 
      for(cont=0;cont<10;cont++);
     
     P0=saida;
     saida++;     
           
            }
void main(){

    while(1){
    tone();
   
    P1=0;
    delay_ms(1000);
    P1=1;
    delay_ms(1000);
    P1=2;
    delay_ms(1000);
    P1=0;
    delay_ms(1000);
    P1=1;
    delay_ms(1000);         
             }
 
           }


como eu separo essas duas funções pra que uma funcione independe da outra?

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 24 Out 2013 16:08
por ze2
ao mesmo tempo literalmente só por hw. tipo 1 pelo pwm e outro pela serial. ou usando interrupt (o que pode abalar o loop). mas ve se isso dá diferença:
Código: Selecionar todos
void tone(){
for(cont=0;cont<10;cont++) //;<- //e não precisa ser int. mc de 8 bits gosta + de... unsigned char.
{
P0=saida;
saida++;
}
}

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 24 Out 2013 16:28
por renan-papaco
ze escreveu:ao mesmo tempo literalmente só por hw. tipo 1 pelo pwm e outro pela serial. ou usando interrupt (o que pode abalar o loop). mas ve se isso dá diferença:
Código: Selecionar todos
void tone(){
for(cont=0;cont<10;cont++) //;<- //e não precisa ser int. mc de 8 bits gosta + de... unsigned char.
{
P0=saida;
saida++;
}
}

não adiantou nada... P0 está fazendo a contagem enquanto que P1 está toda inativa.

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 24 Out 2013 16:32
por cfreund
Pesquise sobre TIMERS.

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 24 Out 2013 16:34
por renan-papaco
cfreund escreveu:Pesquise sobre TIMERS.

só preciso de um código pra usar como exemplo...só isso.

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 24 Out 2013 16:48
por cfreund
Qual uC? IDE?

Para o 8051, veja o manual:


89s52|: https://www.google.com.br/search?q=89s5 ... r&safe=off

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 24 Out 2013 16:59
por renan-papaco
cfreund escreveu:Qual uC? IDE?

Para o 8051, veja o manual: http://www.atmel.com/Images/doc4316.pdf

89s52|: https://www.google.com.br/search?q=89s5 ... r&safe=off

cara...sinceramente num tá ajudando. não é problema de hardware e nem to programando em assembly, e sim em C no SDCC. só quero um jeito pra fazer dois ports do 8051 contarem simultaneamente em velocidades diferentes, sendo um fazendo contagem incrementada e a outra, aleatória como vc pode ver no código.

podem até postar um código pronto pra mim q procuro estuda-lo e ver oq eu posso aprender com ele...mas me ajudem por favor!

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 24 Out 2013 18:08
por cfreund

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 24 Out 2013 21:35
por renan-papaco
mais uma vez não adiantou nada...

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 24 Out 2013 22:25
por Red Neck Guy
Tipo, fazendo em loop....

cpp code
unsigned int contadorA=100,contadorB=10;
for(;;){
if(!--contadorA){
contadorA = 100;
PINO_1 ^= 1;
}
if(!--contadorB){
contadorB = 10;
PINO_2 ^= 2;
}
delay_ms(1);
}


se te assustar com if(!--variavel), faz assim:

variavel--;
if(!variavel){
//teu código aqui
// lembra de recarregar a contagem
}

se ainda te assustar, faz assim

variavel--;
if(variavel==0){
// o código ainda vai aqui
// e ainda precisa recarregar a contagem.
}

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 24 Out 2013 23:17
por renan-papaco
olha... não dá mesmo... não posso entender nada... é grego pra mim!!! nunca fui bom em programação...admito! melhor entregar meus pontos e desistir...vender tudo q já investi... eu não aguento mais !!

não consigo assimilar nada com nada! isso chega a ser grotesco! eu estudo, leio livros, procuro ajuda em foruns mas isso é coisa pra gênio...eu não tenho o dom de criar nada em software... não consigo entender nada!! absolutamente nada... em circuitos lógicos já até cheguei a montar um jogo de pong usando matriz de leds...se tá dificil eu fazer um tone generator de multiplas frequencias no 8051 imagine um circuito desses com matriz de leds?

é pra acabar mesmo... melhor vender td q comprei... eu sou muito burro pra isso. :cry:

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 25 Out 2013 06:08
por Red Neck Guy
Se é oque queres ñ desiste ñ.
Esses livros de microcontroladore são todos péssimos em didática dá parte de programação. Talvez busar um método e legal e começar a brincar de programar fazendo coisas bobas no console e utilizando o depurador para ver como a lógica que implementaste se comporta seja um começo.
Eu por exemplo nunca sei quando colocar virgulas ou quando se inicia uma nova frase mas nao desisto de escrever por conta disso.

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 25 Out 2013 07:02
por ze2
desistir (de você) é fácil demais e vai de encontro com meus princípios (e talvez deste forum). por partes, foquemos... "só quero um jeito pra fazer dois ports do 8051 contarem simultaneamente em velocidades diferentes"
cpp code
void main(void)
{
unsigned char a;
for (;;)
{
P0=a;
P1=a/2;// /3 /4 /5 *2 *3 etc. pra sacanear com o mc, faça float a e P1=a*0.765432
delay(xxx);
}
}

por sorte sua tenho doutorado e sou phd em pisca leds para mc´s
dicas:
-use led (óbvio com resistor, xute 1k) com catodo na saída pois portas podem ser coletor aberto. Neste caso faça P0=~a; ~=inverte bit
-use proteus para simular. é trilegal e trifácil
Apesar de vc ser um mala(gradecido. note-se nos seus posts reposta) se conseguir avise que cogito a possibilidade de lhe explicar com exemplos o hw do pwm do mc. (antes tenho que fazer uma revisão). Pré condição: mostre progresso

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 25 Out 2013 07:25
por xultz
Renan Papaco:
Imagem

Agora se acalme, você não é burro não. Se eu consigo fazer um programa, qualquer pessoa consegue, acredite.
No começo é F*** prá caramba mesmo. De verdade. Quase todo mundo passou exatamente por isso. A diferença está em quem desistiu e quem insistiu.

Vamos começar então pelo começo: especifique em riqueza de detalhes o que você quer fazer no teu projeto. Quanto menos abstrato e mais claro, melhor, por exemplo:
"eu quero fazer um projeto, que terá 10 botões. Eu terei uma saída, e para cada botão pressionado, quero que num pino saia uma nota musical: o primeiro botão será 'dó' (342Hz), o segundo será 'ré' (354Hz) e assim por diante. Ao mesmo tempo quero que em outro pino fique oscilando em 150Hz por causa deste motivo ou aquele. Um terceiro pino terá um led quero que fique piscando com 3Hz enquanto o programa estiver rodando, e um quarto pino terá um led que ficará aceso por no máximo meio segundo quando um botão for pressionado".

(aquelas frequências ali eu inventei, eu não sei quais são as frequências das notas musicais). (ah, e aquela especificação ali é só um exemplo que inventei também).

Então, a primeira coisa que deve fazer e escrever aqui: especifique o que você fazer, que resultado espera do teu projeto, com a maior riqueza de detalhes possível, para então passar prá famigerada segunda etapa: fazer um fluxograma.

Re: como fazer duas contagens em velocidades diferentes?

MensagemEnviado: 25 Out 2013 07:39
por vtrx
Voce quer fazer um som polifonico,e atravez de Looping encaixado é preciso calcular bem o código.
Este tipo de código é chatinho mesmo de fazer.