Autor Tema: Problema con salidas digitales RA6, RA7  (Leído 8261 veces)

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

Desconectado Rantamplan

  • PIC10
  • *
  • Mensajes: 38
Problema con salidas digitales RA6, RA7
« en: 22 de Enero de 2014, 18:05:19 »
Buenas, a ver si alguien puede hacer que vea la luz..
tengo problemas para configurar los pines RA6 y RA7 como salidas digitales. El código es muy simple:
-Configuro los Fuses. Y selecciono el reloj interno.
-Luego configuro el PORTA como salidas digitales y solo trato de poner todos los pines del PORTA a 1, pero al simularlo en MPLAB los pines RA6 y Ra7 no se dan por aludidos....
Seguro que es una tontería que se me ha pasado por alto pero soy incapaz de encontrarla...
El código en CCS:
Código: [Seleccionar]
#include <16LF1936.h>
#use fast_io(A)
#byte PORTA=0X00C

void main (void)
{
setup_oscillator(OSC_31KHZ|OSC_INTRC|OSC_PLL_OFF); //reloj interno a 31KHz
// Salidas
set_tris_A(0);
//Iniciamos el bucle infinito
for (;;)
{
PORTA=255;
}
}

El código en asembler:
Código: [Seleccionar]
List p=16LF1936
include "P16LF1936.INC"
__CONFIG _CONFIG1,_FOSC_INTOSC  & _WDTE_OFF &_MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2,_WRT_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_19 & _LVP_OFF
org 0X00
goto Inicio

org 0x05
Inicio ;Configuramos el reloj interno
Banksel OSCCON ;seleccionamos el banco del OSCCON
movlw b'00000010' ;Pll disable, Frecuencia LF 31KHz, reloj interno
MOVWF OSCCON
;Configuracion I/O
movlw b'00000000' ;RA0 como entrada
movwf TRISA
Banksel ANSELA ;seleccionamos el banco del ANSELA
movlw b'00000000' ;Todos los pines como digitales
movwf ANSELA
Banksel PORTA
Bucle
MOVLW .255
MOVWF PORTA
goto Bucle
end

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problema con salidas digitales RA6, RA7
« Respuesta #1 en: 22 de Enero de 2014, 18:09:04 »
te falta especificar los fuses, los pines a6 y a7 estan asociados al oscilador externo, tal vez por eso no te los configura correctamente
"Nada es imposible, no si puedes imaginarlo"

Desconectado Rantamplan

  • PIC10
  • *
  • Mensajes: 38
Re: Problema con salidas digitales RA6, RA7
« Respuesta #2 en: 22 de Enero de 2014, 18:32:58 »
Sorry lo he copiado mal.. en el programa si los tenía, lo que pasa es que me he equivocado y he copiado un código con el que estaba haciendo pruebas... :oops:
El código que me da problemas tiene los fuses:
Código: [Seleccionar]
#include <16LF1936.h>
#fuses INTRC_IO,WDT_SW,NOPROTECT,PUT,NOBROWNOUT,NOLVP,MCLR,NOCPD,NOCLKOUT,NOIESO,NOFCMEN,NOWRT,STVREN,BORV19,PLL_SW
#use fast_io(A)
#byte PORTA=0X00C

void main (void)
{
setup_oscillator(OSC_31KHZ|OSC_INTRC|OSC_PLL_OFF); //reloj interno a 31KHz
// Salidas
set_tris_A(0);
//Iniciamos el bucle infinito
for (;;)
{
PORTA=255;
}
}


 ;-)

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problema con salidas digitales RA6, RA7
« Respuesta #3 en: 22 de Enero de 2014, 18:36:29 »
intenta poner el

#use delay(int=31000)
"Nada es imposible, no si puedes imaginarlo"

Desconectado Rantamplan

  • PIC10
  • *
  • Mensajes: 38
Re: Problema con salidas digitales RA6, RA7
« Respuesta #4 en: 22 de Enero de 2014, 18:51:14 »
Nada, mismo resultado:
PORTA 00111111
LATA    11111111

 :(


Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problema con salidas digitales RA6, RA7
« Respuesta #5 en: 22 de Enero de 2014, 19:06:20 »
creo que el problema es tu definicion del porta, lo estas enviando a la dirección 0x0C, pero deberías enviarlo a la direccion 0x10C que es donde esta el LATA

tambien podrías probar usando la instruccion
output_a(0xFF);
"Nada es imposible, no si puedes imaginarlo"

Desconectado Rantamplan

  • PIC10
  • *
  • Mensajes: 38
Re: Problema con salidas digitales RA6, RA7
« Respuesta #6 en: 22 de Enero de 2014, 20:45:16 »
Nada he probado las dos maneras y tampoco.
También he probado utilizando  #use delay(internal=31000)
Estoy empezando a pensar que falla mi simulador de MPLAB aunque me parecería muy raro que falle en algo tan simple... :?
El registro LATA lo cambia bien pero los pines del PORTA RA6 y RA7 no cambian...
Y lo raro es que me falla también programándolo en ensamblador.


Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Problema con salidas digitales RA6, RA7
« Respuesta #7 en: 22 de Enero de 2014, 22:25:01 »
deshabilita el WDT o reinicialo.... tendras una resistencia pullups en el pin MCLR?
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Rantamplan

  • PIC10
  • *
  • Mensajes: 38
Re: Problema con salidas digitales RA6, RA7
« Respuesta #8 en: 19 de Febrero de 2014, 12:37:35 »
Perdon por la tardanza en responder pero es que he estado de viaje...

Al final como no me simulaba bien de ninguna manera, lo simule con el proteus y funciono perfectamente.
No se el motivo, pero voy a suponer que el código estaba bien.

Muchas gracias rivale y ppyote por la ayuda!

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problema con salidas digitales RA6, RA7
« Respuesta #9 en: 19 de Febrero de 2014, 13:25:13 »
Perdon por la tardanza en responder pero es que he estado de viaje...

Al final como no me simulaba bien de ninguna manera, lo simule con el proteus y funciono perfectamente.
No se el motivo, pero voy a suponer que el código estaba bien.

Muchas gracias rivale y ppyote por la ayuda!

que bien que ya funcionó ;-)

Saludos
"Nada es imposible, no si puedes imaginarlo"

Desconectado crazysound

  • PIC10
  • *
  • Mensajes: 6
Re:Problema con salidas digitales RA6, RA7
« Respuesta #10 en: 05 de Mayo de 2018, 15:15:12 »
Buenas tardes, tengo el mismo problema con el pic 16f88. Estoy intentando hacer un voltímetro de leds doble, multiplexando sus salidas, usando AN0 y AN1 (RA0 y RA1) como entradas analógicas, RA2, RA4, RA6 y RA7 como salidas comunes de 8 leds c/u. El problema que tengo es que las salidas RA6 y RA7 no me encienden los leds.
Les paso la programación:

#include <16f88.h>
#device adc=10
#use delay(clock=4M)
#fuses noprotect, nowdt, nobrownout, noput, nolvp


long nivel;                        // almacena bits


void main()
{
  set_tris_b(0b00000000);
  set_tris_a(0b00000011);          // RA0, RA1 como entradas;
  setup_adc_ports(sAN0);           // entrada RA0 como análoga
  setup_adc_ports(sAN1);           // entrada RA0 como análoga
  setup_adc(ADC_CLOCK_INTERNAL);   // reloj del conversor
  set_adc_channel(0);              // selecciona canal para conversión 
  set_adc_channel(1);              // selecciona canal para conversión


  while(true)
   {
    output_low(pin_a2);output_low(pin_a4);output_low(pin_a6);output_low(pin_a7);//apaga salidas
    output_b(0b11111111);
   
    delay_ms(10);                  // retardo para lectura   
    nivel=read_adc();              // guardo la lectura en bits
   
   
   
   
    if(nivel>50)                                                                                           
     {
      output_high(pin_a2);output_low(pin_a4);output_low(pin_a6);output_high(pin_a7);//led_01
      output_b(0b11110111);       
     }//led_01
     
    if(nivel>100)                                                                                           
     {
      output_high(pin_a2);output_low(pin_a4);output_low(pin_a6);output_high(pin_a7);//led_02
      output_b(0b11111011);       
     }//led_02
     
    if(nivel>150)                                                                                           
     {
      output_high(pin_a2);output_low(pin_a4);output_low(pin_a6);output_high(pin_a7);//led_03
      output_b(0b11111101);     
     }//led_03
     
    if(nivel>200)                                                                                           
     {
      output_high(pin_a2);output_low(pin_a4);output_low(pin_a6);output_high(pin_a7);//led_04
      output_b(0b11111110);       
     }//led_04
     
    if(nivel>250)                                                                                           
     {
      output_high(pin_a2);output_low(pin_a4);output_low(pin_a6);output_high(pin_a7);//led_05
      output_b(0b11101111);       
     }//led_05
     
    if(nivel>300)                                                                                           
     {
      output_high(pin_a2);output_low(pin_a4);output_low(pin_a6);output_high(pin_a7);//led_06
      output_b(0b11011111);       
     }//led_06
     
    if(nivel>350)                                                                                           
     {
      output_high(pin_a2);output_low(pin_a4);output_low(pin_a6);output_high(pin_a7);//led_07
      output_b(0b10111111);       
     }//led_07
     
    if(nivel>400)                                                                                           
     {
      output_high(pin_a2);output_low(pin_a4);output_low(pin_a6);output_high(pin_a7);//led_08
      output_b(0b01111111);       
     }//led_08

    if(nivel>450)                                                                                           
     {
      output_low(pin_a2);output_high(pin_a4);output_high(pin_a6);output_low(pin_a7);//led_09
      output_b(0b01111111);       
     }//led_09
     
    if(nivel>500)                                                                                           
     {
      output_low(pin_a2);output_high(pin_a4);output_high(pin_a6);output_low(pin_a7);//led_10
      output_b(0b10111111);       
     }//led_10
     
    if(nivel>550)                                                                                           
     {
      output_low(pin_a2);output_high(pin_a4);output_high(pin_a6);output_low(pin_a7);//led_11
      output_b(0b11011111);       
     }//led_11
     
    if(nivel>600)                                                                                           
     {
      output_low(pin_a2);output_high(pin_a4);output_high(pin_a6);output_low(pin_a7);//led_12
      output_b(0b11101111);       
     }//led_12
     
    if(nivel>650)                                                                                           
     {
      output_low(pin_a2);output_high(pin_a4);output_high(pin_a6);output_low(pin_a7);//led_13
      output_b(0b11111110);       
     }//led_13
     
    if(nivel>700)                                                                                           
     {
      output_low(pin_a2);output_high(pin_a4);output_high(pin_a6);output_low(pin_a7);//led_14
      output_b(0b11111101);       
     }//led_14
     
    if(nivel>750)                                                                                           
     {
      output_low(pin_a2);output_high(pin_a4);output_high(pin_a6);output_low(pin_a7);//led015     
      output_b(0b11111011);       
     }//led_15
     
    if(nivel>800)                                                                                           
     {
      output_low(pin_a2);output_high(pin_a4);output_high(pin_a6);output_low(pin_a7);//led_16
      output_b(0b11110111);       
     }//led_16
   
   } //bucle while

} /

Desconectado crazysound

  • PIC10
  • *
  • Mensajes: 6
Re:Problema con salidas digitales RA6, RA7
« Respuesta #11 en: 05 de Mayo de 2018, 15:17:47 »

* esquema.png
(33.8 kB, 1124x523 - visto 792 veces)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con salidas digitales RA6, RA7
« Respuesta #12 en: 05 de Mayo de 2018, 15:28:27 »
Código: C
  1. setup_adc_ports(sAN0);           // entrada RA0 como análoga
  2.   setup_adc_ports(sAN1);           // entrada RA0 como análoga
  3.   setup_adc(ADC_CLOCK_INTERNAL);   // reloj del conversor
  4.   set_adc_channel(0);              // selecciona canal para conversión  
  5.   set_adc_channel(1);              // selecciona canal para conversión

En resumen, solo usas AN1, el pin que seria AN0 queda como digital y no se usa para nada.

Código: C
  1. #fuses noprotect, nowdt, nobrownout, noput, nolvp

No esta configurado el oscilador, aunque el proteus no le da importancia a esto, pero necesitas configurarlo.

----------------

Respecto al circuito no se que valores poseen las resistencias, pero recorda que el pin de ese PIC puede entregar maximo de 25mA, el cual nunca deberias acercarte al maximo, y como ves esto es poca corriente como para tantos leds.

----------------

Es correcto, que si yo posee un nivel de 600 por ejemplo tenga que entrar a todos los ifs ?

Desconectado crazysound

  • PIC10
  • *
  • Mensajes: 6
Re:Problema con salidas digitales RA6, RA7
« Respuesta #13 en: 05 de Mayo de 2018, 19:27:25 »
Código: C
  1. setup_adc_ports(sAN0);           // entrada RA0 como análoga
  2.   setup_adc_ports(sAN1);           // entrada RA0 como análoga
  3.   setup_adc(ADC_CLOCK_INTERNAL);   // reloj del conversor
  4.   set_adc_channel(0);              // selecciona canal para conversión  
  5.   set_adc_channel(1);              // selecciona canal para conversión

En resumen, solo usas AN1, el pin que seria AN0 queda como digital y no se usa para nada.

Código: C
  1. #fuses noprotect, nowdt, nobrownout, noput, nolvp

No esta configurado el oscilador, aunque el proteus no le da importancia a esto, pero necesitas configurarlo.

----------------

Respecto al circuito no se que valores poseen las resistencias, pero recorda que el pin de ese PIC puede entregar maximo de 25mA, el cual nunca deberias acercarte al maximo, y como ves esto es poca corriente como para tantos leds.

----------------

Es correcto, que si yo posee un nivel de 600 por ejemplo tenga que entrar a todos los ifs ?

Hola KILLERJC, gracias por responder. La verdad que no comprendo bien los fuses, ese inicio lo copié de otro circuito que usa entradas analógicas. Soy nuevo en lo que es programación.
Cómo configuro el oscilador?
Las resistencias son de 330 (clásico valor para encender un led). En realidad como hace un multiplexado siempre se prende de a un led.
El tema de las entradas es porque después que me salga el voltímetro voy a tratar de hacer un vúmetro estéreo, tal cuál están las salidas, pero  modificando (rectificando) las entradas.

Saludos...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con salidas digitales RA6, RA7
« Respuesta #14 en: 05 de Mayo de 2018, 20:08:45 »
Citar
Cómo configuro el oscilador?

Depende de cual, por lo visto vamos a usar el oscilador interno, entonces con los FUSES se lo decis. los FUSES te los muestra si estas en el IDE de PICC y tocas en View -> Config bits.
Estos definen por ejemplo si queres usar MCLR o si usas como un pin mas, o si por ejemplo queres que nadie te pueda leer el codigo entonces lo seteas de alli. hay distintas opciones en el tema del oscilador tenes: XT, EC, RC, RC_IO, INTRC, INTRC_IO, la lado tenes lo que significa cada uno (o lo podes ver en el datasheet) pero el que nos interesa es INTRC_IO que es el oscilador interno y que los pines del oscilador funcionen como entrada/salida.

Citar
#FUSES INTRC_IO, NOBROWNOUT, NOCPD, NOWRT, NODEBUG, NOPROTECT, FCMEN, NOLVP, PUT, IESO

Ademas de eso lo unico que queda es que no hay una demora como para que veas que encienden los leds.
Me explico con algo mas rapido

while(1)
{
    apago todo;
    delay
   
    if(>50)
    enciendo algo
    if(>100)
    enciendo algo
}

El problema de este programa que es identico al tuyo es que los if y el encendido de los leds sucede TAN rapido (microsegundos) tal ves y suponiendo algo exagerado supongamos que por 100us ocurre toda la multiplexacion, vuelve a comenzar el while donde apago todo y te encontrar con 10ms de leds apagado, entonces para que tengas una referencia, toda la vuelta duraria 10.1ms de los cuales solo 0.1ms estan encendidos. seguramente por eso no lo ves.