Autor Tema: Ayuda, aprendizaje y demas :D  (Leído 4746 veces)

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

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Ayuda, aprendizaje y demas :D
« en: 25 de Enero de 2015, 11:40:08 »
Muy buenas a todos gente, que tal? Hace un par de días estuve mirando los foros de la página y veo que hay temas variados e interesantes. Necesitaría un poco de ayuda con un programa que tengo que realizar para febrero (Para el colegio) de programación en lenguaje assembler. Utilizando el PIC16F88 se debe realizar lo siguiente: 1) Utilizando 4 llaves envíe por el puerto serie (9600,8,N,1) los caracteres ASCII en el rango de los números del 0 al 9 en forma constante. 2) Utilizando 2 displays 7 segmentos multiplexados, muestre el valor hexadecimal del ASCII enviado por el puerto serie. 3) Si desde la PC se recibe un carácter cualquiera los displays deberán parpadear a 0.5 segundos con el valor "00" durante 5 segundos, y luego continuará los puntos anteriores.
No tengo mucha dificultad entendiendo el lenguaje pero hay un par de cuestiones a las que no les agarro la mano, también por no tener mucho tiempo libre porque ademas tengo otras materias, necesitaría un poco de ayuda o consejos para encarar este programa.
Mi idea era realizar la multiplexación con TMR0 en modo temporizador y el parpadeo de los displays con TMR1, pero me dijeron que podía usar solo TMR0, en modo temporizador para el multiplexado y para el parpadeo en modo contador. En que podría ayudarme?
Desde ya gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda, aprendizaje y demas :D
« Respuesta #1 en: 25 de Enero de 2015, 13:40:17 »
Empezando que realizar un programa asi en ASM no lo veo nada corto y pequeño. Por lo tanto el codigo no te lo va a dar nadie o te pueden dar codigos de la UART / displays, segundo para febrero estando el dia 25 estas muy cerca y hay muchisimas cosas para hacer

Por ejemplo:
UART - http://www.oz1bxm.dk/PIC/628uart.htm (Para un PIC16f628 pero te podes dar una guia )
Display 1 digito - http://www.todopic.com.ar/foros/index.php?topic=12345.msg82948#msg82948


En el display tendrias que hacer como dijiste una multiplexacion por lo tanto podrias usar un timer para que genere una interrupcion cada X tiempo. En esta interrupcion solo activarias el otro catodo y cambiarias el valor del puerto.

Tambien podrias usar este mismo timer ( y un contador es decir una variable que se incremente y se borre cuando llegue a cierto valor ) para hacer lo del apagado de los 0.5segundos (mas que obvio que el tiempo de interrupcion deberia ser un valor que multiplicado por un entero de 0.5s o aproximado), esto funcionaria condicionalmente si hay una flag activa ( un bit de alguna variable que tengas para el control del flujo ). O usar otro timer para este punto. O directamente no usar timer y usar demoras para la multiplexacion y timer para cuando recibe el dato..

Interrupcion por RX de la UART, asi cuando recibe un dato activa esta ultima flag y comienza a prender y apagar los displays. Al finalizar la animacion apagas el flag

Tener previsto que vas a hacer con los botones, preveer si se presionan todos o 2 al mismo tiempo, que no cuenten 2 o mas veces cuando lo presionas 1 sola ves, implementar anti-rebote por software o por hardware?

Implementar la conversion de niveles de tension para la conexión UART con la PC.

La salida del PIC la vas a hacer binaria y utilizar un CD4511 o directamente desde el PIC generar las salidas ?

Todas esas cuestiones te tenes que preguntar. Y de seguro que me estoy olvidando algunas.

Citar
también por no tener mucho tiempo libre porque ademas tengo otras materias

En fin... como dije, no es nada corto. Y solo te puedo dar consejos a no ser que vengas con un problema en particular y poseas un codigo para ver donde esta el problema.
Tiempo siempre hay que hacerlo. En la universidad/colegio realmente me la pase sin hacer nada hasta los finales. Y la idea es que aprendas y no recibir el codigo de la nada. Vas a renegar por supuesto como todos :P

« Última modificación: 25 de Enero de 2015, 13:55:31 por KILLERJC »

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda, aprendizaje y demas :D
« Respuesta #2 en: 25 de Enero de 2015, 13:55:03 »
Es más mi profesor me dijo que se le hizo corto el programa. A tu pregunta te respondo que usamos llaves osea que nos dijeron que no hace falta que le pongamos anti-rebote, acá te/les dejo un video del programa simulado en PROTEUS echo por mi profesor.
Desde el PIC genero las salidas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda, aprendizaje y demas :D
« Respuesta #3 en: 25 de Enero de 2015, 14:11:03 »
Sinceramente yo no enviaria datos asi como lo hace tu profesor pero bueno. Tambien se nota que no le gusta inicializar las variables a 0 o tiene algo mal, lo podes ver cuando inicia el programa que le queda en "30" xD
Si es asi como lo quiere entonces si es mas corto. Ademas si queres ni siquiera usas interrupciones, directamente con delays. Y tal ves por ser simulacion NI SIQUIERA ponerle delays. Solo el de 0.5s

Como dije usa un 4511... lo cual le libera muchos mas pines y le simplifica las cosas. Tambien veo que deja de enviar datos cuando entra en la animacion asi debe ser algo asi:

Código: [Seleccionar]
org 0x00
Configuarion:

Aca configuras todo

Main:

Tomo datos de las llaves y guardo en una variable que luego usas para todo hasta que actualiza nuevamente en esta parte
Esta libre la UART ?
           le sumo 0x30  o "0" (si es de 0 a 9, si es mas entonces vas a tener que ver la tabla ASCII y apartir que sea mayor a 10, le restas 10 y le sumas un "A")
           lleno buffer de TX para que envie el valor
Pongo datos de llaves al port ( no BCD sino el directo de las llaves )
activo un catodo
delay ( opcional si es simulacion )
desactivo catodo
muevo datos de llaves al port
activo catodo2
delay (opcional si es simulacion )
Recibi algo (flag RX)?
              Asigno un contador con el valor 10 decimal
              Borro flag
              Pongo a 0 port
              Activo ambos catodos
              Delay ( 0.5s )
              Apago catodos
              Decremetno variable para contar las cantidades de veces que paso por aca
              Realizo lo de arriba 10 veces y continuo ( es decir aca un goto y un BTFSC o BTFSS STATUS,Z a una variable contador )
Vuelvo a main

2/3/4 variables, 2 delays distintos y lo tenes. Ahora te queda programarlo xD
El pseudocodigo que te di creo que casi casi es una traduccion directa al ASM.

Creo que lo mas complicado que te queda hacer es la condiguracion de la UART y los delays ( que hay programitas o sitios online que te lo realizan)
http://www.golovchenko.org/cgi-bin/delay
« Última modificación: 25 de Enero de 2015, 14:26:41 por KILLERJC »

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda, aprendizaje y demas :D
« Respuesta #4 en: 25 de Enero de 2015, 14:47:16 »
Cuando inicia el programa le queda en 30 porque las llaves están todas en cero, el decimal (cero) del ascii es el 30. También la configuración de la UART ya la tengo hecha.
 KILLERJC vos me decís que lo haga con delays? Porque tengo un entrenador digital con el 4511. Me podrías explicar un poquito más porque tal vez se me hace más fácil de lo que pienso

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda, aprendizaje y demas :D
« Respuesta #5 en: 25 de Enero de 2015, 18:08:17 »
No le puede quedar 30 por mas que sea ASCII del 0 ( cero ), sino esta mal hecho el programa, y si fuera un numero mayor o igual a 10 (4 llaves 2^4=16 ) necesitaria 4 digitos para representarlo 0x31 0x30 en ASCII. Aparte "magicamente" luego de que recibe un caracter por la USART se pone en 0 las decenas  ..... imagino que es en decimal por que si es en hexa no vale la pena hacerlo con 2 displays ya que uno solo alcanzaria.

Sobre el cd4511 te aconsejo que busques el datasheet, en realidad siempre busca el datasheet de los IC e intenta ver que son o como funcionan, es muy simple solo le das el valor en binario ( 4 bits ) y este lo decodifica a 7 segmentos.

No se exactamente que explicarte. El pseudocodigo esta muy simple, tanto que puede llevar 1/2 hasta maximo 4/5 lineas de ASM ( creo que hay 2 lineas de pseudocodigo que te llevaria eso ) por cada linea de pseudocodigo.

Pero hay que diferenciar una cosa. Si lo tenes que hacer fisicamente o en simulacion, si lo haces en fisico entonces vas a necesitar un poco mas de consideracion con los delays y el antirebote, si es simulacion no te preocupes, el unico que necesitarias es el de 0.5s.

Y si lo podes hacer con delays. Asi tal cual lo hizo el .... se nota por como funciona ( deja de enviar datos cuando recibe algo y se pone a hacer la animacion de los ceros ).

¿Que necesitas que te explique?

Para la configuracion de la UART vas a tener que leerte la seccion de UART del datasheet del PIC para ver los registros involucrados de la UART y definir los valores de los registros (Ni calcular hay tablas que te dan el valor a cargar para el baud rate dentro del datasheet )
Tenes que configurar los puertos a digitales y como salidas/entradas segun sea el caso seguro que tenes cerca de 2 registros por puerto.
Listo terminaste la configuracion.
Ahora el programa... que ya te lo pase :) en pseudocodigo por supuesto.

No se me ocurre que otras dudas puedas tener. Tenes ya todo ahi, solo es agarrar el datasheet leer los capitulos que necesitas "I/O Ports", "AUSART" la parte de ASYNCHRONOUS y baud rate y "Instruction Set Sumary"
Ademas de saber setear los bits de configuracion, que eso el MPLAB X te lo genera.

Cualquier duda que tengas la explico.. Si esque la se obviamente  :D

Con respecto al programa.. el programa principal se basa en lo siguiente:

Tomar datos
Enviarlos ( si es que no esta trasmitiendo )
Mostrarlos en display
Preguntar si recibiste algo para hacer la animacion

Usando el diagrama de tu profesor
1- Tomar datos:
En esta seccion tomas el dato de PORTA solo el nibble superior, asi que deberias hacer un SWAPF PORTA,W de esa forma cambia el lugar los nibbles y lo almacena en W, luego un ANDLW 0x0F y solo te queda el dato de las llaves. Este dato lo guardas en una variable supongamos A_ENVIAR
Pero necesitas saber si supera el valor 10 en decimal, por lo tanto podrias restarle 10 para saber si es mayor o menor a 10 el numero. si es mayor pones en 1 la variable decenas y el resto en unidades, si no pones a 0 decenas y copias el valor a las unidades
Ya ahi tenes 3 variables:
A_ENVIAR : Este vas a enviar por UART pronto
DECENAS: Valor del digito decenas
UNIDADES: valor digito unidades

2- Enviar datos por UART
Como el programa es mas rapido que el envio de datos pregunto primero si se esta enviando los datos o no. si se estan enviando entonces continuo con lo de mostrar en el display y no molesto a la UART
Listo hora de enviar... Pregunto si las DECENAS esta en 1.. Si estan en 1 significa que el valor es como minimo un A, entonces le sumo a UNIDADES el valor de "A" y lo guardo en W, posteriormente lo mando al buffer de TX.
Si DECENAS esta en 0, simplemente le sumo 30 a UNIDADES guardo en W y de ahi al buffer de TX
Fin

3- Mostrar display
Pongo DECENAS en PORTB
activo el comun de diplay de decenas
Delay ( si vas al fisico )
Pongo UNIDADES en PORTB
Activo el comun de display de unidades
Delay ( si vas al fisico )
Fin

4- Recepecion? :
Al recibir se activa el flag de interrupcion, como no estan activadas simplemente pregunto por ese bit. Si no recibio nada Salgo y vuelvo a comenzar todo de nuevo.
Si recibio algo entonces es hora de hacer la animacion.
    Nueva Variable CONTADOR = 5 decimal.
    Borro el flag de la recepcion para que no entre aca de nuevo ya que ya se que recibi algo.
    Pongo a 0 el PORTB  ( asi entra un 0 en el 4511 y este activa las salidas para un 0 en el display )
Vuelta:
    Y activo ambos catodos ( ambos reciben el 0 por lo tanto los 2 muestran en 0 )
    Delay ( 0.5s )
    Apago los catodos
    Delay ( 0.5s )
    Decremento en 1 a CONTADOR
    BTFSS STATUS,Z  ( es decir CONTADOR llego a 0 ?, si llego a 0 que salte, sino se ejecuta el GOTO y prende y apaga 10 veces ( 5 * 1s = 5s ) ) Es 1s por que estan los 2 delays el de prendido y el de apagado.
    GOTO Vuelta
    FIN

Pensa que cada punto es un programita aparte, y el programa principal solo hace CALL a esos programitas, y el FIN vendria a ser un RETURN.

PD: Mas claro no lo podes tener.
« Última modificación: 25 de Enero de 2015, 18:36:42 por KILLERJC »

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda, aprendizaje y demas :D
« Respuesta #6 en: 25 de Enero de 2015, 20:35:41 »
Mira yo te digo como va a ser, muy posiblemente el profesor me va a pedir el .ASM para ver como lo hice y también lo quiere ver funcionar en un entrenador digital, el cual tiene displays 7 segmentos, puerto serie, 4511, leds, llaves, y un par de cosas interesantes pero que no estamos usando, en el medio de todo hay un protoboard y alrededor hay como borneras para hacer las conexiones con las diferentes cosas antes mencionadas, como es una plaqueta armada ya, lo único que tengo que hacer es programar, meterlo si o si en el PIC16F88 y mostrarlo. Otra cosa, ami me encantaría hacerlo con delays porque tenes razón es más facil, pero el profesor quiere que los hagamos con interrupciones, yo podría hacerlo como lo estamos hablando pero si me pide verlo y ve que no tiene interrupciones no le va a gustar  :5]
Ya tengo la configuración de puerto serie hecha:
      ;   ORG       0x000
       ;   GOTO      BOOTSTART
          ;  ORG         0x004
         ;   GOTO        INTERRUPCION
   ORG  0         ; STARTUP = 0000H
   CLRF STATUS         ; BANK 0
           GOTO    BOOTSTART
   ORG  4
ISR   GOTO 5         ;
   ORG  5
   ;
   ; --------------------------------------------------
   ; SET UP THE PORTS TO SUIT YOUR CIRCUIT REQUIREMENTS
   ; --------------------------------------------------
   ;

BOOTSTART
   BANKSEL   OSCCON
   MOVLW   0X60   ;RELOJ INTERNO 4MHZ
   MOVWF   OSCCON
   BANKSEL PORTA       ; BANK0
   MOVLW     B'11110000'
   MOVWF     PORTA
   MOVLW     B'00000011'
   MOVWF     PORTB
   
   BANKSEL TRISA       ; BANK1
   MOVLW     B'11110000'
   MOVWF     TRISA
   MOVLW     B'00100111'
   MOVWF     TRISB
   MOVLW     B'00000000'
   MOVWF     ANSEL         ; PORTA INPUTS = DIGITAL NOT ANALOG
   ;
   ; BAUD RATE SETTINGS
   ;
   ;  BAUD VALUES WITH BRGH = 0
   ;  ((20000000/9600)/64)-1 = 32
   ;    MOVLW     D'207'    ;  1200 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'103'          ;  2400 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'25'           ;  9600 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'12'           ; 19200 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'255'          ;  1200 BAUD @ 20 MHZ FOSC +1.73 ERR
   ;    MOVLW     D'129'          ;  2400 BAUD @ 20 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'32'          ;  9600 BAUD @ 20 MHZ FOSC -1.36 ERR
   ;    MOVLW     D'15'          ; 19200 BAUD @ 20 MHZ FOSC +1.73 ERR
   
   ;  BAUD VALUES WITH BRGH = 1
   ;  ((20000000/9600)/16)-1 = 32
   MOVLW     D'25'         ;  9600 BAUD @ 20 MHZ FOSC +0.16 ERR
   MOVWF     SPBRG
   MOVLW     B'00100100'    ; BRGH = 1
   MOVWF     TXSTA           ; ENABLE ASYNC TRANSMISSION, SET BRGH
   BANKSEL   RCSTA       ; BANK0
   MOVLW     B'10010000'
   MOVWF     RCSTA          ; ENABLE ASYNC RECEPTION
   MOVF RCREG,W
   MOVF RCREG,W
   MOVF RCREG,W           ; FLUSH RECEIVE BUFFER
   ;
   ;
   ; ------------------------------------
   ; PROVIDE A SETTLING TIME FOR START UP
   ; ------------------------------------
   ;
      CLRF TEMP
SETTLE
      DECFSZ  TEMP
       GOTO    SETTLE
   
LWAITCOM
      CALL    RECLOOP         ; WAIT AND READ FROM RS232
   
      MOVWF     PORTA          ; SHOW VALUE FOR DIAGNOSTIC PURPOSE
TXLOOP
   NOP
   BTFSS     PIR1,TXIF ;XMIT BUFFER EMPTY?
    GOTO     TXLOOP ;NO, WAIT
   MOVF      PORTA      ;muevo depende el puerto en donde conecte
    MOVWF     TXREG
   
    GOTO    LWAITCOM  ; NO
   ;
   ; ----------------------------
   ; RECEIVE CHARACTER FROM RS232
   ; ----------------------------
   ; THIS ROUTINE DOES NOT RETURN UNTIL A CHARACTER IS RECEIVED.
   
RECLOOP
   NOP
   BTFSS     PIR1,RCIF ; CHECK FOR RECEIVED DATA
    GOTO      RECLOOP
   MOVF      RCREG
    MOVWF     PORTB
    RETURN
   END;

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda, aprendizaje y demas :D
« Respuesta #7 en: 25 de Enero de 2015, 22:52:10 »
Tendrias que hacer 2 cambios nomas.

En la seccion de interrupciones correspondiente a la UART RX activas el flag de una variable tuya.

En la seccion de interrupciones del timer activas/desactivas salidas Como dije aca realizas lo mismo que el "Mostrar display". Y te quedaria algo asi:

Interrupcion_timer:

  Guardo contexto
  Limpio flag de interrupcion
  Flag propia activada de RX ?
  SI --->  Aqui hago lo de la animacion con los 0
  NO ---> Aqui muestros los digitos en los displays
  Recargo TIMER con el valor que necesite
  Devuelvo el contexto
  Retorno de la interrupcion.

Vas a tener que aplicar contadores para hacer la animacion. te decia que el tiempo del timer que elijas para resfrescar lso displays deberia ser un valor tal que multiplicandolo por un entero te de 0.5s Ejemplo 50ms.
De esa forma para hacer un "delay" de 0.5s solo deberias tener algo que cuente 100 veces la entrada a la interrupcion. Y podes usar un numero mas chico para el refresco de los displays

Y aun mas facil todavia..

Si reemplazas los delays  por un
BTFSS MIS_FLAGS,1

Y en la interrupcion de tu timer implementas contadores para solo poner a 1 los flags entonces estarias usando las interrupciones,

Ya no te puedo decir mas nada. queda en vos todo lo demas. Intenta programarlo y luego cuando tengas el programa y algo no te funcione lo vemos.
            
« Última modificación: 26 de Enero de 2015, 05:05:42 por KILLERJC »

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda, aprendizaje y demas :D
« Respuesta #8 en: 27 de Enero de 2015, 08:40:16 »
Hey me puse a hacer el programa y mira tengo una idea que tal vez me acorte el programa, estaba mirando el video que te mande y se me ocurrió que como se puede ver las decenas no cambian, osea que nunca llega al decimal 10 puesto que es del 0 al 9, entonces solamente le cargo un 3 a la decena, y mando el valor de las llaves a un display el cual sería el de las unidades. Que me decís?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda, aprendizaje y demas :D
« Respuesta #9 en: 27 de Enero de 2015, 09:11:05 »
Que no. Vuelvo a repetirte ese 3 esta mal. Deberia ser un 0 ( Como se puede ver aproximadamente en los 25 segundos del video )

No ves que cambien las decenas por que el numero ingresado con las llaves jamas es superior a 9

8 4 2 1
--------
1 0 0 1 = 8 + 1 = 9
0 1 1 0 = 4 + 2 = 6

De todas formas esto te acortaria unas 10 lineas aproximadas de tu programa, asi que no es mucho.

Explorando todas las posibilidades que puede haber pensado darte tu profesor:

- Mostrar el numero en hexa ( no tiene sentido tener 2 displays )
- Mostrarlo en ASCII ( Puede ser si utilizas hexa, pero en el segundo 25 del video luego de la animacion se nota que es un error y no un ASCII )
- No se me ocurre mas nada

En fin mostrarlo en sistema decimal, como dije no te quita mucho espacio, hasta podes buscar un "binary to BCD + ASM + PIC" en google y seguro que sale algo, algo como esto:

Código: [Seleccionar]
   addlw    .256-.10       ; C will be set if number was >= 10
    BTFSC    STATUS,C
    addlw    .6                  ; ...adjust for 10..29
    addlw    -(.256-.10)   ; Back to original value

Con el codigo ese pones el numero en W  por ejemplo 0xC y en W te quedaria 0x12
es decir el nibble alto las decenas y nibble bajo las unidades, Solo funcionaria para numero pequeños es decir de 0x00 a 0x13  ( 0 a 19 decimal ) como entrada, suficiente ya que solo utilizas 4 bits ( 0x0 a 0xF) como entrada
Y como dije 4 lineas de codigo te ahorraste por no querer hacer eso.
« Última modificación: 27 de Enero de 2015, 09:34:11 por KILLERJC »

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda, aprendizaje y demas :D
« Respuesta #10 en: 27 de Enero de 2015, 09:33:34 »
"2- Enviar datos por UART
Como el programa es mas rapido que el envio de datos pregunto primero si se esta enviando los datos o no. si se estan enviando entonces continuo con lo de mostrar en el display y no molesto a la UART
Listo hora de enviar... Pregunto si las DECENAS esta en 1.. Si estan en 1 significa que el valor es como minimo un A, entonces le sumo a UNIDADES el valor de "A" y lo guardo en W, posteriormente lo mando al buffer de TX.
Si DECENAS esta en 0, simplemente le sumo 30 a UNIDADES guardo en W y de ahi al buffer de TX
Fin"
Me dijiste que pregunte si se estan enviando los datos, pero en el video todo el tiempo, el número que recibe lo manda, hace falta que haga esa pregunta igual?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda, aprendizaje y demas :D
« Respuesta #11 en: 27 de Enero de 2015, 09:39:35 »
Citar
Me dijiste que pregunte si se estan enviando los datos, pero en el video todo el tiempo, el número que recibe lo manda, hace falta que haga esa pregunta igual?

Si, pero tenes que dejar que la UART termine de enviar lo que le pusiste antes, es como si estuvieras comiendo un alfajor, tenes mitad en la boca y te mandan otro nuevo dentro ( Pero solo tenes espacio para un solo alfajor ).
Podes preguntar por el bit PIR1,TXIF para saber si termino la tansmision y al escribir un nuevo valor a transmitir en el TXREG ese flag se limpia solo cuando escribis para mandar ese nuevo dato( es decir se pone a 0 al poner algo en TXREG )

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda, aprendizaje y demas :D
« Respuesta #12 en: 27 de Enero de 2015, 09:42:11 »
Mira yo te digo como va a ser, muy posiblemente el profesor me va a pedir el .ASM para ver como lo hice y también lo quiere ver funcionar en un entrenador digital, el cual tiene displays 7 segmentos, puerto serie, 4511, leds, llaves, y un par de cosas interesantes pero que no estamos usando, en el medio de todo hay un protoboard y alrededor hay como borneras para hacer las conexiones con las diferentes cosas antes mencionadas, como es una plaqueta armada ya, lo único que tengo que hacer es programar, meterlo si o si en el PIC16F88 y mostrarlo. Otra cosa, ami me encantaría hacerlo con delays porque tenes razón es más facil, pero el profesor quiere que los hagamos con interrupciones, yo podría hacerlo como lo estamos hablando pero si me pide verlo y ve que no tiene interrupciones no le va a gustar  :5]
Ya tengo la configuración de puerto serie hecha:
      ;   ORG       0x000
       ;   GOTO      BOOTSTART
          ;  ORG         0x004
         ;   GOTO        INTERRUPCION
   ORG  0         ; STARTUP = 0000H
   CLRF STATUS         ; BANK 0
           GOTO    BOOTSTART
   ORG  4
ISR   GOTO 5         ;
   ORG  5
   ;
   ; --------------------------------------------------
   ; SET UP THE PORTS TO SUIT YOUR CIRCUIT REQUIREMENTS
   ; --------------------------------------------------
   ;

BOOTSTART
   BANKSEL   OSCCON
   MOVLW   0X60   ;RELOJ INTERNO 4MHZ
   MOVWF   OSCCON
   BANKSEL PORTA       ; BANK0
   MOVLW     B'11110000'
   MOVWF     PORTA
   MOVLW     B'00000011'
   MOVWF     PORTB
   
   BANKSEL TRISA       ; BANK1
   MOVLW     B'11110000'
   MOVWF     TRISA
   MOVLW     B'00100111'
   MOVWF     TRISB
   MOVLW     B'00000000'
   MOVWF     ANSEL         ; PORTA INPUTS = DIGITAL NOT ANALOG
   ;
   ; BAUD RATE SETTINGS
   ;
   ;  BAUD VALUES WITH BRGH = 0
   ;  ((20000000/9600)/64)-1 = 32
   ;    MOVLW     D'207'    ;  1200 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'103'          ;  2400 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'25'           ;  9600 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'12'           ; 19200 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'255'          ;  1200 BAUD @ 20 MHZ FOSC +1.73 ERR
   ;    MOVLW     D'129'          ;  2400 BAUD @ 20 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'32'          ;  9600 BAUD @ 20 MHZ FOSC -1.36 ERR
   ;    MOVLW     D'15'          ; 19200 BAUD @ 20 MHZ FOSC +1.73 ERR
   
   ;  BAUD VALUES WITH BRGH = 1
   ;  ((20000000/9600)/16)-1 = 32
   MOVLW     D'25'         ;  9600 BAUD @ 20 MHZ FOSC +0.16 ERR
   MOVWF     SPBRG
   MOVLW     B'00100100'    ; BRGH = 1
   MOVWF     TXSTA           ; ENABLE ASYNC TRANSMISSION, SET BRGH
   BANKSEL   RCSTA       ; BANK0
   MOVLW     B'10010000'
   MOVWF     RCSTA          ; ENABLE ASYNC RECEPTION
   MOVF RCREG,W
   MOVF RCREG,W
   MOVF RCREG,W           ; FLUSH RECEIVE BUFFER
   ;
   ;
   ; ------------------------------------
   ; PROVIDE A SETTLING TIME FOR START UP
   ; ------------------------------------
   ;
      CLRF TEMP
SETTLE
      DECFSZ  TEMP
       GOTO    SETTLE
   
LWAITCOM
      CALL    RECLOOP         ; WAIT AND READ FROM RS232
   
      MOVWF     PORTA          ; SHOW VALUE FOR DIAGNOSTIC PURPOSE
TXLOOP
   NOP
   BTFSS     PIR1,TXIF ;XMIT BUFFER EMPTY?
    GOTO     TXLOOP ;NO, WAIT
   MOVF      PORTA      ;muevo depende el puerto en donde conecte
    MOVWF     TXREG
   
    GOTO    LWAITCOM  ; NO
   ;
   ; ----------------------------
   ; RECEIVE CHARACTER FROM RS232
   ; ----------------------------
   ; THIS ROUTINE DOES NOT RETURN UNTIL A CHARACTER IS RECEIVED.
   
RECLOOP
   NOP
   BTFSS     PIR1,RCIF ; CHECK FOR RECEIVED DATA
    GOTO      RECLOOP
   MOVF      RCREG
    MOVWF     PORTB
    RETURN
   END;


Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda, aprendizaje y demas :D
« Respuesta #13 en: 27 de Enero de 2015, 09:43:58 »
Teneme paciencia que es complicado esto de la pagina xD
Te quería mostrar que en la parte de transmisión y recepción se pregunta por el PIR1,TXIF y el PIR1, RCIF

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda, aprendizaje y demas :D
« Respuesta #14 en: 27 de Enero de 2015, 10:09:01 »
No se de donde sacaste el codigo, Yo de ese codigo que pusiste solo pondria:


Código: [Seleccionar]
ORG       0x00
.   GOTO        BOOTSTART
ORG       0x04
    GOTO        INTERRUPCION

; Variables usadas: W_TEMP, STATUS_TEMP, PCLATH_TEMP y las propias de nuestra interrupcion FLAGS ( creada por mi para tener el flag de interrupcion de recepcion ) y DATO_RECIBIDO
; Codigo sacado del datasheet del PIC, salva el contenido de W, STATUS y PCLATH, realiza la interrupcion , y luego lo devuelve a su estado original para que ningun problema ocurra luego.
INTERRUPCION:
     MOVWF W_TEMP ;Copy W to TEMP register
     SWAPF STATUS, W ;Swap status to be saved into W
     CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
     MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
     MOVF PCLATH, W ;Only required if using page 1
     MOVWF PCLATH_TEMP ;Save PCLATH into W
     CLRF PCLATH ;Page zero, regardless of current page

     ; Aca el codigo de tu ISR

     BSF FLAGS,0  ; Si solo tenes inetrrupcion de RX, sino vas a tener que preguntar que interrupcion fue y actuar de acuerdo a eso
     MOVF RCREG,W
     MOVWF DATO_RECIBIDO
     BCF PIR1,RCIF

     ; Fin del codigo de ISR

     MOVF PCLATH_TEMP, W ;Restore PCLATH
     MOVWF PCLATH ;Move W into PCLATH
     SWAPF STATUS_TEMP, W ;Swap STATUS_TEMP register into W
     ;(sets bank to original state)
     MOVWF STATUS ;Move W into STATUS register
     SWAPF W_TEMP, F ;Swap W_TEMP
     SWAPF W_TEMP, W ;Swap W_TEMP into W
     RETFIE

BOOTSTART
   BANKSEL   OSCCON
   MOVLW   0X60   ;RELOJ INTERNO 4MHZ
   MOVWF   OSCCON
   BANKSEL PORTA       ; BANK0
   MOVLW     B'11110000'
   MOVWF     PORTA
   MOVLW     B'00000011'
   MOVWF     PORTB
  
   BANKSEL TRISA       ; BANK1
   MOVLW     B'11110000'
   MOVWF     TRISA
   MOVLW     B'00100111'
   MOVWF     TRISB
   MOVLW     B'00000000'
   MOVWF     ANSEL         ; PORTA INPUTS = DIGITAL NOT ANALOG
   ;
   ; BAUD RATE SETTINGS
   ;
   ;  BAUD VALUES WITH BRGH = 0
   ;  ((20000000/9600)/64)-1 = 32
   ;    MOVLW     D'207'    ;  1200 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'103'          ;  2400 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'25'           ;  9600 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'12'           ; 19200 BAUD @ 16 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'255'          ;  1200 BAUD @ 20 MHZ FOSC +1.73 ERR
   ;    MOVLW     D'129'          ;  2400 BAUD @ 20 MHZ FOSC +0.16 ERR
   ;    MOVLW     D'32'          ;  9600 BAUD @ 20 MHZ FOSC -1.36 ERR
   ;    MOVLW     D'15'          ; 19200 BAUD @ 20 MHZ FOSC +1.73 ERR
  
   ;  BAUD VALUES WITH BRGH = 1
   ;  ((20000000/9600)/16)-1 = 32
   MOVLW     D'25'         ;  9600 BAUD @ 20 MHZ FOSC +0.16 ERR
   MOVWF     SPBRG
   MOVLW     B'00100100'    ; BRGH = 1
   MOVWF     TXSTA           ; ENABLE ASYNC TRANSMISSION, SET BRGH
   BANKSEL   RCSTA       ; BANK0
   MOVLW     B'10010000'
   MOVWF     RCSTA          ; ENABLE ASYNC RECEPTION
   MOVF RCREG,W          
   MOVF RCREG,W           ; FLUSH RECEIVE BUFFER


MAIN:
  ; Aca tu programa principal
   CALL TOMAR_DATOS
   CALL ENVIAR
   CALL MOSTRAR_DISPLAY
   CALL RECIBIR
   GOTO MAIN


TOMAR_DATOS:
    ; Aca toomo datos lo paso a BCD y guardo en variable
    RETURN

ENVIAR:
     BTFSS PIR1,TXIF
     RETURN
     ;Aca envio
     RETURN


;lo mismo para todo lo demas

     END


Incluso, no se por que seleccionar el oscilador interno a 4 Mhz pudiendolo hacer a 8Mhz, ademas 8Mhz da menos error a 9600 bauds, podes verlo en las tablas que hay en el datasheet del PIC.
Otra cosa que esta mal, cuando configura los baudios asume que esta a 20Mhz, pero segun como pusiste el OSCCON el reloj esta a 4Mhz.. lo cual es un valor incorrecto el cargado

Cabe aclarar que el codigo que pase no corregi nada de lo que dije antes.
« Última modificación: 27 de Enero de 2015, 10:23:08 por KILLERJC »


 

anything