Autor Tema: Mis progresos  (Leído 4738 veces)

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

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Mis progresos
« Respuesta #15 en: 13 de Mayo de 2008, 14:46:53 »
Tienes razón Joga!   :-/
Creo que pocher y yo sólo queríamos que usaras todas las herramientas, pero veo que no se te ha escapado nada!  :mrgreen:
Usando un símil venezolano, es como aprender a hacer primero arepas a mano y luego a usar el tostiarepas...
Siempre es importante también saber hacerlas a mano!  :D
Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Joga

  • PIC10
  • *
  • Mensajes: 31
Re: Mis progresos
« Respuesta #16 en: 22 de Mayo de 2008, 11:25:38 »
Ya he terminado el del coche fantastico, que también tiene dos secuencias más que se cambian al pulsar el pulsador.

Aquí pongo el esquema final.




Y aquí el código:

Código: [Seleccionar]
;DIRECTIVAS------------------------------------------------------------------------
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;Configuración del grabador
LIST P=16F84A
INCLUDE <P16F84A.INC>

;DECLARACION DE VARIABLES-----------------------------------------------------------

CBLOCK 0X0C   
NumP ;Número de pulsaciones del pulsador.
NumR ;Número de repeticiones
NumT ;Número de repeticones para el tiempo.
ENDC

#DEFINE Pulsador PORTB,0
#DEFINE Led1 PORTB,1
        #DEFINE Led2 PORTB,2
#DEFINE Led3 PORTB,3
#DEFINE Led4 PORTB,4
#DEFINE Led5 PORTB,5


;-----------------------------------------------------------------------------------

ORG 0
goto Inicio
ORG 4 ;Aquí acude el programa cada vez que hay una interrupcion.
goto Interrupcion

Inicio
bsf    STATUS,RP0     ;Paso al banco 1
movlw b'00000001'
movwf TRISB                ;Pongo el pin RB0/INT como entrada y los demás como salidas.
movlw b'00000111'        ;Selecciono el preescaler a 256
        movwf OPTION_REG   
bcf    STATUS, RP0     ;Vuelvo al banco 0
movlw b'10010000'       ;Habilito solo las interrupciones por INT.
movwf INTCON
call Reseteo        ; Me aseguro de que estén apagados los leds.

;Aquí se enciende y apagan los leds.


Principal
sleep     ;Duerme hasta que no se produzca una interrupcion.
goto Principal



TMR0_60ms EQU .21
TMR0_20ms  EQU .177

Timer0_20ms
        movlw      TMR0_20ms         ;Cargo el TMR0 para 20ms
movwf      TMR0
bcf   INTCON,T0IF    ;Resetea el flag de desbordamiento del TMR0

Timer0_Desbordado1
btfss INTCON,T0IF                ;Compruebo si se ha desbordado el TMR0.
goto Timer0_Desbordado1    ; No se ha desbordado.
    return   ; Se ha desborda

Timer0_120ms
movlw .2
movwf NumT   ;Realizo 2 repetiones para lograr 120ms aprox.
movlw TMR0_60ms             ;Cargo el TMR0 para 60ms
movwf TMR0

Reset_TMR0
bcf INTCON,T0IF    ;Resetea el flag de desbordamiento del TMR0

Timer0_Desbordado
btfss INTCON,T0IF            ;Compruebo si se ha desbordado el TMR0.
goto Timer0_Desbordado  ; No se ha desbordado.
decfsz NumT,F 
goto Reset_TMR0  
    return   ; Se ha desbordado.

Interrupcion
call    Timer0_20ms   ;Espero 20ms por si es un rebote.
btfsc   Pulsador      ;Compruebo si está pulsado
goto   Fin_Interrupcion       ;Ha sido un rebote, por lo que sale.
incf    NumP,F      ;No ha sido un rebote, incremento NumP.
call     Reseteo
movfw   NumP
sublw   .1  
btfsc   STATUS,Z   ;Compruebo si vale 1
call       Coche               ;Como es 0 ejecuto el coche fantastico :).
movfw   NumP
sublw .2
btfsc   STATUS,Z   ;Compruebo si vale 2
call    Sec2        ;Como es 2 ejecuto la secuencia 2 de los leds.
movfw   NumP
sublw   .3  
btfsc   STATUS,Z   ;Compruebo si vale 3
call       Sec3       ;Como es 3 ejecuto la secuencia 3 de los leds.

Fin_Interrupcion
bcf INTCON,INTF   ;Limpio el flag de reconocimiento de interrupcion INT.
retfie   ;Retorna y habilita las interrupciones.

Reseteo
movlw     .5                                 ;Establezco 5 repeticiones.
movwf     NumR
bcf Led1 ; Me aseguro de que estén apagados los leds
bcf Led2 ; antes de empezar la secuencia.
bcf Led3
bcf Led4
bcf Led5
return


Coche
bsf Led1 ;Enciendo el led1
call Timer0_120ms             ;Espero
bcf Led1 ;Apago el led1
call Timer0_120ms ;Espero
bsf Led2 ;Enciendo el led2
call Timer0_120ms ; ..............
bcf Led2
call Timer0_120ms
bsf Led3
call Timer0_120ms
bcf Led3
       call Timer0_120ms
bsf Led4
call Timer0_120ms
bcf Led4
call Timer0_120ms
bsf Led5
call Timer0_120ms
bcf Led5
call Timer0_120ms
bsf Led4
call Timer0_120ms
bcf Led4
call Timer0_120ms
bsf Led3
call Timer0_120ms
bcf Led3
call Timer0_120ms
bsf Led2
call Timer0_120ms
bcf Led2
call Timer0_120ms   
bsf Led1
call Timer0_120ms   
decfsz NumR,F
goto Coche
bcf Led1 ;Apago el Led1, puesto que se quedaría encendido al salir.
return

Sec2
bsf Led1
call Timer0_120ms
bsf Led2
call Timer0_120ms
bsf Led3
call Timer0_120ms
bcf Led1
call Timer0_120ms
bcf Led2
call Timer0_120ms
bcf Led3
call Timer0_120ms
bsf Led3
call Timer0_120ms
bsf Led4
call Timer0_120ms
bsf Led5
call Timer0_120ms
bcf Led5
call Timer0_120ms
bcf Led4
call Timer0_120ms
bcf Led3
call Timer0_120ms
decfsz NumR,F
goto Sec2
return

Sec3
bsf Led1
bsf Led5
call Timer0_120ms
bcf Led1
bcf Led5
call Timer0_120ms
bsf Led2
bsf Led4
call Timer0_120ms
bcf Led2
bcf Led4
call Timer0_120ms
bsf Led3
call Timer0_120ms
bcf Led3
call Timer0_120ms
bsf Led3
call Timer0_120ms
bcf Led3
call Timer0_120ms
decfsz NumR,F
goto Sec3
movlw .0 ;Pongo a 0 NumP para inicializar la secuencia de pulsaciones.
movwf NumP
return

END

Al principio no me funcionaba, y resulta que no habia hecho bien la rutina para el TMR y en vez de 120ms aproximados, me daba 7 uS  :D. (Como pa verlo).

Lo que me he dado cuenta es que al apagar la fuente de alimentacion se pone a encerder leds como si lo hubiera pulsado.

Le faltaría también una optimizacion en las partes donde se enciende los leds, pero lo dejo para otra vez. De momento voy a pensar en alguna practiva con displays de siete segmentos  :mrgreen:.

Un saludo.

Desconectado Joga

  • PIC10
  • *
  • Mensajes: 31
Re: Mis progresos
« Respuesta #17 en: 26 de Mayo de 2008, 10:09:10 »
Debido a que tengo poco tiempo para dedicárselo a la electrónica, voy a ir más rápido y he empezado con C a ver si hago algún proyecto y voy aprendiendo mientras lo realizo.

Aquí pongo el código de un display de 7 segmentos que muestra del 0-9, de A-F y el punto, cambiando cada vez que se pulsa un botón.

Código: [Seleccionar]
;DIRECTIVAS------------------------------------------------------------------------

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;Configuración del grabador

LIST P=16F84A

INCLUDE <P16F84A.INC>


;DECLARACION DE VARIABLES-----------------------------------------------------------



CBLOCK 0X0C   

  Pos ;Posicion en la tabla.

NumT ;Número de repeticones para el tiempo.

ENDC



#DEFINE Pulsador PORTA,2





;-----------------------------------------------------------------------------------



ORG 0

goto Inicio





Inicio

bsf STATUS,RP0     ;Paso al banco 1

clrf TRISB ;Configuro el puerto B como salida.

movlw b'00000100'     ;Configuro RA2 como entrada.

movwf TRISA

movlw b'10000111'     ;Desactivo resistencias Pull-Up, Pre-escaler a 256

        movwf OPTION_REG   

bcf STATUS, RP0     ;Vuelvo al banco 0

movlw b'00000000'     ;Desabilito las interrupciones.

movwf INTCON

movlw .0              ;Pongo a 0 Pos

movwf Pos

clrf PORTB           ;Me aseguro que este el puerto B apagado.





;Aquí se enciende y apagan los leds.





Principal

btfsc Pulsador   ;Compruebo si está pulsado

goto Principal                   ;No se ha pulsado.

call Timer0_20ms   ;Espero 20ms por si es un rebote.

btfsc Pulsador   ;Vuelvo a comprobar

goto Principal                   ;Era un rebote

movfw Pos                        ;No era un rebote.

call Tabla

movwf PORTB   ;Muestro el digito seleccionado en la tabla.

call    Timer0_300ms          ;Espero para que no salte varios digitos de una pulsación.

incf    Pos   ;Incremento Pos para visualizar el siguiente digito.

movfw   Pos

sublw   .17  

btfss STATUS,Z   ;Compruebo si vale 17

goto Principal

movlw   .0                         ;Pongo a 0 Pos

movwf Pos



goto Principal





TMR0_20ms  EQU .177

TMR0_60ms  EQU .21



Timer0_20ms

    movlw TMR0_20ms         ;Cargo el TMR0 para 20ms

movwf TMR0

bcf   INTCON,T0IF    ;Resetea el flag de desbordamiento del TMR0



Timer0_Desbordado

btfss INTCON,T0IF              ;Compruebo si se ha desbordado el TMR0.

goto Timer0_Desbordado     ; No se ha desbordado.

    return



Timer0_300ms

movlw .5

movwf NumT   ;Realizo 10 repetiones para lograr 300ms aprox.

movlw TMR0_60ms         ;Cargo el TMR0 para 60ms

movwf TMR0



Reset_TMR0

bcf   INTCON,T0IF    ;Resetea el flag de desbordamiento del TMR0



Timer0_Desbordado1

btfss INTCON,T0IF       ;Compruebo si se ha desbordado el TMR0.

goto Timer0_Desbordado1 ; No se ha desbordado.

decfsz NumT,F

goto Reset_TMR0  

    return



Tabla

addwf PCL,F

DT 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,67h,77h,7Ch,39h

DT 5Eh,79h,71h,80h



END

Y Aquí en C  :mrgreen:

Código: [Seleccionar]
#include <16F84A.h>



#FUSES NOWDT                    //Deshabilito el wardog

#FUSES XT                         //Selecciono oscilador de cuarzo

#FUSES PUT                       //Power Up Timer

#FUSES NOPROTECT                //No le  pongo protección



#use delay(clock=4000000)

#use standard_io(B)

#use standard_io(A)

#define Pulsador PIN_A2       



   

   

void main()

{

   char Pos = 0;         //Posicion en la tabla.

   int Tabla[17] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67,0x77,

   0x7C,0x39,0x5E,0x79,0x71,0x80};     //Números 0-9, letras A-F y el punto.

   

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);

   port_b_pullups(FALSE);

   set_tris_b(0);         

   set_tris_a(0b00000100);

   disable_interrupts(GLOBAL);      //todas las interrupciones desactivadas

   output_b(0);                             //Me aseguro de que esté apagado el  display

   

   

   do{

      if (!input(Pulsador))

      {

         delay_ms(20);

         if (input(Pulsador) == 0)

         {

            output_b(Tabla[Pos]);   

            delay_ms(300);                     ;Espero para poder ver  la secuencia correctamente .

            Pos++;

            if (Pos == 17)

            {

               Pos = 0;                           ;Como  ha llegado al punto, le indico que vuelva a empezar.

            }

         }

      }

   }while(true);

   

     



   



}


Aprovecho para comentaros que pienso pasarme a un pic 18F, aunque parezca precipitado, quiero aprenderlo mientras hago un proyecto que más tarde pondré en la sección correspondiente de este foro, de momento tengo claro que va a tener una pantalla LCD 2x16, unos leds, un par de pulsadores y no se si un display de 7 segmentos, e irá conectado al ordenador por usb. Pero no se cual comprar, si el 18F2550 o el 18F4550 ya que se diferencian muy poco de precio. A ver que me recomendáis vosotros.

Un saludo.