TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: fastyx en 21 de Julio de 2006, 10:43:16

Título: 18f452 no toma variables de la ram
Publicado por: fastyx en 21 de Julio de 2006, 10:43:16
Amigos : estoy trabajando con un 18f452 y para saber si anda tengo un led conectado al portd.3 para debug.

coloco la instruccion output_high delay....output_low delay.... y funciona

defino en el .h un bit llamado led de esta forma ( lo hice siempre con exito) #bit led = portd.3 ,  en el main coloco led = 1 ; delay....led = 0 ; delay....y ahi no lo toma...

se puede quemar la ram del pic?

#include <18F452.h>
#device adc=8
#fuses NOWDT,WDT128,HS, NOPROTECT, NOOSCSEN, BROWNOUT, BORV20, NOPUT, NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use delay(clock=10000000)
#use rs232( baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=com1 )
#ZERO_RAM
#include "ini18fx.h"


#bit led = portd.3



void main(void)
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);

while ( true )
  {       
      led = 1 ; delay_ms ( 500 ) ;     //  asi no anda , con la instruccion ouptut bla bla bla   si
      led = 0 ; delay_ms ( 500 ) ;
  }

}
Título: Re: 18f452 no toma variables de la ram
Publicado por: wqtrp en 21 de Julio de 2006, 13:00:15
hola, creo q tienes agun problema con la definicion de la direccion del "portd"
cual es la definicion del la direccion del portd q tienes puesta?
Título: Re: 18f452 no toma variables de la ram
Publicado por: RedPic en 21 de Julio de 2006, 13:12:05
Prueba poniéndole la dirección del PORTD directamente con:

#bit led = 0xF83.3

a mi en el 18F4550 me funciona así de lujo.  :mrgreen:


Título: Re: 18f452 no toma variables de la ram
Publicado por: maunix en 21 de Julio de 2006, 13:19:48
Prueba poniéndole la dirección del PORTD directamente con:

#bit led = 0xF83.3

a mi en el 18F4550 me funciona así de lujo.  :mrgreen:


Diego, creo que es perfecta la forma de hacerlo, no solo para el 18F4550 sino para cualquier 18F.

Sin usar el CCS opino que debiera funcionar sin problemas, ya que los registros SFR (Special Function Registers) están en la access ram de estos pics, con lo cual se acceden de cualquier lugar de la memoria de programa :)

Tendría que ser muy malo el CCS para no permitirlo, no creo que se les haya pasado por alto esto, mucho menos con los 18F452.  :) :)

y si hay algún inconveniente, tiraría el listado del assembler generado y vería si realmente usa la instrucción con el parámetro indicando access ram o el uso de los registros bsr.

Título: Re: 18f452 no toma variables de la ram
Publicado por: fastyx en 21 de Julio de 2006, 13:34:45
Amigos : la direccion que puse es la que reza redpic , pero lamentablemente no anda, por eso pensaba en algun desperfecto de la ram del pic.

incluso utilizo un archivo ini18fx.h que trae todos los datos pero no anduvo :shock:
Título: Re: 18f452 no toma variables de la ram
Publicado por: RedPic en 21 de Julio de 2006, 13:36:48
fastyx, voy a darme una vuelta por el datasheet del micro .... porque en algunos casos me he encontrado sorpresas con ciertos pines .... ahora vengo.

Edito: ¿Con output_high(PIN_D3) y output_low(PIN_D3) si te funciona?
Título: Re: 18f452 no toma variables de la ram
Publicado por: fastyx en 21 de Julio de 2006, 13:41:36
si les sirve para ayudarme esto es lo que tiro en asembler en la partec del programa del while true para poner el led en 1

.................... while ( true )
....................   {
....................       led = 1 ;
006E:  BSF    F83.3
....................
....................   }
0070:  BRA    006E
....................
.................... }
....................
0072:  SLEEP

me parece que esta invocando correctamente la direccion del puerto d en 006E verdad?
Título: Re: 18f452 no toma variables de la ram
Publicado por: fastyx en 21 de Julio de 2006, 13:43:30
si redpic con  output low y high prende , y nosolamente sobre el portd.3 sino que tambien sobre rc.0( otro led)., y este ultimo tampoco responde al as maniobras sobre la ram
Título: Re: 18f452 no toma variables de la ram
Publicado por: RedPic en 21 de Julio de 2006, 13:44:37
Leo en el Datasheet que Note: On a Power-on Reset, these pins are configured as digital inputs. asi que ¿ por que no pruebas a un magnifico set_tris_d(0b0000000) antes del while ... ?

Porque CCS pone automaticamente los TRISX si no se ha declarado antes que #use FAST_IO, pero si estas jugando con la memoria "a pelo" los TRISX los debes poner tú.


Edito: PORTC tiene la misma Note: On a Power-on Reset, these pins are configured as digital inputs. Tras el reset ambos se configuran como entradas. A mi me paso una cosa similar con el PORTE que al reset se configuraba como entrada analógica ...
Título: Re: 18f452 no toma variables de la ram
Publicado por: fastyx en 21 de Julio de 2006, 13:50:54
redpic , en realidad el programa que postee es una simplificacion del que estoy usando para hacerlo corto, pero te comento que en el original esta el seteo de los tris
y la inicializacion de los puertos tambien.

te comento que ahora el puñetero pic no esta siendo reconocido por el winpic800, por lo que estoy atrascado :x
Título: Re: 18f452 no toma variables de la ram
Publicado por: fastyx en 21 de Julio de 2006, 13:57:46
este es el pedazo de codigo del original:

   porta = 0b00000000 ;  trisa= 0b00001111 ;
   portb = 0b00000000 ;  trisb= 0b00000000 ;
   portc = 0b00000000 ;  trisc= 0b10010000 ;
   portd = 0b00000000 ;  trisd= 0b00000000 ;
while ( true )

  {

    output_high( pin_d3 ) ; delay_ms ( 50 ) ;
    output_low ( pin_d3 ) ; delay_ms ( 50 ) ;
    output_high( pin_c5 ) ; delay_ms ( 50 ) ;
    output_low ( pin_c5 ) ; delay_ms ( 50 ) ;
    set_pwm1_duty ( 50 ) ;
    set_pwm2_duty ( 50 ) ;
    printf ( "Hola\r\n" ) ;delay_ms ( 50 ) ;

  }
}
Título: Re: 18f452 no toma variables de la ram
Publicado por: wqtrp en 21 de Julio de 2006, 14:38:13
Hola fastyx,  fijate del mismo lugar de donde sacaste esto q esta ams abajo y ponlo todo completo el ASM
aqui se ve q prende el pin y salta a la misma direccion quedando en un Loop,


.................... while ( true )
....................   {
....................       led = 1 ;
006E:  BSF    F83.3
....................
....................   }
0070:  BRA    006E
....................
.................... }
....................
0072:  SLEEP
Título: Re: 18f452 no toma variables de la ram
Publicado por: maunix en 21 de Julio de 2006, 14:50:06
redpic , en realidad el programa que postee es una simplificacion del que estoy usando para hacerlo corto, pero te comento que en el original esta el seteo de los tris
y la inicializacion de los puertos tambien.

te comento que ahora el puñetero pic no esta siendo reconocido por el winpic800, por lo que estoy atrascado :x

Como consejo, no hagas esto de subir solo una parte del código cuando tienes un problema de esta índole.

A lo sumo sube el .c en un archivo .zip

El punto es que tu 'asumes' que sabes por donde está el problema pero tal vez alguien con la experiencia de Diego, te pueda indicar que en realidad está en otro lado leyendo todo el código.

Ahora bien, si la duda es con una subrutina, es otro tema, pero como tu duda es sobre la ram y sobre el uso de un puerto en específico.. hay que ver sobre todo la parte de la configuración.


Es solo un consejo.  :)

Título: Re: 18f452 no toma variables de la ram
Publicado por: jfh900 en 21 de Julio de 2006, 16:12:11
Mira en el fichero ".lst" lo que te genera en ASM la instrucción "output_high" y podras ver por donde van los tiros.

Un saludo
Título: Re: 18f452 no toma variables de la ram
Publicado por: jfh900 en 21 de Julio de 2006, 16:17:27
Por cierto en la salida no pudes utilizar "portd" => 0xF83 sino "latd" => 0xF8C. Extraido del DataSheet:

The Data Latch register (LATE) is also memory
mapped
. Read-modify-write operations on the LATE
register reads and writes the latched output value for
PORTE.

Un saludo.
Título: Re: 18f452 no toma variables de la ram
Publicado por: maunix en 21 de Julio de 2006, 16:58:58
Por cierto en la salida no pudes utilizar "portd" => 0xF83 sino "latd" => 0xF8C. Extraido del DataSheet:

The Data Latch register (LATE) is also memory
mapped
. Read-modify-write operations on the LATE
register reads and writes the latched output value for
PORTE.

Un saludo.

Es cierto, pequeño gran detalle que nos pasamos por alto e hiciste muy bien en apuntarlo :)

A modo más general, he aquí estos links donde se trata el tema.


Referencias de LATx vs PORTx

http://www.todopic.com.ar/foros/index.php?topic=12181.0 (http://www.todopic.com.ar/foros/index.php?topic=12181.0)

http://www.todopic.com.ar/foros/index.php?topic=11553.0 (http://www.todopic.com.ar/foros/index.php?topic=11553.0)

http://www.todopic.com.ar/foros/index.php?topic=2255.0 (http://www.todopic.com.ar/foros/index.php?topic=2255.0)

http://www.todopic.com.ar/foros/index.php?topic=1632.0 (http://www.todopic.com.ar/foros/index.php?topic=1632.0)

url=http://www.todopic.com.ar/foros/index.php?topic=12372.0 (http://www.todopic.com.ar/foros/index.php?topic=12372.0)



Saludos


Título: Re: 18f452 no toma variables de la ram
Publicado por: RedPic en 21 de Julio de 2006, 19:03:12
Por cierto en la salida no pudes utilizar "portd" => 0xF83 sino "latd" => 0xF8C.

Pues Jesús, yo utilizo el 0xF83 y funciona perfectamente, tanto en lectura como en escritura.  :shock:

Título: Re: 18f452 no toma variables de la ram
Publicado por: fastyx en 21 de Julio de 2006, 19:17:49
Amigos : con respecto a que el pic no era reconocido por el winpic , era un conector nuevo en mal estado(el de icp) , y con respecto a lo de la ram

no me tomaba la declaracion trisd = 0b00000000 , que siempre utilicé con otros pics (16f873, 16f628) .En cuanto lo cambie por la declaracion
set_tris_d (0b00000000) lo comenzo a tomar.

despues me voy a fijar que diferencias se pueden sacar en el list de asembler ya que la forma que yo usaba siempre me dio resultados :shock:
Título: Re: 18f452 no toma variables de la ram
Publicado por: maunix en 21 de Julio de 2006, 23:51:55
Por cierto en la salida no pudes utilizar "portd" => 0xF83 sino "latd" => 0xF8C.

Pues Jesús, yo utilizo el 0xF83 y funciona perfectamente, tanto en lectura como en escritura.  :shock:

Diego, nadie dice que no vaya a funcionar (de hecho es la forma en que funcionan los 16F) pero lo ideal , lo sugerido y lo electrónicamente más recomendable (sobre todo con circuitos con cierta capacidad y con altos Mhz y usando los pines de un mismo puerto como E/S) es que se use el LATx para salida.

De hecho en los 16F ya es tarde pero los ingenieros de Microchip se dieron cuenta de este detalle en los 18F, 24F y dsPIC.

El LATch para los puertos como salida es una mejora que se puede usar o no.. pero está disponible quien lo quiera usar  :) :)

Saludos
Título: Re: 18f452 no toma variables de la ram
Publicado por: fastyx en 23 de Julio de 2006, 10:17:31
o sea que tenes que buscar en el sheet del pic cual es la direccion del lat del puerto en cuestion y colocarlo analogamente a como haciamos con el portx.y?