TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: elmasvital en 06 de Septiembre de 2005, 09:04:00
-
Buenas
Alguno tiene algun programa hecho para usar algun tipo de multiplexor?
Estoy haciendo un circuito con el 16f628 que pretende iluminar unos leds a través de un 74hc164 con entrada de serie y salida paralela. El problema es que no entiend bien su funcionamiento.
Segun lo que he entendido el 74hc164 se conecta al pic con dos pines...el primero con el pin clock que conecto al clk-in del pic y como data utilizo cualquier puerto de salida del pic. Supongo que tengo que pasarle un high o un low por la patilla data en cada pulso de reloj. Pero cómo hago en c para coordinarme con el reloj? es que no lo hago bien y simplemente se me encienden todos los leds...
Otra cosa ya que estamos... tengo un 7805 alimentando el pic... tendría que ponerle un condensador entre masa y la entrada o la salida del 7805? es que he puesto un 100uf35v entre la entrada (+9v) y masa de este y veo q el comportamiento del multiplexor cambia. Se lo puse pq si ponia un dedo entre los conectores del transformador al 7805 hacia el mismo comportamiento que cuando le puse el condensador...
Gracias de antemano y espero haberme explicado minimamente
-
Mira a ver si te sirve, creo que sí: http://miarroba.com/foros/ver.php?foroid=85505&temaid=955040
Un saludo
-
Escrito originalmente por pocher
Mira a ver si te sirve, creo que sí: http://miarroba.com/foros/ver.php?foroid=85505&temaid=955040
Un saludo
Me pongo a ello ya te comento. Muchas gracias
-
Si miras el datasheet del 7805 veras que recommienda poner un condensador en paralelo a la entrada y otro a la salida, el de entrada es de 330nf y el de la salida es de 100nf, yo te recomiendo que los pongas, yo en algun circuito he tenido problemas de ruidos debido a la falta de estos dos condensadores.
Salu2
-
Bueno no me funciona después de muchos intentos. A ver si me podeis ayudar. Explico inicialmente el conexionado.
Pic 16f628 con oscilador interno activado a 4mhz
74HCT164 como registro de desplazamiento tiene conectado 5 leds de las salidas q0 a q4.
Patilla RB3 del pic como data al pin 1 data in del 74hc164
Patilla RB4 del pic como clock al pin 8 clk del 74hc164
Patilla RB2 del pic (con resistencia 10k) al pin 9 (clr) del 74hc164
Programa en c
#include <16F628.h>
#fuses NOWDT, INTRC_IO, PUT, NOPROTECT, NOMCLR, NOBROWNOUT, NOLVP
#use delay(clock=4000000)
#use fast_io(B)
void main()
{
byte i[8]= 1,0,1,1,0,0,0,0;
byte n;
delay_ms(5000); // Dejamos un retardo antes del inicio del programa para evitar fallo con el programador
set_tris_b(0x00); //activamos puerta b como salida
while (true)
{
output_bit(PIN_B2,0); //clear
delay_us(1);
output_bit(PIN_B2,1);
output_bit(PIN_B4,0); // clock low
for (n=0;n<7;n++)
{
output_bit(PIN_B3,i[n]); //data
output_bit(PIN_B4,1); // clock high
delay_us(1); //
output_bit(PIN_B4,0); // clock low
}
}
}
Lo que se pretende como se podrá observar es que se iluminen los leds 1, 3,4 y 5. Si le quito el clear en cada while hace exactamnte lo mismo.
Con todo esto se encienden todos los leds sin más. He conseguido con otras modificaciones encender los leds con parpadeos muy rápidos pero sin sentido.
-
Ummmmm los vectores no se declaran asi?:
byte i[8]={1,0,1,1,0,0,0,0};
y prueba a poner #use standard_io(B) en vez de #use fast_io(B) o si es todo el portb de salida esta y define los pin de salida:#use fixed_io(b_outputs=PIN_x,..)
Asi por encima lo que me ha extrañado es la declaracion del vector i[] sin los corchetes.....
-
el array no lanza ningun error pero para descartar... esto que sigue hace exactamente lo mismo... ilumina todos los leds. Me tiene frito estoy ya la verdad es q llevo varios dias y no doy con la tecla
#include <16F628.h>
#fuses NOWDT, INTRC_IO, PUT, NOPROTECT, NOMCLR, NOBROWNOUT, NOLVP
#use delay(clock=4000000)
#use standard_io(B)
void main()
{
byte i[8]= {1,0,1,1,0,0,0,0};
byte n;
delay_ms(5000); // Dejamos un retardo antes del inicio del programa para evitar fallo con el programador
set_tris_b(0x00); //activamos puerta b como salida
output_bit(PIN_B2,0); //clear
delay_us(1);
output_bit(PIN_B2,1);
output_bit(PIN_B4,0); // clock low
while (true)
{
output_bit(PIN_B3,1); //data
output_bit(PIN_B4,1); // clock high
delay_us(1); //
output_bit(PIN_B4,0); // clock low
output_bit(PIN_B3,0); //data
output_bit(PIN_B4,1); // clock high
delay_us(1); //
output_bit(PIN_B4,0); // clock low
output_bit(PIN_B3,1); //data
output_bit(PIN_B4,1); // clock high
delay_us(1); //
output_bit(PIN_B4,0); // clock low
output_bit(PIN_B3,1); //data
output_bit(PIN_B4,1); // clock high
delay_us(1); //
output_bit(PIN_B4,0); // clock low
output_bit(PIN_B3,1); //data
output_bit(PIN_B4,1); // clock high
delay_us(1); //
output_bit(PIN_B4,0); // clock low
output_bit(PIN_B3,0); //data
output_bit(PIN_B4,1); // clock high
delay_us(1); //
output_bit(PIN_B4,0); // clock low
output_bit(PIN_B3,0); //data
output_bit(PIN_B4,1); // clock high
delay_us(1); //
output_bit(PIN_B4,0); // clock low
output_bit(PIN_B3,0); //data
output_bit(PIN_B4,1); // clock high
delay_us(1); //
output_bit(PIN_B4,0); // clock low
}
}
-
A ver, varias cosas. Cuando dices que quieres que se iluminen los LEDS 1, 3, 4 y 5 ¿a qué te refieres? ¿a los pines del 74164? Si eso es así lo tienes mal, ya que el pin 1 es entrada, no salida. Además en el array solo hay 3 unos ¿?
Fundamental que el pin 2 lo pongas a VCC ¿lo has hecho?
Estas cosas a bote pronto, esta tarde, repaso el programa con más detenimiento.
Un saludo
-
A ver los leds están conectados entre sí por el cátodo y el ánodo a cada una de las salidas del 74hc164... a las salidas q0 al q4 que corresponden a las patillas 4,5,6,7 y 10 del 74hc164.
Me dices que conecte el pin 2 del 74hc164 vcc?? no veo nada en el datasheet sobre eso... vaya lo que pone es que está como entrada B. Se me ocurre que fueran entradas lógicas tipo AND o NAND y por eso me lo digas pero me gustaria que me lo confirmases. Ahora que miro en el esquema que me pasaste no tienes conectada la patilla 14 del 74hc164 que se define como vcc. Te lo pongo para que lo mires AQUI
He intentado hacerte un esquema en el proteus pero por lo visto no tenfo el 16f628... sabes cómo podria añadirselo?
y sí, hay tres 1 en el array porque pretendo que se enciendan solo tres leds... porque ahora se me encienden todos
-
Ok acabo de ver esto en el datasheet... es q mi ingles es bastante malo.
Both inputs must be connected together or an unused input must
be tied HIGH.
traducido supongo que sera así
Ambas entradas deben ser conectadas juntas o una entrada sin usar debe estar en HIGH
Por eso supongo que me propones conectarla a vcc.
Voy a experimentar a ver si doy con la tecla.
-
Bueno solo deciros que ya lo he solucionado... era problema mio de timers... lo hacía tan rápido que los leds parecían siempre encendidos.
1 saludo gracias a todos por vuestro tiempo.
-
Disculpen que los moleste con una consulta referida con este tema:
Estoy trabajando con CCS y pic16f877 y nesecito desplazar un 1 por este shift register. Es decir, cada 1 segundo mi salida deberá ser:
10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001
Les agradeceria quien me aporte datos sobre la temporizacion del integrado o una rutina ya que no he podido lograr el desplazamiento. Saludos a Todos y Gracias!
-
El mas vital.
Porque no usas la libreria propia de CCS para los registros de dezplazamiento?? :lol: :lol:
-
El mas vital.
Porque no usas la libreria propia de CCS para los registros de dezplazamiento?? :lol: :lol:
Es un post de 2005 :-P esto está mas que superado.
Lo ha rescatado rogeliogamberro.
A ver rogelio pon aqui el codigo que usas tu para manejarlo en ccs a ver que fallo tiene
1 saludo
-
Muchas Gracias responder. Son muy amables todos. Estoy comenzando a realizar con el 74LS164 un barrido de teclado de 9 lineas (ocho del integrado y una adicional llamada PIN_ADICIONAL). Basicamente debo hacer recorrer un 1 por el Shift Register y PIN_ADICIONAL y leer el estado de las teclas desde T0 a T8, Mi problema surge que al intentar hacer recorrer el 1 por el Shift Register en la primer pasada se visualizan "varios leds encendidos que rotan". Luego, desde la segunda pasada todo se normaliza. Aqui les dejo parte del codigo con el que estoy tratando de desplazar el 1 por le 74ls164 unicamente y leer el contenido del pin T6 para simplificar. En la pantalla siempre se visualizan 7 caracteres en vez de 8 (Faltaría el Primero). Por Que? Nuevamente Muchas Gracias!
PIC16f877 en CCS
#define SHIFT_CLOCK PIN_C0
#define SHIFT_IN1 PIN_C2
#define SHIFT_CLEAR PIN_E2
#define PIN_ADICIONAL PIN_C1 // linea 9
#define T0 PIN_D7
#define T1 PIN_B0
#define T2 PIN_B1
#define T3 PIN_B2
#define T4 PIN_B3
#define T5 PIN_B4
#define T6 PIN_A5
#define T7 PIN_E0
#define T8 PIN_E1
void init74164(void)
{
// Inicializa la Linea de Cloxk
output_high(SHIFT_CLOCK);
output_low(SHIFT_IN1);
// Borra todas las entradas
output_low(SHIFT_CLEAR);
delay_us (10);
output_high(SHIFT_CLEAR);
output_low(SHIFT_CLOCK);
}
void write_74164(BYTE eo)
{
int8 i;
int1 aux1bit;
for (i=0; i<8; i++) // Envia los datos del Array
{
if ((eo & 0x80) == 0)
output_low(SHIFT_IN1);
else
output_high(SHIFT_IN1);
shift_left(&eo,1,0);
output_high(SHIFT_CLOCK);
output_low(SHIFT_CLOCK);
delay_ms (1000);
aux1bit = input (T6);
if (aux1bit == TRUE)
lcd_putc("1");
else
lcd_putc("0");
}
}
void main()
{
Configuracion de Micro
lcd_init();
init74164();
While (1)
{
lcd_gotoxy(0,0);
write_74164(0x01);
}
}
PD: al encender es circuito sucede lo siguiente:
100000000 -> Aparece un Parpadeo muy rapido y pasa a... (puede ser un transitorio en la conexion, pues no se alcanza a ver bien)
01101100 -> por un segundo
00110110 -> por un segundo
00011011 -> por un segundo
00001101 -> por un segundo
00000110 -> por un segundo
00000011 -> por un segundo
00000001 -> por un segundo
y comienza la secuencia correctamente :D
-
Bueno solo deciros que ya lo he solucionado... era problema mio de timers... lo hacía tan rápido que los leds parecían siempre encendidos.
1 saludo gracias a todos por vuestro tiempo.
una pregunta si enviaste el pin 2 a vcc o que mas modificasiones hiciste por favor contesta tengo el mismo problema
-
Para un proyecto de estudio, debo diseñar un programa cuya consigna es la siguiente:
Para controlar muchos elementos simples como magnetos, se le asigna a cada uno un bit. El conjunto de bit se envía en forma serial. Cada elemento está preparado para reconocer y aceptar el bit que le corresponde. El controlador maneja un registro de desplazamiento (shift register CD4094) con 4 líneas, una envía los bit (Dato), otra da la señal de reloj (el dato es valido con el flanco de subida) , otra para indicar que se activen los elementos (STROBE) y la cuarta para activar las salidas (OE).
Realizar un controlador para 48 elementos, con una señal de reloj de 100hz o más. Es manejado por 5 pulsadores.
Cuando el pulsador ACCIÓN es puesto a nivel L la señal de activación de elementos (OE) es puesta a nivel H.
Cuando el pulsador ARRIBA sea activado se enviaran 48 bit todos 1 (FFFFFFFFFFFFh).
Cuando el pulsador ABAJO sea activado se enviaran 48 bit todos 0 (000000000000h)
Cuando el pulsador ALTERNADO sea activado por primera vez se enviara el mensaje AAAAAAAAAAAh, la siguiente vez se enviara el mensaje 555555555555h, y así sucesivamente alternando la secuencia a enviar.
Cuando el pulsador DE A UNO sea activado se enviara el mensaje 000000000001h, la siguiente vez 000000000002h y así sucesivamente activando un magneto por vez hasta enviar el valor 800000000000h.
Despues de enviar la secuencia se manda un pulso por el pin STROBE para que la información se grabe en los flip-flop de salida.
(para PIC 16F628A)
Para comenzar necesito diseñar un generador de regidtro de desplazamiento sensillo, tal vez de 8 bit; necesitaria ayuda con esto. muchas gracias!
PD: No soy bueno ccon lo que respecta a pics y programacion.
-
Justamente es para un proyecto de estudio por el cual el codigo no creo que te lo vayan a dar facilmente, ya que estarian haciendo tu tarea.
Si tenes algo implementado seria bueno que lo pongas de esa forma es mas facil de decirte que necesitas cambiar para que luego vos lo hagas.
----------------------------
Como hacer el programa que pedis? Y depende.
Primero que nada va a depender de que lenguaje estes usando, si es C o ASM o BASIC. De eso va a depender la ayuda, la facilidad de codigo, etc. Y tambien hay que nombrar el compilador, ya que no es lo mismo usar XC8 que CCS para cuando programas en C.
Lo que se te pide es MUY simple. Y podes hacerlo de 2 formas.
Creando un SPI por software, o usando el SPI por hardware, lo bueno que cualquier que uses estos envian 8 bits.
A mi gusto usaria el SPI por hardware, se complicara un poco mas la configuracion, pero es muy simple luego para enviar datos.
Y si no queres meterte en aprender como configurar un modulo, entonces usas un SPI por software, para esto tal ves necesites un poco mas de conocimiento de programacion para entenderle, aunque no mucho.
------------------------
Hay algo que aun en la consigna no quedo claro:
Cuando OE se pone a 0 ? Ya que ACCION lo pone a 1, cuando o como se pone a 0 ?
PD: Todo esto es para que investigues y no que pienses que se te va a dar el codigo. El programa en el PIC es muy simple, solo tenes que hacer llenar casi una plantilla y funciona. Supongamos que estas en C y XC8
;Aca include
;Aca fuses ( te los hace solo el MPLAB)
main() {
;Aca configuracion de modulos ( I/O , SPI, ADC , etc ) //Mira el datasheet o ejemplos y lo vas a sacar
while(1)
{
;Aca programa principal (Leer entradas, esperar, enviar dato)
}
}
eso es todo ...
-
Bueno solo deciros que ya lo he solucionado... era problema mio de timers... lo hacía tan rápido que los leds parecían siempre encendidos.
1 saludo gracias a todos por vuestro tiempo.
podrias comartir tu programacion