Autor Tema: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A  (Leído 757890 veces)

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

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #90 en: 22 de Febrero de 2010, 13:29:20 »
Excelente aporte Beto!  :-/ Una librería muy útil  :P


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado chicho

  • PIC10
  • *
  • Mensajes: 4
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #91 en: 11 de Abril de 2010, 00:19:56 »
Hola Suky y gracias por este tutorial, esta muy bueno.
Yo recien estoy dando mis primeros pasos en este tema de los Pic y queria hacerte una pregunta, como ejemplo te digo que estoy probando con el pic 16f84 al cual conecte 2 leds, 1 en RB0 que enciende cada ves que oprimo el pulsador y el otro led en RB1 el cual quiero que prenda despues de haber oprimido el pulsador una determinada cantidad de veces,
No se si se entiende lo que digo: el led en RB0 enciende siempre que oprima el pulsador y el led en RB1 cuando el pulsador fue oprimido por ejemplo 5 veces.
Como hago para ir contando las veces que se oprimio el pulsador?
Desde ya muchas gracias por tu ayuda

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #92 en: 11 de Abril de 2010, 09:29:03 »
Puedes utilizar una variable (Un registro de la RAM) para contar cuantas veces a sido pulsado, esperando que el botón se presione y suelte. Luego comparas este valor con un literal para saber si se ha pulsado N veces.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado etarrita

  • PIC10
  • *
  • Mensajes: 3
Re: Mis primeros programas. PIC16F84A y PIC16F628A
« Respuesta #93 en: 03 de Mayo de 2010, 16:10:15 »
Otro ejemplo:
En este se fija la frecuencia de PWM en 2 kHz y se varía el ciclo de trabajo con 2 pulsadores de control conectados a RB0 y RB1. Solo se modifica en byte alto del CT, ósea el registro CCPR1L con lo que CT se varía de 4 en 4.

Hardware necesario:


Código: ASM
  1. ; **** Encabezado ****
  2.         list            p=16f628A       ; list directive to define processor
  3.         #include        <p16f628A.inc; processor specific variable definitions
  4.         __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
  5.  
  6. ;**** Definicion de variables ****
  7.         Contador1       equ             0x20    ;
  8.         Contador2       equ             0x21    ;
  9.        
  10.         decre   equ             0       ; Pulsador para decrementar Ciclo de Trabajo
  11.         incre   equ             1       ; Pulsador para incrementar Ciclo de Trabajo
  12.        
  13.        
  14. ;/////////////////////////////////
  15. ;**** Inicio del Micro ****
  16. Reset.         
  17.         org             0x00            ; Aquí comienza el micro.-
  18.         goto    Inicio          ; Salto a inicio de mi programa.-
  19.  
  20. ; **** Programa Principal ****
  21.         org             0x05
  22. Inicio
  23.         bsf             STATUS,RP0      ; Banco 1
  24.         bsf             TRISB,incre     ; Como Entrada.-
  25.         bsf             TRISB,decre     ; Como Entrada.-
  26.         bcf             TRISB,3         ; RB3 como Salida.
  27.         bcf             STATUS,RP0      ; Banco 0.-
  28.         movlw   b'00000110'     ; Se selecciona TMR2, preescaler de 1/16.-
  29.         movwf   T2CON
  30.         bsf             STATUS,RP0      ; Banco 1
  31.         movlw   0x1E            ; Señal de 2kHz
  32.         movwf   PR2    
  33.         bcf             STATUS,RP0      ; Banco 0
  34.         clrf    CCPR1L          ; Ciclo de trabajo 0%
  35.         bcf             CCP1CON,CCP1X
  36.         bcf             CCP1CON,CCP1Y
  37.         bsf             CCP1CON,CCP1M3  ; Configura modulo CCP modo PWM.-
  38.         bsf             CCP1CON,CCP1M2
  39. Bucle
  40.         btfsc   PORTB,decre     ; Testea si se quiere reducir CT.-
  41.         goto    Decrementa
  42.         btfsc   PORTB,incre     ; Testea si se quiere aumentar CT.-
  43.         goto    Incrementa
  44.         goto    Bucle
  45. Incrementa
  46.         incf    CCPR1L,1
  47.         call    Demora_50ms
  48.         goto    Bucle
  49. Decrementa
  50.         decf    CCPR1L,1
  51.         call    Demora_50ms
  52.         goto    Bucle
  53.  
  54.  
  55. ;**** Demora ****
  56. Demora_50ms
  57.         movlw   0xFF                    ;
  58.         movwf   Contador1               ; Iniciamos contador1.-
  59. Repeticion1
  60.         movlw   0x40                    ;
  61.         movwf   Contador2               ; Iniciamos contador2
  62. Repeticion2
  63.         decfsz  Contador2,1             ; Decrementa Contador2 y si es 0 sale.-        
  64.         goto    Repeticion2             ; Si no es 0 repetimos ciclo.-
  65.         decfsz  Contador1,1             ; Decrementa Contador1.-
  66.         goto    Repeticion1             ; Si no es cero repetimos ciclo.-
  67.         return                                  ; Regresa de la subrutina.-
  68. ;..............................................
  69.         end


hola suky, gracias por todos tus aportes, me interesa este codigo pero lo usare para controlar la velocidad de un motor mediante puente h, etc. tengo entendido que la frecuencia del pwm deberia ser 20khz para que el motor no haga ruidos audibles por el humano, me podrias ayudar???

gracias.

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #94 en: 22 de Mayo de 2010, 14:33:18 »
Hola SUKY exelente tu aporte !! , me interesaria saber como se programa una eeprom ! , estoy empesando de 0 de nuevo jeje con esto de assembler ! y no encuentro info sobre el tema !

saludos !

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #95 en: 22 de Mayo de 2010, 14:45:50 »
jaja olvide de escribir la pregunta principal que queria hacer !  :oops: jeje queria preguntarte tambien si conoces mikropascal y si es asi !? que te parece para programar micros ?

gracias por tu tiempo y tu ayuda en otros momentos y espero que estes bien amigo !

saludos !

Desconectado O7ERO

  • PIC10
  • *
  • Mensajes: 2
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #96 en: 10 de Junio de 2010, 22:56:06 »
En el contador de 0 - 999 Quiero colocarle dos pulsadores uno INICIO/STOP y otro PAUSE. Como hago para colocar pulsador  de INICIO/STOP yo le puse el pulsador para inicio y lo simule en elk proteus y funciono fino pero he tratado de que el mismo pulsador despues de haber iniciado el conteo automatico lo detenga y no he podido, el va a hacer que vuelva a cero y que haga falta volverlo a apretar para que inicie de nuevo.

Para inicio yo coloque btfss perguntado por el estado del pulsador para iniciar y luego volvi a pregunta btfss por el estado de pulsador para el stop,  y que va, cuando lo simulo no funciona, a veces hasta se guina el conteo.

Desconectado jhony85

  • PIC10
  • *
  • Mensajes: 1
Re: Primer Programa
« Respuesta #97 en: 11 de Junio de 2010, 08:34:08 »
Comenzando con la creación de nuestro código:A continuación vamos a desarrollar nuestro primer programa. Considero que se tiene conocimiento del lenguaje Assembler, si no es así se puede leer el tutorial ASM desde cero de este mismo foro.
Este activará un led conectado a RB0 siempre que el interruptor conectado a RA0 este cerrado. Para ello vamos a necesitar el siguiente circuito:

En  RA0 tenemos conectado un pulsador de forma que cuando lo pulsemos se introduzca un cero lógico en el pin y cuando no lo pulsemos se introduzca un uno lógico. Tenemos un Led con su correspondiente resistencia limitadora de corriente en el pin RB0.

Diagrama de Flujo:

Primero que nada debemos especificar con que microcontrolador estamos trabajando, esto lo realizamos es las dos primeras líneas:
Código: ASM
  1. ; **** Encabezado ****
  2. list p=16F84A
  3. #include P16F84A.inc
En el archive P16F84A.inc se encuentran las definiciones de las direcciones de los registros específicos, los bits utilizados en cada registro y los fusibles del micro.

Configuración de fusibles. Hay ciertos aspectos del PIC que han de ser activados o desactivados mediante hardware a la hora de programarlo. Esto quiere decir que no se pueden volver a cambiar  hasta que el chip no se reprograme de nuevo. El PIC16F84A dispone de 4 fuses (los modelos superiores tienen más). Cada fuse activa o desactiva una opción de funcionamiento.
OSC: Este fuse controla el modo de oscilación que usará el PIC para funcionar. Como ya sabemos, el oscilador se puede configurar de 4 maneras distintas, dependiendo de la velocidad y del tipo de circuito oscilador empleado.
WDT: El famoso "perro guardián" del PIC se configura aquí. Esta es una capacidad del microcontrolador de autorresetearse.
PWRT: Si activamos este fuse, lo que conseguimos es que se genere un retardo en la inicialización del microcontrolador.
CP: Activando este fuse tendremos la garantía de que el código que escribamos en el PIC no pueda ser leído por otra persona, para que no nos lo copien, modifiquen, etc. (Code Protection). Esto no impide que el PIC funcione como siempre, ni que no se pueda sobrescribir su contenido
Código: ASM
  1. __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

Definición de variables que utilizaremos en nuestro proyecto. En este caso solo definiremos bits, por ejemplo Led y Pulsador.
Para organizar nuestro programa lo estructuraremos de la siguiente manera:
Nivel      Directiva      Operandos   ; Comentarios
Código: ASM
  1. ;**** Definicion de variables ****
  2. Led             equ     0       ; Definimos Led como el bit cero de un registro, en este caso PORTB.-
  3. Pulsador        equ     0       ; Definimos Pulsador como el bit 0, en este caso sera para PORTA

Configuración de puertos.
Para la configuración necesitamos los siguientes registros:
STATUS > 0x03; PORTA > 0x05; PORTB > 0x06; TRISA > 0x86 y TRISB > 0x86.
Por defecto los puertos quedan configurados como entradas de datos y si se quiere cambiar hay que configurarlos. Esto se realiza con los registros TRISA y TRISB, teniendo en cuenta que si se asigna un cero (0) a un pin, quedara como salida y si se asigna un uno (1), quedara como entrada.
En nuestro caso se necesita colocar TRISA igual a 11111 (o se puede dejar por default) y TRISB 11111110. Ahora bien, cuando el PIC arranca se encuentra en el Banco 0, TRISA y TRISB se encuentran en el Banco 1, entonces debemos cambiar de Banco. Esto se realiza con el bit RP0 del registro STATUS. Si este se pone un cero a RP0, estaremos en el Banco 0. Si se coloca un uno, estaremos en el Banco 1.
Registro W: es el registro más importante que tiene el microcontrolador y es denominado ACUMULADOR.

 
Código: ASM
  1. ;**** Configuracion de puertos ***
  2. Reset   org     0x00    ; Aqui comienza el micro.-
  3.         goto    inicio  ; Salto a inicio de mi programa.-
  4.         org     0x05    ; Origen del código de programa.-
  5. Inicio  bsf     STATUS,RP0      ; Pasamos de Banco 0 a Banco 1.-
  6.         movlw   b'11111'        ; Muevo 11111 a W.-
  7.         movwf   TRISA           ; Cargo en TRISA.-
  8.         movlw   b'11111110'    
  9.         movwf   TRISB
  10.         bcf     STATUS,RP0      ; Paso del Banco 1 al Banco 0
  11.         bcf     PORTB,Led       ; Comienza apagado.-

Ya configurado nuestro PIC, vamos a realizar la rutina que ejecutara.
Código: ASM
  1. ;**** Control de Led ****
  2. Bucle   btfsc   PORTA,Pulsador  ; Preguntamos si esta en 0 logico.-
  3.         goto    Apagar                  ; Esta a 1 logico, Apagamos Led.-
  4.         bsf     PORTB,Led               ; Esta a 0 logico, Encendemos Led.-
  5.         goto    Bucle                   ; Testeamos nuevamente la condicion del Pulsador.-
  6.  
  7. Apagar  bcf     PORTB,Led               ;Apagamos Led.-
  8.         goto    Bucle                   ; Testeamos nuevamente la condicion del Pulsador.-
  9.  
  10.         end
Aquí solamente en un bucle infinito testeamos continuamente el estado del pulsador, y según su estado se encenderá o apagará el Led.-
 :-/


hola buenas , estoy intentando montar este primer circuito y quisiera saber si se puede sustituir el cristal por una red RC y cómo iría ésta colocada.

Saludos.

Desconectado Deckblank

  • PIC10
  • *
  • Mensajes: 10
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #98 en: 17 de Junio de 2010, 03:37:39 »
 :shock: :shock:
Quiero llorar quiero llorar ... muchas gracias Suky ... con mas personas asi la electronica en sudamerica seria otra cosa  :D

me lei de corrido todo hasta los lcd ... en cerca de 2 horas ... tu tuto es una pasta  :-/ :-/ :-/

 :afro: sos un grosso

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #99 en: 17 de Junio de 2010, 19:07:11 »
Muchas gracias por los comentarios!  ;-)

jhony85, se puede hacer lo que necesitas, primeramente debes indicarselo al microcontrolador configurando adecuadamente la palabra de configuración (FUSES).


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Hormiga

  • PIC10
  • *
  • Mensajes: 41
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #100 en: 22 de Julio de 2010, 02:31:56 »
Hola suky la verdad que no he podido realizar comunicación serial con pic 16f84a a 115200BPS, lo otro me puedes explicar por favor como recibir RX tramas fbus

Gracias

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #101 en: 22 de Julio de 2010, 11:16:11 »
Hola suky la verdad que no he podido realizar comunicación serial con pic 16f84a a 115200BPS, lo otro me puedes explicar por favor como recibir RX tramas fbus

Gracias

Prueba con un  microcontrolador que tenga módulo UART, sino muy dificil....



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado JebusITO

  • PIC10
  • *
  • Mensajes: 15
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #102 en: 28 de Agosto de 2010, 20:41:29 »
buena stardes, soy nuevo en el foro y estoy intentado segir paso a paso este tutorial, peor tengo varias dudas, la primera:

Como simplificas esta fórmula:

Tsub = 2 + 1 + 1 + (0xXX)*[1 + 1 + (0xYY - 1)*(1 + 2) + 2 + 1 + 2] + [1 + 1 + (0xYY - 1)*(1 + 2) + 2 + 2 + 2] ciclos
Lo cual se puede simplificar como sigue
Tsub = [0xXX*((0xYY - 1)*3 + 7) + 5] Tcy

segundo, en el mplab ide y el proteus usando el codigo para hacer titilar el led funciona:

#
Demora_150ms
#
movlw 0xFF ;
#
movwf Contador1 ; Iniciamos contador1.-
#
Repeticion1
#
movlw 0xC3 ;
#
movwf Contador2 ; Iniciamos contador2
#
Repeticion2
#
decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.-
#
goto Repeticion2 ; Si no es 0 repetimos ciclo.-
#
decfsz Contador1,1 ; Decrementa Contador1.-
#
goto Repeticion1 ; Si no es cero repetimos ciclo.-
#
return ; Regresa de la subrutina.-
#
 
#
end


pero si deseo aumentar el tiempo  por ejemplo a FF en ambos contadores, el proteus me dice lo siguiente al inicar la emulacion:


PiC16 Load: Program or eeprom data has a invalid adress (2000) hasta el 2003 for this device y luego el wathdog comienza el reseteo del micro cada poco mas de 0.5seg gracias por entenderme :)

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #103 en: 28 de Agosto de 2010, 21:23:37 »
buena stardes, soy nuevo en el foro y estoy intentado segir paso a paso este tutorial, peor tengo varias dudas, la primera:

Como simplificas esta fórmula:

Tsub = 2 + 1 + 1 + (0xXX)*[1 + 1 + (0xYY - 1)*(1 + 2) + 2 + 1 + 2] + [1 + 1 + (0xYY - 1)*(1 + 2) + 2 + 2 + 2] ciclos
Lo cual se puede simplificar como sigue
Tsub = [0xXX*((0xYY - 1)*3 + 7) + 5] Tcy

Hay que sumar los 1 y los 2.  :mrgreen:


Para lo segundo, no debería de haber ningún problema con cambiar solamente el valor de los contadores, revisa con calma para deterninar si no cambiaste otra cosa.  :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado JebusITO

  • PIC10
  • *
  • Mensajes: 15
Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
« Respuesta #104 en: 29 de Agosto de 2010, 00:47:21 »
buena stardes, soy nuevo en el foro y estoy intentado segir paso a paso este tutorial, peor tengo varias dudas, la primera:

Como simplificas esta fórmula:

Tsub = 2 + 1 + 1 + (0xXX)*[1 + 1 + (0xYY - 1)*(1 + 2) + 2 + 1 + 2] + [1 + 1 + (0xYY - 1)*(1 + 2) + 2 + 2 + 2] ciclos
Lo cual se puede simplificar como sigue
Tsub = [0xXX*((0xYY - 1)*3 + 7) + 5] Tcy

Hay que sumar los 1 y los 2.  :mrgreen:


Para lo segundo, no debería de haber ningún problema con cambiar solamente el valor de los contadores, revisa con calma para deterninar si no cambiaste otra cosa.  :?


Saludos!


Gracias por responder, pero igual sigo con dudas, al sumar los "1 y los 2" obtengo la siguiente fórmula:
4+(0xXX)*[(0xYY-1)*(3)+7]+[(0xYY-1)*(3)+8]

muy diferente ala que tu muestras

[0xXX*((0xYY - 1)*3 + 7) + 5] Tcy

y en cuanto a la rutina de retardo, no no modifico sino el segundo contador, ya que descargue las simlaciones que amablemente compartiste con nosotros y sigo con lo mismo asi cambie al siguiente numero hexadecimal me genera el mismo error,  o si le resto a 0xC2 sigue con el problema :S


 

anything