TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: groundman en 17 de Abril de 2014, 15:09:13
-
hola.de nuevo salto en la eleccion de un microcontrolador pic.el ultimo fue el 18F2550.pero se me queda pequeño en cuanto a algunos perifericos.
asi que me he decantado por el 18F67K22. que la verdad.anque es de la misma serie.parece que es mas complicado.aunque complicados lo son todos
si no se saben de sus caracteristicas.asi que algo tan simple como usar el modulo A/D.se me esta atrabesando.
practicamente todos los ejemplos que he buscado estan en C.y mi intencion es programarlo en asm.igual que hago con el 18F2550.
no se que puede estar pasando.he tenido que configurar mas cosas que las que tenia que configurar en el 18F2550.y todabia no
he podido hacerlo funcionar.
alguien sabe de algun ejemplo en asm? mi intencion es ir insertando ejemplos de sus respectivos modulos.
-
Hace tiempo que no programo en ASM, pero si sube algun proyecto que tenga puedo echarle una mano para revisarlo.
Saludos
-
gracias por tu interes sander.nada mas ver tu mensaje he dicho a hacer una prueba y ya he atinado.o almenos ya he obtenido datos en el registro ADRES.
pondre por aqui el ejemplo.cuando funciona algo,lo facil que parece.pero cuando no funciona.... :?
y ademas cuando el pic es diferente.y algo no funciona,no se sabe ni por donde mirar.porque son muchisimas caracteristicas añadidas.
-
Hola Groundman
Normalmente lo que da lata al principio es el configurar el reloj del micro. Imagino que de la datasheet ya barriste todo el capítulo 2.0 GUIDELINES FOR GETTING STARTED WITH PIC18FXXKXX MICROCONTROLLERS.
Checa la sección de los osciladores y ve qué debes poner en los registros de configuración del PIC. Luego ve qué debes poner en tiempo de ejecución para echar a andar el reloj.
Saludos!
-
si.migsantiago. ya me he buelto loco con eso. :z) he tenido que leerme muchas cosas del datasheet.hay muchas diferencias entre los dos pic.incluido registros
que han cambiado su funcionamiento.
creo que me voy a jugar bastante con este pic. :D
y adjunto el proyecto.lo he puesto de la forma mas simple.y con la simulacion con proteus.el potenciometro que vale es el que esta conectado por AN0.
la salida por PORTB.los servos no sirven en este proyecto.los pondre en el siguiente.
-
ahora estoy liado con los servos.resulta que quiero controlar 10 servos por PWM.por el momento mi programa controla 5.pero ese no es el problema
la cosa esta en que uso el TMR2 para controlar los tiempos.ya que con este se pueden gestionar bastantes servos.
pero no logro superar el tiempo de ciclo de 255us.el prescaler lo tengo a 16.que es lo maximo que divide la frecuencia.el postscaler
no sirve para la gestion del tiempo.y los servos funcionan entre 1 a 2ms.
y no quiero bajar la velocidad del pic.ya que me va ha hacer falta para otras gestiones.hay alguna forma que no sea la de cambiar de temporizador?
no se si habra alguna gestion de tiempos interna.que divida la velocidad del TMR2 pero no del pic.
-
por lo que he visto en el datasheet.parece que voy a tener que vajar la velocidad de fosc a 16Mhz. los registros que gestionan el PWM.son
TMR2,4,6,8,10 y 12. y estos cogen el clk de la frecuencia principal.y parece ser que tampoco puedo meterles una señal externa. :(
es mala pata.ya que estos servos son vastante baratos.2€ cada uno.si fueran digitales no habria ningun problema.pero estos son mas caros.
-
Hace algun tiempo que no hago nada con servos, pero siempre he hecho la temporizacion de 20mS con TIMER0 y las temporizaciones del DUTTY normalmente entre 0,5 y 2,5mS (algunos 0,3 y 2,3mS) siempre por bucle, y nunca he tenido problemas para controlar todos los servos sin problema.
-
resulta de que hize un proyecto de un termostato.y que simulado en proteus y en circuito real funciona perfectamente.pues le añadi un servo.
y tambien funciona perfectamente.en este proyecto uso un cristal de 4Mhz y conmuto los osciladores para que trabaje a 48Mhz.
y con el PWM consigo hasta 2ms.
pues me extrañaba de que con 64Mhz me da un tiempo maximo de 255uS.asi que me he ido al proyecto donde funcionaba el servo.donde tengo un cristal
de 4Mhz y el pic configurado a 48Mhz.y me he dado cuenta de que el pic esta funcionando a 1uS por instruccion.que son 4Mhz
parece que me he equivocado al configurar el oscilador interno.
no se si se podra poner un cristal de 4Mhz y que el TIMER2 funcione con esta frecuencia.y configurando el PLL el pic trabaje a 64Mhz.
la verdad que no entiendo muy bien la configuracion de los osciladores internos.a la vista esta el error del anterior proyecto.
PD:el tiempo que tarda una instruccion nop a 64Mhz es de 62.5uS ? no valla a estar confundido.
-
Hola groundman, a 64 MHz el tiempo de instruccion es de 4/64M lo que equivale a 62.5 nano segundos o 16 MIPS.
Alguna vez hice la prueba de trabajar a 64 MHz y no da el tiempo del TMR2 para generar la señal de 20 ms para los servos analogicos, lo resolvi utilizando el modo COMPARE del modulo CCP para generar la base de tiempo de 20 ms, y usaba el TMR2 para variar el ancho de pulso.
Saludos
-
si.me he confundido.queria decir 62.5nS .referente al compare mode.nunca lo he utilizado.se podran usar todas las salidas PWM?
creo que son 3 ECCP Y 7 CCP.
otro problema que me esta volviendo loco.es el tema de la frecuencia de reloj del pic.como dige tengo un proyecto de un termostato montado.
y estoy confundido con respecto a la frecuencia a la que esta funcionando.ya que el proteus me indica que el tiempo mas corto de ejecucion de
instruccion es de 1uS.cuando trabajando a 48Mhz deberia de ser de 83.3nS.
me extraña que el circuito preostato este trabajando a 4Mhz.mas que nada porque uso un teclado resistivo que consume mucho recurso.
y que una vez hize uno con menos codigo para un 16f84 y iva muy lento en la lectura de teclas.
asi que he realizado una rutina que produce una interrupcion cada 524ms. lo he probado en el circuito real con un led y funciona.tiene ese retardo.
y tambien lo tiene el proteus.asi que se puede decir que proteus y el circuto real van a la misma velocidad.y esto me hace dudar de si el
circuito real esta trabajando a 4Mhz o 48Mhz.
T1CON lo he cargado con este valor: b'11111101' = 1:8 Prescale value
asi que si la frecuencia es de 4Mhz (FOSC/4) = 1Mhz (1/1Mhz)=1uS *8= 8uS *512 del tmr1= 520mS.
esto me hace pensar de que el circuito esta funcionando a 4Mhz.y no a 48Mhz.
y la palabra de configuracion creo que esta bien configurada:
CONFIG PLLDIV =1
CONFIG USBDIV = 1
CONFIG CPUDIV = OSC1_PLL2
no se que me falta.para conseguir los 48Mhz
-
por fin.ya me funciona el pic 18F2550 a 48Mhz.por lo visto el oscilador no sirve el modo XT.almenos en la simulacion con el ICD2.estos son los fuses.
CONFIG PLLDIV =1
CONFIG USBDIV = 1
CONFIG CPUDIV = OSC1_PLL2
CONFIG FOSC = HSPLL_HS ;Osc por XTAL 4mhz
aunque en el proteus no detecta la configuracion de los fuses.y hay que ponerle al pic 48Mhz para que simule correctamente.
ahora hare las pruebas con el 18F67K22.haber si puedo hacer lo del comparador para que me funcionen los servos.
-
hola de nuevo.como comentaba al principio del hilo.queria pasarme a un pic superior de la serie 18F.
al final me decante por el 18F87K22.ya que segun el precio y las caracteristicas creo que es la mejor opcion.ya monte la PCB y estoy empezando con las practicas
en el ICD2.
por el momento son todo problemas.el primero es que segun una nota de microchip.no debe de excederse el voltage de vpp.describen como proteger
el pin MCLR con un diodo zener regulado para no pasar de 12V.al principio puse un zener de 11v porque no encontraba uno de 12v.pues el
MPLAB no reconocia el pic.puse uno de 12V y ya me lo reconoce.puedo programarlo,leerlo y borrarlo.
ahora el problema lo tengo cuando quiero usar el ICD2 en modo debugger.me sale el mensage:
ICD0083: Debug: Unable to enter debug mode. Please double click this message for more information.
MPLAB ICD 2 ready for next operation
creo que el problema esta en la configuracion de los fuses.pero no se si esta configuracion es la correcta para un crystal de 10Mhz.
CONFIG RETEN=ON ; VREG Sleep Enable bit:
CONFIG INTOSCSEL=LOW ; LF-INTOSC Low-power Enable bit:
CONFIG SOSCSEL=DIG ; SOSC Power Selection and mode Configuration bits:
CONFIG XINST=OFF ; Extended Instruction Set:
CONFIG FOSC=EC3 ; Oscillator:
CONFIG PLLCFG=OFF ; PLL x4 Enable bit:
CONFIG FCMEN=OFF ; Fail-Safe Clock Monitor:
CONFIG IESO=OFF ; Internal External Oscillator Switch Over Mode:
CONFIG PWRTEN=OFF ; Power-up Timer:
CONFIG BOREN=OFF ; Brown-out Detect:
CONFIG BORV=1 ; Brown-out Reset Voltage bits:
CONFIG BORPWR=LOW ; BORMV Power level:
CONFIG WDTEN=OFF;ON ; Watchdog Timer:
CONFIG WDTPS=1024 ; Watchdog Postscaler:
CONFIG MSSPMSK=MSK5 ; MSSP address masking:
CONFIG MCLRE=ON ; Master Clear Enable:
CONFIG STVREN=ON ; Stack Overflow Reset:
CONFIG BBSIZ=BB1K ; Boot Block Size:
CONFIG CCP2MX=PORTC
se le ha dado este caso alguien?
-
YA FUNCIONA. :-/ :-/ :-/ :-/ :-/
que alivio.pensaba que me haia cargado de alguna forma el pic.he puesto esta configuracion:
CONFIG RETEN=OFF;ON ; VREG Sleep Enable bit:
CONFIG INTOSCSEL=LOW ; LF-INTOSC Low-power Enable bit:
CONFIG SOSCSEL=LOW;DIG ; SOSC Power Selection and mode Configuration bits:
CONFIG XINST=OFF ; Extended Instruction Set:
CONFIG FOSC=INTIO2;EC3 ; Oscillator:
CONFIG PLLCFG=ON;OFF ; PLL x4 Enable bit:
CONFIG FCMEN=OFF ; Fail-Safe Clock Monitor:
CONFIG IESO=OFF ; Internal External Oscillator Switch Over Mode:
CONFIG PWRTEN=OFF ; Power-up Timer:
CONFIG BOREN=OFF ; Brown-out Detect:
CONFIG BORV=1 ; Brown-out Reset Voltage bits:
CONFIG BORPWR=LOW ; BORMV Power level:
CONFIG WDTEN=OFF;ON ; Watchdog Timer:
CONFIG WDTPS=1024 ; Watchdog Postscaler:
CONFIG MSSPMSK=MSK5 ; MSSP address masking:
CONFIG MCLRE=ON ; Master Clear Enable:
CONFIG STVREN=ON ; Stack Overflow Reset:
CONFIG BBSIZ=BB1K ; Boot Block Size:
CONFIG CCP2MX=PORTC
ahora toca averiguar cual es el fuse que me genera el problema.y hacer que el pic funcione a 64Mhz.
-
por ahora he conseguido hacerlo funcionar con el oscilador interno.pero eso serian 16Mhz.
si intento seleccionar en los fuses un oscilador externo a crystal.el MPLAB me salta un error.no se si sera porque hay algo mal en el circuito.
o es que el ICD2 no funciona con este modo en este pic. supongo que 64Mhz son muchos para este.o quizas sea que no se pudede poner un crystal de 10Mhz
y ha de ser otro.si el PLL multiplica x2. supongo que esl crystal ha de ser de 16Mhz.
-
no logro hacer que el 18F87K22 funcione con el oscilador por crystal.con el oscilador interno va perfectamente.tanto en emulacion como en
circuito externo.
nunca he trabajado con estos pic.ahora me entero de que tiene un regulador interno.pero las notas de microchip no ponen nada en claro.
por ejemplo:
no pone a que voltage puede trabajar el pic.el datasheet dice que de 1.8 a 5.5 pero eso es despues del regulador o antes del regulador?
tambien dice que el regulador interno regula a 3.3v
no se si se puede conectar directamente voltages de 1.8 a 5.5 directamente a Vdd,o tiene que pasar por VddCore estando el regulador dehabilitado.
-
no logro hacer que el 18F87K22 funcione con el oscilador por crystal.con el oscilador interno va perfectamente.tanto en emulacion como en
circuito externo.
nunca he trabajado con estos pic.ahora me entero de que tiene un regulador interno.pero las notas de microchip no ponen nada en claro.
por ejemplo:
no pone a que voltage puede trabajar el pic.el datasheet dice que de 1.8 a 5.5 pero eso es despues del regulador o antes del regulador?
tambien dice que el regulador interno regula a 3.3v
no se si se puede conectar directamente voltages de 1.8 a 5.5 directamente a Vdd,o tiene que pasar por VddCore estando el regulador dehabilitado.
en el apartado 2.0 del datasheet (GUIDELINES FOR GETTING STARTED WITH PIC18FXXKXX MICROCONTROLLERS)aparece como conectar la alimentación del core. A mí me pareció un poco raro al principio pero una vez pillas como va no tiene problema.
Un saludo!
-
hola Tisco.ya habia leido esto.pero no me aclaro con el ingles.creo que dice que para habilitar el regulador,hay que conectar el pin ENVREG A Vcc.
y entonces aplicar el voltage de entrada al pin VddCore.que este debe tener un condensador de 10uF como filtro.
pero no estan claros los voltages.supongo que el valor maximo es de 5.5V . y que al estar activo el regulador interno,en Vcc habran 3.3V
en el caso de que se deshabilite el regulador,hay que poner ENVREG a Vss.y creo que dice que VddCore se deja aislado pero con un condensador de 10uF
y que la alimentacion al pic se realizara por Vdd.
eso es lo que he entendido.estoy equivocado?
respecto a lo de la frecuencia del oscilador.en el modo INTIO1,el pic funciona perfectamente con una frecuencia maxima de 16Mhz creo.
el PLL no afecta a la velocidad del pic.ya que este no esta entre el camino del oscilador interno y el nucleo.
ahora ya se que funciona el crystal.ya que los modos HS1 y HS2 permiten trabajar al pic.incluso usando el PLL,puedo ver como el led
que tengo conectado a una salida.funciona a intervalos de tiempo diferentes.
pero los modos EC1,EC2,EC3.el debugger en circuito ICD2 me manda mensages de error.
incluso si programo el pic y lo hago funcionar independientemente,este funciona en el modo HS pero no en el modo EC.
tengo puesto un crystal de 10Mhz y el PLL activado.lo suyo seria usar uno de 16Mhz.pero no dispongo de ninguno en estos momentos.
asi que me queda probar a cambiar de frecuencia de crystal o cambiar el pic.
PD:he estado realizando todas las combinaciones para la gestion del regulador interno.y no me da los resultados esperados.supongo que estara
averiado.pero no se si esto influye para el funcionamiento en el modo EC3.
-
El regulador interno se habilita o deshabilita en función de la tensión de alimentación que uses.
Si alimentas el uC a 3.3V, puedes deshabilitarlo tirando ENVREG a masa y colocando un condensador de 100n en VDDCORE.
Si lo alimentas a más de ese valor (o uno parecido, no recuerdo exactamente, pero aparece en el datasheet) tienes que habilitar el regulador interno tirando ENVREG a VCC y poner un condensador de unos 10uF en el VDDCORE.
En cuanto al oscilador, yo sólo lo he usado en modo INTRC y EC, es decir, entrando una señal cuadrada de reloj por el pin RA6; tanto habilitando como deshabilitando el PLL.
Si tienes un cristal de 10MHz deberías usar el modo HS.
También es importante analizar el condensador que pongas en el VDDCORE, pues tiene que tener una ESR específica. Yo siempre he usado de tántalo cuando se trata del condensador de 10uF y cerámicos en el caso de 100n.
Espero que te te sirva de ayuda.
Un saludo!
-
:5].ahora entiendo porque no me funciona en modo EC.no preste atencion al datasheet.es cierto que dice que es un frecuencia inyectada al pic.
y yo estaba usando un cristal resonador.
espero que poniendo un crystal de 16Mhz y pasando por el PLL.el pic trabaje a 64Mhz.
respecto a la alimentacion del pic.si no se usa el regulador interno,por donde debemos alimentar al pic?.por Vddcore o por Vdd?
porque por lo que veo,usar el regulador interno solo es para cuando trabajemos con el chip a 3.3v
-
Que yo sepa se alimenta siempre por Vdd. Vddcore es sólo para poner el condensador que corresponda y que pueda trabajar el core del micro.
Saludos!
-
El propio pic tiene un regulador a 3.3v para el CORE, en el pin VDDCORE se le pone un condensador (en el datasheet te pone de que capacidad y ESR maxima) para estabilizar la tension del core. En caso de que no quieras usar el regulador interno entonces le pones 3.3v directamente a VDDCORE y automaticamente lo detecta desactivando el regulador interno. Todo esto es porque aunque el pic funcione a 5V internamente el core trabaja a 3.3v para reducir el consumo y ruidos, es por eso que acepta sus 64mhz.
Este trabaja a 3.3v, otros trabajan a 1.8V, incluso los hay que trabajan a 1.2V pero externamente a 5V
-
entonces.en el datasheet que dice que el voltage de operacion es desde 1.8 a 5.5v,quiere decir que en la patilla Vddcore podemos introducir cualquier
voltage dentro de este rango,que el regulador interno alimentara al core a 3.3v?
asi que si yo tengo una fuente externa de 5v,deberia tener activado el regulador interno.y si es asi,las salidas del pic van a 3.3v?
deduzco que deberia ser asi.y que habra patillas que soporten 5V y otras no.
-
Hay que leer un poco mas el datasheet ehh :lol:
Si tu pones el pic a 5V este trabaja internamente a 3.3v y externamente a 5V, es decir, todas las patillas iran a 5V, no tendras 3.3V en ningun sitio.
El pin VDDCORE tiene 2 funciones, como VDDCORE o VCAP, si quieres utilizar el regulador interno simplemente conectale un condensador a VCAP y masa y luego el ENVREG a +5V.
http://ww1.microchip.com/downloads/en/DeviceDoc/39960d.pdf
Mirate el datasheet en la seccion:
28.3
-
gracias por las molestias.ya lo entiendo.la cosa es que me he repasado el datasheet un monton de veces.lo de las conexiones si lo entendia.lo que no comprendia
es como el core trabaja a un voltage y los perifericos a otro.esto es algo nuevo para mi.el ultimo pic que he usado es el 18F2550 y este no lleva ese sistema de alimentacion.
-
es lo ultimo, por ejemplo un pic32 va a 1.8v (o quizas menos) sin embargo se alimenta a 3.3v y algunos pines es tolerante a 5V.
Yo uso un freescale el cual va a 1.2v y externamente se alimenta a 5V.
Entre mayor es la frecuencia lo normal es que el voltaje del core sea menor, pero todo esto es simplemente informacion, tu con saber como va ese pues te sobra jeje.