TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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 ) ;
}
}
-
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?
-
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:
-
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.
-
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:
-
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?
-
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?
-
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
-
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 ...
-
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
-
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 ) ;
}
}
-
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
-
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. :)
-
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
-
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.
-
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
-
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:
-
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:
-
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
-
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?