Curso de programación de PIC en PICBasic Pro

Buenas; estoy haciendo un nuevo proyecto sencillo, que basicamente es una pequeña fuente de poder variable con monitor de tension y corriente (1 adc para leer corrient - 1 adc para leer tension - 1 adc para leer un pote que sera el encargado de controlar el pwm en segundo plano conectado a un simple filtro para generar e 0 a 5Vcc)...
NOKV10_1.JPG

Cuando arranque todo, estaba probando unas librerias nuevas del lcd N3310 y me ganaron por cansancio... las librerias estan en el foro oficial del compilador :rolleyes: , pero ese es ya otro tema que vere mas tarde si le dedico mas tiempo para entender, por que ni en el otro foro pueden entender por que hace un error raro; En fin, como estaba embalado como tren cargado, busque info y me tope con un topico donde intentan hacer un monitor de tension con caracterres gigantes....
no staba funcional el tema, asiq ue me puse a entender que hicieron, y donde estaba el problema... como lo solucione, pense que quizas a alguno le gustaria tener esta plantilla para hacer sus propios proyectos... aca va parte del programa:

Código:
DEFINE ADC_BITS 10 ; ADCIN    çözünürlük  (Bits)
DEFINE ADC_CLOCK 3 ; ADC  clock kaynagi  (Fosc/8)
DEFINE ADC_SAMPLEUS 50 ; ADC  örnekleme zamani (uSec)

CMCON=7

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

PORTA=0
PORTB=0
PORTC=0

VOLT    VAR  WORD
HVD     var  word
AMPER   var  word
MV      VAR  BYTE
MA      VAR BYTE

D_C      var     PORTB.0 
RST      VAR     PORTB.1      
SCK      var     PORTB.2
SDIN     var     PORTB.3
SCE      VAR     PORTB.4    
     
            
LcdReg          var  byte        
 x               var  byte
 y               var  byte
 z               var  byte
 a               var  byte
 PosX            var  byte
 PosY            var  byte
 Chr             var  byte
 LcdData         var  byte
 Offset          var  byte
 Char            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
                                           
                pause 100                 
                LcdReg  =  %00100001         'LCD Extended Commands.
                call    PrintCtrlLcd
                LcdReg  =  $C8               'Set LCD Vop (Contrast).Initial $c5
                call    PrintCtrlLcd
                LcdReg  =  %00000110         'Set Temp coefficent.
                call    PrintCtrlLcd
                LcdReg  =  %00010011         'LCD bias mode 1:48.
                call    PrintCtrlLcd
                LcdReg  =  %00100000         'LCD Standard Commands
                call    PrintCtrlLcd
                LcdReg  =  $0C               'LCD in normal mode.  $0D inverse
                call    PrintCtrlLcd   
                GOSUB InicializaLCD              
Call CursorHome               
Gosub LCD_Clear

;*********************************************
;*********************************************

INICIO:
LCDOUT $FE,1
CALL BORDER_LINE
;--------------------------------------------------------
;En esta seccion colocan la rutina de lectura adc 
;mas el acondicionamiento para imprimir en digitos
;--------------------------------------------------------
       GOSUB N3310    , subprograma de control del display
       GOTO INICIO       
;******************************************
;******************************************
  
N3310:
'~~~~~~~~~~~~ cursor display volt
                LcdReg  =  %10100000 + 17          ' cursor  X
               call    PrintCtrlLcd
                LcdReg  =  %01000010 +40           ' cursor  Y
                call    PrintCtrlLcd
; --------- digitos de la lectura volt 00,0v  osea "volt,milivolt"     
                Char = (VOLT dig 1)            
                call    PrintChar
                Char = (VOLT dig 0)           
                call    PrintChar
                Char = 12                         ; imprimimos el caracter ","
                call    PrintChar
                Char = (MV dig 0)                      
                call    PrintChar                
                ;Char = (MV dig 1)           
                ;call    PrintChar 
                Char = 14                     ;imprimimos el caracter "v"
                call    PrintChar
'~~~~~~~~~~~~~~~~~  cursor display amp
                LcdReg  =  %10100000 + 17           ' cursor  X
                call    PrintCtrlLcd
                LcdReg  =  %01000010 + 50           ' cursor  Y
                call    PrintCtrlLcd
'~~~~~~~~~~~~~~~~~ now display results    
                 Char = (amper dig 1)            
                 call    PrintChar
                 Char = (amper dig 0)           
                 call    PrintChar
                 Char = 12                                ; imprimimos el caracter ","
                 call    PrintChar
                 Char = (Ma dig 1)                      
                 call    PrintChar                
                 Char = 13                               ;imprimimos el caracter "a"
                 call    PrintChar                 
RETURN                

InicializaLCD:      
    D_C=1          ' Seleccionamos el registro de datos en RAM
    SCE=1         ' Anulamos la seleccion del chip
    pause 100         ' Hacemos una pausa de 100 ms
    gosub Reset_LCD   ' Reseteamos el LCD 
    return
               
Reset_LCD:
    RST=0   ' Damos un pulso de reset durante 100 ms  
    pause 100
    RST=1
    SCE=0
    RETURN
    
CursorHome:     
                  SCK = 1
                LcdReg  =  %10000000            ' cursor Home
                call    PrintCtrlLcd
                LcdReg  =  %01000000            ' cursor Home
                call    PrintCtrlLcd
                return

PrintChar:      
               offset = Char * 5          
            
                for a = 1 to 5                
                    read offset, LcdReg
                    call  PrintDataLcd
                    offset = offset + 1
                next a
                LcdReg = 0
                call    PrintDataLcd
                return
                                    
PrintCtrlLcd:   D_C = 0                            

PrintDataLcd:   
                   
                    for x = 1 to 8                
                    SDIN = LcdReg.7              
                    SCK = 1
                    LcdReg = LcdReg << 1
                    SCK = 0
                next x               
                D_C = 1
                
                return               
                
LCD_Clear:
                PosX=0:PosY=0:Gosub LCD_GotoXY
                D_C = 1
                FOR Chr=1 TO 252
                    LcdData=0:Gosub LCD_ByteOut
                    LcdData=0:Gosub LCD_ByteOut
                next Chr
                return

LCD_GotoXY:
                D_C = 0
                LcdData=%01000000 | PosY :Gosub LCD_ByteOut
                LcdData=%10000000 | PosX :Gosub LCD_ByteOut
                return

LCD_ByteOut:

                SHIFTOUT SDIN,SCK,1,[LcdData]
                
                return  

Border_line:
'~~~~~~~~~~~~~~~~~  RAND 0
                LcdReg  =  %10000000            ' cursor  X  
                call    PrintCtrlLcd
                LcdReg  =  %01000000            ' cursor  Y
                call    PrintCtrlLcd
        
    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] ,LcdReg       
               call    PrintDataLcd
    next y
'~~~~~~~~~~~~~~~~~  RAND 1                                
                LcdReg  =  %10000000            ' cursor  X  
                call    PrintCtrlLcd
                LcdReg  =  %01000001            ' cursor  Y
                call    PrintCtrlLcd
    
    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] ,LcdReg                                          
               call    PrintDataLcd
    next y 

'===================================  RAND 2
                LcdReg  =  %10000000            ' cursor  X  
                call    PrintCtrlLcd
                LcdReg  =  %01000010            ' cursor  Y
                call    PrintCtrlLcd  
                 
    LOokup 0, [$FF] , LcdReg 
                call    PrintDataLcd
               
                LcdReg  =  %10000000 + 83       ' cursor  X  
                call    PrintCtrlLcd
                LcdReg  =  %01000010            ' cursor  Y
                call    PrintCtrlLcd              
               
    LOokup 0, [$FF] , LcdReg 
                call    PrintDataLcd
'===================================  RAND 3
;                LcdReg  =  %10000000            ' cursor  X  
;                call    PrintCtrlLcd
;                LcdReg  =  %01000011            ' cursor  Y
;                call    PrintCtrlLcd
;              
;    LOokup 0, [$FF] , LcdReg 
;                call    PrintDataLcd
;                       
;                LcdReg  =  %10000000 + 48       ' cursor  X  
;                call    PrintCtrlLcd
;                LcdReg  =  %01000011            ' cursor  Y              
;               for y = 0 to 35                   
;   LOokup y, [$18,$38,$60,$60,$38,$18,_                                ' "VOLT"
;              $00,$30,$78,$48,$78,$30,_
;            $00,$78,$78,$40,$40,_
;          $00,$08,$08,$78,$78,$08,$08,$00,_
;            $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF] ,LcdReg
;           
;                call    PrintDataLcd
;                next y 
'===================================  RAND 4
                 
                LcdReg  =  %10000000            ' cursor  X  
                call    PrintCtrlLcd
                LcdReg  =  %01000100            ' cursor  Y
                call    PrintCtrlLcd

    LOokup 0, [$FF] , LcdReg 
                call    PrintDataLcd
               
                LcdReg  =  %10000000 + 83       ' cursor  X  
                call    PrintCtrlLcd
                LcdReg  =  %01000100            ' cursor  Y
                call    PrintCtrlLcd
    LOokup 0, [$FF] , LcdReg 
                call    PrintDataLcd
'===================================  JOS                
            LcdReg  =  %10000000            ' cursor  X  
                call    PrintCtrlLcd
                LcdReg  =  %01000101            ' cursor  Y
                call    PrintCtrlLcd
                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] ,LcdReg
                call    PrintDataLcd
                next y 

Return
'=======================================================================

End             'of program
;**********************************
;**********************************
 
Última edición:
No si alguien tiene algo de tiempo para ver una cosa....aca le sume una seccion para graficar la señal que entra por el puerto adc0; El tema esta en que como la señal puede ser sinuidal, pwm, diente de sierra, etc, etc; Por lo tanto, me va mostrar solo el valor en el momento justo en que lee la señal... a alguien se le ocurre alguna manera de tomar solo la tension maxima para que sea mas estable la lectura y no me muestre dos o mas valores? :unsure:


volt_grafico_pbp.JPG

Código:
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,_   'parte de arriba "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,_    ' parte de abajo"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
Por el momento, solo es una prueba para ver hasta donde puedo meer varias cosas, pero la idea es despues es hacerlo y optimizarlo un poco mas para leer frecuencias superiores a la actual (100Hz)... vamos a er si despues de solucionar el tema del voltimetro, puedo mejorarlo para leer frecuencias de hasta 2.5Khz :cool:

saludos
 
Última edición:
buenas; soy un aficionado a la electrónica y les pido ayuda con un contador de monedas de una sola denominación, específicamente lo que quiero hacer es que cuando el pic 16f876a por el puerto A4 deje de recibir los pulso de una barrera infrarroja detenga el motor de la tolva luego de haber trascurrido unos 5 segundos de la interrupción del tren de pulsos.
La programación lo hice con pic basic pro, intente utilizar Pulsin y count, pero el conteo de pulsos no inicia, el conteo lo realizo por interrupción y tmr0.
PD1: adjunto simulación en proteus y programación.
PD2: el foro esta excelente me ayudo mucho a aprender, utilice varios ejemplos de este foro para la programación de este proyecto gracias.
 

Adjuntos

  • Contadora de moneda lcd1.rar
    49.7 KB · Visitas: 70
roberttorres saludos, falta el circuito de proteus

Saludos Willyfv, si he adjuntado la simulación de proteus, lo he hecho en proteus 8.3 sp2, el cual genera un archivo con la extencion contador2.pdsprj.
pd1: creo que a partir de proteus 8 ya no genera el archivo DSN y si estoy equivocado por favor corrijanme.
PD2. adjunto imagen de circuito en proteus.

Edito:
Tenias Razon, no esta la simulacion en proteus, vuelvo a subir la programacion y la simulacion
 

Adjuntos

  • contador de monedas.jpg
    contador de monedas.jpg
    113 KB · Visitas: 55
  • Contadora de moneda lcd1.rar
    30.1 KB · Visitas: 34
Última edición:
Saludos @Willyfv, como soy nuevo en el foro y tengo pocos mensajes no puedo responder por el privado, entonces aquí te dejo la simulacion hecho en proteus 7.9
 

Adjuntos

  • Contadora de moneda lcd1.rar
    24.4 KB · Visitas: 41
roberttorres

¿Podrías explicar un poco el funcionamiento de cada pulsador y cómo debería trabajar?

Lo otro, es que al iniciar el circuito, el debería de contar de una vez.
 
Última edición por un moderador:
roberttorres

¿Podrías explicar un poco el funcionamiento de cada pulsador y cómo debería trabajar?

Lo otro, es que al iniciar el circuito, el debería de contar de una vez.

Ok, empiezo por el funcionamiento del circuito:
Los pulsadores de unidad, decena y centena sirve para contar una cantidad especifica de monedas, por ejemplo quiero 1 moneda entonces pulso una vez el botón unidad, si quiero 10 pulso decena y si quiero 100 monedas pulso centena y esa cantidad aparece en la pantalla lcd (obs.:al pulsar unidad, decena o centena el conteo de manera automática lo hace de manera descendente). al tener la cantidad de monedas que quiero pulso Start el conteo inicia de forma descendente hasta llegar a cero donde avisa de forma sonora y con un mensaje en pantalla que el conteo ha terminado, luego vuelve a cargar en pantalla la ultima cantidad de monedas a contar pudiendo realizar nuevamente el conteo. Para borrar la pantalla y el ultimo conteo se utiliza el boton clear .
La otra función del circuito es que al presionar start empieza el conteo de monedas de manera ascendente, este conteo lo realiza hasta contar todas las monedas que se encuentren en la tolva o hooper pudiendo detener el conteo con el boton stop.

Es en la segunda función del circuito que necesito ayuda, que al acabar las monedas en el hooper y no reciba los pulsos apague el motor del hooper o tolva.
he utilizado el comando pulsin y ha funcionado a medias, el circuito hace cosas raras

Pd: utilizo un hooper chino de tragamonedas que un amigo me regalo, el cual tiene una barrera infrarroja donde salen las monedas.
 
Cordial saludo alguien tiene información relevante en manejo de motores y comunicación usb.

Cordial saludo alguien tiene información relevante en manejo de motores y comunicación usb.

HTML:
este es un código que tengo para manejo de motor con encoder

'****************************************************************
'*  Name    : control motor con encoder                                      *
'*  Author  : open source                   *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/12/2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************


DEFINE OSC 20   

include "modedefs.bas"


  Lcounter     var   portB.4
  DC2          var   CCPR2L

  TLoop	     var   word  '

  ErrorC     var   word  ' 
  PGain	     var   word  '

  x	     var   word
  y	     var   word    ' 
  z	     var   word  

' 
' 
'

  LCurSpeed     var   word



  LeftReq	      var   word

  ' 

  dirLft	      var   word



    DC2=128	' 


 

    PR2 = $FF         
    T2CON = %00000100  
    CCP2CON = %1100   



    TRISB = %11111101 
    TRISC = %11111101  

   

    LeftReq=20  

    portb.1=1	

    dirLft=1	

'


    x=Lcounter     
    LCurSpeed=0

    TLoop=200      

   


    PGain=10       
   

loop:

  

for z=1 to TLoop
     pause 1			 
     if Lcounter = x then skip3  
     LCurSpeed=LCurSpeed+1	 
     x=Lcounter			

skip3:

next


    gosub adjLeft      
    LCurSpeed=0	
    x=Lcounter		

goto loop		




adjLeft:

  

    ErrorC=LeftReq-LCurSpeed   

     



    ErrorC=ErrorC*PGain
     
     if (abs(ErrorC) = ErrorC) then
          ErrorC=ErrorC/10         '
     else
          ErrorC=0-(abs(ErrorC)/10)
     endif
   

 

     if (dirLft) then	
	if (abs(DC2+ErrorC) <> (DC2+ErrorC)) then 
         	DC2=255
		return
	endif

	if(DC2+ErrorC) > 255 then
		DC2=255
		return
	endif

 	if (DC2+ErrorC) < 128 then	
		DC2=128
		return
	endif

	DC2=DC2+ErrorC

     endif

     if (dirLft=0) then	
	if (abs(DC2-ErrorC) <> (DC2-ErrorC)) then '
		DC2=0
		return
	endif

 	if (DC2-ErrorC) > 128 then	
		DC2=128
		return
	endif

	DC2=DC2-ErrorC			
     endif      
          
    return
    End

Cordial saludo alguien tiene información relevante en manejo de motores y comunicación usb.
 
Última edición:
Hola amigos, tanto tiempo sin aparecer por aqui... :D Les cuento que he comprado un modulo bluetooth HC05 y quiero controlar un pic desde una notebook con bluetooth usando un programa hecho en visual basic 6. les queria preguntar si conocen de alguna libreria disponible para visual basic que permita utilizar el modulo bluetooth que tiene integrado la notebook, ya que yo pense que con solo poner el numero de puerto que utiliza el bluetooth de la notebook se podria compilar el programa, pero no es asi jeje... les dejo un gran saludo a todos y les deseo un muy feliz año nuevo para todos... ;)(y)
 
Les cuento que he comprado un modulo bluetooth HC05 y quiero controlar un pic desde una notebook con bluetooth usando un programa hecho en visual basic 6.
Yo lo he hecho con un módulo Bluetooth Dongle que se conecta a un puerto USB.
De hecho es el mismo que uso para sincronizar B4A con el móvil para depurar programas en Android.
El módulo BlueTooth Radio crea un puerto COM y se puede usar como otro puerto serial, pero por Bluetooth.
Les Les quería preguntar si conocen de alguna librería disponible para Visual Basic que permita utilizar el modulo bluetooth que tiene integrado la notebook, ya que yo pensé que con sólo poner el número de puerto que utiliza el bluetooth de la notebook se podría compilar el programa, pero no es así.
Si existen librerías que sirven para controlar directamente el periférico Bluetooth, pero son de pago y no las he usado.
Una de ellas, es : WCL Developer.
 
Última edición:
Muy buena tarde, compañeros programadores.
Tengo una duda con mi proyecto de Pic Basic, puesto que debo de hacer lo siguiente:

1) Secuenciador de luces con rebote en el centro y orillas.
No obstante, no sé cómo hacer dicho rebote, sólo hago la secuencia. Ayuda por favor. :cry:

Es con el PIC16F887

Si necesitan el archivo, lo subo.
PHP:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 20/01/2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Define OSC 4 'Define el oscilador para un Cristal de 4MHZ.

TRISA = %11000000    'Configuración el Puerto A
TRISB = %00000000    'Configuración el Puerto B 
TRISC = %11000000    'Configuración el Puerto C 

PORTA = 0         'Inicializa el puerto "A" es decir, se ponen todos los pines en cero.
PORTB = 0         'Inicializa el puerto "B" 
PORTC = 0         'Inicializa el puerto "C"    

Inicio:           'Etiqueta de inicio del programa
      
 
PORTA = %00000001  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 1
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000010  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 1, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000100  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 1, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00001000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 1, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00010000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 1, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00100000  'RA0 = 0, RA1 = 0, RA2 = 1, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo
 
PORTB = %00000001  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 1
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000010  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 1, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000100  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 1, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00001000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 1, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00010000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 1, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00100000  'RB0 = 0, RB1 = 0, RB2 = 1, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %01000000  'RB0 = 0, RB1 = 1, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %10000000  'RB0 = 1, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000001  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 1
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo
      
PORTC = %00000010  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 1, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000100  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 1, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00001000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 1, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00010000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 1, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00100000  'RC0 = 0, RC1 = 0, RC2 = 1, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

GOTO Inicio       'Salta a la etiqueta "Inicio" y se repite el proceso.

END
 
Última edición por un moderador:
Muy buena tarde, compañeros programadores.
Tengo una duda con mi proyecto de Pic Basic, puesto que debo de hacer lo siguiente:

1) Secuenciador de luces con rebote en el centro y orillas.
No obstante, no sé cómo hacer dicho rebote, sólo hago la secuencia. Ayuda por favor. :cry:
No sé exactamente a qué te refieres con "rebote", me supongo que es retornar la secuencia.
Si te refieres a eso, se puede hacer con desplazamiento de bits.

Compila y ejecuta/simula el siguiente código para que veas lo que hace sobre los puertos A, B y C.
PHP:
@ Device PIC16F887    ; Microcontrolador utilizado
; Palabra de configuración:
@ Device INTRC_OSC_NOCLKOUT,WDT_OFF,PWRT_ON,LVP_OFF,FCMEN_OFF,IESO_OFF
Define OSC 4 ' Define el oscilador para una frecuencia de 4 MHz.   

Inicio:
    ANSEL = 0           ; Configura el Puerto A como digital I/O (AN0<>AN7) "Incluye el Puerto E"
    ANSELH = 0          ; Configura el Puerto B como digital I/O (AN8<>AN13)
    
    TRISA = 0           ' Configuración el Puerto A
    TRISB = 0           ' Configuración el Puerto B 
    TRISC = 0           ' Configuración el Puerto C 
    
    Symbol  LEDs_A = PORTA
    Symbol  LEDs_B = PORTB
    Symbol  LEDs_C = PORTC
    
    LEDs_B = 0          ' Inicializa el puerto B 
    LEDs_C = 0          ' Inicializa el puerto C
    LEDs_A = 1          ' Inicializa el puerto A
    Pause 200
    
    B0 Var Byte
    
Programa:
    LEDs_A = 1          ' Inicializa el puerto A
    For B0 = 1 To 7     ; Bucle de 7 ciclos.
        LEDs_A = LEDs_A << 1    ; Rotar un bit hacia la izquierda.
        Pause 200
    Next B0
    
    LEDs_A = 0
    LEDs_B = 1
    Pause 200
    
    For B0 = 1 To 7
        LEDs_B = LEDs_B << 1
        Pause 200
    Next B0
    
    LEDs_B = 0
    LEDs_C = 1
    Pause 200
    
    For B0 = 1 To 7
        LEDs_C = LEDs_C << 1
        Pause 200
    Next B0
    LEDs_C = 0

    LEDs_C = $80        ; Inicia el retorno. "Rebote"
    
    For B0 = 1 To 7
        LEDs_C = LEDs_C >> 1    ; Rotar un bit hacia la derecha.
        Pause 200
    Next B0
    
    LEDs_C = 0
    LEDs_B = $80
    Pause 200
    
    For B0 = 1 To 7
        LEDS_B = LEDs_B >> 1
        Pause 200
    Next B0
    
    LEDs_B = 0
    LEDs_A = $80
    Pause 200
    
    For B0 = 1 To 7
        LEDs_A = LEDs_A >> 1
        Pause 200
    Next B0
    
    GoTo Programa       ; Salta a la etiqueta "Programa" y se repite el proceso.

    End
 
D@kbytes, muchas gracias. Veré como logro seguir.
Como decía anteriormente, no sé mucho de programación, pero gracias.
 
Última edición por un moderador:
He intentado de arreglarlo Darkbytes, pero no lo he logrado.
He pasado lo hexadecimal a binario y a las salidas A lo configuré para que sólo emita pulsos por salidas: RA0-RA5
No obstante, no he logrado mi objetivo, puesto que debo de hacer que las primeras 10 salidas inicien la secuencia al mismo tiempo y que las últimas salidas inicien el conteo al lado opuesto para que cuando lleguen al centro retornen la secuencia y en cada extremo retorne de igual forma, pero no sé cómo poner dos secuencias simultaneas en el mismo programa.
Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 25/01/2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Define OSC 4 ' Define el oscilador para una frecuencia de 4 MHz.   

Inicio:
    ANSEL = 0           ; Configura el Puerto A como digital I/O (AN0<>AN7) "Incluye el Puerto E"
    ANSELH = 0          ; Configura el Puerto B como digital I/O (AN8<>AN13)
    
    TRISA = 0           ' Configuración el Puerto A
    TRISB = 0           ' Configuración el Puerto B 
    TRISC = 0           ' Configuración el Puerto C 
    
    Symbol  LEDs_A = PORTA
    Symbol  LEDs_B = PORTB
    Symbol  LEDs_C = PORTC
    
    LEDs_B = 0          ' Inicializa el puerto B 
    LEDs_C = 0          ' Inicializa el puerto C
    LEDs_A = 1          ' Inicializa el puerto A
    Pause 200
    
    B0 Var Byte
    
Programa:
    LEDs_A = 1          ' Inicializa el puerto A
    For B0 = 1 To 5     ; Bucle de 5 ciclos.
        LEDs_A = LEDs_A << 1    ; Rotar un bit hacia la izquierda.
        Pause 200
    Next B0
    
    LEDs_A = 0
    LEDs_B = 1
    Pause 200
    
    For B0 = 1 To 5
        LEDs_B = LEDs_B << 1
        Pause 200
    Next B0
    
   
    LEDs_B = 0
    LEDs_C = 1
    Pause 200
    
    For B0 = 1 To 7
        LEDs_C = LEDs_C << 1
        Pause 200
    Next B0
    LEDs_C = 0

    LEDs_C = %10000000        ; Inicia el retorno. "Rebote"
    
    For B0 = 1 To 7
        LEDs_C = LEDs_C >> 1    ; Rotar un bit hacia la derecha.
        Pause 200
    Next B0
    
    LEDs_C = 0
    LEDs_B = %10000000
    Pause 200
    
    For B0 = 1 To 7
        LEDS_B = LEDs_B >> 1
        Pause 200
    Next B0
    
    LEDs_B = 0
    LEDs_A = %00100000
    Pause 200
    
    For B0 = 1 To 5
        LEDs_A = LEDs_A >> 1
        Pause 200
    Next B0
       GoTo Programa  ; Salta a la etiqueta "Programa" y se repite el proceso.
        End
 
Última edición por un moderador:
Atrás
Arriba