viernes, 13 de mayo de 2011

Gráfico de señales eviadas por PIC16F877a en Hp50g

El siguiente programa consiste en:

1. Muestrear una señal analógica de 0 a 5 V con periodo de muestreo
    de 1 segundo por 1 minuto.
2. Convertir las muestras analógicas a digitales.
3. Enviar las muestras digitales a la calculadora HP50g. Transmisión en serie.
4. Convertir las muestras digitales a valores analógicos correspondientes 0-5 V.
5.Graficar la señal continua en tiempo discreto(cada segundo).

En el PIC16F877a

1. La señal analógica se muestrea y se digitaliza utilizando el módulo ADC.

       - Periodo de muestro=1 s
       - 8 bits/muestra

2. Al completarse 60 muestras se pasa a otra rutina de envio de datos por
    USART.

     - 9600 baudios
     - 8 bits de datos
     - 2 bit Stop
     - No paridad

3. Se enciende un Led por 0.5 s indicando transferencia completa.

4. En seguida se toman muestras nuevamente por 1 minuto.

En la calculadora HP50g 

1. Los datos se reciben en la HP50g en forma de cadena.

2. La cadena se separa en caracteres utilizando los comandos HEAD y TAIL.

3. Los caracteres se convierten a valores numéricos (0 - 255) utilizando el
    comando NUM.

4. Los números obtenidos se agrupan en una matríz 1x60.

5. Se convierten los valores digitales a los analógicos correspondientes (0- 5V).

6. Se genera una matríz [0 1 2 ... 59] 1x60 (base de tiempo).

7. La matríz de datos y la matríz base de tiempo forman una matríz 60x2 con los
    comandos AUGMENT y TRAN.

8. Se grafica las muestras (Dispersión) con el comando SCATTER.

9. Se unen los puntos graficados con líneas para un gráfico continuo con el
    comando LINE.


Esquema de circuito:



Programa para PIC16F877a en Pic Basic (Microcode)

'****************************************************************
'*  Name    : graficar_hp50g.BAS                                      *
'*  Author  : LONELY113                                         *
'*  Notice  : Copyright (c) 2011 LONELY113                      *
'*          : All Rights Reserved                               *
'*  Date    : 13/05/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   : PIC16F877a                                        *
'*          : 9600 baudios con cristal de 10 MHz                *
'*          : Pin RC6/Tx a pin RxD de Hp50g                     *
'*          : Pin GND de Hp50g a GND de circuito                *
'*          : Requiere adaptador de nivel 5V a 3.3V             *
'*          : Led en Pin RB4                                    *
'****************************************************************

@ __CONFIG _WDT_OFF & _PWRTE_OFF & _CP_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF

DEFINE OSC 10          ; 10 MHz

'Definiciones USART
DEFINE HSER_RCSTA 90h  ' Habilitar registro de recepción
DEFINE HSER_TXSTA 20h  ' Habilitar registro de trsnsmisión
DEFINE HSER_BAUD 9600  ' 9600 baudios

'Definiciones ADC
DEFINE ADC_BITS 8      ' Número de bits/muestra
DEFINE ADC_CLOCK 3     ' Fuente de reloj (RC=3)
DEFINE ADC_SAMPLEUS 50 ' Periodo de muestreo en us

TRISB.4=0              'Pin RB4 como salidai VAR BYTE
volt VAR BYTE          'Variable que almacena temporalmente una muestra
signal VAR BYTE[60]    'Variable que almacena 60 muestras
TRISA = 255            'Puerto A como entradas
ADCON1 = 2             'PORTA analógico
PAUSE 5000             'Retardo de 5 segundos

'Inicio de programa
loop1:
 FOR i=0 TO 59          
  ADCIN 0, volt         'Muestrea y guarda en volt
  signal[i]= volt       'signal almacena todas las muestras
  PAUSE 1000            'Muestrear cada segundo
 NEXT

 HSEROUT [STR signal \60] 'Enviar cadena por Tx
 PORTB.4=1                'Encender LED (envio completo)
 PAUSE 500
 PORTB.4=0                'Apagar LED
GOTO loop1
END

Programas para HP50g en UserRPL

Configurar puerto serie

 @Configuracion puerto serie
  <<
    9600 BAUD 0 PARITY
    -33 CF -78 SF
    CLOSEIO OPENIO 1 STIME
  >>

Graficar señal
<<
  {X1 X2 Y1 Y2 j1 j2 m n DATA} PURGE
  
 @Leer datos de Buffer
  BUFLEN
  DROP SRECV DROP 

 @guardar datos en matriz fila 
  DATA STO 
  DATA
  1 60
  FOR i
   DUP HEAD NUM SWAP TAIL
  NEXT
  DROP 60 ROW→ 

 @Convertir a niveles analogicos 0-5V
  255 / 5 *

 @Generar una matriz fila [0 1 2 ...59]
  1 60
  FOR i
   i 1 -
  NEXT 
  60 ROW→ 

 @Formar una matriz 60x2 datos y base de tiempo
  SWAP AUGMENT TRAN
  DUP 'DATA' STO 

 @Graficar muestras (dispersion) 
  ΣDAT STO
  ERASE SCATTER AUTO DRAX DRAW

 @Unir puntos (grafica continua)
  DATA SIZE {m n} STO
  1 m 1 -
  FOR j1
   j1 1 + 'j2' STO
   DATA {j1 1} GET 'X1' STO
   DATA {j1 2} GET 'Y1' STO
   DATA {j2 1} GET 'X2' STO
   DATA {j2 2} GET 'Y2' STO
   X1 Y1 R→C X2 Y2 R→C LINE
 NEXT
 PICTURE
{X1 X2 Y1 Y2 j1 j2 m n ΣDAT ΣPAR PPAR} PURGE
>>

Capturas en pantalla de Hp50g:



Programas *.BAS y HP UserRPL:
Descargar

No hay comentarios:

Publicar un comentario