TODOPIC

Simuladores, editores de PCB, etc => Simuladores de circuitos => Proteus ISIS => Mensaje iniciado por: cignacio6 en 15 de Noviembre de 2014, 20:38:05

Título: configuración de timer y delays
Publicado por: cignacio6 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!!
Título: Re: configuración de timer y delays
Publicado por: QIQE en 16 de Noviembre de 2014, 05:08:13
Envianos tu programa y podremos ayudarte mejor
Título: Re: configuración de timer y delays
Publicado por: cignacio6 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 !!
Título: Re: configuración de timer y delays
Publicado por: cignacio6 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!
Título: Re: configuración de timer y delays
Publicado por: QIQE 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.
Título: Re: configuración de timer y delays
Publicado por: KILLERJC 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