TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: pibe 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
-
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
-
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
-
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 :)
-
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
-
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 (http://www.todopic.com.ar/foros/index.php?topic=11553.0)
Saludos
-
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:
-
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
-
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.
-
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>
-
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?
-
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
-
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..
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????
-
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