Autor Tema: Algún ejemplito tonto para 18f452?  (Leído 7157 veces)

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

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Algún ejemplito tonto para 18f452?
« en: 25 de Mayo de 2006, 03:48:08 »
Pos eso, quería saber si alguno de ustedes tienen un ejemplito tonto .... apagar encender led o algo así para ir haciendome una idea de como trabaja uno de gama alta.
Si no es 18f452 pues puede ser otro de la gama alta también.
Saluditos
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Algún ejemplito tonto para 18f452?
« Respuesta #1 en: 25 de Mayo de 2006, 09:48:51 »
Querido Pibe: Aquí te dejo un ejemplito de encender apagar un led por RD1
Espero te sirva.  :mrgreen:

PD: Oscilador externo a XT.


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ledblink.asm: Blinks an LED on port D1
;;
;; By Ian Smith-Heisters ian{remove this}\at 0x09{remove this}.com
;;   12-04-2004: Started
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    title "Hello World"
    List p=18f452,f=inhx32
    #include <p18f452.inc>
   
    __CONFIG    _CONFIG1H, _OSCS_ON_1H & _XT_OSC_1H ; External Clock on OSC1 & OSC2
    __CONFIG    _CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_OFF_2L ; Brown out reset on at 2.0V, no power-up timer
    __CONFIG    _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H ; watchdog off, postscaler count to 128
    __CONFIG    _CONFIG3H, _CCP2MX_ON_3H ; CCP2 pin Mux enabled. What is this?
    __CONFIG    _CONFIG4L, _STVR_ON_4L & _LVP_ON_4L & _DEBUG_OFF_4L ; Stack under/overflow reset on, LVP on, debug off
    __CONFIG    _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L ; all protection off
    __CONFIG    _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
    __CONFIG    _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
    __CONFIG    _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG    _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
    __CONFIG    _CONFIG7H, _EBTRB_OFF_7H

    org 0x0000

COUNT1 equ 0x01
COUNT2 equ 0x02

    clrf TRISD ; set all bits in TRISD to zero.

Main
    bsf PORTD, RD1 ; set bit RD1 in the PORTD register
    call Delay
    bcf PORTD, RD1 ; clear bit RD1 in the PORTD register
    call Delay
    goto Main

Delay
    setf COUNT1 ; set all the bits in COUNT1, eg. set it equal to 255
    setf COUNT2

Loop1 ; this is a label since it's in the first column
    decfsz COUNT1, F ; decrement COUNT1, store result in COUNT1, skip next line if COUNT1 is zero<
    goto Loop1 ; loop - gets skipped if COUNT1 == 0
    setf COUNT1 ; reinit COUNT1
    decfsz COUNT2, F
    goto Loop1
    return

    end
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Algún ejemplito tonto para 18f452?
« Respuesta #2 en: 25 de Mayo de 2006, 10:28:02 »
Buenas...puede que sea mi primer pasito para animarme a meterme a programar estos pics, al menos en asm y pronto no quedara otra que pasarme el C.

Pero reempazar esto:

Main
    bsf PORTD, RD1 ; set bit RD1 in the PORTD register
    call Delay
    bcf PORTD, RD1 ; clear bit RD1 in the PORTD register
    call Delay
    goto Main

Por esto:

Main
    movlw b'00000010'
    xorwf  PORTD,F
    call Delay
    goto Main

estaria bien? o acaso no funcionaria en un 18F?
Saludos y gracias x el ejemplo. :D
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Algún ejemplito tonto para 18f452?
« Respuesta #3 en: 25 de Mayo de 2006, 11:47:02 »
Yo en su lugar usaría el comando "bit toggle" BTG ; lo que hace es cambiar el bit por su contrario (si era 0 lo pone a 1 y si era 1 lo pone a cero)

También podrías hacer esto:

Main
    movlw b'00000010'
    comf  PORTD
    call Delay
    goto Main

Pero tengo dudas que funcione en la práctica ya que estás actuando directamente sobre el puerto en vez de una variable. El comando comf invierte todos los bits a su contrario o sea 00000010 se convierte en 11111101 y visceversa.



    movlw b'00000010'
movwf variable
Main
    comf  variable
movf variable, w
movwf PORTD
    call Delay
    goto Main

Así si funcionaría.

PD: Gracias por enrrollarte en mi post :)
« Última modificación: 25 de Mayo de 2006, 11:52:50 por pibe »
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Algún ejemplito tonto para 18f452?
« Respuesta #4 en: 25 de Mayo de 2006, 19:26:25 »
Hola pibe.

jejeje pero COMF es una operacion que invierte todo los bits del registro(COMF = Complement File).

Y sí, es posible aplicar instrucciones, comparaciones logicas,etc sobre un puerto directamente porque los puertos son registros fisicos y se pueden actuar sobre ellos(obviamente con ciertas limitaciones segun la configuracion de sus pines como I/O).
Saludos
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Algún ejemplito tonto para 18f452?
« Respuesta #5 en: 25 de Mayo de 2006, 20:47:59 »
pibe está interesante el post.

La forma de resolver este simple problema puede ser numerosa, pero yo me inclino siempre por las sentencias de 'bit' y la de bittoggle está ideal para este caso. 

La sentencia __config no se usa mas en los 18F, en su reemplazo se usa solo config

2) Para sacar algo en los 18F siempre usen los LATx, no los portx.  Son latchs que 'guardan' el dato que uno quiere sacar por un puerto, uno puede trabajar con ellos sin afectar a los pines de salida por las operaciones de lectura/escritura.  De esta forma si el puerto no se establece en el tiempo que uno piensa (porque el micro este andando a mucha velocidad y la salida tenga alguna carga capacitiva que impida que el pin se ponga en alto en menos de 100 nanosegundos).

Y sí, es posible aplicar instrucciones, comparaciones logicas,etc sobre un puerto directamente porque los puertos son registros fisicos y se pueden actuar sobre ellos(obviamente con ciertas limitaciones segun la configuracion de sus pines como I/O).

En realidad ,  en los micros RISC todas las operaciones se terminan haciendo en un registro interno de trabajo.  Cualquier operación sobre un puerto requiere de una Lectura --> Modificacion --> Escritura.

No hay algo físicamente conectado directamente al puerto, siempre pasa por el nucleo central del microprocesador.

Esto no es un tema solo de los pics, es un tema de los micros RISC. 

No importa si el puerto está como entrada/salida o solo como salida.  Puede haber siempre problemas por lo que comenté antes del tiempo que tarda en establecerse una señal.  En otra oportunidad lo expliqué con más detalle, tal vez les sea de utilidad.

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

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Algún ejemplito tonto para 18f452?
« Respuesta #6 en: 26 de Mayo de 2006, 02:41:56 »
Hola pibe.

jejeje pero COMF es una operacion que invierte todo los bits del registro(COMF = Complement File).



Si, ese era el ejemplo que yo quería dar :)

Oye.... y eso que solo se usa el config con los 18f ...como es? podrías detallarlo un pelín?

que otras precauciones debemos tener al migrar desde gama media?

me asusta la cantidad de instrucciones de manejo de registros que tiene pero... me gusta las prestaciones... 3 interrupciones externas es una delicia

Una cosita mas: Veo que no necesita cambiar de bancos de memoria (al menos  o me parece a mi?
No necesita bsf STATUS,RP0 etc etc? como se maneja?

Otra duda: que diferencia hay entre GOTO y BRA?

Ostias! me robaron el OPTION_REG !  :mrgreen:
« Última modificación: 26 de Mayo de 2006, 05:21:20 por pibe »
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Algún ejemplito tonto para 18f452?
« Respuesta #7 en: 26 de Mayo de 2006, 03:48:50 »
Ya pillé lo del CONFIG.
Como se puede poner en una sola linea? Probé con & pero no va.


Y así es como quedaría con un xtal de 4mhz y salida led por RC4 (probado, funciona):


    List p=18f452
    #include <p18f452.inc>
   
CONFIG OSC = XT
CONFIG OSCS = OFF
CONFIG BOR = OFF
CONFIG BORV = 25
CONFIG WDT = OFF
CONFIG CCP2MUX = OFF
CONFIG STVR = OFF
CONFIG LVP = OFF
CONFIG DEBUG = OFF
 

COUNT1 equ 0x01
COUNT2 equ 0x02

    org 0x0000

clrf TRISC
clrf LATC

Main bsf LATC,4
    rcall Pausa200ms
    bcf LATC,4
   rcall Pausa200ms
    bra Main

Pausa200ms
    setf COUNT1
    setf COUNT2
Loop1
    decfsz COUNT1, F
    bra Loop1
    setf COUNT1
    decfsz COUNT2, F
    bra Loop1
    return

    end
« Última modificación: 26 de Mayo de 2006, 04:43:24 por pibe »
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Algún ejemplito tonto para 18f452?
« Respuesta #8 en: 26 de Mayo de 2006, 06:29:44 »
Y aquí les dejo un ejemplito comunicación rs232
 La PC le envia un dato por hyperterminal u otro programa similar , adapta señales por hardware con un max232 y entra a la UART del micro. Este muestra el dato recibido por puerto B y a su vez lee el puerto A y lo reenvia a la PC .
Yo usé un xtal de 20mhz, en caso de usar otro valor de xtal cambiar el valor SPBRG, el bit BRGH de TXSTA y el CONFIG del tipo de oscilador a su correspondiente. Ver tablas en la hoja de datos.

También adjunto un esquema del hardware. Está basado en el 16f877 pero es compatible pin a pin con el 452. Los condensadores del max232 son de 1uf, las resistencias del puerto A de 10k y las resistencias de los leds de 470 ohms.
« Última modificación: 26 de Mayo de 2006, 06:49:58 por pibe »
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Algún ejemplito tonto para 18f452?
« Respuesta #9 en: 26 de Mayo de 2006, 09:54:13 »
Oye.... y eso que solo se usa el config con los 18f ...como es? podrías detallarlo un pelín?
Es así como lo has usado, solo que se llama solo config
La forma de usarlo es como la has puesto, una línea a la vez. 
En los 16F, uno configura bits haciendo una gran AND de cada bit y como debe estar seteado
En los 18F es diferente, uno configura 'variables' y por eso es una variable por línea.


que otras precauciones debemos tener al migrar desde gama media?
mmm que pedazo de pregunta.... la de los LATx es la mas obvia pero no es una precaución ,  al contrario es un super beneficio!! El tener los LATx 'es la ostia' como dicen uds :)

me asusta la cantidad de instrucciones de manejo de registros que tiene pero... me gusta las prestaciones... 3 interrupciones externas es una delicia

Hay diferencias pero creo que hay menos precauciones que antes, al menos no necesitas más el paginado de MEMORIA DE PROGRAMA.  También hay instrucciones como habrás notado , que en 1 solo paso hacen lo que antes debiamos hacer en 2 o 3.

Otro beneficio, tenemos 2 niveles de interrupción.  El nivel bajo y alto.  Si se está en el vector de interrupcion bajo... y viene una interrupción con prioridad alta, el Program Counter va al vector 0x08 de las interrupciones altas para atender la que es más importante.

La precaución también está en que hay que guardar bien los registros de trabajo cuando se activa una y otra interrupcion.  Esto está bien mencionado en el datasheet. 

Una cosita mas: Veo que no necesita cambiar de bancos de memoria (al menos  o me parece a mi?
No necesita bsf STATUS,RP0 etc etc? como se maneja?
Si se necesitan bancos de memoria pero hay una seccion que es unbanked o 'access banks' que se puede acceder desde cualquier otra página en la que estemos.

Se configuran con el registro BSR (Bank Select Register). Ahi indicas en que banco está la memoria a la que queres acceder.  La ventaja del access banks es que podes estar apuntando al banco 1, y con una instruccion con destino 'access bank' la moves al banco0 sin mas pasos necesarios.


Otra duda: que diferencia hay entre GOTO y BRA?

Me has agarrado frío con el assembler de los 18F porque lo usé poco y luego me pasé directamente al C porque necesitaba muchos calculos lógicos y matemáticos, donde primaba resolver el problema rápido antes que el ahorro de memoria :)

De todas formas, por lo que acabo de revisar el BRA es para saltar n pasos de donde estamos.  Es como lo que hace una instruccion btfsc pero lo haces manualmente sin que haya una condición previa.  Ademas podemos saltar 1024 posiciones antes o 1024 posiciones despues.

El goto es para saltar a cualquier otro lado.


BRA

Syntax: BRA n
Operands: -1024 <= n <= 1023
Operation: (PC) + 2 +2n --> PC


GOTO

Syntax: GOTO k
Operands: 0 <= k <= 1048575
Operation: k --> PC<20:1>



- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Algún ejemplito tonto para 18f452?
« Respuesta #10 en: 26 de Mayo de 2006, 13:06:46 »
Che Mau, que soy rosarino pero vivo en Barcelona, por eso es que a veces se me pega el "galleguismo" :P

volviendo al tema de los cambios de página; no he tenido que paginar en todo el programa . A pesar que los registros están en diferentes bancos.  :shock: Ni siquiera tuve que usar ese comando que indicas.  :shock: Lo traducirá el MPLAB a su correspondiente banco al ensamblarlo?
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Algún ejemplito tonto para 18f452?
« Respuesta #11 en: 26 de Mayo de 2006, 14:33:19 »
Che Mau, que soy rosarino pero vivo en Barcelona, por eso es que a veces se me pega el "galleguismo" :P

volviendo al tema de los cambios de página; no he tenido que paginar en todo el programa . A pesar que los registros están en diferentes bancos.  :shock: Ni siquiera tuve que usar ese comando que indicas.  :shock: Lo traducirá el MPLAB a su correspondiente banco al ensamblarlo?

No el MPLAB es 'bobo' para esas cosas, más si estas ensamblando salvo que uses algún macro como el banksel o pagesel.

Los registros del PIC (Special Function Registers) estan en la Access Ram ubicados desde la posición 0xF60 a 0xFFF, que es el banco 15.


Si sumado a esto las variables que utilizaste eran pocas, entonces de seguro fueron a parar al bank 0 y con mucha más suerte entraron en la Access Ram del banco 0, que estan de 0x000 a 0x05F


Fijate en el datasheet de cualquier PIC18F y busca la sección DATA MEMORY MAP en donde te explica como están ubicados físicamente.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Algún ejemplito tonto para 18f452?
« Respuesta #12 en: 31 de Agosto de 2007, 14:00:52 »
Pues hace rato no trabajo en ASm y se me ocurrio hacer un programita tontico para 18F4550 y no va...  :shock:

Realmente no veo donde tenga el error, Yo programe en ASM 16F, y pues ahora con los 18f es michisimo mas fácil, sin tener que paginar ni nada. Pero..... Y Donde esta el error???? Ya vi el datasheet y sigo las recomendaciones de el mismo..

Código: [Seleccionar]
LIST P=18F4550
#include <P18F4550.INC>

CONFIG PLLDIV = 1
CONFIG FOSC = HS
CONFIG PWRT = OFF
CONFIG IESO = OFF
CONFIG FCMEN = OFF
CONFIG BOR = OFF
CONFIG BORV = 0
CONFIG VREGEN = OFF
CONFIG WDTPS = 32768
CONFIG MCLRE = ON
CONFIG LPT1OSC = OFF
CONFIG PBADEN = OFF
CONFIG CCP2MX = OFF
CONFIG LVP = OFF
CONFIG ICPRT = ON
CONFIG XINST = OFF
CONFIG DEBUG = ON
CONFIG CP0 = OFF
CONFIG CP1 = OFF
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB = OFF
CONFIG WRT0 = OFF
CONFIG WRT1 = OFF
CONFIG WRT2 = OFF
CONFIG WRT3 = OFF
CONFIG WRTC = OFF
CONFIG WRTD = OFF
CONFIG EBTR0 = OFF
CONFIG EBTR1 = OFF
CONFIG EBTR2 = OFF
CONFIG EBTR3 = OFF
CONFIG EBTRB = OFF

ORG 0X0000
GOTO INICIO
ORG 0X0020

INICIO
CLRF PORTD
CLRF LATD

CLRF PORTC
CLRF LATC

CLRF TRISC
CLRF TRISD

BLOQUEO
BSF PORTC,2
BCF PORTC,2

BSF PORTD,0
BCF PORTD,0

GOTO BLOQUEO
END

El led en C2 va bien, enciende y apaga pero el D no... Que raro hay que hacerle a este pic para trabajar con el puerto D????



Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Algún ejemplito tonto para 18f452?
« Respuesta #13 en: 13 de Noviembre de 2007, 12:39:25 »
PICMouse algo de las arquitectura de los 18F que debes conocer es la diferencia entre LATx y PORTx.

Te paso un link que a su vez tiene otros links.

http://www.todopic.com.ar/foros/index.php?topic=12372.msg69804#msg69804

Básicamente, no le estas dando tiempo suficiente a ver el cambio.  Trabaja sobre el LATx y además dale un tiempo para que el pin se encienda para luego apagarlo.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)