Páginas: [1]   Ir para o fundo
  Imprimir  
Autor Tópico: programa pisca pisca PIC18F252  (Lida 909 vezes)
knox
Fusivel
*
Offline Offline

Mensagens: 11


« em: Novembro 04, 2007, 03:07:19 »

Boa noite a todos
preciso de algo tão simples como um programa para por um Led a piscar de segundo a segundo. Embaraçado

já andei as cabeçadas com o C mas ainda não me safei.. na verdade o led já pisca mas não de segundo a segundo mas sim de 1,7s em 1,7s..

o programa é q escrevi é assim:


#include <pic18.h>   
#include <stdio.h>


void main (void){

   int i;

   TRISA = 0;
   PORTA = 0;
   
   TRISB = 0;
   PORTB = 0;
   
   TMR0ON = 1;
   T08BIT = 0;
   T0CS = 0;
   T0SE = 0;
   
   PSA = 0;
   
   T0PS2=1;
   T0PS1=1;
   T0PS0=1;
   
   TMR0L = 0x69;
   TMR0H = 0x67;
   
   TMR0IF = 0;
   


   while (1){
      if (TMR0IF!=0)       // condição: se a flag da interrupção estigar ON
      {                  // entao vai deliga-la    
         TMR0IF=0;        // e por tensão no porto B
         PORTB=0xFF;
         for(i=0;i<10000;i++) //tempo que o led está aceso.
         {               

         }
         PORTB=0x00;
      }
         
   }
}


pensei q os valores de TMR0L e TMR0H (que calculei atraves da formula) alteravam o tempo ente piscadelas mas qd os alteros tenhos sempre os tais 1,7s entre piscadelas.

se alguem puder ajudar agradeço

cumprimentos a todos

p.s. sou mesmo dummy na programação  Embara&ccedil;ado
Registado
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #1 em: Novembro 05, 2007, 01:18:23 »

Mas tu não tens o INTCON activo, nem muito menos o bit GIE, ou tens?
Pois se não tiveres este registo activo (INTCON) para o TMR0 (BIT 5, T0IE). Se este registo de sistema (SFR), não estiver activo teu timer não está a fazer nada...

Mas, caso o INTCON estiver activo, tens que levar em conta que cada vez que o TMR0 atingir o Overflow, altura que ele provoca o interrupt, deves carrega-lo com o valor que queres, pois caso contrario ele irá fazer a contagem a partir do ZERO, até ao seu limite máximo.

Mas para mim, quem parece estar a controlar o timing do teu programa é o ciclo for, por isso tens duas possibilidades:
- baixas o tamanho da variavel "i".
- pões dois ciclos for, um dentro do outro...
  Exemplo:
               for (i=0;i<40;i++)
                  {
                    for (f=0;f<250 ;f++)
                       {
                        }
                   }

Assim, jogas com estes dois valores até atingires o que pretendes.

Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
knox
Fusivel
*
Offline Offline

Mensagens: 11


« Responder #2 em: Novembro 06, 2007, 00:28:11 »

resinba.. obgd pela ajuda já me safei..

a ideia era usar so o timmer (sem interrupts);

o unico problema do código era que os registos TMROL e TMROH esta no sitio errado.. se os puser imediatamente entes do ciclo for já funciona na perfeição.. Obg na mesma

Cumprimentos
Registado
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #3 em: Novembro 06, 2007, 02:09:46 »

OK, só mais uma pergunta... porque o uso do ciclo for, se com o timer consegues definir tanto o período do led aceso como o período do led apagado.

Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
knox
Fusivel
*
Offline Offline

Mensagens: 11


« Responder #4 em: Novembro 07, 2007, 03:41:29 »

pois... pergunta pretinente (o prof fez a mesma lol)..

é simples. como eu sou zero em programação digamos que foi uma solução á martelada =)).

Agr preciso de fazer um prog q utilizando interrupts faça com que o LED esteja 1segundo aceso e 1segundo apagado..

Um abraço
Registado
José Flor
José António Flor de Sousa
Chip
*****
Offline Offline

Mensagens: 1 054


OzFlor - José Flor


WWW
« Responder #5 em: Novembro 07, 2007, 03:56:45 »

Eu não considero que uma das forma de usar o PWM seja indiferente no seu usa do que a outra. Se existe as duas formas de fazer então porque não usar. Quem tiver rotinas escritas para implementar nos seus trabalhos posteriores elas são aceites na boa. Se for o caso de o programa ser grande e ocupar a memória toda, ai trabalha-se as rotinas de PWM de outra forma.
Eu tenho algumas rotinas de 10ms, 100ms, etc. escritas que é só copiar. Fica mais fácil usar estas rotinas porque se usar PICs diferentes, a forma de escrever usando o timer é diferente de PIC para PIC.
Mas como o amigo falou, quem é novo faz desse jeito, até que mais tarde vai aprender a outra forma.
José Flor
« Última modificação: Novembro 07, 2007, 03:59:35 por José Flor » Registado

sa
André Santos
Socket
**
Offline Offline

Mensagens: 112



« Responder #6 em: Janeiro 19, 2008, 20:59:26 »


josé flor se ñ estou enrrado neste exemplo pra por uns led´s a piscar basta uzar a funcao delay? num pic18f4520 funciona perfeitamente  Sorridente ja que para um fim tao simples ñ vale a pena complicar o codigo.
Registado
José Flor
José António Flor de Sousa
Chip
*****
Offline Offline

Mensagens: 1 054


OzFlor - José Flor


WWW
« Responder #7 em: Janeiro 20, 2008, 14:46:39 »


josé flor se ñ estou enrrado neste exemplo pra por uns led´s a piscar basta uzar a funcao delay? num pic18f4520 funciona perfeitamente  Sorridente ja que para um fim tao simples ñ vale a pena complicar o codigo.
Normalmente criam-se rotinas com esse nome "delay" e ai se programa o delay (demora) quer de uma ou de outra forma. Isto em assembler. Em C++ usamos essa função. Em C eu não sei se tem, mas deve ter. Eu não sei programar em C, somente fiz um básico em C++.
José Flor
Registado

sa
André Santos
Socket
**
Offline Offline

Mensagens: 112



« Responder #8 em: Janeiro 20, 2008, 23:34:41 »

pois de verdade o meu forte em programacao é apenas em C/C++ mas mais em C. Assembly pouco sei mas devia saber mais  Lingua

ja agora experimenta por dentro de cada if um
por exemplo
 50 ms:   " Delay1KTCYx(50); " que é 1*50
 500ms:  " Delay10KTCYx(50); " que é 10*50

um exemplo de codigo testado no mplab pisca pisca alternadamente na porta b pra c 1 segundo


#include <p18f252.h>
#include <delays.h>

#pragma config OSC = EC
#pragma config WDT = OFF
#pragma config LVP = OFF

void main(void)
{

int counter = 0;

TRISB = 0x00;
PORTB = 0x00;
TRISC = 0x00;
PORTC = 0xFF;

 while (1) {

   if(counter==0)
   {
   PORTB = 0xFF;
   PORTC = 0x00;
   counter=1;
   Delay10KTCYx(50);
   }
   else
   {
   PORTB = 0x00;
   PORTC = 0xFF;
   counter=0;
   Delay10KTCYx(50);
   }

 }

}





cumps

« Última modificação: Janeiro 21, 2008, 00:16:56 por sa » Registado
southafrikanse
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 307


Esforço, Dedicação, Devoção e Glória


WWW
« Responder #9 em: Abril 09, 2008, 10:06:39 »

A mim disseram-me que usar delays pode provocar algum atraso no funcionamento do circuito caso haja variação da tensão nominal de alimentação dos integrados.

Recorrendo sempre a timers essa situação deixa de existir.
Registado

Merry Christmas Contente
My personal blog: Eurico Leite
My blog: Tugatrónica
My other blog: TugaSport
sa
André Santos
Socket
**
Offline Offline

Mensagens: 112



« Responder #10 em: Abril 10, 2008, 19:16:25 »

sim é verdade, pra ter mais precisao é melhor utilizar os timers, e tb um bom oscilador.

cumps
Registado
Páginas: [1]   Ir para o topo
  Imprimir  
 
Ir para: