TODOPIC
Simuladores, editores de PCB, etc => Simuladores de circuitos => Proteus ISIS => Mensaje iniciado 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!!
-
Envianos tu programa y podremos ayudarte mejor
-
Ahi va el codigo que estoy intentando configurar.
#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 !!
-
Envianos tu programa y podremos ayudarte mejor
Gracias amigo, ya lo subi en el post de arriba
Saludos!
-
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.
-
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:
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.
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:
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