Páginas: [1]   Ir para o fundo
  Imprimir  
Autor Tópico: Sistemas embebidos / PIC24 / Programacao C  (Lida 409 vezes)
Limus
Fusivel
*
Offline Offline

Mensagens: 18


« em: Novembro 22, 2008, 11:39:45 »

Ola a todos,

Espero que este seja o lugar correcto para postar fartnew2

Eu e um colega estamos a fazer um trabalho relacionado com sistemas embebidos e precisavamos de ajuda de alguem com a vontade nestas materias.


E o seguinte...


Estamos a trabalhar com o PIC24 e o objectivo e criar um stopwatch (cronometro)

...neste momento temos o circuito electronico feito e algum codigo concebido, quase completo mas tem alguns erros  e nao esta totalmente acabado.


Estamos a usar o Proteus VSM e o MPLAB e C30 compiler

Se houver alguem que nos possa amaparar obrigado, e concerteza enviarei o material e informacao que dispomos.


Cumps
Registado
asena
Eng. Electrónico
Cristal
***
Offline Offline

Mensagens: 252



WWW
« Responder #1 em: Novembro 24, 2008, 13:04:13 »

O que é que vocês estão realmente à procura, que tipo de ajuda ?

É que um stopwatch com um PIC24, é o mesmo que estar a usar um Formula 1 na estrada nacional.


Registado

Cumprimentos,
 
António Sérgio Sena
 
Tlm.: +351.967.033.209
Fax.: +351.236.215.256
 
SENAengenharia - http://www.senaeng.com
 
- Soluções em Sistemas Electrónicos e de Microcontroladores.

- Formação em Microcontroladores PIC

.
Limus
Fusivel
*
Offline Offline

Mensagens: 18


« Responder #2 em: Novembro 24, 2008, 14:22:12 »

Ola, obrigado pela disponibilidade Wink

O trabalho e para entregar dia 15, e ja estamos a ficar aflitos. Nos compreendemos o que temos que fazer, so que como somos iniciados nisto estamos confusos em relacao a alguns detalhes (que podem ser importantes).



O objectivo e:

O utilizador deve poder fazer reset ao sistema usando um switch ou combinacao de 2 switches.

O utilizador deve poder fazer start ao sistema usando um switch.

O utilizador deve poder fazer stop ao sistema usando um switch


e assim sucessivamente (como um cronometro dos relogios digitais)


Neste momento so o conseguimos fazer parar (mais nada). O maximo que o cronometro da e 9.59.9

depois gostariamos talvez de o "ampliar" para 23.59.59...mas isso ja nao e um requisito..apenas o faremos se tivermos tempo.

Os input capture estao a baralhar a cabeca e nao estamos a ver como vamos avancar com isto.


No post em baixo esta o codigo que temos e o circuito


Mais uma vez obrigado Sorridente
Registado
Limus
Fusivel
*
Offline Offline

Mensagens: 18


« Responder #3 em: Novembro 24, 2008, 14:29:41 »

Circuito:





Codigo:

#include <p24fj128ga010.h>
#include "main.h"

_CONFIG2( FNOSC_FRCPLL & OSCIOFNC_OFF );   // Internal oscillator - 4xPLL giving 16 MIPS
                                 // pin RC15 has the oscillator                              
//Function prototypes
extern void update_display(const unsigned int min, const unsigned int tens, const unsigned int units, const unsigned int tenths);
extern unsigned int poll_switch_SW3();
               
//Global variables
unsigned int minutes;       //Minutes - For display 0
unsigned int units;         //Seconds (tens) - For display 1
unsigned int tens;          //Seconds (units) - For display 2
unsigned int tenths;        //Tenths of a second - For display 3
unsigned int displayOn=0;   //Switch for Display ON or OFF - shared by two ISR routines
unsigned int IC1BUFFERVAL;  //Used to read IC1 timer buffer
                     
io_port_A *display = (io_port_A*)&LATA;   // Address of Output latch (that connects to PORTA) - it is SAFER to write to the LATCH
io_port_A *inputs  = (io_port_A*)&PORTA;  // PORTA Address (you cannot read from LATA)
         
//Main code                        
int main()
{
   //Configure the device to use the internal oscillator
   OSCCONbits.COSC  = 1u;   // Internal oscillator with PLL
   CLKDIVbits.RCDIV = 0u;   // Internal oscillator not divided (8MHz)
   CLKDIVbits.DOZEN =0;   // No post scaling
   CLKDIVbits.DOZE  =0;   //
   
   //set up ports
   TRISA = 0x00F0;         //Least-significant 4 and most significant 8 bits are digital outputs
   LATA  = 0x0000;         //Write zero to PORTA via the latch
   
   //Initialisation of variables and display
   minutes = 0;
   units = 0;
   tens  = 0;
   tenths = 0;
   update_display(1,2,3,4);
    update_display(minutes, tens, units, tenths);
   
   //TIMER1 Configuration Register
   T1CON           = 0;
   T1CONbits.TCKPS = 0b11; //Prescale = 256
   T1CONbits.TON   = 1;    //Timer on
   TMR1            = 0;    //Reset Timer Counter
      
    //Configure TIMER1 interrupt         
   _T1IP = 4;              //Interrupt priority = 4
   PR1   = 6250-1;         //Period Register - set for 0.1s
   _T1IF = 0;              //Clear timer interrupt flag
   
   //Configure the input capture (IC1)
    _IC1IP = 4;         //Set interrupt priority for the Input Capture
   _TRISD9 = 1;        //Set RD8 to be an input
   IC1CON = 0x0002;    //InputCaptureCONfiguration register - falling edge
   _IC1IF = 0;         //Reset the Input Capture 1 Interrupt Flag
   
    //ENABLE INTERRUPTS
   _IC1IE = 1;         //Set the Input Capture 1 Interrupt Enable
   _T1IE  = 1;         //Switch on timer 1 interrupt enable

   

   //Main Loop
   while (1)
   {
        Idle();     //Switch off main core - peripherals continue
        asm("nop"); //Woken by interrupt (TIMER 1 or INPUT CAPTURE 1)
        update_display(minutes, tens, units, tenths);       

   } //end while
   
   return 0;
}


//************************************************************************
//********************* INTERRUPT SERVICE ROUTINES ***********************
//************************************************************************

//ISR FOR THE TIMER
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt()
{
    //Increment the counter on every interrupt
    tenths++;               

    //Update minutes, tens, units and tenths for the display (BCD) 
   
    //Check for an overflow - ripple to the next digit
    if (tenths == 10) {
        tenths = 0;
        units++;
    }
    if (units == 10) {
        units = 0;
        tens++;
    }
    if (tens == 6) {
        tens = 0;
        minutes++;
    }       
    if (minutes == 10) {
        minutes=0;
    }   
   
    //Reset interrrupt flag before returning
    _T1IF = 0;             
}   

//ISR FOR THE INPUT CAPTURE
void __attribute__((interrupt, no_auto_psv)) _IC1Interrupt()
{
     IC1CON = 0x0002;
    T1CON = poll_switch_SW3;
   
    //Read the IC1 buffer (we are not using this yet)     
    IC1BUFFERVAL = IC1BUF;  //This is needed to prevent buffer overflow   
   
    _IC1IF = 0;                 //Reset the interrupt flag 
}//
Registado
asena
Eng. Electrónico
Cristal
***
Offline Offline

Mensagens: 252



WWW
« Responder #4 em: Novembro 25, 2008, 11:38:17 »

Antes de vos dizer alguma coisa, já estou a estranhar o vosso programa estar todo comentado em inglês.

É perfeitamente ilógico, um programa para uma universidade portuguesa, estar comentado numa lingua estrangeira.

Cá para mim, tiraram isto da internet e adaptaram. Foi ? mais vale serem sinceros já. Pode ser que haja ajuda se forem sinceros.


Registado

Cumprimentos,
 
António Sérgio Sena
 
Tlm.: +351.967.033.209
Fax.: +351.236.215.256
 
SENAengenharia - http://www.senaeng.com
 
- Soluções em Sistemas Electrónicos e de Microcontroladores.

- Formação em Microcontroladores PIC

.
Limus
Fusivel
*
Offline Offline

Mensagens: 18


« Responder #5 em: Novembro 25, 2008, 13:11:57 »

nao Indeciso

Eu estou em Inglaterra a estudar, em Plymouth. So que ja estou registado neste forum (e noutros portugueses) ha mais tempo...ainda andava no secundario (escola profissional de electronica).


Registado
asena
Eng. Electrónico
Cristal
***
Offline Offline

Mensagens: 252



WWW
« Responder #6 em: Novembro 26, 2008, 13:39:11 »

Muito bem. Então somos/fomos colegas. Eu estive em Edimburgo aqui há uns anos atrás.

# Vocês só têem uma entrada configurda, e então os outros botões?

# Para que vai servir isto: IC1BUFFERVAL ?


Dizem que não atinam com as interrupções de capture, mas de que maneira ?


Registado

Cumprimentos,
 
António Sérgio Sena
 
Tlm.: +351.967.033.209
Fax.: +351.236.215.256
 
SENAengenharia - http://www.senaeng.com
 
- Soluções em Sistemas Electrónicos e de Microcontroladores.

- Formação em Microcontroladores PIC

.
Limus
Fusivel
*
Offline Offline

Mensagens: 18


« Responder #7 em: Novembro 26, 2008, 13:47:08 »

ola Wink

Este e o codigo que temos para as interfaces:

Ainda so temos o SW3 em funcionamento...queriamos usar agora o IC2 por exemplo, so que os timers e interrupts estao.nos a baralhar.

O ICIBUFFERVAL e para prevenir overflow...no livro que temos diz para por.



#include "main.h"

extern io_port_A *display;   // Address of Output latch (that connects to PORTA) - it is SAFER to write to the LATCH
extern io_port_A *inputs;     

//Write a constant value to the display
void update_display(const unsigned int min, const unsigned int tens, const unsigned int units, const unsigned int tenths)
{
   display->word16         = 0;   //All displays disabled
   
   display->attribute.data = min; //Write data to latch
   display->attribute.EN0  = 1;   //Select the minutes display (1 instruction cycle>60ns)
   display->attribute.EN0  = 0;   //Select the tens display
   
   display->attribute.data = tens; //Write data to latch
   display->attribute.EN1  = 1;    //Select the minutes display
   display->attribute.EN1  = 0;    //Select the tens display

   display->attribute.data = units; //Write data to latch
   display->attribute.EN2  = 1;     //Select the minutes display
   display->attribute.EN2  = 0;     //Select the tens display

   display->attribute.data = tenths; //Write data to latch
   display->attribute.EN3  = 1;      //Select the minutes display
   display->attribute.EN3  = 0;      //Select the tens display
 
}   


//Read digital switch input and return a 1 is the switch is pressed, and a 0 otherwise
unsigned int poll_switch_SW1()

{
    return (inputs->attribute.SW1);  //Read input

}

unsigned int poll_switch_SW2()

{
   return (inputs->attribute.SW2);  //Read input

}

unsigned int poll_switch_SW3()
{
   return (inputs->attribute.SW3);  //Read input
}

unsigned int poll_switch_SW4()
{
   return (inputs->attribute.SW4);  //Read input
}



Registado
asena
Eng. Electrónico
Cristal
***
Offline Offline

Mensagens: 252



WWW
« Responder #8 em: Novembro 26, 2008, 13:57:26 »

Em nenhuma parte dos dois códigos, eu vejo a configuração dos TRISC para os outros botões. O TRISA está configurado, mas falta a configuração do IC2 ::

//Configure the input capture (IC1)
    _IC1IP = 4;         //Set interrupt priority for the Input Capture
   _TRISD9 = 1;        //Set RD8 to be an input
   IC1CON = 0x0002;    //InputCaptureCONfiguration register - falling edge
   _IC1IF = 0;         //Reset the Input Capture 1 Interrupt Flag

-> repetir isto para o IC2


Ou estou equivocado ?


Registado

Cumprimentos,
 
António Sérgio Sena
 
Tlm.: +351.967.033.209
Fax.: +351.236.215.256
 
SENAengenharia - http://www.senaeng.com
 
- Soluções em Sistemas Electrónicos e de Microcontroladores.

- Formação em Microcontroladores PIC

.
Limus
Fusivel
*
Offline Offline

Mensagens: 18


« Responder #9 em: Novembro 26, 2008, 15:12:49 »

Entao e assim:

Queremos usar o SW3 para fazer parar o cronometro...usando o IC1.

Agora estamos a pensar usar o SW1 e SW2 do PORTA para fazer o RESET e START respectivamente...sendo assim nao usariamos nenhum Input capture para o fazer...sera que pode ser assim?


Neste momento so temos o PORTA e PORTD em utilizacao..por isso acho que basta TRISA E TRISD, no C (TRISC) nao ha nada.


Neste momento so conseguimos utilizar os dois pinos do PORTD (RD8 e RD9; SW3 e SW4) respectivamente para o fazer parar.....agora nao estamos a conseguir usar o IC2 onde se encontra o SW4, para ter outra funcao (reset ou start) por exemplo....(mas sera que podemos usar o SW1 e SW2 para estas duas funcoes ou e necessario tb um IC)


Sera que nos podes dar uma ajuda no codigo, para tentar ficar mais elucidado?

Obrigao pela ajuda Wink
Registado
asena
Eng. Electrónico
Cristal
***
Offline Offline

Mensagens: 252



WWW
« Responder #10 em: Novembro 26, 2008, 23:06:38 »

Vou-vos ajudar naquilo que acho viavel. Dar código feito já não pode ser: i do that for a living.

#
Nesses casos, e visto o PIC ter tantos pinos de entrada de interrupção, porque não usá-los? ou têem a limitanção de ter que usar a PORTA ?
Se sim, então vão ter que fazer Pooling no vosso programa, para testar quando há mudança de estado.
Se não, usem interrupções e não têem que estar a testar entradas.

#
Eu se fosse a vocês, em vez de usar as entradas IC, usava as entradas CN.
Têem aqui alguma obrigação? usam as IC para fazer debounce ou alguma coisa?  não me parece que seja a melhor aplicação para botões externos.
O bom das CN é que são tipo Flip-Flop. Assim que o estado alterada ascendente/descendente, gera-se uma interrupção. E depois tem um ponto a vosso favor: as CN só têem um vector de interrupção. Ou seja, assim que entram na rotina, basta testar qual dos pinos está diferente. Acaba por simplificar em alguma maneira.
Mais uma vez... depende sempre da aplicação.

#
E não se esqueçam das entradas de interrupção directas, cada uma com um vector diferente: INTx


#
A única PORTD que vi como entrada, é a 9. Por isso só vai funcionar um dos botões.

Registado

Cumprimentos,
 
António Sérgio Sena
 
Tlm.: +351.967.033.209
Fax.: +351.236.215.256
 
SENAengenharia - http://www.senaeng.com
 
- Soluções em Sistemas Electrónicos e de Microcontroladores.

- Formação em Microcontroladores PIC

.
Limus
Fusivel
*
Offline Offline

Mensagens: 18


« Responder #11 em: Novembro 27, 2008, 16:18:00 »

Ok Sorridente obrigado pela ajuda que tens dado.

Nos vamos tentar fazer o que conseguirmos...e damos noticias.

Estamos e a ficar aflitos, pois o prazo esta a acabar e ainda ha mais coisas para fazer..

Esperemos que nao tenhamos que recorrer aos teus servicos Grin

abraco!
Registado
docilio
Fusivel
*
Offline Offline

Mensagens: 12


« Responder #12 em: Dezembro 04, 2008, 18:37:20 »

Boas,

Estou a usar o mesmo pic que vocês, para implementar um anemómetro por ultra-sons.

A parte das interrupções funciona-vos bem?

Vou necessitar de fazer Input Capture a 4 portos digitais.

Vou ver então como isso funciona.

Já agora, estão a usar só o pic, ou a explorer 16?
Registado
Limus
Fusivel
*
Offline Offline

Mensagens: 18


« Responder #13 em: Dezembro 07, 2008, 15:49:48 »

ola..esse codigo funciona bem...mas ja deves ter experimentado Wink

Sinceramente nem sei o que e o/a explorer 16....nos estamos a fazer isto em ambiente virtual (simulacao), nao temos nada fisico.

Usamos o mplab, c30 e o  ISIS proteus

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