Autor Tema: Ayuda inicio  (Leído 32955 veces)

0 Usuarios y 11 Visitantes están viendo este tema.

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #60 en: 19 de Junio de 2006, 03:30:03 »
Buenos días gente!

Bueno, me voyt a poner manos a la obra... voy a cojer el prgrama de pibe y voy a estudiarlo para entenderlo. Colgaré las dudas que tenga... y a ver si luego lo puedo hacer yo solo.

Por cierto pibe el programa funciona ok? Lo único que cambiaré el tiempo porque a 80ms tienes quie pulsar muy rápido sinó se encienden 2 led's de golpe.

Lo siguiente es lo que n otengo claro del todo: El comentario lo he escrito que es lo que yo creo que es:

temp_1 equ 20h   ;definimos variable temp_1 para la demora / Porque le ponemos 20h?
temp_2 equ 21h   ;definimos variable temp_2 para la demora / porque le ponemos 21h?

Que es la posición de memoría donde guardaremos el valor de temp_1 y 2? Y porque se pone 20 y 21?


movlw   0x06 ; Ponemos a 06 W / proque 06?             
movwf   ADCON1   ; Esto recuerdo que era para poner las salidas en digital? Todas?
clrf   TRISA   ;indicamos puerto A salidas / Correcto?
clrf   TRISB   ;indicamos puerto B salidas / "
clrf   TRISC   ;indicamos puerto C salidas / "
clrf   TRISD   ;indicamos puerto D salidas / "               
MOVLW b'11101111'   ;ojo que TRISE tambien actua sobre puerto D / porque aveces se pone b'00000000' y otras pones 06 por ejemplo?
movwf    TRISE       ;es analógico / le indicas que seá analógico? Porque?
-----------------------------------------
;Demora 80ms a 4mhz
demora80ms   movlw   0xFF
            movwf   temp_1
            movlw   .105 ; que funcion tiene .105? es decir siempre veo algo como movlw 0xff, porque aquí es .105?
            movwf   temp_2
            decfsz   temp_1,f
            goto   $-1
            clrwdt
            decfsz   temp_2,f
            goto   $-4
            return   
end

Pibe, perdona las moelstías y gracias.
Esto vícia...


Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #61 en: 19 de Junio de 2006, 03:42:43 »
Otra dudilla... porque ponemos clrwdt? Clear watchdog timer?

Y si poniendo .105 són 80ms? Si quiero poner por ejemplo 1 segundo?

He cambiado el valor de 105 por 180 y el programa yá vá perfecto, es decir, cada pulsación activa 1 led.

Es dificil la fórmula del tiempo?

Saludos

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #62 en: 19 de Junio de 2006, 04:03:55 »
LIST p=16f877a      ;indicamos procesador que utilizamos
   
#include <p16f877a.inc>   ;processor specific definitions
__config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF

   ERRORLEVEL -302      ;elimina mensaje de warning "not in bank 0"
      ERRORLEVEL -203      ;elimina mensaje de warning
      ERRORLEVEL -305      ;elimina mensaje de warning
      ERRORLEVEL -205      ;elimina mensaje de warning

temp_1 equ 20h   ;definimos variable temp_1 para la demora
temp_2 equ 21h   ;definimos variable temp_2 para la demora


;************************ RESET Y VERCTORES INT *******************************
org     00h      ;Vector de reset (aqui viene el micro cuando arranca)
goto    Inicio   ;inmediatamente lo mandamos a Inicio
org     0x05    ;Le indicamos en que posición de memoria comienza lo que sigue


Inicio   ;------------------------ INICIALIZA MICROPOCESADOR ---------------------------
;Inicializa puertos
IniPorts
clrf   PORTA   ;pone a 0 el puerto A   
clrf            PORTB   ;pone a 0 el puerto B
clrf      PORTC   ;pone a 0 el puerto C
clrf            PORTD   ;pone a 0 el puerto D
clrf    PORTE   ;pone a 0 el puerto E
bsf    STATUS,RP0  ;Seleccionamos Bank 1
movlw   0x06    ;???       
movwf   ADCON1   ;???
clrf      TRISA   ;indicamos puerto A salidas
clrf      TRISB   ;indicamos puerto B salidas
clrf    TRISC   ;indicamos puerto C salidas
clrf    TRISD   ;indicamos puerto D salidas               
MOVLW b'11101111'   ;ojo que TRISE tambien actua sobre puerto D y
movwf    TRISE       ;es analógico
bcf    STATUS,RP0  ;Seleccionamos Bank 0

Main
clrf    PORTA        ;inicio puerto A
call    demoraXms ;espera antirrebote para que al pulsar no cuente más de 1 pulsación
btfss    PORTE,0     ;pin 0 a +?
goto   $-1           ;aun no, volvemos a la instrucción anterior
bsf   PORTA,0   ;si, activa led 0

call demoraXms          ;espera X segundos antes de volver a mirar el el RE0   
btfss PORTE,0            ;si RE0 =1 escapa, si es 0 hace el goto, que vuelve subir a la instrucción anterior
goto $-1                  ;sube a la instruccion anterior
bsf PORTA,1               ;como RE0=1 ponemos un 1 RA0

call demoraXms   ;espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0    ;si RE0 =1 escapa, si es 0 hace el goto, que vuelve subir a la instrucción anterior
goto $-1          ;sube a lka instrucción anterior
bsf PORTA,2       ;como RE0=1 ponemos RA1 a 1

call demoraXms  ;espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0    ;miramos estado pin RE0, si es 0 hace la siguiente instrucción, si es 1 se salta el goto
goto $-1          ;ejecuta la instrucción anterior
bsf PORTA,3      ;ponemos un 1 en el pin RA2

call demoraXms  ; espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0   ; miramos estado pin RE0, si es 0 hace la isntrucción siguiente, si es 1 hace goto Main
goto $-1

goto Main       ;vuelve a empezar

;Demora Xms a 4mhz
demoraXms   
movlw   0xFF       ;ponemos FF en W
movwf   temp_1   ;guardamos FF en la variable temp_1
movlw   .180        ;cuanto mayor sea este numero más larga será la demora???
movwf   temp_2    ;ponemos 180 en la variable temp_2
decfsz  temp_1,f   ;decrementamos temp_1 salta si es 0???
goto   $-1     ;ejecutamos la instrucción anterior
clrwdt                 ;Limpiamos el tiempo del watchdog???
decfsz temp_2,f    ;decrementamos temp_2 salta si es 0???
goto      $-4     ; salta 4 isntrucciones hacia atras, osea salta a decfsz temp_1
return                 ;vuelve a la instrucción donde estaba 
end


Bueno, esto es lo que yo entiendo, hay algunas cosas que me falta confirmar, las que estan en negrita sobretodo.



Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #63 en: 19 de Junio de 2006, 05:01:33 »
call demoraXms  ; espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0   ; miramos estado pin RE0, si es 0 hace la instrucción siguiente, si es 1 salta el goto
goto $-1         ; ejecuta 1 instrucción más atrás
bsf PORTB,7      ; ponemos un 1 en el pin RB7

Simulando con el proteus no consigo encender el pin RB7, está mal el código? Hay algo que se me escapa?

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Ayuda inicio
« Respuesta #64 en: 19 de Junio de 2006, 06:54:01 »
Y que te toma el proteus como RE0?
Como sabe si es 0 o 1? le pones un pulsador?

Grábalo directamente al micro y me comentas
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #65 en: 19 de Junio de 2006, 07:01:09 »
Ya he solucionado el problema, me faltaba un par de instrucciones del tipo call demora.

Por cierto he puesto :

;Demora Xms a 4mhz
demoraXms   
movlw   0xFF   ;ponemos FF en W
movwf   temp_1   ;guardamos FF en la variable temp_1
movlw   .250   ;cuanto mayor sea este numero más larga será la demora???movwf   temp_2   ;ponemos 180 en la variable temp_2
decfsz  temp_1,f          ;decrementamos temp_1 salta si es 0???
goto $-1                   ;ejecutamos la instrucción anterior
clrwdt      ;Limpiamos el tiempo del watchdog???
decfsz temp_2,f           ;decrementamos temp_2 salta si es 0???
goto   $-4                   ; salta 4 isntrucciones hacia atras, osea salta a decfsz temp_1
return          ;vuelve a la instrucción donde estaba 
end

He puesto en vez de .105 .250 para que el tiempo sea mayor, pero al poner .300 me daba error el Mplab, no sé porque.

Ahora mismo ya me enciende todos las salidas que quiero  :-/


Pibe, que tiempo realmente le estoy metiendo al poner .250? es dificil calcular?

Saludos

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Ayuda inicio
« Respuesta #66 en: 19 de Junio de 2006, 07:30:24 »
El acumulador es de 8 bits, 1 byte y por consiguiente solo se puede cargar hasta 255 => 0xFF. Al poner 300 te tiene que dar error. Aunque me da la ºimpresión que estas utilizando mal la función demoraXms, ya que los valores de retardo se deberian poner en temp_1 y temp_2, para especificar la demora.

Un saludo.

* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #67 en: 19 de Junio de 2006, 07:52:03 »
Hola jfh900, he puesto .250 y me funciona. A que te refieres con que lo estoy utilizando mal? Acabo de empezar con esto del assembler y me estan ayudando todos, te agradecería me explicaras que estoy haciendo mal para solucionarlo.
Gracias

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Ayuda inicio
« Respuesta #68 en: 19 de Junio de 2006, 08:45:40 »
Sigue la rutina paso por paso:

No son mas que dos contadores hacia atrás, uno dentro del otro.
El interno cuenta hasta 255 (FF) y el externo repite el interno tantas veces como le pongas; en este caso 250.

En síntesis: cuentas 255 microsegundos (aproximadamente) con el contador interno ya que a 4mhz es una instrucción por microsegundos. Y luego cuentas 250 veces 255 microsegundos = 63750 microsegundos = 63 milisegundos, pero falta contar los saltos que haces entre instrucciones que terdan 2 ciclos= 2 microsegundos.

La mejor manera es simulándolo con el mplab y corriendo la subrutina de principio a fin con la configuración correspondiente a 4mhz
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #69 en: 19 de Junio de 2006, 09:21:15 »
Ok, pibe  :-)

Gracias

El proyecto vá avanzando :-/

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #70 en: 20 de Junio de 2006, 04:19:46 »
Bueno, esto vá cogiendo forma.  :D

Lo siguiente qyue tengo en mente es utilizar 6 salidas más, que serían:
RC4, RC5, RC6,RC7,RE1 y RE2.

Como sabeis el programa toma como entrada RE0, mi pregunta es... se puede hacer que RE0 sea solo entrada y RE1 y RE2 sean salidas? Como lo hago?

Entonces me sobran 8 salidas osea todo el puerto D que estoy pensando colocarme un LCD para que muestre mensajes, lo veis muy complicado para mi nivel?

Gracias

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #71 en: 20 de Junio de 2006, 04:45:50 »
El LCD en cuestión que quiero manejar es de 16x2 y su pin out es el siguiente:



Se puede controlar dicho display? O hay algo a tener en cuenta?


Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #72 en: 20 de Junio de 2006, 05:44:18 »
Bueno, esto vá cogiendo forma.  :D

Lo siguiente qyue tengo en mente es utilizar 6 salidas más, que serían:
RC4, RC5, RC6,RC7,RE1 y RE2.

Como sabeis el programa toma como entrada RE0, mi pregunta es... se puede hacer que RE0 sea solo entrada y RE1 y RE2 sean salidas? Como lo hago?

Entonces me sobran 8 salidas osea todo el puerto D que estoy pensando colocarme un LCD para que muestre mensajes, lo veis muy complicado para mi nivel?

Gracias

Me cito yo mismo... mirando el datasheet creo que en vez de poner:

 MOVLW b'11101111'  si cambio los 3 ultimos bits tal que así MOVLW b'11101001' le estoy diciendo que RE1 y RE2 sean salidas porque los he puesto a 0 ok? Todo esto deducción...

Pero siempre es 0= salida 1= entrada?

Porcierto al usar
MOVLW b'11101001'
movwf    TRISE

Con los 3 ultimos bits 001 le estoy diciendo RE0 entrada, RE1 salida y RE2 salida... pero con los otros bits que le estoy diciendo?

Gracias

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #73 en: 20 de Junio de 2006, 05:48:45 »
Pudiera ser que al poner 11101001 le esté diciendo aparte de RE0 entrada, RE1 salida Re2 salida, que:

0 en el bit4= PSPmode functions in general purpose I/O mode ?

Y porque en el bit 3 hay un 1?

Gracias

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Ayuda inicio
« Respuesta #74 en: 20 de Junio de 2006, 10:40:50 »
Pudiera ser que al poner 11101001 le esté diciendo aparte de RE0 entrada, RE1 salida Re2 salida, que:

0 en el bit4= PSPmode functions in general purpose I/O mode ?

Y porque en el bit 3 hay un 1?

Gracias

Lo del bit 4 del PORTE ya te lo he explicado antes.
Es correcta tu deducción: 1 entrada, 0 salida. En todos los puertos es igual. La única excepción es el puerto E, que al solo tener 4 pines solo utiliza los 4 primeros bits para setear entrada o salida con TRISE.

Puedes conectar un lcd de 2 maneras: usando 4 u 8 pines.
 Mira la página www.todopic.com.ar, pincha en el boton asembler y busca LCD en el directorio. Creo que hay un programa para usar el LCD.

Picto: Todo esto está en la hoja de datos, pero asumo que no entiendes ni papa de inglés, o si? De todas maneras y aunque no entiendas , echale una ojeada y veras que hace cada bit del TRISE.



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