TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: pablocabrera en 04 de Agosto de 2009, 01:05:02
-
Hola estimados, tengo una pequeña duda de pasar un codigo probado del 16F84A a un 16F88 con osilador interno bueno realise el codigo .asm con distintos programas de web y me funciono re-bien ahora lo quiero hacer en un 16F88 sialguin me puede ayudar este es el codigo
LIST P=16F84A
#INCLUDE "P16F84A.INC"
estado equ 0x03 ; Haciendo asignaciones
trisa equ 0x05
trisb equ 0x06
porta equ 0x05
portb equ 0x06
RET equ h'0C'
RET1 equ h'0D'
RET2 equ h'0E'
PDel0 equ h'0D'
PDel1 equ h'0E'
llaves equ 0x0C ; almacenara el estado de las llaves
;============== Configuración de puertos ==================
ORG 0x0000
GOTO inicio
ORG 0x0005
inicio BSF estado,5 ; cambio al banco 1 del pic
MOVLW b'00001111'
MOVWF trisa ; Asigna al puerto A como entrada
MOVLW 0x00
MOVWF trisb ; y Al puerto B como salida
BCF estado,5 ; Regresa al banco 0
CLRF porta ; limpia el puerto A
CLRF portb ; limpia el puerto B
swich MOVF porta,0 ; carga w con el puerto A
ANDLW b'00001111' ; retiene los 4 bits de interes (las llaves)
MOVWF llaves ; y los guarda en llaves
XORLW 0x01 ; verifica si es el primer efecto
BTFSC estado,2 ; si es así
CALL efect1 ; lo llama y lo ejecuta
MOVF llaves,0 ; sino, carga llaves en w
XORLW 0x02 ; y verifica si es el segundo efecto
BTFSC estado,2 ; si es así
CALL efect2 ; lo llama y lo ejecuta
MOVF llaves,0 ; y así con los demás
XORLW 0x04 ; ya me aburrí
BTFSC estado,2 ; como verás el resto es lo mismo
CALL efect3
MOVF llaves,0
XORLW 0x08
BTFSC estado,2
CALL efect4
MOVF llaves,0
GOTO swich ; Comienza a revisar de nuevo
;======================== Efectos =========================
efect1 MOVLW b'10000000'
MOVWF PORTB
CALL clokon
MOVLW b'11000000'
MOVWF PORTB
CALL clokon
MOVLW b'11100000'
MOVWF PORTB
CALL clokon
MOVLW b'11110000'
MOVWF PORTB
CALL clokon
MOVLW b'11111000'
MOVWF PORTB
CALL clokon
MOVLW b'11111100'
MOVWF PORTB
CALL clokon
MOVLW b'11111110'
MOVWF PORTB
CALL clokon
MOVLW b'11111111'
MOVWF PORTB
CALL clokon
MOVLW b'01111111'
MOVWF PORTB
CALL clokon
MOVLW b'00111111'
MOVWF PORTB
CALL clokon
MOVLW b'00011111'
MOVWF PORTB
CALL clokon
MOVLW b'00001111'
MOVWF PORTB
CALL clokon
MOVLW b'00000111'
MOVWF PORTB
CALL clokon
MOVLW b'00000011'
MOVWF PORTB
CALL clokon
MOVLW b'00000001'
MOVWF PORTB
CALL clokon
MOVLW b'00000000'
MOVWF PORTB
CALL clokon
return
efect2 CLRF portb
BSF portb,0 ; (00000001)
CALL clokon
BSF portb,1 ; (00000011)
CALL clokon
BSF portb,2 ; (00000111)
CALL clokon
BSF portb,3 ; (00001111)
CALL clokon
BSF portb,4 ; (00011111)
CALL clokon
BSF portb,5 ; (00111111)
CALL clokon
BSF portb,6 ; (01111111)
CALL clokon
BSF portb,7 ; (11111111)
CALL clokon
BCF portb,0 ; (11111110)
CALL clokon
BCF portb,1 ; (11111100)
CALL clokon
BCF portb,2 ; (11111000)
CALL clokon
BCF portb,3 ; (11110000)
CALL clokon
BCF portb,4 ; (11100000)
CALL clokon
BCF portb,5 ; (11000000)
CALL clokon
BCF portb,6 ; (10000000)
CALL clokon
RETURN ; a revisar nuevamente las llaves
efect3 CLRF portb ; limpia el puerto B
BSF portb,7 ; (10000000)
BSF portb,0 ; (10000001)
CALL clokon
BSF portb,6 ; (11000001)
BSF portb,1 ; (11000011)
CALL clokon
BSF portb,5 ; (11100011)
BSF portb,2 ; (11100111)
CALL clokon
BSF portb,4 ; (11110111)
BSF portb,3 ; (11111111)
CALL clokon
BCF portb,7 ; (01111111)
BCF portb,0 ; (01111110)
CALL clokon
BCF
efect4 MOVLW b'11000000'
MOVWF PORTB
CALL DELAY
MOVLW b'01100000'
MOVWF PORTB
CALL DELAY
MOVLW b'00110000'
MOVWF PORTB
CALL DELAY
MOVLW b'00011000'
MOVWF PORTB
CALL DELAY
MOVLW b'00001100'
MOVWF PORTB
CALL DELAY
MOVLW b'00000110'
MOVWF PORTB
CALL DELAY
MOVLW b'00000011'
MOVWF PORTB
CALL DELAY
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW b'00000110'
MOVWF PORTB
CALL DELAY
MOVLW b'00001100'
MOVWF PORTB
CALL DELAY
MOVLW b'00011000'
MOVWF PORTB
CALL DELAY
MOVLW b'00110000'
MOVWF PORTB
CALL DELAY
MOVLW b'01100000'
MOVWF PORTB
CALL DELAY
MOVLW b'11000000'
MOVWF PORTB
CALL DELAY
MOVLW b'11000000'
MOVWF PORTB
CALL DELAY
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL clokon
MOVLW B'11111111'
MOVWF PORTB
CALL clokon
MOVLW b'11000000'
MOVWF PORTB
CALL DELAY
MOVLW b'01100000'
MOVWF PORTB
CALL DELAY
MOVLW b'00110000'
MOVWF PORTB
CALL DELAY
MOVLW b'00011000'
MOVWF PORTB
CALL DELAY
MOVLW b'00001100'
MOVWF PORTB
CALL DELAY
MOVLW b'00000110'
MOVWF PORTB
CALL DELAY
MOVLW b'00000011'
MOVWF PORTB
CALL DELAY
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW b'00000110'
MOVWF PORTB
CALL DELAY
MOVLW b'00001100'
MOVWF PORTB
CALL DELAY
MOVLW b'00011000'
MOVWF PORTB
CALL DELAY
MOVLW b'00110000'
MOVWF PORTB
CALL DELAY
MOVLW b'01100000'
MOVWF PORTB
CALL DELAY
MOVLW b'11000000'
MOVWF PORTB
CALL DELAY
MOVLW b'11000000'
MOVWF PORTB
CALL DELAY
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL clokon
MOVLW B'11111111'
MOVWF PORTB
CALL clokon
MOVLW B'11000011'
MOVWF PORTB
CALL DEMORA ;retardo de 500mS
CLRF PORTB
CALL DEMORA
MOVLW B'11000011'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11000011'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'00111100'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'00111100'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'00111100'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'00001111' ;nuevo comienzo
MOVWF PORTB
CALL DEMORA ;retardo de 500mS
CLRF PORTB
CALL DEMORA
MOVLW B'00001111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'00001111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11110000'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11110000'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11110000'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'00001111'
MOVWF PORTB
CALL DEMORA ;retardo de 500mS
CLRF PORTB
CALL DEMORA
MOVLW B'00001111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11111111'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11000011'
MOVWF PORTB
CALL DEMORA ;retardo de 500mS
CLRF PORTB
CALL DEMORA
MOVLW B'11000011'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'11000011'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'00111100'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'00111100'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
MOVLW B'00111100'
MOVWF PORTB
CALL DEMORA
CLRF PORTB
CALL DEMORA
RETURN
;**********RUTINA DE RETARDO***********
clokon MOVLW H'2'
MOVWF RET
LOOP2 MOVLW H'90'
MOVWF RET1
LOOP1 MOVLW H'90'
MOVWF RET2
LOOP DECFSZ RET2,F
GOTO LOOP
DECFSZ RET1,F
GOTO LOOP1
DECFSZ RET,F
GOTO LOOP2
RETURN
DEMORA movlw .100
movwf PDel0
PLoop1 movlw .100
movwf PDel1
PLoop2 clrwdt
PDelL1 goto PDelL2
PDelL2 goto PDelL3
PDelL3 clrwdt
decfsz PDel1, 1
goto PLoop2
decfsz PDel0, 1
goto PLoop1
PDelL4 goto PDelL5
PDelL5 goto PDelL6
PDelL6 goto PDelL7
PDelL7 clrwdt
return
DELAY MOVLW h'2'
MOVWF RET
LOOP21 MOVLW h'75'
MOVWF RET1
LOOP12 MOVLW h'86'
MOVWF RET2
BLOOP DECFSZ RET2,f
GOTO BLOOP
DECFSZ RET1,f
GOTO LOOP12
DECFSZ RET,f
GOTO LOOP21
return
END
bueno saque algunas partes por lo latoso y largo es un secuencial para unas balizas de emergencia (tipo estrobo parte del codigo lo saque del foro)
lo otro si alguin me puede ayudar con cambiar los efectos con un boton pulsador cuando esta un seleccionador en posicion 0x08 en el bit 3 de RA....
bueno espero que me ayuden
muchas gracias :lol:
-
Tengo entendido que el 16F88 es compatible pin a pin con el 16F84, en el software primero tendrias que poner los bits de configuracion para habilitar el oscilador interno, revisar los registros del ADC para usar los pines como I/O digitales , y si usas la EEPROM creo que debes cambiar la forma de leerla y escribirla porque son diferentes, revisa la hoja de datos para ver todas las diferencias.
Saludos
-
uyy pero hay faltan muchas cosas, por ejemplo la palabra de configuración ¿donde esta? si es allí donde empiezas a elegir el oscilador interno.
-
up's si no coloque lo que hace. bueno basicamente es un secuencial led para vehiculos de emergencia. he sacado buena parte del codigo de la pagina web http://r-luis.xbot.es/ y otra de este mismo foro. Bueno si no ingrese la parte de _CONFIG.. ya que no se bien como generar el oscilador interno. he leido que no es mucho lo que hay que cambiar pero si me pueden orientar se los agradeceria un muchisimo... ha y la otra cosa que quiero hacer en el codigo es que cuando este en esta parte
XORLW 0x08
BTFSC estado,2
CALL efect4 ; aca creo que se puede hacer un goto a un subcodigo o subinstruccion y de hay colocar un pulsador...
MOVF llaves,0
poder colocar un pulsador con para cambiar a los otros efectos sin nesecidad de tener un seleccionador o dipswitch eso es basicamente ojala no sea mucho pedir...
-
faltan mas datos:
1.- ¿a que frecuencia de oscilación vas a trabajar?
2.- ¿cuantos pulsadores son?
3.- ¿cuantos efectos son en total?
-
Hola PalitroqueZ, gracias por responder mira el que hice con 16F84A le coloque una cristal de 4Mhz con condensadores de 22pF y creo que andaria bien. he leido el datasheet pero no se generar el codigo. en lo de los pulsadores es solo uno que puede ir conextado a RA5 o RA6. y los efectos en total no se hasta el momento tengo como 6.
gracias :lol: :o
-
la forma de configurar el oscilador interno a 4 Mhz:
vamos a mirar la figura 4-6 del datasheet
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=27079.0;attach=9818)
observa que tenemos un bloque que multiplexa las 4 fuentes de oscilación, escogemos el Internal Oscillator Block, con _INTRC_IO
ahora debemos configurar el postcaler del oscilador interno. Mirando nuevamente la imagen, tenemos que cargar el binario 110 al registro OSCCON.
dentro de OSCCON hay 2 registros adicionales que configurar
OSTS que define la fuente de oscilación (en este caso se coloca a cero)
e IOFS, a mi paricularmente me gusta preguntar por este bit, porque es el que define cuando la frecuencia se estabiliza. Es de solo lectura, asi que servirá para preguntar mas adelante en el código antes de ir al bucle principal.
ah! hay otro bit de configuración _IESO_OFF que le indica al micro que no habrá cambio de fuente de oscilación en caliente.
-
Hola palitroqueZ mira trate de hacer algo revisando otros programas y con lo que tu dejaste poteado, en el programa que adjunto funciona simulando en el proteus funciona la primera secuencia (efect1) pero no cambia de efecto y cuando lo quemo en el pic solo prende el bit 0, bueno adjunto el program para ver si me puedes ayudar u otro amigo del foro...
Gracias