Veamos si le gusta.... su voltimetro con un graficador de señal (no es un osciloscopio)

Let's see if you like .... your voltmeter with a graphing signal (not a oscilloscope)

Name:  volt_grafico_pbp.JPG
Views: 8020
Size:  34.6 KB

no esta funcional el 100%, pero quizas entre todos le podramos dar un poco de forma... asi como esta, hasta 100Hz lee y grafica... Tambien faltaria corregir la lectura en caso de señales sinuidales (SEN-COS) asi no da falsas lecturas

100% is not work, but perhaps among all We could give him a little way ... as well as this, to 100Hz graph ... also read and correct reading would fail if sinuidales signals (SEN-COS) so no giving false readings

Code:
DEFINE OSC 4
;**************** ADC chanel setting  ************************
DEFINE ADC_BITS 8   
;******************* DEGISKENLER  ********************
INTCON   = 0 
CMCON=7

ADCON1 = 0
;ADCON1=%10000010
TRISA=%00001111
TRISB=%00000000
TRISC=%00000000

PORTA=0
PORTB=0
PORTC=0
DEFINE LCD_DREG     PORTC      
DEFINE LCD_DBIT     4           
DEFINE LCD_EREG     PORTC       
DEFINE LCD_EBIT     1          
DEFINE LCD_RSREG    PORTC       
DEFINE LCD_RSBIT    0           
DEFINE LCD_LINES    2  
D_C      var     PORTB.0 
RST      VAR     PORTB.1      
SCK      var     PORTB.2
SDIN     var     PORTB.3
SCE      VAR     PORTB.4    

'Variables usadas por las rutinas del LCD
ascii       var byte
Grafico     var byte
valor_a     VAR BYTE
valor_b     var word
LCD_f       var word
Fuente      var byte
Fuente1     var byte
lcd_chr	    var	word
numero      VAR WORD
dato        var byte
PosX        var byte
PosY        var byte
X           var BYTE
Y           var byte
i           var BYTE
j           var BYTE
k           var BYTE
n           var byte
f           var byte
z           var BYTE    'No usar en otra parte, se usa en rutina "DibujaPunto"
Invertido   var bit
canal_a     var byte[70]
canal_b     var byte[70]
a var byte
Offset          var  byte
HAM var word
HAM2 VAR WORD
X1   VAR WORD
DUTY VAR BYTE
 Char            var  byte
VOLT    VAR  WORD
HVD     var  word
AMPER   var  word
MV      VAR  BYTE
MA      VAR BYTE

                    DATA @0,$3E,$51,$49,$45,$3E,_       ';// 0                   
                            $00,$42,$7F,$40,$00,_       ';// 1
                            $42,$61,$51,$49,$46,_       ';// 2
                            $21,$41,$45,$4B,$31,_       ';// 3
                            $18,$14,$12,$7F,$10,_       ';// 4
                            $27,$45,$45,$45,$39,_       ';// 5
                            $3C,$4A,$49,$49,$30,_       ';// 6
                            $01,$71,$09,$05,$03,_       ';// 7
                            $36,$49,$49,$49,$36,_       ';// 8
                            $06,$49,$49,$29,$1E,_       ';// 9
                            $08,$08,$3E,$08,$08,_       ';// +
                            $08,$08,$08,$08,$08,_       ';// -
                            $00,$60,$60,$00,$00,_       ';// .   
                            $7E,$11,$11,$11,$7E,_       ';// A
                            $1F,$20,$40,$20,$1F,_       ';// V
                            $7F,$09,$09,$09,$01        ';// F







Inicio:
    X=0
    Y=0
    Pause 100         ' Hacemos una pausa de 100 ms para estabilizar todo
    gosub InicializaLCD
    gosub ConfiguraLCD
    gosub borra_lcd
    gosub cursor_origen
ciclo:
LCDOUT $FE,1
    call  Border_line
    GOSUB  F_VOLT 
    gosub Pantalla 
    gosub muestreo
    gosub Pantalla
   
   ; GOSUB F_AMP   
    
    ;pause 100
    gosub borra_lcd
    
    goto ciclo

F_VOLT    

adcin 0 , valor_b
mv=(5*valor_b)*/255
volt=(5*valor_b)/255
mv=mv*10/2
 LCDOUT $FE,$02,"VOLT =",DEC VOLT,",",DEC1 MV
      gosub N3310
      RETURN

;F_AMP:     ;HESAPA:
 ;      HVD=(HAM+1)*/250
  ;     AMPER=HVD/100
   ;    MA=HVD//100
    ;   RETURN      
       
N3310:
'~~~~~~~~~~~~~~~~~ cursor display volt
                lcd_chr  =  %10100000 + 17          ' cursor  X
               call    lCD_cmd
                lcd_chr  =  %01000010 +40           ' cursor  Y
                call    lCD_cmd
'~~~~~~~~~~~~~~~~~ now display results    
                char = (VOLT dig 1) 
                ;call lcd_data           
                call    PrintChar
                char = (VOLT dig 0)           
                call    PrintChar
                ;call lcd_data
                char = 12                     
                ;call lcd_data
                call    PrintChar
                char = (MV dig 0)                      
                ;call lcd_data
                call    PrintChar                
                ;Char = (MV dig 1)           
                ;call    PrintChar 
                char = 14                     
                call    PrintChar
                ;call lcd_data
RETURN        
'***************************************************************
'Rutina para muestreo y almacenamiento de medición en RAM.
'***************************************************************
Muestreo:
    for i = 0 to 69                          		
        adcin 0, valor_a
        canal_a[i]= valor_a/8
        pause 20 		
    next i
    return
        
'***************************************************************
'Esta rutina muestra las dos señales en el LCD.
'***************************************************************
 
Pantalla:
    x=0
    for i = 0 to 69                       		
        y=canal_a[i] ;+5
        gosub Dibujapunto
        pause 1
        x = x+1        
    next i
    Return
    
'***************************************************************
'Esta rutina grafica un punto en la pantalla 
'siguiendo coordenadas X,Y (X:0-83; y:0-47).
'***************************************************************
DibujaPunto:
     if Y<=7 then                  
        z=7-Y
        dato = %00000001 << z  
        posy=5
    endif
    if Y>=8 AND Y<=15 then
        z=15-Y
        dato = %00000001 << z   
        posy=4
    endif
    if Y>=16 AND Y<=23 then
        posy=3
        z=23-Y
        dato = %00000001 << z
    endif  
    if Y>=24 and Y<=31 then
        posy=2
        z=31-Y
        dato = %00000001 << z
    endif    
    if Y>=32 AND Y<=39 then
        posy=1
        z=39-Y
        dato = %00000001 << z
    endif    
    if Y>=40 AND Y<=47 then
        posy=0
        z=47-Y
        dato = %00000001 << z
    endif    
    PosX = X
    gosub cursor_xy
    lcd_chr = dato
    gosub lcd_data
    return
 
'*******************************************************************************************    
'                           RUTINAS GESTION LCD NOKIA 3310
'*******************************************************************************************
 
'------------------------------------------------------------------------------------------- 
InicializaLCD:      
    D_C=1          ' Seleccionamos el registro de datos en RAM
    SCE=1         ' Anulamos la seleccion del chip
    ;Pin_VCC=1            ' Damos alimentacion al LCD 
    pause 100         ' Hacemos una pausa de 100 ms
    gosub Reset_LCD   ' Reseteamos el LCD 
    return
'------------------------------------------------------------------------------------------- 
'------------------------------------------------------------------------------------------- 
ConfiguraLCD:
    lcd_chr=%00100001 ' Chip Activo, Direccionamiento horizontal, uso de instrucciones extendidas
    gosub lCD_cmd
    lcd_chr=$B5       ' Configura el voltage de operacion del LCD (Contraste)
    gosub lCD_cmd
    lcd_chr=$13       ' Configura bias mux rate a 1:48
    gosub lCD_cmd
    lcd_chr=%00100000 ' Chip Activo, Direccionamiento horizontal,uso de instrucciones basicas
    gosub lCD_cmd
    gosub Segmentos_ON   ' Configura el display (Todos los segmentos ON)
    gosub Display_Normal ' Configura el display (modo Normal)
    gosub direccionamiento_vertical
    return
'------------------------------------------------------------------------------------------- 
'-------------------------------------------------------------------------------------------
Display_Blanco:
    lcd_chr=%00001000 ' Display Blanco    
    gosub lCD_cmd
    return
'------------------------------------------------------------------------------------------- 
'-------------------------------------------------------------------------------------------
Display_Inverso:
    lcd_chr=%00001101 ' Display Inverso    
    gosub lCD_cmd
    return
'------------------------------------------------------------------------------------------- 
'-------------------------------------------------------------------------------------------
Display_Normal:
    lcd_chr=%00001100 ' Display Normal   
    gosub lCD_cmd
    return
'------------------------------------------------------------------------------------------- 
'-------------------------------------------------------------------------------------------
Segmentos_ON:
    lcd_chr=%00001001 ' Segmentos ON  
    gosub lCD_cmd
    return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Direccionamiento_Vertical:
    lcd_chr=%00100010 ' Chip Activo, Direccionamiento Vertical,uso de instrucciones basicas
    gosub lCD_cmd
    return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Direccionamiento_Horizonal:
    lcd_chr=%00100000 ' Chip Activo, Direccionamiento Vertical,uso de instrucciones basicas
    gosub lCD_cmd
    return
'------------------------------------------------------------------------------------------- 
'-------------------------------------------------------------------------------------------
Borra_LCD:
    gosub Cursor_Origen  ' Colocamos el cursor en el origen
    for LCD_f=0 to 503       ' Recorremos todas las posiciones del LCD colocando ceros
        lcd_chr=0 
        gosub LCD_Data
    next LCD_f
    return
'------------------------------------------------------------------------------------------- 
'------------------------------------------------------------------------------------------- 
Cursor_Origen:        
    lcd_chr=%01000000 ' Ponemos la direccion Y a 0 (01000yyy)
    gosub lCD_cmd
    lcd_chr=%10000000 ' Ponemos la direccion X a 0 (1xxxxxxx)
    gosub lCD_cmd
    return
'------------------------------------------------------------------------------------------- 
'------------------------------------------------------------------------------------------- 
Cursor_XY:
    lcd_chr=%10000000 | PosX 
    Gosub lCD_cmd	  ' Envia Posicion X 
    lcd_chr=%01000000 | PosY 
    Gosub lCD_cmd	  ' Envia Posicion Y      
    return
'------------------------------------------------------------------------------------------- 
'------------------------------------------------------------------------------------------- 
Reset_LCD:
    RST=0   ' Damos un pulso de reset durante 100 ms  
    pause 100
    RST=1
    return
'-------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------- 
lCD_cmd: 
    D_C=0    ' Seleccionamos el registro de comandos
    goto Data_Out
'------------------------------------------------------------------------------------------- 
'------------------------------------------------------------------------------------------- 
LCD_Data:  
    D_C=1   ' Seleccionamos el registro de datos de RAM        
    if Invertido=1 then   ' Comprobamos si se invierte el dato para la representacion
        lcd_chr = lcd_chr ^ $FF
    endif
    goto Data_Out
'------------------------------------------------------------------------------------------- 
'------------------------------------------------------------------------------------------- 
Data_Out:
    SCE=0   ' Seleccionamos el chip del LCD
    SCK=0  ' Ponemos a cero la señal de reloj
    shiftout SDIN,SCK,1,[lcd_chr\8] 'Enviamos los datos en modo SPI
    SCE=1   ' Deseleccionamos el chip para liberar el bus
    return       
'------------------------------------------------------------------------------------------- 
PrintChar: 
               ;dato = %00000001
              offset = char * 5          
             for a = 1 to 5   
             ;lcd_chr=char             
            read offset, lcd_chr
           call  LCD_Data
          offset = offset + 1
         next a
         lcd_chr=char
 ;lcd_chr = 0
      call    LCD_Data
     return
'------------------------------------------------------------------------------------------- 
 Border_line:

'~~~~~~~~~~~~~~~~~  RAND 0
                lcd_chr  =  %10000000            ' cursor  X  
                call    lCD_cmd
                lcd_chr  =  %01000000            ' cursor  Y
                call    lCD_cmd
        
    for y = 0 to 83                   			         				          
    LOokup y, [$FF,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,_         ' UP-side "DIGITAL"
               $01,$01,$01,$F9,$F9,$F9,$09,$09,$F9,$F9,$F1,$01,_
               $01,$F9,$F9,$F9,$01,$01,$F1,$F9,$F9,$09,$09,$19,_
               $19,$11,$01,$01,$F9,$F9,$F9,$01,$09,$09,$09,$F9,$F9,$F9,_        
               $09,$09,$09,$01,$F1,$F9,$F9,$09,$09,$F9,$F9,$F1,$01,$01,_
	         $F9,$F9,$F9,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,_
	         $01,$01,$01,$01,$01,$FF] ,lcd_chr      
               call    LCD_Data
    next y
'~~~~~~~~~~~~~~~~~  RAND 1                                
                lcd_chr  =  %10000000            ' cursor  X  
                call    lCD_cmd
                lcd_chr  =  %01000001            ' cursor  Y
                call    lCD_cmd
    
    for y = 0 to 83                          				                   
    LOokup y, [$FF,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,_         ' DOWN-side "DIGITAL"
               $00,$00,$00,$1F,$1F,$1F,$10,$10,$1F,$1F,$0F,$00,$00,_
               $1F,$1F,$1F,$00,$00,$0F,$1F,$1F,$10,$11,$1F,$1F,_                      
               $0F,$00,$00,$1F,$1F,$1F,$00,$00,$00,$00,$1F,$1F,$1F,$00,_
	         $00,$00,$00,$1F,$1F,$1F,$01,$01,$1F,$1F,$1F,$00,$00,$1F,$1F,_
	         $1F,$10,$10,$10,$10,$00,$00,$00,$00,$00,$00,$00,_
	         $00,$00,$00,$00,$00,$FF] ,lcd_chr                                          
               call    LCD_Data
    next y 

'===================================  RAND 2
                lcd_chr  =  %10000000            ' cursor  X  
                call    lCD_cmd
                lcd_chr  =  %01000010            ' cursor  Y
                call    lCD_cmd  
                 
    LOokup 0, [$FF] , lcd_chr 
                call    LCD_Data
               
                lcd_chr  =  %10000000 + 83       ' cursor  X  
                call    lCD_cmd
                lcd_chr  =  %01000010            ' cursor  Y
                call    lCD_cmd             
               
    LOokup 0, [$FF] , lcd_chr 
                call    LCD_Data
'===================================  RAND 3

'===================================  RAND 4
                 
                lcd_chr  =  %10000000            ' cursor  X  
                call    lCD_cmd
                lcd_chr  =  %01000100            ' cursor  Y
                call    lCD_cmd

    LOokup 0, [$FF] , lcd_chr 
                call    LCD_Data
               
                lcd_chr  =  %10000000 + 83       ' cursor  X  
                call    lCD_cmd
                lcd_chr  =  %01000100            ' cursor  Y
                call    lCD_cmd
    LOokup 0, [$FF] , lcd_chr 
                call    LCD_Data
'===================================  JOS                
		    lcd_chr  =  %10000000            ' cursor  X  
                call    lCD_cmd
                lcd_chr  =  %01000101            ' cursor  Y
                call    lCD_cmd
                for y = 0 to 83                   
    LOokup y, [$FF,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,_             
	         $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,_          
	         $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,_          
	         $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,_          
	         $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,_          
		   $80,$80,$80,$80,$80,$80,$80,$80,$FF] ,lcd_chr
                call    LCD_Data
                next y 

Return
'=======================================================================
END
se que se puede optimizar aun mas, pero estoy parado en ver como puedo solucionar el tema de las lecturas que no son lineales

which I can be further optimized, but I stand to see how I solve the issue of non-linear readings