TODOPIC

Simuladores, editores de PCB, etc => Simuladores de circuitos => Proteus ISIS => Mensaje iniciado por: mauruxuus en 06 de Abril de 2022, 17:06:47

Título: al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: mauruxuus en 06 de Abril de 2022, 17:06:47
saludos
la variable PORTA permanece con el mismo valor('\0') cuando deberia cambiar su valor de la misma manera que lo hicieron las demas variables(que se encuentran en rojo) como se aprecia en la imagen adjunta.

gracias
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: DominusDRR en 06 de Abril de 2022, 17:20:03
saludos
la variable PORTA permanece con el mismo valor('\0') cuando deberia cambiar su valor de la misma manera que lo hicieron las demas variables(que se encuentran en rojo) como se aprecia en la imagen adjunta.

gracias

Pues si el PORTA es de 7 bits (No de 8 ), al escribir sobre él 0xF80 es como escribir 0x00 ¿O estoy errado?

Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: Eduardo2 en 06 de Abril de 2022, 19:12:04
la variable PORTA permanece con el mismo valor('\0') cuando deberia cambiar su valor de la misma manera que lo hicieron las demas variables(que se encuentran en rojo) como se aprecia en la imagen adjunta.

Estás escribiendo en PORTA (dir 0xF80)  que es para lectura -->  Para escritura es en LATA (dir 0xF89)

Además bit_set(TRISA,0)  pone el pin como entrada --> debe ser bit_clear(TRISA,0)
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: Eduardo2 en 06 de Abril de 2022, 19:14:14
...
Pues si el PORTA es de 7 bits (No de 8 ), al escribir sobre él 0xF80 es como escribir 0x00 ¿O estoy errado?

Estás errado, #byte PORTA = 0xF80  significa que a la variable PORTA se la ubica en la dirección 0xF80
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: DominusDRR en 06 de Abril de 2022, 22:05:34
...
Pues si el PORTA es de 7 bits (No de 8 ), al escribir sobre él 0xF80 es como escribir 0x00 ¿O estoy errado?

Estás errado, #byte PORTA = 0xF80  significa que a la variable PORTA se la ubica en la dirección 0xF80

Buena observación. No sabía que era necesario definir manualmente la dirección del puerto en la RAM. Hubiera pensado que el compilador hacia eso tras bambalinas.
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: KILLERJC en 06 de Abril de 2022, 23:05:02
Y vuelvo a indicar lo mismo que indique en otro post:

Si usan CCS, ¿Por qué están jugando con los registros? Utilicen las funciones provistas por CCS para manejar los puertos. Sino usen XC8.
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: Eduardo2 en 07 de Abril de 2022, 09:21:52
... No sabía que era necesario definir manualmente la dirección del puerto en la RAM. Hubiera pensado que el compilador hacia eso tras bambalinas.

Asi "deberia" ser,  dentro del mismo #include<> con todas las demás declaraciones. 

Pero como en algunos PICs la dirección de escritura es distinta que la de lectura, en algunas operaciones el código generado tiene que ser completamente diferente que con una variable standard.  En lugar de hacer eso CCS te provee de funciones como output_x(valor) , input_x() etc  y deja PORTA,LATA...  sin declarar, cosa de "empujarte" a que uses las funciones.

Yo no soy tan estricto como KillerJC pero hay que reconocer que esquivar las funciones de CCS suele dar sorpresas, este hilo es un ejemplo.


Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: DominusDRR en 07 de Abril de 2022, 09:50:41
... No sabía que era necesario definir manualmente la dirección del puerto en la RAM. Hubiera pensado que el compilador hacia eso tras bambalinas.

Asi "deberia" ser,  dentro del mismo #include<> con todas las demás declaraciones. 

Pero como en algunos PICs la dirección de escritura es distinta que la de lectura, en algunas operaciones el código generado tiene que ser completamente diferente que con una variable standard.  En lugar de hacer eso CCS te provee de funciones como output_x(valor) , input_x() etc  y deja PORTA,LATA...  sin declarar, cosa de "empujarte" a que uses las funciones.

Yo no soy tan estricto como KillerJC pero hay que reconocer que esquivar las funciones de CCS suele dar sorpresas, este hilo es un ejemplo.

Yo creo que en CCS existe esas funciones (utput_x , input_x) porque permite abstracción del código y de esa manera se puede migrar el código a otra arquitectura de microcontrolador sin muchos cambios. Por lo menos así es la idea con Harmony y XC32 de Microchip.

Lo malo de utilizar la abstracción es que generalmente utiliza o crea más código que utilizar directamente los registros involucrados.

 
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: mauruxuus en 07 de Abril de 2022, 16:29:05
Ya corregi el bit_set(TRISA,0) a... bit_clear(TRISA,0) para configurar el pin A0 como salida, y ademas intente usar el LATA en lugar del PORTA,
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: mauruxuus en 07 de Abril de 2022, 16:32:18
Ya corregi el bit_set(TRISA,0) a... bit_clear(TRISA,0) para configurar el pin A0 como salida, y ademas intente usar el LATA en lugar del PORTA, pero al hacer debug en la simulacion me da el mismo resultado...la variable sigue sin cambiar su valor
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: DominusDRR en 07 de Abril de 2022, 16:37:33
Ya corregi el bit_set(TRISA,0) a... bit_clear(TRISA,0) para configurar el pin A0 como salida, y ademas intente usar el LATA en lugar del PORTA, pero al hacer debug en la simulacion me da el mismo resultado...la variable sigue sin cambiar su valor

¿Deshabilitaste las entradas del comparador analógico y del ADC?
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: Eduardo2 en 07 de Abril de 2022, 17:18:57
Ya corregi el bit_set(TRISA,0) a... bit_clear(TRISA,0) para configurar el pin A0 como salida, y ademas intente usar el LATA en lugar del PORTA, pero al hacer debug en la simulacion me da el mismo resultado...la variable sigue sin cambiar su valor

Subí el código.
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: mauruxuus en 07 de Abril de 2022, 17:53:08
Ya corregi el bit_set(TRISA,0) a... bit_clear(TRISA,0) para configurar el pin A0 como salida, y ademas intente usar el LATA en lugar del PORTA, pero al hacer debug en la simulacion me da el mismo resultado...la variable sigue sin cambiar su valor

¿Deshabilitaste las entradas del comparador analógico y del ADC?


Soy nuevo en esto no se cual es el comparador analogico y con respecto al ADC, no se si te refieres al registro ADCON1 el cual configuré como 0x0F.
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: mauruxuus en 07 de Abril de 2022, 17:54:16
Ya corregi el bit_set(TRISA,0) a... bit_clear(TRISA,0) para configurar el pin A0 como salida, y ademas intente usar el LATA en lugar del PORTA, pero al hacer debug en la simulacion me da el mismo resultado...la variable sigue sin cambiar su valor

Subí el código.


El código es el que esta en la imagen que adjunté
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: DominusDRR en 07 de Abril de 2022, 17:59:57
Ya corregi el bit_set(TRISA,0) a... bit_clear(TRISA,0) para configurar el pin A0 como salida, y ademas intente usar el LATA en lugar del PORTA, pero al hacer debug en la simulacion me da el mismo resultado...la variable sigue sin cambiar su valor

¿Deshabilitaste las entradas del comparador analógico y del ADC?



Soy nuevo en esto no se cual es el comparador analogico y con respecto al ADC, no se si te refieres al registro ADCON1 el cual configuré como 0x0F.


Generalmente en el Puerto A, están las entradas del ADC y/o Comparador analógico. Las cuales están activadas por defecto y no pueden trabajar como entradas o salidas digitales
 Es por eso que debes configurar dichas terminales como digitales.

Lee en las hojas de datos que hace el registro ADCON1 y CMCON, que valores tiene por defecto al energizar el microcontrolador y que valor deben tener para que sean digitales.

Me imagino que PICC ya tiene macros/funciones que sólo debes utilizar.
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: Eduardo2 en 07 de Abril de 2022, 18:04:46
....
El código es el que esta en la imagen que adjunté

Es evidente que me refiero al que incluye las modificaciones.
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: KILLERJC en 07 de Abril de 2022, 20:23:27
Es que justamente para eso usan CCS, es como usar Arduino y no usar las funciones de Arduino..

Código: C
  1. void main(void)
  2. {
  3.   setup_comparator(NC_NC_NC_NC);
  4.   setup_adc_ports(NO_ANALOG);
  5.  
  6.   while(1) {
  7.    output_high(PIN_A0);
  8.    delay_ms(10);
  9.    output_low(PIN_A0);
  10.   }
  11. }

Si esto funciona entonces solo resta agregar la interrupcion..
Título: Re:al hacer un debug en proteus hay una variable que no cambia su valor--que deberi
Publicado por: mauruxuus en 07 de Abril de 2022, 20:38:27
Les agradezco a todos por sus respuestas, ya se soluciono el problema; me dió curiosidad por comentar casi todas las lineas de código menos las lineas que configuran A0 como salida y las que ponen A0 en alto, lo simulé y prendió el led del pin A0, luego descomente las lineas de código que antes había comentado para habilitar el desbordamiento por timer0 el cual al desbordarse solo cambia el estado de A0 de alto a bajo y viceversa, pero la verdad no se que hice para hacerlo funcionar.

el código quedó así:

#include<18F4550.h>
#fuses XT,NOWDT,NOLVP
#use delay (crystal=4MHz)


#byte INTCON = 0xFF2 //registro de interrupcion ->
#byte T0CON = 0xFD5  //->
#byte ADCON1 = 0xFC1 //->
#bit A0 = 0xF80.0 //direccion de mem del reg PORTA ->
#byte TRISA = 0xF92 //direccion de mem del reg TRISA ->
#byte TMR0L = 0xFD6 //registro contador ->


#INT_TIMER0
void timer0_isr(){
      TMR0L = 6; //->
      A0 = ~A0; //->
}

void main(){

  ADCON1 = 0x0F; //->
 
  T0CON = 0b11000001; //conf como timer PRE x4 ->
  INTCON = 0b10100000; //interrupcions globales e int por timer ->
 
  //T0CON = 0b11101000; //conf como contador
  //INTE = 0b10010000; //interrupcions globales e int por señal ext
 
  bit_clear(TRISA,0); //A0 como salida ->
  A0 = 1;// estado inicial alto ->
  TMR0L = 6; //->
 
 
  while(1){
  }
}//cierra main

Les adjunto el resultado de la simulación