Autor Tema: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()  (Leído 12869 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« en: 16 de Octubre de 2006, 15:22:15 »
Hola,

estoy siguiendo los ejemplos de iniciación y me surge un "porblema/duda". Resulta que cuando hago un Output_high(PIN_A0), por ejemplo, y después de un delay hago otro Output_high(PIN_A1), por ejemplo, se me apaga el led que tengo en PIN_A0. La pregunta es si hacer un Output_high implica que de todo el puerto sólo estará en alto ese pin y por lo tanto el resto que estubieran en alto se irán a 0.

Mi código de prueba es este:

#include <16f676.h>         //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT      //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#use fast_io(a)


///PROGRAMA

void main(void)
{
   set_tris_a(0xF0);   //porta como salida
   disable_interrupts(GLOBAL);   //todas las interrupciones desactivadas
   
   do
   {
      output_high(PIN_A0);
      delay_ms(1000);
      output_high(PIN_A1); <--- Aquí se me apaga el led de A0
      delay_ms(1000);
      output_a(0b00000011); //Para encender los dos a la vez tengo que usar esto
      delay_ms(1000);
      output_low(PIN_A0); <-- Aquí tampoco se apagan de forma secuencial sino los dos a la vez
      delay_ms(1000);
      output_low(PIN_A1);
   }while(TRUE);
}     



Muchas gracias por la ayuda a este novato.

Saludos!!
« Última modificación: 16 de Octubre de 2006, 15:32:41 por DarkVect »

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #1 en: 16 de Octubre de 2006, 18:54:26 »
Hola DarkVect!

Con la instrucción 'output_high(PIN)' pones a nivel alto cualquier pin, sólo ese pin, sin variar el estado de los demás.

Es posible que no tengas puestas resistencias en los diodos led?? Ya nos comentas.


Un saludo desde Alicante.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #2 en: 17 de Octubre de 2006, 03:27:40 »
Hola,

Sí tengo puestas las resistencias. Uso leds de 3mm con resistencias de 470 ohmios. Se encienden con buena luminosidad.

Además tengo puesta una resistencia de 1K entre MCLR y Vdd para tener siempre en alto el Reset (que en este PIC va negado) y luego entre las patas OSC1 y OSC2 el cristal de cuarzo con sus condensadores tal y como indica el datasheet.

Creo que la cosa puede ir en la definición del puerto, pero es que mirando el manual no me impone ninguna restricción en los 4 primeros pines de I/O: A0 a A3.

He probado el mismo código con otro PIC igual y me hace lo mismo. Por si sirve de ayuda utilizo el CCS tanto para programar como para compilar.

Saludos y gracias de nuevo.

Desconectado pelusac

  • PIC16
  • ***
  • Mensajes: 118
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #3 en: 17 de Octubre de 2006, 08:36:52 »
Lo acabo de simular en Proteus y es verdad pasa exáctamente lo que dices pero por que me he confundido  :shock:y he cargado tu programa en un PIC16f876 si cambio el #include por el 16f876 y simulo va perfectamente ,,no puedo probar en proteus con el PIC que dices ya que además de no conocerlo en mi Proteus no esta para simularlo......

Prueba con el 16F876 ((si tienes la posibilidad de hacerlo))y verás como todo sale a tu gusto.

Un saludo y suerte.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #4 en: 17 de Octubre de 2006, 10:05:02 »
Gracias por probarlo.

Esta tarde miraré de hacerlo en otro PIC. Pero de todas formas no lo entiendo. El tris_a está bien configurado, verdad?

Gracias de nuevo!!

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #5 en: 17 de Octubre de 2006, 10:30:47 »
El 16F676 tiene resistencias pull-up configurables en el PORTA.

Prueba a deshabilitar esta funcion y todo lo demás hasta ver qué es lo que está haciendo que el PORTA funcione tan raro con:

   disable_interrupts(global);
   setup_comparator(NC_NC_NC_NC);
   SETUP_ADC(ADC_OFF);
   SETUP_ADC_PORTS(NO_ANALOGS);
   port_a_pullups(FALSE);
   set_tris_a(0b11110000);

y vemos qué pasa.

P.D. Puedes quitar también el #use fast_io(a) para dejar que CCS C ponga a su gusto los set_tris_x

 
« Última modificación: 17 de Octubre de 2006, 10:40:48 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #6 en: 17 de Octubre de 2006, 11:30:07 »
RedPic eres un AS. A sido incluir la configuración que me has dicho y funcionar a la primera.

Las sentencias de los puertos analógicos las entiendo y la del pull-up también, pero qué hace esta: setup_comparator(NC_NC_NC_NC);

Gracias!!!

Mi segundo "programilla" y ya estaba desesperado :(

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #7 en: 17 de Octubre de 2006, 13:36:38 »
Una pregunta más. En lugar de hacer port_a_pullups(FALSE) se podrían configurar de forma individual las pullups en las patas que queramos?? En el datasheet dice que sí, me podríais decir la nstrucción en C?

Gracias!!

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #8 en: 17 de Octubre de 2006, 13:52:44 »
Amigo DarkVect:

Lo único que he hecho es aplicarme lo que le recomiendo a todo el mundo .... y algo más.

Paso a describirte mi línea de pensamiento y acción (por si a algún amigo le sirve):

Primero me he descargado y me he leído el Datasheet (No completo, solo la sección dedicada al PORTA).

Nunca he trabajado con los 676 y es importante no suponer nada por similitud con los que si conozco, me he llevado grandes sorpresas con algún que otro modelo en los que al reset se activaban no se qué opciones y otras que normalmente estaban activas al reset se desactivaban, o que este o aquel pin solo era de entrada o salida o ninguna de las dos, o sea que no estaba implementada.

He visto que el PORTA del 676, los pines A0 y A1, podian funcionar en tres modos distintos, como puerto digital, como entradas analógicas o como comparadores analógicos, además vi que tenían la opcion de las pull-ups (y las interrupción por cambio de estado).

Asi que si en tu programa los estabas utilizando como salidas análogicas todo lo demás debía estar deshabilitado.

Me he ido al directorio devices del PICC y he abierto con el notepad el fichero 16F676.h que es donde puedo ver lo que el CCS C puede hacer con estos pic's.

Y de cada una de las secciones que hay en ese fichero he tomado la función que deshabilita lo que tuviese que ver con las posibilidades de los pines A0 y A1:

Así:

1.- si puede tener interrupciones por cambio de estado disable_interrupts(global); las deshabilita.
2.- si puede funcionar como puerto analógico SETUP_ADC_PORTS(NO_ANALOGS); lo deshabilita y ademas SETUP_ADC(ADC_OFF); apaga el conversor analógico.
3.- si puede funcionar como comparador setup_comparator(NC_NC_NC_NC); lo deshabilita, y si te fijas también era viable escribir setup_comparator(NC_NC); pero el anterior es mas completo así que me decidí por él.
4.- si puede tener pull-ups port_a_pullups(FALSE); las desconecta.

Si con esto no funcionaba tu programa tendría que decidirme entre no contestar ningún post tuyo o cortarme las venas ... ja ja ja ja  :D  :D  :D

P.D. Para activar o desactivar una a una las pull-up habrá que ver si el datasheet muestra algún registro donde esto sea programable y/o programarlo adecuadamente.

P.D.II En tu programa hay un pequeño punto en que todos hemos caído, la mayoria de las veces inadvertidamente. Entre el do{ y el }while(true) pones todo lo que quieres que hagan los led's ... pero como ya sabes es un bucle infinito ... así que tras el último output_low(PIN_A1); y el primer output_high(PIN_A0); de nuevo no hay rutina de delay alguna por lo que inmediatamente que se pone en bajo A1 se pone en alto A0. ¿Es eso lo que quieres? o ¿deseas que también discurra un segundo entre los dos apagar un led y encender el otro?

Pos eso.







« Última modificación: 17 de Octubre de 2006, 14:01:44 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #9 en: 17 de Octubre de 2006, 14:47:29 »
Gracias por la explicación.

En orden inverso... ya he añadido el delay al final. Me he dado cuenta al probarlo con el nuevo código que me has dado.

No creas que no leí el datasheet!! Pero para un novato hay cosas en chino casi literlamente. En el puerto A del 676 existe un registro WPUA configurable para definir las entradas en las que quieres pullups. Los bits 6 y 7 no son configurables porque no corresponden a ninguna pata y el 3 tampoco porque siempre la tiene activa (este pin es el MCLR además de RA3).

Pero en el manual del CCS, que también he leído, no he visto nada del tipo set_tris_a pero para el registro de pullups, con lo que sólo se me ocurre usar ASM para modificar el registro, pero de ASM ni idea.

Se podría definir el registro de forma similar a la que se define un puerto: #byte registro_pullups_a = @WPUA???

Por otro lado, creía que si no activas las cosas específicamente no están activas, pero bueno, ahora ya se que hay que mirarlo todo.

Gracias de nuevo por la ayuda!!

Un saludo!!

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #10 en: 17 de Octubre de 2006, 15:34:20 »
creía que si no activas las cosas específicamente no están activas ja ja ja  :D  :D  :D la ventaja de llevar mas tiempo en esto es que ya hemos caído en las mismas trampas que tú.

En los primero experimentos que hice tuve la suerte de que las cosas activas que necesitaba eran las que estaban activas .... pero cuando me pasé a los 18F me di de bofetadas con todo tipo de cosas activas que no me hacían falta. Puertos completos que al reset se configuraban como analógicos, pines que se ponían por defecto como inputs y cosas por el estilo.

Si el 676 tiene posibilidad de configurar una a una las pull-ups ... voy a ver el datasheet ...

Exacto tiene el registro WPUA para eso así que lo que hay es que buscar la dirección de memoria del WPUA para hacer lo que tu propones ... y veo en la pagina 12 del datasheet que el WPUA está en la direccion 0x95.

#byte WPUA = 0x95 (tambien vale tu nombre de registro_pullups_a pero para mantener el mismo nombre que le dan en el datasheet prefiero usar el de WPUA)

Si quiero solo la primera pull-up activada debo escribir

WPUA = 0b00000001;

Fíjate que en esa misma página en la línea del WPUA la penúltima columna dice Value on POR --11 -111 o sea que  tras un Power Off Reset, o sea tras apagar y encender el PIC, las pull-ups ¡se activan todas! Pero en la página 19 dice que automáticamente se desconectan si haces un TRIS=0 pero como tu haces un TRIS=0xF0 probablemente no se desactiven todas, o a lo mejor sí .... hay que leer más  ... ja ja ja  :D  :D  :D





WPUA
« Última modificación: 17 de Octubre de 2006, 15:37:36 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #11 en: 17 de Octubre de 2006, 18:38:30 »
Gracias!!!

Mira que bien, se puede hacer lo que yo decía, jeje!! Voy a probarlo.

Saludos!!


Desconectado manuelroin24

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 665
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #12 en: 20 de Octubre de 2006, 20:05:18 »
Hasta hace unos minutos pensaba que OUTPUT_HIGH solo ponia un bit pero entonces debo concluir que con varios OUTPUT_high puedo poner todo un puerto a 255 pero cuando una vez probe eso me salio mal tan igual como mi amigo y en el mio era un pic16f84a y alguien me dijo que el output.... solo pone un solo bit para eso hay otros codigos para mover un numero al puerto, alguien me podrias explicar
El conocimiento se consigue a base de esfuerzo...

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #13 en: 21 de Octubre de 2006, 06:15:33 »
Las funciones output_high(PIN); o output_low(PIN); sólo controla un pin del microcontrolador, mientras que si queremos controlar el puerto entero, está la función output_x(DATO); dónde x es la letra del puerto a usar, por ejemplo, para usar el puerto b, pondremos output_b(DATO);


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado manuelroin24

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 665
Re: DUDA CON OUTPUT_HIGH() Y OUTPUT_LOW()
« Respuesta #14 en: 21 de Octubre de 2006, 12:17:32 »
Hola mi amigo, si eso suponia pero en el caso anterior como es q el compañero soluciono el problema ya q el hizo varios output_high..... y asi nunca se podria conseguir llenar mas de un bit cierto
El conocimiento se consigue a base de esfuerzo...


 

anything