Autor Tema: configuración de timer y delays  (Leído 4220 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cignacio6

  • PIC10
  • *
  • Mensajes: 6
configuración de timer y delays
« en: 15 de Noviembre de 2014, 20:38:05 »
Hola amigos, soy un poco novato en este tema y estoy intentando sacar una señal analógica de 8 bits(Con r2r) que tengan 50 Hz, algo simular a una señal seno. El problema que tengo es cuando intento tirar la otra señal con el desface correspondiente el sistema "colapsa" y ambas señales salen con 25 Hz y amorfa.
creo que puede ser un problema con los delay y los timer que estoy utilizando y no logro configurar ambos puertos con distinto timer. Estoy usando el puerto B y el C completos.

Gracias!!

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: configuración de timer y delays
« Respuesta #1 en: 16 de Noviembre de 2014, 05:08:13 »
Envianos tu programa y podremos ayudarte mejor
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado cignacio6

  • PIC10
  • *
  • Mensajes: 6
Re: configuración de timer y delays
« Respuesta #2 en: 16 de Noviembre de 2014, 13:39:38 »
Ahi va el codigo que estoy intentando configurar.

Código: [Seleccionar]
#include <16f877a.h>
#fuses xt, nowdt, noprotect
#use delay (clock = 4M)
#byte trisa = 0x85
#byte trisb = 0x86
#byte trisc = 0x87
#byte porta = 0x06
#byte portb = 0x05
#byte portc = 0x07
#byte option_reg = 0x81
#use standard_io(b)
#use standard_io(a)

int i=0;
         

void main () {

                output_low(pin_b0);                      //Coloca estado cero pin 0
                output_low(pin_b1);                      //Coloca estado cero pin 1
                output_low(pin_b2);                      //Coloca estado cero pin 2
                output_low(pin_b3);                       //Coloca estado cero pin 3
                output_low(pin_b4);                      //Coloca estado cero pin 5
                output_low(pin_b5);                      //Coloca estado cero pin 6
                output_low(pin_b6);                      //Coloca estado cero pin 7
                output_low(pin_b7);                      //Coloca estado cero pin 8
                output_high(pin_a0);                       //Coloca estado cero pin 0
                output_low(pin_a1);                       //Coloca estado cero pin 1
                output_low(pin_a2);                       //Coloca estado cero pin 2
                output_low(pin_a3);                       //Coloca estado cero pin 3
                output_low(pin_a4);                       //Coloca estado cero pin 4
                output_low(pin_a5);                       //Coloca estado cero pin 5
                output_low(pin_c0);                      //Coloca estado cero pin 0
                output_low(pin_c1);                      //Coloca estado cero pin 1
                output_low(pin_c2);                      //Coloca estado cero pin 2
                output_low(pin_c3);                       //Coloca estado cero pin 3
                output_low(pin_c4);                      //Coloca estado cero pin 5
                output_low(pin_c5);                      //Coloca estado cero pin 6
                output_low(pin_c6);                      //Coloca estado cero pin 7
                output_low(pin_c7);                      //Coloca estado cero pin 8
               
               // setup_timer_2(T2_DIV_BY_16,127,1);      //0.8 us overflow, 0.8 us interrupt
   
                             while(true){
                                                   output_high(pin_b0);                       
                                                   output_high(pin_b1); 
                                                   output_high(pin_b2);
                                                   output_high(pin_b3);
                                                   output_high(pin_b4);
                                                   output_high(pin_b5);
                                                   output_high(pin_b6);
                                                   output_high(pin_b7);
                                                   delay_us(7500);
                                                   
                                                   output_low(pin_b0);                       
                                                   output_low(pin_b1); 
                                                   output_low(pin_b2);
                                                   output_low(pin_b3);
                                                   output_low(pin_b4);
                                                   output_low(pin_b5);
                                                   output_low(pin_b6);
                                                   output_high(pin_b7);
                                                   delay_us(2500);
                                                   
                                                   output_low(pin_b0);                       
                                                   output_low(pin_b1); 
                                                   output_low(pin_b2);
                                                   output_low(pin_b3);
                                                   output_low(pin_b4);
                                                   output_low(pin_b5);
                                                   output_low(pin_b6);
                                                   output_low(pin_b7);
                                                   delay_us(7500);
                                                   
                                                   output_low(pin_b0);                       
                                                   output_low(pin_b1); 
                                                   output_low(pin_b2);
                                                   output_low(pin_b3);
                                                   output_low(pin_b4);
                                                   output_low(pin_b5);
                                                   output_low(pin_b6);
                                                   output_high(pin_b7);
                                                   delay_us(2500);
         
                                          // segundo disparo con desfase correspondiente
                                                   output_low(pin_c0);
                                                   output_low(pin_c1); 
                                                   output_low(pin_c2);
                                                   output_low(pin_c3);
                                                   output_low(pin_c4);
                                                   output_low(pin_c5);
                                                   output_low(pin_c6);
                                                   output_low(pin_c7);
                                                   delay_us(7500);
                                                   
                                                   output_low(pin_c0);                       
                                                   output_low(pin_c1); 
                                                   output_low(pin_c2);
                                                   output_low(pin_c3);
                                                   output_low(pin_c4);
                                                   output_low(pin_c5);
                                                   output_low(pin_c6);
                                                   output_high(pin_c7);
                                                   delay_us(2500);
                                                   
                                                   output_high(pin_c0);                       
                                                   output_high(pin_c1); 
                                                   output_high(pin_c2);
                                                   output_high(pin_c3);
                                                   output_high(pin_c4);
                                                   output_high(pin_c5);
                                                   output_high(pin_c6);
                                                   output_high(pin_c7);
                                                   delay_us(7500);
                                                   
                                                   output_low(pin_c0);                       
                                                   output_low(pin_c1); 
                                                   output_low(pin_c2);
                                                   output_low(pin_c3);
                                                   output_low(pin_c4);
                                                   output_low(pin_c5);
                                                   output_low(pin_c6);
                                                   output_high(pin_c7);
                                                   delay_us(2500);
                              }
                              }
                   
   

                 
                     
     
     
           

Muchas gracias !!

Desconectado cignacio6

  • PIC10
  • *
  • Mensajes: 6
Re: configuración de timer y delays
« Respuesta #3 en: 16 de Noviembre de 2014, 14:39:03 »
Envianos tu programa y podremos ayudarte mejor

Gracias amigo, ya lo subi en el post de arriba

Saludos!

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: configuración de timer y delays
« Respuesta #4 en: 16 de Noviembre de 2014, 19:30:51 »
Hola, una pregunta porque no escribes todo el puerto a la vez tipo portb(00000000); no recuerdo si se emplea esamfuncion esactamente en ccs y supongo que obtendrías mejores resultados si inmediatamente después de portb actualidades el puerto c y luego hicieses el delay, por ultimo si realizases la actualización de los puertos en una interrupción del timer tu programa sería mucho más eficiente.
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: configuración de timer y delays
« Respuesta #5 en: 17 de Noviembre de 2014, 13:49:25 »
Primero lo que puso QIQE, eso o asignarle un valor como PORTB = 0000000 ( deberia estar incluidos los registros en el pic16f877.h pero veo que los definiste).
Tambien deberias poner el PORTA.0 como digital con el registro ADCON1, no se si el standar_io() maneja el TRIS solo o tambien el registro ese. ( lo digo por que lo vi como salida )

Otra de las cosas es que estas haciendo esto:

Código: [Seleccionar]
PORTB -> 0
PORTC -> 0

while

PORTB -> 1111 1111 ( 0xFF )
PORTB -> 0000 0001 ( 0x01 )
PORTB -> 0000 0000 ( 0x00 )
PORTB -> 0000 0001 ( 0x01 )

Con eso va a salir bastante cuadrada xD. De todas formas si quisieras que sea mas simetrica, deberias de tener al menos todos los delays iguales. Como lo estas planteando vos, a 50 Hz son 20ms cada ciclo. Dividido 4 ( que son cada uno de los pasos de la señal antes de comenzar de nuevo ) serian 5ms.

Esto sirve para una sola señal.. Al menos de la forma que lo haces.

Código: [Seleccionar]
PORTB -> 1111 1111 ( 0xFF )
5ms
PORTB -> 0000 0001 ( 0x01 )
5ms
PORTB -> 0000 0000 ( 0x00 )
5ms
PORTB -> 0000 0001 ( 0x01 )
5ms

Ahora si quisieras agregar una señal mas con tu sistema, dependeria del desfazaje y esos 5ms se repartirian, solo un ejemplo:

Código: [Seleccionar]
PORTB -> 1111 1111 ( 0xFF )
2ms
PORTC -> 0xFF
3ms
PORTB -> 0000 0001 ( 0x01 )
2ms
PORTC -> 0x01
3ms
PORTB -> 0000 0000 ( 0x00 )
2ms
PORTC -> 0x00
3ms
PORTB -> 0000 0001 ( 0x01 )
2ms
PORTC -> 0x00
3ms

Si quisieras que fuera MAS parecida a una senoidal utilizas mas valores desde 0x00 a 0xFF , si no los queres calcular, haces una tabla ( un array ) con los valores y que vaya tomando desde alli cada x tiempo y solo maneja los indices