# Curso de programación de PIC en PICBasic Pro



## mecatrodatos (May 21, 2009)

Que tal amigos uno de los lenguajes mas facil para programar micros es el basic pro sin despreciar el C por lo que abierto este hilo para empezar a ejecutar programas sencillos hasta llegar a los mas complejos.

miren lo facil que es prender un led con un pic 16f84A :


```
@ device xt_osc  ; oscilador externo XT
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz

led var portb.0                       ; asignamos led a puerto RB0

inicio:

HIGH  led                               ;asigna  un 1 logico 
PAUSE 500                              ; tiempo de espera de 500mls
LOW  led                                ; apaga led
```

este es un ejemplo sencillo ire anexando el codigo fuente y su respectiva simulacion en proteus de todos los realizados en este hilo.


----------



## mecatrodatos (May 21, 2009)

aqui va un codigo sencillo todo comentado:



```
; encender un led conectado al pin 37 (RB4) del pic 16F877A durante 2.5 seg y 
;luego apagarlo 0.5 seg el proceso debe repetirse 4 veces luego el led debe 
;permanecer apagado.


                                
@ device xt_osc  ; oscilador externo XT
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
x var byte       ; crea la variable x y asigna un espacio de memoria
                 ; de o a 255
LED var portb.4   ; asigna el nombre de led a RB4 del pic 16f877A


programa:          ; inicio de la linea de programa 
for x=0 to 3       ; repetir 4 veces
high led           ;enciende led
pause 2500         ; esperar 2.5 seg
low led            ;apaga led 
pause 500          ; espera 0.5 seg
next               ; siguiente repeticion hasta que sea x=3
end                ; fin del programa
```


----------



## mecatrodatos (May 21, 2009)

;proyecto con leds 1


```
; encender 2 leds conectados a (RB0-RB1) del pic 16F877A alternadamente , es 
;decir un led esta encendido mientras el otro esta apagado y viceversa los 
;tiempos de transicion son de 700mls entre encendido y apagado el proceso 
;debe continuar indefinidamentedurante.

                                
@ device xt_osc  ; oscilador externo XT
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
x var byte       ; crea la variable x y asigna un espacio de memoria
                 ; de o a 255
LED1 var portb.0   ; asigna el nombre de led1 a RB0 del pic 16f877A
LED2 VAR portb.1   ; asigna el nombre de led2 a RB1

programa:          ; inicio de la linea de programa 

high led1:low led2   ;enciende led1 y apaga led 2
pause 700           ; esperar 0.7 seg
low led1:high led2  ;apaga led1 y enciende led2 
pause 700          ; espera 0.7 seg
goto programa       ; ir a programa
end                ; fin del programa
```


----------



## mecatrodatos (May 21, 2009)

;LUEGO DE LAS LUCES DE DISCOTECA ENCIENDA LOS LEDS DEL MEDIO HACIA LOS EXTREMOS
;CON UN TIEMPO DE 200mseg


```
;  leds=leds<<1    EQUIVALE A MULTIPLICAR POR DOS Y DESPLAZARSE UNO A UNO
;  leds=leds<<2    EQUIVALE A MULTIPLICAR POR CUATRO Y DESPLAZARSE DE DOS EN DOS
;  leds=leds>>1    EQUIVALE A DIVIDIR  POR DOS Y DESPLAZARSE UNO A UNO HACIA LA
;                  DERECHA.  
                                
@ device xt_osc  ; oscilador externo XT
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
x var byte       ; crea la variable x y asigna un espacio de memoria
                 ; de o a 255
LEDS var PORTB     ; asigna el nombre de leds a todo el puerto B del pic 16f877A
LED0 var portb.0   ; asigna el nombre de led1 a RB0 del pic 16f877A
LED1 VAR portb.1   ; asigna el nombre de led2 a RB1
LED2 VAR portb.2
LED3 VAR portb.3
LED4 VAR portb.4
LED5 VAR portb.5
LED6 VAR portb.6
LED7 VAR portb.7
TRISB=0          ; hacemos salidas a todo el puerto b
leds=1           ; cargamos el puerto b con 1 (%00000001)

programa:             ; inicio de la linea de programa 
for x=0 to 6       ; repetir 7 veces
LEDS=LEDS<<1          ;desplaza uno a uno a la left
GOSUB TIEMPO             ; esperar 0.2 seg

next                  ; siguiente repeticion hasta que sea x=6
for x=0 to 6        ; repetir 7 veces
LEDS=LEDS>>1           ; desplaza uno a uno a la right 
pause 200              ; esperar 0.2 seg
next     

high led3:HIGH LED4:LOW LED0:LOW LED7
GOSUB TIEMPO
LOW LED3:LOW LED4:HIGH LED2:HIGH LED5
GOSUB TIEMPO 
LOW LED2:LOW LED5:HIGH LED1:HIGH LED6
GOSUB TIEMPO
LOW LED1:LOW LED6:HIGH LED0:HIGH LED7
GOSUB TIEMPO

GOTO PROGRAMA

TIEMPO:
PAUSE 200
RETURN

end                    ; fin del programa
```


----------



## mecatrodatos (May 21, 2009)

;Generar 6 parpadeos de un led con intervalos de 300mls, luego dos parpadeos de 
;un segundo con otro led, despues los dos leds parpadean tres veces, el proceso 
;se repite indefinidamente


```
define OSC 4          ;especifica al PBP que se va ha utilizar
                       ;un cristal de 4 Mhz.
@ device XT_OSC        ;oscilador externo para programacion.
x var byte      ; crea la variable x y asigna un espacio de memoria
                 ; de o a 255

led1 var portb.0       ;etiqueta asignada al pin 2 del pic 16f877A
led2 var portb.1       ;etiqueta asignada al pin 3 del pic 16f877A
 
programa:             ; inicio de la linea de programa 

for x=0 to 5
high led1
gosub tiempo
low led1
gosub tiempo
next
 
for x=0 to 1 
high led2
gosub tiempo1
low led2
gosub tiempo1
next

for x=0 to 2           ; repetir 3 veces
high led1:high led2    ;enciende leds
gosub tiempo           ; ir a rutina tiempo
low led1: low led2     ;apaga leds
gosub tiempo           ; ir a rutina tiempo
next                   ; siguiente repeticion hasta que sea x=3
goto programa 

tiempo:
pause 300
return

tiempo1:
pause 1000
return
end                    ; fin del programa
```


----------



## mecatrodatos (May 23, 2009)

que tal este tipo de programa denominado microcodestudio da lo opcion de desarrollar varias formar un programa a continuacion te muestro las varias formar de escribir un programa y realizar el mismo trabajo final.

el ejercicio consiste en hacer parpadear un led con intervalos de dos segundos  por el RB0  del pic 16f877a:


```
led var portb.0 ; asignamos led a puerto RB0 

inicio: 

HIGH led ;asigna un 1 logico 
PAUSE 2000 ; tiempo de espera de 2s 
LOW led ; apaga led    puedes aqui utilizar el comandoTOGGLE que es invertir la seleccion del comando anterior a PAUSE 
PAUSE 2000 ; tiempo de espera de 2s 
GOTO inicio ; crea un bucle cerrado
```

En el siguiente caso manegaremos todo el puerto B del pic 16f877a como salidas pero solo utililizaremos RB0, es importante incluir al principio del programa o programs a realizar siempre los siguientes comandos para la posterior programacion del pic :

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

una vez realizado esto dedemos incluir trisb=0 o trisb=%0 ya que sin esto no funcionan los manejos de los puertos se debe entender que portb=%00000010 encender unicamente el el puerto RB1 


para una mejor explicacion:

portb= %   1     0     0    1      1     0    1     0
                RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 

esto indica encender del puerto b (7,4,3,1)  para todos los demas permanecer en cero logico es decir apagados , este es muy util en caso de encender un grupo de leds.

listo vamos con el programa 


```
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

trisb=0   ;puerto b como salidas 

inicio:

Portb=%00000001 ;controla todo el puerto pero solo enciende RBO 
PAUSE 2000 ; tiempo de espera de 2s 
Portb=%0000000 ;apaga todos los pines del puerto B
PAUSE 2000 ; tiempo de espera de 2s 
GOTO inicio ; crea un bucle cerrado 

aqui hay otra forma se manejan solo un pin a la vez del puerto y no todos a la vez como en el ejemplo anterior

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

trisb=0   ;puerto b como salidas 

inicio:

Portb.0=1 ; enciende RBO 
PAUSE 2000 ; tiempo de espera de 2s 
Portb.0=0 ;apaga RB0
PAUSE 2000 ; tiempo de espera de 2s 
GOTO inicio ; crea un bucle cerrado
```


todo ello gracia a que este compilador reconoce basees numerales en deciamal, binario y exagesima:


10 es igual a       %1010 (binario)               $A  exagesimal 

siempre debe se debe utilizar los prefijos % para escribir un numeo en biario y $ para exagecimal ya que sin ello el PBP o compilador no lo reconoce .

Espero te halla servido mi explicacion si deeas puedes modificar el programa de manejo de puertoB y encender cualquier tipo de pines de este ubicando leds  a sus salidas.


----------



## mecatrodatos (May 24, 2009)

bien empezaremos con proyectos con leds:


```
;proyecto con leds 1

; encender un led conectado al pin 37 (RB4) del pic 16F877A durante 2.5 seg y 
;luego apagarlo 0.5 seg el proceso debe repetirse 4 veces luego el led debe 
;permanecer apagado.


                                
@ device xt_osc  ; oscilador externo XT
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
x var byte       ; crea la variable x y asigna un espacio de memoria
                 ; de o a 255
LED var portb.4   ; asigna el nombre de led a RB4 del pic 16f877A


programa:          ; inicio de la linea de programa 
for x=0 to 3       ; repetir 4 veces
high led           ;enciende led
pause 2500         ; esperar 2.5 seg
low led            ;apaga led 
pause 500          ; espera 0.5 seg
next               ; siguiente repeticion hasta que sea x=3
end                ; fin del programa
```


----------



## mecatrodatos (May 24, 2009)

;proyecto con leds 2


```
; encender 2 leds conectados a (RB0-RB1) del pic 16F877A alternadamente , es 
;decir un led esta encendido mientras el otro esta apagado y viceversa los 
;tiempos de transicion son de 700mls entre encendido y apagado el proceso 
;debe continuar indefinidamentedurante.

                                
@ device xt_osc  ; oscilador externo XT
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
x var byte       ; crea la variable x y asigna un espacio de memoria
                 ; de o a 255
LED1 var portb.0   ; asigna el nombre de led1 a RB0 del pic 16f877A
LED2 VAR portb.1   ; asigna el nombre de led2 a RB1

programa:          ; inicio de la linea de programa 

high led1:low led2   ;enciende led1 y apaga led 2
pause 700           ; esperar 0.7 seg
low led1:high led2  ;apaga led1 y enciende led2 
pause 700          ; espera 0.7 seg
goto programa       ; ir a programa
end                ; fin del programa
```


----------



## mecatrodatos (May 24, 2009)

;proyecto 3

;con este proyecto se pretende faimilarizarse mas con el manejo de los puertos, esta vez vamos a utilizar las 8 salidas del puesro b del pic 16f877A, se  trata de una secuencia de luces que deben encenderse de izquierda a derechauna tras otra con imtervalos de tiempo de 200mls, luegos se encenderan las luces del medio hacia los extremos con intervalos de  200mseg



```
;  leds=leds<<1    EQUIVALE A MULTIPLICAR POR DOS Y DESPLAZARSE UNO A UNO
;  leds=leds<<2    EQUIVALE A MULTIPLICAR POR CUATRO Y DESPLAZARSE DE DOS EN DOS
;  leds=leds>>1    EQUIVALE A DIVIDIR  POR DOS Y DESPLAZARSE UNO A UNO HACIA LA
;                  DERECHA.  
                                
@ device xt_osc  ; oscilador externo XT
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
x var byte       ; crea la variable x y asigna un espacio de memoria
                 ; de o a 255
LEDS var PORTB     ; asigna el nombre de leds a todo el puerto B del pic 16f877A
LED0 var portb.0   ; asigna el nombre de led1 a RB0 del pic 16f877A
LED1 VAR portb.1   ; asigna el nombre de led2 a RB1
LED2 VAR portb.2
LED3 VAR portb.3
LED4 VAR portb.4
LED5 VAR portb.5
LED6 VAR portb.6
LED7 VAR portb.7
TRISB=0          ; hacemos salidas a todo el puerto b
leds=1           ; cargamos el puerto b con 1 (%00000001)

programa:             ; inicio de la linea de programa 
for x=0 to 6       ; repetir 7 veces
LEDS=LEDS<<1          ;desplaza uno a uno a la left
GOSUB TIEMPO             ; esperar 0.2 seg

next                  ; siguiente repeticion hasta que sea x=6
for x=0 to 6        ; repetir 7 veces
LEDS=LEDS>>1           ; desplaza uno a uno a la right 
pause 200              ; esperar 0.2 seg
next     

high led3:HIGH LED4:LOW LED0:LOW LED7
GOSUB TIEMPO
LOW LED3:LOW LED4:HIGH LED2:HIGH LED5
GOSUB TIEMPO 
LOW LED2:LOW LED5:HIGH LED1:HIGH LED6
GOSUB TIEMPO
LOW LED1:LOW LED6:HIGH LED0:HIGH LED7
GOSUB TIEMPO

GOTO PROGRAMA

TIEMPO:
PAUSE 200
RETURN

end                    ; fin del programa
```


----------



## mecatrodatos (May 24, 2009)

vamos con mas

proyecto con pulsadores

proyecto1:


```
; leer el estado de un pulsador ubicado el RB0 del pic 16f877A en donde una vez 
;accionado se enciende un led ubicado en RB1 del mismo pic 

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

inicio
if portb.0=0 then encender   ; pregunta si se acciono el pulsador ir a encender
goto inicio                   ; crea un bucle cerrado

encender:                    ;rutina encender
high portb.1                 ; enciende led ubicado en este pin 
pause 500                    ;espera 500mls
toggle portb.1                ; apaga led
pause 500
goto inicio                   ;ir a inicio

end                            ;fin del programa
```


----------



## mecatrodatos (May 24, 2009)

Proyecto2 pulsadores 



```
;Proyecto con 2 pulsadores y 3 leds ; cuando es accionado P1(primer pulsador) se 
;enciende un led ubicado en RB2 durante un segundo,lo mismo pasa si se acciona 
;P2 con otro led ubicado en RB3 , pero si son accionados al mismo tiempo un 
;tercer led (RB4)parpadeara 5 veces duante 300mls se uitliza pic 16F877A.

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

;configuracion de pines 

led1 var portb.2               ;ubicacion del primer LED en RB2 del pic 16F877A 
led2 var portb.3               ;""""                        RB3
led3 var portb.4                ;""""""""""""""""""""       RB4
p1 var portb.0                  ;"""""""del primer pulsador RB0 """"""""""""
p2 var portb.1                  ;"""""""segundo pulsador   RB1
x var byte                      ;variable x con capacidad de 255


; lectura de pulsadores
inicio
if p1=0 then encender   ; pregunta si se acciono el pulsador 1 ir a encender
PAUSE 200
if p2=0 then encender1  ;  """ pulsadodor2 ir a encender 1
PAUSE 200
if (p1=0) AND (p2=0) then encender2  ; """"pulsador1 y pulsador2 ir a encender2
PAUSE 200
goto inicio                   ; crea un bucle cerrado


encender:                    ;rutina encender
high led1                 ; enciende led 
pause 1000                   ;espera 1seg
toggle led1                ; apaga led
pause 1000
goto inicio                   ;ir a inicio

encender1:
high led2                 ; enciende led 
pause 1000                   ;espera 1seg
toggle led2                ; apaga led
pause 1000
goto inicio 

encender2:
for x=0 TO 4           ; repite cinco veces 
high led3                ; enciende led 
pause 300                   ;espera 300mls
low led3                ; apaga led utilice comando low que cumple la misma 
                         ;funcion que toggle que cambia la configuracion
                         ;de un bit es decir si esta en ALTO LO PASA A BAJO
                         ;y viceversa
pause 300
NEXT                   ; SIGUIENTE HASTA QUE SE REPITE 5 VECES
goto inicio 
end                            ;fin del programa
```


----------



## mecatrodatos (May 25, 2009)

vamos con proyectos con display 

proyecto 1 displays


```
; proyecto con display
 
 ;contador de 0 a 9 con pic 16f877A y dispaly de anodo comun se utiliza puertoB
 ;para mostrar el conteo  


@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
Cnt VAR Byte   ; variable de conteo 
Pattern VAR Byte  ; variablle de alamcanamiento


TRISB = 0              ;PORTB ES SALIDA 
LOOP:                  ; INICIO DEL PROGRAMA 
Cnt = 0                ; carga Cnt con cero
NXT:GOSUB CONVERT      ; ir a conversion
PORTB = Pattern        ; envia al puerto B lo que esta en la variable pattern
Cnt = Cnt + 1         ; Increment count
PAUSE 1000            ;espera 1 segundo
IF CNT = 10 THEN LOOP  ;prefunta si ha llegado a diez ir a inicio de programa  
GOTO NXT               ;ir a NXT
CONVERT:               ; rutina de conversion 
LOOKUP Cnt, [$3F, $06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F], Pattern ; inicia
;conversion y lo guarda en pattern
Pattern = Pattern ^ $FF ;invierte los bit de la variable pattern
RETURN                   ; retorna el gosub que lo llamo 
END                        ;fin del programa
```


----------



## mecatrodatos (May 25, 2009)

bueno ahora vamos con un proyecto interesante un contador de un solo dito pero con CI7447 y un pulsador integrado que a trves de este realizamos el conteo


```
;contador decimal de un digito con pic 16f877A ,c.i 7447 y pulsador  


@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz

TRISB=%11110000             ;hace salidas los bit de menos valor del puertoB 
NUMERO VAR BYTE
PULSADOR VAR PORTB.4

INICIO:
numero=0                     ; carga la variable numero con cero

display:
portb=numero                      ;muestra en portb el contenido de numero
if pulsador=0 then aumentar       ; preunta si el pulsador a sido activado
goto display

aumentar:
if pulsador=0 then aumentar         ;rutina para estabilizar tecla 
pause 300
if numero=9 then inicio             ; pregunta si ha llegado a nueve 
numero =numero+1
goto display                        ; suma uno a la variable numero y guarda el
                                     ;resultado en al misam variable
end
```


----------



## mecatrodatos (May 25, 2009)

proyecto 3


```
;proyecto display 

;programa que presenta la palabra HOLA en 4 displays PIC16f84A con 
;desplazamiento de derecha a izquierda.

                                
@ device xt_osc  ; oscilador externo XT
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz

trisb=0                      ;puerto b como salidas
trisa=0                      ;puerto a como salidas
x var byte                   ;variable con capacidad de 255

texto:
for x=1 to 20                 ; repeticiones de este segmento
porta=14:portb=8             ;formación de la letra A en el display
GOSUB TIEMPO                 ; ir a rutina tiempo
porta=13:portb=71            ;forma la letra L
gosub tiempo                 ; ir a rutina tiempo
porta=11:portb=64            ;forma la letra O
gosub tiempo                  ; ir a rutina tiempo
porta=7:portb=9               ;forma la letra H
gosub tiempo                   ; ir a rutina tiempo
next                          ; siguiente repetición

for x=1 to 20
porta=14:portb=127            ;apaga el display
GOSUB TIEMPO                   ; ir a rutina tiempo
porta=13:portb=8              ;forma la letra A
gosub tiempo                  ; ir a rutina tiempo
porta=11:portb=71             ;forma la letra L
gosub tiempo                  ; ir a rutina tiempo
porta=7:portb=64               ;forma la letra O
gosub tiempo                  ; ir a rutina tiempo
next

for x=1 to 20
porta=14:portb=9               ;forma la letra H
GOSUB TIEMPO                   ; ir a rutina tiempo
porta=13:portb=127             ;apaga el display
gosub tiempo
porta=11:portb=8                ;forma la letra A
gosub tiempo
porta=7:portb=71                ;forma la letra L
gosub tiempo
next

for x=1 to 20
porta=14:portb=64            ;forma la letra O
GOSUB TIEMPO
porta=13:portb=9              ;forma la letra H
gosub tiempo
porta=11:portb=127             ;apaga el display
gosub tiempo
porta=7:portb=8                 ;forma la letra A
gosub tiempo
next

for x=1 to 20                   ;forma la letra L
porta=14:portb=71
GOSUB TIEMPO
porta=13:portb=64                ;forma la letra O
gosub tiempo
porta=11:portb=9                ;forma la letra H
gosub tiempo
porta=7:portb=127               ;apaga el display
gosub tiempo
next
goto texto                      ;IR A TEXTO

TIEMPO:
PAUSE 5                        ;espera5mls
RETURN                         ;retorna al gosub que la llamo 
end                             ;fin del programa
```
con este programa se aprende a utilizar el multiplexado para manejar varios displays


----------



## mecatrodatos (May 27, 2009)

proyectos lcd:

los LCD son utilizados para mostrar mensajes que indican la consecusion de un proceso en forma visual , instrucciones de manejo , mostrar valores , en si permiten la comunicacion entre maquinas y humanos pudiendo mostrar cualquier caracter ASCII.

El LCD mas conicido es el de 2x16,  dos  lineas y 16 caracteres cada una que son los que vemos porque en realidad son 40 caracteres cuestion que comprobaremos mas adelente.


Descripción de pines: 

PIN Nº     SIMBOLO DESCRIPCION 
1             Vss Tierra de alimentación GND 
2             Vdd Alimentación de +5V CC 
3             Vo Contraste del cristal liquido. ( 0 a +5V ) 
4             RS Selección del registro de control/registro de datos: 
               RS=0 Selección registro de control
               RS=1 Selección registro de datos

5              R/W Señal de lectura/escritura:
                R/W=0 Escritura (Write)
                R/W=1 Lectura (Read)

6             E Habilitación del modulo:
               E=0 Módulo desconectado
               E=1 Módulo conectado

7-14 D0-D7 Bus de datos bidireccional. 


la declaracio LCDOUT en el compilador PBP sirve para mostrar items en el LCD seguidos de algunos de los siguientes comandos:

LCD commands
Command Operation
$FE, 1 Clear display
$FE, 2 Home cursor
$FE, $0C Cursor off
$FE, $0E Underline cursor on
$FE, $0F Blinking cursor on
$FE, $10 Move cursor left by one position
$FE, $14 Move cursor right by one position
$FE, $80 Move cursor to the beginning of first row
$FE, $C0 Move cursor to the beginning of second row
$FE, $94 Move cursor to the beginning of third row
$FE, $D4 Move cursor to the beginning of fourth row

estamos listos para nuestros primeros pasos con manejo de LDC


----------



## mecatrodatos (May 27, 2009)

bueno vamos con el primer proyecto de ldc un contador:


```
; proyecto con LCD y pic 16f84A en donde se muestra la consecucion de un conteo 
; de 0 a la variable cont con capacidad de 65535

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
' Define registros y bits del LCD
Define	LCD_DREG	PORTB
Define	LCD_DBIT	0
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	4
Define	LCD_EREG	PORTB
Define	LCD_EBIT	5

'
' DEFINIciones
'
Cnt VAR Word ' variables cont con capacitas de 8 bytescapacidad de 
              ;almacenamiento de 65535 
'
' inicio del programa 
'

TRISB = 0       ' PORTB es salida
PAUSE 500       ' retardo para inicializar el LCD
Cnt = 0         ' limpia contador  y lo coloca a cero
LCDOUT $FE,1    ' limpia LCD 

RPT:                      ; rutina de conteo
LCDOUT $FE,2             ' inicio del cursor LCD
LCDOUT "CNT = ", DEC Cnt ' muestra en el display cnt y su conteo en decimal             
PAUSE 1000                ' espera un segundo
Cnt = Cnt +1          ' Incrementa contador en uno y guarda el resultado en CNT
GOTO RPT              ' crea un bucle cerrado
END                   ' fin del programa
```
luego anexo simulacion
[/img]


----------



## mecatrodatos (May 30, 2009)

Que tal vamos con el segundo proyecto con LCD propuesto por nuestro amigo mot1258 en este proyecto anexo la simulacion del primero de lCD ya que utilice los mismos pines para el manejo del LDC por el puerto b anexandole entradas como se comenta en el programa:




```
;PROYECTO 2 CON LCD

;EL PRESENTE PROYECTO TIENE COMO FUNCION LA UTILIZACION DE LAS INTERRUPCIONES
;DEL PIC16F84A PARA REALIZACION DE UN CRONOMETRO CALIBRADO A 5 MINUTOS EN DONDE 
;POR MEDIO DEL BOTON START SE INICIA EL CONTEO Y ACTIVA UNA SEÑAL A UNO LOGICO 
;DURANTE EL TIEMPO DE ACTIVACION O DE CONTEO , PERO SI ES INTERRUMPIDA LA SEÑAL 
;POR EL BOTON DE STOP SE DETENIENE EL CONTEO Y SE PONE LA SALIDA A CERO LOGICO 
;PODEMOS REINICIAR EL SISTEMA CON EL BOTON CLEAR PARA VOLVER A EMPEZAR 
;DESDE 00:00 EL CONTEO HASTA LOS 5 MINUTOS , UNA VEZ CULMINADO EL TIEMPO DE 
;ACTIVACION TOTAL SE PULSA STOP Y POSTERIORMENTE START PARA VOVER A REALIZAR 
;EL CONTEO. 

; CONFIGURACION PARA LA PROGRAMACION DEL PIC   
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

' Define registros y bits del LCD

Define	LCD_DREG	PORTB
Define	LCD_DBIT	0
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	4
Define	LCD_EREG	PORTB
Define	LCD_EBIT	5

;variables de pines conctados al pic 16f84A

Symbol START_button = PORTA.0           
Symbol CLEAR_button = PORTA.2           
Symbol STOP_button = PORTA.1             
Symbol LED = PORTA.3 

;variables de almacenamiento  de datos
           
Ticks VAR byte                           
Minute VAR byte                         
Second VAR byte                       
Disp VAR byte                         
TRISA = 15 ; PORTA 0,1,2,3 son entradas
TRISB = 0 ; portb es salida

PAUSE 500 ;0.5 seg para inicializar lcd

;limpieza de variables creadas

Minute = 0 
Second = 0 
Ticks = 0 
Disp = 1 ; mustra en el LCD 00:00 al iniciar

OPTION_REG = $05               ;  prescaler = 64
ON INTERRUPT GOTO ISR          ; ir a rutina ISR 
LCDOUT $FE, 1        


LOOP:

IF CLEAR_button = 0 THEN

Minute = 0
Second = 0
Ticks = 0
led= 0
Disp = 1
goto loop
ENDIF

IF START_button = 0 THEN
high led
TMR0 = 0 ;inicializa registro TRMO
INTCON = $A0 ; habilita tiempo de interuupcion
Disp = 1 ; habilita LCD
ENDIF


IF STOP_button = 0 THEN
low led
INTCON = 0 ; desabilita tiempo de interrupcion
Disp = 1 
ENDIF

IF Disp = 1 THEN
LCDOUT $FE, 2
LCDOUT DEC2 Minute, ":",DEC2 Second
Disp = 0
ENDIF
GOTO LOOP            


DISABLE
ISR:
Ticks = Ticks + 1
IF Ticks < 61 THEN NoUpdate
Ticks = 0
Second = Second + 1
IF Second = 60 THEN
Second = 0
Minute = Minute + 1
IF Minute = 5 THEN
Minute = 0
led=0
ENDIF
ENDIF

Disp = 1

NoUpdate:
INTCON.2 = 0 ;rehabilitainterrupciones del TRMO
Resume
ENABLE ; 
END
END ; Fin del programa
```


----------



## mecatrodatos (May 31, 2009)

Como vamos espero que bien en esta oportunidad como comente al inicio del curso proyectos sencillos hasta llegar a proyectos complejos por lo tanto nuestro tercer proyecto de ldc les traigo un reloj digital:

Cabe anotar que utilizamos algunas de los rutinas de nuestro proyecto anterior aplicando el esquematico y la configuracion de pines para enviar los datos del pic al LCD la comunicacion en estos proyectos se ha realizado a 4 bits; como en todos los realizados anexo simualcion en proteus, codigo fuente en basic pro  y .hex



```
; PROYECTO 3 CON LCD

; EL SIGUIENTE PROYECTO ES UN RELOJ DIGITAL CON PIC 16F84A, LDC Y BOTONES PARA 
; AJUSTE DE HORAS Y MINUTOS

 ; CONFIGURACION PARA LA PROGRAMACION DEL PIC   
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

' Define registros y bits del LCD

Define	LCD_DREG	PORTB
Define	LCD_DBIT	0
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	4
Define	LCD_EREG	PORTB
Define	LCD_EBIT	5


;CONFIGURACION DE ENTRADAS AL PIC 146F84a


Symbol Hrs_button = PORTA.0   ; BOTON DE AJUSTE PARA HORA
Symbol Mins_button = PORTA.1  ; BOTO0N DE AJUSTE PARA MINUTOS

;CREACION DE VARIABLES

Ticks VAR byte ;  (61 ticks = 1 sec)
Hour VAR byte 
Minute VAR byte 
Second VAR byte 
Disp VAR byte ; Disp = 1 to ACTULIZA LCD
Delay VAR byte  
TRISB = 0 ; PORTB is SALIDA
TRISA = 3 ; RA0,RA1 SON ENTRADAS

PAUSE 500 ; ESPERA 0.5sec PARA INICIALIZAR LCD

; RUTINA PARA PONER A CERO VARIABLES CEREADAS
Hour = 0
Minute = 0
Second = 0
Ticks = 0

OPTION_REG = $05 ; prescaler = 64
ON INTERRUPT GOTO ISR ; IR A RUTINA ISR 
INTCON = $A0 
LCDOUT $FE, 1 ;LIMPIA LCD

;INCIO DEL PROGRMA 

LOOP:

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON HORA CUANDO ES ACCIONADO

IF Hrs_button = 0 THEN
Hour = Hour + 1
IF Hour = 24 THEN Hour = 0
Gosub Debounce
ENDIF

;;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTO CUANDO ES ACCIONADO
IF Mins_button = 0 THEN
Minute = Minute +1
IF Minute = 60 THEN Minute = 0
Gosub Debounce
ENDIF


;RUTINA PARA MOSTRAR VLORES EN EL lcd DE H:M:S

IF Disp = 1 THEN
LCDOUT $FE, 2
LCDOUT DEC2 Hour, ":",DEC2 Minute, ":",DEC2 Second
Disp = 0
ENDIF
GOTO LOOP

; RUTINA DE RETARDO PARA LEER BOTONES 

Debounce:
FOR Delay = 1 To 200
Pause 1 
NEXT Delay 
Disp = 1 
RETURN
; RUTINA PARA EJECUCION DE UN SEGUNDO

DISABLE
ISR:
Ticks = Ticks + 1
IF Ticks < 61 THEN NoUpdate

;RUTINA DE TIEMPO SEGUNDO , MINUTO Y HORAS

Ticks = 0
Second = Second + 1 
IF Second = 60 THEN
Second = 0
Minute = Minute + 1 
IF Minute = 60 THEN
Minute = 0
Hour = Hour + 1 
IF Hour = 24 THEN
Hour = 0
ENDIF
ENDIF
ENDIF
Disp = 1 ; ACTUALIZA LDC

; RUTINA DE LACULMINACION DEL TIEMPO DE ACTIVACION

NoUpdate:
INTCON.2 = 0 
Resume
ENABLE 
END
END
```


----------



## mecatrodatos (May 31, 2009)

el proyecto que sigue a continuacion es que por medio del LDC de muestren carateres en esta ocacion un mensaje utilizando las dos lineas del mismo.

por ultimo sirve como guia de simulacion el esquematico con el que se ha venido trabajando los proyectos de LCD anteriores.


```
; proyecto 4

; visualizacion de caracteres en el LDC mensaje CON PIC 16F84a 


; CONFIGURACION PARA LA PROGRAMACION DEL PIC   
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

' Define registros y bits del LCD

Define	LCD_DREG	PORTB
Define	LCD_DBIT	0
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	4
Define	LCD_EREG	PORTB
Define	LCD_EBIT	5

PAUSE 200          ; RETARDO PARA QUE INICIALIZE EL LCD
LCDOUT $FE, 1 ;LIMPIA LCD
LCDOUT $FE,$86, "CURSO"  ;muestra mensaje en la primera linea,septima casilla
LCDOUT $FE,$c2, "PIC BASIC PRO" ;mensaje en la segunda linea,tercera casilla

END
```


----------



## mecatrodatos (May 31, 2009)

Vamos con la  comprobacion de las 40 lineas de memoria que tiene nuestro lcd 2x16 de las cuales vemos 16 , en este proyecto escribiremos un mensaje desde la casilla 18 de la primera linea el cual no es visible una vez recorridas las 17 posiciones se mostrara el mensaje que sera desplazado hacia la izquierda como resultado tendremos un texrto que permanece un movimiento.


```
; proyecto 5

; visualizacion de un texto con desplazamiento en el LDC CON PIC 16F84a 


; CONFIGURACION PARA LA PROGRAMACION DEL PIC   
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

' Define registros y bits del LCD

Define	LCD_DREG	PORTB
Define	LCD_DBIT	0
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	4
Define	LCD_EREG	PORTB
Define	LCD_EBIT	5

PAUSE 200          ; RETARDO PARA QUE INICIALIZE EL LCD

;creacion de variables 

A var byte
B var byte

; configuracion del LCD

LCDOUT $FE,$7  ; desplazamiento izquierdo
LCDOUT $FE, 1 ;LIMPIA LCD

; inicio del programa

LOOP:
LCDOUT $FE,$91 ; ubicar cursor en la casilla 18
for a =0 to 18
lookup a,["CURSO PIC BASIC PRO"],B
LCDOUT,B
PAUSE 500
NEXT
GOTO LOOP
```


----------



## mecatrodatos (Jun 1, 2009)

que tal vamos con el primer proyecto de manejo de teclado matrixal utilizando operandos matematico de pic basic pro:


```
; lectura de un teclado de 16 posiciones  con pic 16f84A
 
 ; CONFIGURACION PARA LA PROGRAMACION DEL PIC   
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

;  DETERMINACION DE VARIABLES
fila VAR BYTE
columna  VAR BYTE
tecla VAR BYTE
TRISA=0

LOOP1:

PORTB=0
TRISB=%11110000
IF ((PORTB>>4)!=%1111) THEN LOOP1

LOOP2:
FOR FILA=0 TO 3
PORTB=0
TRISB=(DCD FILA)^%11111111
COLUMNA=PORTB>>4
IF COLUMNA!=%1111 then numtecla
NEXT FILA
GOTO LOOP2

NUMTECLA:
TECLA=(FILA*4)+(NCD(COLUMNA^%1111))
PORTA=TECLA
GOTO LOOP1
END
```


----------



## javicone (Jun 2, 2009)

hola amigo mecatrodatos muy bueno tus aportes, tengo una duda sobre como grabar el contenido de 6 variables en una memo via I2C esas variables contienen un valor de 4 digitos, cada una, ejemplo

var1 = 1234
var2 = 21
var3 = 2222
var4 = 754
var5 = 1221
var6 = 231

cuando desconecto la corriente y vuelvo a prender necesito que estas variables se mantengan...
conozco la forma de grabar y leer en eso no tengo problema, mi problema es que no entiendo como hago para que me almacene las cifras enteras, ya que solo me guarda un numero por direccion de memoria, ejemplo grabo esto

I2cwrite portc.7,portc.6,%10100000,0,[1234]
cuando la leo solo me aparece el primer numero, necesito saber como guardo toda la cifra, muchas gracias, espero puedan ayudarme....

javi


----------



## mecatrodatos (Jun 29, 2009)

javoni que tipo de memoria utilizas, mira este ejemplo :lee y escribe en  la memoria (24lc04b) utilizando un pic 16f877A y una pantalla lcd de 2x16 mas de dos carasteres alamacenados en las varibles b1 y b2.


```
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

define I2C_SCLOUT 1 ;PARA QUE NO SE NECESITE RESISTENCIA EN SCL

Define	LOADER_USED	1

' configuracion del lcd  2x16
DEFINE  LCD_DREG        PORTD
DEFINE  LCD_DBIT        4
DEFINE  LCD_RSREG       PORTE
DEFINE  LCD_RSBIT       0
DEFINE  LCD_EREG        PORTE
DEFINE  LCD_EBIT        1


SCL     VAR     PORTC.3                 ' Clock pin
SDA     VAR     PORTC.4                 ' Data pin

address VAR     WORD                    ' Address
B1      VAR     BYTE                    ' Data 1
B2      VAR     BYTE                    ' Data 2

ADCON1 = 7                      ' PORTa Y PORTE COMO DIGITALES 
Low PORTE.2                     ' LCD R/W line low (W)
Pause 100                       'RETADO PARA INICIALIZAR LE lcd


For address = 0 TO 15                'REPITE 16 VECES
B1 = address + 100           ' SUMA 100 A ADDRESS Y VALOR LO GUARDA EN B1
I2CWrite SDA,SCL,$A0,address,[B1]    ' GUARDA EL RESULTA DE B1 EN EN ADDRESS
Pause 10                ' ESPERA 10MS
Next address             ;ESPERA A QUE SE REALICE LA REPETICION

loop:  
For address = 0 TO 15 STEP 2         ' Loop 8 times
I2CRead SDA,SCL,$A0,address,[B1,B2]  'LEE LAS DOS VARIABLES 
LCDOut $fe,1,#address,": ",#B1," ",#B2," "   'VISUALIZA EN EL DISPLAY VALOR DEC
Pause 1000
Next address

GoTo loop                            ; CREA UN BUCLE CERRADO

End
```
Espero te sirva y al igual que  nuestro amigo mot1258 disculpas por no responder a tu inquietud de la forma mas rapida , si lograste hallar otra forma de leer y almacenar mas de una variable en una memoria y visualizar el resultado en una LCD posteala.

Por otro lado seguire posteando proyectos utilies que les parece mostrar caracteres personalizados en Lcd con pic basic pro en eso estaba en el tiempo en que estuve perdido como lectura y visualizacion de sensores de temperatura anologos y digitales, ldr, potencimetro entre otros me parece que nos dedicaremos mas a sacarle el jugo a las pantallas de cristal liquido, cualquier colaboracion , critica o comentario  sera recibida.


----------



## mecatrodatos (Jun 29, 2009)

Aqui esta el diagrama de los proyectos que manejaremos con lcd es el mismo de los anteriores ( mensaje y desplazamiento)  en formato dibujo , archivo comprimido si por el caso cambiaremos al pic 16f877A perola configuracion segura siendo la misma

pines pic                  pines LCD 2x16

RB0                              D4
RB1                              D5
RB2                              D6
RB3                              D7
RB4                              RS
RB5                              E
                                    RW  a tierra 

estoy son los pines que aparecen en proteus al seleccionar el pic y el LCD 2x16 se tiene que realizar la conexion antes descrita.


----------



## mecatrodatos (Jul 3, 2009)

perdonaran la ortografia pero vamos con un proyecto interesante visualizacion de caracteres especiales en LCD 2X16,para ello aclaremos lo siguiente:


Un dispositivo LCD dispone de dos tipos de memorias ambas independientes. Estas memorias se denominan DD RAM y CG RAM.

-DD RAM (Display Data Ram)

Es la memoria encargada de almacenar los caracteres de la pantalla que se esten visualizando en ese momento, o bien, que esten en una posición no visible. El display tiene una capacidad de 2 lineas horizontales por 40 caracteres cada una, de los cuales solo seran visibles 2 lineas de 16 caracteres cada una. La DDRAM tiene un tamaño de 2x40=80 bytes.


CG RAM (carácter generator RAM)

La CG RAM contiene los caracteres que pueden ser definidos por el usuario, es decir que pueden ser personalizados. Está formada por 64 posiciones, con direcciones $00-$3F. Cada posición es de 5 bits.
La memoria esta dividida en 8 bloques que corresponden a los posibles caracteres creados por el usuario que van del 0 al 7.

Cada carácter esta constituido por una matriz de 5 columnas por 8 filas. De este modo un 1 indica un punto de la matriz encendido, y un 0 apagado.


Programa generacion de caracteres pic basic pro utilizando un pic 16f877A un LCD 2x16 con comunicacion a 4 bits:


```
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

' DEFINICIÓN DE REGISTROS PARA EL LCD
Define LCD_DREG PORTB 'Utilizar 4 bits del puerto B para tx de datos
Define LCD_DBIT 4     'Desde el Bit B.4 al Bit B.7
Define LCD_RSREG PORTB'Selección del puerto del registro 
Define LCD_RSBIT 3    'En el bit B.1
Define LCD_EREG PORTB 'Utilizar el enable en el puerto B
Define LCD_EBIT 2     'En el bit B.2
' Establecer el puerto B como salida
TRISB=0

M var byte       ;creacion de variable

Pause 500 ' tiempo para inicializar LCD

RUTINA:

    LCDOUT $FE,64 ' COMIENZA DEFINICION

    LCDOUT $0,$E,$A,$1F,$1B,$1F,$1F,$0 ' 3 candado cerrado
    LCDOUT $0,$E,$8,$1F,$1B,$1F,$1F,$0 ' 4 CANDAdO ABIERTO
    LCDOUT $E,$A,$4,$1F,$4,$E,$A,$0 ' 5 MONITO
    LCDOUT $A,$A,$0,$4,$11,$E,$0,$0 ' 6 cara feliz
    LCDOUT $A,$A,$0,$4,$11,$E,$6,$0 '7 cara lengua
 
    LCDOut $FE, 1 ' LIMPIA EL DISPLAY
    LCDOUT $FE,$84,"CARACTERES"; mensaje en la primera linea LCD
    LCDOUT $FE,$C0 	;caracteres personalizados segunda linea LCD 2X16

; las siguientes lineas del programa sirven para visualizar en la segunda linea del LCD 2X 16 los caracteres especiales 

    FOR M = 0 TO 4   
        LCDOUT M
        PAUSE 300
    NEXT M

    PAUSE 1500

    LCDOut $FE, 1 ' LIMPIA EL DISPLAY
    LCDOUT $FE,$81,"PERSONALIZADOS"   ;mensaje  la primera linea LCD 2X16

    LCDOUT $FE,64 'COMIENZA DEFINICION
    
    
    LCDOUT $1F,$11,$A,$4,$A,$11,$1F,$0 ' 2 RELOJ ARENA 
    LCDOUT $11,$1F,$1F,$15,$1F,$1B,$E,$0 ' 3 DIABLO
    LCDOUT $E,$1F,$15,$1F,$1F,$E,$E,$0 ' 4 CALAVERA
    LCDOUT $4,$2,$4,$0,$1F,$11,$E,$0 ' 5 TAZA
    LCDOUT $0,$E,$11,$1F,$4,$14,$8,$0 ' sombrilla

; las siguientes lineas del programa sirven para visualizar en la segunda linea del LCD 2X 16 los caracteres especiales 

LCDOUT $FE,$C0 	    
    FOR M = 0 TO 4  	
        LCDOUT M
        PAUSE 300
    NEXT M    

    PAUSE 1500

    LCDOUT $FE, 1 ' LIMPIA EL DISPLAY
    GOTO RUTINA
```


Por ultimo anexo simulacion en proteus 7.4 , codigo fuente, .hex .la carpeta esta en formato comprimido


----------



## mot1258 (Jul 5, 2009)

Hola:  mil gracias amigo mecatrodatos por el tiempo para contestarnos yo tambien he andado atareado con la escuela y el trabajo y gracias, mas claro no se puede la explicacion de la conexion de la LCD   y me han servido mucho los ejemplos para la  escuela que nos posteaste y por sí a alguien del foro le quedan duda sobre la conexion o direccionamiento de la LCD,   les dejo un link donde lo explican a detalle, espero les sirva, saludos. 

http://www.matpic.com/MICROCHIP/MICROCHIP_LCD.html


----------



## mecatrodatos (Jul 5, 2009)

Que bien buen aporte mot1258 , si puedes sube proyectos


----------



## mot1258 (Jul 5, 2009)

Ok gracias, buscaré algúno que tenga por ahi pero mas que proyectos, surgen mas dudas y creo que eso es bueno porque es señal de que poco a poco vamos aprendiendo a prueba y error, estoy destrozando el ejemplo que pusiste del conteo de los 5 minutos pero sin ocupar el tmr0 y hacerlo con un contador por si hubiera el caso que quisieras mas salidas que lleven el conteo de la misma forma pero independiente ya que el 16f84 solo tiene un tmr y el 16f877 sino me equivoco solo trae 3 y si yo quiero por ejemplo 5, ya no me alcanzarian, bueno sigo peleandome con eso y en la semana posteo  el poco avance que lleve, si alguien tiene algun aporte, es bienvenido. saludos


PD. dejo mas links
http://www.melabs.com/resources/samples.htm
http://www.todopic.com.ar/pbp_sp.html#count


----------



## mecatrodatos (Jul 6, 2009)

Que tal siguiendo con los proyectos de lcd un frecuenciometro con el pic 16f84A , ldc 2x16 y un generador de señales cuadradas ubicado por el puertoA2, en donde se capta los pulsos y se visualizan el LCD; con alarmas de activacion condicionales ubicadas en el puert A 0,1 respectivamente, sin mas el codigo fuente:


```
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

' DEFINICIÓN DE REGISTROS PARA EL LCD
Define LCD_DREG PORTB 'Utilizar 4 bits del puerto B para tx de datos
Define LCD_DBIT 0     'Desde el Bit B.4 al Bit B.7
Define LCD_RSREG PORTB'Selección del puerto del registro 
Define LCD_RSBIT 4    'En el bit B.1
Define LCD_EREG PORTB 'Utilizar el enable en el puerto B
Define LCD_EBIT 5     'En el bit B.2

' Establecer el puerto B como salida
TRISB=0
; configuracionde pines del PIc 16f84A

Alarma0 var porta.0
Alarma1 var porta.1

; definicion de variables 

pulsos var word        ; variable con capacidad de 65535


loop:

count porta.2,1000,pulsos    ; CONTAR LOS PULSOS POR EL PUERTO A2
lcdout $fe,1            ;LIMPIA lcd
lcdout $fe,$82,"fecuencia:"     ; ENVIAR MENSAJE AL LCD
lcdout $fe,$c5,dec pulsos,"hz"    ; MOSTRAR PULSOS EN LCD SEGUNDA LINEA

;condicionales para alarmas

if pulsos>750 then EMER1      ;SI PULSOS EXCEDE 750 IR A EMER1
if pulsos<320 then EMER2       ; SI PULSOS DECIENDE  320 IR A EMER2
LOW ALARMA0:LOW ALARMA1
GOTO LOOP

EMER1:                          ; RUTINA EMER1
                                            
HIGH ALARMA0
LOW ALARMA1
GOTO LOOP

EMER2:
                                 ;RUNITA EMER2
LOW ALARMA0
HIGH ALARMA1
GOTO LOOP
```


----------



## mecatrodatos (Jul 16, 2009)

Que tal a peticion de un compañero del foro un contador con dos display activado por una entrada (pulsador al pic 16f84A) de 00 a 99 

programa fuente en pic basic pro:


```
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

;DEFINICION DE VARIABLES

Cnt VAR Byte 
Digit VAR Byte 
Pattern VAR Byte 
Digit1 VAR PORTA.0 
Digit2 VAR PORTA.1 
Pbutton VAR PORTB.7 
i VAR Byte 


TRISA = 0 
TRISB = $80 
Cnt = 0 


OPTION_REG = $05
TMR0 = 0 
ON INTERRUPT GOTO ISR
INTCON =$A0

LOOP:
BUTTON Pbutton, 0,255,0, i, 0, LOOP
Cnt = Cnt + 1
goto loop


DISABLE 
ISR:

Digit = Cnt DIG 1
Pattern = Pattern ^ $FF
LOOKUP Digit, [$3F,$06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F], Pattern
Pattern = Pattern ^ $FF
Digit2 = 0  
PORTB = Pattern
Digit1 = 1 
Pause 5 

Digit = Cnt DIG 0 
LOOKUP Digit, [$3F,$06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F], Pattern
Pattern = Pattern ^ $FF
Digit1 = 0  
PORTB = Pattern
Digit2 = 1
PAUSE 10 
INTCON.2 = 0 
RESUME 
ENABLE 
END
```


----------



## mecatrodatos (Jul 18, 2009)

Bueno amigos quiero compartir con ustedes el desarrollo de un robot seguidor de luz bajo la programacion en pic basic pro,utilice un pic 16f84a, driver l293b,fotoceldas y como estructura del robot un carro viejo de rf que tenia,adaptando en un pequeño protoboard el circuto para controlar los dos motores que componen el carrito. No coloque los testigos (leds) por el espacio en la proto para controlar el motor 1 utilice el comando PWM. 

Este es dodigo fuente:
	
	



```
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 


;ROBOT SEGUIDOR DE LUZ

b0 var byte         ;VARIABLE PARA GUARDAR EL VALOR DE LDR1
b1 var byte         ;VARIABLE PARA GUARDAR VALOR DE LDR2 
b2 var byte         ;VARIABLE DE COMPARACION DE LDR1 Y LDR2
p2 var portb.0      ;SALIDA MOTOR1
p3 var portb.1      ;SALIDA MOTOR2
p4 var portb.2      ;SALIA MOTOR2
EN1 var portb.3    ; habilitador inversor giro MOTOR 2
EN2 VAR PORTB.4      ;HABILITADOR MOTOR UNO

LED1 VAR PORTA.0
LED2 VAR PORTA.1
LED3 VAR PORTA.2

start:                          ;INICIO
pot portb.5,255,b0              ;LEE LDR1 Y GUARDA VALOR EN BO
pot portb.6,255,b1              ;LEE LDR2 Y GUARDA VALOR EN B1
If b0 = b1 then straight        ;SI BO =B1 ENTONCER IR  ALA RUTINA STRAIGHT
if b0 > b1 then left            ;SI BO ES MAYOR A B1 IR A IZQUIERDA
if b1 > b0 then right           ;SI B1 ES MAYOR QUE BO ENTONCES IR A DERECHA

straight:                       ;RUTINA COMIENZO
pwm EN2,125,30:HIGH p2
LOW EN1: low p3:low p4   ; HABILITA MOTOR 1
high led1
goto start                     ;IR A INICIO 

left:                         ;RUTINA IZQUIERDA
b2 = b0-b1                    ;RESTE EL VALOR DE BOY B1 Y GUARDELO EN LA 
                              ;VARIABLE B2 
if b2 > 15 then left1         ;SIB2 ES MAYOR QUE 15 ENTONCES IR A RUTINA 
                              ;IZQUIERDA 1                                    
goto straight                 ;IR A INICIO

left1:                       ;RUTINA IZQUIERDA 1
pwm EN2,125,30:HIGH p2
HIGH EN1: LOW P3:high p4 ;ACTIVA SALIDA P3 Y DESACTIVA SALIDA P4
HIGH LED2                      ;ENCIENDE TESTIGO              
goto start                    ;IR A INICIO

right:                         ;RUTINA DERECHA
b2 = b1-b0                     ;RESTE EL VALOR DE B1 CON B0 Y GUARDE EL
                               ;VALOR EN B2
if b2 > 15 then right1         ;SI B2 ES MAYOR QUE 15 ENTONCES IR A RUTINA 
                               ;DERECHA 1   
goto straight                  ;IR A INICIO

right1:                        ;RUTINA DERECHA 1
pwm EN2,125,30:high p2
HIGH EN1:HIGH P3:low p4 ;ACTIVA SALIDA P4 Y DESACTIVA SALIDA P3
HIGH LED3                       ;ENCIENDE TESTIGO
goto start                      ;IR A INICIO

end                             ;FIN DE PROGRAMA
```


----------



## mecatrodatos (Jul 18, 2009)

fotos del proyecto robot seguidor de luz


----------



## mecatrodatos (Jul 19, 2009)

Amigos vamos con un proyecto interesante control de acceso son clave utilizando un teclado matrixal de 4x4,pic 16f84a y testigos de operatividad, al ingresar los cuatro digitos correctamente se energiza un rele durante tres segundos  ubicado en el pin door del pic ,si la clave es incorrecta se emite tres activaciones en  bip y led ubicados en el puerto  A0 y A1 respectivamente, la activacion de cada tecla va acompañado de la visualizacion del led ubicado en pin 18 del pic 16f84a.

codigo fuente en pic basic pro
	
	



```
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz

;creacion de variables
tecla var byte                 ;donde se guarada tecla pulsada
repit var byte                 ;para hacer repeticiones 

;configuracion de pines del pic 16f84a

bip var porta.0      ;donde se conecta la chicharra
led var porta.1  ;donde se conecta el led 
door var porta.2   ;donde se conecta rele para la puerta

a var portb.0       ;pines de las filas 
b var portb.1
c var portb.2
d var portb.3 

uno var portb.4
dos var portb.5
tres var portb.6
cuatro var portb.7

iniciando:        ;incica funcionamiento del sistema 

high led:high bip
pause 1000
low led:low bip
goto teclauno        ; comparar clave

barrido:
low a               ;sensar fila a
if uno=0 then tecla=1:return
if dos=0 then tecla=2:return
if tres=0 then tecla=3:return
if cuatro=0 then tecla=10:return
high a
low b
if uno=0 then tecla=4:return
if dos=0 then tecla=5:return
if tres=0 then tecla=6:return
if cuatro=0 then tecla=11:return
high b
low c
if uno=0 then tecla=7:return
if dos =0 then tecla=8:return
if tres=0 then tecla=9:return
if cuatro=0 then tecla=12:return
high c
low d
if uno=0 then tecla=14:return
if dos=0 then tecla=0:return
if tres=0 then tecla=15:return
if cuatro=0 then tecla=13:return
high d
pause 10
goto barrido

;rutina antirrebote de teclas
ptecla:
high led:low bip
pause 100
low led :low bip
espacio:
if uno=0 then espacio
if dos=0 then espacio
if tres=0 then espacio
if cuatro=0 then espacio
pause 25
return
 ;rutina para comparar claves

teclauno:
gosub barrido
gosub ptecla
if tecla=1then teclados
goto falso

teclados:
gosub barrido:gosub ptecla
if tecla=2 then teclatres
goto falso1

teclatres:
gosub barrido:gosub ptecla
if tecla=3 then teclacuatro
goto falso2

teclacuatro
gosub barrido:gosub ptecla
if tecla=4 then open
goto falso3

open:
for repit=1 to 2
pause 100
high led:high bip
pause 100
low led:low bip
next

high door
pause 3000
low door 
goto teclauno

;rutina teclas erroneas

falso:
gosub barrido:gosub ptecla
falso1:
gosub barrido:gosub ptecla
falso2:
gosub barrido:gosub ptecla
falso3:
for repit=1 to 3
pause 100
high led:high bip
pause 100                      
low led: low bip
next
goto teclauno
end
```


----------



## Patico21 (Jul 23, 2009)

hola alguien me puede ayudar estoy aprendiendo a programar en pic basic pero quisiera saber como puedo controlar un LCD desde el pic 16F877A muchas gracias por la ayuda que me puedan dar


----------



## javicone (Jul 23, 2009)

hola amigo deberias ser mas conciso en tus preguntas queres saber como se conecta (patillaje) o queres que el display haga algo especial? (software), saludos


----------



## Patico21 (Jul 23, 2009)

hola gracias por responder mira consegui aqui en mi pais Ecuador un libro que habla de el micro 16F628A, programacion en microcode studio por ejemplo si se desea inicializar el micro no se declara el oscilador por defecto lo hace para el oscilador por cristal pero segun estaba leyendo un poco no se si sera verdad no lo he confirmado el 16F877A no tiene oscilador interno por eso hace falta comenzar por eso y por lo demas quisiera saber si las mismas lineas de codigo que se utilizan para el 16F628A para inicializar el LCD son las mismas o hay que modificar un poco. te agradeceria si es posible me cruces un pequeno programita para irlo comprobando y poderlo armar e ir entrenando sobre todo lo que es posible hacer mediante el micor code studio. muchas gracias por lo que me puedas ayudar


----------



## javicone (Jul 23, 2009)

bien amigo patico, vayamos por partes, primero el 16f877a no tiene oscilador interno, pero es mucho mas completo que el 16f628 en otras areas, mas memoria eeprom, 33 in/out, etc, debes conserguirte un cristal de 4 mhz que es lo mas comun, y dos condensadores de 22 picofaradios, con esto haces el oscilador, es indispensable contar con el datasheet u hoja de datos del mencionado pic, de otra forma no sabes con que estas trabajando, debes si o si conocer la disposicion de las patas del pic...
ahora para el lcd debes tener en cuenta un par de cosas, un lcd por ejemplo de 2x16 (muy comun) trabajan de dos modos con 8 bits o con 4 bits, que es esto? la cantidad de patas que vas a conectar al pic, si es de 4 bits conectas 4 patas del pic al lcd, si es de 8 conectas 8 patas del lcd al pic, que se gana con esto, una mayor velocidad de transferencia de datos del pic al lcd...ahora bien ademas de las 4 u 8 patas debes conectar tambien otras dos que son "E" (enable), el pic lo pone a 1 para que el lcd se active y luego tienes otra que es "RS" (register select) que sirve para que el lcd sepa si recibe un comando, por ejepmlo: (limpiar la pantalla) o si recibe un caracter, por ahora debes poder armar el soft, y debes ser paciente para poder entender como funciona el sistema, es maravilloso pero no debes desesperarte, busca información en google que hay mucha...saludos te adjunto un esquema de conexion del lcd, saludos


----------



## mecatrodatos (Jul 23, 2009)

patico 21
que tal en proyectos con lcd encontrars lo necesario hay he dejado programas muy interesantes por ahora en el inicio del programa que desees realizar con oscilador externo tienes que configurarlo desde pic basic pro por ejemplo si deseas trabajar con un oscilador xt de 4Mhz escibes las siguientes lineas de codigo, para que cuando lo programes no tengas problemas:

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

Por otro lado si deseas manejar el LCD 2X16 con este pic debes tener en cuenta queel Puerto A y E cuenta con conversores analogo/ digital y si vas a usar alguno de estos puertos con conexio al lcd tenes que escribir lo siguiente:

ADCON1=7 ; convierte entradas o salidas digitales los pines del puerto A y E del pic 16F877A

para finalizar las lines con las que trabajan son iguales, pero el pic basic pro tiene configurado desde software la conexión para el LCD con el puerto A para que te trabaje por otro puerto debes escribir lo siguiente :


```
' Define LCD registers and bits
Define	LCD_DREG	PORTB
Define	LCD_DBIT	                4   
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	3
Define	LCD_EREG	PORTB
Define	LCD_EBIT	                2
```

Si deseas mayor aclaracion en este mismo hilo esta la configuracion de cada comando y nuestro amigo mot posteo excelentes paginas donde hay un tutorial con todos los comandos utilizados con pic basic. pro.


----------



## Patico21 (Jul 24, 2009)

Gracias por responder osea que si hago los puertos a digital y las demas modificaciones que me mencionas y coloco en el programa que voy a trabajar con el 16F877A en teoria el mismo programa que lo hice para el 16F628A puede ser utilizado para el 16F877A obiamente cambiando la distribucion de pines y otras cositas o me equivoco mira este es le codigo que puse en el 16F628A para que me salga hola 


```
pause 200
x var byte
abc var byte
ini:
       lcdout $FE,1
       for x = 0 to 5
lookup x, ["hola"],abc
       lcdout, abc
       pause 400
       next
       pause 2000
goto ini
end
```

osea que en el principio tendria que colocar 


```
ADCON1=7 
Define LCD_DREG PORTB 
Define LCD_DBIT 4 
Define LCD_RSREG PORTB 
Define LCD_RSBIT 3 
Define LCD_EREG PORTB 
Define LCD_EBIT 2
```
y luego lo demas del codigo que te mostre, me puedes ayudar un poco con esto porfavor gracias nuevamente por la ayuda


----------



## javicone (Jul 24, 2009)

hola amigo patico21, tu codigo es correcto te explico cual es la configuracion que te ha pasado nuestro amigo mecatrodatos,


Define LCD_DREG PORTB     Define por que puerto vas a conectar en lcd en este caso el PORTB 

Define LCD_DBIT 4             Define la cantidad de bits de conexion en este caso 4 del nibble alto RB4,RB5,RB6,RB7 

Define LCD_RSREG PORTB    Define en que puerto se va a conectar el bit de (RS) Register Select, en este caso PORTB

Define LCD_RSBIT 3            Define en que bit se conecta el (RS) Register Select, en este caso el bit 3, o sea RB3

Define LCD_EREG PORTB      Define en que puerto se va a conectar el bit de (E) Enable, en este caso PORTB

Define LCD_EBIT 2              Define en que bit se conecta el (E) Enable, en este caso el bit 2, o sea RB2

en tu caso no hace falta convertir las entradas con adcon ya que no estas usando ninguno de los puertos que tienen conversores, por lo menos para el lcd... saludos... un gusto


Javicone


----------



## mecatrodatos (Jul 25, 2009)

Que tal hasta el momento hemos desarrollados proyectos con el pic 16f84A , pero este micro se nos que para leer sensores de temperatura como el lm35 y configurar entradas y salidas superiores a trece (13) que son con las que cuenta el pic 16f84A con sus dos puertos A y B respectivamente, por que trabajaremos con el pic 16F877A que posee convertidores A/D y tres puertos mas que el 84A.

Para empezar a desarrollar el proximo proyecto adjunto documento explicativo del conversor A/D del pic 16f877A ya que leeremos el famoso sensor de temperatura lm35. y visualizaremos su valor en un LCD .Todo ello para entender los comandos del codigo que se desarrollara en basic pro.


----------



## mecatrodatos (Jul 25, 2009)

El LM35 es un sensor de temperatura con una precisión calibrada de 1ºC y un rango que abarca desde -55º a + 150ºC. La salida es lineal y equivale a 10 mV/ºC. 

· Precisión de : ~1,5ºC (peor caso) 

· No linealidad : ~0,5ºC (peor caso)

Su tensión de salida es linealmente proporcional con la temperatura en la escala Celsius (centígrada) . Posee una precisión aceptable para la aplicación requerida, no necesita calibración externa y es de bajo costo. Funciona en el rango de alimentación comprendido entre 4 y 30 voltios. Tiene tres pines: alimentación, tierra y salida análoga

Codigo fuente pic basic pro comentado:

```
;Programa en donde se utiliza el sensor de temperatura LM35,el pic 16f877A,LCD
;de 2 X16 y se muestra el valor en decimal en la pantalla de cristal liquido con
;su respectivo mensaje TEMPERATURA:**C.

; definicion de Oscilador Externo 
 
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

; Definicion de conexiónes del LCD

DEFINE LCD_DREG PORTB          ; LCD bits de comunicacion al LCD 
DEFINE LCD_DBIT 0              ; Coneccion puerto B (RB0,RB1,RB2,RB3) 
DEFINE LCD_RSREG PORTB         ; LCD bit RS conectado a PORTB
DEFINE LCD_RSBIT 4             ; LCD bit RS conectado a puerto B (RB4)
DEFINE LCD_EREG PORTB         ; LCD bit E conectado a PORTB
DEFINE LCD_EBIT 5              ; LCD bit E conectado a puerto B (Rb5)
DEFINE LCD_BITS 4              ; LCD comunicado 4Bits 
DEFINE LCD_LINES 2             ; LCD de 2 lineas 


; definicion de parametros de conversion A/D 

DEFINE ADC_BITS 8           ; numero de bit conversion A/D
DEFINE ADC_CLOCK 3           ; reloj interno RC usado en conversion A/D
DEFINE ADC_SAMPLEUS 50       ; tiempo de conversion en Us

; Creacion de Variables

Sensar  Var Word      ; Variable donde se guarda el resultado de conversion A/D
Temp Var Byte ; Temperatura en grados centigfrados (C)
TRISA =1      ; RA0 (AN0) es donde se conecta pin OUT del LM35
TRISB =0             ; PORTB es salida

PAUSE 500             ; 0.5s para inicializar LDC

; inicializacion conversor A/D 

ADCON1 = 0            ;ANO entrada analoga
                         
ADCON0 = %11000001        

LCDOUT $FE, 1        ;limpiar LCD 

; Programa principal e inicio de la conversion A/D

LOOP:

ADCIN 0,Sensar             ;Lee canal 0 y guardar en variable sensar

Temp = 2*sensar           ;Conversion a grados centigrados 
LCDOUT $FE,2,"TEMPERATURA:",DEC2 Temp,"C" ;mostrar valor decimal en LCD 
PAUSE 1000                 ;retardo de un segundo
GOTO LOOp                  ;Crea un bucle cerrado 
END                        ;fin del programa

Cualquier  comentario, Critica ,Colaboracion sera bien recibida he dejado documentos adjuntos para la aclaracion de cualquier inquietud espero sea de su agrado. El proyecto ha sido maotado y funciona a la perfeccion.
```


----------



## mecatrodatos (Jul 26, 2009)

Bien vamos con proyecto interesante aqui os dejo el codigo fuente comentado:
	
	



```
;Programa en donde se mueve un servo motor de tres lineas con el pic 16f877A,
;se utiliza LCD 2X16 que muestra la posicion de giro dada por tres botones 
;conectados al puerto B, los cuales dan las posiciones: giro derecha ,centro y 
;giro izquierda referenciado de 0 a 1000, donde posicion de centro es 500.
 
; deficion de Oscilador Externo 
 
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
' Libreria para la operacion del programa 

Define	LOADER_USED	1

; Definicion de conexiónes del LCD

Define  LCD_DREG        PORTD   
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTA
Define  LCD_RSBIT       0
Define  LCD_EREG        PORTA
Define  LCD_EBIT        1

pos     var     word    ' Posicion del servo

servo1  var     PORTC.1 'pin donde se conecta el servo


        ADCON1 = 7      ' PORTA y PORTE digitales
        Low PORTA.2     ' LCD R/W low = escritura
        Pause 100       ' retardo para inicializar el LCD

        OPTION_REG = $7f 
        Low servo1       ;portc.1 como salida para controlar el servo

        Gosub center    'ir a centro


' progrma principal

LOOP:
        PORTB = 0       ' PORTB lineas a cero logico para leer botones
        TRISB = $fe     
        

        'Rutinas para el chequeo de botones y posiciones del servo
        If PORTB.4 = 0 Then
                Gosub left
        Endif
        If PORTB.5 = 0 Then
                Gosub center
        Endif
        If PORTB.6 = 0 Then
                Gosub right
        Endif
        ;Rutina para mostrar mensaje y valor decimal de la posicion del servo
        
        Lcdout $fe,1
        Lcdout $fe,2,"Position = ", #pos

        servo1 = 1      ' iniciar pulso hacia el servo
        Pauseus 1000 + pos
        servo1 = 0      ' termine pulso 

        Pause 16        ' retardo

        Goto LOOP   ' Crea un bucle cerrado


' giro hacia la izquierda
left:   If pos < 1000 Then
                pos = pos + 1
        Endif
        Return


' giro hacia la derecha
right:  If pos != 0 Then
                pos = pos - 1
        Endif
        Return


' posicion de centro
center: pos = 500
        Return

        End
```


----------



## Patico21 (Jul 27, 2009)

hola a todos los amigos gracias por los valiosos ejemplos que postearon la verdad no me queda claro es decir que si coloco mi  codigo tal como esta con la configuracion de el amigo mecatrodatos  y dispongo el montaje como lo posteo el amigo javicone debe funcional o hago algun cambio adicional....ahora una pregunta mas probe el siguiente codigo para prender y apagar un led y me da error me dice que la primera linea de codigo es invalido (@ device xt_osc ; oscilador externo XT ) que esta mal?


```
; encender un led conectado al pin 37 (RB4) del pic 16F877A durante 2.5 seg y 
;luego apagarlo 0.5 seg el proceso debe repetirse 4 veces luego el led debe 
;permanecer apagado. 

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
x var byte ; crea la variable x y asigna un espacio de memoria 
; de o a 255 
LED var portb.4 ; asigna el nombre de led a RB4 del pic 16f877A 


programa: ; inicio de la linea de programa 
for x=0 to 3 ; repetir 4 veces 
high led ;enciende led 
pause 2500 ; esperar 2.5 seg 
low led ;apaga led 
pause 500 ; espera 0.5 seg 
next ; siguiente repeticion hasta que sea x=3 
end ; fin del programa
```

estoy usando el microcode studio plus les agradezco la ayuda que me puedan brindar


----------



## Chico3001 (Jul 27, 2009)

Por favor traten de colocar sus codigos de ejemplo entre las etiquetas code y /code para que la lectura de las respuestas en el foro sea mas simple 

Gracias...


----------



## mot1258 (Jul 27, 2009)

Hola a todos ya estamos de regreso, amigo patico21 verifica que cuando vayas a compilar el programa, hayas seleccionado el pic que quieres, en este caso el 16f877a, esto lo haces en el microcode en la barra de menu de arriba, espero te sea de ayuda, ya que aveces me a pasado que esos pequeños detalles se nos pasan, saludos.


----------



## Patico21 (Jul 27, 2009)

hola amigo gracias por responder si me fije y esta colocado el micro 16F877A por eso preguntaba la veradad me parece muy raro pense que puede ser el programa si pudieran darme una ayuda con eso les agradeceria mucho


----------



## mecatrodatos (Jul 27, 2009)

Que tal mira este problema ocurre bajo las siguientes condiciones :

1.No dejar espacio entre la @, device y xt_osc  o se encuentre alguna de esta palabras pegadas generandose el codigo de error en la parte izquierda inferior del micro code studio; (Error PRUEBA.ASM 53:[235] opcode expected instead of ´xt_osc´

-Por otro lado bajo el formato de Micro Code este codigo se presenta en color verde si no es asi debes desplazarlo  hacia la orilla izquierda para que tome este color ya que si lo ubicas por ejemplo en el centro de la hoja donde estas desarrollando el codigo se te presenta en color negro.

-Los comentarios se te presentan de color azul cuando utilizas ; o '

-Los mensajes para lcd en color rojo si utilizas " " 

Espero te sirva


----------



## mecatrodatos (Jul 28, 2009)

Analizando tu codigo patico 21 el de mensaje hola teneis dos errores
	
	



```
pause 200 
x var byte 
abc var byte 
ini: 
       lcdout $FE,1 
       for x = 0 to 5 
lookup x, ["hola"],abc 
       lcdout, abc 
       pause 400 
       next 
       pause 2000 
goto ini 
end
```

Cuando realices el montaje o la simulacion en proteus no va ha parecer la primera letra de tu mensaje y se te va ha  repetir la a  dos veces mas es decir en la LCD te aparecera algo asi: olaaa ya que es un mensaje que se muestra caracter por carater o estoy equivacado, si estoy en lo correcto el for de la variable x se debe repetir con respecto al numetro de letras que componen el mensaje es decir como tu mensaje la integran cuatro h-o-l-a tendreis que colocar (for x=0 to 3) para que con ello no se muestre al final doble a.

Por otro lado para que te aparezca la (h ) deja un espacion entre las comillas y la h, o el comando LCDOUT $FE,2 despues del de limpiar LCD (lcdout $FE,1 )  como sigue:

1.
 lookup x, [" hola"],abc 

2.
lcdout $FE,1
lcdout $FE,2
for x = 0 to 5


----------



## Patico21 (Jul 28, 2009)

hola mecatrodatos gracias por responder tines mucha razon en lo del lcd con razon no salia lo que yo esperaba y te don de nuevo la razon con respecto a los espacios entre la linea de @ device xt_osc  habia espacio entre las palabras y por eso no me compilaba el codigo muchas gracias...ahora mi pregunta seria como quedaria el codigo para poder ya simulaarlo quedaria algo asi o me equivoco


```
ADCON1=7 
Define LCD_DREG PORTB 
Define LCD_DBIT 4 
Define LCD_RSREG PORTB 
Define LCD_RSBIT 3 
Define LCD_EREG PORTB 
Define LCD_EBIT 2 


pause 200 
x var byte 
abc var byte 
ini: 
       lcdout $FE,1 
       for x = 0 to 3 
lookup x, [" hola"],abc 
       lcdout, abc 
       pause 400 
       next 
       pause 2000 
goto ini 
end
```


gracias por la ayuda que me puedan brindar


----------



## mecatrodatos (Jul 28, 2009)

Esta bien pero no te olvides incluir las dos lineas de codigo de tipo de oscilador externo a utilizar y la frecuencia de uso por otro lado puedes omitir el ACON1=7 ya que no estas utilizando los puertos A y E del pic que tienen conversores A/D


----------



## Patico21 (Jul 29, 2009)

muchas gracias de verdad me olvide de colocarlo lo probare y sino nuevamente les molestare


----------



## mecatrodatos (Jul 29, 2009)

Bien iremos con un proyecto que estoy realizando el cual consiste interpretar la temperatura desde un pic hacia un pc utilizando labview alguno que conozca como utilizar labview le estare agradecido tengo que utilizar comunicacion rs 232 en la cual no tengo problema el inconveniente es como hago la cuestion grafica en labview.

Tambien a traves de este software tengo que manejar un Ascensor ya he realizado el codigo de los dos proyectos en pic basic pro, espero una colaboracion en el entrono de labview y subire los avances.


----------



## electroandres (Jul 30, 2009)

Hola, quisiera pedir ayuda para hacer el siguiente proyecto:
Un reloj con alarma, sensor de temperatura y calendario todo expresado en el mismo LCD al mismo tiempo. Si no me equivoco, con un 16f84 se puede hacer, ya que se puede usar el PORTA para las entras (señal y 3 pulsadores) y el portB para el LCD. Se podria realizar?

Ej:
 __________________
|-12:50------------9:30-|
|-1/1/09----------10ºC  -|


----------



## mecatrodatos (Jul 30, 2009)

Claro pero te recomiento un sensor de temperatura digital como ds18b20  manejado a traves de linea de bus y el DS1307, Reloj Calendario en Bus I2C .


----------



## electroandres (Jul 31, 2009)

Porque un sensor digital? cual es la diferencia?


----------



## Patico21 (Jul 31, 2009)

hola amigos un favor quiero leer el voltaje que me da un potenciometro como se muestra en la imagen quisiera mostrar en el LCD el voltage que hay entre el punto central del potenciometro y tierra. consegui el siguiente codigo 


```
define LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBTI 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4

p1 var byte
p2 var byte 
p3 var byte

ADCON1=%100           'este es la linea que no entiendo para que se usa

inicio:
    PAUSE 300
poten1:
    ADCON0=%1000001   'este es la linea que no entiendo para que se usa
    GOSUB medir
    p1=ADRESH
poten2:
    ADCON0=%1001001   'este es la linea que no entiendo para que se usa
    GOSUB medir
    p2=ADRESH
poten3:
    ADCON0=%1011001   'este es la linea que no entiendo para que se usa
    gosub medir
    p3=ADRESH

lcdout $fe,1,"pot1 pot2 pot3"
lcdout $fe,$c1,#p1
lcdout $fe,$c6,#p2
LCDout $fe,$cb,#p3
goto inicio

medir:

pause 50
ADCON0.2=1
pauseus 50
return
end
```


quisiera que por favor me ayuden con las lineas que no entiendo porque se asigna ese valor he leido un poco que es en base a una tabla de cada micro pero no me queda claro el uso este codigo en las lineas que he señalado el porque si me pudieran explicar un poco serian tan gentiles por favor. este codigo es para medir unos potenciometros que estan conectados en A0 A1 A3 y lo muesta en el LCD. ayudenme por favor tengo una gran duda y la verdad que no me queda claro


----------



## electroandres (Jul 31, 2009)

Chicos y chica, si les queda alguna duda del uso del lcd o algo, encontre esta pagina que la verdad me saco todas las dudas
http://www.matpic.com/MICROCHIP/MICROCHIP_LCD.html
(vean el ultimo video)


----------



## mecatrodatos (Ago 1, 2009)

Que tal para mi amigo electroandres el hecho de recomendarte un sensor digital para tu proyecto es que el pic que vas a utilizar no tiene conversores A/D como el pic 16f877A por ello debes selecionar uno que pueda leer tu pic y adjuntar la medida obtenida en 8 byte para que posteriormente sea enviado el valor en decimal al lcd por comunicacion de 4 bits revisa este codigo espero sea de utilidad 
	
	



```
'DEFINICION OSCILADOR EXTERNO                                                        
 
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 


' DEFINICION DE LIBRERIA PARA COMUNICACION 

Define	LOADER_USED	1

'DEFINICION DE PINES PARA CONECTAR EL LCD

Define  LCD_DREG        PORTB
Define  LCD_DBIT        0
Define  LCD_RSREG       PORTB
Define  LCD_RSBIT       4
Define  LCD_EREG        PORTB
Define  LCD_EBIT        5                                    


' CREACION DE VARIABLES

command var     byte            ' VARIABLE PARA COMANDO
i       var     byte            ' VARIABLE PARA CONTEO
temp    var     word            ' PARA GUARDAR VALOR TEMP

' DETERMINACION DE PIN SENSOR DS 18S20 CONECTADO AL PIC 16F84a

DQ      var     PORTB.7         ' PIN DEL SENSOR DS18S20 CONECTADO A PORTB.7 
DQ_DIR  var     TRISB.7         ' DEL PIC 16F84a


        Low PORTB.6             ' LCD R/W A CERO LOGIGO POR EL PIC 16F84a
        Pause 100               ' 100 MS PARA INICIALIZAR LCD

        Lcdout $fe, 1
        Lcdout $fe,$80, "Temp:"      'MOSTRAR MENSAJE
        
'PROGRAMA PARA LECTURA DE TEMPERATURA EN EL LCD

INICIO:
        Gosub init18S20          ' IR A RUTINA DE INICIALIZACION DEL LCD

        command = $cc           
        Gosub write18S20

        command = $44           ' EMPIEZE CONVERCION DE TEMPERATURA
        Gosub write18S20

        Pause 2000              ' ESPERO 2S EG HASTA QUE FINALICE LA CONVERSION

        Gosub init18S20          

        command = $cc           
        Gosub write18S20

        command = $be           ' LEER TEMPERATURA
        Gosub write18S20
        Gosub read18S20

'RUTINA PARA MOSTRAR VALOR DE TEMPERATURA EN EL LCD
        
        Lcdout $fe,$86, dec (temp >> 1),".",dec (temp.0 * 5), "oC"

        Goto INICIO           ' CREA UN BUCLE CERRADO


' INICIALIZA  DS18S20 Y CHEQUEA PRESENCIA

init18S20:

        Low DQ                  
        Pauseus 500           
        DQ_DIR = 1              

        Pauseus 100             
        If DQ = 1 Then
                Lcdout $fe, 1 
                Lcdout $fe,$83,"SENSOR DS18S20"
                Lcdout $fe,$C2,"NO CONECTADO"
                Pause 500
                Goto INICIO   
        Endif
        Pauseus 400             
        Return


' RUTINA PARA COMUNICACION DEL PIC CON SENSOR DS1820 A 8 BYTE
write18S20:
        For i = 1 to 8        
                If command.0 = 0 Then
                        Gosub write0    
                Else
                        Gosub write1   
                Endif
                command = command >> 1  
        Next i
        Return

' RUTINA PARA DESHABILITAR DS18S20 A TRAVES DE UN BIT 
write0:
        Low DQ
        Pauseus 60             
        DQ_DIR = 1              
        Return

' RUTINA PARA HABILITAR DS18S20 A TRAVES DE UN BIT 
write1:
        Low DQ                  
@       nop                  ' RETARDO DE 1us CON UN OSCILADOR EXTERNO DE 4MHz
        DQ_DIR = 1              
        Pauseus 60              
        Return
                           

' RUTINA PARA LEER DS18S20
read18S20:
        For i = 1 to 16       
                temp = temp >> 1        
                Gosub readbit   
        Next i
        Return

' RUTINA PARA LEER BIT DS18S20
readbit:
        temp.15 = 1            
        Low DQ                 
@       nop                  ' RETARDO DE 1us CON UN OSCILADOR EXTERNO DE 4MHz         
        DQ_DIR = 1              
        If DQ = 0 Then
                temp.15 = 0     
        Endif
        Pauseus 60              
        Return

        End
```


----------



## electroandres (Ago 1, 2009)

ok, igual todabia no me hiba a meter en el tema del de temperatura, por ahora solo quiero hacer reloj + alarma.
Tengo un problema con el sonido de la alarma, ya hice todo el comando para cambiar la hora de alarma, expresarla en el lcd y todo, ahora lo unico que me falta es que cuando este igual hour y Ahour (hora alarma) min = amin. Empiece a sonar
hasta ahi todo bien
hice un if

If (alarm_button = 0) and (ahour = hour) and (minute = amin) then
for alarm =0 to 100
sound alarma_sonido, [100,10,50,100]
pause 1000
next
endif

el tema es que no se como ejecutar ese comando y que el reloj siga andando, que sume segundos y haga lo que tenga que hacer. Me podrias ayudar?
puede ser el comando on interrupt el que tengo que usar?


----------



## mecatrodatos (Ago 1, 2009)

Postea todo el codigo y el esquematico con el que vas a trabajar asi te prodre ayudar mejor


----------



## mecatrodatos (Ago 1, 2009)

Patico 21 descarga en la pagina 3 de este post  el documento en pdf del convertidor A/D pic 16f877A, hay ebcontraras lo que necesitas para aclrarte las dudas referente a tu codigo que cualquier forma te dejo el enlace: 

https://www.forosdeelectronica.com/download.php?id=26210


----------



## electroandres (Ago 1, 2009)

Aca esta lo que me pediste, anda en el proteus.
Falta la parte de hacer sonar la alarma


----------



## mecatrodatos (Ago 3, 2009)

Patico 21 si tenes dudas despues de leer el texto no dudes en comentar la idea es aclarar dudas y comprender, por otro lado para mi amigo cripty bienvenido al foro en las primera paginas del post 
encontraras un proyecto de reloj digital donde utilizo interrupciones con el preescaler leelo y si no entienes estamos para colabor ha patico 21 como te fue con tu codigo del mensaje HOLA  , si lo lograte simular te invito a que lo subas con la simulacion en proteus al igual que el proyecto de potenciometros para los miembros de la comunidad que estan aprendiendo este lenguaje de programacion para pics.


----------



## mecatrodatos (Ago 3, 2009)

Electro andres estuve estudiando tu codigo y esta ejecutado en Mikro basic te ayudare con el codigo en PIC Basic Pro ya que Microco estudio no compila  por los comandos: Label,movlw el cual es un comando ASM que se utiliza con la @, == entre otros generandome errores.


----------



## mecatrodatos (Ago 3, 2009)

Que tal amigos este es el  codigo que he realizado para la adquisicion de temperatura por medio del sensor analogo LM35 , Pic 16f877A y conector serie para visualizar la temperatura en el PC por medio de labview
	
	



```
'DEFINICION OSCILADOR EXTERNO                                                        
 
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz

INCLUDE "modedefs.bas"

;DEFINICIONES

;Define parametro de conversion A/D

DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50 

; VARIABLES

Tsample VAR Word    
Mode VAR Byte       
Dummy VAR Byte
D VAR Byte            
Res Var Word         
Temp1 Var Word       
TRISA = 1            
TRISB = 2            
PAUSE 10

Symbol RS232_out = 0 ; RB0 is RS232 output
Symbol RS232_in = 1  ; RB1 is RS232 input

; CONSTANTES

CR CON 13 
LF CON 10
 

;Enviar mensajes por RSR232 

Again:

SEROUT RS232_out,N9600,[LF,CR,"TERMOMETRO DIGITAL CON PIN DE SALIDA RS232"]
SEROUT RS232_out,N9600,[LF,CR," =============================="]

Esample:

SEROUT RS232_out,N9600,[LF,LF,CR,"SEELCIONE TIEMPO DE MUESTREO EN SEG:"]
SERIN RS232_in,N9600,5000,ESample,#TSample
SEROUT RS232_out,N9600,[#Tsample]

EMode:

SEROUT RS232_out, N9600,[LF,CR,"GRADOS C(C) O GRADOS F(F):"]
SERIN RS232_in,N9600,5000,EMode,Mode
SEROUT RS232_out,9600,[Mode]

Estart:

SEROUT RS232_out, N9600,[LF,CR,"PRESIONE ENTER PARA INICIAR…"]
SERIN RS232_in,N9600,5000,Estart,Dummy
SEROUT RS232_out,N9600,[LF,CR]

TSample = TSample*1000 

;inicio conversion

ADCON1 = %10001110      
                         
ADCON0 = %01000001          
                          
More:

D ="C"
ADCIN 0,Res 


Temp1 = 48*Res                       ;Convierte a grados C
Temp1 = Temp1/100



IF Mode ="F" THEN              ;selecionar grados F
Temp1 = Temp1 * 18
Temp1 = Temp1+320
Temp1 = Temp1/10
D = "F"
ENDIF

SEROUT RS232_out,N9600,[LF,CR, #Temp1,D]
PAUSE Tsample
GOTO More
END
```


----------



## mecatrodatos (Ago 7, 2009)

Que amigos he simulado el proyecto en proteus 7.5 con excelentes resultados , corre muy bien y se logra mostrar la tempetura que sensa el LM 35 con buena precision al igual que los mensajes que he enviado a traves de la comunicacion RS 232, me recibe y recepciona datos, sin mas preambulos les anexo lo que llevo ahora me dedicare a que se muestre en la PC la temperatura  por medio grafico utilizando LABVIEW, he conseguido buena información para ello.


----------



## Cesar_8k (Ago 7, 2009)

Hola! Encontré este foro muy interesante sobre microcontroladores PIC en Basic...
Quisiera aportar con el proyecto que se solicitaba de reloj digital con LCD...

En el archivo adjunto está la simulación y el programa...

Solo falta la parte de la alarma [solo unas 5 ó 6 lineas de codigo más]....

una breve explicación del funcionamiento: Al encender el circuito, se carga una hora/fecha al RTC (DS1307), que después puede ser configurada en cualquier monento con los pulsadores (MODO NORMAL). Para esto, har que mantener presionado el pulsador "SET" por un momento (ENTRAS AL MODO CONFIGURACION), y comenzará a parpadear en el display el campo a ser modificado: hora, pulsando otras vez, el cursor cambia a minutos, pulsando otra vez cambia a dia...  Con los botones UP o DOWN_MODE, se cambia el valor del campo seleccionado. Ya cuando se modifican todos los campos, el Reloj sigue normalmente con el último puslo en SET.

Para acceder al modo de la alarma, debes presionar DOWN_MODE en el MODO NORMAL, .... bueno, hasta aqui va el código. Como dije anteriormente, solo falta unas lineas (variables de almacenamiento de la hora de la alarma, configuración...)


Cualquier cosa, duda del codigo, posteala y veremos como solucionamos...
Si encuentras algun bug tambien avisamelo, o si logras hacer el programa mas corto tambien!

Adjunto un screencapt y el modelo con la simulación.
Cabe destacar que la simulacion está en proteus 7.4sp3, con un PIC 16F877A, para migrar a 16F628/A o algun otro, deben revisar los pinouts, y la capacidad de memoria. Recomendaría usar un 628A...


En unos dias subo ya el proyecto completo...


----------



## mecatrodatos (Ago 7, 2009)

El codigo con referente al reloj calentario lo estaba realizando teniendo las siguientes consideraciones, selecionar el dia , el mes ,el año y el uso horario es decir 24 hrs y 12 hrs en el utimo caso apareciendo en el lcd AM y PM respectivamente por medio de tres pulsadores, se podia acceder al menu correspondiente actualizandose el reloj una vez configurado. lo de la alarma  tiene el mismo principio ya que solamente habria que accesar a la memoria EEPROM del pic a utilizar guardar una constante para luego cambiarla por medio de un menu y activarla cuando llegase la hora.

dejo aqui el codigo en pic basic pro es extenso 
	
	



```
'RELOJ CALENDARIO CON PIC 16F84a ,LCD Y DS 1307
'CONFIGURACION OSCILADOR

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 


'CONFIFURACION LCD
		
Define LCD_DREG PORTA	
Define LCD_DBIT 0	
Define LCD_RSREG PORTA	
Define LCD_RSBIT 6	
Define LCD_EREG PORTA	
Define LCD_EBIT 7	
Define LCB_BITS 4	
Define LCD_LINES 2	
Define LCD_COMMANDUS 2000
Define LCD_DATAUS 50	

'CONFIGURACION DS1307 

SQWpin var PORTB.0
SCLpin var PORTB.1
SDApin var PORTB.2
		
'CONFIGURACION DE PINES
		
DecButton var PORTB.4	' Presionar para decrementar
SetButton var PORTB.5	' Presionar para memorizar
IncButton var PORTB.6	' Presionar para incrementar
		
'CPNFIGURACION MESES,DIAS

Data @0,74,97,110,70,101,98,77,97,114,65,112,114
		' Jan Feb Mar Apr
Data 77,97,121,74,117,110,74,117,108,65,117,103
		' May Jun Jul Aug
Data 83,101,112,79,99,116,78,111,118,68,101,99
		' Sep Oct Nov Dec
Data 84,117,101,87,101,100,84,104,117,70,114,105
		' Tue Wed Thu Fri
Data 83,97,116,83,117,110,77,111,110
		' Sat Sun Mon
'CREACION DE VARIABLES

CounterA var byte	
CounterB var byte	
CounterC var byte	
CounterD var byte	
RTCSec var byte		
RTCMin var byte		
RTCHour var byte	
RTCWDay var byte	
RTCDay var byte		
RTCMonth var byte	
RTCYear var byte	
RTCCtrl var byte	
SetTime var byte	
SetSec var byte		
SetMin var byte		
SetHour var byte	
SetDay var byte		
SetMonth var byte	
SetYear var byte	
TimeOut var word	

'CONTANTES DEL PROGRAMA 
ButtonRepeat con 200 

'inicio del programa
goto JumpStart
ConvertBCD:
CounterB=CounterA DIG 1
CounterB=CounterB<<4
CounterB=CounterB+CounterA DIG 0
Return

DisplayMonth:
CounterB=CounterB*3-3	
DisplaySequence:
For CounterA=CounterB to CounterB+2
Read CounterA,CounterD
LCDOut CounterD
Next CounterA
Return

'SUBRUTINA PARA NUMERO DE DIAS Y MESES
FindDays:
LookUp SetMonth-1,[31,28,31,30,31,30,31,31,30,31,30,31],CounterA
If SetMonth=2 then
If (SetYear&$03)=0 then CounterA=29
endif
Return
	
'SUBRUTINA RETARDO DE BOTONES

SetButtonRelease:
LCDOut $FE,1
While SetButton=0:Wend
Pause 250	
Return

JumpStart:
CMCON=%00000111		
TRISA=%00000000		 
TRISB=%11111111		
OPTION_REG.7=0		

Pause 200		

ReDisplay:
LCDOut $FE,1	
ReDisplayLoop:

'RUTINA PARA LEER INTEGRADO DS1307

I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCYear,RTCCtrl]

If RTCSec.7=1 then goto SetUpPreset
If SetButton=0 then
Gosub SetButtonRelease
goto Setup
endif	

'RUTINA PARA MOSTRAR VALOR EN LCD

LCDOut $FE,$80
If RTCHour.6=1 then
CounterA=(RTCHour>>4)&$01
else
CounterA=(RTCHour>>4)&$03
endif
CounterA=CounterA*10+(RTCHour&$0F)
If RTCHour.6=1 then
LCDOut #CounterA
else
LCDOut #CounterA Dig 1,#CounterA Dig 0
endif
LCDOut ":",#(RTCMin>>4)&$0F,#RTCMin&$0F,":"
LCDOut #(RTCSec>>4)&$0F,#RTCSec&$0F," "
IF RTCHour.6=1 then
If RTCHour.5=1 then
LCDOut "PM"
else
LCDOut "AM"
endif
endif

LCDOut " ",$FE,$C0
CounterB=RTCWDay*3+33	
Gosub DisplaySequence	
LCDOut " ",#(RTCDay>>4)&$0F,#RTCDay&$0F," "
CounterB=((RTCMonth>>4)&$0F)*10+(RTCMonth&$0F)
Gosub DisplayMonth
LCDOut " 20",#(RTCYear>>4)&$0F,#RTCYear&$0F,$FE,$80
Pause 250		' Repeat about 4 times/sec
Goto ReDisplayLoop

SetupPreset:
RTCSec=$00		'
RTCMin=$15		
RTCHour=$13		
RTCWDay=$01	
RTCDay=$12		
RTCMonth=$06	
RTCYear=$02		
RTCCtrl=$10		

Setup:
SetTime=RTCHour.6	
If SetTime=1 then
				
SetHour=(RTCHour>>4)&$01
				
else
SetHour=(RTCHour>>4)&$03
			
endif
SetHour=SetHour*10+(RTCHour&$0F)
If SetTime=1 then
If RTCHour.5=1 then
If SetHour<12 then SetHour=SetHour+12
			
else
If SetHour=12 then SetHour=0
endif
endif
SetMin=((RTCMin>>4)&$0F)*10+(RTCMin&$0F)
SetSec=((RTCSec>>4)&$0F)*10+(RTCSec&$0F)
SetYear=((RTCYear>>4)&$0F)*10+(RTCYear&$0F)
SetMonth=((RTCMonth>>4)&$0F)*10+(RTCMonth&$0F)
SetDay=((RTCDay>>4)&$0F)*10+(RTCDay&$0F)
		
CounterC=0		
TimeOut=0		
SetupLoop:
LCDOut $FE,1,"Set "
	
If CounterC=0 then
LCDOut "Mode"
endif
If CounterC=1 then 
LCDOut "Hours"
endif
If CounterC=2 then
LCDOut "Minutes"
endif
If CounterC=3 then 
LCDOut "Seconds"
endif
If CounterC=4 then
LCDOut "Year : 20"
endif
If CounterC=5 then
LCDOut "Month"
endif
If CounterC=6 then
LCDOut "Day"
endif
If CounterC<>4 then LCDOut " :"
		
SetupDisplayLoop:
			
If CounterC=0 then
LCDOut $FE,$8B
If SetTime=0 then
LCDOut "24HR"
else 
LCDOut "12HR"
endif
LCDOut $FE,$8B
endif
If CounterC=1 then
CounterA=SetHour
If SetTime=1 then
LCDOut $FE,$8E
			
If CounterA<12 then
LCDOut "AM"
else
LCDOut "PM"
endif
If CounterA=0 then CounterA=12
If CounterA>12 then CounterA=CounterA-12
endif
LCDOut $FE,$8C,#CounterA
If CounterA<10 then LCDOut " "			
LCDOut $FE,$8C
endif
			
If CounterC=2 then
LCDOut $FE,$8E,#SetMin
If SetMin<10 then LCDOut " "
LCDOut $FE,$8E
endif
			
If CounterC=3 then
LCDOut $FE,$8E,#SetSec
If SetSec<10 then LCDOut " "
LCDOut $FE,$8E
endif
			
If CounterC=4 then
LCDOut $FE,$8D,#SetYear DIG 1,#SetYear Dig 0
LCDOut $FE,$8D
endif
		
If CounterC=5 then
LCDOut $FE,$8C
CounterB=SetMonth
Gosub DisplayMonth
LCDOut $FE,$8C
endif
			
If CounterC=6 then
LCDOut $FE,$8A,#SetDay
If SetDay<10 then LCDOut " "
LCDOut $FE,$8A
endif
	
SetupEntryLoop:
			
If DecButton=0 then
			
If CounterC=0 then
If SetTime=0 then 
SetTime=1
else
SetTime=0
endif
endif
				
If CounterC=1 then
If SetHour=0 then
SetHour=23
else
SetHour=SetHour-1
endif
endif
			
If CounterC=2 then
If SetMin=0 then
SetMin=59
else
SetMin=SetMin-1
endif
endif
If CounterC=3 then
If SetSec=0 then
SetSec=59
else
SetSec=SetSec-1
endif
endif
			
If CounterC=4 then
If SetYear=0 then
SetYear=99
else
SetYear=SetYear-1
endif
endif
If CounterC=5 then
If SetMonth=1 then
SetMonth=12
else
SetMonth=SetMonth-1
endif
					
Gosub FindDays
If SetDay>CounterA then SetDay=CounterA
endif
			
If CounterC=6 then
Gosub FindDays
If SetDay=1 then
SetDay=CounterA
else
SetDay=SetDay-1
endif
endif
Pause ButtonRepeat
TimeOut=0
Goto SetUpDisplayLoop
endif
			
If IncButton=0 then
				
If CounterC=0 then
If SetTime=1 then 
SetTime=0
else
SetTime=1
endif
endif
			
If CounterC=1 then
If SetHour=23 then
SetHour=0
else
SetHour=SetHour+1
endif
endif
				
If CounterC=2 then
If SetMin=59 then
SetMin=0
else
SetMin=SetMin+1
endif
endif
			
If CounterC=3 then
If SetSec=59 then
SetSec=0
else
SetSec=SetSec+1
endif
endif
				
If CounterC=4 then
If SetYear=99 then
SetYear=0
else
SetYear=SetYear+1
endif
endif
			
If CounterC=5 then
If SetMonth=12 then
SetMonth=1
else
SetMonth=SetMonth+1
endif
				
Gosub FindDays
If SetDay>CounterA then SetDay=CounterA
endif
				
If CounterC=6 then
Gosub FindDays
If SetDay=>CounterA then
SetDay=1
else
SetDay=SetDay+1
endif
endif
Pause ButtonRepeat
TimeOut=0
Goto SetupDisplayLoop
endif
		
If SetButton=0 then
CounterC=CounterC+1
				
TimeOut=0
If CounterC>6 then
			
LCDOut $FE,1,"Memorizar"
				
CounterA=SetHour
If SetTime=1 then
If CounterA>12 then CounterA=CounterA-12
If CounterA=0 then CounterA=12
endif
Gosub ConvertBCD
RTCHour=CounterB
					
If SetTime=1 then
RTCHour.6=1
					
If SetHour=>12 then RTCHour.5=1
					
endif
				
CounterA=SetMin
Gosub ConvertBCD
RTCMin=CounterB
				'
CounterA=SetSec
Gosub ConvertBCD
RTCSec=CounterB
				
CounterA=SetYear
Gosub ConvertBCD
RTCYear=CounterB
				
CounterA=SetMonth
Gosub ConvertBCD
RTCMonth=CounterB
				
CounterA=SetDay
Gosub ConvertBCD
RTCDay=CounterB
			
CounterA=SetYear+4
CounterB=SetMonth
If SetMonth<3 then
CounterA=CounterA-1
CounterB=CounterB+12
endif
CounterD=(SetDay+(153*CounterB-457)/5+365*CounterA+CounterA/4-CounterA/100+CounterA/400+2) MOD 7
RTCWDay=CounterD+1
I2CWrite SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCYear,RTCCtrl]
Pause 1000
Gosub SetButtonRelease
Goto ReDisplay
endif
Gosub SetButtonRelease
Goto SetupLoop	
endif

Pause 1		
TimeOut=TimeOut+1
If TimeOut>20000 then goto ReDisplay
Goto SetupEntryLoop	
End
```

Espero le sea de utilidad a nuestro amigo electroandres


----------



## mecatrodatos (Ago 7, 2009)

ya vi el ejemplo amigo mecatrodatos, para ser sincero es la segunda vez y acabo de ver la "LUZ", jaja ya entendi; pero pero el preescaler esta a1:1 que pasa si pongo a 1:16; ademas tengo una duda con  *el harward de ccp* que vienen en los micro como el 16f628A; esto trabaja en 2do plano?

Amigo cripty no entiendo a que haces referencia con lo del  *el harward de ccp*, he trabajado con este micro y posee tres Timers que los puedes configurar con los registros OPTION y INTCON respectivamente.

Para definir la rata del prescaler debes utilizar el registro OPTION por ejemplo :


OPTION_REG =% 01010110  'prescaler 1:128, asignado al TMR0 y con ciclo de reloj interno.

te dejo el link de descarga del Data sheet del pic 16f628A 

[/url]
http://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf


hay se explica mejor  la utilizacion del prescaler para este micro.


----------



## mecatrodatos (Ago 7, 2009)

Que tal amigo lectroandres interprete mal su proyecto creo que no deseas utilizar el integrado DS 1370 por lo que te anexo un proyecto con alarmas un reloj de clases.

El proyecto consiste en visualizar jornadas de estudio de 6:00 AM a 12:00 AM hora en 
que empieza y culmina la jornada mañana con sus respectivos mensajes visualizados en 
el LDC activandose una alarma durante tres segundos el mismo procedimiemto se repite 
para la jornada tarde.

Al activar el boton comienzo se da inicio a la jornada mañana, se puede incrementar
los minutos en el boton minus , los mensajes apareceran siempre que se ejecute el 
cambio de jornadas programas:

6:00 am ini. clases j.m
12:00 pm ter. calses j.m
12:300 pm ini. clases j.t
6:30 pm ter. clase j.t

Lo habia reralizado para un evidencia de estudio  te anexo todo lo necesario espero que esto sea lo que necesites o te ayude a realizarlo.


----------



## electroandres (Ago 7, 2009)

yo no quiero hacer eso, nada mas quiero saber como puedo hacer para que suene la alarma sin que se pare el conteo de segundos. Nada mas eso, lo demas ya esta


----------



## cripty (Ago 7, 2009)

gracias por la hoja de datos amigo mecatrodatos, pero existian 2 preguntas, la primera ya me la respondiste; en la segunda yo me refiero al modulo de PWM que tiene el PIC16f628 y quiero saber cual es la diferencia si lo programo por hardware (registros) y si uso el comando hpwm del pic basic pro; cual seria la diferencia?


----------



## mecatrodatos (Ago 7, 2009)

Que tal amigo cripty en el caso de este tipo de micros puedes seleccionar lineas de programa para configurar los registros para establecer el PWM con el comando @ en donde realizas lineas en asembler en mi caso utilizo el comando PWM  de pic basic pro al pin de salida del micro pero hay las dos opciones y el entorno de microcode estudio las compila.[/quote]


----------



## mecatrodatos (Ago 8, 2009)

Para mi amigo cripty te anexo documento de utilizacion de los registros del pic 16f628A para la operacion del pwm por hardware sin la utilizacion del comando PWM en el entorno de microcode studio  aqui esta el codigo
	
	



```
; Programa PWM con Hardware con el pic 16f628A con un ciclo util del 50% 
;y frecuencia de 38 KHZ aproximadamente 

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

CMCON     = 7          ' PUERTO A DIGIAL
VRCON     = 0          ' A/D Voltage referencia deshabilitado
TRISB     = %11110000  ' B.3=PWM,B.0,B.1,B.2 LEDs
PR2       = 25         ' Seleecion PWM para aproximadamente 38KHz
CCPR1L    = 13         ' PWM Duty-Cycle a 50%
CCP1CON   = %00001100  ' modo de seleccion = PWM
T2CON     = %00000100  ' Timer2 ON + 1:1 prescaler

LOOP:
   
high PortB.0
pause 50
low PortB.0
pause 50
high PortB.1
pause 50
low PortB.1
pause 50
high PortB.2
pause 50
low PortB.2
pause 50
goto LOOP
```

Por ultimo es conveniente tener la hoja de caracteristicas del pic que se va ha utilizar y aprovechar mejor su memoria por lo que se conoce mejor la estructura interna del micro, en el caso de los micros que no poseen registro PWM es conveniente utilizar el comando PWM que nos facilita PBP para realizar la modulacion de ancho de pulso que necesitemos como en el caso del pic 16f84A por ejemplo:

```
; Programa PWM con el pic 16f84A con un ciclo util del 50% 

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

PWM portB.3,127,30 ; Sacar 30 pulsos PWM por el puerto b3 con un ciclo util del 50%
```


----------



## mecatrodatos (Ago 9, 2009)

Amigo electroandres te he facilitado codigos no es para que los realices sino para que los analises y puedas utilizarlos como una base para lo que deseas desarrollar, si pones a corres en proteus el proyecto de  horario de clases te daras cuenta que se activan las alarmas sin afectar el programa principal es decir sin detenerse el conteo en segundos que es lo que pasa en tu caso, te recomiendo realices una subrutina cuando la hora este acorde con la alarma y se active una salida luminosa , sonido (activacion de un parlante), con un GOSUB que es un especie de GOTO, por ejemplo :
	
	



```
IF (hour=3) and(minu=13)= then GOSUB alarma ; si son las 3:00 ir a alarma
.
.
.
alarma:
SOUND porta.0[100,20,50,20]   'generar tonos por el puerto A0 Donde puede estar ubicado un parlante , un led 
RETURN                                     ; regresar al comando que lo lllamo
```


----------



## cristian2009 (Ago 14, 2009)

Hola, tengo un problema al querer leer un teclado matricial 4x4 en picbasic. con un pic 16F874 simulado en proteus. Para detectar cuando se presiona una tecla, utilizo la interrupcion de cambio de estado de los puertos RB4 a RB7 para las filas del teclado, y los puertos C0 a C3 para las columnas. El primer problema que aparece es q no me reconoce la tecla exacta si la pulsacion es muy breve, me toma uan tecla incorrecta. Quisiera saber como hacer para deshabilitar la interrupcion una vez q estoy dentro de la rutina de interrupcion..es decir si mantengo presionada una tecla, q no se vuelva a activar la interrupcion hasta soltar la misma y poder procesar bien el dato. La idea es almacenarlo en VAR1 y mostrarlo en el display BCD del puerto A.  
Tengo diversos problemas con esto y necesitaria ayuda de gente mas experimentada.
Adjunto el codigo y agradeceria si alguien puede tomarlo y corregirlo o ayudarme a hacerlo. Muchas Gracias.[/b]
	
	



```
DEFINE LCD_DREG PORTD			'UTILIZO PORTB COMO DATOS
DEFINE LCD_DBIT 4				'LE INDICO QUE UTILIZO MODO DE 4 BITS
DEFINE LCD_RSREG PORTB			
DEFINE LCD_RSBIT 1				' RS EN PORTB.1
DEFINE LCD_EREG PORTB			
DEFINE LCD_EBIT 0				'ENABLE BIT EN PORTB.0
DEFINE LCD_LINES 2				'LCD DE DOS LINEAS
DEFINE LCD_COMMAMDUS 2000		
DEFINE LCD_DATAUS 50

DEFINE OSC 20
DEFINE ADC_SAMPLEUS 50


TRISA = %00000000
TRISB = %11110000
TRISC = %00000000
TRISD = %00001111
TRISE = 0
CONTADOR VAR BYTE
TECLA VAR WORD
CLAVE VAR WORD
DIG1 VAR BYTE
DIG2 VAR BYTE
DIG3 VAR BYTE
DIG4 VAR BYTE
CODIGO VAR BYTE

PRUEBA VAR BYTE
VAR1 VAR BYTE




	PORTC.0=0
	PORTC.1=0
	PORTC.2=0
	PORTC.3=0
	
	Pause 500
 	'ADCON1=%00000110
 	CONTADOR = 1
 
 	'PORTA=%00000011
	INTCON.0=0			'BORRO FLAG
	INTCON.7=0


		
		PORTA = 0
		
			Low PORTB.2
				
				Pause 500
				
		ON INTERRUPT GoTo APRETO
		 INTCON = %10001000		
		 Pause 300
		 VAR1=0



		 
LOOP:   INTCON = %10001000
		PORTC = 0
	
		
	
		LCDOut $Fe,$C0,DEC(VAR1)
		Pause 300
	
	
		
		Disable
		
		PORTA=VAR1
		
GoTo LOOP
	
	
	

APRETO: INTCON.7=0		'DESAHBILITO TODAS LAS INT.
		INTCON.3=0		'DESHABILITO RB4-RB7 INT.
		INTCON.0=0
		
		Disable
	PORTC = 0
	
	
	
	PORTC.0 = 0     ' Columna 1 = 0
	PORTC.1 = 1     ' Columna 2 = 1
	PORTC.2 = 1     ' Columna 3 = 1
	PORTC.3 = 1		' Columna 4 = 1

	IF PORTB.4 = 0 Then VAR1 = 7 		' tecla "7"
	IF PORTB.5 = 0 Then VAR1 = 4		' tecla "4"
	IF PORTB.6 = 0 Then VAR1 = 1		' tecla "1"
	IF PORTB.7 = 0 Then VAR1 = 20		' tecla "*"
	
	
	
	
	PORTC.0 = 1     ' Columna 1 = 1
	PORTC.1 = 0     ' Columna 2 = 0
	PORTC.2 = 1     ' Columna 3 = 1
    PORTC.3 = 1		' Columna 4 = 1

	IF PORTB.4 = 0 Then VAR1 = 8 		' tecla "8"
	IF PORTB.5 = 0 Then VAR1 = 5		' tecla "5"
	IF PORTB.6 = 0 Then VAR1 = 2    	' tecla "2"
	IF PORTB.7 = 0 Then VAR1 = 0		' tecla "0"
	
	
	
	
	
	
	
	PORTC.0 = 1     ' Columna 1 = 1
	PORTC.1 = 1     ' Columna 2 = 1
	PORTC.2 = 0     ' Columna 3 = 0
    PORTC.3 = 1		' Columna 4 = 1

	IF PORTB.4 = 0 Then VAR1 = 9 		' tecla "9"
	IF PORTB.5 = 0 Then VAR1 = 6		' tecla "6"
	IF PORTB.6 = 0 Then VAR1 = 3    	' tecla "3"
	IF PORTB.7 = 0 Then VAR1 = 40		' tecla "#"
	
		
	
	
	Resume
	Enable
```


----------



## mecatrodatos (Ago 16, 2009)

Que tal compañeros dejo un aporte de lectura de un teclado 4x4  con visualizacion en lcd 2x16 con sus repectivos mensajes el codigo fuente , simulacion en proteus ,esquematico y formato de imagenes de funcionamiento esta en documento anexo.[/code]


----------



## mecatrodatos (Ago 17, 2009)

les comento ya relice le montaje del proyecto de adquisicion de datos de temperatura del sensor lm35 a traves de labview con excelentes resultados  utilizando como base los programas de ejemplos que ofrece el entorno labview pero posteriormente realice un prueba de comunicacion con el serial communicator del entorno de microcode studio obteniendo tambien buenos resultados. Anexo la imagen obtenida de labview.


----------



## Patico21 (Ago 17, 2009)

para mas referencias adjunto el circuito y el programa 


```
@devicext_osc ; oscilador externo XT 

define osc 4
define LCD_DREG PORTD
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 4


P1 VAR BYTE
P2 VAR BYTE
P3 VAR BYTE

ADCON1=%100

INICIO:
PAUSE 300
POTEN1:
    ADCON0=%1000001
    GOSUB MEDIR
    P1= ADRESH
POTEN2:
    ADCON0=%1001001
    GOSUB MEDIR
    P2=ADRESH
POTEN3:
    ADCON0=%1011001
    GOSUB MEDIR
    P3=ADRESH
    
PAUSE 200
X=(P1*500)/254  'ESTA ES LA OPERACION QUE QUISE IMPLEMENTAR
Y=(P2*30)/254   'ESTA ES LA OPERACION QUE QUISE IMPLEMENTAR TAMBIEN PARA MI OTRO EJE

LCDOUT $FE,1
LCDOUT $FE,$1,"E.LONGITUDINAL:"
LCDOUT $FE,$8C,DEC X
LCDOUT $FE,$C0,"E.TRANSFERSAL:"
LCDOUT $FE,$CC,DEC Y

GOTO inicio

MEDIR:
    PAUSE 50
    ADCON0.2=1
    PAUSEUS 50
    RETURN
END
```


----------



## mecatrodatos (Ago 17, 2009)

Patico 21 interesante el proyecto claro que pueden tomar valores decimales en estos dias realice un voltimetro digital de 0 -5 DC te dejo el codigo 
	
	



```
' Programa de voltimetro con pic basic pro de tension (0-5VDC) e ilustracion en 
' LCD con 2 decimas a traves de pic 16f877A. 

'definicion de Oscilador externo

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz


Define	LOADER_USED	1

' Definicion de configuracion de pines para comunicacion con lcd a 4bits.

DEFINE  LCD_DREG        PORTB
DEFINE  LCD_DBIT        4
DEFINE  LCD_RSREG       PORTB
DEFINE  LCD_RSBIT       0
DEFINE  LCD_EREG        PORTB
DEFINE  LCD_EBIT        1                                      

' Definicion de parametro de conversion A/D 

DEFINE  ADC_BITS        10     	' Selecionar numero de bits conversion A/D 
DEFINE  ADC_CLOCK       3     	' Selecionar reloj interno de conversion A/D
DEFINE  ADC_SAMPLEUS    50    	' Selecionar tiempode conversion Useg

'creacion de variable y configuracion puertos del pic 16f877A

adval	Var	Word	'Variable donde se va ha guardar medida obtenida
TRISA = %11111111	' Selecionar PORTA como entrada 
ADCON1 = %10000010	' Selecionar PORTA analogo 
Low PORTB.2		    ' LCD R/W colocado a cero logico(W)
Pause 500       	' esperar 0.5 second

'Inicio del programa

voltimetro:
	
Adcin 0, adval		'leer canal cero y guardar resultado en al avariable adval
adval = (adval */ 500)>>2	'lectura de tension 
LCDOut $fe,1   	' Clear LCD
LCDOut $fe,2,"VOLTS DC:",DEC (adval/100),".", DEC2 adval 'mostrar en LCD  
Pause 100       	' esperea 100mseg
Goto voltimetro       ' volver medir 
End

Analizalo que te puede servir para lo que pretendes hacer te anexo imagen de funcionamiento
```


----------



## Patico21 (Ago 18, 2009)

hola muchas gracias por el codigo lo estoy tratando de analizar pero al mirarlo me ha dejado una impresion esta linea de codigo adval = (adval */ 500)>>2 en particular porque utilizas seguido */ no entiendo cual es esta expresion porque se supone que normalmente en otros lenguajes de programacion el caracter * es para multiplicar y / es para dividir me podrias explicar eso por favor


----------



## cripty (Ago 19, 2009)

eso significa modulo, es la operacion por la cual te devuelve el resto de una division; imaginalo asi si deseas decimales, cosa que no sonsigues directamente por pic basic pro, lo mejor es multiplicar y dividir asi obtienes el decimal pero sin la como; asi
5/2=2,5 pero en PBP me arroja solo 2  pero asi hago 5*10/2=25 asi obtuve el decimal solo le pongo la coma; otra forma es 5/2 =2 (segun PBP) y 5*/2 =1 (resto de la division) ahora a este resto 1*10/2=5
asi que ahora solo coloco en el lcd 2 (resultado de la primera operacion) y 5 (resultado de la ultima operacion) y la coma al medio de los dos


----------



## Patico21 (Ago 20, 2009)

hola gracias por responder mira en un manual o algo asi de PBP mire que << es para desplazamientos izquierdo y >> para desplazamiento derecho eso no se la verdad para que sirve me podrias explicar y eso de los decimales mas o menos me di cuenta pero como puedo hacer para que la los decimales aparezcan al mover mi potenciometro un poco aparezca 0.1 y a medida que vaya moviendo pueda verlo 0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1....ahora tengo otra duda talvez bien torpe peron no entiendo por ejemplo tengo mi potenciometro que lo lee de 0 a 255 pero para mi conveniencia lo quiero transformar a otra escala es decir de 0 a 500 lo mas facil que se me ocurrio era (P1*500/255) p1 es mi variable pero al mirar en el LCD en 0 era 0 estaba bien en la mitad del potenciometro meda 256 pero sigo abanzando se baja a 4 y al final me da 255 y eso me tiene muy confundido...ahora tambien quiero restarle a mi variable p1-10 me comienza en 6225 o algo asi y al seguir avanzando sigue la escala no entiendo puedes darme una mano con eso por favor con lo de los decimales para que lo mires te adjunto la simulacion y el programa.


----------



## cripty (Ago 20, 2009)

en base decimal (la que usamos) si tienes el numero 14 y usas el desplazamiento Ej. 14<<2 nos dara como resultado 1400 se desplazaron los digitos 2 lugares hacia la izquierda es como multiplicar por 100 o 10 al cuadradolo mismo sucede en binario si tienes el numero b=%11101100 y realizas a=b<<4 todo se desplaza hacia la izquierda 4 lugares (que es igual a multiplicar por 2^4)y los lugares vacios de completan con ceros por lo tanto a=%11000000 y si realizas a=b>>4 el valor de a sera a=%00001110 ahora yo asumi que las variables son de tipo byte por eso lo que sale de los 8 bits se pierde, no lo probe pero creo que ese es el problema de tu programa el adc es de 10 bits creo y tus variables son de 8 bits mientras la cuenta no exceda 255 (8 bits) todo esta bien pero si se excede por lo menos 1 existe un desborde, imagina si tu variable b esta en 255 b=%11111111 y si pasa a 256 b=%100000000 que tiene 9 bits pero la variable solo vera los 8 menos significativos es decir la variable que vera el micro es b=%00000000 y el cree que es 0 si la variable es mas grande (word) esto ocurrira en un limite distinto y mas grande a las cuentas en 8 bits . pruebalo yo me dare un tiempo y vere bien tu simulacion y codigo y ver en que te ayudo


----------



## cripty (Ago 20, 2009)

le acabo de dar otra mirada y dime si un byte almacena hasta 255 cuando haces p1*500 ya excediste los 255 y se perdieron bits y al dividir, lo haces solo con lo que quedo de la operacion anterior; ahora todo sale bien mientras tus calculos no excedan a 255 por eso todo va bien hasta cierto punto; cambia el tamaño de tus variables teniendo en cuenta el numero maximo que puedes obtener.


bye


----------



## Patico21 (Ago 21, 2009)

hola amigo gracias por contestar ahora me queda un poco mas claro es decir que se opera con numeros binarios o me equivoco en lugar de decimales  ops: ......osea que debo cambiar mis variables en lugar que sean byte deben ser word... ahora no entiendo porque al restar de mi variable es decir 255-10 comienza de 656525 o algo asi cuando lo pongo en cero eso si no entiendo ojala me pudieras explicar por favor y de nuevo muchas gracias


----------



## cripty (Ago 21, 2009)

el PBP te da la facilidad de operar en decimal, pero algunas instrucciones son de operacion en binario como los desplazamientos y las operaciones logicas bit a bit ( & AND, | OR,  ^ NOT). ahora con respecto a la resta, es algo parecido al desbordamiento solo k cuando tienes un numero y le restas uno mayor, la resta va de maravillas mientras no excedas la variables  es decir si tus variables son de tipo byte; b=255
si haces c=b-150, no tienes problemas incluso con c=b-255 pero si se te ocurre hacer c=b-256 como la variable c es byte lo que sucede es (imaginando que b=255) c=b-255-1 entonces c=0-1 esto en binario es c=%00000000 - %00000001 ; la respuesta no puede ser negativa asi que el micro hace lo siguiente asume que c=%100000000 - %00000001 (pero recuerda que b es tipo byte) y la respuesta seria c=%011111111 pero c es byte y solo toma los 8 bits de la derecha es decir c=%11111111 que en decimal es 255; en resumidas cuentas cuando se llega al maximo de la variable se reinicia la cuenta ascendente 254, 255, 0, 1,2... y si se llega a cero se cuenta del maximo hacia atras 2,1,0,255,254,253...; espero haberte ayudado, cuando yo comence con los micros lo hice con mas dudas y nadie me ayudo mucho solo los libros e internet me ayudaron; y para que me sirve saber algo si no lo comparto.

cuidate bye


----------



## mecatrodatos (Ago 22, 2009)

Excelente amigo crpty esa es la actitud,entre todos aprendemos cosa nuevas, no se si sea pertinente pero dejo a concentimiento para desarrollar proyectos con pic basic pro  y el entorno virtual de Labview o abrir otro hilo a mi parecer seria excelente ya que no he encontrado información en español referente a este tema de una forma consisa lo primero que se haria seria un tutorial para posteriomente trabajar con este entorno,y por ejemplo desarrollar tarjetas de comunicacion serial para controlar actuadores desde la PC como el ejemplo del caso de la temperatura con el LM 35 con rsr 232, control de motores desde la PC, entre otros proyectos que tengo planeados desarrollar y compartir con los miembros de este foro. 

Espero comentarios


----------



## Patico21 (Ago 23, 2009)

hola amigo cripty gracias por la respuesta mira lo que yo estoy haciendo es multiplicar 255 por 2 me queda 510 y lo que hago es restar 10 para que me quede 500 como he querido hacer y sigo intentando y nada de nada me pasa lo que sucede coloque como me dices para que no me de numeros negativos pero sigue de esa misma manera es del desbordamiento no me queda claro la verdad me toca analizarle bien y entender lo que me quieres decir muchas gracias por la ayuda y el acolite y no ser egoista con los que sabes....
amigo mecatrodatos seria muy interesante si pudieras desarrollarlo con los micros 18f2550 y 18f4550 para que sea muy completo y poderlo hacer desde USB talvez sea pensar demasiado alto bueno seria chevere disculpando el atrevimiento ya que uno apenass comienza en esto de los micros


----------



## mecatrodatos (Ago 23, 2009)

amigo mecatrodatos seria muy interesante si pudieras desarrollarlo con los micros 18f2550 y 18f4550 para que sea muy completo y poderlo hacer desde USB talvez sea pensar demasiado alto bueno seria chevere disculpando el atrevimiento ya que uno apenass comienza en esto de los micros[/QUOTE

Claro patico 21 esa es la idea realizaremos algunos ejercicios con cominicacion RSR 232 con el pic 16f877A y posteriormente con el PIc 18f2550, mirare tu codigo de los potencimetros y te dare algunos comentArios paRa resolver tu problema de visualizacion en lcd,seria interesante realizarlo desde comunicacion serial como sugerencia.


----------



## mecatrodatos (Ago 23, 2009)

que tal vamos con otro proyecto de teclado matrixal pero de visualizacion de letras (A;B;C;D;*;#) he aqui el codigo :


```
; programa de visualizacion de teclado 
'          1 2 3 A 
'          4 5 6 B
'          7 8 9 C
'          * 0 # D
' con pic 16f877A y lcd 2x16 en donde muestra la tecla presionada en la pantalla
' del LCD utilizando operandos matematicos del PBP. 


'Definir libreria  
Define	LOADER_USED	1


'definir oscilador externo
@ device xt_osc
define osc 4

' Define LCD connections
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTD
Define  LCD_RSBIT       3
Define  LCD_EREG        PORTD
Define  LCD_EBIT        2


' Definicion de variables
col     Var     Byte            '  columnas
fila    Var     Byte            ' filas 
B       Var     Byte            ' numero 
A       Var     Byte            ' tecla a visualizar



OPTION_REG.7 = 0        ' Activa resistencias internas PORTB 
ADCON1 = 7              ' PORTA y PORTE digital
Low PORTD.1             ' LCD R/W low (escritura)
Pause 100               ' tiempo para inicializar el LCD
Lcdout $fe, 1, "PRESIONE TECLA"  ' mensaje 

inicio:
Gosub leer            
Lookup A, ["0123456789*#ABCD"],B
Lcdout $fe,1,B      ' mostrar tecla primida
Goto inicio              


' Subrutina para leer tecla pulsada 
leer:
Pause 50                ' esperer 50ms

leer0:
PORTB = 0               ' puerto B como salida
TRISB = $f0             
If ((PORTB >> 4) != $f) Then leer0    
Pause 50                

leer1:
For col = 0 To 3       
PORTB = 0       
TRISB = (dcd col) ^ $ff 
fila = PORTB >> 4        'leer filas 
If fila != $f Then tecla     
Next col
Goto  leer1           

tecla: 
B = (col * 4) + (ncd (fila ^ $f)) - 1

' transformadorrmacion de tecla activada 
' 10 = *
' 11 = #
' 12 = A
' 13 = B
' 14 = C
' 15 = D
Lookup B, [1,2,3,12,4,5,6,13,7,8,9,14,10,0,11,15],A
Return                  ' retornar 
End
```

Como siempre dejo la simulacion en proteus , codigo fuente y esquematico "comentar es agradecer"


----------



## Patico21 (Ago 31, 2009)

hola amigos otra vez por aqui solicitando su ayuda quisiera poder utilizar mi codigo que lo he posteado anteriormente pero ahora quiero activar un mensaje a travez de un boton que me diga memoria llena lo he logrado pero independientemente al codigo que quiero anadirle si lo pego tan solo o solo se ejecuta el nuevo codigo o el codigo anterior como debo hacer para que funcionen el codigo del conversor analogo digital cuando no pulse el boton y al pulsar el boton me despliegue el mensaje de mamoria llena les añado el codigo ojala me puedan ayudar por favor



```
@devicext_osc ; oscilador externo XT 
define osc 4
define LCD_DREG PORTD
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 4
P1 VAR BYTE
P2 VAR BYTE
P3 VAR BYTE
boton var portb.0
ADCON1=%100
INICIO:
PAUSE 300
POTEN1:
    ADCON0=%1000001
    GOSUB MEDIR
    P1= ADRESH
POTEN2:
    ADCON0=%1001001
    GOSUB MEDIR
    P2=ADRESH
POTEN3:
    ADCON0=%1011001
    GOSUB MEDIR
    P3=ADRESH
p1=(p1*500/255)
p2=(p2*30/255)
 
LCDOUT $FE,1,"POT1 POT2 POT3"
LCDOUT $FE,$c1,#p1
lcdout $FE,$c6,#P2
LCDOUT $FE,$cb,#P3
GOTO inicio
MEDIR:
    PAUSE 50
    ADCON0.2=1
    PAUSEUS 50
    RETURN
pro:                       'desde aqui es el pedazo de codigo que quisiera 
if boton=0then encen       'que se  muestre cuando pulse el boton 
lcdout $fe,1               '
goto pro                    '
encen:                       '
pause 200                     '
lcdout $fe,1,$82,"MEMORIA LLENA" '
lcdout $fe,$C0,"***PRECAUCION***" '
goto pro                           '
END
```


----------



## Jesus Carmona (Sep 20, 2009)

Hola amigos, soy nuevo en la programacion en PBP y tengo una duda con respecto a como mover el contenido de un dato en la LCD hacia la izquierda o derecha a traves del comando LCDOUT... Regularmente lo hacía com assembler pero no lo se hacer en PBP. Agradezco el apoyo que me puedan brindar en este requerimiento con ejemplos de instrucciones que contengan desplazamientos de valores tal como la introduccion de datos en una calculadora o la escritura con un editor de texto cualquiera (cursor activo, borrar datos, etc) Saludos a todos


----------



## atricio (Sep 21, 2009)

hola intenta esto te puede ayudar


----------



## rfandres (Sep 22, 2009)

Buen día, mi idea es censar 2 o mas temperaturas con distintos censores y visualizarlo en el mismo LCD cambiando la selección con un pulsador. Pero no pude lograr con figurar las 2 entradas veo una o la otra, alguien me puede ayudar? 
Gracias


----------



## atricio (Sep 22, 2009)

pues la verdad no se me ocurre como hacerlo pero la mas facil es con un switch  o porque no le haces una cosa mas vacana hazlo con un barrido por ejemplo una caratula primero luego de un x tiempo lo avanzas a la temperatura 1 y despues a la temperatura 2 y despues otra vez a la caratula...se veria vacano asi bueno para mi es una idea nada mas


----------



## mecatrodatos (Sep 22, 2009)

Que tal amigos para mi amigo patico en estos dias subo la forma de visualizar en lcd movimiento en distancia por medio de potenciometros a forma real, para mi amigo  gregoril bedoya claro que si es posible pero debes tener en cuenta el nivel de tension maxima que otorga la fuente para realizar el acondicionamiento se señal y ser visualizado el valor real en un dispositivo grafico(display ,lcd),por otro lado te recomiendo amigo rfandres realizar un menu y con ello visualizar las temperaturas sensadas por lo sensores que utilizaras que pueden ser analogo o digitales.


----------



## rfandres (Sep 23, 2009)

logre pasar los menu con el mismo pulsador, aca se los dejo.



```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2009 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 7/25/2009                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
 
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
; Definicion de conexiónes del LCD
DEFINE LCD_DREG PORTB          ; LCD bits de conucacion al LCD 
DEFINE LCD_DBIT 0              ; Coneccion puerto B (RB0,RB1,RB2,RB3) 
DEFINE LCD_RSREG PORTB         ; LCD bit RS conectado a PORTB
DEFINE LCD_RSBIT 4             ; LCD bit RS conectado a puerto B (RB4)
DEFINE LCD_EREG PORTB         ; LCD bit E conectado a PORTB
DEFINE LCD_EBIT 5              ; LCD bit E conectado a puerto B (Rb5)
DEFINE LCD_BITS 4              ; LCD comunicado 4Bits 
DEFINE LCD_LINES 2             ; LCD de 2 lineas 

; definicion de parametros de conversion A/D 
DEFINE ADC_BITS 8           ; numero de bit conversion A/D
DEFINE ADC_CLOCK 3           ; reloj interno RC usado en conversion A/D
DEFINE ADC_SAMPLEUS 50       ; tiempo de conversion en Us
; Creacion de Variables
Sensar  Var Word      ; Variable donde se guarda el resultado de conversion A/D
Temp Var Byte ; Temperatura en grados centigfrados (C)
TRISA =1      ; RA0 (AN0) es donde se conecta pin OUT del LM35
TRISB =0             ; PORTB es salida
PAUSE 500             ; 0.5s para inicializar LDC
; inicializacion conversor A/D 
ADCON1 = 0            ;ANO entrada analoga
                         
ADCON0 = %11111111        
LCDOUT $FE, 1        ;limpiar LCD 
; Programa principal e inicio de la conversion A/D
LOOP11:
LCDOUT $FE, 1        ;limpiar LCD 
LOOP:
ADCIN 0,Sensar             ;Lee canal 0 y guardar en variable sensar
Temp = 2*sensar           ;Conversion a grados centigrados 
LCDOUT $FE,$80, "TEMP. MOTOR"
LCDOUT $FE,$c0,"TEMPERATURA:",DEC2 Temp,"C" ;mostrar valor decimal en LCD 
pause 200
if porta.4=1 then loop1
goto loop
LOOP1:
LCDOUT $FE, 1        ;limpiar LCD 
LOOP12:
ADCIN 1,Sensar             ;Lee canal 0 y guardar en variable sensar
Temp = 2*sensar           ;Conversion a grados centigrados 
LCDOUT $FE,$80, "TEMP. INTERIOR"
LCDOUT $FE,$c0,"TEMPERATURA:",DEC2 Temp,"C" ;mostrar valor decimal en LCD 
pause 200
if porta.4=1 then loop11
goto loop12
                  
END                        ;fin del programa
```


----------



## cripty (Sep 26, 2009)

despues de mucho tiempo, regrese y estoy en un nuevo proyecto que es algo un poco mas enfocado a la potencia; tengo que encender un triac o un diac de potencia en el cruce por cero de la tension que para la aplicacion es generalmente 440 o 380 voltios en alterna espero me den ideas acerca de como hacer saber al micro que la onda esta en el cruce por cero.
cuidense mucho amigos


----------



## robtz (Sep 27, 2009)

hola cripty, aver si entendi necesitas saber la onda de pulsos solo cuando hay cruce por cero si es asi lo podrias hacer con un puente de diodos, lo cual te rectificaria la onda sinusoidal a 380 onda completa (1N4007 x4),un optotransistor,dos resitencias una de 68-100k para ingreso del opto y la otra resist. de 4,7k  a la salida de optotransistor en pull up a 5 vdc esta salida ingresaria al uc.
PD:espero te pueda servir


----------



## atricio (Sep 27, 2009)

si pudieras postear un diagrama seria buanzo amigo como debo conectar el opto y que opto debo utilizar


----------



## cripty (Sep 27, 2009)

bien pero la onda de tension real no es perfecta es distorcionada, tengo que hacercarme lo mas al cruce por cero asi enciendo al triac y la bobina de un contactor, esto hara que el triac sea el primero en conducir minimizando el arco en los contactos del contactor (mucha recundancia???); el problema es que si existen muchos cruces por cero (efecto de la deformacion de la onda senoidal) el contactor no sabra si cierra o abre ya que le enviare muchos pulsos (un pulso por cada cruce por cero) y asi no puede trabajar el contactor.

y si seria bueno que postees un diagrama de lo que propusiste asi lo analizamos todos.
gracias por las respuestas amigos.


----------



## robtz (Sep 27, 2009)

alli envio un esquema que podria ayudar, adicionando un optotriac sin cruce y tambien puede ser usar el optotriac con cruce por cero

ueno los diodos deberan ser 1n4007


----------



## cripty (Sep 27, 2009)

si tienes micha razon pero imagina lo siguiente: mi sistema es trifasico y el cruce por cero es para evitar el arco en los contactores (que lo desgastan) pero teniendo el desfasaje en que momento cierro el contactor ya que al cerrar este se cierran los 3 contactos en una ; los triacs los puedo disparar alternadamente pero no al contactor.adjunto mi esquema para que me ayuden a resolverlo.


----------



## robtz (Sep 27, 2009)

permiteme entender,estas que utilizas un contactor para las 3 fases(hay que tener en cuenta el retardo propio del contactor que este es los milisegundos) y con un solo contactor seria dificil e inclusive con 3 contactores por separado ya que el interes es eliminar el arco en cada fase(complicado por los retardos propios de cada contactor)


----------



## cripty (Sep 27, 2009)

ahora que lo pienso basta que una fase este en cruce por cero al momento de cerrar el contactor y ya disminuiria el arco; si a esto se suma que los triac's tienen un retardo menor que el contactor solo seria necesario un cruce por cero de una fase y activar los triacs y el contactor y con un poco de suerte en el tiempo de retardo del contactor este cierre para el cruce por cero de alguna de las otras 2 fases. o en su defecto cerrar los triac's cada uno en el cruce por cero y despues el contactor solo es cuestion de probar cual de las opciones anteriores es la que aplaca mas al arco.
implementare un circuito para povar lo anterior y les comento como va; pero acabo de tener una duda y como mediria el arco en los contactos del contactor?
en fin eso ya lo resolvere, gracias por las luces amigos


----------



## rfandres (Sep 28, 2009)

Buenas, quiero saber si se puede regular la tensión de salida del PIC, ósea que en ves de ser 5V la salida sea de 2.5, 3, 4, etc. desde ya muchas gracias


----------



## cripty (Sep 28, 2009)

si se puede con el comando PWM y poniendo un red resistencia capacitor a la salida, modificando el ancho de pulso puedes variar la salida de la patita del micro, pero solo como señal ya que si deseas para alimentar algo mas grande, tienes que hacer algunos arreglos como un seguidor de tension y 2 transistores en totem, por la noche mas tarde posteare un ejemplo y un esquema para que sea mas claro


----------



## robtz (Sep 28, 2009)

tambien tienes la otra opcion que puedas utlizar aparte del hpwm  del pic un dac spi tal como tlc5620 que es de 8 bits de resolucion, es de 4 salidas analogicas, depende para que necesites la aplicacion


----------



## rfandres (Sep 29, 2009)

mi idea era poder encender un led con baja luminosidad y enpensar a aumentarla amedida que van susediendo determinadas secuencias.


----------



## cripty (Sep 29, 2009)

si se puede mira este esquema, y esta en elmanual original del PBP, es una opcion para convertir una salida digital en una analogica aunque como mencionan arriba, existen conversores digitales a analogicos que tienen mas ventajas que esta solucion que te doy, ya que si no dimensionas bien el capacitor o resistencia podrias inutilizar a la patita de tu micro o pero al micro.


----------



## Saloo (Oct 8, 2009)

bueno gracias.
pude hacer que me funcione el programa 
ahora , tengo una duda sobre el IF
Caso 1
IF portb.0 = 0 then ...
low porta.0

con esas lineas si Rb0 tiene un 0 logico pondia un 0 logico en RA0 ?

Caso 2

IF portb.0 = 1 then ...
low porta.0

Para considerar que en Rb0 hay un 1 logico tengo que colocar = 1 o > 0 ?

espero que me pueda ayudar con esto 
saludos


----------



## atricio (Oct 9, 2009)

no entiendo bien lo que quieres decir me parece que te refieres a que si esta bien la sintaxis que colocaste para saber si tienes un cero ò un 1 

Caso 1
IF portb.0 = 0 then ...
low porta.0

para mi no tiene mucho sentido que le des un cero mejor iniciale como cero y ya si es que es necesario porque me parece un desperdicio de codigo si si es parte de un codigo para un proceso anterior pues la linea de codigo esta bien 

con esas lineas si Rb0 tiene un 0 logico pondia un 0 logico en RA0 ?

Caso 2

IF portb.0 = 1 then ...
low porta.0

Para considerar que en Rb0 hay un 1 logico tengo que colocar = 1 o > 0 ?

para que haya un uno logico en b0 y te ponga un cero en el puerto a0 esta bien 
espero haber ayudado un poco sino pregunta con mas detalles he intentare ayudar si es que me es posible claro esta

saludos


----------



## Saloo (Oct 9, 2009)

muchas gracias por la respuesta 
no es que lo valla a usar asi  solo era un ejemplo jaja
me sirvio mucho .
gracias


----------



## atricio (Oct 18, 2009)

hola amigos por favor ayuda como debo usar el loop en microcode por favor necesito saber como usarlo no entiendo nada como hacerlo ojala me puedan ayudar


----------



## mecatrodatos (Oct 18, 2009)

Te puedo ayudar se utiliza cuando se desea ejecutar un programa principal por ejemplo hacer parpadear un led

LED VAR PORTB.0

loop:
HIGH LED
PAUSE 50
LOW LED
GOTO loop 

para mayor aclaracion te anexo documento en dpf .suerte amigo mio.

Amigo *guillejose* aqui esta todo lo necesario para que comiences te adjunto documento. 

*Entrenador de pic con pic basic pro*


----------



## atricio (Oct 19, 2009)

muchas gracias amigo mira estoy realizando un seguidor de linea me encontre este codigo me parece muy interesante porque es corto y me llamo la atensión de como lee los sensores me podrias explicar como realiza la seleccion de case y el loop te pongo el codigo para que lo mire y si puedes me expliques un poco te lo agredeceria...si no estoy mal la seleccion de case se hace por el numero binario que me de las entradas pero lo he probado en proteus pero nada hechame una mano con eso por favor el robot se llama hyperion es de un ing de ecuador y ha subido el codigo yo quisiera usar en lugar de solo dos sensores 6 para tener mas datos y pueda seguir la linea y si pueden alguna sugerencia como debo distribuir mis sensores estoy usando unos QRD1114 MUCHAS GRACIAS



```
TRISA=%11111111

cmcon=7

pause 2000

loop:

    select case PORTA
        case 0
            gosub izquierda
        case 1
            gosub adelante
        case 3
            gosub derecha
    end select
    goto loop

    adelante:
        high 0:high 1: low 2
        high 3:high 4: low 5
        return
    atras:
        high 0:low 1: high 2
        high 3:low 4: high 5
        return
    izquierda:
        high 0:low 1: high 2
        high 3:high 4: low 5
        return
    derecha:
        high 0:high 1: low 2
        high 3:low 4: high 5
        return
end
```


----------



## pregistro (Oct 19, 2009)

Hola mi nombre es Gustavo soy nuevo en el foro y con los pic.
Comento un pequeño problema que marca proteus:
El programa se ejecuta sin problemas pero me advierte "stack overflow executing call instruction / stack overflow executing return instruction" y también me advierte "controller received  data whilst busy"
si me pueden ayudar muy agradecido.
Mecatrodatos muy claros los ejemplos y me gusta el foro. 
Saludos Gustavo


----------



## atricio (Oct 19, 2009)

alguna vez me marco eso el proteus fue porque el tiempo que estaba corriendo el programa no era real y era muy bajo y no se apreciaban los cambios en forma real talvez eso te ayude


----------



## pregistro (Oct 19, 2009)

atricio dijo:


> alguna vez me marco eso el proteus fue porque el tiempo que estaba corriendo el programa no era real y era muy bajo y no se apreciaban los cambios en forma real talvez eso te ayude


te refieres al reloj del pic?, sì es esto, estoy simulando con el oscilador interno (4 mhz),
probe con otros valores y sigue igual. seguiré buscando Gracias


----------



## atricio (Oct 20, 2009)

me feriero a que cuando tu haces interrupciones o realizas retardos en tu programa no estan bien hechas o el simulador del proteus no la alcanza a semejar a la realidad lo corre a diferente velocidad para que la simulacilon se pueda ver a eso me refiero ex decir lo que tu quieres ver en el proteus no se esta dando de manera real sino que el proteus te lo muestra pero te advierte que necesariamente eso no va a pasar en la realidad


----------



## pregistro (Oct 20, 2009)

O K  entendí Gracias


----------



## mecatrodatos (Oct 21, 2009)

*Para ayudarte te explicare todo el código y la utilización de los comandos empezando con la función SELECT CASE que es una* estructura de control que proporciona  PBP para utilizarse se debe empezar con *select case*  y terminar la operación con *end select*. 
Su propósito es el simplificar las estructuras anidadas if, Then, else  que utilizamos cuando se da una condición, en los casos en que sea siempre la mima variable y se necesiten varias decisiones en función de los valores posibles, y su estructura es la siguiente:
SELECT CASE variable
CASE valor1: instruccion1
…
END SELECT
En el ejemplo que posteaste se utiliza de la siguiente manera me tome la liberta de utilizar con el pic 16f877A:
@ DEVICE xt_osc       ; definimos Oscilador externo
define osc 4
TRISA=1                    ; puerto A como entradas digitales
ADCON1=7
Pause 2000           
Loop:                 ;Bucle principal
Select case PORTA     ; condición determinada  por el Puerto A del pic 16F877A
; Los casos utilizados se desarrollan bajo las posibles variables obtenidas del puerto A del pic 16F877A, defeneciendo cuatro por las entradas que son dos RA0 y RA1 respectivamente.
*Case 0  *
Gosub izquierda     
; En esta condición (PRIMERA) RA1 y RA 0  están a cero lógico con lo que se pretende ir a la rutina de izquierda con el comando GOSUB.
*Case 1*
 Gosub adelante
; En esta condición (segunda)  RA1 y RA0  están a cero lógico y a uno lógico respectivamente  con lo que se pretende ir a la rutina de adelante  con el comando GOSUB.

*Case 2*
Gosub atras
; En esta condición (tercera) RA1 y RA0  están a uno lógico y a uno lógico respectivamente  con lo que se pretende ir a la rutina de adelante  con el comando GOSUB.
*Case** 3*
Gosub derecha
; En esta condición (Cuarta) RA1 y RA0  están a uno lógico con lo que se pretende ir a la rutina de  derecha con el comando GOSUB.
End select   ; fin Del condicional
Goto loop    ; crea un bucle cerrado ir a Loop
; En estas rutinas se utiliza el puerto b del pic como complemento siendo  cero (0) a cinco (5)  RB0 a RB5 respectivamente si  te fijas siempre cero (RB0) y tres (RB3) estén a uno lógico ya que habitan los driver para los motores que deben ser servos ya que si fueran dc normales se embalan y no hay  control en el giro, la única posibilidad es la utilización de los comandos PWM y HPWM, cuando se ha ejecutado se  retorna a la función que fue precedida con el comando RETURN. Los otro pines son los habilitadores de polaridad del motor para que giro en sentido horario y antihorario los cuales son (1, 2, 4,5) o (RB1, RB2, RB4, RB5).
 adelante:
        high 0:high 1: low 2
        high 3:high 4: low 5
        return
    atras:
        high 0:low 1: high 2
        high 3:low 4: high 5
        return
    izquierda:
        high 0:low 1: high 2
        high 3:high 4: low 5
        return
    derecha:
        high 0:high 1: low 2
        high 3:low 4: high 5
        return
end
Espero te sea de ayuda para tu proyecto amigo.


*amigo atricio me equivoque en condicion tres caso dos es a uno logico en RA1 y cero logico en RA0.*

*Case 2
*Gosub atras
; En esta condición (tercera) RA1 y RA0 están a uno lógico y a uno lógico respectivamente con lo que se pretende ir a la rutina de adelante con el comando GOSUB.

 En esta condición (tercera) RA1 y RA0 están a uno lógico y a cero lógico respectivamente con lo que se pretende ir a la rutina de adelante con el comando GOSUB.


----------



## atricio (Oct 22, 2009)

muchas gracias amigo mecatrodatos eres lo maximo mas o menos ya me las estaba suponiendo...me quedo muy claro ya utilizacion del case ahora una preguntilla en el loop ese debe ser mi programa principal no es verdad porque de ahi me esta mandando a seleccionar los casos verdad y regreso solamente con return puede haber mas de un loop en el mismo programa....muchas gracias me haz dado una gran ayuda cuaquier cosa que no entienda te molestare de nuevo y si mi carrito sale chevere lo posteo con unas foticos etc..


----------



## mecatrodatos (Oct 23, 2009)

No se puede repetir ya que el entorno de basic cuando es compilado y ejecutado el pic no sabe que hacer te recomiendo crear etiquetas entre LOOP y goto LOOP


----------



## atricio (Oct 23, 2009)

a ya listo muchas gracia mira si no es mucha molestia me podrias ayudar anteriormente postearon un programa de conversor analogo digital en que la variable me da hasta 255 que debo hacer para que me de hasta 1024 como dicen o hasta mas que puede leer la variable puedes hecharme una manito con eso por favor


```
@devicext_osc ; oscilador externo XT 
define osc 4
define LCD_DREG PORTD
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 4
P1 VAR BYTE
P2 VAR BYTE
P3 VAR BYTE
boton var portb.0
ADCON1=%100
INICIO:
PAUSE 300
POTEN1:
    ADCON0=%1000001
    GOSUB MEDIR
    P1= ADRESH
POTEN2:
    ADCON0=%1001001
    GOSUB MEDIR
    P2=ADRESH
POTEN3:
    ADCON0=%1011001
    GOSUB MEDIR
    P3=ADRESH
p1=(p1*500/255)
p2=(p2*30/255)
 
LCDOUT $FE,1,"POT1 POT2 POT3"
LCDOUT $FE,$c1,#p1
lcdout $FE,$c6,#P2
LCDOUT $FE,$cb,#P3
GOTO inicio
MEDIR:
    PAUSE 50
    ADCON0.2=1
    PAUSEUS 50
    RETURN
```


----------



## minssss (Nov 8, 2009)

estoy haciendo una calculadora de 4 digitos pero al colocar la operacion mas grande es decir 9999*9999 me da 37601 y donde guardo la multiplicacion es una variable de tipo word, tendra algun detalle el lcd? la programacion es la correcta la estoy haciendo con un 16f877a


----------



## kabano (Nov 9, 2009)

que tal minssss pues la variable que usas que es word solo almacena datos de 0 a 65535 : Word (dos bytes de longitud, almacena números enteros entre 0 y 65,535)
por lo tanto tendras que realizar un areglo de variables para poder mostrar el resultado de tu multiplicacion que mensionas.

o si puedes colocar tu programa para que te demos una ayudadita ?


saludos ¡¡


----------



## minssss (Nov 9, 2009)

no se como trabajar con arreglos en lo que a la multiplicacion se refiere, ayuda estare agradecido, gracias por la pronta respuesta



```
DEFINE OSC 20
DEFINE LCD_DREG PORTB 'LCD data port 
DEFINE LCD_DBIT 4 'LCD data starting bit 0 or 4 
DEFINE LCD_RSREG PORTB 'LCD register select port 
DEFINE LCD_RSBIT 0 'LCD register select bit 
DEFINE LCD_EREG PORTB 'LCD enable port 
DEFINE LCD_EBIT 2 'LCD enable bit 
DEFINE LCD_BITS 4 'LCD bus size 4 or 8 
DEFINE LCD_LINES 2 'Number lines on LCD 
DEFINE LCD_COMMANDUS 2000 'Command delay time in us 
DEFINE LCD_DATAUS 50 'Data delay time in us

alldigital 
TRISC=%11110000
TRISB=0

INICIO2:
X VAR BYTE
X=0
Y VAR BYTE
Y=0

SUM VAR WORD
SUM=0
RES VAR WORD
RES=0
MUL VAR word
MUL=0
DIVIN VAR WORD
DIVIN=0
DIVDEC VAR WORD
DIVDEC=0
DECI VAR WORD
DECI=0
G VAR byte
G=0
H VAR byte
H=0
I VAR byte
I=0
P VAR byte
P=0
J VAR BYTE
J=0
K VAR word
K=0
L VAR WORD
L=0
FLAG VAR BYTE
FLAG=0
CLC VAR BYTE
CLC=0

A VAR PORTC.0
B VAR PORTC.1
C VAR PORTC.2
D VAR PORTC.3
UNO VAR PORTC.4
DOS VAR PORTC.5
TRES VAR PORTC.6
CUATRO VAR PORTC.7

LCDOUT $FE, 1

INICIO:

'TECLADO
HIGH A
IF UNO=1 THEN X=1
IF DOS=1 THEN X=2
IF TRES=1 THEN X=3
IF CUATRO=1 THEN X=10
IF UNO=1 || DOS=1 || TRES=1 || CUATRO=1 THEN GOSUB ANTIREBOTE:Y=Y+1
PAUSE 10
LOW A

HIGH B
IF UNO=1 THEN X=4
IF DOS=1 THEN X=5
IF TRES=1 THEN X=6
IF CUATRO=1 THEN X=11
IF UNO=1 || DOS=1 || TRES=1 || CUATRO=1 THEN GOSUB ANTIREBOTE:Y=Y+1
PAUSE 10
LOW B

HIGH C
IF UNO=1 THEN X=7
IF DOS=1 THEN X=8
IF TRES=1 THEN X=9
IF CUATRO=1 THEN X=12
IF UNO=1 || DOS=1 || TRES=1 || CUATRO=1 THEN GOSUB ANTIREBOTE:Y=Y+1
PAUSE 10
LOW C

HIGH D
IF UNO=1 THEN X=20 'ON
IF DOS=1 THEN X=0
IF TRES=1 THEN X=14 'ENTER
IF CUATRO=1 THEN X=13
IF UNO=1 || DOS=1 || TRES=1 || CUATRO=1 THEN GOSUB ANTIREBOTE:Y=Y+1
PAUSE 10
LOW D

IF Y=1 && X<10 THEN G=X:LCDOUT $FE, 2, #X
IF Y=2 && X<10 THEN H=X:LCDOUT $FE, 2, #G, #X
IF Y=3 && X<10 THEN I=X:LCDOUT $FE, 2, #G, #H, #X
IF Y=4 && X<10 THEN P=X:LCDOUT $FE, 2, #G, #H, #I, #X
IF FLAG=0 && Y=0 THEN LCDOUT $FE, 2, "0  "
IF X=10 THEN LCDOUT $FE, 2, "+   "
IF X=11 THEN LCDOUT $FE, 2, "-   "
IF X=12 THEN LCDOUT $FE, 2, "*   "
IF X=13 THEN LCDOUT $FE, 2, "/   "
IF X=20 THEN GOTO INICIO2

'PRIMER NUMERO
IF FLAG=0 THEN
    IF Y=2 && X>=10 THEN
    J=X
    K=G
    LCDOUT $FE, 2, #K
    PAUSE 100
    FLAG=1
    Y=0
    G=0:H=0:I=0:P=0
    ENDIF
    
    if y=3 && x>=10 THEN 
    J=X
    K=(G*10)+H
    LCDOUT $FE, 2, #K
    PAUSE 100
    FLAG=1
    Y=0
    G=0:H=0:I=0:P=0
    ENDIF
    
    IF Y=4 && X>=10 THEN
    J=X
    K=(g*100)+(H*10)+(i)
    LCDOUT $FE, 2, #K
    PAUSE 100
    FLAG=1
    Y=0
    G=0:H=0:I=0:P=0
    ENDIF
    
    IF Y=5 && X>=10 THEN
    J=X
    K=(g*1000)+(H*100)+(i*10)+P
    LCDOUT $FE, 2, #K
    PAUSE 100
    FLAG=1
    Y=0
    G=0:H=0:I=0:P=0
    ENDIF
ENDIF

'SEGUNDO NUMERO
iF FLAG=1 THEN
    IF Y=2 && X=14 THEN 
    L=G
    LCDOUT $FE, 2, #L
    PAUSE 100
    CLC=1
    GOSUB OPERACIONES
    ENDIF
    
    IF Y=3 && X=14 THEN
    L=(G*10)+H
    LCDOUT $FE, 2, #L
    PAUSE 100
    CLC=1
    GOSUB OPERACIONES
    ENDIF
    
    IF Y=4 && X=14 THEN
    L=(g*100)+(H*10)+i
    LCDOUT $FE, 2, #L
    PAUSE 100
    CLC=1
    GOSUB OPERACIONES
    ENDIF
    
    IF Y=5 && X=14 THEN
    L=(g*1000)+(H*100)+(i*10)+P
    PAUSE 10
    LCDOUT $FE, 2, #L
    PAUSE 100
    CLC=1
    GOSUB OPERACIONES
    ENDIF
ENDIF

GOTO INICIO

ANTIREBOTE:
IF UNO=1 || DOS=1 || TRES=1 || CUATRO=1 THEN
GOTO ANTIREBOTE
ELSE
RETURN
ENDIF

OPERACIONES:

IF CLC=1 THEN
    IF J=10 THEN
    SUM=K+L
    LCDOUT $FE, 2, #k, "+", #l,"="
    LCDOUT $FE, $C0, #SUM
    PAUSE 100
    X=0
    ENDIF
    
    IF J=11 THEN
        IF L>K THEN
        RES=L-K
        LCDOUT $FE, $C0,"-", #RES        
        ELSE
        RES=K-L
        LCDOUT $FE, $C0, #RES
        ENDIF
    LCDOUT $FE, 2, #K, "-",#L,"="
    PAUSE 100
    X=0
    ENDIF
    
    IF J=12 THEN
    MUL=(K*L)
    LCDOUT $FE, 2, #k, "*",#L,"="
    LCDOUT $FE, $C0, #MUL
    PAUSE 100
    X=0
    ENDIF
    
    IF J=13 THEN
    DIVIN=K/L
    DIVDEC=K//L
    DECI=(DIVDEC*100)/L
    LCDOUT $FE, 2, #k, "/",#L,"="
    LCDOUT $FE, $C0, #DIVIN,".",#DECI
    PAUSE 100
    X=0
    ENDIF

HIGH D
IF UNO=1 THEN X=20 'ON
IF DOS=1 THEN X=0
IF TRES=1 THEN X=14 'ENTER
IF CUATRO=1 THEN X=13
IF UNO=1 || DOS=1 || TRES=1 || CUATRO=1 THEN GOSUB ANTIREBOTE:Y=Y+1
PAUSE 10
LOW D

IF X=20 THEN LCDOUT $FE,1,"0":GOTO INICIO2
GOTO OPERACIONES

ELSE
GOTO INICIO
ENDIF
```


----------



## Dario (Nov 9, 2009)

saludos mecatrodatos he estado leyendo este post y veo que eres muy bueno con el pbasic. por eso, queria pedirte si puedes ayudarme a comprender como utilizar el serin y serout del pbasic. te explico un poco lo que quiero hacer.
mi idea es implementar un control remoto basado en el pic16f84A pero la verdad que no entiendo muy bien como utilizar estas dos instrucciones. una idea basica seria por ejemplo que si yo presiono un boton en el transmisor, en el receptor se encienda el led que corresponde al mismo. te paso un dibujo del circuito basico espero que se entienda. solo necesito un par de lineas de codigo como para guiarme. un saludo y espero puedas ayudarme gracias


----------



## cripty (Nov 10, 2009)

despues de mucho tiempo regreso, y con un problemita: tengo 20 focos, que se encienden en orden, cada vez que pongo una moneda en la ranura, pero cada foco se debe de apagar 10 segundos despues de encendido independiente de que otros esten encendidos o apagados, ademas si se apago alguno, cuando se apague un foco e ingrese una moneda se prenden los focos en orden el objetivo es encender todos los focos


----------



## kabano (Nov 10, 2009)

que tal cripty podrias explicar un poquito mas claro lo que quieres realizar es que no entendip .

y si tienes algun esquema mucho mejor para poder ayudarte un poco.

saludos ¡¡

a creo que ya entendi aver lo que quieres es que al pasar una moneda en una ranura(un sensor ) se enciendan los 20 focos pero uno por uno y asu vez irse apagando despues de haber pasado un tiempo de 10 segundos.

es correcto ?


----------



## cripty (Nov 10, 2009)

OK, lo entendiste pero ademas para prenderse el foco siguiente los de atras deben de estar todos prendidos, si alguno esta apagado, ese se prendera primero


----------



## lobito fiee (Nov 10, 2009)

Buanas con todos; tengo una duda no se si me la puedan absolver; la duda es la siguiente:
Quiero controlar la temperarura de un foco, para lo cual estoy utilizando un LM35 el cual sensa la temperatura del foco y me manda la informacion a un pic 16F877A el cual realiza una conversion A/D y luego realiza una comparacion entre la temperatura que quiero y la temperatura que tengo con lo cual voy a generar un pulso a la salida por un pin del pic para activar a mi triac con lo cual voy de esta forma a controlar la luminosidad de mi foco;controlando esta luminosidad logro controlar la temperatura de mi foco.
Obs: foco es de 60W-220V
       controlador es un PIC16F877A
       MOC 3021(para aislar nuestro PIC de la parte de potencia)
       sensor es el LM35

LA CONSULTA ES SI ES QUE UNO DE USTEDES TIENE UN CODIGO EN C PARA PODER GUIARME O HAYA HECHO ESTE MISMO PROYECTO PUEDA ENVIARME TIPS ACERCA DE LO QUE QUIERO DESARROLLAR.

gracias y saludos


----------



## kabano (Nov 11, 2009)

que tal lobito fiee en esta pagina excelente de ucontrol tienen elaborado un programa para medir 4 temperaturas: http://www.ucontrol.com.ar/forosmf/programacion-en-c/medidor-de-4-temperaturas-con-lm35-y-lcd-2x16/

espero y te ayude puesto que este curso es de pic basic pro.


----------



## cripty (Nov 12, 2009)

ya lo termine, pero me gustaria ver que opinan del codigo, ¿se puede optimizar?


```
define osc 4
trisa=0
trisb=1

OPTION_REG=%01000100
intcon=%10110000

n   var bit[20]    'vector de banderas
x   var byte[20]   'vector de conteo
i   var byte       'indice de vectores
t   var byte       'timer
f   var byte       'numero de focos -1
p1  var byte 
P2  VAR BYTE
P3  VAR BYTE
LaT  con 1
A1  con 2
CK1 con 3
A2  con 4
CK2 con 5
A3  con 6
CK3 con 7
minu con 240       '4 minutos 4*60
seg  con 122       '1 segundo
low Lat                
i=0 : t=0 : f=19 : p1=0 : p2=0 : p3=0
portb=0

ON INTERRUPT GOTO tiempo

loop:
if t=seg then
t=0                      'reset del tiempo

 for I=0 to f           
  if n[i]=1 then         'verifico el flag
   x[i]=X[i]+1           'incremento las cuentas
  endif
  if x[i]=minu then      'verifico limite de cuentas
   n[i]=0                'reset de flag
   x[i]=0                'reset de contador
  endif
 next i
FOR I=0 TO 7        'secuencia para ordenar los flag
 p1=p1<<1            'y enviarlos por comunicacion serie sincrona
 P1=p1|n[i]           'a los conversores serie, paralelo 
NEXT i
shiftouT a1,ck1,1,[p1]
FOR I=8 TO 15
 p2=p2<<1
 P2=p2|n[i]
NEXT i 
shiftouT a2,ck2,1,[p2]
FOR I=16 TO 19
 p3=p3<<1
 P3=p3|n[i]
NEXT i 
shiftouT a3,ck3,1,[p3]
high Lat
pause 10
low lat
endif
goto loop

disable
tiempo:
if intcon.2=1 then           'interrupcion por tiempo
 t=t+1                       'aumento el conteo anidado del tiempo
 intcon.2=0
 intcon.7=1
endif

if intcon.1=1 then           'interrupcion por moneda
   intcon.1=0
   intcon.7=1
 for i=0 to f
  if n[i]=0 then                'seteo de flags
   n[i]=1
   enable
   goto loop                    'seteado el flag salta de ahi
  endif  
 next i
endif
resume
enable
```


----------



## Dario (Nov 19, 2009)

hola gente, yo por aqui de nuevo pidiendo una manito
les cuento que ya pude hacer funcionar el control remoto con pic digital de cuatro canales. funciona igual que un ht12. 
ahora me gustaria hacer un sistema parecido pero con la diferencia que, envez de leer un pulsador y hacer encender un led en el receptor, se pueda leer un potenciometro y mover un servo en el receptor. de manera que se comporte como un control remoto proporcional. que buena idea ¿no?
les cuento que ya estoy desarrollando un programita para los pic´s. aqui estan...
lo unico que no se porque razon no me funciona... ¿alguien podria decirme que estoy haciendo mal??? denme una manito cheee... despues subo el circuito para compartirlo. un saludo y gracias

 transmisor

include "modedefs.bas"
trisb=0
portb=0
pos var byte 
serieout var portb.0
potein var porta.0
pote:
Pot potein, 127,pos
serout serieout,T2400,[pos]
goto pote
end

receptor

include "modedefs.bas"
pos var byte
servo1 var byte
cont var byte
portb=0
trisb=0
loop:
serin porta.0,T2400,servo1,pos
        for cont = 0 to 50
   pulsout servo1,pos         
   pause 15                         
   next cont                           
   goto loop


----------



## emilos (Nov 19, 2009)

yo   hace   poco   que   estoy   en   el  foro,  e   posteado  muy  poco   pero   e  leido  mucho.  estoy   haciendo   una   alarma  con  pic  para  mi  auto    pero  tengo  que   saber   como   se  implementa   el    ON   INTERRUPT. la  alarma   que   estoy  haciendo    va  a  comandar   las  luses    bajas,  las luses   de  interior  y   un  par  de   cosas  mas   que  se  me   ocurrieron.   ahora   mi  problema  es   que  no  puedo  postear el  programa   que  estoy  haciendo  porque  estoy  navegando   con   el  celular   y   no   me  da  las  opciones   de  cargar   imagenes.  Desde  ya  mucha   gracias   y  el  foro   esta   re  bueno.


----------



## cripty (Nov 22, 2009)

ON INTERRUPT GOTO _label_ es como un GOSUB solo que despues de cada intruccion que esta en el programa revisa el registro de interrupciones INTCON para ver si ocurio una interrupcion; es decir el programa esta continuamente pendiente de si ha ocurrido una interrupcion; si ocurre una interrupcion salta hacia la _label_ y ejecuta el codigo que esta ahi otra diferencia es que una sub rutina termina en _return_ mientras que el _label_ de la interrupcion termina en un _resume_ ademas cabe resaltar que dentro del codigo del label debes de resetear el registro INTCON y el bit de interrupcion detro de este para que se active frente a una nueva interrupcion; ademas hay que tener en cuenta que mientras haya ocurrido una interrupcion y saltemos a nuestro _label_ no es necesario que se este comprobando que haya ocurrido una nueva interrupcion eso se logra poniendo DISABLE una linea antes del _label_ y para reanudar la comprobacion de interrupciones ponemos un ENABLE una linea despues del RESUME asi ya no se comprueba si haya ocurrido una interrupcion cuando ejecutamos el codigo de nuestro _label_ (esto ultimo se basa en el hecho de que cuando ocurre una interrupcion se modifica el bit de la interrupcion y el bit de habilitacion global de interrupciones es decir no se notifican nuevas interrupciones hasta que este ultimo bit no se ponga en 1 todo esto para que se atienda la interrupcion) un ejemplo lo tienes lineas arriba en el programan que postie ahi esta todo lo que explique; cualquier consulta no dudes en hacerla en el foro entre todos aprendemos mucho bye


----------



## emilos (Nov 22, 2009)

gracias   cripty,  lo   que   no   me  queda   claro   tambien   es   donde   pongo   el  on   interrupt,   al   principio   o   al   final   del  programa.  O  sea   que  tengo   que   poner  un   disable  antes   del   on  interrupt   y   despues  del   resume   un  enable,  no  ?  En  e l  caso  de   una   alarma  me  comviene   usar  el    on interrupt   para  la    activacion  y   desactivacion,  vos    que  me  decis  ?    Desde   ya   muchas   gracias  cripty   y  disculpe   mi   ignorancia.  Saludos...


----------



## Dario (Nov 22, 2009)

hola chicos.
les cuento que ya solucione el problema que tenia. al final cambie de instruccion y envez de usar serin/serout utilce pulsin/pulsout y quedo de maravillas XD... por fin he cumplido mi sueño de diseñar mi propio control remoto proporcional!!!
saludosss.


----------



## emilos (Nov 22, 2009)

Dario   contame  como   quedo   eso   ahora  que  no  entiendo...


----------



## Dario (Nov 22, 2009)

claro... probalo vos mismo. aca te dejo la simulacion en proteus


----------



## cripty (Nov 23, 2009)

emilos; el ON INTERRUPT GOTO va una linea antes de la rutina principal, asi cuando tu programa comienza ya se esta esperando por una interrupcion, ahora en la subrutina a la que salta cuando ocurre una interrupcion tiene que ser antecedida con un disable esto para que se detenga la espera de una interrupcion (por que aunque ocurra el micro no se dara cuenta pues tiene que ser atendida la pimera interrupcion) y despues de terminar la subrutina se activa la espera de la interrupcion con un enable
el siguiente ejemplo utiliza una interrupcion por cambio de estado del porb.0 de 1 a cero logico (interrupcio externa); el micro mantiene encendido un led, cuando cambiamos el estado de la patita B.0 de 1 a 0 logico se apaga el led por un segundo y luego se prende


```
led  var PORTB.7

   OPTION_REG = $7f        
    INTCON = $90              ' habilita el registro de interrupciones externas 
 
  On Interrupt Goto myint  ' define a donde dirigirse al ocurrir una interrupcion
loop:                             ' rutina principal
   High led                      ' enciende el led
   Goto loop                    ' lo hace por siempre

' subrutina que se realizara al ocurrir una interrupcion
Disable                    ' no se verifica las interrupciondes desde aqui en adelante
myint:  
   Low led                    ' apaga el led
   Pause   500              ' epera medio segundo
   INTCON.1 = 0            ' setea el bit de interrupcion
   Resume                    ' retorna a la linea del programa principal 
                                ' donde ocurrio la interrupcion
   Enable                      'habilita la verificacion de las interrupciones
```
las interrupciones se utilizan para hacer algo en el momento que ocurren; es decir si tengo un micro que esta programado como un cronometro y quiero que cuando ocurra una interrupcion como la del ejemplo se reinicie la cuenta deberia utilizar interrupciones.

espero haber ayudado en tu duda; cualquier otra cosa no dudes en preguntar

Bye


----------



## Dario (Nov 23, 2009)

tienes razon amigo cripty. acabo de comprobar en mi circuito que cuando el pic receptor deja de recibir señal, los servos se quedan talcual estavan cuando la tenian. supongo que eso no seria bueno en un modelo r/c ya que no habria forma de controlarlo y hacer algo. no lo habia tenido en cuenta :O . 
voy a modificar el programa para que cuando no tenga señal, el micro haga algo al respecto. saludosss


----------



## emilos (Nov 23, 2009)

Ahora   entiendo...   gracias  por  sacarme  la  duda.   Otra   duda,   y  que   pasa   cuando   existe   una   interrupcion  justo   e n   el  momento  que  en   el   programa  esta   corriendo  un  PAUSE  y   solo   sirve  para  el  pin    portb.0 en  el   caso   del    16f84 ?     espero  no  sea   una   pregunta  boluda  jeje.   Cripty    me  diste   un   manon   al  sacarme  de  este   dilema,  me  pasa  que  por   ahi  no   entiendo   solo  leyendo  el  manual,   a   veses    me   hace  falta   que  me  lo   expliquen   de  otra   forma.  Pero   ahora  resumi   vastante   el  programa.



D@rio dijo:


> claro... probalo vos mismo. aca te dejo la simulacion en proteus



Dario   realmente   muy   bueno,  yo  soy   de barrio  jardin  dario  cuando  quieras  nos  juntamos  a   compartir   ideas  y   te    felicito  por   el   programita   es   de   gran  utilidad.     Saludos...


----------



## cripty (Nov 23, 2009)

en pic basis pro las interrupciones no son atendidas inmediatamente, se espera a que termine el comando que se esta ejecutando luego se atiende la interrupcion, en el caso que se esta ejecutando un pause y ocurre una interrupcion, el programa terminara el pause y recien saltara a la sub rutina de interrupcion; si tienes la necesidad de hacer interrupciones que sean atendidas en el acto lo mejor es programarlas en assembler por que ahi las interrupciones se atienden inmediatamente.
nunca pienses que las preguntas son tontas, los tontos son los que saben la respuesta y no la comparten, todo lo que se de microcontroladores lo aprendi leyendo y rebuscando en la red, e igual que tu no entendia ni el manual del PBP pero con un poco de ingenio se comprende todo. hasta la proxima amigo emilos.


----------



## wickedzhito (Nov 25, 2009)

Hola a todos !! soy nuevo en este foro  y tengo una pregunta sobre los led : 

Bueno estoy usando el pic 16F84A para hacer una secuencia de luces, y tengo una duda !! Use todo el puerto B para formar una secuencia 
de luces. Mi pregunta es: si no solo quisiera conectar un solo led
a cada salida, si quisiera conectar 20 leds en paralelo en cada salida del puerto B,
entonces el problema radicaria en saber cuanta corriente proporciona cada salida 
del puerto B del pic!!! y creo que no va a ser la sufiente. 

Ahora como podria hacer para que cada led tenga la suficiente corriente que necesite 
para billar con toda su intencidad!????

Tendria que usar un transistor como amplificador de corriente o que es lo que deberia hacer ????? 

adjunto el diagrama del cto en proteus i el codigo en HEX, para cargar al pic!!

Espero puedan ayudarme !! =D !!
Gracias de antemano!!


----------



## george.manson.69 (Nov 25, 2009)

yo usaria un integrado ULN2003A sirve para amplificar y te da un 1 A,
ahora el otro problema seria si la fuente soportara ese consumo de corriente, deberias de usar un tranformador que soporte dicha corriente.
Haz un ejemplo conecta 20 led con sus respectivas resistencias, entonces conecta un tranformador de 127volts a 9 o 5 volt a unos 2 Amperes, conecta los led y mide cuanto consume.
no se cuanto consuma un led..pero por ejemplo que cada led consumiera 20mA, entonces como estan en paralelo, multiplica 20mA x 20 = 400mA consumiria aproximadamente...entonces como estas usando el puerto B, son 8 canales, multiplica esos 400mA x 8= 3.2Amperes conusmiria en total, entonces tendrias que usar un tranformador que soportara 4 amperes aproximadamente. 
El driver ULN2003A se usaria en este caso...pero a looo mejor se calentaria porque es muy fragil...puedes usar tamb el hermano ULN2803...


----------



## emilos (Nov 25, 2009)

Tengo  un   problema   con   un  programa,    cuando  lo   simulo   en   el   proteus  a   los   8  segundos   me   salta   un   error   y  s e  detiene.   que   errores  me   puede  estar  tirando   que  no  me  deja   seguir  probando  el  circuito  ?


----------



## Dario (Nov 26, 2009)

te aconsejo poner aqui en el foro el archivo pbp y el circuito asi podriamos ver que es lo que esta pasando y darte una mano.
saludosss


----------



## emilos (Nov 30, 2009)

D@rio dijo:


> te aconsejo poner aqui en el foro el archivo pbp y el circuito asi podriamos ver que es lo que esta pasando y darte una mano.
> saludosss



Ahi va pa Dario de cordoba:

```
'****************************************************************
'*  Name    : ALARMA.BAS                                        *
'*  Author  : EMILIANO OCAMPO                                   *
'*  Notice  : Copyright (c) 2009 EBO INC                        *
'*          : All Rights Reserved                               *
'*  Date    : 10/28/2009                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
 TRISA = 1
 TRISB = %00000111
 key1 var porta.0   ;activacion sonora
 key2 var porta.1   ;activacion silenciosa
 keyoff var porta.2 ;desactivacion
 ctcin var porta.3  ;señal de contacto
 tho var porta.4    ;señal de thouch
 p1 var portb.0     ;sensor puertas
 p2 var portb.1     ;sensor capot
 s1 var portb.2     ;sensor auxiliar
 buzz var portb.3   ;salida de sirena
 luz var portb.4    ;salida luses
 ctcout var portb.5 ;salida corta ignicion
 pto var portb.7    ;salida de piloto
 cnt var byte
 portb = 0
 cnt = 0
 
 inicio:
 on interrupt goto disparo
 intcon = %10010000
 activac:
 if key1 = 1 then armando1
 if key2 = 1 then armando2
 goto activac
 armando1:
 HIGH pto 
 high buzz 
 high luz
 pause 100
 low buzz 
 low luz 
 armada1:
 if p1 = 0 then disparo
 if keyoff = 1 then desarmando 
 goto armada1
 armando2:
 high pto
 high luz
 pause 100
 low luz
 armada2:          
 if p1 = 0 then disparo
 if keyoff = 1 then desarmando
 goto armada2
 desarmando:
 low buzz
 pause 500
 high luz
 high buzz
 pause 100
 low buzz
 pause 100
 high buzz
 pause 100
 low buzz
 pause 2000
 low luz
 low pto
 goto activac
 disable
 disparo:
 high buzz
 if keyoff = 1 then desarmando
 goto disparo
 enable
 end
```

fijense que me cuentan a ver si lo podemos resumir, de todas formas no esta terminado.
saludos...


----------



## cripty (Dic 10, 2009)

les tengo un reto, como programarian un control proporcional integral derivativo (PID) en un micro con picbasic pro??? o en su defecto como programarian una integral o derivada???


----------



## emilos (Dic 10, 2009)

cripty dijo:


> les tengo un reto, como programarian un control proporcional integral derivativo (PID) en un micro con picbasic pro??? o en su defecto como programarian una integral o derivada???



wikipedia me saco un poco la duda... pero decime un proyecto en particular en el que se lo pueda emplar. A mi se me ocurre un sistema de inyeccion electronica en el cual se ajusta el tiempo de inyeccion de acuerdo al valor que tira la sonda lambda, ahi hay una realimentacion, no se si estoy en lo correcto.

saludos.

Quiero hacer un programa en pbp que cuente las rpm de un engranaje y que detecte cuando encuentre donde estan los dientes que faltan. Basicamente tiene que saber el giro en RPMs y saber la posicion del engranaje por los dientes que faltan, el tema es que no se me ocurre como empesar. Espero me puedan dar una mano.
Saludos.


----------



## mecatrodatos (Dic 11, 2009)

Que tal veo que ha habido demasiado movimiento espero colaborar ya estoy de vacaciones por parte del estudio  y estare presto a lo que necesiten y subire proyectos muy interesantes con pic de la familia 18f en pic basic, espero me dispulpen por no haber respondido algunas de las inquietudes que se les presentaban.

Amigo emilio interesante y aplicable tu proyecto podremos utilizar el sensor de las ruedas del sistema ABS, el sensor de posicion de Ciguieñal CKP o en su defecto el del eje de Levas CAM , el sensor de de velocidad el a transmision VSS lo unico que tendriamos que realizar es el acondicionamiento de señal para que el micro interprete la informacion y la podramos ver en un LCD, hablando de RPM, lo mas facil seria con un Osciloscopio medio la frecuancia en la terminal de transmision de datos del sensor del automovil que se baja a utilizar para poder empezar.

Lo siguiente es realizar el acondicionamiento de señal para visualizar lo que deseamos lo cual seria sencillo ya todos los sensores trabajan a 5VDC omitiendo los actudores que trabajan con tension de la bateria.

he mirato tambien tu codigo  de la alarma y podemas hacerlo mas corto con la funcion Select Case pero seria bueno que subas todo lo que necesitas ya que mencionas que no esta terminado.

Amigo Cripty postea lo que desaeas relizar con control DIP y listo se pone interesante


----------



## Trinquete (Dic 12, 2009)

Felicidades a *mecatrodatos* por las explicaciones.Soy un novato en estas cuestiones.
Me gustaría saber, como accionar 2 salidas del 16F84A indistintamente con 2 entradas a pulsador N.A. y otras 2 entradas accionadas con sensores N.A. teniendo prioridad las entradas manuales  sobre las automáticas.
Si es necesario puedo aportar esquema.
Un saludo.


----------



## mecatrodatos (Dic 12, 2009)

Realiza esquema con sus requerimientos y asi te podremos colaborar mejor


----------



## Trinquete (Dic 12, 2009)

mecatrodatos dijo:


> Realiza esquema con sus requerimientos y asi te podremos colaborar mejor


 
Gracias por responder tan rápido.Un saludo y adjunto esquema.


----------



## emilos (Dic 12, 2009)

mecatrodatos dijo:


> Que tal veo que ha habido demasiado movimiento espero colaborar ya estoy de vacaciones por parte del estudio  y estare presto a lo que necesiten y subire proyectos muy interesantes con pic de la familia 18f en pic basic, espero me dispulpen por no haber respondido algunas de las inquietudes que se les presentaban.
> 
> Amigo emilio interesante y aplicable tu proyecto podremos utilizar el sensor de las ruedas del sistema ABS, el sensor de posicion de Ciguieñal CKP o en su defecto el del eje de Levas CAM , el sensor de de velocidad el a transmision VSS lo unico que tendriamos que realizar es el acondicionamiento de señal para que el micro interprete la informacion y la podramos ver en un LCD, hablando de RPM, lo mas facil seria con un Osciloscopio medio la frecuancia en la terminal de transmision de datos del sensor del automovil que se baja a utilizar para poder empezar.
> 
> ...



Gracias por responder mecatrodatos. El programa que tengo en la cabeza se tiene que encargar de medir las RPMs y la posicion del engranaje, las rpm las detecta con todos los dientes y la posicion con los dientes faltantes del mismo. Fijate que hay puse una imagen del acondicionador de señal que chorie por la web, a servira ?



pd: lo de la alarma la verdad que no se bien como funciona el tema de los select case, porque en el manual pbp que yo tengo no sale nada.

Saludos


----------



## mecatrodatos (Dic 13, 2009)

Que tal amigo emilos para desarrollar tu proyecto te dejo informacion muy clara en cuando a la electronica aplicada al automovil 

http://www.salesianosburgos.es/modulos/usuariosFtp/conexion/archivos256A.pdf
http://www.salesianosburgos.es/modulos/usuariosFtp/conexion/archivos257A.pdf
http://www.salesianosburgos.es/modulos/usuariosFtp/conexion/archivos258A.pdf
http://www.salesianosburgos.es/modulos/usuariosFtp/conexion/archivos266A.pdf
http://www.salesianosburgos.es/modulos/usuariosFtp/conexion/archivos317A.pdf

y el uso del osciloscopio para sensores y como es su representacion  http://www.salesianosburgos.es/modulos/usuariosFtp/conexion/archivos258A.pdf

Me gustaría saber, como accionar 2 salidas del 16F84A indistintamente con 2 entradas a pulsador N.A. y otras 2 entradas accionadas con sensores N.A. teniendo prioridad las entradas manuales sobre las automáticas.

amigo puedes utilizar las funciones IF, THEN, ELSE te mostrare un pequeño ejemplo:

```
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
Define    LOADER_USED    1TRISA = %1100           
TRISB = %11111111           
M0  VAR PORTA.2
M1 VAR PORTA.3
A0  VAR PORTB.0
A1  VAR PORTB.1
Led0 VAR PORTA.0            ' Seleciona PORTA como salida (LEDs) Led1 VAR PORTA.1OPTION_REG = $7f        ' habilita PORTB pull-ups      
mainloop:       
PORTB = 0       ' PORTB para leer los botones
PORTA = 0       ' PORTA para leer los botones y pone todos los LEDs en OFF
TRISB = $f0     ' habilita botones
 
       ' rutinas con se chequea el accionamiento de los pulsadores
       If M0 = 0 Then     ' si cuarto boton esta presinado ...                Led0 = 1     ' enciende primer LED        Endif        If M1 = 0 Then     ' si tercer boton esta presinado ...                Led1 = 1     ' enciende segundo LED        Endif        If A0 = 0 Then     ' si segundo boton esta presinado ...                Led0 = 1     ' enciende segundo LED        Endif        If A1 = 0 Then     ' si primer boton esta presinado ...                Led1 = 1     ' enciende primer LED         Endif        Goto mainloop       ' crea un bucle cerrado        End
```
 
`para el caso de priorizacion creas una condicional. mira si es asi para poderte seguir ayudando


----------



## Trinquete (Dic 13, 2009)

Gracias por responder ,espero sepa realizar el programa,yá comenté que en esto soy principiante.
Un saludo.


----------



## mecatrodatos (Dic 13, 2009)

listo perdona para ayudarte mejor visita primero el *Entrenador de pic con pic basic pro* que poste y el manual hay ejemplo y estan en español espero que esto te sirva de base no dudes en preguntar
Archivos Adjuntos
	

	
	
		
		

		
			



pbpesp.pdf (646,9 KB (Kilobytes), 33 visitas)
	

	
	
		
		

		
		
	


	


entrenador para microcontrolador con PBP.zip (954,0 KB (Kilobytes), 34 visitas

Andres111 manejo comunicacion serial entre PICS con los comandos serin y serout , vere como te puedo ayudar con la comunicacion SPI apartir de Hardware, por otro lado para los proyectos que vienen necesitamos saber un poco de Visual basic por lo que facilito un documento para empezar a conocer este programa y saberlo utilizar


----------



## Andres111 (Dic 14, 2009)

Gracias mecatrodatos por tu atencion pero no me sirve la comunicacion SPI a partir de hardware lo que necesito son unas bases para realizar el programa te agradesco si me puedes ayudar.

Saludos


----------



## mecatrodatos (Dic 15, 2009)

Para Ayudarte realizaremos un programa por hardware con los registros del puerto C del Pic 16f877a.

El puerto C consta de 8 líneas bidireccionales y tiene asociados los registros: 

*Registro PORTC (07H).-Es el registro de datos cuyos 8 bits RC7,RC6,...,RC0 reflejan *directamente el valor lógico de las líneas físicas del puerto C. 

*Registro TRISC(87H).-Registro de control de dirección de las líneas del puerto C. *

Poniendo un 1 en un bit del registro TRISC se configura la línea correspondiente como entrada y poniendo un 0 se configura la línea correspondiente como salida.

Las líneas del puerto C se encuentran multiplexadas con varias lineas controladas por otros periféricos, cuando se habilita la línea del periférico respectivo puede ser ignorada la configuración de TRISC, de hecho, algunos periféricos configuran la línea como salida mientras que otros la configuran como entrada. 


Cada entrada del puerto C posee un buffer con disparador Schmitt. Además, cuando se selecciona la función I2C, las patitas PORTC<4,3> pueden ser configuradas con niveles I2C o con niveles SMBus mediante el bit CKE del registro SSPSTAT<6>.

En la siguiente tabla se resumen las líneas del puerto C y las de los periféricos que
están multiplexadas con ellas.​*Nombre Función multiplexada​*RC0/T1OSO/T1CKI Salida oscilatoria del Timer1/reloj de entrada del Timer 1
RC1/T1OSI/CCP2 Entrada oscilatoria del Timer1/entrada de captura2 o salida de
comparación2 o salida PWM2
RC2/CCP1 Entrada de captura1 o salida de comparación1 o salida PWM1
RC3/SCK/SCL Reloj para los modos de comunicación serie síncrona SPI e I​2C
RC4/SDI/SDA Dato de entrada (en modo SPI)/ Dato de entrada-salida (modo I2C)
RC5/SDO Dato de salida (en modo SPI)
RC6/TX/CK Linea de transmisión asíncrona de la USART/reloj síncrono
RC7/RX/DT Linea de recepción asíncrona de la USART/dato síncrono

Tambien te adjunto documento donde explico el manejo de registros del pic 16ff877a para realizar el programa.​


Que tal vamos a poner el siguiente codigo de comunicacion spi a traves de Hardware (manipulacion de registros del puerto C) con dos pic 16f877A como proyecto.

este el programa para el pic maestro:


```
' Programa protocolo SPI entre dos Pic 16f877A usando Comunicación serial 
' sincrónica por medio de hardware a través del puerto C.
'
' El pic 16f877a maestro muestra valor del estado de un potenciómetro conectado 
' en RAO del pic 16f877a esclavo en una pantalla LCD a través de caracteres en 
' string.
'DEFINICION OSCILADOR EXTERNO 
 
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
 
'Se definen registros del pic 16f877a maestro para conectar display
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTE
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTE
DEFINE LCD_EBIT 1
SSPEN VAR SSPCON.5 'Habilita bit SSP 
CKP VAR SSPCON.4 'SELECCIONA POLARIDAD DE RELOJ
SMP VAR SSPSTAT.7 'Seleccionar la muestra de datos de entrada de fase
CKE VAR SSPSTAT.6 'Selecciona bit de reloj
SSPIF VAR PIR1.3 'SPI indicador de interrupción
 
i VAR BYTE 'contador del bucle
a VAR BYTE[6] 'Con capacidad para 6 caracteres leídos de esclavo
 
ADCON1 = 7 'Selección PORTA y PORTE como digital
Low PORTE.2 'LCD R/W linea a cero lógico 
Pause 100 'espera paras inicializar el LCD
TRISC = 0 'puerto c como salida
 
SSPEN = 1 'pines activados SPI
CKP = 0 'reloj en funcionamiento bajo 
CKE = 0 'transmitir a la transición inactivo a activo
SSPIF = 0 'Buffer de estado completo
SMP = 0 'muestra en medio de los datos
 
 
mainloop:
GoSub getdata 'iniciar la conversión de datos y recibir
 
LCDOut $fe,1 'Indicar recibió de cadena en lcd
LCDOut $fe,$80,"Conversor A/D "
LCDOut $fe,$c0, STR a\5, DEC a[5]
Pause 100
 
GoTo mainloop 'hacerlo de nuevo
 
getdata: 
 
SSPBUF = "?" 'enviar? para iniciar la conversión
GoSub letclear 'esperar dato para eliminar
IF SSPBUF<>"!" Then getdata 'esperar para la respuesta (!)
For i = 0 to 5 'bucle de 6 caracteres
SSPBUF = 0 'escribir a SSPBUF para iniciar el reloj
GoSub letclear 'esperar para la recepción 
a[i] = SSPBUF 'recibió en carácter de matriz
Next i 'recibe el siguiente carácter
Return
 
letclear:
IF SSPIF = 0 Then letclear 'esperar a SPI indicador de interrupción
PauseUs 25 ' pausa de 25uS 
SSPIF = 0 'resetiar flag
Return
```
Este es le programa para el pic esclavo

```
'DEFINICIÓN OSCILADOR EXTERNO 
 
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
'Asignar memoria RAM
 
dataout VAR BYTE[8] 'Salida de datos serie 
SSPEN VAR SSPCON.5 'Habilitar bit SSP
CKP VAR SSPCON.4 'selección de polaridad
SMP VAR SSPSTAT.7 'Datos de entrada de fase
CKE VAR SSPSTAT.6 'Selecciona bit de reloj
SSPIF VAR PIR1.3 'indicador de interrupción - último bit seleccionado
i VAR BYTE 'contador del bucle
a VAR BYTE[6] 'Con capacidad para 6 caracteres de datos
 
TRISC = %11011111 'configuración trisc 
SSPCON = %00000101 'configurar SPI esclavo, no SS
 
CKP = 0 'reloj al ralentí bajo
CKE = 0 'transmitir a la transición inactivo a activo
SSPIF = 0 'limpiar interrupción SPI
SMP = 0 'muestra en medio de los datos
ADCON1 = $0e 'PORTA.0 análogo, el reto
' PORTA y PORTE como pines digitales
dataout[0] = "P" 'La salida de datos predefinidos a "POT ="
dataout[1] = "O"
dataout[2] = "T"
dataout[3] = "=" 
dataout[4] = " " 
mainloop:
SSPEN = 0 'desactivar / activar la SSP para restablecer el puerto
SSPEN = 1
GoSub letclear ''esperar a byte recibido
IF (SSPBUF <> "?") Then mainloop 'esperar? para iniciar la conversión
 
ADCIN 0, dataout[5] 'Leer canal ADC 0, la 6 ª posición de la cadena de caracteres
 
GoSub senddata 'senviar"! " y la cadena de datos 
 
GoTo mainloop 'volver a realizar
 
senddata:
GoSub letclear 'esperar 
SSPBUF = "!" 'Enviar respuesta
For i = 0 to 5 'bucle 
GoSub letclear '
SSPBUF = dataout[i] 'enviar variable de matriz
Next i 'próxima localización
 
Return
 
letclear:
IF SSPIF = 0 Then letclear 'esperar a indicador de interrupción
SSPIF = 0 'resetiar bandera 
Return
```
por ultimo dejo simulación en proteus 7.6 , programa en pic basic pro y esquemático


----------



## mecatrodatos (Dic 17, 2009)

Subo programas para utilizacion del conversor A /D del pic 16f877a de 8bits y 10 bitis , la simulacion sirve para todos los casos para aquellos que tenian dudas de como utilizarlo y la extencion del valor es visualizado en LDC. La simulacion esta en proteus 7.6


----------



## cripty (Dic 17, 2009)

disculpen la demora, amigo mecatrodatos lo que deseo es hacer un control pid en general, yo se que tiene 3 partes proporcional, diferencial e integral pero como programo eso en un micro con pbp, ahora si hablamor de un ejemplo que te parece un control de temperatura donde ingreso la temperatura a fijar por un potenciometro y como sensor uso un lm35 o lm34 y para digitalizar la sailda de los sensores uso un adc
con eso tengo el set point, y la señal de retroalimentacion pero como hago pa parte difencial e integral????'


----------



## mecatrodatos (Dic 17, 2009)

listo nos pondremos con ese proyecto te parece si utilizamos uno de la serie 18f para configurar los registros y trabajar con el modulo A/D ya qu ela idea es trabajar con estos pics, me comentas y empezamos con el programa , el esquematico y la simulacion en proteus ,nos llevara un poco de tiempo.


----------



## perezsere (Dic 21, 2009)

hola amigo mecatrodatos, sabes se lo basico del pic 16f84 asi q bueno estoy de vacaciones  y q

quiero hacer un temporizador para cortar el paso de la corriente 220v, bueno la idea es que tengo q apagar y encender un equipo todos los dias, y bueno quiesiera automatizarlo, lei q con el pic se puede hacer, pero solo encuentro para temporizarlo x minutos u horas nomas, pero yo quiero q se haga para todos los dias, osea algo asi como un bucle, q encienda a la 5am y se apague a las 12pm, ojala me podrias ayudar te lo agradeceria o a cuqluier amigo de este foro ,     gracias


----------



## mecatrodatos (Dic 27, 2009)

claro que se puede realizar en las pags 2 y 5 hay programas relacionados con tu proyecto consulta y si tenes dudas preguntad

Bien vamos con proyectos interesantes Antes de empezar los programas, hay que aclarar algunos conceptos nuevos:​ 
*Encoder*: Codificador óptico que proporciona dos señales de fase que podemos usar para determinar hasta qué punto el motor se ha movido y la dirección en la que se está moviendo.
La información recibida también nos permite determinar la velocidad del motor. En nuestro caso particular, vamos a usar un codificador con 42 ranuras. Todos nuestros programas estarán basados en el conteo del codificador, en comparación con las revoluciones por minuto, de modo que no se tiene que realizar ninguna conversión.​ 
*Servo*: Motor eléctrico que puede ser programado para seguir una señal, en nuestro caso el motor está en calidad de un funcionario de la señal de error que se introduce en el sistema. La señal de error en sí es la diferencia en el recuento de codificador entre el motor y donde queremos que este se ubique .Se controlara el funcionamiento del motor mediante la constante añadiendo y sustrayendo de la señal de error para crear el perfil de movimiento que deseamos.​ 
*Matemáticas con enteros*: el microprocesador y el lenguaje que estamos utilizando son
limitados al uso de 8 y 16-bit y variables matemáticas enteras. No tenemos una manera de resolver una ecuación algebraica y utilizar los resultados dentro de nuestro control algorítmico. Sin embargo, las relaciones simples se pueden hacer para servir en algunos de nuestras necesidades, y la construcción de SELECT CASE se puede utilizar para aportar de forma efectiva al tipo de relaciones que ofrece una ecuación algebraica. Se demostrara el uso de esta construcción para controlar la velocidad del motor según lo determinado por el error de la señal en un número de maneras.​ 
*El lazo PID: la ecuación de control PID y Sus componentes*​ 
El régimen habitual utilizado para controlar un motor de corriente continuo codificado se denomina un bucle PID. En la ecuación que representa la ganancia / movimiento del motor, el P, I y D representan las tres componentes básicos del circuito de retroalimentación. Una constante, K, se necesita para cuidar de la fricción en general en el sistema. En términos sencillos estas variables se definen de la siguiente manera:​ 
K cuando se usa) es una constante necesaria para representar a la fricción total del sistema.
P: representa la parte proporcional del bucle de control.
I: representa la función de integración en el bucle de control 
D: representa la parte derivada de la ecuación de votos.​ 
Antes de seguir adelante, vamos a tener una comprensión de lo que estamos hablando cuandopodemos decir que el motor está controlado por un "lazo PID" o la ecuación. El lazo PID define ¿cuánta energía va a alimentar al motor en cualquier instante durante una rotación. Esto se basa en la ubicación del motor. Como se acaba de decir, hay cuatro partes de la ecuación que determina esta carga. Los tres componentes principales se refieren como el P, I y D, y el componente de menor fricción se conoce como K. Si estos cuatro componentes se describen correctamente en el algoritmo de control, y si un codificador correcto ha sido seleccionado, se mejora mucho el control del motor.​ 
El esquema de control que desarrollamos no tiene que ser matemáticamente
perfecto para darnos un buen rendimiento. De hecho, con PBP un sistema matemáticamente perfecto no puede ser alcanzado. Sin embargo, podemos acercarnos lo suficiente para tener el funcionamiento aceptable.​ 
*El componente de fricción K*: Debido a que el motor no comenzará a moverse hasta que haya superar la fricción en el sistema, una cierta cantidad de poder tiene que ser añadido al​sistema antes de que el motor empieza a moverse. Esta es la constante K. K es a menudo ignorado porque es un componente menor, y la función de integración se hará cargo en las primeras veces a través del bucle de control. En cualquier sistema con partes móviles habrá algunas fricciones. En el caso de un motor, incluso uno sin nada conectado y sin carga, habrá fricción en los dos rodamientos del eje, las escobillas conmutadoras, y una pequeño tensión aplicada al motor no lo moverá. Como se aumenta el voltaje, el motor comenzará a moverse. La tensión en la que el motor empieza a moverse es la tensión necesaria para superar la fricción. Para nuestros propósitos, se puede considerar constante, aunque aumenta a medida que aumenta la velocidad del motor. En la mayoría de los casos, podemos ignorar este aumento y utilizar una constante para representar a la carga de fricción. Matemáticamente esto se expresa como:
K = pequeño, el valor fijo
*El componente de Proporción P*: El componente en que poder de giro del motor será proporcional a la carga que el motor soporte. Esto tampoco es exactamente exacto, pero puede ser definido de esa manera, a efectos prácticos. Cuanto más rápido que queremos que el motor gire, mayor será la carga y mayor la componente P. En términos matemáticos, la energía que puede expresar como:

P = carga multiplicado por una constante

Si se está utilizando un motor con una carga variable, la velocidad que alcanza el motor
será aproximadamente proporcional a la carga que se encuentra en el motor. En nuestro sistema la ganancia puede variar de 0 a 255. Tenemos que seleccionar la ganancia para estar bien dentro de estos límites en todas las condiciones. Vamos a utilizar un multiplicador adecuado y entonces, una prueba condicional para asegurar esto.

*El componente de integración I*: Si no hay cambios de carga y el sistema de respuesta 
es lineal (es decir, el doble de la velocidad que exige el doble de potencia), la componente proporcionales todo lo que necesitamos para hacer girar el motor. Sin embargo, si el sistema no es lineal, o si el de carga está cambiando, tenemos que añadir o restar de la ganancia para mantener el motor en velocidad constante. Tenemos que hacer esto cada vez a través del control bucle hasta que el motor llega a la velocidad deseada. Este es la integración de componentes, en la ecuación. Debido a que es necesaria sólo cuando hay un error en la posición del motor, se tiene en una función de este error. Cuanto mayor es el error de posición, más tenemos que añadir o restar el ajuste de potencia para la velocidad del motor hacia arriba o disminuir su velocidad para el caso que necesitamos. Como se mencionó anteriormente, esto se hace cada vez que vamos a través del bucle de control. En términos matemáticos, la energía puede ser expresada como:

I= (posición ordenada-posición real) multiplicada por unfactor conveniente

*El componente derivado D*: Este componente es una medida de la diferencia 
entre posición actual del motor y donde se espera ubicar el motor que en cualquier momento. 
Este valor se calcula en cada iteración del bucle de control. Si hay una gran diferencia 
entre los dos números, no podemos esperar a integrar la potencia en pocos
incrementos, pero se necesita hacer un mayor ajuste de inmediato para obtener del motor 
parámetros aceptables lo más rápidamente posible.

Para determinar D, tenemos que saber la posición del motor y donde realmente debe estar. La diferencia es el error. Queremos que este error sea lo más pequeño posible, y nuestra respuesta se basa en lo pequeño que este error debe ser. Si está ejecutando una muy precisa sistema posicional tendremos que mirar este muchos cientos de veces por segundo y hacer que adaptación constante a la carga. Un codificador de alto conteo es deseable cuando los ajustes rápidos tienen que hacerse. Los recuentos de alta nos permiten obtener un "cambio en la posición de" lectura más a menudo.

D= (posición prevista - posición real) * (constante o variable de algún tipo)

Una cosa que esto significa en términos simples es que no hay necesidad de un cambio en la
entrada de potencia si el motor se ubica y se mueve a la velocidad deseada.

*Simulación de una ecuación con Select Case*

Supongamos que tenemos que conocer todos los números entre 0 y 4 en nuestro esquema de control, y nuestro sistema operativo no es compatible con funciones matemáticas. Podemos resolver el problema con la instrucción SELECT CASE. Cada caso del número entre 0 y 4 tiene un valor correspondiente. Estos valores se pueden poner en una construcción SELECT CASE de la siguiente manera para resolver la ecuación y = x ^ 2:





> SELECT CASE X
> CASE 0
> Y=0
> CASE 1
> ...




Dado que el sistema PBP usa 8 / 16 de matemáticas sin la aplicación del signo menos, o el punto decimal, tenemos que evitar estas desventajas también. En primer lugar, vamos a evitar el signo menos. Supongamos que estamos tratando de conseguir una posición designada al motor y nuestro pseudo-código para hacerlo es la siguiente:

Si no está ahí todavía tenemos que seguir adelante.
Si está en la posición que tiene que parar.
Si pasa por que la posición que tenemos que invertir esta tendencia.

Si vamos a tomar una decisión sobre la base de la posición del motor, tenemos que poner en práctica el proceso de decisión de la siguiente manera, porque no podemos utilizar un valor negativo. En el número entero, 128-129 no es -1, es 255. Esto nos obliga a utilizar las comparaciones entre los valores. Si tenemos la diferencia, primero tenemos que determinar qué valor es mayor, entonces determinar la diferencia y, a continuación del signo. El signo, en este caso nos da sentido de giro del motor. En el siguiente código, podemos determinar si va o no a correr el motor , vamos a ejecutarlo:.





> TARGET = 128
> POSITION =read from position register
> SELECT CASE POSITION
> CASE IS < TARGET
> ...


 

Entonces tenemos que determinar cuánto tensión debemos conceder el motor basado en
hasta qué punto el motor esta de donde se debe ubicar. La ganancia será una función de la
de error de posición.
Con la información podemos aplicar la ecuación para encontrar los beneficios que necesitamos en la siguiente construcción SELECT CASE. No todas las columnas se deben aplicar para obtener una aproximación útil de la ecuación.


> SELECT CASE DISTANCE ;
> CASE IS >120 ;
> GAIN = 127 ; lo general, usamos sólo la mitad de la potencia
> ; Y guardar el resto
> ...


 
Los valores que hemos seleccionado pueden ser ajustado por ensayo y error. Podemos utilizar técnicas de esta y similares siempre que tenemos que aplicar una ecuación dentro de un control de algoritmo.
Vamos a proceder con el control de un motor de codificación un paso en un momento por la inclusión de los programas expuestos anteriormente anteriormente.


----------



## Daniss1 (Dic 28, 2009)

Una duda que a pesar de que me han dicho que esta no he encontrado :¿con que se pueden programar estos pic? ¿hay que hacer el ciecuito o se puede comprar una base con puerto usb o algo para programarla?


----------



## mecatrodatos (Dic 29, 2009)

Para realizar el programa necesitas un compilador ya sea el Mplab para asembler, microcode estudio ( pic basic), mikro c o feed c ( para programarlos en lenguaje C ), una vez realizado el programa y compilado de producen el codigo fuente y .hex va en pic que se utilizara,  para transmitir esa informacion se necesita de un programador los cuales son de puerto serie ( JMD) de puerto papalelo y el de USB que se encuentra en la Version Pic kit 2 clon y esta expuesto en el foro de microcontroladores como destacado o de Enigma , los cuales necesitan un Hardware o plaqueta donde se ubica el pic a programar, un firware y un software donde se carga el .hex para la posterior programacion.


----------



## Daniss1 (Dic 29, 2009)

Algun modelo de programador en concreto para comprar? que me sirva para los pic basicos, no muy avanzados pero tampoco lo peor del mercado, algo intermedio, semiprofesional
algun modelo cocreto 
¿cual es el mejor programa para programarlos,? que sea facil y muy completo ¿y el mejor de todos?por dificil que sea.
Voy a consultar en una tienda de electronica pero me gustaria tener vuestra opinion


----------



## mecatrodatos (Dic 29, 2009)

Para empezar te recomiendo este programdor de puerto serie muy facil de hacer y super economico por sus componentes funciona 100% fue el primero que arme cuando empece con los micros.

http://213.97.130.124/progs/pipo2/pipo2.htm

Para programar te recomiendo el Pic Basic en Google encuetras el compilador free y el mas avanzado el Mikro basic o El CCs compiler.Al igual en este foro hay demasiada informacion solamente dedes tener la hoja de caracteristicas del pic a utilizar que la puedes obtener de la pagina del fabricante lo demas es facil y practicando.


----------



## Daniss1 (Dic 30, 2009)

Y seria mejor hacerlo o comprar alguno usb?


----------



## mecatrodatos (Dic 30, 2009)

te recomiendo que lo armes el ic Kit 2 clon de nuestro amigo moyano se aprender pero necesitarias otro para programar el pic 18f2550 para el diseño del harware.


----------



## Alejandro de Sevilla (Ene 2, 2010)

Soy nuevo en el Foro y les deseo a todos un buen año 2010.
Ya que veo que estás muy enterado de la programacion de los PIC me atrevo a pedirte lo siguiente:
En www.xbot.es/microplans/tacometro.htm he visto un tacómetro para torno que me interesa pues yo tengo un torno al que le he puesto un motor trifásico gobernado con un convertidor de frecuencia.
Tengo todos los componentes, entre los cuales hay un PIC16F873 que debe de ser programado.
En la web dicen que el programa no está disponible pero que lo pueden suministrar y resulta que les pongo un correo pidiendoles el precio y no me contestan.
¿Tu tienes ese programa?
Muchas gracias


----------



## Dario (Ene 3, 2010)

hola chicos feliz 2010!!!
les cuento que estoy tratando de hacer una especie de servomotor con un pic 16f84 y un potenciometro como sensor de posision. el funcionamiento es muy simple: se trata de comparar la variable de *pulsin* con la variable de *pot* y en funcion de la diferencia o igualdad de ambos valores, *( < > = )* obtener tres posibles estados en dos salidas para controlar el driver del motor. segun mi poco conocimiento en pbasic me parece que el programa que escribi deberia funcionar sin problemas, pero aqui es donde se complica. si pulsin es menor que pot, anda bien, si pulsin es mayor que pot anda bien. pero si pulsin es igual a pot las dos salidas de control empiezan a oscilar entre igual o menor y no logro que este estable ni en proteus ni en la practica real. solo me preguntaba si ustedes podrian darme una manito ya que me arde la cabeza pensando en que estoy haciendo mal :cabezon:
aca adjunto un zip con el proyecto para ver que opinan ustedes... agradecere cualquier tipo de consejo.
saludosss y feliz 2010.


----------



## mecatrodatos (Ene 6, 2010)

Alejandro vere como te puedo ayudar con el diseño del programa con el sensor CYN 70 y el pic 16f873 amigo dario lo imsmo feliz 2010 le hechare un vistazo al codigo para ver en que estas pecando.


----------



## Daniss1 (Ene 7, 2010)

en el post #227 he mirado el circuito y veo que vcc pone que usa 12v y no se si el puerto serie los puede dar o necesito una fuente externa, ademas el circuito vcc que hay debajo no se si va solo en la salida del puerto serie o en los dos vcc del circuito¿¿??


----------



## mecatrodatos (Ene 10, 2010)

Dario anterior mente habia posteado un proyecto robot seguidor de linea y cumple con tus exigencias compara dos variables determinadas por dos potenciomentros simulados en proteus , lo que debes realizar es al adecuacion del comando para controlar el Servo motor en las lineas straight,left,right desarrolle la comparacion a 15 con referente a los potenciometros para que el pic conteniera el comando y para el motor por lo que es dificil que ambos esten a la misma medicion generandose un parametro de error y lo desea lo puedes implementar a 6 pero no menor ya que la comparacion sera erronea y el motor realizara giro de derecha a izquierda.

Este es dodigo fuente:
	
	



```
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
 
 
;ROBOT SEGUIDOR DE LUZ
 
b0 var byte         ;VARIABLE PARA GUARDAR EL VALOR DE LDR1
b1 var byte         ;VARIABLE PARA GUARDAR VALOR DE LDR2 
b2 var byte         ;VARIABLE DE COMPARACION DE LDR1 Y LDR2
p2 var portb.0      ;SALIDA MOTOR1
p3 var portb.1      ;SALIDA MOTOR2
p4 var portb.2      ;SALIA MOTOR2
EN1 var portb.3    ; habilitador inversor giro MOTOR 2
EN2 VAR PORTB.4      ;HABILITADOR MOTOR UNO
 
LED1 VAR PORTA.0
LED2 VAR PORTA.1
LED3 VAR PORTA.2
 
start:                          ;INICIO
pot portb.5,255,b0              ;LEE LDR1 Y GUARDA VALOR EN BO
pot portb.6,255,b1              ;LEE LDR2 Y GUARDA VALOR EN B1
If b0 = b1 then straight        ;SI BO =B1 ENTONCER IR  ALA RUTINA STRAIGHT
if b0 > b1 then left            ;SI BO ES MAYOR A B1 IR A IZQUIERDA
if b1 > b0 then right           ;SI B1 ES MAYOR QUE BO ENTONCES IR A DERECHA
 
straight:                       ;RUTINA COMIENZO
pwm EN2,125,30:HIGH p2
LOW EN1: low p3:low p4   ; HABILITA MOTOR 1
high led1
goto start                     ;IR A INICIO 
 
left:                         ;RUTINA IZQUIERDA
b2 = b0-b1                    ;RESTE EL VALOR DE BOY B1 Y GUARDELO EN LA 
                              ;VARIABLE B2 
if b2 > 15 then left1         ;SIB2 ES MAYOR QUE 15 ENTONCES IR A RUTINA 
                              ;IZQUIERDA 1                                    
goto straight                 ;IR A INICIO
 
left1:                       ;RUTINA IZQUIERDA 1
pwm EN2,125,30:HIGH p2
HIGH EN1: LOW P3:high p4 ;ACTIVA SALIDA P3 Y DESACTIVA SALIDA P4
HIGH LED2                      ;ENCIENDE TESTIGO              
goto start                    ;IR A INICIO
 
right:                         ;RUTINA DERECHA
b2 = b1-b0                     ;RESTE EL VALOR DE B1 CON B0 Y GUARDE EL
                               ;VALOR EN B2
if b2 > 15 then right1         ;SI B2 ES MAYOR QUE 15 ENTONCES IR A RUTINA 
                               ;DERECHA 1   
goto straight                  ;IR A INICIO
 
right1:                        ;RUTINA DERECHA 1
pwm EN2,125,30:high p2
HIGH EN1:HIGH P3:low p4 ;ACTIVA SALIDA P4 Y DESACTIVA SALIDA P3
HIGH LED3                       ;ENCIENDE TESTIGO
goto start                      ;IR A INICIO
 
end                             ;FIN DE PROGRAMA
```
[/QUOTE]


espero te sirva


----------



## Dario (Ene 11, 2010)

muchas gracias amigo mecatrodatos, voy a adaptar los repectivos comandos con pbasic y luego lo simulo en proteus para ver que pasa.
en cuanto tenga novedades te cuento como me fue.
saludosss


----------



## mot1258 (Ene 12, 2010)

Hola a todos, tengo una duda con la instruccion PULSIN si esta instruccion manda solo pulsos a la salida que uno le indique o puede dejar en 1 algun canal de salida siempre y cuando a la entrada le sigan llegando los pulsos 10101010 por ejemplo si en la entrada portb.2,  entra la señal de un tren de pulsos ( 10101010 ) y si se pierde la secuencia de que se quede en 1 o en 0 por unos segundos que active la salida portb.3

  'PIC16F628A'
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
TRISA=%00000000     
TRISB=%00000100     
PULSE VAR WORD                'VARIABLE DE ALMACENAMIENTO TIPO WORD'
SYMBOL LED = PORTB.3          'LED DE SEÑAL DE SALIDA'
 LED =0
INICIO:
PULSIN PORTB.2, 1, PULSE
  HIGH LED 
GOTO INICIO 
 END

espero me puedan ayudar, gracias


----------



## mecatrodatos (Ene 12, 2010)

Que tal amigo mot me parece que estas utilizando mal el comando ya que PULSIN es utilizado para medir el ancho de pulso de un pin determinadoy PULSOT es el que genera una trama de ancho de pulso con un periodo especificado este es utilizado para controlar servos o intencidad luminica de led por otro lado se utiliza el PWM para controlar motores DC convencionales todo esto por software.

el mismo inconveniente tiene nuestro amigo Dario ya que es mejor utilizar el comando PULSOUT de la siguiente forma:

Pulsout portb.7,165 'Envia un pulso de 1.65 mseg por el pin 7 del puerto B

Por ultimo les recomiendo revisar el manual de PBP posteado  en las primeroas paginas de este foro, donde esta especificado la utilizacion de los anteriores comando


----------



## mot1258 (Ene 12, 2010)

Gracias amigo mecatrodatos, es lo que quiero medir un ancho de pulso pero externo, no del microcontrolador y que cuando se pierda esa secuencia me ponga en 1 una salida, gracias por la pronta respuesta y seguiremos  leyendo el manual de PBP, un coordial saludo.


----------



## mecatrodatos (Ene 17, 2010)

Programa controlador electronico de velocidad 



> '****************************************************************
> '*  Name    : Control Velocidad.BAS                             *
> '*  Author  : Mecatrodatos                                      *
> '*  Notice  : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
> ...


----------



## cheyo28 (Ene 18, 2010)

Buenas a todos,

Primero felicitar a mi compatriota Mecatrodatos por este tutorial,
que te lleva directo al grano a diferencia de muchos otros que simplemente te sacan canas :enfadado:

Amigo Meca antes habia hecho pruebillas con leds y todo bien pero llegaron las fiestas navideñas, la construccion de la casa, y mi hija....eh?.

Bueno has manejado varios temas importantes pero y los 7 segmentos?, tenemos muy poca por no decir nada sobre manejar estos dispocitivos con el pic basic pro.

Tengo un proyectos en mente y aprovechando este post podemos realizarlo en conjunto y que quede la información aqui en el foro ademas del avalioso aprendizaje que dejaría en muchos foristas.

Se trata de un reloj  con 7 segmentos, con pic16f628a un nuevo pic relacionado...eh, que lea los datos del bus i2c del ds1307,pues,  siguiendo la relacion de distrubucion de energia de mi pueblo, por cada 2 dias de luz electrica 3 horas no y hasta si puede cerrar la relacion a diario, en fin lo que no se querria es perder la hora, y definitivamente una bateria back up no daria chicle.

y por ultimo manejaria una carga "x", es decir un relé, con un ajuste de on y off, este ciclo deberia ser diario, en mi caso para manejar la nevera por las noches...pero puede ser usado por ejemplo para sistemas de riego, iluminacion perimetral etc.

dejo la semilla...y por supeusto el plano esquematico de lo que sería tentativamente el circuito y por supuesto como me gustaría que quedara.

claro...podriamos ir manejando el tema de los siete segmentos primero de modo de ir avanzando apropiadamente 

Saludos y exitos a todos, cheyo28


----------



## mecatrodatos (Ene 18, 2010)

Amigo atricio te dejo programa y simulacion para control de posicionamiento sin margen de error, simulacion en proteus 7.6, codigo fuente , .hex  y esquematico para ayuda en tu proyecto. solamente aconcicionas el codigo a tus necesidades.

Que tal amigo Cheyo interesante tu propuesta pero empezamos con utilizacion de multiplexado de display para realizar el cogido ? o vamos de una con el proyecto  ...


----------



## cheyo28 (Ene 19, 2010)

buenas, 

Amigo Meca, creo que debemos iniciar con las caracteristicas del pic16f628a, actualmente leo el libro de porgrmacion en basic, lo recomeindo (y lo encuentran en google)...seria bueno contrastarlo con el modo de programacion de tu post.

dejo est...me parece muy importante






*-oscilador interno RC de 4Mhz +/- 1%*
*-mclr programable *
*-mayor capacidad de corriente, sus puerto A y B entregan un total de 200mA cada uno, es decir 25mA cada pin. lo mismo para el modo sumidero.*

Gracias a un forista Lucas22, me ayodo a seleccionar los puertos adecuados para hacer este proyectos y aprendí de él muchas cosas importantes. él maneja el basic tambien...seria bueno que hiciera parte de este post.

Amigo meca, no estoy muy avansado en esto del PBP, espero me disculpe mis horrores de programacion y mis dudas...de los errores se aprende.

1-Definamos primero si las puertos estan bien asignados acoplandose al circuito
2-Este pic no usa oscilador externo, en Basic, ¿el no comandarle el oscilador externo el toma por defecto que vamos a usar oscilador interno del pic?.

fuera del proyecto: aclarame esta rutina que usaste en el reloj con lcd y ds1307...para asignar los meses y dias en el lcd


```
'CPNFIGURACION MESES,DIAS
Data @0,74,97,110,70,101,98,77,97,114,65,112,114
  ' Jan Feb Mar Apr
Data 77,97,121,74,117,110,74,117,108,65,117,103
  ' May Jun Jul Aug
Data 83,101,112,79,99,116,78,111,118,68,101,99
  ' Sep Oct Nov Dec
Data 84,117,101,87,101,100,84,104,117,70,114,105
  ' Tue Wed Thu Fri
Data 83,97,116,83,117,110,77,111,110
  ' Sat Sun Mon
```
 
noté que esos numeros corresponden a una letra...y hasta si esta en mayusculas...como detrminas el numero?...y ese @0 que asigna?

que hace el DIM en basic?

cuando llegue la rutina de los multiplexados podemos primero hacer un contador con la misma caracteristica y así otros ejemplos para entender las rutinas

Saludos y exitos....por la tarde voy mostrando lo que seria la rutina...eh. 

Cheyo28


----------



## mecatrodatos (Ene 19, 2010)

Que tal amigo te dejo un tutorial del pic 16f628A:

http://www.scribd.com/doc/20282565/Apostila-Microcontrolador-PIC-16F628


----------



## cheyo28 (Ene 19, 2010)

"lindo" el tuto, algo apartado del tema de programaion en basic. y en portuñol
pero rescato un cuadro de configuracion de pines.

sigo con la duda:
1- configurar el oscilador interno, ¿el soft lo establece por defecto?
2- DIM que es?
3- la rutina que postee...un amigo me explico algo al respecto pero...aun hay dudas.

Saludos y verè si  mañana dejo por lo menos declarar las variables para cada pin de cada puerto.

Sabes...estaba pensado si tenias un codigo parecido a esta aplicacion para guiarme un poco màs en como armar este rompecabezas.

cheyo28


----------



## mecatrodatos (Ene 23, 2010)

Que tal amigo Cheyo el tuto que te facilite evidentemente esta en portuguez pero especifica la utilizacion de los regirtros , por otro lado para aclarar tus dudas el entorno de microcode studio tiene cargado por defecto la configuracion del oscilador interno de este pic, como tambien la conexion del Lcd al puerto A del respectivo pic para programar tu proyecto en el pick kit 2 deberas colocar estas lineas de programa:



@ Device intrc_osc 'define Oscilador interno RC 
Define Osc 4 ' Define el Oscilador 4MHZ  

O en su defecto:

            @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ' Opción del Osc  Interno            @ DEVICE pic16F628, WDT_ON ' Watchdog Timer ON            @ DEVICE pic16F628, PWRT_ON ' Power-On Timer            @ DEVICE pic16F628, BOD_ON                     @ DEVICE pic16F628, MCLR_OFF ' Master Clear Opción interno            @ DEVICE pic16F628, LVP_OFF ' Bajo voltaje de programación            @ DEVICE pic16F628, CPD_OFF ' Protección del código de memoria OFF            @ DEVICE pic16F628, PROTECT_OFF' protección de código OFF  
 La razón fundamental es que el Software del programador no tiene las ventanillas para configurar el Oscilador con el cual va ha trabajar el pic por eso se debe hacer desde el programa fuente en nuestro caso desde el entorno de microcode studio.

*2- DIM que es?*[/COLOR]
 
Las variables deben ser declaradas antes de utilizarlas, mediante la instrucción DIM, como se muestra en los siguientes ejemplos: 
 DIM A AS BIT
 DIM B AS BYTE
 DIM X AS WORD

En el Entrono de pic basic pro se declaran de la siguiente forma:

  A VAR BIT
  B VAR BYTE
  X VAR WORD

 También es posible utilizar vectores, que son una matriz de dimensiones 1xN . Por ejemplo, la sentencia siguiente: 

 DIM A (10) AS BYTE ‘declara un vector (al que nos referiremos algunas veces como "array") de diez elementos del tipo BYTE, que serán accedidos mediante el uso de subíndice (entre paréntesis) del 0 al 9.

En el Entrono de pic basic pro se declaran de la siguiente forma:
A VAR BYTE [10]
Por último la rutina referente al comando Data son valores anidaos en la  memeoria  del pic para ser llamados eso te lo explicare luego con más detalle.

En cuanto a mi amigo atricio Ya habra solucionado su probema?


----------



## mot1258 (Ene 25, 2010)

Hola a todos, de nuevo recurriendo a su apoyo, pero alguien ha encontrado o tiene algunos ejemplos de como utilizar las instrucciones con las operaciones logicas, ya que solo he encontrado ejemplos de ( AND, OR ) pero me gustaria tener ejemplos de las demas operacioines logicas, como la ( NOT, XOR ) porque por lo poco que empezamos a aprender, serian de mucha utilidad para algunos programas, saludos.

Hola, encontre algo de informacion, espero les sirva 

http://www.scribd.com/doc/9384706/Manual-de-Programacion-Pbp


----------



## cheyo28 (Ene 27, 2010)

buenas,

Amigo meca le cuento que decidì hacer unos ejercicitos para recordar....nunca probe en circuitos reales solo en proteus. y ahora que no tengo proteus y lo monto en lo real....el circuito no anda.

utilicè el pic16f628a y coloquè la instruccion que me dijiste para que el pickit programara el oscilador

probe varias formas para ver si habia algo malo pero nada, no pude probar con un oscilador externo...hoy lo compro, seria provar mas tarde.

este es el ultimo codigo que le escribì al pic:


```
@ Device intrc_osc      ;define Oscilador interno RC
Define Osc 4               ;Define el Oscilador 4MHZ

led var portb.0            ;nombre del pin 6

inicio:                       ;nombre de subrutina de inicio
HIGH led                   ;enciende el led que esta conectado en el pin6
pause 1000               ;Espera un segundo
low led                     ;apaga el led
pause 1000               ;espera un segundo
goto inicio                 ;continua el programa para siempre
end                          ;fin del programa
```

lo ultimo que hice fue poner "end" aunque creo que no es necesario...pero por si las moscas...

En fin que opinas de esto que me haria falta....y sabes, creo que el microestudio deberia decir cuando hay una malainstruccion o le haga falta....creo que el asm en mplap era bastante detallista en corregir instrucciones.

Saludos y espero tu pronta respuesta, cheyo28


----------



## eserock (Ene 27, 2010)

Hola tome el timer de 5 minutos que propsiste le hice algunas modificaciones para adaptarlo a lo que quiero hacer un timer que yo programe el tiempo de 0 a 60 minutos, con cuatro botones aumentar, disminuir, iniciar/pausa, y detener,  resulta que el tiempo ya me lo ajusta a los minutos que quiero pero al iniciar se me cambia totalmente y empeiza con una cuenta regresiva  muy acelerada ya revise y  no encuentro  la posible falla adjunto archivo para ver si se me pueden  auiliar en algo gracias


----------



## mecatrodatos (Ene 27, 2010)

Amigo Cheyo realiza las siguientes configuracioens a tu programa:


> @ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
> @ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
> @ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
> @ DEVICE pic16F628A, BOD_ON
> ...


 
Como te comentaba lo mismo ocurre con el Asm se debe incluir unas lieas para configurar el oscilador con el cual va ha trabajar el PIC ya que el progrmador que poseee no tiene la opcion de configurarlo como el Epiwin 800

te anexo programa en pic basic , simulacion y .hex


----------



## cheyo28 (Ene 28, 2010)

Buenas,

Amigo meca le cuento que las instrucciones adicionales al inicio de la programacion funcionaron...el pic anda de lo lindo.

ya he hecho otros ejercicios y me andan

Me queda una duda, si uno va usar un oscilador esterno...solo bastan las 2 instrucciones que has venido dibulgando desde el principio.

voy a ver si hago pruebas lo que pasa es que el camello tas pesao...y mas si es turno nocturno

Saludos y gracias cheyo28

ahhhh....aun no he dejado atras lo del proyecto final del reloj 7 segmentos voy a ver si organizo mis ideas y espero tu orientacion


----------



## mecatrodatos (Ene 28, 2010)

amigo eserock este proyecto cumple con tus requerimientos lo unico es adapterlo y configurar el decremento del programa analizalo y comenta.



act2_973.zip (43,3 KB (Kilobytes), 45 visitas)


----------



## eserock (Ene 28, 2010)

Ya lo empece a analizar despues comento los logros
gracias por la atencion


----------



## cheyo28 (Ene 28, 2010)

buenas,

Amigo meca quise darle las instrucciones en basic con el microcode estudio para que el pic16f628a trabajara con el oscilador externo, con el mismo ejemplo del led intermitente y funcionò lo dejo escrito por si alguien lo necesita.


```
@ DEVICE pic16F628A, XT_OSC ' Opción del Osc Externo
DEFINE osc 4                ; especifica que es de 4MHz
@ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON 
@ DEVICE pic16F628A, PWRT_ON ' Power-On Timer 
@ DEVICE pic16F628A, BOD_ON 
@ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno 
@ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación 
@ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF 
@ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF

led var portb.0             ;nombre del pin 6

inicio:                     ;nombre de subrutina de inicio
HIGH led                    ;enciende el led que esta conectado en el pin6
pause 1000                  ;Espera un segundo
low led                     ;apaga el led
pause 1000                  ;espera un segundo
goto inicio                 ;continua el programa para siempre
end                         ;fin del programa
```

la vaina es que lo quisè imitar con el pic16f84a pero ahì si no ando el man... lo escribè de esta manera y a la hora de compilar me mando 3 errores que dejo adjunto...le quite esas 3 instrucciones (referente al error) y tambien lo del mclr pero nada ni tampoco dejando solo las 2 que siempres has manifestado al inicio de la programacion.


```
@ DEVICE pic16F84A, XT_OSC ' Opción del Osc externo
define osc 4     ;especifica que se va a utilizar uno de 4 Mhz

@ DEVICE pic16F84A, WDT_ON ' Watchdog Timer ON 
@ DEVICE pic16F84A, PWRT_ON ' Power-On Timer 
@ DEVICE pic16F84A, BOD_ON 
@ DEVICE pic16F84A, LVP_OFF ' Bajo voltaje de programación 
@ DEVICE pic16F84A, CPD_OFF ' Protección del código de memoria OFF 
@ DEVICE pic16F84A, PROTECT_OFF' protección de código OFF

led var portb.0  ;nombre del pin 6

inicio:          ;nombre de subrutina de inicio
HIGH led         ;enciende el led que esta conectado en el pin6
pause 1000       ;Espera un segundo
low led          ;apaga el led
pause 1000       ;espera un segundo
goto inicio      ;continua el programa para siempre
end              ;fin del programa
```

Que estaria pasando?...que hay que hacer para que el man ande?

Agradezco que me ayudes nuevamente en esto del oscilador y el pickit 2...ahhh
y tambien para que el pic16f788a ande o todos los demas pics en general.

Saludos y espero tu pronta respuesta

cheyo28


----------



## mecatrodatos (Ene 31, 2010)

Que tal amigo en la parte superior izquierda hay una ventanilla donde encontraras el pic a utilizar por defecto cuando habres microcode studio te aparecera el pic 16f628 realizas click sobre esta ventanilla y escogues el de tu aplicacion PIc16f84a y escibes lo siguiente todo el procedimiento aplica para cualquier pic que utilices con oscilador externo:  
@ device xt_osc
define osc 4     ;especifica que se va a utilizar uno de 4 Mhz

led var portb.0  ;nombre del pin 6

inicio:          ;nombre de subrutina de inicio
HIGH led         ;enciende el led que esta conectado en el pin6
pause 1000       ;Espera un segundo
low led          ;apaga el led
pause 1000       ;espera un segundo
goto inicio      ;continua el programa para siempre
end              ;fin del programa

por toro lado compre un computador con sistema operativo vista 7 a 64 bits y no me anda el compilador de microcode studio plus he intendo modos de compatibilidad y nada con el rroe que no me me genera el .hex , lo mismo me ocurre con Proteus 7.6 apareciendo mensajes como no se puede abrir o el que encontro un problema y se tiene que cerrar mirare si la version de Proton ide plus trabaja con este istema pra empezar con los ejemplos de los pic de la serie 18f y la comunicacion at reves de Usb con visual basic.


----------



## cheyo28 (Ene 31, 2010)

buenas,

amigo meca ese procedimiento que me indicas lo realizé al pie de la letra cuando lo intenté aquella vez, lo raro es que le programé el .hex que me enviaste aquella vez cuando estaba armando el pickit 2 y nada. no sé si sera qe el pic esté averiado y para mas piedra es el unico 16f84a que tengo.:enfadado:

voy a intentarlo otra vez para ver...y tambien, para descartar, le voy a exportar un .hex de un reloj que ya puse a funcionar en una pcb...luego te cuento como me fue.

Ese es el problema de los PCs de ahora que traen ese vista o el nuevo w7...ponen más problema para estos programas bajados por la red. suerte para que puedas solucionar el inconveniente.

...sigo en fase de aprendizaje, y ya estoy aprendiendo a manejar 7 segmentos...
Seria bueno si tienes un codibo en basic que sirva para hacer un reloj 7 segmentos, sin rtc.

Saludos y gracias 

cheyo28


----------



## mecatrodatos (Ene 31, 2010)

bien dejame ver realizare uno multiplexado en estos dias subo el codigo y el programa suerte amigo con tu aprendizaje

En la imagen que te anexo asi quedaria el circuito pero tendrias que cambiar de pic a 16f877a si le conectamos los botones de configuracion o realizarlo con el pic 16f628A pero solamenta con los botones de configuracion de horas y minutos ya que se nos va de pines.

o podriamos utilizar el circuito que posteaste pero el multiplexado no lo realizaria el pic sino el integrado conectado a los display estoy presto a tus comentarios


----------



## cheyo28 (Feb 1, 2010)

ok gracias meca.

pero sí seria mejor:

1-solo 4 segmentos, 2 para horas y 2 para minutos, segundos con 2 leds.
2-pic16f628a, el 16f788 se lo preste a un cuñado y ahora anda en la guajira....
3-multiplexado con Deco, yo tengo un 4011, cmos para display de catodos.
4-oscilador interno rc

creo que de esta manera le quedarian mas pines al pic y hasta podriamos ir agregandole cosas a los demas pines...buzzer (alarma) relé (control), etc.

Despues iremos mirando el i2c. cada cosa a su tiempo.

Saludos y exitos

cheyo28


----------



## edie (Feb 7, 2010)

hola amigos¡¡¡
tengo un trabajo que consite en programar un robort rastedor de lineas. me gustaria que me puedan ayudar con una programacion lo mas basico...
las entradas son 4 que son de los sensors: RB1, RB2, RB3, RB4. y las salidas son 2: RA0 i RA1 que van hazia los motores. tengo q usar el pic 16F628.. cualquier sugerencia sera bien recibida....
PD: no seria mucho pedir que se incluya PWM...graciasss


----------



## atricio (Feb 7, 2010)

amigo usa el buscador del foro ahi vas a tener mucha mas informacion de la que tu crees pero te hecho una mano este robot es muy sencillo de armar es mas o menos lo que tu pides esta hecho con el microcontrolador que necesitas

http://www.freewebs.com/glafebre/hyperion.htm

http://www.freewebs.com/glafebre/proyectos.htm

ojala te sirva


----------



## edie (Feb 11, 2010)

hola atricio.. las paginas que pusiste no pueden abrise... graciass!!!


----------



## atricio (Feb 11, 2010)

que raro amigo acabe de entrar al foro y pulse las direcciones y se me abre de una la pagina sin errores pero aqui te dejo el codigo de el bot que te menciono busca en google *seguidor de lineas **hyperion* y vas a encontrar el esquema para que lo armes y puedas hacer las modificaciones del caso


```
--------------------------------------------------------------------------------
'Seguidor de linea: Hyperion
'Giovanni Lafebre
'Cuenca - Ecuador

@ DEVICE pic16f628, INTRC_OSC_NOCLKOUT 'Reloj interno solo 
@ DEVICE pic16f628, WDT_OFF ' Watchdog Timer desconectado 
@ DEVICE pic16f628, PWRT_ON ' Power-On Timer conectado 
@ DEVICE pic16f628, BOD_ON ' Brown-Out Detect conectado 
@ DEVICE pic16f628, MCLR_OFF ' Master Clear Externo desconectado 
@ DEVICE pic16f628, LVP_OFF ' Low-Voltage Programming desconectado 
@ DEVICE pic16f628, CPD_OFF ' Data Memory Code Protect desconectado 

TRISA=%11111111

cmcon=7

pause 2000

loop:

    select case PORTA
        case 0
            gosub izquierda
        case 1
            gosub adelante
        case 3
            gosub derecha
    end select
    goto loop

    adelante:
        high 0:high 1: low 2
        high 3:high 4: low 5
        return
    atras:
        high 0:low 1: high 2
        high 3:low 4: high 5
        return
    izquierda:
        high 0:low 1: high 2
        high 3:high 4: low 5
        return
    derecha:
        high 0:high 1: low 2
        high 3:low 4: high 5
        return
end
```


----------



## kabano (Feb 20, 2010)

que tal compañeros  he estudiado el proyecto del termometro digital y esta todo perfecto pero tengo una duda que es como hacer para que pueda leer la temperatura con decimales (25C, 25.1C,25.2C....26C,) con precicion de 0.1C . ya le busque y no logro realizarlo. 

espero sus comentarios ¡¡¡


----------



## atricio (Feb 23, 2010)

Haber amigo mira en las paginas anteriores del foro ahi hay un lector analogo digital que va desde 0 a 100 con incrementos de uno en uno y en otro mensaje hay un lector analogo digital creo que era un voltimetro ahi esta como debes colocar el segundo decimal miralos analizalos he implementalos en tu programa y avisa para ver como se te puede ayudar

una pregunta amigos alguien sabe como usar el easy hid de microcode me podrian ayudar con esto por favor


----------



## Jorge Sanchez (Feb 23, 2010)

Hola que tal a todos los foristas
alguien me puede ayudar??
estoy programando en pic basic pro pero no se como guardar el valor de una variable en la eeprom escribo esta instruccion:

EEPROM 1, [variable]
y me marca un error,  solo se pueden almacenar constantes con este metodo??
tambien si luego quiero guardar otra cosa en esa misma direccion en otra parte del programa me amrca eeprom collision
alguien me puede ayudar???
gracias y saludos
Jorge


----------



## kabano (Feb 24, 2010)

ok gracias atricio por responder ¡¡

y jorge sanchez para grabar una constante en la eeprom seria asi:

*EEPROM*        {Location ,} [ constante {,constante ...} ]
     Guarda    constantes en un chip EEPROM . Si se omite el valor opcional Location ,la primera    declaración se guarda en la dirección 0 del EEPROM y las subsiguientes en las    siguientes direcciones del mismo .Si se indica un valor Location , éste indica    la dirección de comienzo para guardar los datos .
 Constante    puede ser una constante numérica ó una cadena de constantes .Solo se guardan    los bytes menos significativos de los valores numéricos . Las cadenas son guardadas    como bytes consecutivos d valores ASCII .No se agregan automáticamente terminadores    ,ni se completa el largo .
 EEPROM    solo trabaja con micro controladores con EEPROM incorporado como el PIC16F84    y PIC16C84 . Dado que el EEPROM es una memoria no volátil , los datos permanecerán    intactos aún sin alimentación .
 Los datos    son guardados en el EEPROM solo una vez , cuando el micro controlador es programado    , no cada vez que se ejecuta el programa .Se puede usar *WRITE*    para colocar valores en el EEPROM en el momento de la ejecución .
 ´ Guardar    10 ,20 , 30 comenzando en la dirección 5
*EEPROM    5, [ 10,20,30 ]*




y para escribir en la eeprom el valor de una variable es con la instruccion *WRITE :

**WRITE*        Address,Value
     Graba valores(valor de la variable)  en la EEPROM incorporado en la dirección Address especificada . .Esta    instrucción solo puede ser usada con un microPIC que tenga un EEPROM incorporado    como el PIC16F84 ó PIC16C84
 Es usado    para colocar datos en el EEPROM durante el momento de la ejecución .Para grabar    datos en el EEPROM durante la programación ,se usan las declaraciones DATA    y EEPROM .
 Cada WRITE    se auto regula en tiempo y toma aproximadamente 10 milisegundos ejecutarlo en    un microPIC .
*WRIT    5,B0 *´ graba el valor de B0 en la direccion 5 de la EEPROM del pic (B0 puede sustituirse por la variable)


saludos ¡¡


----------



## Jorge Sanchez (Feb 24, 2010)

Gracias kabano, eso me ayudo bastante ya pude hacer lo que tenia pensado!!
gracias!!


----------



## Jorge Sanchez (Mar 3, 2010)

Hola que tal a todos los foristas, a ver si alguien me puede ayudar
Estoy haciendo una alarma para un horno y ya me atore en estsa parte:

la puerta del horno esta cerrada y para que la alarma no suene debe de accesarse un codigo con un telcado numerico, esa parte ya esta terminada, el punto es , si alguien abre la puerta la alarma debe de esperar 10 segundos antes de activar la sirena, pero si el codigo se introduce durante ese tiempo esta debe de desactivarse, entonces, 
no se como usar el timer del 16f84 para esto
tengo una ligera idea pero no entiendo como usar el preescaler, 
lo que quiero hacer es , activar el timer, y luego de pasados los 10 segundos, salte a un int, y verifique si la alarma esta activada, si es true pues suena y si no , pues es que esta desactivada, alguien me puede ayudar?? 
Saludos !!
alguien me puede ayudar, o donde consigo info de como configurar el timer


----------



## mecatrodatos (Mar 4, 2010)

Jorge Sanchez lee esto: 

Hay encontrara la informacion para utilizar el Timer 0 del pic 16f84A.

jafernandez2 si necesitas un progrmador en destacados hay dos por USB, si necesitas ayuda en la formulacion de su programa en Basic sube los rerquerimientos y lo que llevas hecho con mucho gusto se te ayudara.


----------



## picaficionado (Mar 4, 2010)

Cordial saludo, para todos los foristas

Soy un tanto novato en el tama de los PIC, y desearia que me ayudaran con lo siguiente:

Debo desarrollar una aplicacion con PIC y una LCD 2x16, la cual cumpla con el siguiente objetivo:
1- en la primera linea de la LCD debe aparacer un mensaje "CONTADOR"
2- en la linea dos de la LCD debe aparcer a la izquierda el mensaje "TURNO (X)" siendo X (1 ó 2 ó 3) de acuerdo al turno, seleccionado previamente por medio de un pulsador, que sera conectado a uno de los pines del PIC.
3- en la linea dos de la LCD pero al lado derecho debe aparecer el valor de un proceso de conteo con cinco dogitos XXXXX, el cual es resultado de una señal externa generada por un sensor que sera conectado a otro de los pines del PIC y esta contando piezas.
4- el valor del conteo que se esta visualizando en la LCD, el PIC lo debe guardar en memoria, tal que si se cambia de turno se guarde la informacion del turno anterior, se visualice el conteo acumulado del turno seleccionado y sobre este se siga escribiendo ó acumulando el conteo del nuevo turno. Si hay un corte de energia los adatos de conteo que se llevaban deben quedar en memoria, para recuperarlos luego de reestablecer el suministro de energia.

mi pregunta es:
¿cual PIC me recomiendan para este tipo de proyectos, que pueda trabajar con la memoria EEPROM, del mismos PIC, escribiendo y leyendo sobre esta memoria, los datos del conteo en cada turno?

Aclaro: en un lapso de 24 horas horas de trabajo, se debe contar aproximadamente 300 , +/- 100 en turno 1, +/- 100 en turno 2 y +/- 100 en turno 3.

Agradezco su atencion y su sugerencia a la pregunta,

Estoy abierto a sugerencias.


----------



## mecatrodatos (Mar 4, 2010)

Interesante el proyecto pero:

1.Manejaras el LCD a comunicacion de 4 o 8 BITS ? En cables seria 4 u 8 respectivamente pero mayor demora , no tan notable en la comunicacion de 4 BITS. Ami manera manejo mejor la comunicacion de 4 bits por la conexion y la poca utilizacion de cables eso depende de tu criterio.

2.Un pulsado como turno X hasta 3. Hay un contador de pulsao como proyectos con Display se puede acondicionar el codigo para que funcione con LDC.

3.Se diaria que se utilizara un sensor digital para el proyecto que realizara la actividad de conteo XXXXX hasta 99999. hay un proyecto con referente a esto en proyectos de LCD en este mismo tema, me parece que esta en las 4 primeras hojas.

4. la grabacion de la memoria que me acuerde directamente en el Pic no se ha menejado en este hilo pero seria un buen comienzo para aplicarlo en tu proyecto.

5. Te recomendaria el pic 16f873A que es de 28 pines buena capacidad de memoria y tres puertos de coneccion A, B y C Respectivamente, pero cuando lo preguntas en las tiendas de electronica tiene el mismo valor que el 16f877A que posee 40 pines un puerto de mas y otras prestaciones interesantes. $ 70000


----------



## picaficionado (Mar 5, 2010)

Gracias por tu sugerencias, las tendré en cuenta,

mi objetivo es utilizarlo en comunicación de 4 bits.


----------



## Vangeluz (Mar 5, 2010)

Disculpen a ver si alguien me podria ayudar ya que soy nuevo en lo que es PICs.
Encontré un código asm PIC 16f84A de un contador simple ascendente con un 7 segmentos y un pulsador, lo unico es que modifiqué es que tenga otro pulsador para conteo descendente, PERO !!!! cuando desciende a 0 se bloquéa a ver si alguien me puede decir que hice mal.
Físicamente configuré (RB0 a RB6 a,b,c,d,e,f,g Respectivamente del 7 Segmentos Cátodo común) RB7 1K a 0v y Pulsador a 5v 
Luego agregué RA2 con el otro pulsador igual para descender y como les contaba, llega a 0 y se bloquéa, ( al ascender anda super pasa el 0 y vuelve a contar ) solo es al descender el problema, aqui va el codigo

```
; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
Contador equ  0x0C ; Registro para almacenar conteo
Contador1 equ  0x0D ; Registro utilizado en demora.-
Contador2 equ  0x0E ; Registro utilizado en demora.-
Pulsador equ  7 ; Definimos Pulsador como el bit 7, en este caso sera para PORTB
Pulsador2 equ  2 ; Bit 2  PORTA
;**** Inicio  del Micro ****
Reset  org  0x00  ; Aqui comienza el micro.- 
   goto Inicio  ; Salto a inicio de mi programa.-    
;**** Tabla de conversion BCD a 7 Segmentos ****
; Se coloca al inicio para asegurar ubicacion en Pagina.- 
  org 0x05  ; Origen del codigo de tabla.-
BCD7SEG:    ; retlw b'gfedcba'  para display catodo comun 
  addwf PCL,1  ; Se incrementa el contador del programa.- 
  retlw b'0111111' ; 0  
  retlw b'0000110' ; 1  
  retlw b'1011011' ; 2  
  retlw b'1001111' ; 3  
  retlw b'1100110' ; 4  
  retlw b'1101101' ; 5  
  retlw b'1111101' ; 6  
  retlw b'0000111' ; 7  
  retlw b'1111111' ; 8  
  retlw b'1101111' ; 9  
  clrf Contador ; Si llega 10, se resetea contador 
  retlw b'0111111' ; 0 
;*****************************************************************************************
;**** Programa principal ****
;**** Configuración de puertos ****
Inicio  bsf STATUS,RP0  ; Pasamos de Banco 0 a Banco 1.- 
   movlw b'10000000' ; RB7 como entrada y los demas como salida.- 
   movwf TRISB 
   bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0 
   movlw b'0111111' ; Comienza en cero.- 
   movwf PORTB 
   clrf Contador
;**** Testeo de Pulsador ****
Testeo  btfss PORTB,Pulsador  ; Testeamos si esta a 1 logico.- 
   goto Testeo2  ; No, seguimos testeando.- 
   call Demora_20ms ; Eliminamos Efecto rebote 
   btfss PORTB,Pulsador ; Testeamos nuevamente.- 
   goto Testeo2  ; Falsa Alarma, seguimos testeando.- 
   incf Contador,1 ; Se ha pulsado, incrementamos contador.- 
   movfw Contador ; pasamos contador a W 
   call BCD7SEG  ; Llamamos tabla.- 
   movwf PORTB  ; Cargamos valor recibido por Tabla en PORTB 
   btfsc PORTB,Pulsador ; Esperamos a que se suelte el pulsador -**- 
   goto $-1  ; No, PCL - 1, --> btfss PORTA,Pulsador.- 
   call Demora_20ms ; Eliminamos efecto rebote.- 
   btfsc PORTB,Pulsador ; Testeamos nuevamente.- 
   goto $-4  ; No, Falsa alarma, volvemos a testear a que se suelte (**).- 
   goto Testeo2  ; Si, Testeamos nuevamente.- 
 
;*******ESTO ES LO AGREGADO************
;
Testeo2  btfss PORTA,Pulsador2  ; está a 1 ?
   goto Testeo  ; no, Seguimos testeando
   call Demora_20ms ; Rebote
   btfss PORTA,Pulsador2 ; Testeamos de nuevo
   goto Testeo  ; Falsa alarma
   decf Contador,1 ; Pulsado se decrementa 1
   movfw Contador ; Movemos contador a w
   call BCD7SEG  ; Tabla
   movwf PORTB  ; Cargamos Tabla en PORTB
   btfsc PORTA,Pulsador2 ; esperamos soltar el boton
   goto $-1  ; No, PCL - 1, --> btfss PORTA,Pulsador.-
   call Demora_20ms ; Rebote
   btfsc PORTA,Pulsador2 ; Nuevamente
   goto $-4  ; Falsa alarma  
   goto Testeo  ; Nuevamente
 
;**** Demora ****
Demora_20ms movlw 0xFF  ;  
   movwf Contador1 ; Iniciamos contador1.-
Repeticion1 movlw 0x19  ;  
   movwf Contador2 ; Iniciamos contador2
Repeticion2 decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.-   
   goto Repeticion2 ; Si no es 0 repetimos ciclo.- 
   decfsz Contador1,1 ; Decrementa Contador1.- 
   goto Repeticion1 ; Si no es cero repetimos ciclo.- 
   return    ; Regresa de la subrutina.-  
end
```
 
Desde yá muchas gracias .... ATTE. Victor Angel


----------



## reyvilla (Mar 7, 2010)

buenas noches, les escribo porque tengo un problemita con el proteus y el picbasic pro el asunto es que estoy trabajando con simulaciones con el pìc12f509 encendiendo unos led's, es un programita bien sencillo pero a la hora de simularlo no me esta activando el gpio.2 todos los demas pines del puerto funcionan bien pero cuando mando activar justamente el pin 2 del puerto no me lo activa. Ahora mi duda es sera que le falta algo al programa como digitalizar las salidas por ejemplo, o sera el picbasic pro o el proteus? aca les anexo todo lo referido al problema si alguien lo puede probar y decirme si es mi maquina o mi software gracias...

ya encontre el problema, simplemente era cololar OPTION_REG.5 = 0 antes de la declaracion trisio, lo cual lo consegui en el data sheet del integrado para que no les suceda lo mismo tomen en cuenta ese pequeño detalle a la hora de programar el 12f509 gracias de todas maneras...saludos


----------



## reyvilla (Mar 15, 2010)

hola, quisiera compartir un pequeño circuito para el control de un motor dc de un mini-dremel el cual fue compradro por ventas por tv, mi intencion es ver si me pueden echar una mano para controlar la velocidad del motor a traves de un pic12c/f509 y un uln2803. La idea principal es colocar 3 velocidades al motor las cuales pueden ser seleccionadas precionando un unico boton, al ser precionado una vez empieza en la velocidad mas baja al volver a precionar eleva la velocidad al segundo nivel y asi hasta el tercer y ultimo nivel luego al precionar por cuarta vez se apaga y queda en espera.Aqui les anexo la simulacion en proteus y el programa en basic. El problema que tengo es que no llego a obtener las 3 velocidades bien diferenciadas, o por lo menos es lo que observo en la simulacion.


----------



## mecatrodatos (Mar 15, 2010)

Tienes que darle un tiempo de espera en cada una de las rutinas del giro del motor para que el pic detecte a que condicion va ,para que la respectiva salida sea la corespondiente por el comando PWM que utilizas.


----------



## reyvilla (Mar 15, 2010)

tu dices de cuanto 50ms ?


----------



## Chico3001 (Mar 15, 2010)

Nop... 50mS se me hace muy poco tiempo... yo le daria de 2 a 5 segundos...


----------



## mecatrodatos (Mar 15, 2010)

este seria mi aporte en como realizar las rutinas para el tiempo de respuesta del pic cuando de pulsa la tecla





> '*******************************************************************************
> PULSADOR var PORTA.5   'Pulsador en el PORTA.5
> TMP_VEL  var byte      'Nombre de la variable
> TMP_VEL = 50           'Tiempo de espera para el scroll de ondas
> ...



El Interruptor en PORTA.5 lo coloco como ejemplo

en esto seria asi :
GOTO TRIANGULAR =GOTO velocidad1 
GOTO SENOIDAL=GOTO velocidad2
GOTO CUADRADA GOTO velocidad3


----------



## reyvilla (Mar 15, 2010)

ok entendi algo, gracias por las respuestas, pero ahora como lo hago con un solo pulsador???


----------



## mecatrodatos (Mar 15, 2010)

si te das cuenta en el programa es un mismo pulsador lo que hice fue crear rutinas para las tres pulsaciones que comentabas para las tres velocidades del motor al subirlo se me olvido correguir esto:

GOTO TRIANGULAR =GOTO velocidad1 
GOTO SENOIDAL=GOTO velocidad2
GOTO CUADRADA GOTO velocidad3

porque era uno que habia diseñado para un frcuenciometro.


----------



## reyvilla (Mar 15, 2010)

dale dejame hacerle las modificaciones y te aviso gracias


----------



## mecatrodatos (Mar 16, 2010)

BIen para no olvidar el tema y proyecto de nuestro amigo Cheyo la primera parte para el desarrollo del REloj digital con se explica el multiplexado y coneccion de display al PIC 16f628A como progrmas en Basic para activar los pines de I/O del PIC.


----------



## atricio (Mar 17, 2010)

Hola amigos una prgunta como debo activar las resistencias pull up para el pic 16f877a en microcode se los agradeceria si me hechan una mano en eso por favor


----------



## eserock (Mar 24, 2010)

Hola Mecatrodatos
Espero tenga forma de ayudarme con esto, antes usaba el pic 16f648a y mandaba las entradas   del puerto a a analogicas con la instruccion
 CMCON = 7 
Mi problema es ahora quiero programar lo mismo pero en el pic 16f886 y no me funcionan los puertos  que son de entrada analogica , la pregunta seria ¿como declaro que los puertos sean  digitales y no analogicos en este pic?


----------



## mecatrodatos (Mar 27, 2010)

Busca en el Data Sheet los registros:[/COLOR]
ANSELH REGISTER para configurar el PORTB del PIC.
ANSEL REGISTER para configurar el PORTA del PIC.

si no entendes te explicare como se realiza


----------



## josb86 (Mar 27, 2010)

buenas mira estoy haciendo un contador de pulsos que cada ves que detecte un cero me lo cuente estoy trabajando con el pin RB0 de un 16f876a, mi pregunta es como hago para que el me cuente pero dependiendo del flanco?, por que he visto que si coloco  que cuente cada ves que el pin sea cero si esta pata queda mucho tiempo cero el sumara muchas veces. entonces quiero saber como cuento pero dependiendo del flanco he visto que utilizan el registro OPTION_REG pero quiero saber tambien como se habilita esto y ademas si eligiendo este modo todos los pines detectaran solo cambios por flanco?


el programa que estaba haciendo es este:

Define	LCD_DREG	PORTB
Define	LCD_DBIT	4
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	2
Define	LCD_EREG	PORTB
Define	LCD_EBIT	3
TRISB = %00000011	' en el puerto B coloco el pin 0 y el 1 como entradas y el resto como salidas
contador    var	byte		    ' Create adval to store result
contador = 0
Pause 500		    ' Wait .5 second
loop:

   Lcdout $fe, 1		        ' Clear LCD
   IF   PORTB.0 = 0 THEN 
        Contador = CONTADOR + 1
   ENDIF
   pause 50 
   Lcdout "sumatoria: ", DEC contador	' Display the decimal value  
   Pause 100		            ' Wait .1 secon
   Goto loop		            ' Do it forever
   End


----------



## mecatrodatos (Mar 28, 2010)

Que tal mira en la segunda pagina de curso hay proyectos de lcd (contador, reloj, cronometro):

https://www.forosdeelectronica.com/f24/curso-programacion-pic-bsic-pro-20658/index2.html

Los ejercicios cumplen con tus requerimientos


----------



## josb86 (Mar 28, 2010)

mecatrodatos dijo:


> Que tal mira en la segunda pagina de curso hay proyectos de lcd (contador, reloj, cronometro):
> 
> https://www.forosdeelectronica.com/f24/curso-programacion-pic-bsic-pro-20658/index2.html
> 
> Los ejercicios cumplen con tus requerimientos



tu me perdonaras pero alli no veo que trabajen con flancos hacen lo mismo que yo


----------



## picaficionado (Abr 3, 2010)

josb86 dijo:


> buenas mira estoy haciendo un contador de pulsos que cada ves que detecte un cero me lo cuente estoy trabajando con el pin RB0 de un 16f876a, mi pregunta es como hago para que el me cuente pero dependiendo del flanco?, por que he visto que si coloco  que cuente cada ves que el pin sea cero si esta pata queda mucho tiempo cero el sumara muchas veces. entonces quiero saber como cuento pero dependiendo del flanco he visto que utilizan el registro OPTION_REG pero quiero saber tambien como se habilita esto y ademas si eligiendo este modo todos los pines detectaran solo cambios por flanco?
> 
> 
> el programa que estaba haciendo es este:
> ...



Puedes intentar realizando esta variación:

     lcdout $fe, 1                                 :limpia la LCD en el arranque

loop:     
     IF PORTB.0 = 0 THEN contar
     GOTO loop

contar:
     IF PORTB.0 = 0 THEN contar            ;espera a que cambie el estado del PIN B0
     PAUSE 200                                   ;retardo para evitar el rebote electrico
     contador = contador + 1
     pause 50
     Lcdout "sumatoria: ", DEC contador	  
     Pause 100		           
     Goto loop		            
     End


----------



## Mushito (Abr 7, 2010)

Estimados compañeros del foro:
Estoy construyendo un TinyProjector, la parte mecánica ya está resuelta, pero de programación se muy poco, con decirles que apenas hice funcionar un led intermitente. 
En la web encontré el PDF del proyecto que estoy construyendo, tiene su código fuente en C, pero ese lenguaje nunca me gusto, así que acudo a los expertos de este tema para que me den una mano en traducir el código de esta página para pasarlo al bsic pro, estaba usando mikrobasic pero decidí usar bsic pro porque es mas sencillo.
De antemano muchísimas gracias y disculpen por colarme al tema de esta manera.
Página 30 y 43 de…
http://web.media.mit.edu/~stefanm/TinyProjector/TinyProjector.pdf
Espacialmente la página 108 y 113.


----------



## Dario (Abr 8, 2010)

hola chicos. yo por aqui de nuevo. bueno, primero le queria dar las gracias a mecatrodatos por ayudarme con lo del servo casero pero, no pude hacer que funcione... tal ves sea que no se como adaptar el programa a mi circuito... en fin... gracias de todas formas en este caso, les queria dejar un control remoto serie proporcional de pic a pic que diseñe. es de un solo canal pero con algunas modificaciones al programa se pueden lograr varios canales. lo que tiene de bueno este circuito, es que a diferencia del que postie anteriormente, cuando el receptor deja de recibir señal, los servos de sus salidas vuelven a cero. espero les sea de utilidad.
saludosss.


----------



## yager (Abr 12, 2010)

alguien por fa como seria en picbasic pro esta  rutina que es originalmente en PIC SIMULATOR IDE :


> 'Subrutina que llena el registro de dezplazamiento
> escribo:
> For col = 1 To 16
> If aux.15 = 0 Then
> ...


gracias de antemano
 interesante proyecto mushito  ,lastima que no pueda ayudarte


----------



## J2C (Abr 12, 2010)

Yager

Para: ----> aux = ShiftLeft(aux, 1) <---- esta parte

proba asi: ===> *aux = aux << 1*

La información respectiva de ayuda la encontraras dentro de _Help ... Help Topics ... PICBASICPRO Basics ... Math Operators ... SHIFT_

y para: ----> WaitUs 2 (supongo que es pause 200)

lo correcto seria: ===> *PAUSEUS 2*

Pero no lo tengo muy claro debido a que presenta restricciones de tiempos de pausa minimos según la frecuencia del Oscilador a Cristal. Solo te puedo confirmar que WaitUs 2 en el PicSimIde se refiere a una espera de 2 microSegundos.

Espero haber sido de ayuda. Saludos. JuanKa.-


----------



## viggiani1975 (Abr 13, 2010)

Hola amigos,
puedo ver que manejan muy bien la programación de micros, yo apenas inicio con basic y pickit2 pero debo acudir a ustedes pues aunque me estoy basando en el libro Microcontroladores de Carlos A. Reyes, aun no he podido encender un led, no sé que me falla pues el grabador indica que se grabó bien pero al montarlo en el board no funciona, estoy trabajando con Microcode Studio  el pic16f628A, así que agradecería una orientación a ver que me falta pues en el libro aparece hasta la imagen del montaje en protoboard y además el código funciona con la simulación en Proteus.

Saludo a los posteadores,

Me gustaría saber porque si me he basado en un libro de Microcontroladores donde se detalla hasta el montaje en protoboar, no explican que hay que colocar el código que agregaré a continuación en el Microcode y sin el cual no había podido hacer funcionar los más básico, como es el encendido de un led.  Por qué el Microcode no genera este código aún cuando ya se ha seleccionado el pic, en mi caso el 16f628A.

Aquí el código:
 @ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
 @ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
 @ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
 @ DEVICE pic16F628A, BOD_ON
 @ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
 @ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
 @ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
 @ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF


----------



## picaficionado (Abr 13, 2010)

Para:

viggiani1975,

Resulta que el libro con el cual estas aprendiendo sobre PIC (del  Autor Carlos A. Reyes) trabaja bajo el quemador de PIC con el IC-prog y este software tiene la particularidad de que los bits de configuracion del PIC se selecciona directamente en la ventana del IC-Prog.

Caso contrario ocurre cuando trabajas con el PicKit2, puesto que con este software, se debe escribir los bit de configuración al inicio del programa para el PIC; en el caso del MicroCode Studio se hace de la forma que planteas:
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 
y los demás bits a su criterio y como los necesite.

Un saludo,


----------



## viggiani1975 (Abr 14, 2010)

Mil gracias por su respuesta, quedo satisfecho y emprendo la marcha en este camino de los micros a ver que tal me va.


----------



## muessli (Abr 14, 2010)

Hola, alguien sabe porque razon sale esto al intentar grabar un 16f887 con pic basic Pro?
Este es el codigo, lo mas sencillo posible...

define osc 4
inicio:
high porta.0
pause 200
low porta.0
pause 200
goto inicio
end


----------



## fitopaez (Abr 14, 2010)

Muesli: te falta la palabra de configuracion,si lo haces desde el MPLAB, compilando con el PBP y  el pickit2 como programador no deberias tener problemas. Ese es un detalle que tiene el pickit2 el de no poder poner los fuses. Si en el MPLAB tienes inconvenientes prueba exportar el archivo (file-export- y luego tilda configuration bits)y que lo haga con los fuses.

Saludos

FITO

Muesli, lo de los fuses, quise decir en forma sencilla, osea darme cuenta facilmente que activo y que no.


----------



## muessli (Abr 15, 2010)

Hey Fito gracias por tu respuesta, yo uso microcode estudio pero de todas formas que fuses son los que se deben activar para que no salga esta advertencia? Digo poner los fuses con codigo asm dentro del programa pbp, si es que te entendi bien...
Gracias.

Saludos.


----------



## atricio (Abr 15, 2010)

revisa en las primeras paginas del foro ademas yo he usado ese libro que tu tienes y he hecho lo que dice en el libro da la casualidad que tienes que leer todo el libro y poner atencion al tema de configuracion del micro code ahi te explica claro si te saltas toda esa informacion y quieres solamente copiar el codigo sin tomar en cuenta eso claro que no te va a funcionar


----------



## viggiani1975 (Abr 16, 2010)

Hola a todos,

Me interesa hacer una alarma con el 16f628A que utilice un lcd para mostrar los mensajes correspondientes a "Digite la clave" o "Digite nueva clave"  y la verdad en ejemplo que se comenta con el 16f84 al inicio de este tema tiene el .hex pero no el .asm o mejor el .bas que sería más práctico, por lo que acudo a ustedes para cualquier orientación al respecto.


----------



## atricio (Abr 16, 2010)

busca en el internet el libro que menciona el amigo muessli te lo bajas y ahi estan un monton de ejemplos que puedes usar con un LCD de 2X16


----------



## viggiani1975 (Abr 17, 2010)

Bueno, yo me estoy basando en el libro de Microcontroladores de Carlos Reyes, allí aparece una alarma con clave en eeprom la cual he simulado en Proteus, sinembargo parece no funciionar o lo hace a una velocidad muy lenta y para cambiar la clave hay que presionar dos pulsadores al mismo tiempo, cosa que no sé como hacer en proteus.  De cualquier forma, hasta este momento no me ha funcionado al introducir la clave pues el relé no activa, como creo que aun no tengo derecho a subir archivos me queda difícil explicar con claridad pero si alguien puede orientarme estaré muy agradecido, además la idea es agregarle un lcd para diversos mensajes que deseo agregar.

Muchas gracias.


----------



## atricio (Abr 17, 2010)

si tienes el libro de reyes ahi hay un capitulo en el que te explican como debes programar tu micro para un LCD incluso muestra paso a paso y con detalle las sentencias a usar yo aqui mismo he posteado un ejemplo que te puede ayudar


----------



## viggiani1975 (Abr 17, 2010)

Si es cierto, ya he estado probando la simulación de la alarma pero no he podido lograr que funcione bien pues la simulación se torna lenta y no logro saber por qué, tomando en cuenta que la he hecho basandome en ese ejemplo. Me gustaría poder subir la simulación y así tener la opinión de los más avanzados, sinembargo, aun no puedo postear nada.  Ni modo.

Gracias por el interés.


----------



## HADES (Abr 17, 2010)

Bueno y ya has probado usar el pic simulator ide de oshon soft es un buenisimo simulador de pics en basic que te corrige tu codigo mismo por si tenes algun error y pues como dije simula el pic con el codigo que le carges solo tenes que buscar en google alguna version gratuita o con algun crack y ya esta ademas en la pagina oficial dan algunos trucos para poder utilisar un lcd y sus comando en fin espero haberte ayudado saludos!


----------



## atricio (Abr 18, 2010)

oye amigo sube no mas tu codigo y simulacion yo que sepa no tienes que bloqueo subela en formato .txt y la simulacion en .rar para acolitarte y la verdad tendrias que revisar que tantos pauses le haz puesto y si es necesario disminuir lazos


----------



## mecatrodatos (Abr 18, 2010)

El siguiente ejemplo es un sistema de control de acceso, en el cual el usuario deberá introducir una contraseña previamente almacenada en la memoria de datos. Si la contraseña es correcta, se genera un mensaje de confirmación y sonido (“Beep”). Si la contraseña es incorrecta, se genera un mensaje de error y un sonido intermitente (“Beep, Beep, Beep”).

El dispositivo encargado de generar el sonido (Buzzer), se encuentra conectado al pin RC0 del Pic 16f877A.


```
' Programa en Pic Basic Pro

Define Osc 4 
' Define el Oscilador para un Cristal
 
' de 4 Mhz.

' Configuración de Puertos:



 
TRISA = %00000000


TRISB = %00000000
TRISD = %01111000
' Declaramos las variables:
X VAR 


 

 
Byte
 
VAR1 VAR 
 
 
Byte
 
DIGITO VAR 
 
 
Byte[7]
 
CLV VAR 
 
 
Byte[7]
 
' Guardamos cada digito de la clave en las posiciones elegidas previamente:

Write 10, 1 

 
 
 
' Primer dígito de la clave
 
Write 11, 2 
 
 
' Segundo dígito de la clave
 
Write 12, 3 
 
 
' Tercer dígito de la clave
 
Write 13, 4 
 
 
' Cuarto dígito de la clave
 
Write 14, 5 
 
 
' Quinto dígito de la clave
 
Write 15, 6 
 
 
' Sexto dígito de la clave
 
' Iniciamos el sistema con una bienvenida:
 
 
Inicio:
 

LCDOut $fe, 2 

 
 
 
' Posiciona el cursor en el inicio
 
LCDOut 
 
 
"Cont. de Acceso"
 
LCDOut $fe,$C0, 
 
 
"** Bienvenido **"
 
Pause 2000 
 
 
' Hacemos una pausa de 2 segundos
 
Call 
 
 
Beep ' Generamos un sonido
 
Clave:
 

X = 0 

 
 
 
' inicializamos la variable X = 0
 
Read 
 
 
10, CLV[1] ' leemos el primer dígito y lo guardamos en CLV[1]
 
Read 
 
 
11, CLV[2] ' leemos el segundo dígito y lo guardamos en CLV[2]
 
Read 
 
 
12, CLV[3] ' leemos el tercer dígito y lo guardamos en CLV[3]
 
Read 
 
 
13, CLV[4] ' leemos el cuarto dígito y lo guardamos en CLV[4]
 
Read 
 
 
14, CLV[5] ' leemos el quinto dígito y lo guardamos en CLV[5]
 
Read 
 
 
15, CLV[6] ' leemos el sexto dígito y lo guardamos en CLV[6]
 
LCDOut $fe, 1 
 
 
' Limpia la LCD
 
LCDOut $fe, 2 
 
 
' Posiciona el cursor en el inicio
 
LCDOut 
 
 
"Introduzca su "
 
LCDOut $fe,$C0, 
 
 
"Clave de Acceso:"
Call Beep ' Generamos un sonido
 
Consulta:

Call 

 
 
 
Teclado ' Consultamos el teclado
 
If 
 
 
VAR1 = 0 Then consulta ' Si no hay una tecla pulsada vuelve a consultar
 
' Si VAR1 es diferente de cero, significa que pulsamos una tecla, por lo

' tanto generamos un sonido y continuamos…



 
Call 
 
 
Beep ' Generamos un sonido
 
' Seguidamente lo que hacemos es almacenar

' en seis variables definidas
' por el programador los dígitos introducidos
' desde el teclado matricial
' para luego ser comparados con los valores
' almacenados en la memoria de datos.



 
X = X + 1
 

DIGITO[X] = VAR1 

 
 
 
' El valor de la tecla pulsada lo
 
' guardamos en la variable correspondiente
 
 
If 
 
 
X = 6 Then comprobar ' Si X = 6 estamos guardando en DIGITO[6]
 
' el último valor introducido desde el

' teclado matricial



 
GoTo 
 
 
consulta ' Si X es diferente de 6 continuamos
 
' esperando el siguiente valor a ser

' ingresado desde el teclado
' A partir de la siguiente etiqueta empezamos la comprobación,
' y el formato es:
'
' Si DIGITO[X] es igual a CLV[X] el digito es correcto,
' y salta a la etiqueta “paseX”,
' si es diferente salta a la subrutina “error”; veamos…



 
Comprobar:
 

If 

 
 
 
DIGITO[1] = CLV[1] Then pase1:GoTo error
 
pase1:

If 

 
 
 
DIGITO[2] = CLV[2] Then pase2:GoTo error
 
pase2:

If 

 
 
 
DIGITO[3] = CLV[3] Then pase3:GoTo error
 
pase3:

If 

 
 
 
DIGITO[4] = CLV[4] Then pase4:GoTo error
 
pase4:

If 

 
 
 
DIGITO[5] = CLV[5] Then pase5:GoTo error
 
pase5:

If 

 
 
 
DIGITO[6] = CLV[6] Then correcto:GoTo error
 
' Si los seis dígitos han sido correctos
 
' se ejecuta la subrutina correspondiente.
 
Correcto:

Pause 500
LCDOut $fe, 1 


 

 
' Limpia la LCD
 
LCDOut $fe, 2 
 
 
' Posiciona el cursor en el inicio
 
LCDOut 
 
 
" * * * * * * "
 
LCDOut $fe,$C0, 

 
"Clave Correcta!"
 
Call 

 
beep ' Generamos un sonido
 
Pause 3000 
 
 
' Pausa para visualizar el mensaje
 
GoTo 
 
 
inicio
 
Error:

Pause 500
LCDOut $fe, 1 


 
 
 
' Limpia la LCD
 
LCDOut $fe, 2 
 
 
' Posiciona el cursor en el inicio
 
LCDOut 
 
 
" * * * * * * "
 
LCDOut $fe,$C0, 

 
" ERROR! "
 
Call 

 
beep ' Generamos un sonido
 
Call 
 
 
beep ' Generamos un sonido
 
Call 
 
 
beep ' Generamos un sonido
 
Pause 1500 
 
 
' Pausa para visualizar el mensaje
 
GoTo 
 
 
clave ' Salta a “clave” para nueva oportunidad
 
' La siguiente subrutina genera un “Beep” en el Buzzer

' conectado en RC0.



 
Beep:


High 

 

 
portc.0 ' Estado Lógico Alto para RC0
 
Pause 100 
 
 
' Pausa de 100 milisegundos
 
Low 
 
 
portc.0 ' Estado Lógico Bajo para RC0
 
Pause 100 
 
 
' Pausa de 100 milisegundos
 
Return 
 
 
' Retorna una línea después del llamado "Call"
 
Teclado:


VAR1 = 0
PORTD.0 = 0 


 
 
 
' Columna 1 = 0
 
PORTD.1 = 1 
 
 
' Columna 2 = 1
 
PORTD.2 = 1 
 
 
' Columna 3 = 1
 
If 
 
 
PORTD.3 = 0 Then VAR1 = 1 ' tecla "1"
 
If 
 
 
PORTD.4 = 0 Then VAR1 = 4 ' tecla "4"
 
If 
 
 
PORTD.5 = 0 Then VAR1 = 7 ' tecla "7"
If PORTD.6 = 0 Then VAR1 = 10 ' tecla "*"
 
PORTD.0 = 1 

 
' Columna 1 = 1
 
PORTD.1 = 0 
 
 
' Columna 2 = 0
 
PORTD.2 = 1 
 
 
' Columna 3 = 1
 
If 
 
 
PORTD.3 = 0 Then VAR1 = 2 ' tecla "2"
 
If 
 
 
PORTD.4 = 0 Then VAR1 = 5 ' tecla "5"
 
If 
 
 
PORTD.5 = 0 Then VAR1 = 8 ' tecla "8"
 
If 
 
 
PORTD.6 = 0 Then VAR1 = 11 ' tecla "0"
 
PORTD.0 = 1 
 
 
' Columna 1 = 1
 
PORTD.1 = 1 
 
 
' Columna 2 = 1
 
PORTD.2 = 0 
 
 
' Columna 3 = 0
 
If 
 
 
PORTD.3 = 0 Then VAR1 = 3 ' tecla "3"
 
If 
 
 
PORTD.4 = 0 Then VAR1 = 6 ' tecla "6"
 
If 
 
 
PORTD.5 = 0 Then VAR1 = 9 ' tecla "9"
 
If 
 
 
PORTD.6 = 0 Then VAR1 = 12 ' tecla "#"
 
Return 
 
 
' Retorna una línea después del llamado "Call"

 
End
```



Espero que esate programa le sirva al amigo viggiani1975 y le aclare muchas de sus dudas.

Para mi compatriota cheyo estoy comprometido con lo del reloj con multiplexado a travez de displays y registros de desplazamiento he esta potencializado el codigo que muy pronto lo subire para compartirlo no me ha QUEDADO MUCHO TIEMPO ya que ando muy atariado en el estudio, el trabajo  y el desarrollo de las partes restantes del tutorial de PROTON IDE.


----------



## muessli (Abr 19, 2010)

Hola mecatrodatos, vos que sos el grande en picbasic por aca, sabes por que razon me deja ese warning el pickit2 al intentar grabar un 16f887? Tengo pic basic pro 2.5 y microcode estudio. (el error esta en una imagen en la pagina anterior).
Muchas  Gracias.


----------



## viggiani1975 (Abr 20, 2010)

Saludos a los posteros, si es que los hay.
Solicito ayuda para mover un micro servo Dinam, la simulación corre perfectamente, pero al momento de ensamblar se queda centrado y no da giros a derecha ni izquierda.

 incrementar var porta.0
 N VAR BYTE
 centrar var porta.2
 control var portb.1
 derecha var porta.0
 izquierda var porta.1

trisb=0
PORTB=0

 n=150
inicio:
pulsout control,n 'Envía x por el pin portb.1 
gosub pulsado    'Subrutina de chequeo del pulsador
goto inicio

pulsado:
if  centrar=0 then gosub centrado
if derecha=0 then gosub aumento
if izquierda=0 then gosub decremento
return

centrado:
pause 100
N=150 
return

aumento:
pause 100
n=n+1
return

decremento:
pause 100
n=n-1
return
end


----------



## muessli (Abr 20, 2010)

Hola Viggiani, a mi me sucedia lo mismo con la sentencia pulsout, yo probe con esto y si funciono bien:
define osc 4
CMCON = 7
pulso var word 
pulso = 1500
inicio:
        high portb.0
        pauseus pulso
        low portb.0
        pause 15

IF porta.0 = 1 AND PULSO < 2500 THEN CALL SUMA
IF porta.1 = 1 AND PULSO > 700  THEN CALL RESTA
GOTO INICIO

SUMA:
        PULSO = PULSO + 30    
        Pause 40             
      Return   

RESTA: 
        PULSO = PULSO - 30    
        Pause 40               
      Return   
END            

Espero te sirva, saludos.


----------



## mecatrodatos (Abr 20, 2010)

muessli dijo:


> Hola mecatrodatos, vos que sos el grande en picbasic por aca, sabes por que razon me deja ese warning el pickit2 al intentar grabar un 16f887? Tengo pic basic pro 2.5 y microcode estudio. (el error esta en una imagen en la pagina anterior).
> Muchas Gracias.


 
Amigo esto sucede en estas dos condiciones:

1. No heber declarado el tipo de oscilador con el que va ha trabajar el pic Crystal Xt, resistencia condensadores HC o interno como el caso del 16f628A.

2.Haber declarado el tipo de oscilador pero con frecuencia de operacion fuera de rango.

Para detectar estas anomalias se depuran los programas desde proteus para mirar el funcionamiento de los registros y la posicion de la memoria de los datos desplazados para cada instruccion que se utilizo en PIC BAsic pro.( Eso lo veremos mas adelante con los PIc de la serie 18f que sera un aporte que hare a la comunidad para la comicacion USB y utilizacion de registros del 18f2550 , 18f452, 18f4550 con proyectos ya que 16f877a se no queda chico para lo que tengo planeado)

Por otro lado estoy interesado en el codigo fuente de realizaste para el pic 16f887 subelo que me da curiosidad si has declaro algun registro o lo compilaste con otro pic


----------



## viggiani1975 (Abr 21, 2010)

Que berraquera, estoy muy sorprendido y agradecido por toda la colaboración que me han prestado, voy a seguir chachareando con los códigos y tratar de subir los que tengo para que me echen  una mano cuando puedan, este tema si que está muy interesante pero requiere dedicación y entusiasmo.

Nuevamente gracias por toda la colaboración y espero poder retribuirles en algún momento.

Saludos nuevamente,

Aquí adjunto los códigos y la simulación en proteus de la alarma con clave y pic16f628A, les agradezco echarle una miradita a ver que falla, pues me he basado en un texto al pie de la letra y me gustaría poder armarla con este pic ya que es el que tengo de momento pues el 16f877 no lo he podido adquirir ya que, de momento, está fuera del presupuesto aunque para el siguiente mes estaré armando otra alarma con éste.

Gracias nuevamente!

Amigo Muessli, desafortunadamente no me ha funcionado el código, he probado varios y en la simulación van bien pero a la hora de armar el tiesto no anda, cambié a oscilador externo y tampoco, no sé que esté fallando?.

Adjunto la simulación, el código y unas fotos del montaje en protoboard para ver si pueden darme una mano en algun rato libre, les estaré agradecido.


----------



## muessli (Abr 21, 2010)

Hola Viggiani, fijate que en  el programa que tenes giro basico 6 las entradas de control del servo se activan con 1 y en el circuito de proteus que tenes estas se activan con 0, fijate eso aver si es que funciona. El servo estas seguro que funciona? Otra cosa, eso que aparece en la foto entre tus archivos de .22k que son??? mira que tienen que salir a masa dos capacitores (ceramicos generalmente) de entre 18 Picofaradios y 32 Pf...Saludos



> Por otro lado estoy interesado en el codigo fuente de realizaste para el pic 16f887 subelo que me da curiosidad si has declaro algun registro o lo compilaste con otro pic



Hola Mecatrodatos, el codigo que realize para el 16f887 es el simple por ahora ya que recien adquiri este pic, adapte varios programas del 16f628a para ver si funcionaba ,se compilaba bien pero al querer grabar en el pickit me salia ese warning sea cul sea el programa que compile. 



> 1. No heber declarado el tipo de oscilador con el que va ha trabajar el pic Crystal Xt, resistencia condensadores HC o interno como el caso del 16f628A.
> 
> 2.Haber declarado el tipo de oscilador pero con frecuencia de operacion fuera de rango.



Estas opciones de declaracion ya las habia probado y no son la solucion. Pero de todas formas buscando y rebuscando la encontre y funciona todo muy bien. Muchas gracias de todas formas. 
Saludos.


----------



## viggiani1975 (Abr 22, 2010)

Hola, amigo Muessli.
He cambiado los valores en el código y nada, también cambié los capacitores a cerámicos de 15pf y 100.000pf y nada, creo que tendré que comprar otro servo pues no estoy seguro que éste funcione, los único que hace es medio vibrar con los cerámicos de más bajo valor.


----------



## viggiani1975 (Abr 23, 2010)

SONIUS dijo:


> Bueno y ya has probado usar el pic simulator ide de oshon soft es un buenisimo simulador de pics en basic que te corrige tu codigo mismo por si tenes algun error y pues como dije simula el pic con el codigo que le carges solo tenes que buscar en google alguna version gratuita o con algun crack y ya esta ademas en la pagina oficial dan algunos trucos para poder utilisar un lcd y sus comando en fin espero haberte ayudado saludos!


Para Sonius, 

Estuve tratando de instalar el programa que recomiendas pero, aunque descargué varias versiones, ninguna funcionó.  Yo tengo Windows 7 y no sé si existe alguna incopatibilidad o simplemente que no he dado con la versión apropiada, agradecería me informaras un poco más.

Gracias.


----------



## kaymar (May 2, 2010)

Hola que tal, saludos a todos! 

He estado leyendo todo este post, y la verdad es que hay cosas muy buenas.

Necesito un poco de ayuda para un proyecto, el cual consiste en lo siguiente:

Necesito obtener la humedad y temperatura de una habitación y estarla graficando.

Para la temperatura pienso usar el famosísimo LM35 para la húmedad no se que usar (es mi primera consulta)

Tenía pensado usar un pic 16F877A para la interfaz por puerto serial y usar labview 8.5.

He visto en el foro como usar el ADC del pic para la adquisición por serial y también en este post vi como usar el pic para usar con el LM35 y un display para desplegar la temperatura .
Y usando el MAX232, haciendo eso el pic es el q procesa los datos.


Ahora bien puedo usar nada mas un MAX232 o un L293D (o algo así) y un ADC y de ahi jalar los datos al labview graficar etc.


¿Qué me sugieren?¿Cómo sería mejor?
Y finalmente tengo que mostrar la temperatura y humedad en una pagina web dinamica, o sea que se actualice constantemente.

SLDS y gracias de antemano


----------



## djxero (May 2, 2010)

Para el tema de humedad tienes la opcion de un ci que hace esta lectura y que lo puedes conectar facilmente al pic,para la web  es mas simple hace un tempo atras realise algo parecido.lo que hacia era montar un servidor (apache) este ya viene configurado con php en el appserver es cosa instalar y ya tenes tu servidor corriendo para la web dinamica utilse swish que es parecido  a macromedia flash pero muy simple. En resumen con visual basic leia los datos del pic guarda esta info en archivo de texto cada cierto tiempo y ala ves un scriot en php lei este mismo archivo y desplegaba  la info en la web echa en flash  ,asi de facil y bonito  voy a buscar los archivos para k los veass

eso   
y saludosss....


----------



## kaymar (May 3, 2010)

De acuerdo muchas gracias djxero!!!

Espero tus archivos, y q me digas el CI para húmedad y algunos detalles más para realizar.


SAlds y grax de nuevo!


----------



## djxero (May 3, 2010)

te subi los archivos Kaymar   cual es tu experiencia con las web para saver ,que aportarte ,por lo del CI de humedad  no lo e utilizado nunca pero veremos que podemos hacer para ayudarte en la programacion(puede servir para proyectos futuros)


----------



## kaymar (May 3, 2010)

Mira con lo q me dices, la verdad no tengo experiencia con web.

Gracias por tus archivos, pero lo de control pues la verdad no tengo con que abrirlos ya que no conozco la extensión.

Y respecto a la programación del pic aun me falta

GRACIAS y saludos


----------



## atricio (May 3, 2010)

alguien me puede ayudar como debo controlar la velocidad de un motor DC con HPWM del microcontrolador mi duda es puedo usar el L293D o de ley debo usar un transistor 
pueden ayudarme por favor


----------



## fernandoae (May 4, 2010)

Y... fijate cuanto consume tu motor y cual es la corriente maxima del ic...


----------



## alzamut (May 4, 2010)

Hola a todos! Alguien sabe como hacer en pic basic para indicar que una entrada analógica es el vref? Es decir, que coja en vez del vref interno, un vRef externo, como por ejemplo 2.5 volts.


----------



## atricio (May 4, 2010)

hola amigo fernandoe mi motor es uno pequeño de esos que van a los jueguetes de radio control es de 6 volts y 43mA lo que quiero es manejarle la velocidad para poder usar el HPWM ya que tengo una curiosidad si puedo usar el L293D o usar transistores muchas gracias por responder


----------



## fernandoae (May 4, 2010)

Usa el L293, no hay problema.



alzamut dijo:


> Hola a todos! Alguien sabe como hacer en pic basic para indicar que una entrada analógica es el vref? Es decir, que coja en vez del vref interno, un vRef externo, como por ejemplo 2.5 volts.


Pudiste hacer funcionar los comparadores? yo quiero hacerlo con el 12F629 pero no hay caso...


----------



## alzamut (May 4, 2010)

Hola fernando, después de muchas horas investigando (y de poner preguntas en todos los foros que conozco) he dado con la que creo que es la respuesta.

Hay que usar el ADCON1 de la siguiente manera.

Pon 1000, en el adresh, (por lo del ADFM) y los 4 bits siguientes dependen de las entradas analógicas que vayas a usar.

En la tabla que adjunto te salen los adresl.

Yo todabía no lo he podido probar porque estoy esperando a que me lleguen 2 16f877, en cuanto los tenga en mi poder, me lío con ello. 

Ya me dirás si funciona.

Saludos!


----------



## fernandoae (May 4, 2010)

Pequeño detalle... el 12F629 tiene comparador, no ADC  en todos lados veo como desactivarlo pero no explican como se usa... habra que seguir leyendo. Mi duda es como configurar los registros adecuados, para no quemar el micro metiendole tensiones inadecuadas


----------



## viggiani1975 (May 6, 2010)

Hola a todos los foreros...

Tengo un servo futaba s3003 y me gustaría controlar los giros izquierda, derecha y el centrado con pulsadores, he probado varios códigos en basic y hasta ahora solo uno me ha medio funcionado pues hace a medias uno de los giros y lo logro centrarlo, es por ese motivo que acudo a ustedes con este código a ver si pueden darme un empujón y mirar que falla. El código es el siguiente:


```
define osc 4
 @ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
 @ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
 @ DEVICE pic16F628A, BOD_ON
 @ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
 @ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
 @ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
 @ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF

r var byte
pulso var word 
CMCON = 7

pulso = 1520

inicio:
'high portb.0
pauseus pulso
'low portb.0
pause 15

IF porta.0 = 0  THEN CALL SUMA
IF porta.1 = 0  THEN CALL RESTA 

GOTO INICIO

SUMA:
 for r=1 to 250 step 1
 high portb.0 
pauseus 1300 
low portb.0 
pause 20  
next
return


RESTA:
for r=250 to 1 step -1
high portb.0
pauseus 1300
low portb.0 
next
return

END
```


----------



## fernandoae (May 6, 2010)

SERVO

Syntax
SERVO Pin , Rotation Value 

Overview
Control a remote control type servo motor. 

Operators
Pin is a Port.Pin constant that specifies the I/O pin for the attachment of the motor's control terminal. 
Rotation Value is a 16-bit (0-65535) constant or WORD variable that dictates the position of the motor. A value of approx 500 being a rotation to the farthest position in a direction and approx 2500 being the farthest rotation in the opposite direction. A value of 1500 would normally centre the servo but this depends on the motor type. 


Example

' Control a servo motor attached to pin 3 of PORTA 

    DEVICE 16F628                        ' We'll use the new PICmicro 
    DIM Pos as WORD                         ' Servo Position 
    SYMBOL Pin = PORTA.3                     ' Alias the servo pin 
    CMCON = 7                             ' PORTA to digital 
    CLS                                ' Clear the LCD 
    Pos = 1500                             ' Centre the servo 
    PORTA = 0                             ' PORTA lines low to read buttons 

TRISA = %00000111                         ' Enable the button pins as inputs 

    ' ** Check any button pressed to move servo ** 
Main:     
    IF PORTA.0 = 0 Then IF Pos < 3000 Then Pos = Pos + 1     ' Move servo left  
    IF PORTA.1 = 0 Then Pos = 1500                 ' Centre servo 
     IF PORTA.2 = 0 Then IF Pos > 0 Then Pos = Pos - 1     ' Move servo right

     SERVO Pin , Pos 
     DELAYMS 5                             ' Servo update rate 
     PRINT AT 1 , 1 , "Position=" , @Pos , " " 
     GOTO Main 

Notes
Servos of the sort used in radio-controlled models are finding increasing applications in this robotics age we live in. They simplify the job of moving objects in the real world by eliminating much of the mechanical design. For a given signal input, you get a predictable amount of motion as an output. 


To enable a servo to move it must be connected to a 5 Volt power supply capable of delivering an ampere or more of peak current. It then needs to be supplied with a positioning signal. The signal is normally a 5 Volt, positive-going pulse between 1 and 2 milliseconds (ms) long, repeated approximately 50 times per second. 

The width of the pulse determines the position of the servo. Since a servo's travel can vary from model to model, there is not a definite correspondence between a given pulse width and a particular servo angle, however most servos will move to the centre of their travel when receiving 1.5ms pulses. 


Servos are closed-loop devices. This means that they are constantly comparing their commanded position (proportional to the pulse width) to their actual position (proportional to the resistance of an internal potentiometer mechanically linked to the shaft). If there is more than a small difference between the two, the servo's electronics will turn on the motor to eliminate the error. In addition to moving in response to changing input signals, this active error correction means that servos will resist mechanical forces that try to move them away from a commanded position. When the servo is unpowered or not receiving positioning pulses, the output shaft may be easily turned by hand. However, when the servo is powered and receiving signals, it won't move from its position. 


Driving servos with PROTON+ is extremely easy. The SERVO command generates a pulse in 1microsecond (µs) units, so the following code would command a servo to its centred position and hold it there: - 

Again: 
    SERVO PORTA.0 , 1500 
    DELAYMS 20 
    GOTO Again 

The 20ms delay ensures that the program sends the pulse at the standard 50 pulse-per-second rate. However, this may be lengthened or shortened depending on individual motor characteristics. 


The SERVO command is oscillator independent and will always produce 1us pulses regardless of the crystal frequency used.

Extraido de la ayuda el PICBASIC PLUS 2.00, espero que te sirva.


----------



## viggiani1975 (May 6, 2010)

Mil gracias, estaré probando y cuando funcione como lo quiero, estaré subiendo todo el circuito y simulación para otros principiantes como yo.


----------



## thenot (May 6, 2010)

Hola amigos... 
no se si sera muy avanzado para lo que tienen, pero podriamos ver la comunicación usb???

o si alguien sabe como es que postee algo, estoy trabajando con un 18f4550 y logre hacer con el EasyHID -Wizard de microcode que el pc me reconociera la placa como un Dispositivo de interfaz humana.. ahora el problema que tengo es con el programa en Visual Basic que me genera... trato de pasar este código a Visual Basic 2008 o 2010 y no puedo =( al hacer la conversión quedan algunas cosas con errores, los cuales no e podido solucionar.. Voy a seguir tratando de solucionar en este problema y también estoy probando el USBCDC ya que es mas fácil para el código en visual, dado que genera un puerto serie y se trabaja igual que este, por lo tanto mas fácil para enviar y recibir datos.. pero no e podido compilar el código.. así que ahí estoy.. cualquier cosa que logre lo pondré aquí.. si alguien tiene algo que me pueda ayudar se lo agradeceré...

Saludos!!


----------



## atricio (May 7, 2010)

mira este documento talvez te oriente

http://www.4shared.com/file/3053768/9d9b3c15/tp2550.html

http://www.4shared.com/file/3028918/bd65dcc9/conectando_un_pic_al_pc_con_el_usb.html

miralo es bastante bueno


----------



## thenot (May 7, 2010)

gracias viejo... pero ya pude hacerlo funcionar 
voy a dejarlo un poco mas comentado y lo subo...

Saludos..
Pd: lo hice mediante UsbCDC

-------------Edit1----------------

viendo lo que mandaste.. el pdf tiene un error...

-------------Edit2----------------

me funcionaron ambos metodos con el USB!!!!!
Aca les dejo ambos proyectos (que son de pruebas asi que no esperen un gran proyecto) que son para entender ambos metodos, el CDC y el HID, el primero simula un puerto serie en el PC, por lo tanto la adquisicion de datos es como cualquier otra de puerto serie con un baudrate de 9600 8n1 y el HID para usarlo como dispositivo de interfaz humana y para adquirir o enviar datos viene con su ejemplo..
Los peros... el ejemplo de con CDC esta en Visual Basic 2008 y traspasarlo a otro lenguaje no es muy dificil, ya que la web esta ya trillado con ejemplos de comunicación serie.. 
El HID esta con un ejemplo en Visual Basic 6, un poco viejito ya.... al 2008 no pude pasar el código dado que me genera unos errores los cuales no supe solucionar..
El USB CDC necesita de un driver al conectarse al PC que esta en las carpetas y HID como es de esperar no usa driver..

Cualquier cosa en que pueda ayudar me dicen.. Saludos!!

PD: Si alguien puede pasar el código del visual basic 6 (el del usb como HID) al 2008 o 2010, se lo agradeceré mucho ya que no pude, y programar en visual basic 6 no me tira mucho...


----------



## viggiani1975 (May 9, 2010)

Saludo a los foreros,

Quiero realizar un programa donde tome valores que se van a adquirir por diferentes métodos como teclado, sensores, etc... y compararlos con unos guardados en la eeprom, muy parecido a la clave de acceso ya comentada, sinembargo no me sale bien y me gustaría tener la opinión o comentario de los visitantes.  A continuación agrego el código que no me funciona:


```
DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1    'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

 VAL3 var byte
 VAL4 var byte  
 E1 VAR BYTE
 E2 VAR BYTE 
 TRISB=0   

 EEPROM 5,[10,14]
 
 READ 5,E1
 READ 6,E2
 
 INICIO:
VAL3=10
VAL4=14

    PAUSE 100 
    Lcdout $fe, 1  
	Lcdout $fe, 2  
	Lcdout  #E1
	PAUSE 300
    Lcdout $fe, 1  
	Lcdout $fe, 2  
    Lcdout #E2
	PAUSE 300
    GOSUB EVALUAR
    GOTO INICIO
    
    
 EVALUAR:
 IF (E1=VAL3)  THEN  VERIFICA
 GOSUB FALSO

  
 VERIFICA:
 IF (E2=VAL4) THEN  VERDADERO
 GOSUB FALSO
 
 
  VERDADERO:
    Lcdout $fe, 1   ' Limpia la pantalla
	Lcdout $fe, 2   ' Posiciona el cursor en el inicio 
	Lcdout  "CLAVE CORRECTA" 
  	
 FALSO:
    Lcdout $fe, 1   ' Limpia la pantalla
	Lcdout $fe, 2   ' Posiciona el cursor en el inicio 
	Lcdout  "CLAVE FALSA" 

 
 END
```


----------



## lanpu (May 12, 2010)

hola amigos, tengo una duda, que puede ser un tanto básica pero necesito ayuda:

quiero utilizar la instrucción POT para controlar la intensidad luminosa de un led utilizando PWM, logro hacerlo pero el brillo maximo que logro es demasiado bajo.
que puedo hacer?..uso un pic16f628a.


----------



## fernandoae (May 12, 2010)

lanpu dijo:


> hola amigos, tengo una duda, que puede ser un tanto básica pero necesito ayuda:
> 
> quiero utilizar la instrucción POT para controlar la intensidad luminosa de un led utilizando PWM, logro hacerlo pero el brillo maximo que logro es demasiado bajo.
> que puedo hacer?..uso un pic16f628a.



Posiblemente este mal el valor SCALE, que sirve para ajustar el valor de la salida dependiendo de la resistencia del pote, hay algunas rutinas que te permiten ajustarlo de forma automatica poniendo el pote al maximo...


----------



## lanpu (May 13, 2010)

Hola fernandoae, efectivamente había leido eso de ejecutar una rutina en la que el potenciometro se pone al maximo y la escala en 255, de esta forma se genera la escala correcta en la variable en la que uno guarda los valores.....pero....donde leo despues ese valor correcto de la escala?¿?¿

gracias


----------



## fernandoae (May 13, 2010)

La  funcion de autocalibracion de los potes es asi... despues usas la variable "escala".


----------



## lanpu (May 14, 2010)

Muchas Gracias fernandoae, veré como me va y luego comento.


----------



## viggiani1975 (May 16, 2010)

Saludo a todos,

Me quiero embarcar en la construcción de un carro a control remoto, tengo 2 servos y un módulo rf de los baratos, he estado mirando por los foros alguna información que ya tengo pero me gustaría saber si alguien ya lo ha hecho para solicitarle más orientación pues me preocupa el control preciso de los servos ya que hasta el momento he logrado moverlos pero no muy eficientemente.


----------



## atricio (May 16, 2010)

primero es obligatorio el uso de servos, puedes usar servos trucados es una alternativa mira he intentado eso en microcode pero no logre exito depende del micro que vayas a usar puede que te ayude este documento te da una idea bastante buena de lo que se vaya a hacer pudes usar un L293D para activar los motores y atravez de un micro receptor activar las salidas necesarias para un L293D y hacer que vaya adelante atras izquierda derecha yo lo logre en Proton pero talvez tu puedas hacerlo asi porque aqui en mi pais no se puede encontrar con facilidad el 16F84A es muy caro aqui


----------



## viggiani1975 (May 17, 2010)

Gracias Atricio,

Algo que se me olvidó preguntar también es cuál es el reemplazo del l297 pues tengo un par de motores de paso bipolares pero el dichoso integrado, que es el único que he visto en todos los diagramas, está agotado en todos los almacenes aquí en Medellín (Colombia).


----------



## atricio (May 17, 2010)

la verdad no he usado el L297 segun mire es un driver para motores a paso lo que no mire es la corriente que soporta pero he usado un L293 para motores a paso y me ha ido muy bien claro esta este funciona muy bien para motores de corriente no tan alta creo que no supera el 1.5 amp de tolerancia depende de lo que tu vayas a usar


----------



## viggiani1975 (May 18, 2010)

Hola nuevamente,

Pues los motores que tengo son pequeños, de alguna impresora vieja no recuerdo cual modelo, el hecho es que me gustaría ponerlos a trabajar y después mirar en que proyecto los pongo, quizás una cnc casera o un robot básico, me toca esperar un poco pues me falta mucho en programación y como había comentado anteriormente no he podido ni realizar un programa eficiente para manejar servos, a duras penas movimientos deficientes a derecha e izquierda.

Saludos.


----------



## fernandoae (May 18, 2010)

Gente el mundo no gira alrededor de los drivers integrados como el L297! conocen los transistores? bueno, esa es la solucion cuando necesitan amperios


----------



## atricio (May 19, 2010)

si es verdad amigo se puede hacer un puente H para solucionar cuanquier requerimento de corriente eso esta muy bien


----------



## muessli (May 25, 2010)

> primero es obligatorio el uso de servos



No estoy de acuerdo en esa afirmacion, los servos si bien son mas exactos no tienen buena velocidad y el control de una rotacion continua es mas complicado. Los motores con un juego  de engranajes que den una buena relacion fuerza/velocidad son mucho mas faciles de controlar con un sencillo puente hecho de algunos transistores rapidos y unos diodos (4 de ambos para ser mas exactos). Tambien esta en juego el precio ya que si se necesita arrastrar un peso mesomenos considerable el servo va a ser muy caro.
bueno, esa es mi opinion. Saludos.


----------



## zambranex (May 25, 2010)

Hola mecatrodatos muy bueno tu aporte sobre programar el pic con contraseña. Bueno tu programacion lo eh hecho compilar en el codestudio y me sale error en la compilacion nose si has usado este programa o otro para hacerlo compilar. porfavor necesito una respuesta tengo un proyecto final sobre control de seguridad y un punto es el de poner contraseña no se si me podrias dar unos consejos del programa y como seria el circuito.gracias


----------



## viggiani1975 (May 26, 2010)

Bueno amigos, solo querìa comentarles que comprè un l293 y l298, francamente es cierto que los transistores son una mejor opciòn pues no me gustò el precio de estos integrados, el primero me costo unos 3 dolares (6500 pesos aquì en Colombia) y el segundo me costo 5 dolares (10.000 pesos), bastante caros me parece, y solo es para entretenimiento aunque de cualquier forma quiero probar ambas opciones y despues comentarè.

Gracias por su interès y la gran ayuda que me han prestado!


----------



## lanpu (May 27, 2010)

hola amigos, estoy usando un pic16f88, y me ha sido imposible utilizar el conversor A/D, simulo en proteus y no me funciona les adjunto los archivos para ver si alguien me puede ayudar, la idea es que el led rojo encienda al comenzar el programa, el azul cuando la luz es baja y el verde cuando es alta.

saludos!!



```
define osc 20
DEFINE ADC_BITS 8  
DEFINE ADC_CLOCK 3   ' USE A/D INTERNAL RC CLOCK
DEFINE ADC_SAMPLEUS 50   'SET SAMPLING TIME IN uS
'VARIABLES
RES VAR WORD  'A/D CONVERTER RESULT
VOLTS1 VAR WORD  'FIRST PART OF RESULT IN mV
VOLTS2 VAR WORD   'SECOND PART OF RESULT IN mV

'CONSTANTS
CONV1 CON 19 '5000/256=19.53, THIS IS THE DECIMAL PART
CONV2 CON 53  'THIS IS THE FRACTIONAL PART

    TRISA=1  'RA0 (AN0) IS INPUT
    TRISB=0  'PORTB IS OUTPUT
    
 'INIATIALIZE THE A/D CONVERTER 
 
    ADCON1=0   'MAKE AN0 TO AN4 AS ANALOG INPUTS, MAKE REFERENCE VOLTAGE=VDD
    
    ADCON0=%11000001  'A/D CLOCK IS INTERNAL RC, SELECT CHANNEL AN0, TURN ON A/D CONVERTER
   HIGH PORTB.2 
   PAUSE 3000
 AGAIN:
 
 'START A/D CONVERSION
 
    ADCIN 0,RES       'READ CHANNEL 0 DATA   
    VOLTS1=RES*CONV1   'MULTIPLY BY 19
    VOLTS2=RES*CONV2    'MULTIPLY 53
    VOLTS2=VOLTS2/100
    VOLTS1=VOLTS1+VOLTS2  'RESULT IN mV
    IF VOLTS1 < 2500 THEN
    HIGH PORTB.0 
    ELSE                                     
    HIGH PORTB.1
    ENDIF
    PAUSE 2000
    GOTO AGAIN     
    END
```

Aqui adjunto el archivo para el proteus. 

GRACIAS!


----------



## fernandoae (May 27, 2010)

Gente tengo una duda que me gustaria aclarar, viendo la pagina neoteo encontre un voltimetro para pilas, en realidad lo que yo queria es aprender a usar el ADC...
El problema surgio al querer compilar el codigo en el "picbasic plus 2.00", me tiraba muchos errores y no logre hacerlo andar... pero ahora me di cuenta el posible problema, en la pagina dice que lo compilan usando el "pic simulator ide"(con el cual si compilo a la primera), y aca esta mi duda... es lo mismo el "pbp plus", el "pic simulator ide" y el "microcode studio" ??? que diferencias tienen?
Desde ya agradezco su respuesta, y si alguien me puede explicar el tema del adc en esos lenguajes mucho mejor, saludos.

Pd: el link es este http://www.neoteo.com/medidor-de-tension-con-pic12f675/pg-4.neo
Y a pesar de que anda cuando toco el pic se enciende parcialmente uno de los leds... problema de codigo o problema del micro? estuve probando bastante y por ahi se jodio algo 

@lanpu
fijate el codigo ese de neoteo, ya lo tengo funcionando, te puede servir


----------



## J2C (May 27, 2010)

Fernandoae

Supongo que son diferentes variantes de BASIC. Al menos tengo instalados en esta PC el "Pic Sumulator Ide 6.65" y el "Pic Basic Pro 2.50C" dentro del "MicroCode Studio Plus 3.0.0.5".

Leo detenidamente este thread y otras paginas en la Web y siempre dudo con que Basic estan hechos los programas, habia empezado a pensar de colocar algo al principio del pragrama para facilitarle las cosas a quienes son como yo MUY NOVATOS.

Saludos. JuanKa.-


----------



## fernandoae (May 29, 2010)

De nuevo yo, con un problema! solucionado lo del adc, ya lo puedo usar en pic simulator ide y con eso por ahora me alcanza, mas adelante me voy a meter con el assembler 
Ahora lo que quiero hacer es recibir 2 bytes y almacenarlos en 2 variables diferentes, mi idea es usar el puerto serie para manejar la intensidad de 6 lamparas. Cada par de variables serian canal-intensidad... si alguien se prende en el proyecto mande un privado, despues lo publicamos por ahi.
Lo que me tiene mal es el comando serin


----------



## HADES (May 30, 2010)

fernandoae dijo:


> Gente el mundo no gira alrededor de los drivers integrados como el L297! conocen los transistores? bueno, esa es la solucion cuando necesitan amperios



Solo una pequena aclaracion fernandoe solo para que no se confundan

L297 Integrado encargado de Generar codigos de bits para control de Mot. PaP.

L298 Integrado encargado de la etapa de Potencia(Puente en H Integrado)

salu2!!


----------



## reyvilla (Jun 14, 2010)

hola, hblando del l297 que lo he reutilizado bastantte con motores paso a paso,. me di cuenta que es mucho mas costoso ese par "l297 y L298" que un pic y nos transistores por lo menos aqui en mi pais saldria mas factible un pic que el driver, me gustaria hacer un L297 con un Pic. No creo que la programacion sea gran cosa, bueno quien quiera intentarlo me avisa y nos ponemos con eso saludos...

http://pdf1.alldatasheet.com/datasheet-pdf/view/22436/STMICROELECTRONICS/L297.html


----------



## mecatrodatos (Jun 14, 2010)

lanpu: hola amigos, estoy usando un pic16f88, y me ha sido imposible utilizar el conversor A/D, simulo en proteus y no me funciona les adjunto los archivos para ver si alguien me puede ayudar, la idea es que el led rojo encienda al comenzar el programa, el azul cuando la luz es baja y el verde cuando es alta.

saludos!!

Que tal no te va ha funcionar porque el programa que posteaste es para los pics de la serie 16f87X por lo registros ADCON aqui te dejo un progrma con la utilizacion de los registros del pic 16f88





> '****************************************************************
> '*  Name    : utilizacion A/D del pic 16f88                     *
> '*  Author  : MECATRODATOS                                      *
> '****************************************************************
> ...


----------



## mecatrodatos (Jun 15, 2010)

comparto una serie de programas para manejos de motores, totalmente comentados con su respectiva simulacion en proteus como codigo fuente con el pic 16f88 en el cual algunos tienen dudas sobre su utilizacion.


> '---------------Titulo --------------
> '****************************************************************
> '* Name : Proyecto con motores ......servo1.pbp *
> '* Author : MECATRODATOS *
> ...


----------



## mecatrodatos (Jun 30, 2010)

```
'****************************************************************
'*  Name    : SERVO 2.BAS                                       *
'*  Author  : MECATRODATOS                                      *
'****************************************************************

'--------Descripcion del programa--------

'Girar servos en las rotaciones de las agujas del reloj y en sentido antihorario
'

'-----------ConnecCIONES-----------

'		PIC16F88 Pin			Wiring
'		---------			 ----------  
'           RB0             Servo Control Wire
'           Vdd             +5 V
'           Vss             Ground
'           MCLR            4.7K Resistor to +5 V

'------------Variables-------------
     
     p0		VAR 	BYTE		' Byte para almacenar la posición del servo
	   		 
'----------Initialization----------

    PORTB = %00000000	        'Eqivalent a: PORTB = 0
                                'Establece todos los pines PORTB a BAJO (0 voltios)
                                'Asegúrese de incluir esta
                                'Inicialización que establece la
                                'Correcta polaridad de los pulsos en
                                'El comando PULSOUT .
    
    OSCCON = $60	            'Establece el oscilador interno en el
                                '16F88 a 4 MHz

'-------------codigo principal------------
	   
loop:

' ************Giro a la izquierda ***********************************

	For p0 = 200 TO 100 STEP -1		' Modificar el valor del pulso de 2 ms y
                                    ' 1 ms en pasos de 10. 
                                    ' Ver siguiente Comando 
	
	PulsOut 0,p0					' Envía un pulso, p0, sobre pin RB0.
                                    ' El período, p0, se multiplica por el
                                    ' Incremento para un oscilador de 4 MHz
                                    ' (10 us) para obtener un pulso de tiempo de espera.
                                    ' Por ejemplo, si p0 = 200,
                                    ' 200 * 10 = nosotros nos 2000 = 2 ms
	
	Pause 20 - p0/100				' Una pausa de 20 ms menos ancho de pulso (p0/100)
                                    ' Si p0 = 200, = 200/100 = p0/100 2 ms.
                                    ' Esta ecuación mantiene el período de
                                    ' El pulso del servo una constante de 20 ms.
	
	Next p0                         ' Volver a la declaración del
                                    ' Siguiente valor de p0 

'*******Rotación hacia la derecha  **************************
    	
	For p0 = 100 TO 200	         	' Modificar el valor del pulso de 1 ms y
                                     '2 ms en pasos de 10. 
	
	PulsOut 0,p0			        ' Envía un pulso, p0, sobre RB0 alfiler.
                                    ' Tiempo de espera varía de un pulso ms 1,0
                                    ' A 2,0 ms.
	
	Pause 20 - p0/100				'Una pausa de 20 ms menos ancho de pulso (p0/100)
	
	Next p0                         ' Volver a la declaración del
                                    ' Siguiente valor de p0
	
	goto loop                       ' Hace que el programa se ejecute siempre
    
    end
```

'****Nota: el mismo diagrama utilizado en el primer proyecto sirve para la simulación******


----------



## lubeck (Jul 2, 2010)

Hola....

Estoy aprendiendo a  usar el adc del pic16f877

pero tengo una  duda en  las lineas que pongo---

que estoy haciendo mal????

```
@ device xt_osc 
define adc_bits 8
define osc 4 
DEFINE LCD_DREG PORTC 
DEFINE LCD_DBIT 4     
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 1    
DEFINE LCD_EREG PORTC 
DEFINE LCD_EBIT 2     

TRISC=1  ;--------------->>>> solo portc.0 es de entrada
adcon0=  ;----------------->>>>  ?????? 

led1 var portb.2              
led2 var portb.3             
led3 var portb.4             
p1 var portb.0               
p2 var portb.1               
x var byte                   

LCDOUT $FE, 1
LCDOUT $FE, 1, "Lubeck: Boton " 
LCDOUT $FE, $C0, "Ninguno" 

inicio
 adcin 0, x   ;--------------->>>>> es correcto??????
 LCDOUT  $FE,$c0,"TEMPERATURA:", DEC x  ;--------------?????
 if (p1=1) AND (p2=1) then 
  LCDOUT $FE, $C0, "Ninguno    " 
  goto apagar
 endif 
 if (p1=0) AND (p2=0) then 
  LCDOUT $FE, $C0, "Emergencia    " 
  goto encender2             
 endif  
 if p1=0 then 
  LCDOUT $FE, $C0, "Primero    " 
  goto encender  
 endif  
 if p2=0 then
  LCDOUT $FE, $C0, "Segundo    "  
  goto encender1  
 endif 
goto inicio       

Apagar:
 Low led1
 low led2
 goto inicio
 
encender:         
 HIGH led1
 goto inicio      

encender1:
 HIGH LED2
 goto inicio 

encender2:
 Low led1
 low led2 
  high led3       
  pause 300       
  low led3        
  pause 300
 goto inicio 
end
```

saludos y gracias de antemano

Ya lo solucione....

las entradas analogas solo son permitidas en el puerto A....mmm .... perdon .....


----------



## mecatrodatos (Jul 5, 2010)

HERRAMIENTAS DE PROGRAMACIÓN 

En la elaboración de proyectos electrónicos con microcontroladores PIC, resulta muy importante considerar una serie de herramientas, las cuales vamos a describir a continuación:

PICBASIC PRO Compiler 2.60

El compilador PICBASIC PRO es la manera más fácil para programar los microcontroladores PIC de Microchip. PICBASIC PRO convierte sus programas de lenguaje BASIC en archivos que pueden ser programados directamente en un microcontrolador PIC.

PBP es compatible con Windows 98/Me/NT/2000/XP/Vista/7. Soporta más de 300 de los microcontroladores PIC de Microchip, incluyendo los lanzamientos más recientes.  PBP le permite elegir el microcontrolador que mejor se adapte a su aplicación.

Utilizado por miles de ingenieros, estudiantes y aficionados de más de una década, el PICBASIC PRO Compiler es una de las herramientas de desarrollo más populares jamás creadas para el microcontrolador PIC.

Ahora con 32-bits 

Una nueva versión de 32-BIT de PBP (PBPL) ofrece BIT, BYTE, WORD, y LONG (32-BIT,) tipos variables. Esta versión está diseñada para trabajar con los dispositivos PIC18. Cuando se trabaja con Long, los operadores matemáticos confirman resultados en 32-bits, en complemento de dos formatos. Esto permite el cálculo de almacenamiento, y la pantalla de los valores entre -2.147.483.648 y 2.147.483.647. 

La  versión Word de 16-BIT se ha mantenido como una aplicación independiente que apoya los microchip: PIC10, Pic12, PIC14, PIC16, PIC17, y microcontroladores PIC18. Esto asegura que PBP seguirá siendo completamente compatible con los programas existentes. También le permite producir código que es mejor optimizado para los dispositivos más pequeños con menos recursos.

El software PICBASIC PRO cuenta con el editor estándar Microcóde Studio de interfaz para Windows. Este entorno de desarrollo contiene potentes funciones de sintaxis con código de colores.

Una versión de línea de comandos de PBP se incluye para la integración en su elección de software de edición (incluyendo MPLAB) o para su utilización en una ventana del símbolo del sistema.

PICBASIC PRO le da acceso directo a todos los registros de MCU PIC - puertos I / O, convertidores A / D, puertos de hardware de serie, etc. de forma sencilla ya en BASIC. Automáticamente se encarga de los límites de página y los bancos de memoria RAM. Incluso incluye comandos integrados para el control inteligente de los módulos LCD. Cálculos de punto flotante son posibles con las rutinas de descarga. 

El conjunto de instrucciones del compilador es compatible con el BASIC Stamp II y utiliza sintaxis Pro BS2. Los programas pueden ser compilados y programados directamente en un microcontrolador PIC, eliminando la necesidad de un módulo BASIC Stamp. Estos programas se ejecutan mucho más rápido. También pueden ser protegidas para que nadie pueda copiar su código.

El compilador PICBASIC PRO puede crear programas para la mayoría de los microcontroladores PIC de Microchip y trabaja con la mayoría de los programadores PIC MCU.

El compilador PICBASIC PRO también se puede utilizar dentro de MPLAB IDE de Microchip .Esto le permite utilizar las herramientas de Microchip para la depuración a nivel fuente. 

VENTAJAS:

1.	Compatible con Windows 98/Me/NT/2000/XP/Vista/7 
2.	Soporta microchip: PIC10, Pic12, PIC14, PIC16, PIC17 y microcontroladores PIC18.
3.	Proporciona una ejecución más rápida de programas más largos que los intérpretes de BASIC.
4.	Acceso directo a cualquier pin o registro interno en un MCU PIC y gestión de banco RAM- BIT, BYTE, WORD, LONG * y variables individuales o conjuntos de 32-BIT para PIC18 *, 16-bits sin signo para otras familias de microcontroladores PIC.
5.	Integra funciones condicionales: If...Then...Else...Endif, Select Case.
6.	Manejo de la expresión jerárquica con la agrupación de paréntesis
7.	Las interrupciones en BASIC y el lenguaje ensamblador
8.	Bibliotecas de BASIC Stamp I y II 
9.	Sistema de apoyo oscilador de reloj de 3.58MHz a 64MHz
10.	Inserción de lenguaje Asembler y llamadas de apoyo.
11.	Compatible con la depuración a nivel fuente de MPLAB / MPASM / ICD2 / ICD3 /ICE

Microcóde Studio

Microcóde Studio es un poderoso entorno de desarrollo integrado Visual (IDE) con la depuración en el Circuito (ICD) diseñado específicamente para la capacidad de PICBASIC PRO compiler.

El editor principal proporciona sintaxis completa resaltada de código con la palabra clave de contexto de ayuda sensible y sugerencias de sintaxis. El explorador de código le permite saltar automáticamente para incluir los archivos, define, constantes, variables, alias y modificadores, los símbolos y etiquetas, que están contenidos dentro de su código fuente. Formatos de cortar, copiar, pegar y deshacer se proporcionan, junto con características de búsqueda y reemplazo.

VENTAJAS:

1.	Contiene resaltado de sintaxis del código fuente.
2.	Proporciona e incluye rápidamente archivos, símbolos, define, variables y etiquetas usando la ventana del explorador de código.
3.	Identifica y corrige la compilación y el ensamblador errores.
4.	Contiene editor serie de salida a su microcontrolador.
5.	Palabra clave basada en ayuda sensible al contexto.
6.	Soporte para MPASM

Es fácil de configurar su compilador, ensamblador y las opciones de programador o puede dejar que Microcóde Studio lo haga por usted con su función incorporada de búsqueda automática. 
Compilación y errores cuando se ensambla pueden ser fácilmente identificados  y corregidos mediante la ventana de error. Simplemente haga clic en un error de compilación y Microcóde Studio automáticamente le llevará a la línea de error. Microcóde Studio viene con una ventana de comunicaciones serie, lo que le permite ver la salida de depuración y de serie de su microcontrolador.


----------



## ByAxel (Jul 5, 2010)

Buena info PBP2.6 soporta para Win7 y junto al MicroCode Studio 4 hacen una buen pareja.

Por cierto, perdón por salir del tema pero alguien en el foro conoce al "Swordfish IDE" para programar PIC18, ya que en el foro no hablan nada de el, aunque sea primo del PicBasicPro y Proton IDE, no le dan mucha importancia.

Saludos.


----------



## mecatrodatos (Jul 5, 2010)

Que tal es de la misma casa de pbp

he trabajado con el y he realizado varias proyectos muy interesantes

"Swordfish IDE"(también conocido como SF) ofrece una verdadera estructura y el enfoque hacia el desarrollo modular del programa - muy similar en algunos aspectos de la programación con Visual Basic.

"Swordfish IDE" produce extremadamente eficiente y estable código. Limitaciones de la versión libre, 200 variables de compilación, no hay restricciones para la duración del programa.


----------



## ByAxel (Jul 5, 2010)

Si lo conocía pero el lenguaje es algo confuso al principio ya que parece una mezcla del C y el Basic, pero
dime si es potente ya que solo es para los PIC18, que de bueno y deferencia trae el Swordfish IDE.

Un saludo.


----------



## mecatrodatos (Jul 5, 2010)

Mira te anexo una guía esta en ingles pero te da ejemplos de como trabajar con el software


----------



## viggiani1975 (Jul 5, 2010)

Saludo a todos,

Empecè a utilizar unos modulos rf bien baratos que comprè pero no he podido realizar una buena transmisiòn de datos, sè que funcionan pues veo parpadear los leds tanto en transmisor como en receptor, sinembargo, basàndome en un ejemplo que utiliza serin-serout con un lcd en el receptor, no logra pasar del primer mensaje y me gustarìa probar eficientemente la transmisiòn, el programa aparentemente està bien aunque me gustarìa saber si alguien tiene un ejemplo en pic basic pro para el control de un motor que ya halla probado.

De nuevo mil gracias, especialmente a Mecatrodatos por sus aportes.


----------



## mecatrodatos (Jul 5, 2010)

Sube las referencias de los módulos rf , el código , el esquemático y si tenes algo en proteus mejor aunque se que proteus no contiene elementos de simulación de rf que yo conozca.

Tengo ejemplos funcionales pero no corren en Proteus ya que no he encontrado el componente emisor y receptor en sus librerias.


----------



## mecatrodatos (Jul 5, 2010)

* AMPLIFICADOR PARA MOTORES*


Antes de empezar nuestra discusión sobre el control de  motores, vamos a echar un vistazo a algunos pequeños amplificadores que podemos utilizar para controlar nuestros motores. 

Todos los amplificadores que he seleccionado son baratos y fáciles de usar.

Sin embargo, no debería haber ningún problema con el uso de otros amplificadores. Si desea  para controlar un motor más grande, todo lo que necesita es un amplificador más grande. 

Los tres amplificadores se que utilizan en los proyectos son económicos y fácil de realizar  para ejecutar el control de motores de 2 ejes o motores paso a paso. El amplificador L298 es más barato, pero también se ocupa de menos amperios. El amplificador que he usado para todos los experimentos es el amplificador LMD 18200T.

Los tres amplificadores toman señales TTL directamente desde el microcontrolador y el control la alimentación del motor. Cada motor requiere una fuente de alimentación compatible con la alimentación  que necesita el motor y la capacidad del amplificador. La fuente de alimentación del microcontrolador y la fuente de alimentación del motor debe mantenerse separada en todas las circunstancias  con sólo una conexión a tierra común. Si no se hace esto, el ruido del motor contaminará el poder para el microprocesador y provocara problemas graves. 

Todos los motores son muy ruidosos por lo que se refiere a electrónica deL PIC y debe ser  aislado. El ruido del motor proviene de los conmutadores de motor y de la rápida  desactivación de las bobinas del motor. A pesar de la adición de pequeños condensadores a tierra  desde cada Terminal del motor y ayuda a través de las terminales, no funciona tan bien como  un diseño bien aislado. Puesto que tenemos una opción, vamos a utilizar fuentes de alimentación independientes en todos nuestros experimentos. Cada uno de los amplificadores utiliza uno o dos circuitos integrados como componentes de su amplificador,  y algunos auxiliares equipados con indicadores LED para anunciar las condiciones internas. 

Sin embargo, otros dispositivos permiten la interconexión a las señales que el microcontrolador proporciona sin la necesidad de dispositivos intermedios.


*Notas sobre el hecho en casa Amplificador de construcción*

Aunque usted puede hacer su propio amplificador, no recomiendo que haga otro. Los amplificadores que es probable que hayan (una serie de los diseños están disponibles en Internet) es probable que sean puentes H bastante sencillo. A menos que un circuito mucho más sofisticados, se añade al circuito amplificador básico, es muy fácil de volar un puente H mediante la activación de ambos transistores en cualquier lado del puente, al mismo tiempo. 

Por otra parte, si utilizamos circuitos integrados para construir nuestros amplificadores, estos circuitos es casi seguro que tienen circuitos dentro de ellos para evitar daños en cortocircuito, cierre de sesión en el sobrecalentamiento, y otras características útiles. Cuanto más sofisticado sea el circuito también proporciona la capacidad de detectar el apagado térmico y para mirar el flujo de corriente a través de cada amplificador.

Puesto que hay una serie de proveedores que venden barato, los componentes a utilizar para el desarrollo de los amplificadores, no hay ninguna buena razón en esta etapa de nuestro proceso de aprendizaje de no utilizar estos recursos para realizar estos amplificadores y  controlar nuestros motores. 


*El amplificador LMD 18200T*.

El amplificador que he usado para todos los experimentos .Las conexiones que utiliza este amplificador se identifican en Figura 1. Cada uno de los dos amplificadores puede manejar hasta 3 amperios a 55 VDC. Pulsos cortos de 6 amperios son tolerados.

La polaridad de la alimentación del amplificador es crítica auque se puede colocar una protección  a través de diodo 4148.

Para nuestros propósitos los pines 1, 2 y 3 se puede utilizar para controlar la bobina / del motor 1, y los pines 6, 7, y 8 control de la bobina / el motor 2.


*El Amplificador 33886*

Si usted necesita un amplificador de un solo eje, el amplificador 33866 de eje único que se  muestra en la figura 2 es adecuado para motores pequeños que necesitan menos de 5 amperios a 40 V. 

He utilizado este amplificador para los pequeños experimentos con el motor de CC. Las conexiones de cableado de este amplificador son sencillas. Una característica de seguridad de este amplificador proporciona un diodo de protección contra la conexión accidental de polaridad inversa al conector de alimentación.


*CARACTERÍSTICAS*: 

- poder en la potencia del motor se conecta a estos dos terminales. Aunque un
diodo de protección se incluye, la polaridad de la conexión debe ser observada.

- motor de corriente continua Aquí es donde el motor está conectado. La polaridad de esta conexión no es importante. Las operaciones de motor se pueden invertir en software.

- LEDs Los tres LED en la tarjeta de indicar la operación de la tarjeta como el poder
y señales de control se aplican a la tarjeta.


*El Amplificador L298 2-Ejes*

El amplificador L298 de control de doble eje se muestra en la Figura 3 con sus conexiones de cableado identificadas. Este circuito permitirá el control de dos motores.

El amplificador L298 tiene un problema con las señales PWM en determinadas condiciones y no deben ser utilizados en los experimentos sofisticados con muchos cambios de PWM ambos ejes simultáneamente. Hay algunas interferencias y problemas de incumplimiento. La condición no inhibe el uso de este amplificador de bajo costo para el funcionamiento de pequeños motores. Se trata del más barato amplificador integrado de 2 ejes que usted puede considerar para armar.


----------



## carlos jara (Jul 8, 2010)

mecatrodatos dijo:


> que tal vamos con el primer proyecto de manejo de teclado matrixal utilizando operandos matematico de pic basic pro:
> 
> 
> ```
> ...



amigo por que es que  no puedo abrir el proteus en mi pc yo tengo el proteus 6.9 que version necesito para abrir estos circuitos


----------



## mecatrodatos (Jul 8, 2010)

la versión 7.7 de proteus para los proyectos con motores y anteriores temas con el 7.6


----------



## carlos jara (Jul 8, 2010)

mecatrodatos dijo:


> la versión 7.7 de proteus para los proyectos con motores y anteriores temas con el 7.6



MUCHAS GRACIAS AMIGO POR TU PRONTA RESPUESTA SABES QUISIERA CONTAR CON TU AYUDA A MI PROGRAM 
lo que pasa es que tengo una duda con respecto a mi programa echo en pic basicpro utilizo el pic628 mira cuando presiono p1 enciende led 1 
por 1 seg, si presiono p2 me enciende led 2 por 1 seg y si presiono los dos pulsadors ala vez enciende led 3 parpadee 5 veces  pero quiero agregarle un led4 que se inicie desde  que se activa el circuito osea que encienda despues de cada 10 min por 20 min prendido en realidad  echo una prueba con un tiempo mas corto pero no me funciona y quisera saber si tu me podrias ayudar con respecto ami dudas no se mucho de interrupciones  solo aprendo por los temas que  tocan ustedes y un libro que me comprado pero la lucho por favor espero tu ayuda amigo
led1 var portb.2 
led2 var portb.3 
led3 var portb.4 
led4 var portb.5 
p1 var portb.0 
p2 var portb.1 
x var byte 
i var word 

option_reg = $05 
on interrupt goto isr 
intcon = $A0 

inicio 
if (p1=0) AND (p2=0) then encender2 
PAUSE 200 
if p1=0 then encender 
PAUSE 200 
if p2=0 then encender1 
PAUSE 200 
goto inicio 

encender: 
high led1 
pause 1000 
toggle led1 
pause 1000 
goto inicio 

encender1: 
high led2 
pause 1000 
toggle led2 
pause 1000 
goto inicio 

encender2: 
for x=0 TO 4 
high led3 
pause 300 
low led3 
pause 300 
NEXT 
goto inicio 

DISABLE 
ISR: 
HIGH LED4 
PAUSE 300 
LOW LED4 
PAUSE 300 

end


----------



## viggiani1975 (Jul 9, 2010)

Saludos a los foreros,
Posteo este código que he tratado de probar con modulos rf (fsi000a-cdr03a) para transmitir datos y no me ha funcionado, agradeceré la colaboración que puedan darme pues lo que quiero es usarlo para controlar un par de servos que tengo y construirme un carro a control, lastimosamente la transmisión presenta problemas, sé que los módulos funcionan pues le coloco un led a pin del receptor y este parpadea a la par del código enviado pero en cuanto a la prueba con un código más amplio... se queda. 

```
'CODIGO PARA EL TRANSMISOR BASICO CON PIC16F628A
 
' @ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
 Define osc 4
 @ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
 @ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
 @ DEVICE pic16F628A, BOD_ON
 @ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
 @ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
 @ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
 @ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF
 
 CMCON=7  


   R VAR BYTE
   Y VAR BYTE
   TRISB=%0
   
   INICIO:
   
     FOR R=1 TO 10 
     PORTB=1
     GOSUB TIMER
     PORTB=0
     GOSUB TIMER
     NEXT
     PAUSE 5000
     
     FOR Y=1 TO 10
      FOR R=1 TO 100
      PORTB=1
      GOSUB TIMER
      PORTB=0
      GOSUB TIMER
      NEXT
      PAUSE 2000
      NEXT
      GOTO INICIO
      
     TIMER:
       PAUSE 10
     RETURN
    END 

'CODIGO PARA EL RECEPTOR BASICO CON PIC16F628A
 
 '@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
 Define osc 4
 @ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
 @ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
 @ DEVICE pic16F628A, BOD_ON
 @ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
 @ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
 @ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
 @ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF
 
CMCON=7  
DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1    'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

 DATOS VAR BYTE
 
 INICIO:
   LCDOUT $FE,1,"ESPERA..."
   LCDOUT $FE,$C0,"TOMA DE DATOS"
   COUNT PORTB.0,200,DATOS
   IF DATOS=10 THEN PAUSE 500:GOTO INGRESO
   GOTO INICIO
   
 INGRESO:
 
   COUNT PORTB.0,2000,DATOS
   IF DATOS=100 THEN GOTO VISUALIZAR
   GOTO INGRESO
   
 VISUALIZAR:
  LCDOUT $FE,1,"DATOS INGRESADOS:" 
  LCDOUT $FE,$C0,DEC DATOS
  PAUSE 5000
  GOTO INICIO
  END
```

Hola nuevamente,

Respecto al código expuesto anteriormente por nuestro amigo Mecatrodatos para el control de servos, me gustaría decirles que tuve que modificarlo pues el recorrido era parcial, me gustaría saber por qué, tengo un futaba s3003 y lo hice funcionar con el 16f628, el funcionamiento es casi perfecto, el recorrido del servo hacia izquierda y derecha llega al tope en uno y hacia el lado contrario, le queda faltando un pequeño tramo, publico el código para cualquier comentario que puedan hacer.


> @ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
> 'Define osc 4
> @ DEVICE pic16F628A, WDT_ON      ' Watchdog Timer ON
> @ DEVICE pic16F628A, PWRT_ON     ' Power-On Timer
> ...


----------



## mecatrodatos (Jul 10, 2010)

viggiani1975:

Respecto al código expuesto anteriormente por nuestro amigo Mecatrodatos para el control de servos, me gustaría decirles que tuve que modificarlo pues el recorrido era parcial, me gustaría saber por qué, tengo un futaba s3003 y lo hice funcionar con el 16f628, el funcionamiento es casi perfecto, el recorrido del servo hacia izquierda y derecha llega al tope en uno y hacia el lado contrario, le queda faltando un pequeño tramo, publico el código para cualquier comentario que puedan hacer.

Amigo la razón es que utilizo un servo  Multiplex , para despegarte las dudas te anexo documento de servos con sus características técnicas y un tutorial Servomotor.pdf: 
http://www.servomotor.cc/wp-content/uploads/2010/03/Tutorial-Servomotor.pdf


----------



## viggiani1975 (Jul 10, 2010)

Oh... es correcto, la información es muy clara,sinembargo  ahora pasaré a trucar los servos para que los giros sean completos tal como lo detalla el documento. Sigo atento a cualquier sugerencia respecto a los módulos rf y el código descrito anteriormente que espero poder hacer funcionar algún día.

Gracias por la info.


----------



## mecatrodatos (Jul 11, 2010)

Cordial saludo amigo carlos jara por supuesto que estamos prestos a colaborar , anexo documento realizado por mi , donde se explica como utilizar el contador(S) y temporizador(S) del pic 16f877A , en esta parte se especifica las configuraciones de los registro y ejemplos para calcular el TMRO como contador y temporizador, esta en formato de documento agradecería a un miembro del foro lo convirtiera a PDF.

comentar es agradecer


----------



## yhisus (Jul 14, 2010)

Buenas Noches amigos y amigas de foros electronica, soy nuevo en esta area y quisiera saber si me pueden ayudar con una transmision de modulos RF para comunicar dos pic 16f877a, en el proyecto que quiero haces es transmitir codigo morse, en primera instancia quisiera transmitir una palabra para que sea mostrada por una LCD de 16x2, si aguna persona pe pudiare ayudar se lo agradeceria...! yo tengo el codigo morse ya hecho en microc pero no se cono hacer para transmitirlo...!

el codigo es:
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

#define t_punto        120
//#define t_raya           3 * t_punto
//#define t_sep            t_punto
//#define t_sep_letras     3 * t_punto
//#define t_sep_palabra    5 * t_punto

void main() {
     unsigned char i, p, n, fin_letra;

     TRISC = 0x01;

     Lcd_Init();
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(1, 3, "Codigo MORSE");

     i = 1;
     while(1) 
     {
       p = 0;
       n = 0;
       if(PORTC.B0==0)
       {
          Delay_ms(t_punto/2);
          if(PORTC.B0==0)
          {
            fin_letra = 0;
            do
            {
              Delay_ms(t_punto);
              p = p << 1;
              n++;
              if(PORTC.B0==0)   // raya
              {
                p++;
                Delay_ms(2 * t_punto);
              }
              Delay_ms(t_punto);
              if(PORTC.B0==1) // Termino letra
              {
                if(n==1)
                {
                  switch (p)
                  {
                     case 0: Lcd_Out(2,i,"E");
                             break;
                     case 1: Lcd_Out(2,i,"T");
                             break;
                  }
                }
                if(n==2)
                {
                  switch (p)
                  {
                     case 0: Lcd_Out(2,i,"I");
                             break;
                     case 1: Lcd_Out(2,i,"A");
                             break;
                     case 2: Lcd_Out(2,i,"N");
                             break;
                     case 3: Lcd_Out(2,i,"M");
                             break;
                  }
                }
                if(n==3)
                {
                  switch (p)
                  {
                     case 0: Lcd_Out(2,i,"S");
                             break;
                     case 1: Lcd_Out(2,i,"U");
                             break;
                     case 2: Lcd_Out(2,i,"R");
                             break;
                     case 3: Lcd_Out(2,i,"W");
                             break;
                     case 4: Lcd_Out(2,i,"D");
                             break;
                     case 5: Lcd_Out(2,i,"K");
                             break;
                     case 6: Lcd_Out(2,i,"G");
                             break;
                     case 7: Lcd_Out(2,i,"O");
                             break;
                  }
                }
                if(n==4)
                {
                  switch (p)
                  {
                     case 0: Lcd_Out(2,i,"H");
                             break;
                     case 1: Lcd_Out(2,i,"V");
                             break;
                     case 2: Lcd_Out(2,i,"F");
                             break;
                     case 3: Lcd_Out(2,i,"x");
                             break;
                     case 4: Lcd_Out(2,i,"L");
                             break;
                     case 5: Lcd_Out(2,i,"x");
                             break;
                     case 6: Lcd_Out(2,i,"P");
                             break;
                     case 7: Lcd_Out(2,i,"J");
                             break;
                     case 8: Lcd_Out(2,i,"B");
                             break;
                     case 9: Lcd_Out(2,i,"X");
                             break;
                     case 10: Lcd_Out(2,i,"C");
                             break;
                     case 11: Lcd_Out(2,i,"Y");
                             break;
                     case 12: Lcd_Out(2,i,"Z");
                             break;
                     case 13: Lcd_Out(2,i,"Q");
                             break;
                     case 14: Lcd_Out(2,i,"x");
                             break;
                     case 15: Lcd_Out(2,i,"no existe");
                             break;
                  }
                }
                i++;
                fin_letra = 1;
              }
            } while(fin_letra==0);
            Delay_ms(2 * t_punto);
            if(PORTC.B0==1) // Termino palabra
            {
                Lcd_Out(2,i," ");
                Delay_ms(2 * t_punto);
            }

          Delay_ms(500);
          if(i>15)
          {
            Lcd_Cmd(_LCD_CLEAR);
            Lcd_Cmd(_LCD_CURSOR_OFF);
            Lcd_Out(1, 1, "Codigo Morse");
            i = 1;
          }
          else
            i++;

}       }
     }
}


----------



## viggiani1975 (Ago 2, 2010)

Saludos,

Agradecería una mano con el siguiente problema, quiero hacer un swiche con módulos rf, he implementado un código que aparentemente funciona, lo que sucede es que al agregar el antirrebote por sofware este deja de funcionar o lo hace mal, lo mismo sucede con antirrebote por hardware.  Publico el código para cualquier aclaración.

```
'CODIGO PARA tx

 
 CMCON=7  

Include "modedefs.bas" 
BOTON1 var porta.2
TRISB=1

INICIO:
 PAUSE 10
 if boton1=0 then gosub LED_VERDE  
goto INICIO
 
LED_VERDE:
 serout portb.0,T9600,[$FF,$FF,"OK","C"] 
 goto inicio 

end
----
rx

Include "modedefs.bas"           'para usar serin
 CMCON=7
 TRISB=1
PAUSE 500      
datos var byte 
LED var porta.0 
ENTRADA VAR PORTB.0
LED=1

INICIO:
serin ENTRADA,T9600,["OK"],datos 
If datos="C" then TOGGLE LED
goto INICIO
end
```


----------



## GoX F4yCk3r DB (Ago 9, 2010)

Hola que, Necesito una ayudadita en esto.
Necesito controlar la velocidad de un motor a pasos unipolar, estoy usando el UL2003, el motor es de 6 hilos, no c si usar 4 pulsadores o solo 1, ah tambien debo hacerlo reversible.
Alguna idea de como implementarlo??? soy nuevo en esto.
salu2


----------



## lubeck (Ago 9, 2010)

Hola GoX

Mira este ejemplo para que te des una idea... es muy similar el funcionamiento que con el ULN...

https://www.forosdeelectronica.com/f24/solo-ejemplos-picbasicpro-proteus-39938/#post330601

Saludos


----------



## GoX F4yCk3r DB (Ago 9, 2010)

Hola lubeck que tal!!!
oie solo tengo una duda...
El ejemplo que me pasaste que controla???
Veo un LCD es para ver las revoluciones por minuto??? o algo parecido.

Lo que me gustaria implementar es el control de el del motor pap, es dcir si pulso un boton que gire no c 90° y si pulso otro que gire 135° algo por estilo.

Lo he estado intentando pero no me sale ademas de que no conosco bien el funcionamiento del ULN2003.

Intente encender un led con un pulsador cuando mande un cero, pero me tope con eso del "sin antirebote" y "con antirebote" se la diferecia entre ambos pero no logro prender el led cuando lo hago "con atirebote", otra duda es, tiene esto algo que ver o en algo me afectara al hacer el programa para mi motor pap??
Por cierto mi Proteus no pudo abrir el archivo adjunto
salu2


----------



## lubeck (Ago 9, 2010)

Hola que tal!!!



> oie solo tengo una duda...


no nada mas es una son mas 



> El ejemplo que me pasaste que controla???


Motores paso a paso unipolares y bipolares
unipolar 6cables y bipolar 4 cables 



> Veo un LCD es para ver las revoluciones por minuto??? o algo parecido.


no recuerdo que muestra pero no son las revoluciones por minuto... podrias quitar esa parte del ejemplo



> Lo que me gustaria implementar es el control de el del motor pap, es dcir si pulso un boton que gire no c 90° y si pulso otro que gire 135° algo por estilo.


te convendria mas un servomotor, los motores a pasos son eso dan paso por paso y debes contar el numero de pasos para llegar a los grados que requieres dando un numero de pulsos en secuencia...



> Lo he estado intentando pero no me sale ademas de que no conosco bien el funcionamiento del ULN2003


.
el ULN es solo una etapa de potencia es decir los micros no dan suficiente amperaje para que se mueva un motor y el uln es el que le ayuda en el trabajo...



> Intente encender un led con un pulsador cuando mande un cero, pero me tope con eso del "sin antirebote" y "con antirebote" se la diferecia entre ambos pero no logro prender el led cuando lo hago "con atirebote", otra duda es, tiene esto algo que ver o en algo me afectara al hacer el programa para mi motor pap??


el anti rebote no es mas que dar una pausa despues de presionar un boton para que no se repita mas de una vez o hay otro metodo sin pause con el mismo efecto...

salu2


----------



## GoX F4yCk3r DB (Ago 9, 2010)

jeje disculpa por las multiples dudas!!!
pero aun tengo demasiadas...
Estoy equivocado en cuanto a el control del motor pap quiza no soy muy bueno explicandome jejej lo que quiero hacer es que con pulsos varie la velocidad del motor o el numero de pasos dados.
Tengo una idea de como, corrigeme si estoy mal de favor
El motor pap que utilizo tiene 6 hilos, 2  son comunes y los otros 4 pertencen a las bobinas, si mando voltaje a una bobina da ciertos pasos, si le mando voltaje a otra bobina camina otros ciertos pasos.
Lo que tengo que controlar es eso. jejeje no soy muy bueno en esto apenas empiezo.

se que se hace con if..then ( lo de antirrebote afecta esto?)

espero ahora si haberme eplicado bien

Por cierto aqui un video de lo que quiero hacer 



salu2


----------



## lubeck (Ago 9, 2010)

> jeje disculpa por las multiples dudas!!!


no te preocupes era solo una broma...



> pero aun tengo demasiadas...


Disipalas mira aqui hay un totorial que explica exactamente el funcionamiento de un PAP...
http://www.todorobot.com.ar/informacion/tutorial stepper/stepper-tutorial.htm



> Estoy equivocado en cuanto a el control del motor pap quiza no soy muy bueno explicandome jejej lo que quiero hacer es que con pulsos varie la velocidad del motor o el numero de pasos dados.


si se varia la velocidad segun la rapidez con que hagas la secuencia de los pasos...



> Tengo una idea de como, corrigeme si estoy mal de favor
> El motor pap que utilizo tiene 6 hilos, 2 son comunes y los otros 4 pertencen a las bobinas, si mando voltaje a una bobina da ciertos pasos, si le mando voltaje a otra bobina camina otros ciertos pasos.
> Lo que tengo que controlar es eso. jejeje no soy muy bueno en esto apenas empiezo.



mas o menos... lo que tienes que hacer es energizar bobina por bobina que son por ejemplo 4 empizas energizando una y luego la que sigue y la que sigue y asi das los pasos, en el concepto de los cables reviza eel tutorial... 



> se que se hace con if..then ( lo de antirrebote afecta esto?)



no entiendo a que te refieres con eso del antirrebote pero creo que esta confundiendo terminos...



> espero ahora si haberme eplicado bien


si te entendi perfectamente desde el principio pero reviza a fondo el ejemplo y el tutorial que te puse y te quedara mas claro...

en el ejemplo el L298 hace lo mismo que el ULN2803 o los Transistores del video solo dan potencia al motor con una fuente de poder independiente a la del uC(microcontrolador) 


saludos...


----------



## GoX F4yCk3r DB (Ago 9, 2010)

Muchas gracias Lubek, ya tengo mas claras mis ideas de como hechar a andar esto, espero hacer programa en el trascurso de la semana, aun me falta investigar algunas cosas, por lo mientras a pensar como se va a montar!!! Gracias de nuevo y por aqui andare de nuevo con mas dudas jeje, si no es mucha molestia!!!
salu2


----------



## lubeck (Ago 9, 2010)

> aun me falta investigar algunas cosas,



Claro eso es solo el principio... conforme vayas avanzando te encontraras con otras cuestiones... pero lo 
importante es empezar...

Suerte...


----------



## viggiani1975 (Ago 10, 2010)

Saludos nuevamente,

Me gustaría implementar un control por rf de varios canales, he programado para dos que aparentemente funcionan, sinembargo, cuando pasa un tiempo menor a una hora, el segundo puerto que programo cambia de estado sin motivo alguno, me gustaría tener la opinión de algun colaborador si es posible,  a continuación publico el código del transmisor y receptor.

```
TX-------
CMCON=7  
Include "modedefs.bas" 
BOTON1 var PORTA.1
BOTON2 VAR  PORTA.2
I VAR BYTE
C VAR BYTE
LED1 VAR PORTA.3
LED2 VAR PORTA.4
TRISB=0


INICIO: 
if boton1=0 then gosub ACTIVAR_ALARMA 
IF BOTON2=0 THEN GOSUB  OPCION_BLOQUEO
goto INICIO 

ACTIVAR_ALARMA:
serout portb.0,N2400,[$FF,$FF,"OK","C"] 
goto INICIO 

OPCION_BLOQUEO:
serout portb.0,N2400,[$FF,$FF,"OK","D"]
GOTO INICIO

end

RX------
Include "modedefs.bas"           'para usar serin
 CMCON=7
 TRISB=%11110011
     
datos var byte 
LED1 var PORTB.2
LED2 VAR PORTB.3 
ENTRADA VAR PORTB.0
X VAR BYTE
 
inicio:
serin ENTRADA,N2400,["OK"],datos 
If datos="C" then ACTIVACION_ALARMA
IF DATOS="D" THEN ACTIVACION_BLOQUEO

ACTIVACION_ALARMA:  
if LED1=0 then 
high led1
else
low led1
endif
goto INICIO

ACTIVACION_BLOQUEO:
if LED2=0 then 
high led2
else
low led2
endif
goto INICIO
end
```


----------



## lubeck (Ago 10, 2010)

> cuando pasa un tiempo menor a una hora, el segundo puerto que programo cambia de estado sin motivo alguno,



Puede ser que tu programación este bien.... haz esta prueba conecta una licuadora o similar en la misma toma de tu circuito y prendelo varias veces si cambia si razon puede ser algo que se llama no se que EMI si no encuentras informacion con ese dato postea... en el foro hay un post de Fogonazo que lo menciona en un caso similar al tuyo...

puede ser que poniendo unos capacitores en la alimentacion del micro se resuelva...

saludos...


----------



## HADES (Ago 10, 2010)

lubeck dijo:


> Puede ser que tu programación este bien.... haz esta prueba conecta una licuadora o similar en la misma toma de tu circuito y prendelo varias veces si cambia si razon puede ser algo que se llama no se que EMI si no encuentras informacion con ese dato postea... en el foro hay un post de Fogonazo que lo menciona en un caso similar al tuyo...
> 
> puede ser que poniendo unos capacitores en la alimentacion del micro se resuelva...
> 
> saludos...



eh lubeck? lo que le estas intentando decir al compañero es que debido al tipo de fuente que tiene le entra "ruido electrico" al pic y eso deriva en que le da inestabilidad y una actuacion aleatoria al pic? es eso? y de ser asi generalmente se colocan en la alimentacion un condensador electrolitico de 470uF y otro de 100nF saludos!


----------



## lubeck (Ago 10, 2010)

> eh lubeck? lo que le estas intentando decir al compañero es que debido al tipo de fuente que tiene le entra "ruido electrico" al pic y eso deriva en que le da inestabilidad y una actuacion aleatoria al pic? es eso? y de ser asi generalmente se colocan en la alimentacion un condensador electrolitico de 470uF y otro de 100nF



si mas o menos... pero en el caso que menciono no se resolvió poniéndole los condensadores... no recuerdo... pero a otro compañero si le funciono... entonces yo diria que intentara poner los condensadores como indicas.... incluso lo mas cerca del uC... el de 100nf


----------



## HADES (Ago 10, 2010)

lubeck dijo:


> si mas o menos... pero en el caso que menciono no se resolvió poniéndole los condensadores... no recuerdo... pero a otro compañero si le funciono... entonces yo diria que intentara poner los condensadores como indicas....



si! otra es que el compañero verifique bien como conecto los condensadores que van en el cristal del pic!! podria ser eso tambien!!


----------



## GoX F4yCk3r DB (Ago 10, 2010)

> TrisB=255
> TrisC=0
> Portc=%110000
> 
> ...



Hola que tal lubeck ya estuve checando y viendo el programa del control del motro pap pero hay cosas que no comprendo del todo, codigos que desconosco su función, si me puedieras hechar la mano de favor.

-Por que se utiliza trisb=255???
-Me podrias explicar la Subrutina "Mueve F" y "Mueve H" me refiero a porque el If y porque los signos aritmeticos con condiciones?
- La variable "AStep" cual es su función?
- La subrutina "ADC"
- "Sens A" y "Sensb" por que estas variables, cual es su función, como las conecto al ULN2??

salu2


----------



## lubeck (Ago 10, 2010)

> -Por que se utiliza trisb=255???


Trisb es para definir un puerto en sus ocho bits como entrada o salida
si convirtiéramos el 255 o binario seria 11111111
entonces si con 0 se define que sea de salida y 1 que sean como entrada
deducimos que con 
trisb=255 le estamos diciendo al uC que los ocho bits o puertos van a ser de entrada...
y seria lo mismo que trisb=%11111111



> -Me podrias explicar la Subrutina "Mueve F" y "Mueve H" me refiero a porque el If y porque los signos aritmeticos con condiciones?


la rutina F es para hacer un paso completo(full) y la H es para hacer un medio Paso(half) si revisas bien el tutorial te fijaras que existen esas dos maneras de hacer los pasos incluso hay otra que son lo micropasos
los if then es para energizar las bobinas... jejej no recuerdo como le hice dejame repasarlo...



> - La variable "AStep" cual es su función?


la variable astep guarda el paso anterior y tener como referencia este para incrementar el siguiente paso... y si el paso tremina el ciclo de las bobinas se reinicializa...



> - La subrutina "ADC"
> - "Sens A" y "Sensb" por que estas variables, cual es su función, como las conecto al ULN2??


ya me acorde para que es el display... 
la subrutina ADC que no la veo en el codigo  que pusiste sirve segun recuerdo para mostrar el consumo de los motores en los puertos de conversión Analogico Digital y en sensA y SensB llega la corriente....
estos los puedes quitar junto con el lcd , el codigo y las resistencias....
basicamente dejar el codigo como lo pusiste... tambien quitas el ADCON1 que es algo similar al TRIS pero generalmente se usa para el puertoA...


----------



## GoX F4yCk3r DB (Ago 10, 2010)

Lubeck ya estuve diseñando mi programa pero es muy rustico, ya entiendo varias cosas que hace rato no entendia, pero aun me quedan dudas.



> Inicio:
> if portb.0=1 then
> if portb.1=0 then astep=Astep+1
> if portb.1=1 then
> ...



En tus if, el primero de todos se supone que es como un paro y arranque, no??? si este es verdadero ejecuta todo lo demás pero si es falso los demás no hacen nada, mi duda es. el primer if no tiene una instruccion en si para mover el motor y en la simulacion cuando lo activas el motor tiene un movimiento como es esto?

-if portb.3=0 then Lcdout $fe,1,"Value A:", DEC astep
En ese If mandas una intruccion al LCD, que relación tiene que cuando lo pulsas afecta el movimiento del motor ?? Digiste que la subrutina ADC no la pelara porque va relacionado al display, que relacion tiene que cuando aprieto el tercer pulsador afecta el movimiento del motor si cuando condicionas el portb.3 no hay ninguna instruccion que se mande al motor??? o bueno al menos yo no la veo; La instruccion "DEC" que función tiene?? pq esta relacionada con la variable AStep.

Lo de las subrutinas Mueve F y H no las entiendo del todo.

Gracias por tu ayuda y tu tiempo.
salu2


----------



## lubeck (Ago 10, 2010)

```
define  OSC 4 ' se define el tipo de oscilador a usar

Define  LCD_DREG        PORTD ' De aqui a->
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTD
Define  LCD_RSBIT       2
Define  LCD_EREG        PORTD
Define  LCD_EBIT        3  ' <- aqui se definen lo pueros del LCD

Define  ADC_BITS        10     	' De aqui a->
Define  ADC_CLOCK       3     	
Define  ADC_SAMPLEUS    50  '<- se define como se a manejar el conversor analogico a digital  	

TrisB=%11111111 ' se definen todos los puertos como entrada
TrisC=%00000000 ' se definen todos lo puertos como salida

Portc=%110000 ' se le dice que lel bit 4y5 se inicialicen en alto los demas en bajo

SensA   var word	'de aqui a ->				
SensB   var word
AStep   Var word '<- a aqui se declan la variables en tipo word o doble byte		

ADCON1 = %10000010	' se define el puertoA esto se ve en la tabla del Datasheet de cada uC
astep=0	' se inicializa variable  astep=0		
Pause 500  ' se hace una pausa de 500 milisegundos

     		
Inicio: ' se crea una etiqueta 
 if portb.0=1 then  ' si se pulsa la tecla colocada en Mueve entonces
  if portb.1=0 then astep=Astep+1 ' aumenta un paso si el boton derecha esta sin presionar
  if portb.1=1 then                      'si no
   if astep<>0 then astep=Astep-1 ' entonces verifica que no este en el primer paso si no es asi disminuye
  endif                                       ' un paso esto es para dar hacia la derecha o izquierda
  if portb.2=0 then gosub mueveh 'si el pulsador Hall/full esta desactivado se va a la rutina mueveH 
  if portb.2=1 then gosub muevef  ' si el pulsador Hall/full esta activado se va a la rutina MueveF
  if portb.3=0 then Lcdout $fe,1,"Value A:", DEC astep ' si el pulsador senece va a desplegar en Decimal
                                                                         ' el valor de Astep... osea el numero del paso en
                                                                         ' la secuencia de 8 pasos en caso de ser Full
                                                                        ' o 4 en caso de ser Half
 endif              
 if portb.3=1 then gosub adc ' si el pulador sense esta en alto entonces se va a la rutina ADC
Goto inicio ' se hace un bucle      				
End ' se termian el codigo
```

Hasta ahi se entiende...?????


----------



## GoX F4yCk3r DB (Ago 10, 2010)

Mas claro ni el agua, Entendido. 
Gracias


----------



## lubeck (Ago 10, 2010)

```
MueveF: ´esta es la subrutina de medio paso o sea solo son 4 pasos
 if astep>=5 then astep=1 ' si el paso es mayor o igual a 5 se inicia la secuencia en 1 porque nada mas 
                                    ' son 4 pasos esto sirve cuando gira a la derecha
 if astep<=0 then astep=4 'pero si esta girando a la izq si el paso llega a 1 se va a 4
 if astep=1 then portc=58 ' aqui se manda la secuencia en decimal al puertoc haz la conversion en binario
 if astep=2 then portc=54 ' de cada uno de estos valores y te daras cuenta en que orden los manda...
 if astep=3 then portc=53 ' el 58,54,53,57
 if astep=4 then portc=57
 pause 100 ' se hace una pausa para que no vibre el motor y le de chance de dar el sig. paso

return

MueveH: ' esto es lo mismo que lo anterior pero en 8 pasos
 if astep>=9 then astep=1 ' aqui definimos igual los linites de los pasos en el contador
 if astep<=0 then astep=8 'y aqui
 if astep=1 then portc=17 ' haz la conversion en binario del 17,57, 40...etc y te daras cuenta como es la
 if astep=2 then portc=57' secuencia
 if astep=3 then portc=40
 if astep=4 then portc=58
 if astep=5 then portc=18
 if astep=6 then portc=54
 if astep=7 then portc=46
 if astep=8 then portc=53 
 pause 100 ' hace una pausa en cada paso para que termine de dar el paso si  no nada mas vibra el motor

return

ADC:
 ADCIN 0, SensA ' toma la lectura de la corriente en la resistencia sensa			
 ADCIN 1, SensB	' en la sensb		
 Lcdout $fe,1,"Value A:", DEC sensa," B:",Dec sensb ' el valor lo convierte en decimal DEC  y lo desplega
Return
```

Se entendio....

FIN....


----------



## viggiani1975 (Ago 11, 2010)

Muchas gracias compañeros, he puesto en práctica lo de los condensadores pero sigo notando el mal comportamiento, lo que me parece extraño es que funcione bien cuando se programe para controlar un solo pin mientras que al tratar de hacerlo con otros, no funciona bien. También puedo darme cuenta del ruido pues coloqué un led en la salida del módulo receptor y éste parpadea con swicheos, bajones de luz, etc sin afectar los pines programados, entonces será investigar más a fondo y estar atento aquí en el foro porque lo que yo pretendía era colocarselo a mi moto para activar una alarma y un bloqueo de la llanta trasera pero... ahora lo veo como peligroso, imaginen una alta velocidad y un bloqueo espontáneo con una tractomula detrás!!!.


----------



## lubeck (Ago 11, 2010)

> he puesto en práctica lo de los condensadores pero sigo notando el mal comportamiento,



mmm... se pone interesante que pic estas usando???? ya lo mencionaste???

hay algo raro con el cmcon=7

porque lo pusiste????

lo del bloqueo de la llanta si me parece peligroso pero podrias bloquar la corriente o la gasolina o que se yo!!!! y lo mas importante el saber que esta pasando....


----------



## viggiani1975 (Ago 11, 2010)

Hola amigo Lubeck,
Yo siempre utilizo el 16f628a.  Francamente no sé a qué se debe el problema, en una ocasión anterior cuando pretendía utilizarlo para mostrar los números de un teclado, el pin a5 que es el mclr, no lo dejaba funcionar bien, nuestro compañero mecatrodatos me dió la mano con eso, por tal motivo es que dudo que sea ruido pero tampoco puedo asertar con la respuesta al problema.

El cmcon para la conversión análogo a digital de portA será lo que está afectando???
A probar enseguida.


----------



## lubeck (Ago 11, 2010)

edite mi mensaje viste lo del cmcon=7

porque lo pones???

no domino muy bien el puertoA pero creo que lo estas poniendo como comparador y debe ser digital....

revisamos eso???? o estas seguro que asi va???


----------



## viggiani1975 (Ago 11, 2010)

Si claro,pero para este pic el cmcon=7 apaga los comparadores y los convierte a digitales, además quité la línea y probé, la falla se sigue manifestando, sigo interesado en el bloqueo para complicarle la vida a los ladrones, si se diera el caso, trabándoles la moto para que no puedan llevarsela apagada.


----------



## atricio (Ago 11, 2010)

dale un tiempo variable con la entrada de los pulsadores hazle contar los pulsos y eso le haces proporcional al tiempo que vayan cambiando los bits de salida para cada bobina del motor


----------



## lubeck (Ago 11, 2010)

Saludos atricio

... creo que estas hablando del otro caso de los motores.... disculpa si me equivoco...

el problema de viggiani es este_ https://www.forosdeelectronica.com/posts/342750/ _
viggiani 
y si pruebas cambiarlo de puerto al B o C u otro que no sea el A

dejame verificarlo pero segun yo es con el ADCON1 con lo que se define si es digital...

*Viggiani...*

Tienes toda la razon es CMCON=7 para ese micro...
descartado eso...

hablas de una transmision  de RF, no???
ya descartaste que sea eso verdad.... o sea que no esta conectado cuando se vuelve inestable...


----------



## viggiani1975 (Ago 12, 2010)

Pues no sé si serán los módulos rf los que presenten problema (FSI000A-CDR03A), hasta ahora los veo funcionando bien y como te comenté anteriormente, cuando programo para un solo pin parece funcionar bien por lo que creo que el problema no es tan trivial como parece.  Voy a probar con un solo pin durante todo el día a ver si se mantiene y lo estoy comentando aquí nuevamente esta noche, de lo contrario, pues me tocaría desechar la idea del bloqueo con rf y pensarlo con teclado directamente en la moto para mayor seguridad.

Gracias.


----------



## atricio (Ago 13, 2010)

ahi si que me declaro ignorante no se como debenhacer eso lo que yo he hecho es con los modulos de rf mover a un robot como un control remoto pero solo a un solo canal no en diferentes si alguien si lo sabe seria bueno q lo poste por favor


----------



## viggiani1975 (Ago 13, 2010)

Pues eso si que sería bueno, he probado el mismo código para el pic16f819 y con sorpresa observo el mismo problema, funciona bien para un canal, el otro se apaga en menos de 10 minutos, le dejo esa inquietud a los más expertos porque ya me cansé de darle por un lado y el otro sin buenos resultados, entonces no sé cómo será para implementar el ejemplo que brinda el señor Christian Bodington en su edición gratuita de "Basic para Microcontroladores Pic", específicamente el proyecto N°41 sobre un control de 8 canales, cuya única diferencia está en que utiliza la instrucción toggle (que usé con el mismo resultado) y el pic16f877.


----------



## lubeck (Ago 13, 2010)

Pues yo no soy experto pero yo haria una prueba con esto en el codigo si no funciona casi podria asegurar que el codigo no es... con reserva de la cuestion de definir los osciladores...

```
TX-------
Include "modedefs.bas" 
CMCON=7  
[B]TRISA=6[/B]
TRISB=0
BOTON1 var PORTA.1
BOTON2 VAR  PORTA.2
I VAR BYTE ' no se para que la declara
C VAR BYTE ' no se para que la declara
LED1 VAR PORTA.3
LED2 VAR PORTA.4

INICIO: 
if boton1=0 then gosub ACTIVAR_ALARMA 
IF BOTON2=0 THEN GOSUB  OPCION_BLOQUEO
goto INICIO 

ACTIVAR_ALARMA:
serout portb.0,N2400,[$FF,$FF,"OK","C"] 
[B]return[/B]

OPCION_BLOQUEO:
serout portb.0,N2400,[$FF,$FF,"OK","D"]
[B]return[/B]

end

RX------
Include "modedefs.bas"           'para usar serin
CMCON=7
TRISB=%11110011
     
datos var byte 
LED1 var PORTB.2
LED2 VAR PORTB.3 
ENTRADA VAR PORTB.0
X VAR BYTE ' no se para que  define esta variable
 
inicio:
serin ENTRADA,N2400,["OK"],datos 
If datos="C" then gosub ACTIVACION_ALARMA
IF DATOS="D" THEN gosub ACTIVACION_BLOQUEO
[B]Goto Inicio[/B]

ACTIVACION_ALARMA:  
if LED1=0 then 
high led1
else
low led1
endif
[B]return[/B]

ACTIVACION_BLOQUEO:
if LED2=0 then 
high led2
else
low led2
endif
[B]return[/B]
end
```

tienes algun esquema????


----------



## reyvilla (Ago 13, 2010)

hola, buenas quisiera dar un pequeño aporte y ver si me pueden dar sus criticas constructivas al respecto y por supuesto si hay alguna mejora.
se trata de un minutero programable muy parecido al de un microhondas, me lo mandaron como un proyecto de la univ. con compuertas y demas pero quise no enrollarme y hable con el profe y me permitio utilizar un pic siempre y cuando cumpliera el cometido osea programar un tiempo en minutos y que al culminar osea llegar a cero este envie una alarma pues como ven es bien sencillo mas el programita me salio algo largo y me costo ya que a pesar de tener conosiendo al pic mas de un año a penas he logrado utilizar unos 30 comandos del pbp de los mas de 50 que se pueden usar. mas que todo debido a que no he tenido tiempo para ponerme mas de lleno con el pbp. en fin el programa, me gustaria saber si esta bien o se puede mejorar utilizando otras instrucciones...de atemano muchas gracias...


----------



## viggiani1975 (Ago 13, 2010)

Para Lubeck,
No, no tengo esquema pero es bien básico pues lo único que tengo conectado a las salidas en el receptor son un par de leds, nada más, éste sería el punto de partida para mi pequeño proyecto.

Estoy probando los cambios que sugeriste y creo que funciona efectivamente, parece ser el retorno a inicio lo que afectaba la segunda salida, de cualquier forma mañana lo someto a prueba durante un largo periodo y con mucho ruido. 

Por cierto, trisa=6 que significa?

Muchas gracias.


----------



## HADES (Ago 13, 2010)

viggiani1975 dijo:


> Para Lubeck,
> No, no tengo esquema pero es bien básico pues lo único que tengo conectado a las salidas en el receptor son un par de leds, nada más, éste sería el punto de partida para mi pequeño proyecto.
> 
> Estoy probando los cambios que sugeriste y creo que funciona efectivamente, parece ser el retorno a inicio lo que afectaba la segunda salida, de cualquier forma mañana lo someto a prueba durante un largo periodo y con mucho ruido.
> ...



eh, saludos compañero sera que podrias darme algunos datos??? si es claro que no los has dado ya por ejemplo:

que modelo de pic estas usando?
que cristal estas usando?
condensadores de cuantos picofaradios estas usando y cuantos para el cristal?

saludos!

HADES



reyvilla dijo:


> hola, buenas quisiera dar un pequeño aporte y ver si me pueden dar sus criticas constructivas al respecto y por supuesto si hay alguna mejora.
> se trata de un minutero programable muy parecido al de un microhondas, me lo mandaron como un proyecto de la univ. con compuertas y demas pero quise no enrollarme y hable con el profe y me permitio utilizar un pic siempre y cuando cumpliera el cometido osea programar un tiempo en minutos y que al culminar osea llegar a cero este envie una alarma pues como ven es bien sencillo mas el programita me salio algo largo y me costo ya que a pesar de tener conosiendo al pic mas de un año a penas he logrado utilizar unos 30 comandos del pbp de los mas de 50 que se pueden usar. mas que todo debido a que no he tenido tiempo para ponerme mas de lleno con el pbp. en fin el programa, me gustaria saber si esta bien o se puede mejorar utilizando otras instrucciones...de atemano muchas gracias...



Disculpa que lenguaje estas usando* pregunto* porque decis que usas *pbp*
entonces???

saludos!

HADES


----------



## viggiani1975 (Ago 14, 2010)

Saludo amigo Hades,

Utilizo el 16f628a
Cristal de 4Mhz
cerámicos para el cristal de 18pf

Utilizo una fuente variable con lm317 con filtros de 2500 mf que parece funcionar bien y un regulador en el board de 5v con otro pequeño filtro de 470mf y uno de 100nf sobre las entradas del pic.


----------



## lubeck (Ago 14, 2010)

> Por cierto, trisa=6 que significa?



Utilizas el puerto 1 y 2 del A como entrada

asi que:
TRISA=6 es lo mismo que TRISA=%0000110

Saludos


----------



## reyvilla (Ago 14, 2010)

Utilizo el picbasic pro "pbp"


----------



## HADES (Ago 14, 2010)

Ya lo descargue lo chequeare y te comento alguna mejora o tal vez algun derivado que logre hacer con tu codigo!! saludos!

por cierto con los comando podrias chequear esta pagina que explica un poquito mas los comandos:
http://www.oshonsoft.com/picbasiccompilerreferencemanual.html

saludos!

HADES


----------



## lubeck (Ago 14, 2010)

Jeje.. si funciona en el simulador mi única critica es que te felicito....y que podrias depurar un poco el codigo... 

saludos...


----------



## viggiani1975 (Ago 15, 2010)

Saludos nuevamente,

Quería comentar que gracias a los cambios de programación sugeridos por Lubeck, el programa para el swiche rf me funcionó, definitivamente el retorno a inicio era el problema (goto inicio) y con return funciona perfectamente, le agregué nuevamente los pauses en cada cambio pues sin ellos el cambio de estado no se daba de una vez, en fin, funcionó, gracias por la colaboración.


----------



## HADES (Ago 15, 2010)

viggiani1975 dijo:


> Saludos nuevamente,
> 
> Quería comentar que gracias a los cambios de programación sugeridos por Lubeck, el programa para el swiche rf me funcionó, definitivamente el retorno a inicio era el problema (goto inicio) y con return funciona perfectamente, le agregué nuevamente los pauses en cada cambio pues sin ellos el cambio de estado no se daba de una vez, en fin, funcionó, gracias por la colaboración.



Ok,  me alegra que te haya funcionado!!!

@lubeck mano la hiciste saludos!


----------



## lubeck (Ago 15, 2010)

> mano la hiciste saludos



Vaya!!!  por fin le atino a una...  ya tenia rato que nada mas no... 

Saludos mi estimado Hades...


----------



## reyvilla (Ago 16, 2010)

Buenas del minutero gracias por verlo aui les traigo una pequeña modificacion con un efecto animado y el logo del instituto a ver que les parece me avisan cualquier cosa.


----------



## lubeck (Ago 16, 2010)

Este me marca un error que nunca habia visto.... que sera???


----------



## Eduardo (Ago 16, 2010)

lubeck dijo:


> Este me marca un error que nunca habia visto.... que sera???


Es el Proteus.
Tenés declarados los fuentes (ver imagen) y antes de ejecutar los quiere compilar. Salta el error porque no encuentra al PBP.
Eliminás esas dos líneas desde Source->Add/Remove Source files y desaparece el problema.
(la otra es configurar el camino y los argumentos para compilar desde el Proteus)

Bueno... desaparece ese y aparece otro .  Después que terminan los mensajes iniciales empieza a dar "Stack Overflow"


----------



## atricio (Ago 16, 2010)

sera que pueden postear el codigo para poderlo ver y hacerlo cambios y hacer algunas pruebas por favor sera mucha molestia


----------



## GoX F4yCk3r DB (Ago 17, 2010)

Hola que tal, alguna idea de como mostrar en un LCD las teclas que fueron presionadas por un teclado matricial de 3x4???
Por cierto lubeck, gracias por tu ayuda con lo del motor, ya me quedo y jala perfectamente.
salu2


----------



## lubeck (Ago 17, 2010)

Una manera de hacerlo es codificandolo...

mira este ejemplo...
https://www.forosdeelectronica.com/f24/solo-ejemplos-picbasicpro-proteus-39938/#post345642

existe un integrado que hace esa funcion pero yo no lo encontre y lo emule con f84a
ve el datasshet de integrado MM74c922  para que veas su funcionamiento...

eso tiene la ventaja de que tu micro no ocupa tiempo en hacer la lectura... queda bastante bien...
para desplejarlo utilizas otro micro y utilizas 4puertos el resultado en es binario... lo decodificas y listo...
a ver si te sirve...


----------



## GoX F4yCk3r DB (Ago 17, 2010)

Hola que tal, diseñe este programa, pero tengo un gran problema
No se como conectar un teclado matricial en proteus. alguna sugerencia??

aqui esta el prog


> define lcd_lines 4
> DEFINE LCD_DREG  PORTB
> DEFINE LCD_DBIT 4
> DEFINE LCD_RSREG  PORTB
> ...


----------



## reyvilla (Ago 17, 2010)

AQUI EL PROGRAMITA DEL MINUTERO

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 18/06/2010                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
Define osc 4
@ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
@ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
@ DEVICE pic16F628A, BOD_ON
@ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
@ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
@ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
@ DEVICE pic16F628A, PROTECT_OFF ' protección de código OFF
CMCON = 7  

pause 500'TIEMPO DE ESPERA 1/2 SEG. PARA ESTABILIZAR EL PIC



MAS VAR PORTA.0
MENOS VAR PORTA.1
ENTER VAR PORTA.2
A VAR BYTE
B VAR BYTE
MINUTOS VAR BYTE
SEGUNDOS VAR BYTE

A = 0
B = 0
MINUTOS = 0
SEGUNDOS = 0
'DEFINICIÓN DE REGISTROS PARA EL LCD
DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1    'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 2     'EN EL BIT B.2
TRISA = %00000111 
TRISB=0 'ESTABLECER EL PUERTO B COMO SALIDA
PORTB.6 = 1

PAUSE 500 ' PAUSE DE MEDIO SEGUNDO
LCDOUT $FE, 1 ' LIMPIAR VISOR
LCDOUT 254,  64, $15,$15,$15,$15,$15,$15,$15,$0  '0 lineas verticales
    LCDOUT 254,  72, $1F,$0,$1F,$0,$1F,$0,$1F,$0   '1 lineas horizontales
    LCDOUT 254,  80, $E,$1F,$1F,$1F,$1F,$1F,$E,$0  '2 circulo negro
    LCDOUT 254,  88, $E,$11,$11,$11,$11,$11,$E,$0  ' 3 circulo blanco
    LCDOUT 254,  96, $1F,$15,$1F,$15,$1F,$15,$1F,$0 '4 lineas verticales

LCDOUT $FE, 1 ' LIMPIAR LCD    
'******************************************************************************* 
GOSUB INICIO
INICIO: 
LCDOUT $FE,$84, "IUNP"
LCDOUT $FE,$80,0
pause 50   
LCDOUT $FE,$C0,4
pause 50   
LCDOUT $FE,$81,2
pause 50    
LCDOUT $FE,$82,3
pause 50  
LCDOUT $FE,$C1,1
pause 50   
LCDOUT $FE,$C2,1
pause 50    
LCDOUT $FE,$C3,1
pause 50  
LCDOUT $FE,$C4,1
pause 50   
LCDOUT $FE,$C5,1
pause 50   
LCDOUT $FE,$C6,1
pause 50  
LCDOUT $FE,$C7,1
pause 50 
LCDOUT $FE,$C8,1
pause 50  
LCDOUT $FE,$C9,1
PAUSE 2000
'MOSTRAR LETRA POR LETRA
GOSUB PRESENTACION
Procesando:
LCDOUT $FE, 1 ' LIMPIAR LCD      
For A = 0 to 15
LOOKUP A,[ "POR FAVOR ESPERE" ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT 
LCDOUT $FE,$C0, "CARGANDO"    
For A = 0 to 15
LOOKUP A,[ "......." ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT 


PANTALLA_PRINCIPAL:
    LCDOUT 254, 64,   0,  0,  0,  4,  0,  0,  0, 0
    LCDOUT 254,  72,  0,  0,  4, 14,  4,  0,  0, 0
    LCDOUT 254,  80,  0,  0, 14, 14, 14,  0,  0, 0 
    LCDOUT 254,  88,  0,  4, 14, 31, 14,  4,  0, 0
    LCDOUT 254,  96,  0, 21, 14, 31, 14, 21,  0, 0 
    LCDOUT 254, 104,  0,  4, 14, 31, 14,  4,  0, 0 
    LCDOUT 254, 112,  0,  0, 14, 14, 14,  0,  0, 0  
    LCDOUT 254, 120,  0,  0,  4, 14,  4,  0,  0, 0
    LCDOUT 254, 128,  0,  0,  4, 14,  4,  0,  0, 0

LCDOUT $FE, 1 ' LIMPIAR LCD
LCDOUT $FE,1, " PONER MINUTOS"
LCDOUT $FE,$8F, 0
PAUSE 50
LCDOUT $FE,$8F, 1
PAUSE 50
LCDOUT $FE,$8F, 2
PAUSE 50
LCDOUT $FE,$8F, 3
PAUSE 50
LCDOUT $FE,$8F, 4
PAUSE 50
LCDOUT $FE,$8F, 5
PAUSE 50
LCDOUT $FE,$8F, 6
PAUSE 50
LCDOUT $FE,$8F, 7
PAUSE 50
LCDOUT $FE,$8F, 8
PAUSE 50

LCDOUT $FE,$C0, "-<<", dec (MINUTOS),">>+ INICIAR"
PAUSE 250
IF MAS OR MENOS = 1 THEN
GOSUB TECLAS_DE_SELECCION
ENDIF 
IF ENTER = 1 THEN
SEGUNDOS = 60
MINUTOS = MINUTOS - 1
GOSUB CONTEO
ELSE
GOSUB PANTALLA_PRINCIPAL
ENDIF 
TECLAS_DE_SELECCION:
IF MAS = 1 AND MINUTOS = 99  THEN 
MINUTOS = 0
ENDIF
IF MENOS = 1 AND MINUTOS = 0  THEN 
MINUTOS = 100
ENDIF

IF MAS = 1 THEN
MINUTOS = MINUTOS + 1
ENDIF
IF MENOS = 1 THEN
MINUTOS = MINUTOS - 1
ENDIF
GOSUB PANTALLA_PRINCIPAL

PRESENTACION:
LCDOUT $FE, 1 ' LIMPIAR LCD      
For A = 0 to 13
LOOKUP A,[ "    BIENVENIDO   " ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT 
LCDOUT $FE, $C0      
For A = 0 to 14
LOOKUP A,[ "  MINUTERO V1.0  " ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT
LCDOUT $FE, 1 ' LIMPIAR LCD      
For A = 0 to 11
LOOKUP A,[ "    DERECHOS    " ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT 
LCDOUT $FE, $C0      
For A = 0 to 12
LOOKUP A,[ "   RESERVADOS    " ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT 
LCDOUT $FE, 1 ' LIMPIAR LCD      
For A = 0 to 14
LOOKUP A,[ " REALIZADO POR: " ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT 
LCDOUT $FE, $C0      
For A = 0 to 15
LOOKUP A,[ "REIMY VILLAMIZAR" ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT
LCDOUT $FE, 1 ' LIMPIAR LCD      
For A = 0 to 15
LOOKUP A,[ " I . U . N . P . " ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT 
LCDOUT $FE, $C0      
For A = 0 to 12
LOOKUP A,[ "   09/08/2010  " ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT
RETURN
CONTEO:
LCDOUT $FE, 1 ' LIMPIAR LCD
LCDOUT $FE,1, "  TEMPORIZANDO  "
LCDOUT $FE,$C0,"----",dec(MINUTOS),":",dec(segundos),"-PARAR-"
SEGUNDOS = SEGUNDOS - 1 
GOSUB PAUSA_11SEG
IF MINUTOS = 0 AND SEGUNDOS = 0 THEN
LCDOUT $FE, 1 ' LIMPIAR LCD
LCDOUT $FE,1, "   FINALIZADO   "
LCDOUT $FE,$C0,"----",dec(MINUTOS),":",dec(segundos),"-PARAR-"
PORTA.3 = 1
GOSUB PAUSA_11SEG
PORTA.3 = 0
PORTA.3 = 1
GOSUB PAUSA_11SEG
PORTA.3 = 0
PORTA.3 = 1
GOSUB PAUSA_11SEG
PORTA.3 = 0
PORTA.3 = 1
GOSUB PAUSA_11SEG
PORTA.3 = 0
PORTA.3 = 1
GOSUB PAUSA_11SEG
PORTA.3 = 0
GOSUB Procesando
ENDIF
IF SEGUNDOS = 0  THEN
GOSUB PAUSA_11SEG
MINUTOS = MINUTOS - 1
SEGUNDOS = 59
CALL PARAR
GOSUB CONTEO
ENDIF

PARAR:
IF MENOS = 1 THEN
GOTO Procesando
ELSE
GOTO CONTEO
ENDIF
END 

PAUSA_11SEG:
PAUSE 1000
RETURN
PAUSA_12SEG:
PAUSE 200
RETURN


----------



## reyvilla (Ago 18, 2010)

por cierto este programita me ayudo bastante con los caracteres y figuras de la lcd


----------



## Dario (Ago 18, 2010)

hola gente 
les cuento que estoy intentando hacer un variador brushless con pic, ya hice uno con componentes dicretos que funciona _aqui pueden verlo _andando. es un poco voluminoso y complicado asi que, ahora quiero hacerlo con un pic utilizando pbasic para programar el micro pero, tengo un problema, basandome en el funcionamiento del bldc discreto, he creado una rutina en pbasic que a segun mis calculos, deberia funcionar igual pero no funciona.
aca subo el rar con el diseño completo y su codigo fuente en basic para ver si me pueden dar una mano y asi saber que estoy haciendo mal para corregirlo. lo que hace el circuito, es detectar una secuencia de numeros binarios del 1 al 6 y a segun el numero que entre, sera el estado en sus salidas.
saludosss a todos...


----------



## lubeck (Ago 19, 2010)

Hola D@rio



> para ver si me pueden dar una mano y asi saber que estoy haciendo mal para corregirlo.....



si gustas lo intento 



```
CMCON = 7 'Aqui creo que esta mal reviza la ficha tecnica del micro hay un apartado que te dice
 que numero utilizar, asi los estas definiendo todos como digitales y necesitas un analogico...
si no lo en cuentras postea
 TRISA=%00000000 ' en el puerto que conectes el pote del puerto A que son Analogicos lo defines como entrada eje TRISA=%00000001 el pote conectado en RA0/AN0
 porta=%00000000 ' este no es muy importante ahi pones en bajo todas las salidas del portA
 trisb=%01110000  'Defines del puerto B el 4,5,6 como entrada y el resto como salida
 portb=%01110000 ' inicializas del puerto B el 4,5,6 en estado Alto el resto en bajo
 frec var byte ' aqui declaras la variable frec cuyo valor solo puede ser de 0 a 7
```
hasta ahi se entiende lo que quiero decir...

Otra cosa podrias subir  el archivo en livewire (creo que es livewire) del link para ver el comportamiento... y asi tener una mejor idea de lo que hace????


----------



## Dario (Ago 19, 2010)

hola lubek.
aca te dejo los archivos livewire del bldc discreto. no se si habras simulado el circuito en proteus, si asi fue, debes haber notado que al potenciometro lo lee bien y que la variacion del pwm es correcta. el problema que tiene mi circuito, es que los puertos RB0 a RB2 no funcionan como el programa lo indica. cuando en el programa dice: 
paso4:
pwm 2,b0,5
high 4
goto loop
empieza el problema de que el puerto B no responde como debiera.
veras, el circuito que estoy intentando hacer, es una especie de decodificador binario que en funcion del numero binario que detecta conmuta dos salidas del pic enviando por una, un pulso pwm y pr la otra, un uno logico simultaneamente.
con esto, consigo conmutar los mosfets del inversor trifacico segun la señal de zerocrossing que obtengo del circuito con lm324.
tengo la impresion de que se puede detectar numeros binarios de otra manera con picbasic pero no se me ocurre mas que lo anterior...
aca dejo el codigo pbp.
ah lubeck, el cmcon=7, es para desactivar los comparadores del puerto A y convertirlos en en E/S digitales y esto me sirve porque lo que estoy intentando detectar, son 1 y 0´s
saludosss


```
CMCON=7        
 TRISA=%00000000        
 porta=%00000000        
 trisb=%01110000        
 portb=%01110000      
 frec var byte
 loop:
 pot portb.3,137,frec
if portb.4=1 then paso1
low porta.0
low portb.1
if portb.5=1 then paso2
low porta.0
low portb.2
if portb.4 and portb.5=1 then paso3
low porta.1
low portb.2
if portb.6=1 then paso4
low porta.1
low portb.0
if portb.4 and portb.6=1 then paso5
low porta.2
low portb.0
if portb.5 and portb.6=1 then paso6
low porta.2
low portb.1
 goto loop
 paso1:
 PWM porta.0,frec,5
 high portb.1
 goto loop
 paso2:
 PWM porta.0,frec,5
 high portb.2
 goto loop
 paso3:
 pwm porta.1,frec,5
 high portb.2
 goto loop
 paso4:
 pwm porta.1,frec,5
 high portb.0
 goto loop
 paso5:
 pwm porta.2,frec,5
 high portb.0
 goto loop
 paso6:
 pwm porta.2,frec,5
 high portb.1
 goto loop
 end
```


----------



## lubeck (Ago 19, 2010)

> no se si habras simulado el circuito en proteus, si asi fue, debes haber notado que al potenciometro lo lee bien y que la variacion del pwm es correcta.



no entiendi muy bien que es lo que necesitas con el pote en rb3 esta configurado como salida...
 o sea que el micro esta mandando una señal al pote no al revez eso es lo que necesitas...

por otro lado por lo que me doy cuenta es que en las entradas y salidas hay un conflicto con respecto al diagrama...
este ultimo codigo lo modificaste al inicial, cambio el diseño de proteus tambien???


----------



## Dario (Ago 19, 2010)

lubeck dijo:


> no entiendi muy bien que es lo que necesitas con el pote en rb3 esta configurado como salida...
> o sea que el micro esta mandando una señal al pote no al revez eso es lo que necesitas...
> 
> por otro lado por lo que me doy cuenta es que en las entradas y salidas hay un conflicto con respecto al diagrama...
> este ultimo codigo lo modificaste al inicial, cambio el diseño de proteus tambien???


 
jajaja.. tenes razon, el codigo que colgue, es de una practica anterior... ya lo edite y ahora si esta el que deje en el rar.
con respecto al RB3, es verdad, tambien estaba mal. ya lo corregi, pero sigue igual.
saludosss


----------



## erick percy (Ago 21, 2010)

hola amigos foreros estoy casi iniciandome en la programacion de pic con pic basic pro y micro code studio , leyendo un libro de programacion encontre un ejemplo de un programa que hace  que aparezca una persona en una matrix de 7*5  levantando las manos , utilizo el pic 16f628
el puerto A y el Bcomo salidas el programa compilo normal pero al momento de simularlo con proteus me doy cuenta que pin RA6  no funciona .
e leido su dattasheett pero no lo entiendo muy bien,si alguien me podria ayudar quisas sea el problema la configuracion de dicho pines del puertoA como salida
alli adjunto el archivo pbp y la simulacion en proteus


----------



## reyvilla (Ago 21, 2010)

Listo aca esta problemas de configuracion, aprte los puertos estan compuestos de ocho pines del porta.0 al portb.0 por lo cual cuando trabajes el trisa o porta=%00000000 son ocho espacios que debes de llenar el primero de derecha a izquierda es el pin 0 "cero" y el primero que esta de lado 
del %0 es el pin 7 saludos pruebalo y me avisas


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 19/08/2010                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
@ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
@ DEVICE pic16F628A, BOD_ON
@ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
@ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
@ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
@ DEVICE pic16F628A, PROTECT_OFF ' protección de código OFF
Define osc 4
CMCON = 7  

pause 500'TIEMPO DE ESPERA 1/2 SEG. PARA ESTABILIZAR EL PIC
trisa.0=0
trisa.1=0
trisa.2=0
trisa.3=0
trisa.4=1
trisa.5=0
trisa.6=0
trisb=%00000000
car var byte
ser var byte
ver var byte
ter var byte
vuelve :
for car=1 to 10  step 1
porta=%00000001ortb=%00010000ause 4
porta=%00000010ortb=%00100111ause 4
porta=%00000100ortb=%01111000ause 4
porta=%00001000ortb=%00100111ause 4
porta=%01000000ortb=%00010000ause 4
next 
for ser=1 to 10 step 1
porta=%00000001ortb=%00100000ause 4
porta=%00000010ortb=%00100111ause 4
porta=%00000100ortb=%01111000ause 4
porta=%00001000ortb=%00100111ause 4
porta=%01000000ortb=%00100000ause 4
next 
for ver=1 to 10  step 1
porta=%00000001ortb=%01000000ause 4
porta=%00000010ortb=%00100111ause 4
porta=%00000100ortb=%01111000ause 4
porta=%00001000ortb=%00100111ause 4
porta=%01000000ortb=%01000000ause 4
next 
for ter=1 to 10   step 1
porta=%00000001ortb=%00100000ause 4
porta=%00000010ortb=%00100111ause 4
porta=%00000100ortb=%01111000ause 4
porta=%00001000ortb=%00100111ause 4
porta=%01000000ortb=%00100000ause 4
next 
goto vuelve
end


----------



## erick percy (Ago 21, 2010)

gracia reyvilla por responder ;pero trate de compilar lo que me pusiste en el foro y me salen estos errores


----------



## reyvilla (Ago 21, 2010)

que version y que programas estas usando?


----------



## ByAxel (Ago 21, 2010)

erick percy dijo:


> gracia reyvilla por responder ;pero trate de compilar lo que me pusiste en el foro y me salen estos errores


Hola:
Disculpa voy a dar mi opinión. El Microcode que supongo es que están usando tiene dos opciones para usar un determinado compilador que lo ven en "View" > "Compile and Program Options"; por lo que se, es cuando se usan Fuses y el compilador asociado es el MPASM te genera errores como los que te han salido. Para arreglar eso debes usar el compilador del PicBasic que está en "C:\PBP", entonces los asocias por medio del botón que está en la imagen; luego de eso te debe aparecer al costado la dirección del compilador "C:\PBP".

Intenta eso.

Saludos.


----------



## erick percy (Ago 21, 2010)

micro code 4 y pic basic 2.5

gracia por ayudaenconter solucion a mi problema


----------



## erick percy (Ago 22, 2010)

hola amigos estoy haciendo ahora otro ejercicio que consiste en hacer que pase una letra por una matriz 7*5 pero tengo un problema hay una columna de leds que no encienden no se a que se debe 
otra cosa en el programa utilizo el comando data no se si lo utilizo bien por favor  cualquier ayuda a qui dejo el archivo con el pbp,proteus,hex


----------



## reyvilla (Ago 22, 2010)

para seguirte ayudando necesito saber que tanto sabes de picbasic asi que la mejor forma para mi seria que expusieras tu programa y explicaras paso a paso que pretendes hacer con cada linea, asi te entiendo mas y aprendes mas, no se que dices ese es mi pensar...saludos


----------



## Eduardo (Ago 23, 2010)

erick percy dijo:


> hola amigos estoy haciendo ahora otro ejercicio que consiste en hacer que pase una letra por una matriz 7*5 pero tengo un problema hay una columna de leds que no encienden no se a que se debe
> otra cosa en el programa utilizo el comando data no se si lo utilizo bien por favor  cualquier ayuda a qui dejo el archivo con el pbp,proteus,hex


Nunca conectaste al bus RA4.
Aunque la hubieras conectado, RA4 es open drain --> necesita una resistencia de pullup.


----------



## erick percy (Ago 23, 2010)

amigo reyvilla   aqui te dejo mi explicacion 
espero que me deje entender

hola eduardo tienes razon de RA4 ya lo conectepero de todas maneras sigo con en problemo de encendido de una columna


----------



## Eduardo (Ago 23, 2010)

erick percy dijo:


> hola eduardo tienes razon de RA4 ya lo conectepero de todas maneras sigo con en problemo de encendido de una columna


Y por qué te creés que aclaré que RA4 es *Open Drain* ?


----------



## lubeck (Ago 23, 2010)

Segun le entiendo a Eduardo es que le pongas una resistencia digamos de 4.7k conectada al positivo o negativo no recuerdo pero yo ya hice algo similar...

asi mas o menos...
-------------------------------


----------



## muessli (Ago 23, 2010)

Hola, ya que aca se concentra casi todo lo de picbasic pro consulto por aca para no abrir otro hilo, resulta que estoy con un proyecto con el RTC DS1307,  todo funciona hermoso, hasta da la hora y todo ..Bueno el tema es que quiero fijar unas alarmas por soft son el clasico IF, ahora el problema es que el RTC manda los datos en BCD (a la hora de sacarlo por lcd se acompaña de HEX2 para poder verlo en hexa de 2 digitos) y como que se complica a la hora de comparar valores en esta codificacion...(seria menos complicado en HEX o DEC)
Alguien pudo salir del mismo problema? o alguna ayuda para solucionar esto?
Muchas Gracias.


----------



## Dario (Ago 24, 2010)

hola chicos.
aca dejo mi proyecto BLMC, al parecer ya funciona porlomenos en proteus jeje... en esta semana lo pruebo. (nota: los leds simbolizan los mosfets, y el contador, el detector de zero crossing)
saludosss


----------



## lubeck (Ago 24, 2010)

Hola dario 

estuve viendo tu diseño y quisiera preguntarte que funcion realiza el pote y el capacitor???
no le encuentro... lo usas como un oscilador???


----------



## ByAxel (Ago 24, 2010)

Potenciómetro + capacitor = En PBP es usar la instrucción *POT*, que lee un valor resistivo por cualquier pin del PIC (simula un ADC)...


----------



## lubeck (Ago 24, 2010)

Ok byAxel eso no lo sabia....

Gracias...


----------



## Dario (Ago 24, 2010)

hola lubeck.
el potenciometro es para variar la velocidad del motor por medio de pwm.
en realidad enves de *PULSOUT*, lleva la instruccion *PWM *por ejemplo: *PWM porta.0,frec,5 *pasa que mi pc se planta si uso esa instruccion con proteus, no se porque sera... en esta semana pruebo el proyecto
saludosss.


----------



## lubeck (Ago 24, 2010)

> PWM porta.0,frec,5



PWM Pin,Duty,Cycle

no sera asi... 

PWM porta.0,127,frec

ahi mandaria la frecuencia al 50%

Pues nop... no le encuentro una secuencia... Alta tecnologia para mi D@rio.. 

peron con el PWM como lo puse a mi si me funciona....
Asi lo hice pero no encuentro que secuencia quieres dar...

```
define osc20
CMCON = 7                
TRISA=0           
trisb=%01110000   
porta=0
portb=0
frec var byte 

Loop:                     
 pot portb.3,137,frec     
 if portb.4 and portb.5 then gosub paso3
 if portb.4 and portb.6 then gosub paso5
 if portb.5 and portb.6 then gosub paso6
 if portb.4 then gosub paso1
 if portb.5 then gosub paso2
 if portb.6 then gosub paso4
goto loop

paso1:
 pwm porta.0,127,frec
 low portb.0
 high portb.1
 low portb.2
return

paso2:
 pwm porta.0,127,frec
 low portb.0
 low portb.1
 high portb.2
return

paso3:
 pwm porta.1,127,frec
 low portb.0
 low portb.1
 high portb.2
return

paso4:
 pwm porta.1,127,frec
 high portb.0
 low portb.1
 low portb.2 
return

paso5:
 pwm porta.2,127,frec
 high portb.0
 low portb.1
 low portb.2 
return

paso6:
 pwm porta.2,127,frec
 low portb.0
 high portb.1
 low portb.2
return
```
saludos ya nos contaras....


----------



## Dario (Ago 24, 2010)

jeje... ahora veo porque ami no me funciona =)... eso pasa cuando uno no presta atencion jejeje...
saludosss


----------



## mecatrodatos (Sep 1, 2010)

Bien con la idea de conocer y aplicar conceptos empezamos con Proyectos de PIc de la serie 18F


```
'PICBASIC PRO programa 1 desarrollo de proyectos con micros de la serie 18F
'PROGRAMA 1
'Desarrollo para mostrar resultado de 10-bit A/D de conversión en la pantalla LCD
'con el PIC 18f4550. Entrada analógica conectarse al canal(RA0)

'Definir LOADER_USED para permitir el uso del gestor de arranque.
'Esto no afectará al funcionamiento normal del programa.

Define	LOADER_USED	1
Define	RESET_ORG	800h
Define	OSC	48		' Define Oscilador a 48MHz

' Se definen registros del LCD
Define	LCD_DREG	PORTD
Define	LCD_DBIT	4
Define	LCD_RSREG	PORTE
Define	LCD_RSBIT	0
Define	LCD_EREG	PORTE
Define	LCD_EBIT	1

' Se definen pararametros ADCIN 
Define	ADC_BITS	10	         ' Establece el número de bits en el resultado
Define	ADC_CLOCK	3	         ' Ajuste el reloj de origen (rc=3)
Define	ADC_SAMPLEUS	50	 ' Establezca el tiempo de muestreo en uS

Medición var	Word		 ' Crear variable para almacenar resultado

TRISA = %11111111	' Selecciona PORTA como entrada
ADCON1 = %00001010	' Selecciona Puerto A como analogo
ADCON2 = %10000000	' Jstifica muestro hacia la derecha
Low PORTE.2		
Pause 500		                        ' pausa
inicio:	
ADCIN 0, Medición		        ' leer pin y guardar en variable medicion 
Lcdout $fe, 1		                ' limpiar LCD
Lcdout "MEDICION: ", Dec Medición	' mostrar valor decimal 
Pause 100		                        ' pausa 
GoTo inicio		                        ' Repetir proceso

End
```

Especificación PIC 18f4550


----------



## ByAxel (Sep 2, 2010)

Buen aporte, veo que lo haces por bootloader pero voy y te pregunto lo que considero muy importante:
¿De que forma se declaran los Fuses para los P18 en el PicBasicPro? (no me funciona el @... si activo el PBPL), 
¿Como configurar el compilador para los P18?, 
¿Que es PBPL en la configuración del compilador?,
¿Tiene o no que ver el MPASM del MPLAB para la compilación de los P18?...

Muchos pueden tener dudas como esas, seria bueno que no la aclares...
gracias...
un saludo


----------



## mecatrodatos (Sep 2, 2010)

Amigo doy respuesta a tus inquietudes

¿De que forma se declaran los Fuses para los P18 en el PicBasicPro? (no me funciona el @... si activo el PBPL), ¿Como configurar el compilador para los P18?

En el archivo de los PIC de la serie 18FXXXX.inc del PBP las líneas deben de coincidir con los símbolos que están en el P18FXXXX.inc del MPASM.

Por ejemplo:
PIC 18fXXXX.inc, una de las líneas es:
        __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L

Pero en el P18fXXXX.inc del MPASM, las opciones que me da a elegir son:

        _CPUDIV_1_1L         EQU  H'E7'    ; CPU system clock not divided
        _CPUDIV_2_1L         EQU  H'EF'    ; CPU system clock divided by 2
        _CPUDIV_3_1L         EQU  H'F7'    ; CPU system clock divided by 3
        _CPUDIV_4_1L         EQU  H'FF'    ; CPU system clock divided by 4

Así pues la linea correcta sería:

        __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_1_1L & _USBDIV_2_1L

Además se debe copiar en la carpeta del proyecto los archivos:
usb18mem.asm
usb18.inc
usb18.asm
18fXXXX.bas

Que también son necesarios  para la comunicación USB HID

¿Que es PBPL en la configuración del compilador?

Una nueva versión de 32 bits de PBP (PBPL) que ofrece BIT, BYTE, WORD, y LARGO (32-bit, firmado) * Los tipos de variables. Esta versión larga es para uso con dispositivos de la familia PIC18. Cuando se trabaja con productos largos, los operadores matemáticos retorno firmado resultados en 32-bits, complemento a dos, el formato. Esto permite el almacenamiento, el cálculo y visualización de valores de -2147483648 un 2147483647. 

Esto asegura que PBP sea completamente compatible con los programas existentes. También permite producir código que está mejor optimizado para los dispositivos más pequeños con menos recursos. 

¿Tiene o no que ver el MPASM del MPLAB para la compilación de los P18?...

Amigo ByAxel necesitas el MPASM de MPLAB para compilar los PIC de la serie 18F la versión 2.45 en adelante de PBP contiene el Microdode Studio Plus, MCS Y MPASM.

Si se tienes estos integrados (lo que puedes baja de la red como Microcode Studio plus y PBP 2.45), enlazas el PBP con el MPASM en la opción Compile and Program Options , se habré una pestaña y marcas usar el MPASM y este busca la ruta donde se encuentra para luego compilar tu código con F9 o compilar y programar con F10.

Como veras el código  que subí no tiene el .hex.  Si  deseas realizar la prueba puedes subir el esquemático y la simulación en Proteus o si tienes algún inconveniente hazlo saber. NO lo pude subir por que tengo problemas con el computador.

A mi amigo FALKON707 la idea no es pedir sino aportar, espacios como estos son para aclarar dudas y compartir conocimientos para que otros los puedan mejorar y  adecuar a sus necesidades.


----------



## ByAxel (Sep 2, 2010)

Excelente, muchas gracias mecatrodatos, ahora lo pondré a prueba

saludos.


----------



## mecatrodatos (Sep 3, 2010)

Bien amigo ByAxel por cierto, una vez preguntaste en  este hilo sobre el compilador y editor para PIC de la serie 18F  "Swordfish IDE", tengo varios ejemplos y una tutoría totalmente terminada como el caso del  PROTON IDE que solamente me falta subir las partes restantes que será cuando termine de arreglar el computador y pasar algunos artículos a PDF. Por lo que en este foro quedara todo lo de PIC  Basic para microcontroladores, en el hilo de PBP, PROTON y un nuevo HILO Swordfish IDE para aquellos que deseen escoger.


----------



## marcelo2112 (Sep 3, 2010)

Hola amigos, pido ayuda para hacer funcionar un pulsador conectado al ra0 del pic, e ir cambiando de rutina a medida que se oprime.

@ device intrc_osc_NOCLKOUT  
@ device pic16f628a,wdt_off,pwrt_off,mclr_off,protect_off,bod_off


CMCON  = %00001111   
TRISA = %11111111  'todos los pines como entradas 
TRISB = %00000000  'todos los pines como salidas
portb = %00000000
boton var Byte
boton = 0
inicio:
If PORTA.0 = 1 Then Goto botonmas1
Goto inicio
botonmas1:
boton = boton + 1
If boton = 4 Then boton = 1
If boton = 1 Then PORTB = %00000010
If boton = 2 Then PORTB = %00000100
If boton = 3 Then PORTB = %00001000
pause 1000
Goto inicio

Algo me esta faltando porque no me funciona. Gracias


----------



## ByAxel (Sep 3, 2010)

mecatrodatos dijo:


> Bien amigo ByAxel por cierto, una vez preguntaste en  este hilo sobre el compilador y editor para PIC de la serie 18F  "Swordfish IDE", tengo varios ejemplos y una tutoría totalmente terminada como el caso del  PROTON IDE que solamente me falta subir las partes restantes que será cuando termine de arreglar el computador y pasar algunos artículos a PDF. Por lo que en este foro quedara todo lo de PIC  Basic para microcontroladores, en el hilo de PBP, PROTON y un nuevo HILO Swordfish IDE para aquellos que deseen escoger.



Impresionante  , realmente quiero hacer cosas con el "Swordfish IDE"... muy bien recibida la info  , en cuanto me libere de algunos trabajos le pongo pilas al Swordfish para colaborar con ejemplos en el respectivo hilo.

-----------------------------------------------------------------------------------------
Sobre los Fuses para los P18 en el PBP me he encontrado con varios detalles y los que pusiste no me funcionó, bueno investigue un poco más y lo aplique otra forma usando PBP 2.60L + Microcode 4 para aquellos que quieran modificar los Fuses para los P18:

1) En mi caso use el MPASM de la carpeta "C:\MCC18\mpasm" porque tengo el C18 instalado (el PBP no me vino con el MPASM integrado); abrir el archivo *P18Fxxxx.INC*, en la ultima parte del archivo están los Fuses.
2) Ubicar el archivo *18Fxxxx.INC*, en la carpeta del PBP; en caso del PIC18F2550 es:

```
NOLIST
    ifdef PM_USED
        LIST
        "Error: PM does not support this device.  Use MPASM."
        NOLIST
    else
        LIST
        LIST p = 18F2550, r = dec, w = -311, w = -230, f = inhx32
        INCLUDE "P18F2550.INC"	; MPASM  Header
        __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
        __CONFIG    _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
        __CONFIG    _CONFIG2L, _PWRT_OFF_2L & _BOR_ON_2L & _BORV_3_2L & _VREGEN_ON_2L
        __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
        ;__CONFIG    _CONFIG3H, _CCP2MX_ON_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H
        ;__CONFIG    _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L
        NOLIST
    endif
        LIST
EEPROM_START	EQU	0F00000h
BLOCK_SIZE	EQU	32
```
Donde se puede reemplazar directamente las líneas que empiezan con "__CONFIG" con la configuración que se quiera del archivo P18Fxxxx.INC del PIC respectivo (en este caso, PIC18F2550).

3) O comentar las líneas __CONFIG con '*;*' para evitar que salga errores al declarar los fuses en el mismo archivo del programa (.bas, .pbp) y de ese modo recién el compilador acepta la declaración como:

```
@ __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
@ __CONFIG    _CONFIG1H, _FOSC_HS_1H
@ __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
@ __CONFIG    _CONFIG3H, _PBADEN_OFF_3H
@ __CONFIG    _CONFIG4L, _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_OFF_4L
```

o como pongo en la prueba que realicé para PBP:

```
'****************************************************************
' PIC18F2550, prueba generador de media onda
'****************************************************************
@ CONFIG PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2
@ CONFIG FOSC = HS
@ CONFIG BOR = ON, BORV = 1
@ CONFIG WDT = OFF, WDTPS = 32768
@ CONFIG MCLRE = OFF
@ CONFIG STVREN = ON, LVP = OFF, XINST = OFF, DEBUG = OFF

define OSC 20

CNT var byte

    clear
    ADCON1 = 15
    TRISB = 0
    LATB = 0
      
Main:
    for cnt = 0 to 127
        LATB = sin cnt
        pause 1
    next cnt          
    goto main 
end
```

Me avisan si me equivoque en algo 
saludos.


----------



## viggiani1975 (Sep 6, 2010)

Saludo a los foreros,

Ando buscando la configuración de los fuses en pic basic pro para el 16f877A, en ninguno de los ejemplos que tengo están pues utilizan el icprog para configurarlos y yo utilizo el pikit2 para ello, entonces si alguien sabe, agradeceré el dato.


----------



## ByAxel (Sep 6, 2010)

viggiani1975 dijo:


> Saludo a los foreros,
> 
> Ando buscando la configuración de los fuses en pic basic pro para el 16f877A, en ninguno de los ejemplos que tengo están pues utilizan el icprog para configurarlos y yo utilizo el pikit2 para ello, entonces si alguien sabe, agradeceré el dato.



Están aquí *C:\PBP\INC*, el archivo *M16F87XA* y el método para usarlos ya se a visto.


----------



## viggiani1975 (Sep 6, 2010)

Gracias por la información, como siempre, muy efectiva.


----------



## reyvilla (Sep 7, 2010)

hola de verdad muy interesante estos archivos inc de pbp, abri unos cuantos y por lo que vi estos archivos contienen las configuraciones y demas de los pic, los abri con block de notas, no son muchos me imagino por lo que vi son por series de pic y por eso no son tantos los archivos, los vi tan interesante que me puso a pensar en si se pueden crear nuevos en caso de que el programa no contenga un pic en especifico, claro guiandose por los que ya estan echos y con la informacion del datasheet del pic, otra cosa es la informacion de que muestra este archivo permite trabajar de forma mas completa ya que muestra todas las caracteristicas del pic, como lo fuser, timer, pwm, etc...
es como un archivo de informacion general direcionada ya que cada cosa tienen su direecion de memoria directo, pareciera un archivo preemsamblado pero con otra extencion diferente a la .asm.
gracias y saludos


----------



## ByAxel (Sep 8, 2010)

reyvilla dijo:


> hola de verdad muy interesante estos archivos inc de pbp, abri unos cuantos y por lo que vi estos archivos contienen las configuraciones y demas de los pic, los abri con block de notas, no son muchos me imagino por lo que vi son por series de pic y por eso no son tantos los archivos, los vi tan interesante que me puso a pensar en si se pueden crear nuevos en caso de que el programa no contenga un pic en especifico, claro guiandose por los que ya estan echos y con la informacion del datasheet del pic, otra cosa es la informacion de que muestra este archivo permite trabajar de forma mas completa ya que muestra todas las caracteristicas del pic, como lo fuser, timer, pwm, etc...
> es como un archivo de informacion general direcionada ya que cada cosa tienen su direecion de memoria directo, pareciera un archivo preemsamblado pero con otra extencion diferente a la .asm.
> gracias y saludos



interesante, yo creo que se puede probar tomando como ejemplo los que ya están; por decir  para el PIC16F84A hay 6 archivos (16F84A.BAS, PIC14EXT.BAS, 16F84A.INC, PBPPIC14.LIB, PBPPIC14.RAM, PIC16F8x.INC). Quedaría el trabajo de buscar un PIC que no esté en la lista, luego con ayuda del datasheet crear los archivos necesarios, agregar a la carpeta del PBP y probar si compila.


----------



## reyvilla (Sep 8, 2010)

eso es teoria, abria que ver bien por ejemplo me puse a revisar y tendriamos que agregar a la lista de pic que muestra el programa eso ya seria otra historia vamos a seguir a ver donde llegamos...saludos


----------



## viggiani1975 (Sep 8, 2010)

Pues saludos nuevamente,

Quiero comentarles que solicité información de los fuses para 16f877 pues quiero construir un regulador o pirómetro programable, creo que se llama así, para controlar la temperatura de un horno casero que quiero hacerme para fundir aluminio primeramente, después veré, la cuestión es que no sé que tipo de sensor debo utilizar pues los que aquí se mencionan como el lm35 son para temperaturas muy bajas y me gustaría controlar al menos los 1000°c, por ese motivo quería quería comentarles esta duda a ver si me logran orientar.  

Gracias de antemano.


----------



## ByAxel (Sep 8, 2010)

viggiani1975 dijo:


> Pues saludos nuevamente,
> 
> Quiero comentarles que solicité información de los fuses para 16f877 pues quiero construir un regulador o pirómetro programable, creo que se llama así, para controlar la temperatura de un horno casero que quiero hacerme para fundir aluminio primeramente, después veré, la cuestión es que no sé que tipo de sensor debo utilizar pues los que aquí se mencionan como el lm35 son para temperaturas muy bajas y me gustaría controlar al menos los 1000°c, por ese motivo quería quería comentarles esta duda a ver si me logran orientar.
> 
> Gracias de antemano.



Para esas temperaturas usa un termopar del tipo K ( -200ºC a +1.372ºC )

Hay algo en el foro...
PIC16F877 + termocupla tipo K + AD595


----------



## viggiani1975 (Sep 9, 2010)

Ok, me parece interesante, será que este medidor tipo k es el utilizado en los hornos de vitrofusión? como la idea es que me sirva no solo para metalurgia sino también, si es posible, utilizarlo en el control de la curva de temperatura en un horno para trabajar vidrio.  En alguna oportunidad me ofrecieron uno pero a 900.000 pesos colombianos (unos 500 dolares), definitivamente estaba fuera de mi presupuesto, es por eso que expreso mi duda, en el vidrio debe haber un control muy preciso por lo que la medida debe acercarse lo más posible al dato real.

Gracias nuevamente.


----------



## reyvilla (Sep 9, 2010)

hola, estoy ahora realizando unos cuantos proyectos con el picbasic pro, realice un minutero que colge hace no mucho por aca, ahora ando realizando un multicontador con lcd y 8 pulsadores, bien la cuestion es que un profesor amigo mio el cual tiene mucha experiencia sobre la programacion de pbp que me recomendo una pagina de un tal darrell taylor, bueno acabo de entrar a su pagina y para empezar esta en ingles, pero igual para no quedar con la duda, traduje un poco, y el fulano ha realizado un par de librerias por asi decirles externas al pbp para facilitar las interrupciones el pbp yo se un poco de todo y en cierta forma eso me ha traido consecuencia debido a que no he logrado controlar al 100% las instrupciones para el pic, la cuestion es me gustaria me ayudaran a entender como usar las librerias con pequeños ejemplos y saber el porque segun lei ahorran tanto epsacio de memoria del pic...gracias

aqui esta la pagina:

http://darreltaylor.com/DT_INTS-18/home.html


----------



## Dario (Sep 12, 2010)

hola gente del foro.
bueno, aca estoy de nuevo, pidiendo vuestra ayuda jeje... no sin antes, dejar un pequeño aportito a cambio. se trata de un tacometro para motores DC como los de aeromodelismo. esta probado en proteus y no se cual es el limite de RPMs que puede medir.
ahora pasemos a mi duda... bueno, pasa que no tengo por ahora el display de este proyecto y me gustaria hacerlo ya que, me seria de gran utilidad. resulta que tengo un lcd de un nokia 1100 y me gustaria adaptarlo para este proyecto, utilizando como lenguaje de programacion, picbasic. tengo el pinout de este display y he visto en el foro como se conecta, pero lo que no se, es como cambiar la comunicacion entre el pic y el display nokia
ya que, en este tacometro, la comunicacion es en paralelo y el display nokia, es serie sincronico. ¿acaso se podria usar la instruccion SHIFTOUT para controlarlo? ustedes ¿que opinan? ¿como puedo hacer para adaptarlo a mi diseño? gracias.
saludosss


----------



## lubeck (Sep 12, 2010)

> tengo el pinout de este display y he visto en el foro como se conecta, pero lo que no se, es como cambiar la comunicacion entre el pic y el display nokia
> ya que, en este tacometro, la comunicacion es en paralelo y el display nokia,



suena interesante d@rio...
pudieras poner el link que encontraste para hablar de lo mismo...
me gustaría intentarlo...

Sera este???
https://www.forosdeelectronica.com/f18/display-nokia-1100-a-1012/

Mmmmmm...

si ese es link a mi me parece serial yo lo intentaría con el serout o el I2C...

Saludos...


----------



## Dario (Sep 12, 2010)

hola lubeck.
si, es ese. como veras, ahi esta mi comentario... 
bueno, estuve buscando el datasheet del controlador del display, aca esta. al parecer, se lo puede controlar mediante protocolo i2c, mi ingles es pesimo ¿habra alguien que lo vea y nos de una idea? 
seguire investigando.
gracias saludosss


----------



## lubeck (Sep 12, 2010)

> si, es ese. como veras, ahi esta mi comentario...


mmm.. no vi el comentario hasta ahora...
déjame estudiar el link del datasheet... 
de cualquier manera esperamos que alguien nos apoye... 
estamos en contacto....


----------



## reyvilla (Sep 12, 2010)

hola yo hace poco estube con lo de las glcd y picbasic pro y al parecer hay que usar proton que compila igual en picbasic pero trae unas librerias para poder programar la glcd encontre una pagina con varios proyectos en picbasic en ingles pero entendible espero sirva a quien la necesite tambien trabajan con la glcd...saludos

http://www.mikroe.com/eng/chapters/view/77/pic-basic-book-chapter-4-examples/


----------



## mecatrodatos (Sep 12, 2010)

Que tal hace un tiempo realice un  proyecto con el Nokia 7110 y lo simule en proteus , pero tocara mirar si los comandos que utilice aplica para el 1100.

por otro la lado para desarrollar la trama para para el generador de caracteres se necesita un software como el GLCD generator, Bitmap2 lcd ,  fastLCD


----------



## lubeck (Sep 13, 2010)

*D@rio:*
Estuve analizando el Link...
Yo creo que la manera mas facil si es utilizando el I2C, esta la direccion del esclavo la infomacion de los pines clk y data, donde no le entiendo en es los comandos, yo creo que el secreto esta en lo que nos menciona macatrodatos...
*Reyvilla:*
Excelente pagina.

Saludos amigos...


----------



## mecatrodatos (Sep 13, 2010)

listo ya la encontré espero le sirva a nuestro amigo Dario luego posteo el circuito y la simulación es el envió de números de 0 9 a través de pic 16f877A utilizando el bitmap como generador de caracteres y visualizados en LCD NOKIA 7710.




```
'****************************************************************
'*  Name    : LCD_7110.PBP                                      *
'*  Date    : MECATRODATOS                                      *                                              *
'*  Notes   : Biblioteca  LCD de comandos para Nokia 7110       *
'*            o similares LCD                                   *
'*                                                              *
'****************************************************************

' LCD Command are:
'   Lcd_Init
'   LCD_ON                                                                                     
'   LCD_OFF
'   Lcd_GotoXY                                             
'   Lcd_Clear                                      
'   Lcd_Home                                               
'   Lcd_Contrast
'   Scr_Normal                                            
'   Scr_Invert
'   Rotate_0
'   Rotate_180                                             

'-------------------------------------------------------------------------------
'Variables comunes para LCD 3310 y 7110 
PosX            var Byte        'Variable para Posición X
PosY            var Byte        'Variable para Posición Y
FC              var Byte [6]    'Variable de 6 bytes = 1 Caracter
Lcd_Data        var Byte        'Comandos LCD de datos
ColumnNum       var Byte        'Número de columna

'variable Extra para LCD 7110
LowBits         VAR Byte        'Bajo Bits para la columna
HighBits        VAR Byte        'Los bits más alto en la columna

'-------------------------------------------------------------------------------
'Asignación de puertos          'Cambiar para emparejar su uso
Lcd_CLK         VAR PORTB.1     'LCD Clock
Lcd_DC          VAR PORTB.2     'LCD Data/Comando (A0 en la especificación)
Lcd_CS          VAR PORTB.3     'LCD Chip seleccion (WR en la especificación)
Lcd_RST         VAR PORTB.4     'LCD Reset
Lcd_VCC         VAR PORTB.5     'LCD Power
Lcd_SDA         VAR PORTB.6     'LCD Data

'-------------------------------------------------------------------------------
Lcd_Init:                                               'Dar formato a LCD, ejecute primero esto!
    Low Lcd_RST                                         'Reajustar LCD (HW reset)
    High Lcd_RST                                        'Restablecer Lanzamiento
    Low Lcd_CS                                          'Seleccionar Chip (WR)
    Low Lcd_DC                                          'Comando/Data (A0)

    Lcd_Data = %11100010:GoSub Lcd_SentByte             'Reajustar LCD (SW reset)
    Lcd_Data = %10100010:GoSub Lcd_SentByte             'Seleccione parcialidad del LCD
    
    GoSub Rotate_0                                      'Mostrar rotación 0
    'gosub Rotate_180                                   'DMostrar rotación 180
     
    Lcd_Data = %10100110:GoSub Lcd_SentByte             'Seleccione pantalla (visualización normal) 
    Lcd_Data = %00100100:GoSub Lcd_SentByte             'Establecer 5V relación resistencia
    Lcd_Data = %10000001:GoSub Lcd_SentByte             'Ajuste electrónico de volumen
    Lcd_Data = Contrast:GoSub Lcd_SentByte              'Ajuste el brillo de LCD
    Lcd_Data = %00101111:GoSub Lcd_SentByte             'Control de potencia
    Lcd_Data = %10101111:GoSub Lcd_SentByte             'Gire LCD ON
    Return

'-------------------------------------------------------------------------------
LCD_ON:                                                 'Gire LCD ON                                   
    Low Lcd_DC    
    Lcd_Data = %10101111:GoSub Lcd_SentByte
    Return

LCD_OFF:
    Low Lcd_DC                                          'Gire LCD OFF
    Lcd_Data = %10101110:GoSub Lcd_SentByte
    Return

Lcd_GotoXY:                                             'Ir a coordenadas XY
    Low Lcd_DC                                          '7110 LCD inicio de la columna 18
    'Y                                                  '18 Por consiguiente, se añadirá posX
    Lcd_Data = 176 + PosY:GoSub Lcd_SentByte            'Dirección de la página 0, 176 = 1011xxxx
    'X
    LowBits = (PosX+18) & %00001111                     
    HighBits = (PosX+18) & %11110000                    
    HighBits = HighBits >> 4                            
    Lcd_Data = %00000000 + LowBits:GoSub Lcd_SentByte   
    Lcd_Data = %00010000 + HighBits:GoSub Lcd_SentByte  
    Return

Lcd_Clear:                                              'limpiar Display                               
    Low Lcd_DC
    Lcd_Data = %01111000:GoSub Lcd_SentByte             'la línea de salida
    For PosY = 0 To 8
        Lcd_Data = 176 + PosY:GoSub Lcd_SentByte        'Dirección de la página 0, 176 = 1011xxxx
        Lcd_Data = %00010000:GoSub Lcd_SentByte         
        Lcd_Data = %00000000:GoSub Lcd_SentByte         
        High Lcd_DC
        For ColumnNum = 0 To 18                         'Enviar vacío de caracteres, 18 por página
            SHiftOUT Lcd_SDA , Lcd_CLK , msbfirst, [ 0,0,0,0,0,0 ] 
        Next ColumnNum                                             
        Low Lcd_DC
    Next PosY
    Return

Lcd_Home:                                               ' Inicio de Cursor
    PosX=0:PosY=0:GoSub Lcd_GotoXY
    Return

Lcd_Contrast:                                           'Contraste
    Low Lcd_DC
    Lcd_Data = %10000001:GoSub Lcd_SentByte             'Electrónica volumen
    Lcd_Data = Contrast:GoSub Lcd_SentByte              'El brillo de LCD
    Return

Scr_Normal:                                             'El modo de pantalla normal
    Low Lcd_DC
    Lcd_Data = %10100110:GoSub Lcd_SentByte     
    Return

Scr_Invert:                                             'Invertir el modo de pantalla
    Low Lcd_DC                          
    Lcd_Data = %10100111:GoSub Lcd_SentByte     
    Return

Rotate_0:                                               'Mostrar la rotación de 0 grados
    Lcd_Data = %10100001:GoSub Lcd_SentByte             'Seleccione el controlador serie de sesiones de la dirección (al revés)
    Lcd_Data = %11000000:GoSub Lcd_SentByte             'Seleccione el modo de salida común (normal)
    Return

Rotate_180:                                             'Mostrar la rotación de 180 grados
    Lcd_Data = %10100000:GoSub Lcd_SentByte             'Seleccione el controlador segmento de dirección (normal)
    Lcd_Data = %11001000:GoSub Lcd_SentByte             'Seleccione el modo de salida común (normal)
    Return

Lcd_SentByte:                                           'Enviar comandos o datos para LCD
    SHiftOUT Lcd_SDA , Lcd_CLK , msbfirst, [ Lcd_Data ]
    Return
'-------------------------------------------------------------------------------    
' Esta parte muestra cómo escribir en LCD
Lcd_SentChar:
    Select Case lcd_data
        Case 0                   
        	FC(0)=$3E:FC(1)=$51:FC(2)=$49:FC(3)=$45:FC(4)=$3E:FC(5)=$00 ' // 0
        Case 1                   
        	FC(0)=$00:FC(1)=$42:FC(2)=$7F:FC(3)=$40:FC(4)=$00:FC(5)=$00 ' // 1
        Case 2                   
        	FC(0)=$42:FC(1)=$61:FC(2)=$51:FC(3)=$49:FC(4)=$46:FC(5)=$00 ' // 2
        Case 3                  
        	FC(0)=$21:FC(1)=$41:FC(2)=$45:FC(3)=$4B:FC(4)=$31:FC(5)=$00 ' // 3
        Case 4                   
        	FC(0)=$18:FC(1)=$14:FC(2)=$12:FC(3)=$7F:FC(4)=$10:FC(5)=$00 ' // 4
        Case 5                   
        	FC(0)=$27:FC(1)=$45:FC(2)=$45:FC(3)=$45:FC(4)=$39:FC(5)=$00 ' // 5
        Case 6                   
        	FC(0)=$3C:FC(1)=$4A:FC(2)=$49:FC(3)=$49:FC(4)=$30:FC(5)=$00 ' // 6
        Case 7                   
        	FC(0)=$01:FC(1)=$71:FC(2)=$09:FC(3)=$05:FC(4)=$03:FC(5)=$00 ' // 7
        Case 8                   
        	FC(0)=$36:FC(1)=$49:FC(2)=$49:FC(3)=$49:FC(4)=$36:FC(5)=$00 ' // 8
        Case 9                   
        	FC(0)=$06:FC(1)=$49:FC(2)=$49:FC(3)=$29:FC(4)=$1E:FC(5)=$00 ' // 9
    End Select
Write_LCD:
    High Lcd_DC
    SHiftOUT Lcd_SDA , Lcd_CLK , msbfirst, [ FC(0),FC(1),FC(2),FC(3),FC(4),FC(5) ]
    Low Lcd_DC
    Return
'-------------------------------------------------------------------------------
```


----------



## vatejhomi (Sep 13, 2010)

Hola mi estimado mecatrodatos, tengo una consulta alrespecto y se que me puedes apoyar.

Mi consulta es como poder conectar un sensor pt100 o algun rtd o algun sensor de mayor rango y la alimentacione s de 220v ac

deseo conectarlo con un pic con salida a lcd y me mande una seÑal a la temperatura deseada a una salida del picc.

Espero me puedas responder pronto es para un trabajo de la universidad y necesito informacion,

de antemano se agradece la colaboracion.

Jhonatan vasquez tello
peru


----------



## mecatrodatos (Sep 13, 2010)

Por otro lado amigo reyvilla se pueden desarrollar proyectos de manejo de GLCD con PBP, PROTON es otra ayuda pero que se pueden compilar y ensayar en el  entorno de microde estudio estoy completamente seguro , ya que he realizado varios, aunque Proton es mas potente porque en la carpeta de Plugin esta el editor para caracteres GLCD en cambio con el PBP se tiene de incorporar a la carpeta para que me genere la trama y anexarlos al programa fuente. Dame tiempo y enriqueceremos el foro con estos conocimientos, compañeros  TU,  Dario, BYAXEL y LUBEK ayudan a que se aporten nuevas cosas.

Amigo vatejhomi para lo que necesitas te recomiendo el libro de electrónica de POTENCIA de Muhmmad H Rashid.


----------



## vatejhomi (Sep 13, 2010)

se agracede mi estimado mecatrodatos


----------



## mecatrodatos (Sep 13, 2010)

bien aquí esta el lcd la conexión del LCD NOKIA 3110 por hay tengo las libreria para ponerlo a trabajar en proteus aunque la ultima version trae el 7110.

listo mire en mi pc y encontré las librerías y circuitos de conexión para la simulación de pantallas Nokia 3310 6610 7710 compatibles con 1100


----------



## luisin22 (Sep 13, 2010)

que tal amigo si me puedes ayudar con el codigo para manejar un motor unpolar con el pic 16f628a

es decir con un pulsador que gire a un lado y con otro al lado contrario

gracias


----------



## Dario (Sep 13, 2010)

hola chicos.
mecatrodatos, lubeck, reyvilla, muchas gracias por responder. ahora un par de dudas, mecatrodatos: ¿como hago para cargar las librarys y los models a mi proteus? otra cosita mecatrodatos, el codigo que dejaste en el post #524, cuando lo compilo, me da varios errores. ¿porque sera? estoy usando microcode para compilar.
muchisimas gracias amigos, saludosss


----------



## mecatrodatos (Sep 14, 2010)

vas la carpeta donde esta lab center en C archivos de programa que es la de proteus y hay están las carpetas para incrustar las librerías con los puntos de extensión busca y anexalas , por otro lado subí la librería y no el codigo de fuente, espérame si mañana lo subo completo.


----------



## Dario (Sep 14, 2010)

> por otro lado subí la librería y no el codigo


perdon por ser tan bestia XD pero, ¿como es eso de libreria?
saludosss


----------



## mecatrodatos (Sep 14, 2010)

No amigo mio , te explicare con PBP y el entorno de microcode estudio se pueden realizar librerias , como las que utiliza el CCS compiler , pero con muy buenas prestaciones y optimizan el pic con el cual trabajas por ejemplo las puedes crear con comandos ASM y las llamas como si fueran .inc

es decir las incluyes al inicio del programa con terminación .bas , para ser mas claro si el programa que se realiza tiene una cantidad considerable de lineas lo puedes reducir llamando librerías o incluyéndolas.por ejemplo para leer un teclado matrixal puedes realizar la librería y adjuntar al inicio del programa como si adjuntaras un moddefast de comunicación serial.


----------



## Dario (Sep 14, 2010)

aaah... ahora entiendo.
osea que, si yo copio y pego en un documento de texto la libreria que dejaste arriva, y le pongo por nombre: paisanito.bas y lo guardo en la carpeta pbp244 de pbp, cuando yo inicie un programa en pbasic, quedaria algo asi: "include paisanito.bas" y ya me habria ahorrado buena parte del codigo necesario.
¿es asi?
saludosss


----------



## mecatrodatos (Sep 14, 2010)

si correcto, estoy buscando el código fuente en mi información, pero si no encuentro realizaremos el código de nuevo ya que tuvo que realizar una copia de seguridad de toda la información por un virus


----------



## Dario (Sep 14, 2010)

ok amigo, gracias. te cuento que hice lo que te dije arriva, eso de poner la libreria en pbp244 y trate de compilar un codigo fuente para lcd nokia y me sale que la libreria y no el codigo que intento compilar, tiene algunas expresiones mal hechas. ¿que podra ser?
saludosss


----------



## mecatrodatos (Sep 14, 2010)

Amigo dario te anexo un proyecto muy bien explicado que detalla el uso de las librerias y como incrustarlas en el codigo fuente principal, esperame si salgo de unas cosas de la universidad y te hecho una mano.


----------



## GoX F4yCk3r DB (Sep 14, 2010)

Hola que tal, tengo un pequeño problema, quiero controlar un motor de DC, solo necesito que cambie de giro, segun yo ya hice el programa y toda la cosa pero me falta la etapa de potencia, compre un l293d, para energizar el motor, solo que al simularlo me marca error, alguien me podria ayudar a conectar esta parte.
se los agradesco.
salu2


----------



## lubeck (Sep 14, 2010)

> alguien me podria ayudar a conectar esta parte.


lo intento...
subes el esquema y el programa o como te podria ayudar???


----------



## GoX F4yCk3r DB (Sep 14, 2010)

time var word
time=5000
trisb=0

inicio:
portb.0=1
portb.1=0
pause time 

portb.1=1 
portb.0=0
pause time 
goto inicio 
end

ese es mi programa, es sencillo, en el proteus si me corre pero conectando el motor de manera directa al pic, pero lei que no c puede conectar el motor directamente y me dijeron que el l293d me ayudaba a evitar que el pic se dañara.

aqui esta la pagina del data del l293d
http://www.datasheetcatalog.org/datasheet/texasinstruments/l293d.pdf

Aqui esta el diagrama de conexion que realice en proteus.


----------



## lubeck (Sep 14, 2010)

> ese es mi programa, es sencillo, en el proteus si me corre pero conectando el motor de manera directa al pic, pero lei que no c puede conectar el motor directamente y me dijeron que el l293d me ayudaba a evitar que el pic se dañara.


ok, ya entiendo... podrias subir el archivo de proteus asi lo conecto en base a lo que ya tienes...


----------



## GoX F4yCk3r DB (Sep 14, 2010)

ok gracias
aqui te dejo el archivo


----------



## lubeck (Sep 14, 2010)

El motor de que voltaje es???
utilizarias 2 fuentes??? una para el motor y otra para el uC???
o la misma para ambos???...


----------



## GoX F4yCk3r DB (Sep 14, 2010)

Supongo que es de 5v, desconosco el voltaje, cuando lo compre me dijeron que funcionaba a 5, 9 y 12v, lo mejor o mas comodo seria utilizar una sola fuente, es un motor pequeño de esos que traen los carritos de control remoto.
Como se a cuanto voltaje trabaja el motor?


----------



## lubeck (Sep 14, 2010)

Intentemoslo asi...


----------



## GoX F4yCk3r DB (Sep 14, 2010)

y son necesarios los diodos???, pq en la dtasheet del CI, dice que los diodos ya viene internamente.


----------



## lubeck (Sep 14, 2010)

> y son necesarios los diodos???,


de ser necesario necesario no... 
no... el datasheet especifica que deben ponerse sirven para el retorno de corriente que genera el motor...


----------



## GoX F4yCk3r DB (Sep 14, 2010)

Lo que pasa es que mañana tengo que entregar esta practica y pues ahorita conseguir los diodos es casi imposible, mi pregunta es.
Se daña algun componente si no utilizo diodos, como el pic??? o el integrado?? o incluso el motor mismo??
que daños puede causar?


----------



## lubeck (Sep 14, 2010)

> que daños puede causar?


Por el voltaje y amperaje que se utiliza no creo que se dañe nada...
inténtalo si los diodos pero no es lo optimo...


----------



## GoX F4yCk3r DB (Sep 14, 2010)

Ok, voy a intentarlo hacerlo sin diodos.
Gracias lubeck por la ayuda, estare publicando mis resultados
salu2


----------



## Dario (Sep 14, 2010)

amigo mecatrodatos: ya has sido muy generoso conmigo, muchisimas gracias, 


> esperame si salgo de unas cosas de la universidad y te hecho una mano


tomate tu tiempo amigo, puedo esperar. 
por mi parte, seguire investigando mas sobre esto de las lcds de celulares, he estado pensando en que se podria hacer una especie de multimetro hasta con un mini osciloscopio de baja frecuencia, pasando por sondas logicas, frecuencimetros y demas.
saludos  cordiales y gracias por ayudarme.


----------



## GoX F4yCk3r DB (Sep 14, 2010)

Hola que tal lubeck.
Ya monte el circuito en el proto y esto es lo que sucede.
Conecto dos leds a la salidas del uC, cuando no conecto el motor el uC funciona normal, osea hace los cambios de 0 a 1 y vicebersa, cuando conecto el motor, el uC no responde aclaro que el motor lo conecto a las salidas del l239D.
El motor lo conecte a dos diferentes fuentes una de 5.1 y otra de 4.8, y trabaja mejor en la de 4.8 ( va mas rapido).
Tambien cuando conecto a las salidas del l293 el motor se olle un sonidito emitido por el motor el cual se escucha cuando lo conecto directo a una fuente, supongo que como que quiere girar pero no puede.
Alguna sugerencia???
En ocaciones al conectar el motor se apagan los dos leds y el uC ya no hace nada.
que puedo hacer?


----------



## lubeck (Sep 15, 2010)

> En ocaciones al conectar el motor se apagan los dos leds y el uC ya no hace nada.
> que puedo hacer?



lo mas probable es que tu motor consuma mas amperaje que lo que puede proporcionar tu fuente, necesitarías cambiar una con mayor potencia  o agregar una fuente solo para el motor...


----------



## GoX F4yCk3r DB (Sep 15, 2010)

y como conecto una fuente externa al motor??
si tengo dos fuentes una al pic y la otra al motor, pero como alimento al motor de manera independiente?


----------



## lubeck (Sep 15, 2010)

los diodos igual si quieres ponerlos....

Prueba asi...
EDITO los negativos de ambas fuentes los unes... para que ambas sean tierras...


----------



## GoX F4yCk3r DB (Sep 15, 2010)

Ya alimente al uC y al motor de manera independiente y resulto, si funciona perfectamente, tambien conecte unas resitencias a los leds.
Gracias lubeck por tu ayuda, no fue necesario usar los diodos espero no tenga repercuciones, de igual forma no lo tendre funcionando mucho tiempo para que no afecte.
salu2


----------



## verogirl (Sep 17, 2010)

que tal compañeros, he estado siguiendo este hilo porque quiero comenzar a programar, hoy dia es muy necesario por lo visto...
 veo que estan trabajando duro en sus proyectos y los felicito y creo que los imitare 
basic es mejor para comenzar con el tema de programacion en pics?

que conviene mas: pics o motorola? es que tengo el manual de motorola...


----------



## lubeck (Sep 17, 2010)

> basic es mejor para comenzar con el tema de programacion en pics?


ninguno es mejor o peor(en mi opinion) sino mas facil o dificil yo comencé con basic y entendi muchos de los conceptos generales de los micros... ahora estoy intentando con C, pero como ya entendi un poco el concepto no se me esta dificultando mucho... para mi lo mejor es aprender ambos, al ASM yo no le veo mucho sentido... la ultima palabra la tienes tu...
mira este link...
https://www.forosdeelectronica.com/f24/asm-basic-c-otros-39468/



> que conviene mas: pics o motorola? es que tengo el manual de motorola...


creo que es mas comercial el pic y creo que tiene mas soporte... en cuanto a rendimiento y calidad lo desconozco...


----------



## HADES (Sep 17, 2010)

verogirl dijo:


> que conviene mas: pics o motorola? es que tengo el manual de motorola...



la verdad y hablando lo que es vas a encontrar mas material y apoyo relacionado con los pic (quemadores, manuales y hasta el elemento en si) que el del Motorola y solo por ciertos lares encontrarias apoyo con el Freescale de Motorola pero en fin mejor dale al pic talvez.................. podrias encontrar algo casi en igual al pic pero con AVR pero es historia aparte saludos!

HADES


----------



## verogirl (Sep 17, 2010)

gracias muchachos, seguire su consejo


----------



## luisin22 (Sep 18, 2010)

La verdad que los pics son mas de uso didactico y en la industria tiene mayor robustes avr, eso no siginifica que no sean utilizados los pics, ya que todos los micros dependiendo del fabricantes se utilizan en los plcs..

En fin es muy importante empezar con pics para entender el resto de microcontroladores


----------



## lubeck (Sep 19, 2010)

Rayos....no lo encuentro!!!...
alguien me podria echar la mano en orientarme donde hay un recopilado o instructivo de los @device 
ejemplo:

```
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
@ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
@ DEVICE pic16F628A, BOD_ON
@ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
@ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
@ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
@ DEVICE pic16F628A, PROTECT_OFF ' protección de código OFF
```
entiendo que cada uC utiliza los propios pero en el datasheet no veo nada...
*EDITO:*Ouch!!!....
son estos verdad???
los que estan dentro del archivo inc del pbp246

```
RC_OSC_CLKOUT   equ     3FEC0013h       ; XX XXXX XXX1 XX11
RC_OSC_NOCLKOUT equ     3FEC0012h       ; XX XXXX XXX1 XX10
RC_OSC          equ     3FEC0012h       ; XX XXXX XXX1 XX10
INTRC_OSC_CLKOUT equ	3FEC0011h       ; XX XXXX XXX1 XX01
INTRC_OSC_NOCLKOUT equ	3FEC0010h       ; XX XXXX XXX1 XX00
INTRC_OSC	equ     3FEC0010h       ; XX XXXX XXX1 XX00
EXTCLK_OSC      equ     3FEC0003h       ; XX XXXX XXX0 XX11
EC_OSC          equ     3FEC0003h       ; XX XXXX XXX0 XX11
HS_OSC          equ     3FEC0002h       ; XX XXXX XXX0 XX10
XT_OSC          equ     3FEC0001h       ; XX XXXX XXX0 XX01
LP_OSC          equ     3FEC0000h       ; XX XXXX XXX0 XX00
WDT_ON          equ     3FFB0004h       ; XX XXXX XXXX X1XX
WDT_OFF         equ     3FFB0000h       ; XX XXXX XXXX X0XX
PWRT_ON         equ     3FF70000h       ; XX XXXX XXXX 0XXX
PWRT_OFF        equ     3FF70008h       ; XX XXXX XXXX 1XXX
MCLR_ON         equ     3FDF0020h       ; XX XXXX XX1X XXXX
MCLR_OFF        equ     3FDF0000h       ; XX XXXX XX0X XXXX
BOD_ON          equ     3FBF0040h       ; XX XXXX X1XX XXXX
BOD_OFF         equ     3FBF0000h       ; XX XXXX X0XX XXXX
LVP_ON          equ     3F7F0080h       ; XX XXXX 1XXX XXXX
LVP_OFF         equ     3F7F0000h       ; XX XXXX 0XXX XXXX
CPD_ON          equ     3EFF0000h       ; XX XXX0 XXXX XXXX
CPD_OFF         equ     3EFF0100h       ; XX XXX1 XXXX XXXX
PROTECT_ON      equ     1FFF0000h       ; 0X XXXX XXXX XXXX
PROTECT_OFF     equ     1FFF2000h       ; 1X XXXX XXXX XXXX
```

gracias...


----------



## ByAxel (Sep 19, 2010)

lubeck dijo:


> Rayos....no lo encuentro!!!...
> alguien me podria echar la mano en orientarme donde hay un recopilado o instructivo de los @device
> ejemplo:
> 
> ...



No entiendo bien...

Los fuses disponibles para cada PIC están declarados en la carpeta del PBP, en caso del 16F628A, el archivo es M16F62xA.INC ubicado en la carpeta C:\PBP\INC. Sobre el datasheet del PIC busca en el ítem *SPECIAL FEATURES OF THE CPU*.


----------



## lubeck (Sep 19, 2010)

ok.. gracias *ByAxel *me lo confirmas... edite mi mensaje... 

Gracias...


----------



## ByAxel (Sep 19, 2010)

Si, esos son 

Un saludo.


----------



## lpnavy (Sep 19, 2010)

hola a todos, a mi los fuses los pongos para ahorrarme trabajo a la hora de programar el pic pero en basic estos fuses me dan error y los pongo en forma correcta ¿alguien sabe la causa de estos errores? les dejo una imagen donde sale error. saludos.


----------



## lubeck (Sep 19, 2010)

> ¿alguien sabe la causa de estos errores?


intenta ver si esta correcta la ruta de los archivos .inc o si los tienes...


----------



## lpnavy (Sep 19, 2010)

lubeck yo tengo los archivos .inc por defecto que trae el PBP no se si sera por el compilador por que he visto codigos por alli con los fuses y les funciona ¿ y a mi por que no!!??


----------



## lubeck (Sep 19, 2010)

> ¿ y a mi por que no!!??


porque no te quieren.... naaaaa.... broma 
no debes tener mal algo en las rutas de configuracion... a mi no se me ha presentado ese caso... pero intenta buscar como se configuran yo estoy investigando...


----------



## reyvilla (Sep 19, 2010)

hola, esa alerta de tu programa me paso a mi y se refiere a los linker, según recuerdo, ahora lo que me paso a mi es que el programa no detectaba directamente la ubicación de la carpeta de pbp la cual debe de estar en c:/pbp para que sea mas rápido y fácil a la hora de que el programa la busque para hacer la compilacion  saludos...


----------



## ByAxel (Sep 19, 2010)

Supongo que sin fuses te compila, entonces la causa del error puede que sea la configuración del compilador ya que una vez me sucedió algo parecido. Asegúrate que el compilador sea del pbp que está en la dirección C:\PBP como en la imagen.

Un saludo


----------



## lpnavy (Sep 19, 2010)

ByAxel dijo:


> Supongo que sin fuses te compila, entonces la causa del error puede que sea la configuración del compilador ya que una vez me sucedió algo parecido. Asegúrate que el compilador sea del pbp que está en la dirección C:\PBP como en la imagen.
> 
> Un saludo



Si!! los programas se compila normalmente sin los fuses, pues bien el PBP lo tengo instalado dentro la carpeta del microcode, dejame probar usando la ruta C:/ para ver que tal.

pues bien coloque todo en C:/ y nada sigue dandome el mismo error ando usando el PBP 2.5 y el microstudio 3.0.0.5


----------



## ByAxel (Sep 19, 2010)

En la pestaña "Assembler" desactiva lo que esté activo. Eso es todo, por ahora no se que más ya que yo estoy con el PBP2.6 + MicrocodeStudio 4. Intenta reinstalar o con otra versión del IDE o del compilador.

Un saludo.


----------



## GoX F4yCk3r DB (Sep 20, 2010)

Hola que tal tengo un problema algo feo y tonto.
Solo quiero prender un LED y que apague despues de 1 seg. bueno el problema no es el codigo ni la simulacion, todo eso jala perfecto, el problema esta al ponerlo en el proto.
Tengo todo conectado perfectamente, ya intente con varias fuentes, cambie el oscilador, los capacitores y no se me ocurre mas.
alguna sugerencia de por que no esta funcionando?
salu2


----------



## lpnavy (Sep 20, 2010)

GoX F4yCk3r DB dijo:


> Hola que tal tengo un problema algo feo y tonto.
> Solo quiero prender un LED y que apague despues de 1 seg. bueno el problema no es el codigo ni la simulacion, todo eso jala perfecto, el problema esta al ponerlo en el proto.
> Tengo todo conectado perfectamente, ya intente con varias fuentes, cambie el oscilador, los capacitores y no se me ocurre mas.
> alguna sugerencia de por que no esta funcionando?
> salu2



sera por que no tiene conectado bien el pic o tu proto esta sucio en las conexiones no dejando circular bien la corriente revisa a ver.

ByAxel cambie todo instale las versiones reciente de microcode y del PBP y nada  ni  modo lo dejare asi y configurar el pic a la antigua manualmente que lala


----------



## GoX F4yCk3r DB (Sep 20, 2010)

No creo que sea eso, ya revide bien y el PIC si hace contacto, le llega la alimentacion y todo pero no prende mi led.


----------



## lpnavy (Sep 20, 2010)

GoX F4yCk3r DB dijo:


> No creo que sea eso, ya revide bien y el PIC si hace contacto, le llega la alimentacion y todo pero no da salida.



sera que tu led este quemado o lo pusiste al reves jajaja!! ademas que pic usas tal vez haiga algo alli de pista para ver la falla


----------



## GoX F4yCk3r DB (Sep 20, 2010)

el led si sirve, y lo conecto asi. La pata mas corta a tierra y la otra a la patita del pic.
El PIC que estoy utilizando es un 16f877A, no esta quemado pq mi quemador si lo reconoce y me deja cargar programas y borrarlo.


----------



## lpnavy (Sep 20, 2010)

GoX F4yCk3r DB dijo:


> el led si sirve, y lo conecto asi. La pata mas corta a tierra y la otra a la patita del pic.
> El PIC que estoy utilizando es un 16f877A, no esta quemado pq mi quemador si lo reconoce y me deja cargar programas y borrarlo.



y en que puerto lo tienes por que si los tiene en los A o E tal vez tiene que apagar el modo analogico de dichos puertos para que funcionen como salida en digital.


----------



## GoX F4yCk3r DB (Sep 21, 2010)

Lo tengo conectado al portb.1 mi oscilador es de 4mhz, como dije antes crei que era el que estaba chafeando y fui a comprar otro, tengo capacitores de 15 picofaradios y una resistencia de 10 k a la patita 1 del PIC (siempre la he usado y si sirve)


----------



## lpnavy (Sep 21, 2010)

GoX F4yCk3r DB dijo:


> Lo tengo conectado al portb.1 mi oscilador es de 4mhz, como dije antes crei que era el que estaba chafeando y fui a comprar otro, tengo capacitores de 15 picofaradios y una resistencia de 10 k a la patita 1 del PIC (siempre la he usado y si sirve)



que extraño prueba con otro pic a ver si es el micro. si puede poner tu programa para ver si funca con mi micro pero dudo q sea el programa pero bueno uno nunca sabe.


----------



## GoX F4yCk3r DB (Sep 21, 2010)

Ya intente con varios micros en inculos con varios protos, el programa oroginal era el sentido de giro de un motor, este si me corrio y todo pero lo lleve a la escuela y asi como si nada dejo de funcionar. En primera instancia pense en el micro y lo reemplaze por otro, como con el programa del motor no hacia el cambio decidi cargarle otro, que es solo de prender y apagar el led, pero tampoco sirve, no c que sea.


----------



## lpnavy (Sep 21, 2010)

GoX F4yCk3r DB dijo:


> Ya intente con varios micros en inculos con varios protos, el programa oroginal era el sentido de giro de un motor, este si me corrio y todo pero lo lleve a la escuela y asi como si nada dejo de funcionar. En primera instancia pense en el micro y lo reemplaze por otro, como con el programa del motor no hacia el cambio decidi cargarle otro, que es solo de prender y apagar el led, pero tampoco sirve, no c que sea.



si cargaste esos 2 programas y no andan tal vez sea el programa con que grabas el pic, o el quemador o el puerto de tu compu. pues no le veo mas salida a ese lio.


----------



## lubeck (Sep 21, 2010)

GoX


> el led si sirve, y lo conecto asi. La pata mas corta a tierra y la otra a la patita del pic.


y la resitencia limitadora???
pon una de 330ohm y pon un nuevo led...


----------



## Zankoku (Sep 21, 2010)

Saludos, un gusto escribir una vez mas aca, soy nuevo en esto de las transmisiones vía radiofrecuencia, les comento que estoy realizando un proyecto con un sensor de temperatura cuya lectura se visualizará en un lcd via rf.

En el siguiente circuito que adjunto uso el conversor a/d del pic16f877a para visualizar la lectura en en lcd1 de ese pic y funciona correctamente, pero cuando deseo visualizarlo en el receptor (pic 16f628a) no me muestra lectura alguna, para la transmisión uso unos modulos a 315Mhz (adjunto el datasheet) y el codificador y decodificador ht12e/ht12d, he comprobado que el modulo funciona correctamente he probado transmitiendo 1 bit y efectivamente recibe correctamente el dato que envio, mi problema es el siguiente:
Conecto el pin 39 del pic 16f877a a mi entrada del encoder(pin10), conecto la salida del decoder (pin10) al pin asignado para la recepcion de datos porta.0 del pic 16f628a(pin17), pero no logro visualizar el dato que envio , y bueno en ese mismo instante para comprobar nuevamente el estado de transmisión pruebo transmitiendo bits y efectivamente hay transmision y recepción sin embargo no logro visualizar el dato que necesito.
La salida del del pin 39 del pic 16f877a corresponde al dato que almaceno de mi conversor a/d para luego transmitirlo, he probado la transmisión directa usando un cable para unir el pin 39 del 16f877a y el pin 17 del 16f628a y funciona, bueno de esa forma logro visualizar la lectura del dato que deseo enviar por lo que creo el programa funciona correctamente.
Alguna sugerencia para solucionar mi problema seria bien recibida y muy agradecida.

Adjunto el esquema que realice en caso sirva de algo para su ilustración en pdf.

Incluyo fragmentos del programa que uso, esta hecho en microcode studio, tal vez estoy omitiendo algo o cometo un error y esa sea la razón por la cual no funcione.
TX:

```
DEFINE osc 4
DEFINE      LCD_BITS 4
define      LCD_DREG        PORTB           ;bit de datos del LCD empezando
define      LCD_DBIT        0               ;por B.0. B.1, B.2, B.3
define      LCD_RSREG       PORTB           ;bit de registro del LCD conectar
define      LCD_RSBIT       5               ;en el puerto B.5
pause 2000
define      LCD_EREG        PORTB           ;bit de enable conectar en el
define      LCD_EBIT        4               ;puerto B.4

define      ADC_BITS        8               ;Fije el número de BITS del resultado (5,8,10)
define      ADC_CLOCK       3               ;Fije EL CLOCK (rc=3)
define      ADC_SAMPLEUS    50              ;Fije el tiempo de muestreo en Us
                                            ;ADC_SAMPLEUS es el número de microsegundos que el programa
                                            ;espera entre fijar el canal y comenzar la conversión analógica/digital
TRISA= 1                                   ;el puerto A es de entrada
ADCON1= %00001110                           ;el puerto A.0 es conversor los demás digitales
TRISB= 0                                    ;el puerto b es salida da datos
dato        var word                        ;crear variable dato para guardar
tempbaj     var byte
tempalt     var byte
x           var byte


releF   var portD.2
releC   var portD.3
led     var portD.4
enter   var portD.5
bsubir  var portD.6
bbajar  var portD.7

EEPROM 0,[20,26]                            ;contenido inicial de la EEPROM
[B]Symbol N2400 = 4[/B]

inicio:                                     ;3 parpadeos del led que indica que funciona
for x =1 to 3
    high led
    pause 200
    low led
    pause 200
next

READ 0,tempbaj                              ;lee la EEPROM 0 y lo guarda en tempbaj
read 1,tempalt                              ;lee la EEPROM 1 y lo guarda en tempalt

sensar:
adcin 0, dato                               ;lee el canal 0(A0) y guarda en dato
serout PORTB.6, N2400, [dato]               ;Envía los datos por RB0 
                                
LCDOUT $FE,1,"T.mi T.actu T.ma"             ;limpia el LCD y muestra el texto
            dato=dato/2                             ;el dato dividir para 2
LCDout $FE,$c6,dec dato,"ºC"                ;muestra el decimal de dato
LCDout $FE,$c0,dec tempbaj,"ºC"             ;muestra el decimal de tempbaj
LCDout $FE,$cc,dec tempalt,"ºC"             ;muestra el decimal de tempalt

for x =1 to 50                              ;repetir 50 veces
if enter =0 then grabarla
pause 10
next
if dato<tempbaj then calentar               ;si dato es <tempbaj ir a calentar
if dato>tempalt then enfriar                ;si dato es >tempalt ir a enfriar
low relec: low releF
goto sensar

enfriar:
HIGH releF: low releC
goto sensar

calentar:
HIGH releC: low releF
goto sensar

grabarla:
gosub soltar

grabar1:
LCDOUT $fe, 1,"Programar Temp."
lcdout $fe,$c0,"baja=",dec tempbaj,"ºC"
pause 100
if bbajar =0 then restar1

if bsubir =0 then sumar1

if enter =0 then grabarA

goto grabar1

restar1:
gosub soltar                                ;programa antirebote de tecla
if tempbaj<1 then grabar1
tempbaj=tempbaj-1

goto grabar1

sumar1:
gosub soltar
if tempbaj>40 then grabar1
tempbaj=tempbaj+1

goto grabar1

grabarA:
gosub soltar
write 0,tempbaj                             ;escribir en la direcciom 0 de la EEPROM

grabar2:
LCDOUT $fe, 1,"Programar Temp."
LCDOUT $fe,$c0,"alta=",dec tempalt,"ºC"
pause 100

if bbajar= 0 then restar2
if bsubir= 0 then sumar2
if enter= 0  then grabarB
goto grabar2

restar2:
gosub soltar
if tempalt<5 then grabar2
tempalt=tempalt-1
goto grabar2

sumar2:
gosub soltar
if tempalt>50 then grabar2
tempalt=tempalt+1
goto grabar2

grabarB:
gosub soltar
write 1,tempalt                             ;escribir en la direccion 1 de la EEPROM
goto inicio

soltar                                      ;antirebote de tecla 
HIGH led
pause 150
low led

soltar2:
if bbajar= 0 then soltar2
if bsubir= 0 then soltar2
if enter= 0  then soltar2
pause 100
return

end
```
RX:

```
DEFINE osc 4
define      LCD_DREG        PORTB           ;bit de datos del LCD empezando
define      LCD_DBIT        0               ;por B.0. B.1, B.2, B.3
define      LCD_RSREG       PORTB           ;bit de registro del LCD conectar
define      LCD_RSBIT       5               ;en el puerto B.5
pause 2000
define      LCD_EREG        PORTB           ;bit de enable conectar en el
define      LCD_EBIT        4               ;puerto B.4
DEFINE      LCD_BITS 4

cmcon= 7
TRISB= 0


dato        var word                        ;crear variable dato para guardar
x           var byte
led         var portB.6
                            
[B] Symbol N2400 = 4 [/B] 

inicio:

for x =1 to 3                               ;3 parpadeos del led que indica que funciona
    high led
    pause 200
    low led
    pause 200
next

sensar:
serin PORTA.0, N2400, dato
LCDOUT $FE,1,"Temp Actual"         ;limpia el LCD y muestra el texto
        dato=dato/2                           ;el dato dividir para 2
LCDout $FE,$c6,dec dato,"ºC"

end
```
datahsheet modulo:
http://electronicahifi.com/pdf/212st-rx04-a.pdf

p.d.1. Subiré el esquemático en pdf para que tengan una visualización del circuito.
p.d.2. Pido disculpas por el post en la sección que no correspondía, en realidad por el apuro no pude ver que estaba abierto este topic sobre la programación en pbp


----------



## lubeck (Sep 21, 2010)

Zankoku...
podrías subir el archivo DSN de proteus, para hacerle unas pruebas...
yo creo, por lo que dices son lo modulos... pero me gustaria confirmarlo....


----------



## Zankoku (Sep 21, 2010)

lubeck dijo:


> Zankoku...
> podrías subir el archivo DSN de proteus, para hacerle unas pruebas...
> yo creo, por lo que dices son lo modulos... pero me gustaria confirmarlo....



acabo de subir el archivo de proteus esta bajo la version 7.7 sp2.

p.d.1 En la simulacion que adjunté uní con un cable los pines de la comunicación, en este caso use un dato invertido N2400= 4 para que me muestre el dato, de esa forma el programa corre bien, si uso un dato real con T2400= 0 me muestra el doble del valor(también intente enviar la información a 1200, 9600 pero no funcionó) bueno en la práctica física hasta donde recuerdo me es indiferente la forma de enviar el dato, eso te lo aclararé en un par de horas lo que pasa es que tengo que ir a estudiar y me gana el tiempo 

p.d.2 De paso aprovecho para preguntarte si influye en algo la forma en la que envio el dato usando los módulos que tengo, en realidad intente enviar en ambos casos, con el dato invertido y luego con el dato verdadero sin obtener resulatado alguno.


----------



## lubeck (Sep 21, 2010)

intenta esto...
* en el serout del TX...*

serout PORTB.6, N2400, [dato,10] 

*y en RX...*


```
DEFINE osc 4
define      LCD_DREG        PORTB           ;bit de datos del LCD empezando
define      LCD_DBIT        0               ;por B.0. B.1, B.2, B.3
define      LCD_RSREG       PORTB           ;bit de registro del LCD conectar
define      LCD_RSBIT       5               ;en el puerto B.5
pause 2000
define      LCD_EREG        PORTB           ;bit de enable conectar en el
define      LCD_EBIT        4               ;puerto B.4
DEFINE      LCD_BITS 4

cmcon= 7
TRISB= 0


dato        var word                        ;crear variable dato para guardar
x           var byte
led         var portB.6
                            
 Symbol N2400 = 4  

inicio:

for x =1 to 3                               ;3 parpadeos del led que indica que funciona
    high led
    pause 200
    low led
    pause 200
next

sensar:
[B]serin PORTA.0, N2400, [10],dato[/B]
LCDOUT $FE,1,"Temp Actual"         ;limpia el LCD y muestra el texto
        dato=dato/2                           ;el dato dividir para 2
LCDout $FE,$c6,dec dato,"ºC"
[B]Goto Sensar[/B]              [B];       <-hacer bucle[/B]
end
```


----------



## Zankoku (Sep 21, 2010)

lubeck dijo:


> intenta esto...
> * en el serout del TX...*
> 
> serout PORTB.6, N2400, [dato,10]
> ...


 hola gracias por la atención prestada, te comento que hice el cambio pero no obtuve aun resultado favorables  , seguiré intentando buscar el método para que transmita.
Por cierto el circuto que implemente para el th12e/d es el siguiente:

http://axxon.com.ar/rob/Prueba_RFLink.htm


----------



## lubeck (Sep 21, 2010)

Mmmm.. algo anda raro con el acople que pretendes hacer.... los ht son codificadores en paralelo a 8bit no seriales...
eso es mas sencillo... busca un tema de fernandoe sobre esos codificadores... si no lo encuentras... postea...


----------



## Zankoku (Sep 22, 2010)

lubeck dijo:


> Mmmm.. algo anda raro con el acople que pretendes hacer.... los ht son codificadores en paralelo a 8bit no seriales...
> eso es mas sencillo... busca un tema de fernandoe sobre esos codificadores... si no lo encuentras... postea...


uhmmm sry si t molesto una vez mas pero podrías explicarme un poco mas referente a eso?, estuve buscando pero como que tengo aún muchas dudas, te comento, mi idea tal vez errónea era cojer el dato que había almacenado en el pin39 del 16f877a proveniente de mi conversor a/d, ese pin conectarlo a uno de los pines de entrada de datos del ht12e y bueno transmitirlos, ahora que lo pienso bien, creo que ese acople que pretendo hacer puede ser erróneo.
De no ser mucha molestia, por favor podrías recomendarme que tipo de acople y con que integrado lo podría hacer?


----------



## lubeck (Sep 22, 2010)

Mira este link...
https://www.forosdeelectronica.com/f22/radiocontrol-modulo-rf-36020/#post293058

la verdad desconozco lo mas optimo pero se me ocurre que busques un conversor serial-Paralelo... o la transmision la hagas en paralelo....


----------



## Alex Oteiza (Sep 22, 2010)

Holaq D@rio: cogí el archivo que has dejado sobre el tacómetro lo probe en el proteus y veo que simula muy bien el programa, yo no se lo que me pasa, pero también tengo hecho un tacómetro y el cicuito en el board me funciona perfectamente, pero no puedo simularlo, no lo veo en el LCD veo que las salidas del micro se activan pero el LCD está como muerto encendido pero no se ve nada. A que puede ser debido esto? .





D@rio dijo:


> hola gente del foro.
> bueno, aca estoy de nuevo, pidiendo vuestra ayuda jeje... no sin antes, dejar un pequeño aportito a cambio. se trata de un tacometro para motores DC como los de aeromodelismo. esta probado en proteus y no se cual es el limite de RPMs que puede medir.
> ahora pasemos a mi duda... bueno, pasa que no tengo por ahora el display de este proyecto y me gustaria hacerlo ya que, me seria de gran utilidad. resulta que tengo un lcd de un nokia 1100 y me gustaria adaptarlo para este proyecto, utilizando como lenguaje de programacion, picbasic. tengo el pinout de este display y he visto en el foro como se conecta, pero lo que no se, es como cambiar la comunicacion entre el pic y el display nokia
> ya que, en este tacometro, la comunicacion es en paralelo y el display nokia, es serie sincronico. ¿acaso se podria usar la instruccion SHIFTOUT para controlarlo? ustedes ¿que opinan? ¿como puedo hacer para adaptarlo a mi diseño? gracias.
> ...


----------



## Dario (Sep 22, 2010)

podrias subir tu proyecto asi lo descargo y veo si puedo ayudarte.
saludosss


----------



## Alex Oteiza (Sep 23, 2010)

Gracias D@rio por tu contestación: perdona que te moleste, me puedes indicar como tengo que hacer para poner el rar o los archivos aquí. Espero no molestarte. Gracias.


----------



## verogirl (Sep 23, 2010)

alex, me adelanto...cualquier cosa Dario corrigeme 

para poder subir archivos deves ir a Avanzado, de alli vas a adjuntar archivo y te aparecera una ventana con las opciones de archivos que puedes subir y el limite en capacidad
lo buscas, lo subes y cierras la ventana, luego pones enviar mensaje y listo!


----------



## Alex Oteiza (Sep 24, 2010)

Muy agradecido" Verogirl". Un saludo. Alex.


----------



## Alex Oteiza (Sep 24, 2010)

Hola d@rio: soy Alex como te dije, probé el programa del tacómetro en el Proteus y funciona perfectamente, monté este circuito en un board,  le puse un generador de frecuencia a 20 Hz y esto no funciona como debiera, el resultado tendría que ser en LCD de 1200 rpm y esto no sale igual, sale como dividido por 10 y la lectura no es estable. Tu has probado este circuito en board?. Sobre lo que te comenté, sobre que no funcionaban los programas en el Proteus la solución biene en poner una resistencia entre el "RS" del LCD y el +5, de esta manera sale la lectura por el Lcd y si no la pongo no se lee?. Bueno ya me contareis algo. Un  saludo.


----------



## Dario (Sep 25, 2010)

hola alex.
la verdad que por falta de un lcd, no he tenido la oportunidad de probar el tacometro en la realidad, al circuito lo saque de un libro de pbasic que tengo, y le modifique las salidas porque no me funcionaba asi con proteus. te paso la imagen del diseño completo porque lleva una etapa de entrada con optoacoplador que no esta en el circuito anterior, probalo asi. NOTA: para que funcione como el de esta imagen, hay que modificar el programa


> Sobre lo que te comenté, sobre que no funcionaban los programas en el Proteus la solución biene en poner una resistencia entre el "RS" del LCD y el +5, de esta manera sale la lectura


pues si te fijas en el circuito, el pin rs del lcd, va conectado al RB1 del micro.
saludosss


----------



## Alex Oteiza (Sep 25, 2010)

Hola D@ario: es el mismo circuito que el mío, yo tambien tengo este libro desde hace una semana, yo probé los circuitos en el proteus y no funcionabann, y como te dige, si pones una resistencia de 4k7 ó de 10k entre el "RS" y el +5 entonces funciona en el Proteus. Te preguntaba a tí y de paso a alguien que lo quiera probar en un board haber si le da las lecturas que a mí me dan. Si pongo un generador a 20 hz, en el display tendría que leerse 1200 RPM y sin embargo se lee 120 RPM y varia continuamente de valores. Quisiera saber el porqué pasa esto. Un saludo y gracias.


----------



## lubeck (Sep 25, 2010)

> Te preguntaba a tí y de paso a alguien que lo quiera probar en un board haber si le da las lecturas que a mí me dan


a mi me gustaria probar... para echarte una mano... pero podrias subir el archivo DSN y el PBP(o bas)

pd. los que necesitemos ayuda prodriamos subirlos siempre???... y mi me da hasta flojera mirarlos si no tienen los archivos... imagino que otros compañeros igual...
saludos...


----------



## Dario (Sep 25, 2010)

> le puse un generador de frecuencia a 20 Hz


amigo alex: ¿estas seguro que el generador esta generando 20HZ?¿como estas midiendo esa frecuencia? otra cosa: ¿que voltage tienen los pulsos que estas inyectando a la entrada?


----------



## holanda (Sep 26, 2010)

hola que tal meca,

muy buena aportacion sobre como programar el pic16f628a con oscilador interno, no se si sepas como seria para el pic16f873a, que instrucciones tendría que llevar porque quise adaptar las instrucciones que escribiste pero no el compilador de microcode studio me marca error, te lo agradeceria mucho, gracias saludos.


----------



## lubeck (Sep 26, 2010)

> no se si sepas como seria para el pic16f873a,


El 873A no tiene oscilador interno segun el datasheet

Solo tiene el RC Resistor/Capacitor,HP High Speed Crystal/Resonator, LP Low-Power  Crystal, XT Crystal Resonator

ejemplo:
@ Device RC_Osc
@ Device HS_Osc
@ Device LP_Osc
@ Device XT_Osc
Respectivamente...
(Ver pagina 145 del Datasheet para mas informacion)
http://ww1.microchip.com/downloads/en/devicedoc/39582b.pdf


----------



## holanda (Sep 26, 2010)

hola que tal lubeck

si tienes razon el pic16f873a no tiene oscilador interno, gracias por la ayuda, ya entendi mejor como buscar si el pic tiene o no oscilador en el datasheet y como hacerlo funcionar, muchas gracias, saludos.


----------



## carlos jara (Sep 26, 2010)

amigos del foro tengo un duda como puedo calcular la frecuencia del pwm interno de un pic 16f628a 
tengo este codigo para calcular a 28khz

```
CMCON     = 7          ' PUERTO A DIGIAL
VRCON     = 0          ' A/D Voltage referencia deshabilitado
TRISB     = %11110000  ' B.3=PWM,B.0,B.1,B.2 LEDs
PR2       = 25        ' Seleecion PWM para aproximadamente 38KHz
CCPR1L    = 13         ' PWM Duty-Cycle a 50%
CCP1CON   = %00001100  ' modo de seleccion = PWM
T2CON     = %00000100  ' Timer2 ON + 1:1 prescaler
```
y quiero una frecuencia de 1 Hz si es posible...

mi dudas es como calcular esas frecuencias....

agradezco cualquier apoyo que me puedan brindar....


----------



## kaymar (Sep 26, 2010)

Hola, Saludos a todos!

Verán, no puedo programar en Microcodestudio - PicBasic 

El caso es que, me gustaría q me dijera alguien; que programa, compilador etc usa o puedo usar.
Y me refiero a que me diga desde cero practicamente, por q aun no he programado pics en basic,
si lo he hecho en C; pero me gustaría probar en basic.

SLDS y gracias de antemano!


----------



## lubeck (Sep 26, 2010)

> Verán, no puedo programar en Microcodestudio - PicBasic


busca el microstudio, y el pbp246(o similar)... el microstudio es el editor y el pbp246 es el compilador...


----------



## ByAxel (Sep 26, 2010)

Hola


carlos jara dijo:


> amigos del foro tengo un duda como puedo calcular la frecuencia del pwm interno de un pic 16f628a
> 
> y quiero una frecuencia de 1 Hz si es posible...



Por ejemplo, si se usa un oscilador a 4Mhz, obtener 1Hz para PWM es imposible, la mínima frecuencia PWM a 4Mhz es de 244Hz aprox. Si el oscilador es mayor, obtener Hz ya no creo que sea posible. Solo te queda hacer PWM manualmente.

un saludo


----------



## lubeck (Sep 26, 2010)

Hola ByAxel
yo tambien me quede con esa duda...
y para calcular el de 244Hz o similar como se haria???

busque la formula en el datasheet pero esta medio compleja 

Me econtre esta pagina para quien le sirva....
aun asi no se de donde sale...
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html


----------



## ByAxel (Sep 26, 2010)

jeje, usando la fórmula *T=(PR2+1)*4*Tosc*TMR2 preescaler* para obtener el periodo más grande...

PR2 = 255 (es el máximo)
TMR2 Preescaler = 16 (es el máximo)
Tosc = 1us (4Mhz/4)
se obtiene 4.098ms de periodo que son 244Hz aproximadamente.

Con prueba y error se obtiene la frecuencia que se busca...

Un saludo.


----------



## kaymar (Sep 26, 2010)

Saludos, tengo este error.

Espero alguien me pueda ayudar. Gracias


----------



## lubeck (Sep 26, 2010)

> Saludos, tengo este error.
> 
> Espero alguien me pueda ayudar. Gracias


yo creo que necesitas windows xp... o conseguir la version de 64bits para vista o seven


----------



## Dario (Sep 26, 2010)

hola faceoff.
¿y que tal si lo haces con pic, asi como este, y usas modulos de rf como estos?
saludosss


----------



## J2C (Sep 27, 2010)

kaymar dijo:


> Saludos, tengo este error.
> 
> Espero alguien me pueda ayudar. Gracias


 
Kaymar

Ese mensaje te sale por que el Sistema Operativo de tu PC es de 64 bit's. Deberas conseguir la versión correspondiente de los programas para tu sistema operativo, o en su defecto instalarlos en una maquina que tenga Windows XP (32 bit) o Vista (32 bit).

Saludos, JuanKa.-


----------



## marcelo2112 (Sep 27, 2010)

Hola, alguien tendra un ejemplo de que con  un pulsador se ponga en marcha o detenga la ejecucion del programa?Es decir star/stop.Gracias.


----------



## lubeck (Sep 27, 2010)

> Hola, alguien tendra un ejemplo de que con un pulsador se ponga en marcha o detenga la ejecucion del programa?Es decir star/stop.Gracias.




```
stat var bit
boton var porta.0 [COLOR="blue"]'puerto del boton[/COLOR]
main:
 stop:
 if boton then toggle stat:pause 200
 if stat then goto stop
 [COLOR="Blue"]' aqui tu codigo[/COLOR]
goto main
end
```
a ver si te sirve lo hice sin probar...


----------



## kaymar (Sep 27, 2010)

Si gracias a todos por su respuesta.

Pero eso ya lo sé, yo uso windows 7 a 64 bits, y se que el problema es ese, tal vez no formule bien la pregunta.

Pero conocen un pbp (compilador) a 64 bits???
o algo cual pueda usar. 

SLDS


----------



## ByAxel (Sep 27, 2010)

kaymar dijo:


> Si gracias a todos por su respuesta.
> 
> Pero eso ya lo sé, yo uso windows 7 a 64 bits, y se que el problema es ese, tal vez no formule bien la pregunta.
> 
> ...


vas a tener problemas ya que según la web Windows 64-bit compatibility requirements tienes que usar el MPASM del MPLAB para compilar y no podrás usar el compilador que viene en el pbp, ese cambio viene con el problema de que no podrás modificar los fuses directamente.

saludos


----------



## kaymar (Sep 27, 2010)

Bien, muchas gracias por tu ayuda.

Veré que onda. Pero por lo visto me quedaré con las ganas de programar pics en basic :enfadado:

SLDS


----------



## lubeck (Sep 27, 2010)

> Pero por lo visto me quedaré con las ganas de programar pics en basic


no tengo el seven ni mucho menos vista, pero hay una manera de usar el xp dentro de vista... yo lo he visto  o seven...


----------



## kaymar (Sep 27, 2010)

Se puede crear una máquina virtual para xp, y cosas así

el mismo windows 7 trae una utilidad para descargarla. Pero ya lo quise hacer y no pude 

Tendré q volver a intentar. GRACIAS y slds


----------



## marcelo2112 (Sep 28, 2010)

lubeck dijo:


> ```
> stat var bit
> boton var porta.0 [COLOR=blue]'puerto del boton[/COLOR]
> main:
> ...


 
ERROR Line 31: Bad expression. (proyecto)
ERROR Line 31: Bad expression or missing THEN. (proyecto)
ERROR Line 31: IF without a matching ENDIF. (proyecto)

Esto es lo que me tira. Gracias por intentar ayudarme.


----------



## lubeck (Sep 28, 2010)

```
stat var bit
boton var porta.0 [COLOR="Blue"]'puerto del boton[/COLOR]
main:
 [B]stope:[/B]
 if boton then toggle stat:pause 200
 if stat then goto [B]stope[/B]
[COLOR="blue"] 'aqui tu codigo[/COLOR]
goto main
end
```
perdon el stop es una instruccion del compilador cambiala por stope...


----------



## marcelo2112 (Sep 28, 2010)

Gracias Lubeck, pero te voy a molestar un poco mas:
Podrias comentar un poco las instrucciones que usaste?(mi intencio es aprender); y por alguna razon, al conectar la fuente arranca de una con el programa, sin esperar a que se oprima el pulsador. Yo tengo la entrada del pic conectada a masa a través de una R de 10k.
A, me olvidaba, como el codigo es "lento", un secuenciador, le cuesta parar, a veces tengo que oprimir unas cuantas veces para que se detenga, queria saber si se puede repetir ese fragmento de codigo a la mitad del programa principal para que haya mas posibilidades de que se detenga de una.
 Gracias de nuevo.


----------



## lubeck (Sep 28, 2010)

```
stat var bit  [COLOR="blue"]'defines una variable tipo bit Alto o bajo 1 o 0[/COLOR]
boton var porta.0 [COLOR="blue"]'defines el puerto donde colocaste el boton pulsador[/COLOR]
High stat 'a[COLOR="blue"]qui pones en alto la variable stat=1 para que se haga el ciclo stope al iniciar[/COLOR]

main: [COLOR="blue"]' defines la etiqueta para el bucle infinito[/COLOR]
 stope: [COLOR="blue"]' defines la etiqueta para el regreso e impide que continue la ejecucion del programa[/COLOR]
 if boton then toggle stat:pause 200[COLOR="blue"] ' si el boton=1 (apretado) entonces cambia el estado de la variable stat si estaba en 1 la pone en 0 o viceversa (toggle) , el pause 200 es un antirebote[/COLOR]
 if stat then goto stope [COLOR="blue"]´ahora  si stat=1 (puede no ponerse el =1) entonces se regresa a la etiqueta stope si no continua con la ejecucion...[/COLOR]
 [COLOR="blue"]'aqui tu codigo[/COLOR]
goto main [COLOR="Blue"]' se cierra el bucle infinito y se va a main[/COLOR]
end
```



> A, me olvidaba, como el codigo es "lento", un secuenciador, le cuesta parar, a veces tengo que oprimir unas cuantas veces para que se detenga, queria saber si se puede repetir ese fragmento de codigo a la mitad del programa principal para que haya mas posibilidades de que se detenga de una.


y si subes el codigo y vemos de que se esta hablando...
no creo que sea solucion el repetirlo...


----------



## marcelo2112 (Sep 28, 2010)

CMCON = %00001111 
TRISA = %11111111 'todos los pines como entradas 
TRISB = %00000000 'todos los pines como salidas
portb = %00000000
star var bit
boton var porta.6 'puerto del boton
High star 

inicio:

stope:
portb = %00000000
if boton then toggle starause 200
if star then goto stope

PORTB = %00000001
pause 200
portb = %00000000
pause 200
PORTB = %00000010
pause 200
portb = %00000000
pause 200
PORTB = %00000100
pause 200
portb = %00000000
pause 200
PORTB = %00001000
pause 200
portb = %00000000
pause 200
goto inicio

end

Muchas gracias, ya casi lo tengo como quiero.


----------



## lubeck (Sep 28, 2010)

para eso te conviene la funcion...

*on interrupt goto*
 sirve para interrumpir el pause ante un evento...
dale una estudiada primero... y si no lo asimilas postea... 
el resto del codigo quedaria igual es solo para despausar las pausas


----------



## viggiani1975 (Sep 28, 2010)

Un saludo a todos,

Por aqui estoy molestando nuevamente, mis disculpas si les enredo el orden que ya traen pero necesito salir de una duda sobre las condiciones anidadas en pic basic, he tratado de hacer funcionar este pequeño código pero siempre da errado y no he podido, así que no me queda de otra que consultar con los que saben, aqui el código y muchas gracias de antemano:
	
	



```
A=2
B=5
C=6
D=5
F=6

INICIO:

IF (A=2  AND (A=B AND C=D)) THEN 
LCDOut "CAMBIO DE ESTADO"
PAUSE 500
ELSE
LCDOUT "ERRADO"
PAUSE 500
ENDIF
GOTO INICIO
END
```


----------



## ByAxel (Sep 28, 2010)

viggiani1975 dijo:


> Un saludo a todos,
> 
> Por aqui estoy molestando nuevamente, mis disculpas si les enredo el orden que ya traen pero necesito salir de una duda sobre las condiciones anidadas en pic basic, he tratado de hacer funcionar este pequeño código pero siempre da errado y no he podido, así que no me queda de otra que consultar con los que saben, aqui el código y muchas gracias de antemano:
> 
> ...



Haber con lo que entiendo..., en esa comparación no hace falta poner paréntesis,
basta con *if A=2  AND A=B AND C=D then*, o que es lo que tratas de hacer?

saludos


----------



## viggiani1975 (Sep 28, 2010)

gracias por responder,

Es cierto lo que me comentas, estaba errado en el código que quería publicar, es muy parecido:

```
ARCHIVO  VAR BYTE[2]
  A VAR BYTE 
  C VAR BYTE 
  F VAR BYTE
  SALIDA VAR PORTB.0
A=2
ARCHIVO[1]=6
C=6
ARCHIVO[2]=7
F=7

INICIO:

IF A=2  AND ARCHIVO[1]=c AND ARCHIVO[2]=f THEN 
LCDOut "CAMBIO DE ESTADO"
PAUSE 500
ELSE
LCDOUT "ERRADO"
PAUSE 500
ENDIF
GOTO INICIO
END
```


----------



## ByAxel (Sep 28, 2010)

Los array comienzan desde el índice cero [0] que viene a ser el primero y como tu variable array es para dos valores, entonces solo se puede indexar con el [0] y el [1]. Por eso cuando usas ARCHIVO[2] da error porque la variable array no es de 3 valores.

saludos.


----------



## marcelo2112 (Sep 28, 2010)

Bueno, estube leyendo sobre *on interrupt goto,*  y por lo que aprendi para el 16f628 solo acepta interrupciones por algun portB, los cuales yo estoy usando todos como salidas. Tendria que cambiar todo el programa, pero lo peor es que ya tengo la plaqueta hecha.
Si no hay otra forma, tendre que hacerlo. Saludos y gracias


----------



## lubeck (Sep 28, 2010)

> Si no hay otra forma, tendre que hacerlo.


si si hay otra forma....
eliminar el pause 200 y hacer los  temporizadores con contadores...
dejame preparar algo... a ver si es de tu agrado...

Prueba este...

```
CMCON = %00001111  
TRISA = %11111111 'todos los pines como entradas 
TRISB = %00000000 'todos los pines como salida

star  var bit
boton var PortA.6
A     var byte
B     var word 
Clear
portb=0
high star
inicio:

if boton then 
 toggle star
 portb = 0
 pause 200
endif 

if not star then
 lookup a,[1,2,4,8],b
 PORTB = b
 pause 200
 a=a+1
 if a=4 then a=0
endif
goto inicio

end
```

el lookup puede ser este segun tu secuencia
*lookup a,[1,0,2,0,4,0,8,0],b*
y el if se cambia por esto * if a=8 then a=0*


----------



## viggiani1975 (Sep 29, 2010)

Muchas gracias ByAxel por tu ayuda, ahora tengo un mensaje que se presenta cuando repito varias veces el proceso, que es cambiar de estado una salida con una clave, el mensajes es éste:
stack underflow executing return instruction.
stack underflow executing call instruction.

Gracias de antemano a quien decida ayudarme.


----------



## lubeck (Sep 29, 2010)

hola viggiani 

y si subes el codigo??? aparentemente tienes muchas subrutinas hay un limite... o un ciclo inadecuado...


----------



## viggiani1975 (Sep 30, 2010)

Gracias por responder Lubeck, sí es buena idea.

```
EPROM1 VAR BYTE
EPROM2 VAR BYTE



Inicio:

DIGITAR:
 x=0
 READ 0,EPROM1
 READ 1,EPROM2
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut, "Digite la clave."

Consulta:
Call Teclado
If VAR1 = 0  Then consulta 
If VAR1 = 10 Then Consulta	
If VAR1 = 11 Then VAR1=0    
If VAR1 = 12 Then Consulta       
X = X + 1
PAUSE 100
ALMACEN[X] = VAR1
IF X=1 THEN LCDOUT $FE,$C7,"*"
IF X=2 THEN LCDOUT $FE,$C8,"*": GOSUB VERIFICAR
GOTO CONSULTA

VERIFICAR:
PAUSE 40
if ALMACEN[1]=EPROM1 AND ALMACEN[2]=EPROM2  THEN
TOGGLE SALIDA
LCDOut $fe, 1
LCDOut "CAMBIO DE ESTADO"
PAUSE 400
ENDIF
GOTO INICIO
END
```


----------



## lubeck (Sep 30, 2010)

Creo que faltan mas cosas del codigo no?....
haciendo esto no me tira ningún error al compilar pero no entiendo que debe hacer....

```
EPROM1 VAR BYTE
EPROM2 VAR BYTE
x      var word
var1   var word
almacen var word[3]
salida var byte

Inicio:

DIGITAR:
 x=0
 READ 0,EPROM1
 READ 1,EPROM2
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut, "Digite la clave."

Consulta:
Call Teclado
If VAR1 = 0  Then consulta 
If VAR1 = 10 Then Consulta	
If VAR1 = 11 Then VAR1=0    
If VAR1 = 12 Then Consulta       
X = X + 1
PAUSE 100
ALMACEN[X] = VAR1
IF X=1 THEN LCDOUT $FE,$C7,"*"
IF X=2 THEN LCDOUT $FE,$C8,"*": GOSUB VERIFICAR
GOTO CONSULTA

VERIFICAR:
PAUSE 40
if ALMACEN[1]=EPROM1 AND ALMACEN[2]=EPROM2  THEN
TOGGLE SALIDA
LCDOut $fe, 1
LCDOut "CAMBIO DE ESTADO"
PAUSE 400
ENDIF
GOTO INICIO

teclado:
return

END
```


----------



## viggiani1975 (Sep 30, 2010)

Ok Lubeck, no coloqué el código del teclado. El código funciona y lo unico que debe hacer es cambiar la salida y retornar nuevamente al mismo punto para nuevamente repetir el proceso, lo que sucede es que después de hacerlo varias veces, aunque sigue funcionando, lanza ese mensaje en cascada, uno tras otro.  Aquí publico todo el código para ver si puedes ayudarme con eso pues quiero implementarlo pero sin errores o mensajes que me pongan a dudar.

```
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
 @ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
 @ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
 @ DEVICE pic16F628A, BOD_ON
 @ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
 @ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
 @ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
 @ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF
 
  CMCON=7  
TRISB=%00000100 
DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1    'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3
   
'----------------------
CAPTURA1 VAR BYTE
CAPTURA2 VAR BYTE
CAPTURA3 VAR BYTE
CAPTURA4 VAR BYTE
EPROM1 VAR BYTE
EPROM2 VAR BYTE
OPCION VAR BYTE
X VAR BYTE
Y VAR BYTE
A VAR BYTE
B VAR BYTE
VAR1 VAR BYTE
VAR2 VAR BYTE
ALMACEN  VAR BYTE[1]
ALMACEN2 VAR BYTE[2]
NCLAVE1 VAR BYTE
NCLAVE2 VAR BYTE
SALIDA VAR PORTB.0
'----------------------
 COLUMNA1 VAR PORTA.4
 COLUMNA2 VAR PORTA.7
 COLUMNA3 VAR PORTA.6
 
 FILA1 VAR PORTA.0
 FILA2 VAR PORTA.1
 FILA3 VAR PORTA.2
 FILA4 VAR PORTA.3
 '---------------------  
   EEPROM 0,[5,6]
   
 
 '---------------------   

Inicio:

DIGITAR:
 x=0
 READ 0,EPROM1
 READ 1,EPROM2
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut, "Digite la clave."

Consulta:
Call Teclado
If VAR1 = 0  Then consulta 
If VAR1 = 10 Then Consulta	
If VAR1 = 11 Then VAR1=0    
If VAR1 = 12 Then Consulta       
X = X + 1
PAUSE 100
ALMACEN[X] = VAR1
IF X=1 THEN LCDOUT $FE,$C7,"*"
IF X=2 THEN LCDOUT $FE,$C8,"*": GOSUB VERIFICAR
GOTO CONSULTA

VERIFICAR:
PAUSE 40
if ALMACEN[1]=EPROM1 AND ALMACEN[2]=EPROM2  THEN
TOGGLE SALIDA
LCDOut $fe, 1
LCDOut "CAMBIO DE ESTADO"
PAUSE 400
ENDIF
GOTO INICIO
END

   
    Teclado:
    VAR1=0
	LOW COLUMNA1      ' Columna 1 = 0
	If FILA1 = 0 Then VAR1 = 1 		' tecla "1"
	If FILA2 = 0 Then VAR1 = 4		' tecla "4"
	If FILA3 = 0 Then VAR1 = 7		' tecla "7"
	If FILA4 = 0 Then VAR1 = 10		' tecla "*"

	HIGH COLUMNA1     ' Columna 1 = 1
	LOW COLUMNA2      ' Columna 2 = 0
	If FILA1 = 0 Then VAR1 = 2 		' tecla "2"
	If FILA2 = 0 Then VAR1 = 5		' tecla "5"
	If FILA3 = 0 Then VAR1 = 8   	' tecla "8"
	If FILA4 = 0 Then VAR1 = 11		' tecla "0"
 
	HIGH COLUMNA2    ' Columna 2 = 1
	LOW COLUMNA3     ' Columna 3 = 0
 	If FILA1 = 0 Then VAR1 = 3		' tecla "3"
	If FILA2 = 0 Then VAR1 = 6		' tecla "6"
	If FILA3 = 0 Then VAR1 = 9		' tecla "9"
	If FILA4 = 0 Then VAR1 = 12		' tecla "#"
     HIGH COLUMNA3
    PAUSE 20
    RETURN        
    END
```


----------



## GoX F4yCk3r DB (Oct 4, 2010)

Hola que tal, hace poco que empece con esto de la comunicacion en serie, solo que ya he intentado varias veces y no encuentro el error, al parecer es Matlab, porque cuando corro el programa me dice que las variables tienen conflictos, alguien que me pueda hechar una manita??
Lo unico que quiero ke haga el pic es que prenda un led y se apague cuando el usuario asi lo desee.
Aqui dejo los programas que estoy utilizando


----------



## lubeck (Oct 5, 2010)

prueba esto...

```
trisc=%10000000
Dato var word
serin portc.7, 2,dato    [COLOR="RoyalBlue"]' 2 para no-Invertido y 6 para  invertido[/COLOR]

if dato=79 then high portb.0 [COLOR="MediumTurquoise"] 'el 79 es el codigo ascii de la O[/COLOR]
If dato=67 then low portb.0   [COLOR="MediumTurquoise"]'el 67 es el codigo ascii de la C[/COLOR]
end
```


----------



## GoX F4yCk3r DB (Oct 6, 2010)

Gracias lubeck, solo unas preguntas
Exactamente que siginifica "No inveritdo" e "Invertido"
Porque el uC trabaja con el codigo ascii y no con el abecedario?, genera problemas al no manejarlo con el coidgo ascii?


----------



## lubeck (Oct 6, 2010)

> Exactamente que siginifica "No inveritdo" e "Invertido"


si usas el max232 lo invierte debes poner el 6 osea que todos lo altos los recibe como bajos y viceversa...



> Porque el uC trabaja con el codigo ascii y no con el abecedario?, genera problemas al no manejarlo con el coidgo ascii?



no se exactamente como lo envie el matlab pero seguramente envia el codigo ascii...
ahora intentalo de ambas formas pero me inclino por el codigo ascii...


----------



## GoX F4yCk3r DB (Oct 6, 2010)

Hola lubeck
sí uso el max 232. Entonces tengo que usar el 6 (invertido).
salu2 y mañana en mi clase pruebo el codigo haber que tal jala.
salu2 y gracias de nuevo


----------



## viggiani1975 (Oct 8, 2010)

Hola nuevamente,

Y sigo con la molestadera. Aquí adjunto la simulación del que me presenta varias alertas cuando se ha digitado la clave varias veces a ver si alguien me sabe orientar del por qué de estos mensajes.

Nuevamente gracias a quien decida colaborarme.


----------



## lubeck (Oct 10, 2010)

Viggiani...
puse la clave con cuatro digitos es 5678...
con el *(asterisco) se borra lo digitado...
tiene muchos detalles tu codigo y el esquema comparalo con el que puse...
a ver si es lo que necesitas...


----------



## viggiani1975 (Oct 10, 2010)

Hola Lubeck,

Gracias ante todo por la ayuda. Sí, ciertamente tenía muchos detalles porque copie parte del código de varios ejemplos lo que resultó a la final con esos errores, ahora le quiero agregar para cambiar la clave y lo demás serán mensajes.

Cómo elimino el detalle que me manda el mensaje que indica que se excede la velocidad real o algo así según lo que entiendo en la simulación?

Como siempre, tu ayuda muy efectiva, muchas gracias de nuevo.


----------



## lubeck (Oct 10, 2010)

> Cómo elimino el detalle que me manda el mensaje que indica que se excede la velocidad real o algo así según lo que entiendo en la simulación?



a veces es por la animaciones...
abre la ventana en menu : system->set animation options...

y ve si esta asi...


----------



## viggiani1975 (Oct 10, 2010)

Si, así mismo se encuentran, qué otro detalle podría ser?


----------



## lubeck (Oct 10, 2010)

mmm.. y si restauras los valores predeterminados.... ahi mismo en el menu system->restore default settings.. si con eso no se arregla no se amigo... te lo debo... 
pero es detalle del proteus...


----------



## lubeck (Oct 11, 2010)

Viggiani...


> ahora le quiero agregar para cambiar la clave


codigo con cambio de clave... 
para cambiar clave tiene que estar apagada la alarma(LED OFF o puerto Salida) y presionar Michi(#) e introducir la nueva clave de 4 digitos...


```
@ DEVICE pic16F628A
@ DEVICE INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE WDT_Off ' Watchdog Timer ON
@ DEVICE PWRT_Off ' Power-On Timer
@ DEVICE BOD_Off
@ DEVICE MCLR_Off ' Master Clear Opción interno
@ DEVICE LVP_Off ' Bajo voltaje de programación
@ DEVICE CPD_Off ' Protección del código de memoria OFF
@ DEVICE PROTECT_Off' protección de código OFF
Define Osc 4
 
CmCon=7  
TrisA=%00001111
TrisB=0 
EEPROM 0,[5,6,7,8]

DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1    'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3
   
'----------------------
X        VAR BYTE
ALMACEN  VAR BYTE[4]
EPROM    VAR BYTE[4]
SALIDA   VAR PORTB.2
Flag     var bit
Cont     var byte
Var1     var word
'----------------------
 COLUMNA1 VAR PORTA.4
 COLUMNA2 VAR PORTA.7
 COLUMNA3 VAR PORTA.6
 FILA1 VAR PORTA.0
 FILA2 VAR PORTA.1
 FILA3 VAR PORTA.2
 FILA4 VAR PORTA.3
 '---------------------  
   
 x=0
 for cont=0 to 3
  READ cont,EPROM[cont]
 next cont
 '---------------------   
flag=0
gosub mmenu 
low salida
high porta.5
Inicio:
 Call Teclado
GOTO INICIO
END

   
Teclado:
 high COLUMNA1                               ' Columna 1 = 0
 If  FILA1 Then VAR1 = 1 :gosub keyc         ' tecla "1"
 If  FILA2 Then VAR1 = 4 :gosub keyc		 ' tecla "4"
 If  FILA3 Then VAR1 = 7 :gosub keyc		 ' tecla "7"
 If  FILA4 Then VAR1 = 10:gosub keyc		 ' tecla "*"
 low COLUMNA1                                ' Columna 1 = 1
 high COLUMNA2                               ' Columna 2 = 0
 If  FILA1  Then VAR1 = 2:gosub keyc         ' tecla "2"
 If  FILA2  Then VAR1 = 5:gosub keyc		 ' tecla "5"
 If  FILA3  Then VAR1 = 8:gosub keyc   	     ' tecla "8"
 If  FILA4  Then VAR1 = 11:gosub keyc		 ' tecla "0"
 low COLUMNA2                                ' Columna 2 = 1
 high COLUMNA3                               ' Columna 3 = 0
 If FILA1  Then VAR1 = 3 :gosub keyc		 ' tecla "3"
 If FILA2  Then VAR1 = 6 :gosub keyc		 ' tecla "6"
 If FILA3  Then VAR1 = 9 :gosub keyc		 ' tecla "9"
 If FILA4  Then VAR1 = 12:gosub keyc		 ' tecla "#"
 low COLUMNA3
RETURN        

keyC:
 if var1=12 then
  if not salida then toggle flag:x=0:gosub mMenu
 else  
  ALMACEN[X] = VAR1
  LCDOUT $FE,$C6+x,"*"
  x=x+1
  if x=>4 then Gosub verificar
  if var1=10 then LCDOut $FE,1,"DIGITE LA CLAVE":X=0
 endif
 PAUSE 500 
Return

mMenu:
if flag then 
 lcdout $FE,1,"INTRODUCIR CLAVE":
else
 lcdout $FE,1,"DIGITE CLAVE": 
endif 
return

VERIFICAR:
 IF FLAG THEN
  for cont=0 to 3
   WRITE cont,almacen[cont]:pause 10
   read cont,eprom[cont]
  next cont 
  LCDOut $FE,1,"CAMBIO CLAVE"
 ELSE
  X=1
  for Cont=0 to 3
   if almacen[cont]<>eprom[cont] then x=0
  next cont
  if x=1  THEN
   TOGGLE SALIDA
   LCDOut $FE,1,"CAMBIO DE ESTADO"
  else 
    LCDOut $FE,1,"CLAVE INCORRECTA"
  ENDIF
 ENDIF 
 pause 500
 flag=0
 gosub mmenu
 X=0
return
```


----------



## viggiani1975 (Oct 11, 2010)

No te preocupes, ya bastante me ayudaste con eso, trataré de indagar un poco más pues recuerdo haber leido algo que tenía que ver, no recuerdo dónde así que a revisar todo.

Gracias de nuevo!!!


----------



## autotronico (Oct 11, 2010)

buenas agradezco la información que se comparte en este foro y deseo plantear un inconveniente estoy realizando un programa en microcode studio con el pic 18f4550 pero al compilar me aparece estos errores:contenidos en el formato PDF el codigo es el siguiente:



> ' CONTADOR ASCENDENTE DE 00 AL 99
> 
> DEFINE OSC 8
> 
> ...



he realizado varios programas pero siempre me generan los mismos errores agradezco la ayuda que me pueden brindar.


----------



## lubeck (Oct 11, 2010)

Intentaste compilarlo con el MPASM

si usas el microstudio vas a view->compile and program option 
ve si te aparece esto...

el mpasm lo descargas de la red...
lo compile y solo me mostró unos warnings(Advertencias)


----------



## autotronico (Oct 12, 2010)

gracias amigo pero tengo la versión 5.3 y compilo pero me aparecen los mismos errores y al querer copiar en la parte superior donde se escoge el tipo de pic para el proyecto cambia automáticamente a pic 16f628.


----------



## lubeck (Oct 12, 2010)

no tengo idea de porque amigo...
mira a mi me lo compila bien...


----------



## autotronico (Oct 12, 2010)

bien listo el pollo es cuestión de instalación y determinar los fuses para aportar subo un programa de visualiza conversión A/D en lcd y su respectiva simulación con el pic 18f4550.


----------



## autotronico (Oct 13, 2010)

:bien con el programa anterior realice un voltimetro DC de 0-5 aqui esta el programa:


```
Define LOADER_USED 1
Define OSC 48      
Define LCD_DREG  PORTD
Define LCD_DBIT  4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG  PORTE
Define LCD_EBIT  1


Define  ADC_BITS     10   
Define  ADC_CLOCK     3   
Define  ADC_SAMPLEUS 50  


MEDIDA   Var Word       
fullbars Var Byte       
barval   Var Byte       
partbar  Var Byte       
pad      Var Byte       

TRISA = %11111111    
ADCON1 = %00001010   
ADCON2 = %10000000   
        
Low PORTE.2          
Pause 500          

LCDOut $FE, 64, REP $0\8                                                      
LCDOut $0, REP $10\6,$0      
LCDOut $0, REP $14\6,$0     
LCDOut $0, REP $15\6,$0                          
LCDOut $FE, 1              

INICIO:
ADCIN 0,MEDIDA              
MEDIDA = (MEDIDA */ 500) >> 2 

LCDOut $FE, 2, "VOLTIOS DC= ", DEC (MEDIDA / 100), ".", DEC2 MEDIDA
barval = (MEDIDA / 9) + 1     
GoSub BARRA             
GoTo INICIO               

BARRA:
fullbars = (barval MIN 60) / 3       
partbar = (barval MIN 60) // 3                  
pad = 19 - fullbars                  
   
LCDOut $fe, $c0, REP $3\fullbars, partbar, REP " "\pad 
Return
End
```

Ahora deseo realizar la comunicación a usb para que se vea en pc por medio de comunicación USB con visual basic , delphi, c++ o labview. les dejo el proyecto hasta ahora ha espero no incomodar en el orden del foro


----------



## reyvilla (Oct 14, 2010)

hola, tengo un problemilla con un proyecto que estoy realizando, quiero realizar una comunicacion con dos pic o mas por via infraroja, para lo cual quiero colocar como emisor un 16f628A y como receptor un 12c509A preferiblemente o si no tambien el mismo 16f628A, mi idea es codificar cada uno de los receptores con un numero especifico de tal manera que al enviar el numero especifico unicamente se active el receptor correspondiente, entonces me explico algo mejor, imaginemos que hay 50 televisores, bombillos, etc...que fungen como receptores y tengo un control remoto el cual tiene la funcion de activar cada uno de los dispositivos independientemente algo asi es lo que pretendo hacer por infrarojo. Intente hacerlo con SEROUT Y SERIN pero no logro hacer que el receptor lo interprete bien, no se si estoy el lo correcto y tengo muchas dudas les agradezco si me pueden echar una mano.

dudas.

1.- que tipo de comunicacion es mejor o me recomienda, serial, ic2, etc...
2.- es posible con estos pic utilizar este tipo de comunicacion o tiene que traer como hadware esta opcion.
3.- si es por ifrarojo es posible la comunicaion serial, ic2, etc...cual es la mejor?
4.- entre los lenguajes que vi estaba el asscii, estoy siempre es igual o puede ser binario para enviar un numero por alguno de los metodos mensionados.
5.- y por ultimo tambien pense hacerlo con rfpic, hay forma de programarlo con picbasic pro y que es mejor para una distancia maxima de 5 metros.

muchas gracias de ante mano.


----------



## lubeck (Oct 14, 2010)

Te doy mi opinion...


> 1.- que tipo de comunicacion es mejor o me recomienda, serial, ic2, etc...


yo diria que por codificacion de tonos...



> 2.- es posible con estos pic utilizar este tipo de comunicacion o tiene que traer como hadware esta opcion.


si fuera por tonos el hardware que necesitarias seria un pic en el mando para codificar los diferentes tonos, y en el recptor un decodificador preconfigurado a determinado tono unico...




> 3.- si es por ifrarojo es posible la comunicaion serial, ic2, etc...cual es la mejor?


la serial... 
aunque tengo entendido que el i2c tambien es serial... creo que uno de los dos(o tu o yo) estamos confundidos en el concepto 


> 4.- entre los lenguajes que vi estaba el asscii, estoy siempre es igual o puede ser binario para enviar un numero por alguno de los metodos mensionados.


en realidad el ascii es tambien binario lo que se manda via serial es binario y el compilador lo traduce a ascii segun corresponda el numero en binario...


> 5.- y por ultimo tambien pense hacerlo con rfpic, hay forma de programarlo con picbasic pro y que es mejor para una distancia maxima de 5 metros.


es la primer vez que oigo eso de rfpic, conozco lo modulos para pic en radiofercuencia con esos no tendrias la limitante de traer el mando o control y apuntar al receptor ademas de la distancia... tiene mas bondades la RF...y si, si es posible con picbasic
usese en caso de que RFPIC sea lo mismo que la radiofrecuencia...


----------



## reyvilla (Oct 14, 2010)

gracias te adjunto la direccion de los datasheet de los rfpic para que le eches una hojeada y me digas que te parece son de la gama baja pero con mas pines y al pareces son igual de faciles de programar. saludossss

edito: http://www.alldatasheet.com/view.jsp?Searchword=RFPIC


----------



## reyvilla (Oct 15, 2010)

ok ya avance algo al respecto y vi cual es el que mas me sirve, revise un poco y de causalidad encontre un tuto que colocaron hace poco de las señales rc5 de phillips, de un control remoto, segun tengo entendido se esta estandarizando, ahora la cuestion es que quisiera hacerlo mas sencillo, generando yo un pulso de lectura el cual va hacer una señal infraroja preliminar a la señal a decodificar, es muy parecido al proyecto que comente del rc5, pero en este caso el tiempo no es critico ya que la idea es hacer tanto el recepto como el emisor para este proyecto y de esta manera hacerlo sin necesidad de una frecuencia standar si no a un tiempo que pueda ser cambiado, de esta forma tambien se evita la cuestion de interferir con otros aparator operados por infrarojo, estube leyendo un poco en una revista de elektor, donde explican el por que la existencia del control remoto y como ha cambiado la vida humana y como afecta la economica muy interesante no sabia que estan limitados a un control remoto ya que aun no han logrado sustituir este artefacto y por los momentos las encuestas dicen que se mantendra por mucho. en fin y volviendo al tema, pretendo hacer dos modulos un emisor y X numero de receptores de tal manera que pueda enviar una señal y cuaquiera pueda recibirla y decodificarla y si la señal pertenece al receptor correspondiente entonces este activa un led, motor, etc...como señal de recibido, es tipo localizador, por infrarojo, debido a que es sencillo no creo que me genere muchos dolores de cabeza...no elegi rf, porque es mucho mas circuiteria y porque realize hace un tiempo un sistema de encender un bombillo por infrarojo y el recepto era tam bueno que aun apuntando hacia el lado contrario del recepto este activo el circuito prediendo el bombillo y la distancia eran unos 5 metro aproximadamente por esto justifico el que sea con infrarojo y no por rf,  en un momento subo el programa en picbasic para que lo vean...saludosss...


----------



## lubeck (Oct 15, 2010)

acabo de ver el link de los rfpic la primer vez que vi el post... no lo vi  ... se ven complejos...
yo también me inclinaría por el IR, suena mas económico, digo por aquello de que cada receptor tendria su circuito independiente...


----------



## reyvilla (Oct 15, 2010)

si, una pregunta estoy usando "COUNT" para contar los pulsos en una entrada, ahora como el count no hay un comando con el cual yo pueda enviar un numero por una salida del pic, por ejemplo algo asi:

for porta.0 = 0 to 3 step 1 ' estoy serviria 
 o hay algo mas simple
vi una que es el pulsout, pero envia un solo pulso por un periodo de tiempo...que me recomiendas...


----------



## lubeck (Oct 15, 2010)

intenta con el pwm

PWM PORTB.7,127,3 ' aqui mandara al puertoB7 tres pulsos con un 50%


----------



## reyvilla (Oct 15, 2010)

realice lo que me dijiste con el pwm pero me envia como 132 aproximadamnete con 1 circlo te coloco el programa para que me digas si hice algo mal, ah y por cierto tome parte de uno que habian echo para un teclado matrixial y lo adapte.



@ DEVICE pic16F628
@ DEVICE INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE WDT_Off ' Watchdog Timer ON
@ DEVICE PWRT_Off ' Power-On Timer
@ DEVICE BOD_ON
@ DEVICE MCLR_OFF ' Master Clear Opción interno
@ DEVICE LVP_OFF ' Bajo voltaje de programación
@ DEVICE CPD_OFF ' Protección del código de memoria OFF
@ DEVICE PROTECT_OFF' protección de código OFF

Define Osc 4
CMCON=7  


A        var word

 COLUMNA1 VAR PORTB.0
 COLUMNA2 VAR PORTA.6
 COLUMNA3 VAR PORTA.7

 FILA1 VAR PORTA.0
 FILA2 VAR PORTA.1
 FILA3 VAR PORTA.2
 FILA4 VAR PORTA.3

clear

Inicio:
TrisA=%00001111
TrisB=%00001000
PORTA = %00000000
PORTB = %00000000
Call Teclado
GOTO INICIO
END


Teclado:

 high COLUMNA1                   ' Columna 1 = 1
 If  FILA1 Then gosub S1 '       ' tecla "1"
 If  FILA2 Then gosub S4   ' tecla "4"
 If  FILA3 Then gosub S7   ' tecla "7"
 If  FILA4 Then gosub S10   ' tecla "*"
 low COLUMNA1                    ' Columna 1 = 0
 high COLUMNA2                   ' Columna 2 = 1
 If  FILA1  Then  gosub S2       ' tecla "2"
 If  FILA2  Then  gosub S5   ' tecla "5"
 If  FILA3  Then  gosub S8     ' tecla "8"
 If  FILA4  Then  gosub S11   ' tecla "0"
 low COLUMNA2                    ' Columna 2 = 0
 high COLUMNA3                   ' Columna 3 = 1
 If FILA1  Then gosub S3   ' tecla "3"
 If FILA2  Then gosub S6   ' tecla "6"
 If FILA3  Then gosub S9   ' tecla "9"
 If FILA4  Then gosub S12   ' tecla "#"
 low COLUMNA3                    ' Columna 3 = 0
 RETURN        
 S1:
 PORTB.2 = 1      'señal de bandera para empezar a leer los ciclos, activa el receptor
 PAUSE 250        'se suma en la espera al receptor con los otros 250ms al final y
 PORTB.2 = 0     ' depues de  500ms es que empieza el count a contar los pulsos.
 PAUSE 250           
*PWM PORTB.2,127,1 'cada ciclo ocurre aprox. cada 5ms, segun manual
* PORTB.2 = 0
 GOTO TECLADO

S2:
S3:
S4:
S5:
S6:
S7:
S8:
S9:
S10:
S11:
S12:


por cierto aprovecho para mostrar el circuito que estaba haciendo y que me ayudaron por aca el del minutero para que vean como quedo...saludosss


----------



## lubeck (Oct 15, 2010)

Oye reyvilla

dos comentarios antes de continuar....
primero.- el minutero quedo muy bien... y te podria recomendar que le pongas un teclado por la cara... es decir... hay quienes imprimen un acetato para impresora de tinta y por debajo ponen una hoja en blannco y se ven bastante bien esteticamente.... o algo asi, aqui o no recuerdo donde vi el proceso...

Segundo... estaba analizando el codigo y creo que no entiendo muy bien como va a ser el harware...
o sea que segun veo ese algoritmo podría confundir a  los receptores, creo que si el receptor fuera otro micro lo adecuado seria con el serin y el serout o tu que opinas???

tienes ya preparado algun esquema???...


----------



## reyvilla (Oct 15, 2010)

te adjunto la imagen donde se observa, primero 1 y despues 0 cada uno dura 500ms y luego un tren de pulso que se supone sea el ciclo del pwm...

gracias por lo del minutero tomare en cuenta tu recomendacion, con respecto a sistema pretendo hacerlo lo mas sencillo posible, yo utilice el serin y el serout pero tengo muchas dudas al respecto, ya que es un comando complejo, bueno para mi, pero si tu me dices como puedo usarlo te agradeceria un millon de veces. Lei el manual y habla de codigo ascii y velocidades?

lei nuevamente el manual y con respecto al serout me dice esto:

SEROUT Pin,Mode,[Item[,Item...}]
Envía uno ó más Items a Pin , en formato standard asincrónico usando 8 bits de datos , sin paridad y 1 stop bit (8N1) .SEROUT es similar al comando Serout de BS1 .Pin es automáticamente colocado como
salida . Pin puede ser una constante , 0 - 15 , ó una variable que contenga un número de 0-15 (p.ej. B0) ó
un número de Pin (p.ej. PORTA.0)
Los nombres Mode (p.ej. T2400) están definidos en el archivo MODEDEFS.BAS .
Para usarlos ,agregue la línea :
Include "modedefs.bas"
al comienzo de su programa PBP .
BS1DEFS.BAS y BS2DEFS.BAS ya incluyen MODEDEFS.BAS . No lo incluya ,si ya está usando uno
de ellos .Los números Mode pueden ser usados sin incluir este archivo .

No entiendo "sin paridad y 1 stop bit (8N1)"...? 
lo demas si, ya inclui el archivo y todo solo falta desifrar el como utilizarlo?​


----------



## willyfv (Oct 15, 2010)

Saludos,

Buenas noches amigo, estoy  viendo toda tu informacion y veo que manejas muy bien el picbasic,  actualmente estoy estudiando ese lenguaje.

Tengo una duda para ver si me podrias ayudar.

Estoy trabajando con el formato SERIN pero quiero recibir varios datos y que me realize una rutina, ejemplo:

* cuando envie la letra A por medio de la pc el pic lo recibe y realice una secuencia de efectos con led

* cuando envie la letra B por medio de la pc el pic lo recibe y realice una secuencia de efectos con led

Y asi susecivamente ya lo probe simulado en proteus y con el Virtual  Serial Port Driver y funciona bien pero tengo envia una letra por letra.

hasta alli todo bien, pero cunado envio AB juntos solo me reconoce una sola letra.

La idea es si escribo en la pc ABCD el pic lo reconosca y realice la  secuancia de efectos correspondiente a esas letras y se mantega esa  secuencia hasta que envie otra letra. 

Hasta ahorita solo tengo esto: USANDO PIC 16F917
INCLUDE "MODEDEFS.BAS"
DEFINE OSC 4
DEFINE LCD_DREG PORTC
DEFINE LCD_DBIT 4     
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 2 
DATAS VAR BYTE

LCDOUT $FE,1,"LCD LISTO"
PAUSE 1000
LCDOUT $FE,1

INICIO:
SERIN PORTB.0,T9600,DATAS
LCDOUT, DATAS
if datas="A" then A
if datas="B" then B
if datas="C" then C
GOTO INICIO

A:
high portd.0
pause 250
low portd.0
pause 250
GOTO INICIO
B:
high portd.1
pause 250
low portd.1
pause 250
GOTO INICIO
C:
high portd.2
pause 250
low portd.2
pause 250
GOTO INICIO

END


----------



## reyvilla (Oct 15, 2010)

crea una variable tipo word que contenga la palabra o letras que estes escribiendo y que lo guarde temporalmente en la eeprom y que a su vez borre, seria como un tipo de indexacion, vas guardando en la pila o stack, de manera que tengas una cierta cantidad de letras para escribir y luego empiece a reemplazar las primeras que se introdujeron...por ejemplo...saludos...

ahora yo tengo una duda eso que tu haces de pc a pic yo puedo hacerlo de pic a pic.....?

les adjunto el como estoy simulando todo...


----------



## GoX F4yCk3r DB (Oct 15, 2010)

Hola que tal, acabo de entrar a este rollo del PWM, es interesante, ya fabriique mis programa para la comunicacion en serie.
Lo que tengo que hacer es lo siguiente.
Aumentar o disminuir la velocidad del motor con el PWM, a traves de una comunicacion serial, es decir cuando el usuario mande la letra "A" la velocidad del motor debe aumentar y si mando la letra "D" la velocidad del motor disminuye.
Hoy lo realice en clase y lo unico que logre es que el motor gire a su velocidad maximan, no se porque, pero al momento de establecer la comunicacion y mandar la letra "A" un led prende y el motor empieza a girar a todo lo que da. Además de que si mando otra letra este ya no hace nada tengo que cortar la corriente para resetear el PIC.
Si no es mucha molestia aqui les dejo mis dos programasy haber si me puenden ayudar.
PD:Algun programa para simular la comunicacion serial? uso matlab y programo en Pbasic(microcode)
salu2


----------



## lubeck (Oct 15, 2010)

Reyvilla

mira este a ver si lo que tienes es mas o menos lo mismo...
tiene un detalle que todavia no logro solucionar pero ahi va... presionas la tecla 1 (superior izquierda)


----------



## reyvilla (Oct 15, 2010)

de maravilla por alli va la cosa ahora que significa "#b0v e #id"...?


----------



## lubeck (Oct 15, 2010)

en eso estaba batallando un poco jejeje..

si le pones en el serout el # a una variable lo convierte el numero a ascii 
y al ponerlo en el serin el # la variable la convierte de ascii a numero...

el parecer el serial lo manda en ascii...

no se si te fijaste en el error aca tengo que presionar dos veces para que se active o desactive...


----------



## reyvilla (Oct 15, 2010)

ok miremos esto un momento porque no entiendo a que se refiere un tal "LF" este es el manual pbp no se si tu lo tienes...

Aunque los chips convertidores de nivel RS-232 son comunes y baratos, gracias a la implementación de corriente RS-232 y las excelentes especificaciones de I/O del microPIC , no se requieren convertidores de nivel en muchas aplicaciones . Se puede usar TTL invertido ( N300 ...N9600 ) .Se sugiere el uso de un resistor limitador de corriente (se supone que RS-232 es tolerante a los cortocircuitos ). SEROUT 0,N2400,[#B0,10] ´ envía el valor ASCII de B0 ,seguido por un LF al pin 0 , en forma serial​

con repespecto a LF es un line feed, buscando y buscando lo encontre pero aun no lo entiendo, es un avance de linea, aunque leyendo un poco mas ese 10 puede cambiar o se puede quitar, ahora si no quiero enviar un asscii si no un binario?


----------



## lubeck (Oct 15, 2010)

LF es LineFeed o avance de carro o linea es el 10 en codigo ascii pero no es necesario creo deja intentarlo, al igual que no es necesario el rs232...
en pablin hay un amisor y un receptor IR... ya lo haz visto???


----------



## reyvilla (Oct 15, 2010)

no he visto el de pablin es con pic y en picbasic pro?

bueno eso del enviar en binario lo decia por que vi el serout2 que permite mas cosas como enviar un codigo binario, pero si no se puede sera el serout.


----------



## lubeck (Oct 15, 2010)

ya verifique el avance de carro y ya funciona ok...
la linea del serout es asi...

* serout puls,T9600,["A",#ID,10]*

lo de pablin es solo el emisor y el receptor que podriamos acoplar al pic que estamos programando...


----------



## reyvilla (Oct 15, 2010)

si lo probe y funciona a la primera gracias, ahora sale un 65A en el data terminal no deberia ser una A?

ya vi no se si es normal, pero cambie la letra A por B y ahora sale 66B
y ya volvi a chequear y si es normal busque una tabla ascii y la letra a es el renglon 65 y la b pertenece al reglon 66


----------



## lubeck (Oct 15, 2010)

a mi me funciona bien... que simulador usas??? no es proteus???

sube el archivo si es proteus...


----------



## reyvilla (Oct 15, 2010)

disculpa la demora se desconecto la maquina...alli va el archivo la diferencia es que no use el pin del colector para evitar la resistencia pull-up.

sabes yo incluso utilice los pines tx y rx del pic por si acaso habia algun conflicto?


----------



## lubeck (Oct 15, 2010)

pero el codigo no esta igual en el serin ni en el serout asi no va a funcionar ya me confundi...

tu lo tienes asi...
*serout portb.2,T2400,[a]*
y yo asi
*serout puls,T9600,["A",#ID,10]*

el puls se cambia por el portb.2 en eso no hay problema...

la "A" es para que los serin de todos los receptores esten a la espera de que les llegue una A para verificar el dato siguiente... que es el dato que este en el #ID, y el 10 es para que finalice el envio...
o cual es tu idea???


----------



## reyvilla (Oct 15, 2010)

bueno ya realice varias pruebas, y al final uso: *serout puls,T9600,["A",#ID,10]  * ya lo entendi bien asi, ahora hubo unas confuciones fue porque a nivel de conexiones hay varias direfencias, yo utilize el el pin portb.2 del mando para enviar los datos y tu el portb.0 no se si esto influya pero yo lo utilice porque dice Tx, y por otra parte la salidad del led indicando que el dato que esperaba recivir es correcto, de resto todo lo demas esta bien, espero no haber echo un mucho despelote, en fin, para mi es indiferente la cuestion es que funcione, y lo demas es cuestion de adaptarlo, probe colocando diferentes letras y si las diferencia, pero aun hay que darle dos veces al boton para que salga el caracter en el virtual terminal.

lo he logrado de momento la meta de hoy muchas gracias amigo *"lubeck" *de verdad, de momento logre adaptarlo a lo que requeria el sistema de momento en simulacion funciona logre conectar al 16f628A unos 3, 12f629 que estan como receptores los cuales cada uno tiene una letra especifica y al enviar esa letra en codigo asscii a traves del teclado un unico 12f629 se activa permaneciendo los demas en espera, lo que indica que si descriminan y lo se activan a lo loco. te adjunto la simulacion con todos los programas hice 10 programas en total en basic para los receptores. hay 10 carpetas. por otro lado esta la simulacion de los 16f628A para pruebas. y la del sistema completo con tres 12f629, que es la que esta funcionando en simulacion....hablamos luego y gracias de nuevo...saludosss


PD: Por cierto encontre unas paginas interesantes con respecto a los comandos que soportan los pic, en el pbp, las encontre debido a que queria utilizar el 12c509A en vez del 629, pero no soporta el serin...saludosss

http://melabs.com/support/12-bit.htm
http://www.rentron.com/picbasic/products/picbasic-pro.htm


----------



## lubeck (Oct 16, 2010)

> pero no soporta el serin.



lei la pagina y creo que lo que no soportan es el serin2 y el serout2 es diferente al serin y serout...
o estare mal???

por otro lado sugiero que en los  programas para los identificadores creo que podrías utilizar el mismo programa para todos y nada mas cambiar el identificador de los receptores utilizando el eeprom, a ver si fui claro!


----------



## reyvilla (Oct 16, 2010)

claro que voy a utilizar un solo programa, lo hice asi para hacer las pruebas y no confundirme a la hora de la simulacion, con respectoa la eeprom he visto unos cuantos programas que usan eeprom del pic pero no me he dedicado a utilizarlo. del serin y serout, no lo dice en la pagina pero no me permite compilarlo el microcode, utilice exactamente el mismo programa pero con el 12f629 y lo compilo sin problemas por eso deduje que era por memoria a demas que en la pagina que me hablaba de sertou2 y serin2.

PD: por ceirto lo simulaste que te parecio?


----------



## lubeck (Oct 16, 2010)

> por ceirto lo simulaste que te parecio?


va bien... nada mas se me ocurrio eso de hacerlo con el eeprom y no estar cambiando el codigo para ponerle eso de A B C  D etc sino que lo saque del eeprom...

voy a verificar eso del serin y serout... solo por comprobar el dato... gracias por la aclaracion...


----------



## reyvilla (Oct 16, 2010)

una manera seria, que sea programable desde una consolsa, me explico: pongamos que tenemos en el mando un teclado y un lcd el cual nos permite muchas cosas entre echas visualizar que esta ocurriendo. pongamos una parte del programa como programacion tipo menu en el display. seleccionando programar teniendo un solo receptor encedido claro. se le coloca una letra por ejemplo P para que cuando cualquiera de los receptores la reciba se coloque en una subrutina de espera, la cual a partir de alli el dato que reciba lo guarde en la eeprom y quede configurado con ese dato programado por infrarojo que tal?


----------



## lubeck (Oct 16, 2010)

andale!!!

eso esta genial!!!


----------



## reyvilla (Oct 16, 2010)

dale estoy ahorita dandole unos toques finales a los dos programas, si me podrias ayudar con lo de la eeprom como guardar en ella como configurar...etc... te lo agradeceria

logre colocar una señal de bandera de lectura, que significa esto, que ahora el receptor se sincroniza mas aun con el emisor, al presionar el boton el mando genera una señal para preparar al receptor para recivir los datos garantizando asi que se lea correctamente la informacion. no es mas que un retardo de 100ml

ahora vi dos comandos que al parecer cumple la misma funcion cual seria la diferencia entre "DATA" Y "EEPROM"?

quisera saber como puedo hacer algo asi:

@ device pic12f629,intrc_osc,wdt_off,pwrt_off,mclr_off,protect_off  
INCLUDE "modedefs.bas"  
Define Osc 4
CMCON = 7

TRISIO = %00001001 
gpio   = %00000000

Puls var gpio.0
B0  var byte
 main:
 IF GPIO.0 = 1 THEN
 GOSUB LEE
 ELSE
 GOTO MAIN
 ENDIF  


 LEE:
 PAUSE 100
*serin puls,T9600,["A"],#EEPROM '*como le digo que lo guarde en la eeprom?
* IF EEPROM = "A" THEN                    ' *y como lo leo luego?
 gpio.2 = 1
 endif
 goto main


----------



## reyvilla (Oct 16, 2010)

de nuevo con un pequeño analsis mas con respecto a la exprecion siguiente:

*SEROUT Pin,Mode,[Item[,Item...}]*[/size]​ 
*serout PIN,T9600,["A",#ID,10]*

ya tengo un rato jugando y peleando con esto, la primera parte "*serout" *no es mas que el nombre del comando.

la segunda "PIN" es el pin por donde se piensa enviar la informacion. ejemplo: portb.1

la tercera "MODE" esto se refiere a una tabla de Baud rate osea la velocidad de transmision de los datos por decirlo de forma general.Por lo cual hay 2 maneras distintas de colocar mode, si se va a trasmitir a 9600 entonces es T9600 ò 2. en total hay 15 modos en la tabla del manual para serout.[/size]

cuarta los "INTEMS" no son mas que lo que se pretende enviar, hay varias cosas interesantes aqui:

no es lo mismo? 

*["foro",#var,10] 'en este caso envia una sarta de caracteres independientes.*

*["f","o","r","o",#VAR,10] 'en este caso es exactamente lo mismo*

estoy me llevo tiempo descubrirlo que pasa, para el primer caso es un resumen del segundo asi de simple.

continuando...

*#VAR, *se le coloco var por que puede ser el nombre de una variable, o un simbolo, numero, letras. en fin algo que este dentro de los valores ascii, ahora al lado de var hay un numeral, este me dio unos cuantos dolores de cabeza que gracias a lubeck y proteus logre descubrir, resulta que al enviar una variable con *# *enviamos el codigo ascii de esa variable, numero o letra que este alli, osea si es A lo que va salir es 65, ejemplo de 5 casos:

*serout PIN,T9600,[#A] 'envia en codigo ascii el valor de la variable A*
*' si la variable A vale B entonces envia A67 que *
*'corresponde en la tabla ascii con B. *

*serout PIN,T9600,[A] 'envia el valor de la variable A si es B sale B*
*'a diferencia del anterior no se codifica osea*
*'al llegar al otro estremo no hay que decodificarlo.*

*serout PIN,T9600,["A"] 'envia la letra A no el codigo 65 si no la letra esto segun*
*'el virtual terminal.*

*serout PIN,T9600,[65] 'envia la letra A no el codigo 65 si no la letra esto segun*
*'el virtual terminal igual al anterior.*


*serout PIN,T9600,[#"A"] 'envia el codigo 65 segun*
*'el virtual terminal.*


siguiendo...

los otros dos items una varible y el LF.
Line Feed: salto de linea, pero para el pbp es la señal de finalizacion de lectura, le indica al receptor que termino la transmision.​ 
conclusion: 
para resumir un poco ya explicado lo anterior, el comando serout, envia 2 items de los cuales el primero es de sincronizacion o señalizacion para para iniciar la lectura y el segundo son los datos a leer, el tercero indica la finalizacion de envio de datos esto hablando de pic a pic.​ 
*SEROUT Pin,T9600,["A","b",10] 'señalizo con A y envio B. enviando...*

*SERIN Pin,T9600,["A"],VAR 'espero la señalizacion con A y guardo el siguiente*
*'caracter en VAR osea A.*

bueno espero esto aclare y genere dudas para debatir mas al respecto no se me hace sencillo pero por algo hay que empezar espero criticas construtivas...saludos


----------



## lubeck (Oct 16, 2010)

orale!!!!!!!!!

no me gusta leer tanto... me lo podrias poner en numeros!!! jajajaja (broma)



> ahora vi dos comandos que al parecer cumple la misma funcion cual seria la diferencia entre "DATA" Y "EEPROM"?


es casi lo mismo se usa una sola vez al inicio y es lo que graba en el pic cuando se graba en el quemador despues se tiene que utilizar el write y el read para modificar la eeprom

el Data utiliza hexadecinal o binario segun como lo pongas 
ejemplo data    @5,$0A,$14 ,$1E
el eeporm utiliza decimal y lo convierte a hexadexcimal
ejemplo EEPROM 5,[10,20,30]

los dos grabaran lo mismo en el eeprom

Te debo lo demas dejame leerlo...


----------



## reyvilla (Oct 16, 2010)

ok digramos que tengo un serin y guardo un caracter en una variable para pasarlo a la eeprom
seria:
eeprom 5,variable?
y para sacarlo de la eeprom
read 5,variable?


----------



## lubeck (Oct 16, 2010)

```
data    @2,$07,$DF [COLOR="Blue"]' graba esto al quemar el pic en la eeprom[/COLOR]

read    2,passd.highbyte [COLOR="blue"]'lee la posicion2 que es 07 y lo coloca en la parte alta del byte[/COLOR]
read    3,passd.lowbyte [COLOR="blue"] 'lee la posicion3 que es DF y  lo coloca en la parte baja del byte[/COLOR]
'[COLOR="blue"]como 07DF es 2015 en ndecimal entonces la variable passd=2015[/COLOR]

passd=2013[COLOR="blue"] 'cambiamos el valor de passd[/COLOR]

[COLOR="blue"]'como 2013 en hex = 07DD[/COLOR]

write 2,passd.higbyte  [COLOR="blue"]'colocamos la parte alta que es $07 en la posicion 2[/COLOR]
write 3,passd.lowbyte[COLOR="blue"]  'colocamos la parte baja que es $DD en la posicion 3[/COLOR]
'la eeprom quedaria asi...
'00 07 DD
```


----------



## reyvilla (Oct 16, 2010)

avance en lo siguiente:

@ device pic12f629,intrc_osc,wdt_off,pwrt_off,mclr_off,protect_off 
OPTION_REG.7 = 0 
VRCON = 0 
INCLUDE "modedefs.bas" 
Define Osc 4
CMCON = 7

TRISIO = %00001000 
gpio = %00000000
ACEPTADO VAR GPIO.1
LEYENDO VAR GPIO.2 
IN VAR GPIO.0
SERIAL VAR WORD
DATAID VAR WORD
CLEAR

INICIO:
LEYENDO = 0
ACEPTADO = 0
read 5,seriaL
serout GPIO.4,T300,[SERIAL,10]
IF IN = 1 THEN
GOSUB LEE
ENDIF
goto inicio
LEE:
SERIN IN,T300,["A"],DATAID
PAUSE 200
LEYENDO = 1
PAUSE 500
GOSUB VERIFICACION
GOTO INICIO


VERIFICACION:
IF DATAID = "P" THEN
GOSUB GRABAR
ENDIF
IF DATAID = SERIAL THEN
ACEPTADO = 1
serout GPIO.4,T300,[DATAID,10]
GOTO INICIO
ENDIF


Grabar:
WRITE 5,daTaid 'graba valor recibido que esta en dataid en la eeprom el caracter seguido de A un 1 
ACEPTADO = 1 
PAUSE 1000
GOTO INICIO
END


resulto ser que si lo guarda coloque un serout al inicio para chequear que lo guardaba, lo que hice fue guardar en la variable serial el valor guardado en la direccion 5 de la eerpom y luego lo envie por serout por un pin libre del pic y si resulto que si lo envio demasiado bueno...jejeje

otra cosa que note es que cambie la letra y coloque otra a enviar y me muestra la anterior y luego sale la nueva letra algo asi:

letra guarda A paro la simulacion cambio la letra y vuelvo a simular y me muestra la A por el serout del inicio y cuando programo la nueva letra empieza a parecer la nueva y deja de aparecer la A esto es en el virtual terminal...curioso  es como si el proteus mantuviera los datos de la eeprom del pic no sabia eso.

adjunto la imagen:


si es cierto ya que sin tocar ningun boton el programa queda en el lazo de inicio haciendo la lectura de al eeprom y luego la envia por serout, entonces si guarda en la memoria del pic la informacion.


----------



## reyvilla (Oct 17, 2010)

yo de nuevo por aca parece que los corri a todos jejeje. bueno explico mis avances, resulta que logre hacer funcionar el circuito con serout y serin con un baud rate de t300 bastante bien, logre programar un receptor con un codigo a travez de la eeprom colocandole asi una identificacion al receptor de tal manera que pueda codificarse con cualquier serial en cualquier momento, todo esto es via serial de pic a pic, aparte logre a travez del virtual terminal vizualizar cada proceso, sabiendo con esto en que parte del programa del pic se encontraba ejecuantando en ese momento, lo unico es que se pone super lenta la simulacion pero si se aprecia..adjunto todo para quienes quieran ver como funciona cualquier duda me pregunta y si me pueden ayudar a mejorarlo de antemano muchas gracias...saludoss

PD: la idea de este sistema es un control infrarojo para varios receptores para que se activen con una señal unica...saludos

actualizacion del archivo con mejoras...saludos


----------



## lubeck (Oct 19, 2010)

Rey villa
mira este link_ https://www.forosdeelectronica.com/posts/364265/ _le intentamos con ese???


----------



## reyvilla (Oct 19, 2010)

el receptor que yo utilizo es el TSOP1137 que trabaja a 37 khz y el TSOP2236 a 36khz te dejo la hola de datos, los eleji por que primero los consegui por aca son bien comunes ya que son del receptor de los tv y segundo por que es un integrado osea no solo recive si no que limpia las señales, etc... y tercero es muy economico. el que si me interesa es el receptor el cual tambien vi uno similar al que me muestras la diferencia era que llevaba una resistencia en el colector del transistor pero no tiene el valor, los controles remotos son bien sencillos son 5 o 6 componentes, el micro el crystal dos condensadores una resistemcia y el led. pero de todas maneras esta bien bueno el circuito lo unico como tu dices faltan los valores de las resistencias...saludosss


----------



## viggiani1975 (Oct 21, 2010)

Saludos nuevamente,

Me he estado preguntando sobre el stamby en pic basic, es programable o el pic entra en este estado solo? es que, si es programable, me gustaría saber cómo pues he buscado y no he hallado material al respecto o no he sabido en la dirección correcta. Si alguien me orienta, gracias de antemano.


----------



## reyvilla (Oct 21, 2010)

tu hablas sobre el sleep o estado de bajo consumo del pic?


----------



## G@@r@-S@m@ (Oct 21, 2010)

hola saludo a todos estoy empesando com lo de los pic poco a poco he comprado mi pequeno laboratorio (cosa que no es facil) bueno,  mi problema es el siguiente:

Estoy programando con el  *Pic Basic Pro *y me he decidido por el PIC16F887 ya que es la actualizacion del PIC16F877 (es mas economico). decidi hacer un termometro digital basandome en el ejemplo que esta unas pag atras, con el pic877 funciona bien pero con el F887 no me da registro de nada no se como configurar el puerto.

Espero comentarios
Gracias....


----------



## reyvilla (Oct 21, 2010)

hola lubeck aqui dejo la simulacion de envios serial via infrarojo con 16f628A, he probado en el protoboard pero no me da respuesta, si conecto directamente la salida del emisor con el receptor todo ok hasta logro configurar el receptor, pero al hacerlo con los ingrarojos nada que ver, si envia la señal el emisor y si la recibe el receptor pero creo que es por la frecuencia, la señal de trasmicion serial esta a T9600 voy a intentar hacerlo con T300 a ver que tal, pero mi duda seria que frecuencias serian aproximadamente la de salida si se trabaja a T9600 o T300? saludosss


----------



## lubeck (Oct 21, 2010)

> estoy buscando el código en picbasicpro para esta aplicacion, agradezco su colaboracion.


si te ayuda en algo mi consejo es que empieces con aplicaciones que esten bien sencillas y utilices un simulador como proteus como por ejemplo...
lo de menos es hacerte la aplicación o ayudarte a buscarla pero no creo que te sirva como material didáctico y siempre vas a estar en busca de lo ya echo...

ahora si ya tienes algo avanzado subelo y con gusto te echo una mano, con simulador es mucho mas facil... que solo con el codigo...

recuerda que mi opinion es sin saber que tanto sabes al respecto...

*Rey*

mira estuve indagando un poco el día de hoy y vi este link que nos podría servir de ayuda...sabia que íbamos
a tener problemas en la realidad... 
no lo he analizado detalladamente...
http://pablob86.elapco.net/2010/05/transmisor-infrarrojo-ir-con-pic-16f87.html


----------



## GoX F4yCk3r DB (Oct 21, 2010)

Hola Lubeck, no me hechas una mano a mi?? 


			
				GoX F4yCk3r DB dijo:
			
		

> Hola que tal, acabo de entrar a este rollo del PWM, es interesante, ya fabriique mis programa para la comunicacion en serie.
> Lo que tengo que hacer es lo siguiente.
> Aumentar o disminuir la velocidad del motor con el PWM, a traves de una comunicacion serial, es decir cuando el usuario mande la letra "A" la velocidad del motor debe aumentar y si mando la letra "D" la velocidad del motor disminuye.
> Hoy lo realice en clase y lo unico que logre es que el motor gire a su velocidad maximan, no se porque, pero al momento de establecer la comunicacion y mandar la letra "A" un led prende y el motor empieza a girar a todo lo que da. Además de que si mando otra letra este ya no hace nada tengo que cortar la corriente para resetear el PIC.
> ...


----------



## reyvilla (Oct 21, 2010)

esta bien, bueno, lo que no capto mucho es el como hace, es decir yo envio un pwm por un pin del puerto con un ciclo de trabajo xxx%, y una cantidad de ciclos xxx por un tiempo xxxms, y luego envio un serout, seria algo asi?

hola @gox-f4yck3r-db que microcontrolador estas usando? te pregunto porque revise el programa y no lo tienes definido, tampoco el oxcilador si es a 4mhz o 20mhz, etc... Faltan muchas cosas en el programa que no veo.


----------



## GoX F4yCk3r DB (Oct 21, 2010)

podria decirse, lo que basicamente quiero hacer el regular la velocidad del motor, esto con la comunicacion en serie, si el usuario aprieta la tecla "X" el motor aumenta de velocidad, y si aprieta la tecla "Y" pues disminuye la velocidad, ya lo he estado probando y no jala, al momento presionar la tecla "X" el motor luego luego da todo el torque siendo que deberia pues empezar desde 0 e ir aumentando gradualmente su PWM

Uso un uC 16f877A, el cristal es de 4 mhz


----------



## reyvilla (Oct 21, 2010)

yo creo que no es tan facil como lo planteas, que pasa si x 65000? no tiene limited ese valor de x?


----------



## GoX F4yCk3r DB (Oct 21, 2010)

Eso no lo habia tomado en cuenta, y es que ese es mi problema y ando desorientado, ya busque en varias paginas y no logro hayar nada, alguna sugerencia??


----------



## reyvilla (Oct 21, 2010)

bueno yo tuve el mismo problema con un minutero me daba 65000 minutos y era por que la variable era de tipo word, bueno lo solucione dandole el limite maximo y minimo al minutero, como era de 12 horas, maximo eran 720 minutos y minimo 0, entonces era algo asi:

if porta.x = 1 and minutos = 720 then 
minutos = 0
endif


----------



## GoX F4yCk3r DB (Oct 21, 2010)

Entonces limitare mis variables, en este caso X que representa el numero de pulsos enviados (PWM)
por ejemplo
if x=0 and x<256 then
x=x+20
PWM portb.0,x,5000
return

esto es lo que se me ocurre, no se que tan factible sea
ahora el problema que tengo es que no aumenta, se supone que inicialice la variable en x=0 por lo que el motor no prende al momento de aplicarle voltaje, ahora cuando el usario presione la tecla "X" enviara la señal y se metera a la subrutina , evaluara la variable y mandara un PWM de 20 (asi es como tengo entendido que lo debe dehacer), el problema es que al momento de mandar la señal "X" el motor empieza a girar a su maximo torque


----------



## reyvilla (Oct 21, 2010)

estas diciendo algo asi : que si una pera es verde y si es muy verde pero no tanto como...entonces
la pera es pera 20% mas verde


----------



## GoX F4yCk3r DB (Oct 21, 2010)

asi es en este caso la pera verde es X la cual es mi variable que manda el numero de pulsos que el PWM tendrá, pero si escede los 256 bits que el pwm tiene entonces ya no aumenta, si se cumple esta condicion y partiendo que X=0 entonces has que el motor gire 20% de su torque total 
asi le entendi


----------



## reyvilla (Oct 21, 2010)

pongamoslo asi: el valor maximo de x = 255 y el minimo es x = 0 entonces

si dato = "a" y x = 255 entonces reinicio x y aplico pwm con el valor de x
y 
si dato = "d" y x = 0 entonces llevo al valor maximo a x osea 255 y aplico pwm con el valor de x

luego si ningunas de las condiciones anteriores aplica decimos 

si dato = "A" entonces x = x+20 y aplico pwm con el valor de x
si dato = "b" entonces x = x-20 y aplico pwm con el valor de x

en este orden por que el programa va encontrarlo asi cuando lo este leyendo si colocamos las dos ultimas instrucciones en el comienzo va incrementar x y despues si x es mayor a 255 es que lo va a llevar a cero lo cual no va servir porque ya mando la ejecucion.

tienes de casualidad proteus para simularlo?


----------



## tecnicoelectronico29 (Oct 21, 2010)

lubeck dijo:


> si te ayuda en algo mi consejo es que empieces con aplicaciones que esten bien sencillas y utilices un simulador como proteus como por ejemplo...
> lo de menos es hacerte la aplicación o ayudarte a buscarla pero no creo que te sirva como material didáctico y siempre vas a estar en busca de lo ya echo...
> 
> ahora si ya tienes algo avanzado subelo y con gusto te echo una mano, con simulador es mucho mas facil... que solo con el codigo...
> ...




HOLA lubeck.

ya tengo programadas las 8 secuencias pero no se de que forma hacer cambie de secuencia cada que oprima el pulsador,


este el codigo que hasta el momento llevo.


```
CMCON = 7  'HACE QUE SE TRABAJE CON LAS ENTRADAS EN DIGITAL
PORTB=0     ' PONE LAS SALIDAS EN CERO PARA ARRANCAR
PORTA=0

'SALIDAS
LED1 VAR PORTB.0 'Defino RB0 como LED1
LED2 VAR PORTB.1
LED3 VAR PORTB.2
LED4 VAR PORTB.3
LED5 VAR PORTB.4
LED6 VAR PORTB.5
LED7 VAR PORTB.6
LED8 VAR PORTB.7
'ENTRADAS
PULSADOR VAR PORTA.0

TRISB = 0 ' selecciono los pines de PORTB como salidas
TRISA=1   ' selecciono los pines de PORTA como ENTRADAS

CAMBIOSECUENCIA:
if pulSADOR=1 then GOTO INICIO
GOTO CAMBIOSECUENCIA

        
 

'SECUENCIA 1 (SE PRENDEN Y SE APAGAN UNO POR UNO)
INICIO:  
   
PAUSE 2000
LED1=1 
PAUSE 500
LED1=0
LED2 = 1 
PAUSE 500
LED2=0
LED3 = 1 
PAUSE 500
LED3=0
LED4 = 1 
PAUSE 500
LED4=0
LED5 = 1 
PAUSE 500
LED5=0
LED6 = 1 
PAUSE 500
LED6=0
LED7 = 1 
PAUSE 500
LED7=0
LED8 = 1 
PAUSE 500
LED8=0
PAUSE 2000
GOTO INICIO



SECUENCIA2: '(SE PRENDEN Y SE APAGAN DE DOS EN DOS)

LED1=1 : LED2 = 1 ' PRENDE  LED 1 Y 2

PAUSE 500 ' ESPERA 0,5 SEGUNDOS
LED1= 0
LED2 = 0 ' LED 1 2 SE APAGAN
LED3=1
LED4 =1 
PAUSE 500
LED3=0
LED4 =0
LED5=1
LED6=1
PAUSE 500
LED5=0
LED6=0
LED7=1
LED8=1
PAUSE 500
LED7=0
LED8=0 
GOTO SECUENCIA2 
'SECUENCIA3: (SE PRENDEN Y SE APAGAN DE TRES EN TRES)
PAUSE 2000
LED1=1
LED2=1
LED3=1
PAUSE 500
LED1=0
LED2=0
LED3=0
PAUSE 500
LED4=1
LED5=1
LED6=1
PAUSE 500
LED4=0
LED5=0
LED6=0
PAUSE 500
LED7=1
LED8=1
PAUSE 500
LED7=0
LED8=0
PAUSE 2000
'SECUENCIA 4 (SE PRENDEN Y SE APAGAN DE CUATRO EN CUATRO)
PORTB=%00001111  'METODO ABREVIADO PARA PONER LAS CUATO PRIMERAS SALIDAS A 1
PAUSE 500
PORTB=%11110000
PAUSE 500
PORTB=%00000000
PAUSE 2000
'SECUENCIA 5 (SE PRENDEN Y SE APAGAN DE UNO EN  UNO DEL 8 AL 1)
LED8=1 
PAUSE 500
LED8=0
LED7 = 1 
PAUSE 500
LED7=0
LED6 = 1 
PAUSE 500
LED6=0
LED5 = 1 
PAUSE 500
LED5=0
LED4 = 1 
PAUSE 500
LED4=0
LED3 = 1 
PAUSE 500
LED3=0
LED2 = 1 
PAUSE 500
LED2=0
LED1 = 1 
PAUSE 500
LED1=0
PAUSE 2000
'SECUENCIA 6 (SE PRENDEN Y SE APAGAN DE DOS EN DOS DEL 8 AL 1)
LED8=1 : LED7 = 1 ' PRENDE  LED 1 Y 2
PAUSE 500 ' ESPERA 0,5 SEGUNDOS
LED8= 0 : LED7 = 0 ' LED 1 2 SE APAGAN
LED6=1: LED5 =1 
PAUSE 500
LED6=0
LED5 =0
LED4=1
LED3=1
PAUSE 500
LED4=0
LED3=0
LED2=1
LED1=1
PAUSE 500
LED2=0
LED1=0 
PAUSE 2000
'SECUENCIA 7(SE PRENDEN Y SE APAGAN DE TRES EN TRES DEL 8 AL 1)
LED8=1
LED7=1
LED6=1
PAUSE 500
LED8=0
LED7=0
LED6=0
PAUSE 500
LED5=1
LED4=1
LED3=1
PAUSE 500
LED5=0
LED4=0
LED3=0
PAUSE 500
LED2=1
LED1=1
PAUSE 500
LED2=0
LED1=0
PAUSE 2000

'SECUENCIA 7(SE PRENDEN Y SE APAGAN DE CUATRO EN CUATRO DEL 8 AL 1)
LED8=1
LED7=1
LED6=1
LED5=1
PAUSE 500
LED8=0
LED7=0
LED6=0
LED5=0
PAUSE 500
LED4=1
LED3=1
LED2=1
LED1=1
PAUSE 500
LED4=0
LED3=0
LED2=0
LED1=0
        
 GOTO INICIO' SE REPITE
END 'FIN DEL PROGRAMA
```


----------



## reyvilla (Oct 21, 2010)

hola @tecnicoelectronico29 fijate en el programa que estamos haciendo mas arriba, se trata de modificar la velocidad de un motor a travez del pwm, lo que hace es incrementar una variable y a traves de esa variable cambiar la pwm, en tu caso puede ser igual, para cambiar de una secuencia a otra utiliza una varible x,y,x el nombre que desees cololarque y le colocas la condicion de auto suma cuando sea precionado el boton y segun el valor de esa variable sea la secuencia.


----------



## GoX F4yCk3r DB (Oct 21, 2010)

oie tengo unas dudas en las condiciones
se supone que si X=255 entonces el motor tiene que estar en su torque maximo, pero no entiendo porque reseteas X.
y si X=0 entonces el motor debe permanecer apagado.
lo que no comprendo es pq reinicias X o con que fin.
Si si tengo proteus pero no c como simularlo con la comunicacion serie.


----------



## reyvilla (Oct 21, 2010)

bueno de echo el reset deberia ser un numero mayor tomando en cuenta el 255 seria 256 donde debe reiniciarse.
el porque si a estas alturas no lo comprendes es porque o me explique mas o no prestaste atencion. 
te dije un poco mas arriba que pasa si x es 65000? si tu sumas de 20 en 20 a x va a llegar un momento en el cual va a sobre parar el 255 si no lo reinicias a 0 el continua sumandose de 20 en 20 
y lo contraio si x vale 0 y decrementas si no lo llevas a un valor determinado como maximo pues se la a colocar en la posicion mas alta de la variable en el caso de word creo que algo asi mas o menos 6500000.

edito: el tamaño real de word que consegui va desde 0 a 65535.


----------



## GoX F4yCk3r DB (Oct 21, 2010)

ok entendido y se me fue lo de que X sobrepasaria el valor maximo deseado y seguiria contando entonces

if dato="A" and X>255 then 
 (reinicio la variable X)
 (PWM, portb.0, 255,5000)
endif

if dato="D" and X<0 then
 (pongo a x en 0)
 (PWM,portb.0,0,5000)
endif

si estas condiciones no se cumplen entonces es cuando entra a las subrutinas y empieza a aumentar x o decrementar.
por cierto una pregunta como reinicio una variable???
existe alguna forma de simular la comunicacion en serie??


----------



## reyvilla (Oct 21, 2010)

exacto te corrijo por si acaso:

if dato="A" and X=>256 then 
x = 0
PWM, portb.0, X,5000
goto inicio
endif

if dato="D" and X<0 then
X = 255
PWM,portb.0,X,5000
goto inicio
endif

aqui las secuencias normales que tenias.

por cierto un detalle mas que vi en tu programa el comando 

serin portc.7,T9600,dato

debes colocarlo despues del inicio para que despues de leer el dato y hacer la secuencia al volver al inicio este se mantenga esperando el otro dato de otra manera solo va recibir el primer dato y va obviar los demas.

por otro lado no esta bien el comando no es 
serin portc.7,T9600,dato

seria 

SERIN portc.7,T9600,[" "],DATO 'lo que va entre comilla es el primer dato que va a recibir, es como una señalizacion.
el comando dice que esta esperando el dato entre comillas y apenas lo reciba va a guardar el segundo en dato.


----------



## tecnicoelectronico29 (Oct 21, 2010)

reyvilla dijo:


> hola @tecnicoelectronico29 fijate en el programa que estamos haciendo mas arriba, se trata de modificar la velocidad de un motor a travez del pwm, lo que hace es incrementar una variable y a traves de esa variable cambiar la pwm, en tu caso puede ser igual, para cambiar de una secuencia a otra utiliza una varible x,y,x el nombre que desees cololarque y le colocas la condicion de auto suma cuando sea precionado el boton y segun el valor de esa variable sea la secuencia.




Lo siento pero no me entero aun mucho de este tema .
tengo la lógica pero no se como escribir el código..

yo diria que primero declaro una variable por ejemplo:

cambio VAR BYTE
Pulsador VAR porta.0 

como hago que el pulsador  incremente la variable cambio?

para utilizar esta variable para la condicion de cambio de secuencia.

estas son las lineas que estoy utilizando

inicio:
if pulsador = 1 then aumentar
goto inicio

aumentar:
cambio= cambio+1
if cambio=1 then secuencia1
if cambio=2 then secuencia2       '(por ejemplo)
goto aumentar

secuencia1:
led1=1
pause 200
Led1=0
led2=1
pause 200
led2=0
goto secuencia1
end

y lo mismo con todas las secuencias, por favor colaboremen con este problemilla, 
o si tienen algun programa en picbasicpro que haga esto o simirar porfa , enviarmelo...


----------



## reyvilla (Oct 21, 2010)

te voy a dar la primera linea y de alli te guias igual que como hicimos con el programa anterior.

if ó si se preciona el pulsador o lo que es lo mismo si el pulsador es = 1 entonces ó then
incremento la variable y me voy a la sub-rutina de seleccion.

variable = variable + 1
gosub sub-rutina de seleccion

sub-rutina de seleccion 
si ò if la variable es = 1 entonces o then me voy a la primrera secuencia
gosub secuencia1 ó secuencia_1 no puede separarse las letras osea secuencia 1 no lo toma el pbp.

todos los sub-programas el nombre debe ser pegado si lleva numero entonces lo pegas con _1 y terminan con dos puntos : pegados de la ultima letra si no el programa no los toma.

si ò if la variable es = 2 entonces o then me voy a la segunda secuencia
gosub secuencia2 

y asi sucesivamente...


----------



## GoX F4yCk3r DB (Oct 21, 2010)

A lo ultimo no le entendi reyvilla.
dices que espera el primer dato y en cuanto lo reciba va a guardar el segundo en la variable dato?
osea que yo le mando "A" y lo recibe, una ves que lo recibió, guarda esa "A" en la variable Dato?
o se espera a que le made de nuevo la "A" para guardarla en dato?
y lo de poner el serin despues de inicio  gracias buen aporte, ahora se porque no le hacia caso a los demas datos que enviaba.


----------



## reyvilla (Oct 21, 2010)

a mi me costo mucho tambien entender un poco la cosa con el serin, resulta el que yo use era porque trasmitia un dato de pic a pic, osea utilizando serout y serin, con lo cual enviaba dos datos y solo uno se guardaba en la variable y el otro se utiliza como bandera de lectura. no se si para todos los casos es igual seria cuestion de probrar, si quieres prueba como tu lo tenias a ver que tal y si no entonces si tienes que enviarle dos datos uno detras del otro.

edito: acabo de comprobrar para recibir serial puedes hacerlo sin las dos variables acabo de simular y unicamente coloque la "A" y efectuo la operacion asignada.


----------



## tecnicoelectronico29 (Oct 21, 2010)

reyvilla dijo:


> te voy a dar la primera linea y de alli te guias igual que como hicimos con el programa anterior.
> 
> if ó si se preciona el pulsador o lo que es lo mismo si el pulsador es = 1 entonces ó then
> incremento la variable y me voy a la sub-rutina de seleccion.
> ...





vale,, trataré de armar las líneas,,  ya os contaré,,,,

gracias.


----------



## reyvilla (Oct 21, 2010)

de nada siempre a la orden por aqui estamos. suerte


----------



## tecnicoelectronico29 (Oct 22, 2010)

reyvilla dijo:


> de nada siempre a la orden por aqui estamos. suerte



Hola reyvilla.
he probado con las  lineas de código que me distes pero no me fúnciona.
de hecho el programa no hace nada se queda en cero.

```
CMCON = 7  'HACE QUE SE TRABAJE CON LAS ENTRADAS EN DIGITAL
PORTB=0   
led1 var portb.0
led2 var portb.1
pulsador var porta.0 
contador var byte
trisa=1
trisb=0

inicio:
if pulsador = 1 then contador = contador+1
gosub aumentar 
goto inicio

aumentar:
if contador=1 then gosub secuencia1
if contador=2 then gosub secuencia2 
goto aumentar

secuencia1:
led1=1
pause 200
Led1=0
led2=1
pause 200
led2=0
goto secuencia1

secuencia2:
led2=1
pause 200
Led2=0
led1=1
pause 200
led1=0
goto secuencia2


end
```

en este programe dos secuencias ,supongo que las otras seria igual perro no me funciona.
Por favor hechame un cable...  ayuda. porfa.


----------



## reyvilla (Oct 22, 2010)

prueba con este fijate que le faltaba y por otra lado juega colacandole las otras secuencias me avisas.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 22/10/2010                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628
@ DEVICE INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE WDT_Off ' Watchdog Timer ON
@ DEVICE PWRT_Off ' Power-On Timer
@ DEVICE BOD_Off
@ DEVICE MCLR_OFF ' Master Clear Opción interno
@ DEVICE LVP_OFF ' Bajo voltaje de programación
@ DEVICE CPD_OFF ' Protección del código de memoria OFF
@ DEVICE PROTECT_OFF' protección de código OFF
Define Osc 4
CMCON = 7  'HACE QUE SE TRABAJE CON LAS ENTRADAS EN DIGITAL
PORTB=0   
led1 var portb.0
led2 var portb.1
pulsador var porta.0 
contador var byte
trisa=1
trisb=0
inicio:
if pulsador = 1 then 
contador = contador+1
gosub aumentar 
endif
goto inicio
aumentar:
if contador = 1 then 
gosub secuencia1
endif
if contador = 2 then
gosub secuencia2 
goto aumentar
endif
secuencia1:
led1=1
pause 200
Led1=0
led2=1
pause 200
led2=0
goto aumentar
secuencia2:
led2=1
pause 200
Led2=0
led1=1
pause 200
led1=0
goto aumentar
end


----------



## tecnicoelectronico29 (Oct 22, 2010)

reyvilla dijo:


> prueba con este fijate que le faltaba y por otra lado juega colacandole las otras secuencias me avisas.
> 
> '****************************************************************
> '*  Name    : UNTITLED.BAS                                      *
> ...




HOLA REY
 he probado de todas las maneras  y no me fúnciona,, 
ahora el programa solo me salta a primera secuencia y ya no sale de allí..(envío el circuito en proteus)
les agradezco me ayuden con este problema.


----------



## lubeck (Oct 22, 2010)

tecnico...

explicame que quieres que haga el programa???


----------



## tecnicoelectronico29 (Oct 22, 2010)

lubeck dijo:


> tecnico...
> 
> explicame que quieres que haga el programa???



Hola.. Muy buenas.

Mira este es el objetivo del programa.

el circuito planteado, de ocho (8) LEDs y un (1) botón, 
Desplegar mínimo ocho (8) secuencias controladas en su visualización por el BOTON 
conectado a otro puerto. 

Es decir que cada vez que yo oprima el botón me salte a otra secuencia
Ejemplo: oprimo por primera vez el botón y los 8 leds harán una rutina (prende todos de uno en uno desde el 1 al 8. )  y claro esta rutina se tiene que mantener hasta que yo oprima otra vez el botón (pulsador)   donde pasara a otra secuencia. y así sucesivamente.


----------



## lubeck (Oct 22, 2010)

mira este...

```
@ DEVICE pic16F87
@ DEVICE INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE WDT_Off ' Watchdog Timer ON
@ DEVICE PWRT_Off ' Power-On Timer
@ DEVICE BOD_Off
@ DEVICE MCLR_OFF ' Master Clear Opción interno
@ DEVICE LVP_OFF ' Bajo voltaje de programación
@ DEVICE CPD_OFF ' Protección del código de memoria OFF
@ DEVICE PROTECT_OFF' protección de código OFF
Define Osc 4
CMCON = 7 'HACE QUE SE TRABAJE CON LAS ENTRADAS EN DIGITAL
TrisA=1 
trisB=0

led1 var portb.0
led2 var portb.1
led3 var portb.2
led4 var portb.3
led5 var portb.4
led6 var portb.5
led7 var portb.6
led8 var portb.7

pulsador var porta.0
contador var byte
      
clear
PortB=0

inicio:
if pulsador then
 pause 200
 contador = contador+1
 if contador >=8 then contador =0
endif
select case contador
 case 0 
  led1=1: pause 200
  Led1=0 : pause 200
  LED1=1 : PAUSE 200
  LED1=0
 case 1
  led2=1 : pause 200
  Led2=0 : Pause 200
  LED2=1 : PAUSE 200
  LED2=0 
 case 2
  led3=1 : pause 200
  Led3=0 : Pause 200
  LED3=1 : PAUSE 200
  LED3=0 
 case 3
  led4=1 : pause 200
  Led4=0 : Pause 200
  LED4=1 : PAUSE 200
  LED4=0 
 case 4
  led5=1 : pause 200
  Led5=0 : Pause 200
  LED5=1 : PAUSE 200
  LED5=0 
 case 5
  led6=1 : pause 200
  Led6=0 : Pause 200
  LED6=1 : PAUSE 200
  LED6=0 
 case 6
  led7=1 : pause 200
  Led7=0 : Pause 200
  LED7=1 : PAUSE 200
  LED7=0 
 case 7
  led8=1 : pause 200
  Led8=0 : Pause 200
  LED8=1 : PAUSE 200
  LED8=0 
end select
goto inicio
end
```
por motivos del temporizador (pause) que usas se debe mantener un momento el boton pulsado hasta que haga el cambio de la secuiencia...


----------



## tecnicoelectronico29 (Oct 22, 2010)

lubeck dijo:


> mira este...
> 
> ```
> @ DEVICE pic16F87
> ...




HOLA.
ya estamos cerca del resultado final,,, ahora el problema es el siguiente 

si por ejemplo esta en la rutina 1 o el cas1 y se oprime el pulsador , esta rutina (case1) se tiene que interrumpir y pasar a la rutina 2 (case2)  de tal forma que si por ejemplo yo oprimo el pulsador 5 veces consecutivas se tiene que ir al case5. ( no tendria que esperar que termine cada case para poder cambiar de rutina)

mil gracias por su ayuda.  espero poder contribuir mas adelante cuando me afiance en este lenguaje.


----------



## lubeck (Oct 22, 2010)

jejej.. 
por eso hice la aclaracion.. del pause... ese no es el método adecuado es decir el pause interrumpe la ejecución por el tiempo establecido... y supuse que eso no era lo que necesitabas...

para eso se tiene que hacer un contador que no interrumpa la ejecución... 
existe  la función interrupt pero esa todavía no la domino puesto que es interna...

y procura no usar solo el if, then, goto, gosub 

dejame intentarlo con un contador...

pd... si gustas borra el codigo de la cita de tu  post...


----------



## tecnicoelectronico29 (Oct 22, 2010)

lubeck dijo:


> jejej..
> por eso hice la aclaracion.. del pause... ese no es el método adecuado es decir el pause interrumpe la ejecución por el tiempo establecido... y supuse que eso no era lo que necesitabas...
> 
> para eso se tiene que hacer un contador que no interrumpa la ejecución...
> ...




perfecto...
Pasa que hasta ahora estoy iniciandome en progamación y la verdad esta dicha me faltan muchos fundamentos, para poder saber de que manera escribir el código .
pero bueno ,,, aqui estamos  y espero en poco poder estar puesto por el tema.

a la espera de su aporte.  GRACIAS


----------



## lubeck (Oct 22, 2010)

mmm... mira este codigo...

```
@ DEVICE pic16F87
@ DEVICE INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE WDT_Off ' Watchdog Timer ON
@ DEVICE PWRT_Off ' Power-On Timer
@ DEVICE BOD_Off
@ DEVICE MCLR_OFF ' Master Clear Opción interno
@ DEVICE LVP_OFF ' Bajo voltaje de programación
@ DEVICE CPD_OFF ' Protección del código de memoria OFF
@ DEVICE PROTECT_OFF' protección de código OFF
Define Osc 4
CMCON = 7 'HACE QUE SE TRABAJE CON LAS ENTRADAS EN DIGITAL
TrisA=1 
trisB=0

led1 var portb.0
led2 var portb.1
led3 var portb.2
led4 var portb.3
led5 var portb.4
led6 var portb.5
led7 var portb.6
led8 var portb.7

pulsador var porta.0
contador var byte
Timers   var word
      
clear
PortB=0

inicio:
if pulsador then
 contador = contador+1
 pause 300 ' este es el antirebote... ajusta el tiempo deseado
 portb=0
 if contador >=8 then contador =0
endif
timers=timers+1
pause 1  ' ajusta el tiempo a 1 milisegundo por ciclo...
if timers>=600 then timers=0
select case contador
 case 0 
  if timers>=  0 and timers<=200 then led1=1 
  if timers>=201 and timers<=400 then Led1=0 
  if timers>=401 and timers<=600 then Led1=1
 case 1
  if timers>=  0 and timers<=200 then led2=1 
  if timers>=201 and timers<=400 then Led2=0 
  if timers>=401 and timers<=600 then Led2=1
 case 2
  if timers>=  0 and timers<=200 then led3=1 
  if timers>=201 and timers<=400 then Led3=0 
  if timers>=401 and timers<=600 then Led3=1
 case 3
  if timers>=  0 and timers<=200 then led4=1 
  if timers>=201 and timers<=400 then Led4=0 
  if timers>=401 and timers<=600 then Led4=1
 case 4
  if timers>=  0 and timers<=200 then led5=1 
  if timers>=201 and timers<=400 then Led5=0 
  if timers>=401 and timers<=600 then Led5=1
 case 5
  if timers>=  0 and timers<=200 then led6=1 
  if timers>=201 and timers<=400 then Led6=0 
  if timers>=401 and timers<=600 then Led6=1
 case 6
  if timers>=  0 and timers<=200 then led7=1 
  if timers>=201 and timers<=400 then Led7=0 
  if timers>=401 and timers<=600 then Led7=1
 case 7
  if timers>=  0 and timers<=200 then led8=1 
  if timers>=201 and timers<=400 then Led8=0 
  if timers>=401 and timers<=600 then Led8=1
end select
goto inicio
end
```

no es lo mas adecuado como te menciono lo mejor es usar el *ON INTERRUPT*...
pero he encontrado un ejemplo claro de como se usa!
Algun dia lo encontrare es cuestión de tiempo...


Listo creo que es  una buena ayuda....

*Who is NEXT?*


----------



## tecnicoelectronico29 (Oct 22, 2010)

lubeck dijo:


> mmm... mira este codigo...
> 
> ```
> @ DEVICE pic16F87
> ...




Muchas gracias por tu ayuda.  lo probaré  y luego te cuento.


GRACIAS.


----------



## tecnicoelectronico29 (Oct 23, 2010)

no es lo mas adecuado como te menciono lo mejor es usar el *ON INTERRUPT*...
pero he encontrado un ejemplo claro de como se usa!
Algun dia lo encontrare es cuestión de tiempo...


Listo creo que es  una buena ayuda....

*Who is NEXT?* [/QUOTE]

HOLA .
al final utilicé el método que me pasaste del los *cases *  y bueno de momento esa parte la tengo solucionada,, lo que pasa es que ahora me piden adicionar otro pulsador para hacer cambiar la velocidad de las secuencias .  (un pulsdador para cambio de secuencias y otro para hacerles variar la velocidad a las secuencias)
le agradeceria me hecharan una mano... 

os dejo el código que llevo.
	
	



```
Define Osc 4
CMCON = 7 'HACE QUE SE TRABAJE CON LAS ENTRADAS EN DIGITAL
TrisA=1 
trisB=0

led0 var portb.0
led1 var portb.1
led2 var portb.2
led3 var portb.3
led4 var portb.4
led5 var portb.5
led6 var portb.6
led7 var portb.7

pulsador var porta.0
contador var byte
      
clear
PortB=0

inicio:
if pulsador then
 pause 200
 contador = contador+1
 if contador >=8 then contador =0
endif
select case contador

 case 0 
  PORTB=%00001111
gosub TIEMPO_ON
PORTB=%11110000
GOSUB TIEMPO_Off
 
 case 1
PORTB=%00000000
PORTB=%11001100
gosub TIEMPO_ON
PORTB=%01000100
GOSUB TIEMPO_OFF
 
 case 2
   PORTB=%10101010
 
 case 3
 PORTB=0
  led7=1
gosub tiempo_on
led7=0
led6=1
gosub tiempo_on
led6=0
led5=1
gosub tiempo_on
led5=0
led4=1
gosub tiempo_on
led4=0
led3=1
gosub tiempo_on
led3=0
led2=1
gosub tiempo_on
led2=0
led1=1
gosub tiempo_on
led1=0
led0=1
gosub tiempo_on
led0=0
 
 case 4
  led0=1
gosub tiempo_on
led0=0
led1=1
gosub tiempo_on
led1=0
led2=1
gosub tiempo_on
led2=0
led3=1
gosub tiempo_on
led3=0
led4=1
gosub tiempo_on
led4=0
led5=1
gosub tiempo_on
led5=0
led6=1
gosub tiempo_on
led6=0
led7=1
gosub tiempo_on
led7=0
 
 case 5
  PORTB=%00011000
GOSUB TIEMPO_ON
PORTB=%00100100
GOSUB TIEMPO_OFF
 
 case 6
PORTB=0
  led7=1
gosub tiempo_on
led6=1
gosub tiempo_on
led5=1
gosub tiempo_on
 led4=1
gosub tiempo_on
 led3=1
gosub tiempo_on
led2=1
gosub tiempo_on
led1=1
gosub tiempo_on
led0=1
gosub tiempo_on
portb=%10000000
 
 case 7
  led7=1
gosub tiempo_on
led7=0
led6=1
gosub tiempo_on
led6=0
led5=1
gosub tiempo_on
led5=0
led4=1
gosub tiempo_on
led4=0
led3=1
gosub tiempo_on
led3=0
led2=1
gosub tiempo_on
led2=0
led1=1
gosub tiempo_on
led1=0
led0=1
gosub tiempo_on
led0=0
led0=1
gosub tiempo_on
led0=0
led1=1
gosub tiempo_on
led1=0
led2=1
gosub tiempo_on
led2=0
led3=1
gosub tiempo_on    
led3=0
led4=1
gosub tiempo_on
led4=0
led5=1
gosub tiempo_on
led5=0
led6=1
gosub tiempo_on
led6=0
led7=1
gosub tiempo_on
led7=0
end select
goto inicio

tiempo_on:
PAUSE 180
RETURN
'CON TIEMPO_OFF MANEJO EL TIEMPO QUE DURAN LOS LED APAGADOS 

tiempo_off:
PAUSE 180
RETURN
end
```


----------



## lubeck (Oct 23, 2010)

> lo que pasa es que ahora me piden



No creas que soy mala leche amigo, yo intento ayudar para que aprendan, por mi parte dijiste las palabras mágicas, y lo único que te puedo decir es que enserio te deseo suerte con el pedido, yo en este foro no hago pedidos!!!

saludos!


----------



## tecnicoelectronico29 (Oct 23, 2010)

lubeck dijo:


> No creas que soy mala leche amigo, yo intento ayudar para que aprendan, por mi parte dijiste las palabras mágicas, y lo único que te puedo decir es que enserio te deseo suerte con el pedido, yo en este foro no hago pedidos!!!
> 
> saludos!



Vale de igual forma muchas gracias me ha sido de mucha utilidad tu colaboración,  y lo de la palabra *pedido*, es un forma de expresión, en ningún caso os quiero comprometer, tengo claro que es un foro para departir sobre el tema, mas no para resolver los problemas para quienes lo quieren todo hecho.  Os juro que no es mi caso. 
Solo que quería darle continuidad al proceso que llevo desarrollando con el ejercicio planteado. ya que como comentaba aún no tengo los conocimientos necesarios para darle la solución.

UN SALUDO.


----------



## lanpu (Oct 23, 2010)

hola!, quisiera saber si me pueden ayudar;

Quiero aprender a utilizar comunicación infrarroja, entre pics, o entre algun contro remoto 'x' y un pic para controlar una carga cualquiera.

Por lo que he leído puedo usar los comandos COUNT en el receptor y PULSOUT en el emisor, si es que utilizo 2 pics.

Voy bien??

Gracias!


----------



## lubeck (Oct 23, 2010)

> Voy bien??


si... dale por ahi!!!
Caliente ... caliente!!!


----------



## lanpu (Oct 23, 2010)

esto es un bosquejo de lo que tendría que hacer para el receptor?

tengo un poco de dudas si con el 'IF', y con los 300 ms del 'COUNT', ese tiempo es que luego debo tener en cuenta para hacer el transmisor?

es decir, en esos 300 ms tengo que hacer que entren los 3 pulsos para que W1=3??


saludos!


```
@ DEVICE pic12F675, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, bod_off, protect_off


adcon0=0     '  desactiva el ADC
ansel=0 '  digital
cmcon=7'comparador apagado
trisio=0
VRCON=0
INCLUDE "modedefs.bas" 
define OSCCAL_1K 1

entrada var gpio.2
verde var gpio.4
azul  var gpio.5
rojo  var gpio.1
W1 var byte

contar: 
low rojo;
low verde;
low azul;
COUNT entrada, 300, W1

If W1=1 then gosub rutina 1;
if W1=2 then gosub rutina 2;
if w1=3 then gosub rutina 3 ;
else gosub contar ;
endif             ;

rutina 1:
high verde;
return;

rutina 2:
high azul;
return;

rutina 3:
high rojo;
return;
end
```


----------



## fernandoae (Oct 23, 2010)

Como se usaria el comando serin para evitar que quede a la espera y poder seguir por ejemplo sacando una señal pwm sin que se corte? (sin pwm por hard)


----------



## lubeck (Oct 23, 2010)

Intenta asi fernando...

```
Inicio:

'Aqui  codigo

serin portb.0,2,1,inicio,B0 ' solo va a esperar 1 milisegundo si no recibe nada se va a inicio...
goto inicio
end
```


----------



## willyfv (Oct 24, 2010)

Hola lbech el codigo serin como lo estas configurando me ha ayudado  mucho en adelantar mi proyecto pero como podria hacer los siguiente:

cuando reciba lo escrito en la pc y lo envie por rs232 el pic lo recosca  y me realice una secuencia de efectos con led osea si envio la palabra  "Foros" el micro lo recibe y realice el encedido y apagado
correspondiente a esas letras y se mantega el efecto hasta que envie otra palabra
el pic va a tener 26 leds conectados que corresponde a cada letra del abcedario.
por los momentos solo tengo esto y cuando envio la letra "A" funciona  bien pero cuando envio por ejemplo "Carro" solo me recibe la "ca" y  comienza la secuencia mas no recibe el dato compleato
pd: por lo momentos estoy usando dos led "A yB" y una pantalla para visualizar los datos que estoy recibiendo.
inicio:
SerIn PORTC.7, T2400,1,LETRAS, b1 
J:If (b1 < "a") or (b1 > "z") Then LCDOUT, B1:GOTO LETRAS 
B1 = B1 - $20
GOTO INICIO

LETRAS:
 If b1 = "A" THEN 
HIGH PORTB.0
PAUSE 250
LOW PORTB.0
PAUSE 250
ENDIF
GOTO INICIO
End

Gracias de antemano...


----------



## lanpu (Oct 24, 2010)

Por favor, alguien me puede ayudar con una comunicacion serial entre 2 PIC12f675, intente con estos codigos, pero no me corren en proteus y ya no se que más cambiar :


emisor


```
@ DEVICE pic12F675, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, bod_off, protect_off
INCLUDE "modedefs.bas"
define OSC 4 
define OSCCAL_1K 1

botonA var gpio.1
botonB var gpio.2
botonC var gpio.4

transmitir:
if botonA=0 then envio1
if botonB=0 then envio2
if botonC=0 then envio3
goto transmitir

envio1:
serout gpio.5,N2400,["A"]
pause 500
goto transmitir

envio2:
serout gpio.5,N2400,["B"]
pause 500
goto transmitir

envio3:
serout gpio.5,N2400,["C"]
pause 500
goto transmitir

end
```

receptor

```
@ DEVICE pic12F675,intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, bod_off, protect_off
INCLUDE "modedefs.bas"

define OSCCAL_1K 1


ledr var gpio.1
leda var gpio.2
ledv var gpio.4
datos var byte

high ledr
pause 500
low ledr

recibir:

serin gpio.0,N2400,1,recibir,datos
if datos="A" then high ledr
pause 1000
if datos="B" then high leda
pause 1000
if datos="C" then high ledv
pause 1000

low ledr:low leda:low ledv
goto recibir
end
```


Muchas gracias a quien se dé el tiempo, adjunto la simulación.


----------



## lubeck (Oct 24, 2010)

> cuando reciba lo escrito en la pc y lo envie por rs232 el pic lo recosca


WILLY...
cuando no se usa la espera de la comunicacion serial, se complica un poco la transmision, es decir tienes que utilizan un algoritmo o método para que el receptor identifique que va haber una trasnmicion... es decir si es por el puerto serie se utiliza la peticion de envio... creo que es el DTX no recuerdo...


----------



## reyvilla (Oct 24, 2010)

hola @lanpu tu leistes las 3 ultimas paginas, alli yo coloque un sistema de comunicacion entre 2 16f628A funcionando.


----------



## lanpu (Oct 24, 2010)

Hola reyvilla, si estuve leyendo tus post y de lubeck, de hecho probe tus simulaciones en proteus y trate de modificar el mandoCF.pbp, pero me perdí en el intento. 

Luego me basé en un código que aparece en un libro para un 16f628a, y  lo modifique para los 12f675, compila bien pero en la simulación no corre.

Me podrías ayudar un poco con tu código, lo que pasa es que estoy recién empezando y colapso un poco con lo del teclado. 

(no hay problema en que utilice el Oscilador interno cierto?? )
Gracias!


----------



## reyvilla (Oct 24, 2010)

hola lanpu, disculpa la demora he estado algo ocupado, coloca el codigo del programa con los cambios que hicistes he indica donde fue que te perdiste a ver si te ayudo un poco.

y no noy hay problema con el oscilador interno, de echo yo lo monte con ese mismo codigo en el protoboard con los 2 16f628A y el oscilador interno y funciono bien.


----------



## lanpu (Oct 24, 2010)

Hola, reyvilla, estaba leyendo otra vez tu codigo, y trate de sacarle lo que supongo esta demás para mi,y anotaba al costado lo que supongo hace cada sección.

Yo solo necesito 3 o 4 pulsadores. ( si me ayudas, no se como poner la imagen para que se vea, la adjunté)

Dejé una parte de tu código como guia y ahora quiero ver como construyo sobre él.


```
@ device pic12f675,intrc_osc,wdt_off,pwrt_off,mclr_off,protect_off 

INCLUDE "modedefs.bas"  
define OSCCAL_1K 1
Define Osc 4
CMCON = 7
ansel=0
vrcon=0
adcon0=0

TRISIO = %00001001 
gpio   = %00000000

ACEPTADO  VAR GPIO.1
LEYENDO   VAR GPIO.2 '
IN        VAR GPIO.0  '
ESPERANDO VAR GPIO.5 
led var GPIO.4
SERIAL    VAR WORD
DATAID    VAR WORD   '


CLEAR
 
' LEYENDO = 0    'en esta parte lee el dato almacenado en la eeprom
' ACEPTADO = 0
' READ 5,serial 
' GPIO.4 = 1       '¿por que haces    esto????
 'SEROUT GPIO.4,T9600,[" CODIGO ACTUAL ",SERIAL,10]   'inicio
 
 
 INICIO:
 LEYENDO = 0         ' aqui espera hasta que llegue algo a gpio.o
 ACEPTADO = 0
 ESPERANDO = 1
 IF IN = 1 THEN
 ESPERANDO = 0
 GOTO LEE
 ENDIF
 
 IF IN = 0 THEN
 GOTO INICIO 
 ENDIF 
 
 GOTO INICIO
 
  
 LEE:                              'una vez que algo llego a gpio.0, lo graba en dataid, anteponiendo '-'
 LEYENDO = 1
 
 SERIN IN,T9600,[" - "],DATAID 'Y ES LA BANDERA, SI Y NO LLEGA SE QUEDA ESPERANDO

 high led 
 pause 500
 low led
 'SEROUT GPIO.4,T9600,[" CODIGO LEIDO ",DATAID,10]    'saca lo leido por gpio.4
 LEYENDO = 0
 if dataid="1" then high led  ' por ejemplo que encienda un led cuando dataid= 'algo'
  low led
 goto inicio
 end
```

Saludos.


----------



## reyvilla (Oct 24, 2010)

fijate algo "triosio" es para definir cual va ser entrada y cual va hacer salida si esto no esta bien definico pues ni modo cuando presiones el boton este va quedar siempre en 0 o en 1. ahora estuve analizando un poco tu circuito con el programa proteus y un programa de prueba y el 12f675 tiene una serie de comparadores y A/D. que no se si necesites, pero el codigo que hice lo probe con el 12f629 y el 12f675 y me fue mejor con el 12f629 ya que el 12f675 tiende a no sensar, no se si se debe a los a/d o los comparadores, aun no lo descubro estoy leyendo el datahseet a ver si aparece algo. si te sirve con el 12f675 me avisas. y si no tambien saludosss.

edito: ya vi la razon por el cual no sensa colocale debajo del cmcon = 7 el  ANSEL=0 y listo.


----------



## lanpu (Oct 24, 2010)

reyvilla dijo:


> edito: ya vi la razon por el cual no sensa colocale debajo del cmcon = 7 el  ANSEL=0 y listo.




Pero si tiene el ansel = 0, a ti te funciono entonces?


----------



## reyvilla (Oct 24, 2010)

si me funciono le hice unos pequeños cambios rapidos para hacerlo mas facil, revisa y adaptalo a lo que requieras...saludossss


----------



## lanpu (Oct 24, 2010)

Ufff. OK!! Muchas Gracias por tu ayuda reyvilla .

En cuanto lo pruebe en el protoboard te cuento como anduvo.

Saludos y muchas gracias!


----------



## marcelo2112 (Oct 25, 2010)

;382753 dijo:
			
		

> mira este...
> 
> ```
> @ DEVICE pic16F87
> ...


 
lubeck yo tambien estoy tratando de hacer algo similar, pero a mi me salta de rutina a rutina sin oprimir nada. 
Este es el codigo.

CMCON  = %00001111 
TRISA = %11111111  'todos los pines como entradas 
TRISB = %00000000  'todos los pines como salidas
portb = %00000000
pulsador var porta.0
contador var byte
 clear

inicio:
if pulsador then : pause 300 
 contador = contador+1
 if contador >=5 then contador =0
select case contador
 case 0 


        PORTB = %00000001  
         pauseUS 1500
         PORTB = %00000000  
         pauseUS 1500
 case 1


            PORTB = %00000010
            pause 1500
             PORTB = %00000000
            pause 1500

case 2



            PORTB = %00000100
              pause 1500
            PORTB = %00000000
              pause 1500
case 3


        PORTB = %00001000  ; 
        pause 1500
        portb = %00000000
        pause 1500   


end select
goto inicio
end

La instruccion ENDIF me tira error al compilar, por eso la borre, sera ese el problema?Gracias.


----------



## lubeck (Oct 25, 2010)

prueba asi, no lo revise, pero creo que es esto...

```
CMCON = %00001111 
TRISA = %11111111 'todos los pines como entradas 
TRISB = %00000000 'todos los pines como salidas
portb = %00000000
pulsador var porta.0
contador var byte
clear

inicio:
[B]if pulsador then
 pause 300 
 contador = contador+1
endif[/B]
if contador >=5 then contador =0
select case contador
case 0 


PORTB = %00000001 
pauseUS 1500
PORTB = %00000000 
pauseUS 1500
case 1


PORTB = %00000010
pause 1500
PORTB = %00000000
pause 1500

case 2



PORTB = %00000100
pause 1500
PORTB = %00000000
pause 1500
case 3


PORTB = %00001000  
pause 1500
portb = %00000000
pause 1500 


end select
goto inicio
end
```


----------



## marcelo2112 (Oct 25, 2010)

CMCON = %00001111 
TRISA = %11111111 'todos los pines como entradas 
TRISB = %00000000 'todos los pines como salidas
portb = %00000000
pulsador var porta.0
boton var porta.6 'puerto del boton
contador var byte
star var bit
High star
 pause 500

inicio:
stope:
 portb = %00000000
 if boton then toggle starause 300
 if star then goto stope

if pulsador then  
    pause 300 
 contador = contador+1
endif
if contador >=3 then contador =0
select case contador

case 0 

case 1

case 3

end select
goto inicio
END

Ahora funcina, agregue un boton de start/stop que funciona bien, pero no me incrementa la variable contador cuando esta en stop, lo puedo acomodar facilmente?si no lo dejo asi. Muchas gracias por tu ayuda.


----------



## lubeck (Oct 25, 2010)

intenta asi...


```
CMCON = %00001111 
TRISA = %11111111 'todos los pines como entradas 
TRISB = %00000000 'todos los pines como salidas
portb = %00000000
pulsador var porta.0
boton var porta.6 'puerto del boton
contador var byte
star var bit
High star
pause 500

inicio:
stope:
portb = %00000000
if boton then toggle star:pause 300

if pulsador then 
pause 300 
contador = contador+1
endif
if contador >=3 then contador =0
[B]if star then goto stope[/B]

select case contador
case 0 
case 1
case 3
end select
goto inicio
END
```


----------



## lanpu (Oct 25, 2010)

Otra vez yo, ya programe los dos 12f675 con comunicación serial (básica) y arme los circuitos en el protoboard, funcionó todo bien.

Me gustaría si aclarar unas dudas del codigo si es posible:


 SEROUT GPIO.4,N2400,["-","A",10]
GPIO.4 = 0

.... leía en el manual pbp y dice que el '10' corresponde a un  'linefeed'...¿qué significa? ¿que diferencia tiene un linefeed de 10  ó  100?

si estableciera T2400, debería entonces poner luego GPIO.4=1 ???

Saludos!


----------



## marcelo2112 (Oct 25, 2010)

Gracias Lubeck, parece que funciona.

Ahora para migrar a un 16f886, porque quiero agregarle un lcd para ver en que secuencia esta, que tengo que cambiar?Porque  hice una prueba pero no cambia el "case". El start/stop si funciona.
El lcd la conecto al puerto c y funciona:

Define LCD_DREG   PORTc  '*bit de datos del LCD 
Define lCD_DBIT   0      '*por B.0 ,B.1, B.2 y B.3
Define LCD_RSREG   PORTc  '*bit de registro del LCD conectar
Define LCD_RSBIT   5      '*en el puerto B.5
Define LCD_EREG   PORTc  '*bit de Enable conectar en el
Define LCD_EBIT   4      '*puerto B.4   

Gracias.


----------



## lubeck (Oct 25, 2010)

> .... leía en el manual pbp y dice que el '10' corresponde a un 'linefeed'...¿qué significa? ¿que diferencia tiene un linefeed de 10 ó 100?



la diferencia es que al linefeed le corresponde ese codigo ascii (el 10), esos codigos se manejan desde los inicios de la computación, y son internacionales, el codigo ascii del 100 puede ser la "A" o la "B", busca en el google dicha tabla ascii,  ahora porque el linefeed(ascii 10)???... porque ese se les ocurrio poner cuando diseñaron el compilador bien pudieron poner cualquiera de los 255 ascii...



> si estableciera T2400, debería entonces poner luego GPIO.4=1 ???


mira esta tabla de  como hicieron el serin....
la diferencia entre el T2400 y el N2400 es la polaridad, es decir, con el T2400 va a mandar estados altos y con el N2400 estados bajos a una velocidad de 2400 baudios...
ahora esto esta mal... 


```
SEROUT GPIO.4,N2400,["-","A",10]
GPIO.4 = 0
```

si quieres invertir la polaridad deberia ser asi...

```
T2400=0
T1200=1
T600=2
T300=3
N2400=4
N1200=5
N600=6
N300=7
' y seleccionan la variable que quieras y la pones en el serout
SEROUT GPIO.4,N2400,["-","A",10]
'o se puede poner asi...
SEROUT GPIO.4,4,["-","A",10]

GPIO.4 =0  ' GPIO.4 nada tiene que ver con eso de la velocidad
```


----------



## lanpu (Oct 25, 2010)

Hola lubeck, gracias por responder



lubeck dijo:


> mira esta tabla de  como hicieron el serin....
> la diferencia entre el T2400 y el N2400 es la polaridad, es decir, con el T2400 va a mandar estados altos y con el N2400 estados bajos a una velocidad de 2400 baudios...
> ahora esto esta mal...
> 
> ...



Sí, entiendo lo del cambio de polaridad con el 'N' y 'T', sólo quería aclarar la línea 'GPIO.4 =0 ' en el código que me facilitó 'reyvilla', yo pensaba que era algo asi como asegurarse de que el pin 4 deje de transmitir.

Ahora, paralelamente, he intentado establecer la misma conexión serial entre estos PIC (que funciona en cable), pero esta vez con LEDs infrarrojos, pero al parecer los pulsos que salen del pin emisor, si bien hace que el led parpadeé (lo veo con una camara), al parecer son demasiado rapidos y el receptor no los alcanza a 'seguir'....alguién tiene experiencia en esto?...debo: 

                       'alargar' los mensajes?.... 
                       cambiar de emisor - receptor. (IR LED)
                       modificar el codigo?


Saludos y gracias.


----------



## reyvilla (Oct 25, 2010)

hola de nuevo lanpu me uno, a tu aclaratoria estube leyendo por alli, analizando, investigando y despues de tantas vueltas para poder enviar una señal serial por infrarojo necesitas modularla y otra cosa que lei por alli es que no puede ser mayor a 2400 ya que la señal se desvanece despues de alli. eso como para tomarlo en consideracion a la hora de desidirce hacerlo por infrarojo yo opte por RF mas rapido y te ahorras muchas lineas de codigo de programa. si consigues hacerlo buenisimo compartelo...saludoss


----------



## lanpu (Oct 25, 2010)

Que tal reyvilla, tu intentaste hacerlo con led infrarrojo y fotodiodo 'normal'?...o con esos receptores que usan los televisores. equipos de musica..etc

Como para ver por donde irme...

Lo otro sería contar directamente con un control remoto 'x' como emisor y construir solo un receptor con el pic.


----------



## lubeck (Oct 25, 2010)

> modificar el codigo?



mmm.... yo te recomendaria que lo hiceras por frecuencias o tonos o DMTF, por lo que comentas si es muy
rapido el serial.... yo no lo he intentado por ninguna de las formas, es decir si he usado el DMTF pero no por infrarrojos hasta donde se todos los mandos(Controles Infrarojos) utilizan ese metodo..
por algo sera!


----------



## reyvilla (Oct 25, 2010)

yo use un receptor TSOP1137, TSOP2236 creo que es de tv lo compre, y otra cosa tienes que saber a que corriente vas a poner a trabajar el emisor? eso con el datasheet para que los datos sean leibles.
si es con un control remoto de tv como emisor tienes que decodificar las señales primero.


----------



## lanpu (Oct 25, 2010)

mmmm..aqui encontre como capturar la señal de un control remoto infrarrojo..

http://www.instructables.com/id/IR-...ture-and-Visualization/step3/Microcontroller/


----------



## reyvilla (Oct 25, 2010)

hola esta factible el proyecto con esto lograrias el receptor por puerto serial del pc y abria que ver si se pueden utilizar los codigos resibidos para programar un pic en funcion a esos codigos. si puedes baja todo lo que puedas de alli por lo que veo tienes que estar registrado.

Edito: entre todo lo que busque encontre bastante revisa los siguientes link y me avisas.

http://libertadelectronica.wordpres...dificando-el-infrarrojo-capturando-la-accion/

http://www.rentron.com/

y hay mas luego los coloco.


----------



## lanpu (Oct 25, 2010)

Lo más parecido a lo que busco, de hecho usa un  pic12f, lo malo, para mí es que esta en .asm y yo no me manejo.

Si es que alguien sabe y puede ayudar a pasarlo a pic basic, se lo agradecería.

Saludos!!


----------



## reyvilla (Oct 25, 2010)

lanpu no es por desmotivarte pero en este foro ni en ninguno creo que vayas a lograr hacerlo desifrando ese programa, ya que de por si es fastidioso leerlo, enterderlo y analizarlo daria dolor de cabeza por lo menos a mi, a parte de que si entiendes el funcionamiento del sistema es mucho mas factible que tu generes un codigo propio con ayuda de todos que a esperar que alguien se ponga a desifrar y traducir de asm a pbp, te recomiendo leas un poco de como son las trasmiciones del los codigos rc5 que es un protocolo y despues de que lo comprendas y veas de que se trata entonces empiezas a ver como generar un codigo para ese protocolo...saludosss

edito: te recomiendo empieces por aqui:

https://www.forosdeelectronica.com/f24/protocolo-rc5-pic-ahora-funciona-10966/


----------



## lanpu (Oct 27, 2010)

Hola a todos, gracias reyvilla por el material, he recopilado bastante, ahora a hacerse el tiempo y a leer nomas.

Si alguien tiene un tiempito me ayuda un poco con este trocito de  código, quiero contar el tiempo que el pulsador esta presionado, y si es  mas de 5 seg que se encienda un led.

________ EDIT: tenía un error en la configuración del OSC en proteus____(gracias igual)

Es la simplicación de un proyecto más grande, que consiste en contar el tiempo que ciertos sensores infrarrojos estan tapados.




```
@ DEVICE pic16F628A
@ DEVICE INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE WDT_Off ' Watchdog Timer ON
@ DEVICE PWRT_Off ' Power-On Timer
@ DEVICE BOD_Off
@ DEVICE MCLR_OFF ' Master Clear Opción interno
@ DEVICE LVP_OFF ' Bajo voltaje de programación
@ DEVICE CPD_OFF ' Protección del código de memoria OFF
@ DEVICE PROTECT_OFF' protección de código OFF

Define Osc 4


Cnt VAR Word ' Cnt is a word variable
LED VAR PORTB.0
led2 var PORTB.2
IN VAR PORTB.1
PORTB=0
TRISB=%00000010
CMCON = 7

Cnt = 0

AGAIN:
IF Cnt>5 then led2=1
LED=1
IF IN =1 THEN CUENTA 
GOTO AGAIN

CUENTA:
LED=0
pause 1000
Cnt = Cnt +1 
IF IN=0 THEN AGAIN
GOTO CUENTA
END
```
Saludos y Gracias!


----------



## viggiani1975 (Oct 28, 2010)

Saludos nuevamente,

Disculpen si les interrumpo el hilo que vienen siguiendo pero tengo una inquietud que solo en este espacio sé que podré disipar, aquí siempre ayudan sin condicionamientos. Mi pregunta consiste en cómo invocar el estado de espera de un micro, será que se puede hacer por código? no estoy seguro pero creo haber visto algo aunque creo era en assembler y prefiero el basic mil veces.

Gracias Mil.


----------



## reyvilla (Oct 28, 2010)

@viggiani1975: con sleep, si te refieres al estado de bajo consumo...saludossss


----------



## viggiani1975 (Oct 28, 2010)

Si, exacto.  Es que me gustaría que después de un determinado tiempo sin actividad de sensor, pulsador, swiche, etc, el micro pase a un mensaje específico en un lcd hasta que halla actividad.


----------



## reyvilla (Oct 28, 2010)

@ DEVICE pic16F628A
@ DEVICE INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE WDT_Off ' Watchdog Timer ON
@ DEVICE PWRT_Off ' Power-On Timer
@ DEVICE BOD_Off
@ DEVICE MCLR_OFF ' Master Clear Opción interno
@ DEVICE LVP_OFF ' Bajo voltaje de programación
@ DEVICE CPD_OFF ' Protección del código de memoria OFF
@ DEVICE PROTECT_OFF' protección de código OFF

Define Osc 4


Cnt VAR Word ' Cnt is a word variable
LED VAR PORTB.0
led2 var PORTB.2
IN VAR PORTB.1
PORTB=0
TRISB=%00000010
CMCON = 7

Cnt = 0

AGAIN:
IF Cnt>5 then led2=1
LED=1
IF IN =1 THEN CUENTA 'aqui no seria mejor ponerlo a contar de una vez?
GOTO AGAIN

EJEMPLO :
IF IN = 1 THEN
LED = 0
Cnt= Cnt + 1
PAUSE 1000                                               
CALL AGAIN   'Verifica que no sea mayor a 5. que como hay una pause de               
                   '1000 aproximadamente serian 5 segundos y algo mas
GOTO EJEMPLO ' si no es mayor a 5 se queda contando.
GOTO AGAIN


y luego seria cuando es 
IN = 0 THEN 
GOTO AGAIN
END IF

ok, aqui te coloco el manual de pbp en español, con control F busca lo que necesites, es tu caso el comando sleep, y alli te aparece como usarlo y el tiempo maximo...saludos


----------



## viggiani1975 (Oct 28, 2010)

Listo reyvilla, gracias por la info, voy a checarla a ver como es el asunto.


----------



## lanpu (Oct 28, 2010)

reyvilla dijo:


> Cnt= Cnt + 1
> PAUSE 1000
> CALL AGAIN   'Verifica que no sea mayor a 5. que como hay una pause de
> '1000 aproximadamente serian 5 segundos y algo mas....



En verdad contando segundos de esta forma se pierde exactitud, por lo que sería mejor incorporar el conómetro que puso mecatrodatos en las primeras páginas de este hilo, https://www.forosdeelectronica.com/f24/curso-programacion-pic-bsic-pro-20658/index2.html,
modificando un poco ese código :

EDIT: Actualicé las modificaciones al código


```
; CONFIGURACION PARA LA PROGRAMACION DEL PIC   
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

' Define registros y bits del LCD

Define    LCD_DREG    PORTB
Define    LCD_DBIT    0
Define    LCD_RSREG    PORTB
Define    LCD_RSBIT    4
Define    LCD_EREG    PORTB
Define    LCD_EBIT    5

;variables de pines conctados al pic 16f84A

Symbol START_button = PORTA.0           
Symbol CLEAR_button = PORTA.2           
Symbol STOP_button = PORTA.1             
Symbol LED = PORTA.3 
SYMBOL SEN1 = PORTB.6 'PUERTO SENSOR1
SYMBOL LED2= PORTA.4'LED CUENTA

;variables de almacenamiento  de datos
Q VAR BIT
CNT VAR WORD           
Ticks VAR byte                           
Minute VAR byte                         
Second VAR byte                       
Disp VAR byte                         
TRISA = %00001111;15 ; PORTA 0,1,2,3,4 son entradas
TRISB = %01000000 ; portb es salida
LED2=0;
PAUSE 500 ;0.5 seg para inicializar lcd

;limpieza de variables creadas
CNT=0;
Minute = 0 
Second = 0 
Ticks = 0 
Disp = 1 ; mustra en el LCD 00:00 al iniciar

OPTION_REG = $05               ;  prescaler = 64
ON INTERRUPT GOTO ISR          ; ir a rutina ISR 
LCDOUT $FE, 1        


LOOP:

IF CLEAR_button = 0 THEN

Minute = 0
Second = 0
Ticks = 0
led= 0
Disp = 1
goto loop
ENDIF

IF START_button = 0 THEN
Q=1
high led
TMR0 = 0 ;inicializa registro TRMO
INTCON = $A0 ; habilita tiempo de interuupcion
Disp = 1 ; habilita LCD
ENDIF


IF STOP_button = 0 THEN
Q=0
low led
INTCON = 0 ; desabilita tiempo de interrupcion
Disp = 1 
ENDIF


IF Disp = 1 THEN
LCDOUT $FE, 2
LCDOUT DEC2 Minute, ":",DEC2 Second
Disp = 0
ENDIF
GOTO LOOP            



DISABLE
ISR:
Ticks = Ticks + 1
IF Ticks < 61 THEN NoUpdate
Ticks = 0
Second = Second + 1
IF Second = 60 THEN
Second = 0
Minute = Minute + 1
IF Minute = 5 THEN
Minute = 0
led=0
ENDIF
ENDIF
Disp = 1

NoUpdate:
INTCON.2 = 0 ;rehabilitainterrupciones del TRMO
Resume
ENABLE ; 
END 


END ; Fin del programa
```

la idea es dejar los botones de control para comnzar/detenerse a contar y para el 'clear' general, agregar los sensores como switch que  activa/desactivan el conteo segun sean bloqueados/desbloqueados los sensores.

finalmente, se agregaría un boton 'fin', que debería mostrar en el lcd, la cantidad total de veces que los sensores fueron bloqueados en el tiempo determinado (5 min)

Mi duda es, en que parte del código agrego ESTE CONTADOR que representa a 1 sensor para que no interrumpa al cronómetro:

```
'RUTINA QUE CUENTA
INICIO:
IF SEN1=0 and Q=1 THEN DESB
GOTO INICIO
END

DESB:
IF SEN1=1 THEN CUENTA
GOTO DESB
END

CUENTA:
CNT=CNT+1;
IF CNT=0 THEN LED2=1
GOTO INICIO 
END
```





Saludos!  (Gracias por su tiempo y ayuda, han sido grandes impulsores de mi apredizaje. )


----------



## el pipo (Oct 29, 2010)

hola que tal amigos, esta fantastico todo este tutorial de pbp, quisiera saber si no tiene un ejemplo de el uso del puerto usb en este lenguaje, lo que pasa es que e buscado en internet pero no encuentro respuesta a mi duda.


----------



## lubeck (Oct 29, 2010)

No me acuerdo si ya se vio en este tema...
pero consigue el HID Wizzard y el MPASM y el microcode eso te genera gran parte del codigo
en java Vbasic y otro no recuerdo para el pc y obvio el archivo de pbp

(valido solo en pic18f2550 18f4550 y no recuerdo cual mas... otros dos creo)


----------



## viggiani1975 (Oct 30, 2010)

Saludos a todos,

Nuevamente acudo a ustedes a pedir orientación, he tenido dificultad para regrabar un dato en memoria eeprom y pues, la verdad, no he sabido dónde estoy errando, aunque parece funcionar en la simulación, al quemarlo y probar el lcd queda en negro. La idea que tengo es la de capturar un valor de un sensor, sea de temperatura u otro, para referencia y cada tanto tiempo actulizarlo nuevamente. Publico un código básico y les doy mis mas sinceros agradecimientos por cualquier aclaración que puedan hacer.
	
	



```
CmCon=7  
 TrisB=0 
 EEPROM 0,[5]
 
DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1    'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3



     CONT VAR BYTE
     EPROM VAR BYTE[1] 
     SENSOR1 VAR BYTE[1]
     
    Pause 200        
   
    for cont=0 to 1
    READ cont,EPROM[cont]
    next cont     
 	Lcdout $fe, 1 
    Lcdout "VOLTAJE REF. ",#EPROM[0]
    PAUSE 500

    MIDIENDO_VOLTAJE:
    
    SENSOR1[0]=1

    GRABANDO:      
    for cont=0 to 1
    WRITE cont,SENSOR1[cont]
    next cont 
  
   for cont=0 to 1
    READ cont,EPROM[cont]
    next cont     

    Lcdout $fe, 1 
    Lcdout " NUEVA REF.",#EPROM[0]
    PAUSE 500              
    End
```


----------



## lubeck (Oct 30, 2010)

La estas errando en que piensas en decimal, piensa en hexadecimal!!!....
mira esto...
https://www.forosdeelectronica.com/posts/378995/


----------



## viggiani1975 (Oct 30, 2010)

Hola Lubeck,
Estoy probando y me tira bad data type, como debo definir las variables para los nibbles?


----------



## lubeck (Oct 30, 2010)

mmm define la variable passd como word

*PASSD VAR WORD*

no se que sea un nibble


----------



## viggiani1975 (Oct 30, 2010)

pensaba que esto necesitaba algun tipo de definición, ahora entiendo que no es así.
passd.highbyte
passd.lowbyte

Ok, correcto, ahora veo que aunque envío pass a pantalla  no me la muestra, se queda en una tira negra y lo único que agregué fue:
Lcdout $fe, 1
Lcdout $fe, 2,#passd
pause 3000

Como siempre, muchas gracias amigo.


----------



## lubeck (Oct 30, 2010)

me parece que debes poner ...
*Lcdout $fe, 2,dec passd*

sube todo amigo, da flojera estudiarlo asi...


----------



## viggiani1975 (Oct 30, 2010)

Ja,Ja,Ja... es cierto que sí...

pero es que estoy probando el mismo ejercicio al que me referiste, también sale en negro tal y como el que publiqué hace un rato, qué será...


----------



## lubeck (Oct 30, 2010)

mmm.. no se amigo....

es mas fácil si lo subes...  la neta tengo flojera de ponerme a armarlo en el proteus para probar...


----------



## viggiani1975 (Oct 30, 2010)

Bueno, ya volví, me quedé sin internet.


```
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
 ' Define osc 4
  @ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
  @ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
  @ DEVICE pic16F628A, BOD_ON
  @ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
  @ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
  @ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
  @ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF
 
 CmCon=7  
TrisB=0 
 DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1    'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

passd var word

data    @2,$07,$DF ' graba esto al quemar el pic en la eeprom

read 2,passd.highbyte 'lee la posicion2 que es 07 y lo coloca en la parte alta del byte
read 3,passd.lowbyte  'lee la posicion3 que es DF y  lo coloca en la parte baja del byte
'como 07DF es 2015 en decimal entonces la variable passd=2015

passd=2013 'cambiamos el valor de passd

'como 2013 en hex = 07DD

write 2,passd.highbyte  'colocamos la parte alta que es $07 en la posicion 2
write 3,passd.lowbyte  'colocamos la parte baja que es $DD en la posicion 3
'la eeprom quedaria asi...
'00 07 DD

Lcdout $fe, 2,dec passd
```


----------



## lubeck (Oct 30, 2010)

Jejeje el archivo de proteus????
no usas proteus??? el .DSN


----------



## viggiani1975 (Oct 30, 2010)

Ya volví a resucitar, aquí anexo la simulación, es solo el pic con la pantalla, aunque ella funciona bien, el problema es al quemarla que no funciona.


----------



## lubeck (Oct 30, 2010)

Reviza primero las conexiones...
despues los fuses, el programa no creo que sea....


----------



## viggiani1975 (Oct 30, 2010)

Listo!

El problema era del pic, como que soy muy ordinario todavia, ayer dañé uno, hoy seguí dañando y me queda solo uno, creo que sería la manipulación exagerada que les dí.

Bueno Lubeck, como siempre me has sido de gran ayuda, mil y mas gracias por ayudarme y soportarme viejo, hasta pronto y suerte.


----------



## nemesismx10 (Nov 7, 2010)

Hola!

Soy nuevo en el foro y e leido varias temas que estan muy buenos, ahorita solo estaba programando con MPLAB usando el PIC16F84A para que encendiera/apagara unos LEDS pero ahora que busque mas informacion de los microcontroladores y los programas para programarlo encontre el Pic Basic Pro adapatado al MPLAB y se me hace mas facil en cuanto a la forma de encender/apagar los leds, bueno tambien e usado poco el MIKROBASIC, con este pude conectar una pantalla de LCD al pic que muestre un texto de derecha a izquierda en la linea de abajo y despues se pase a la de arriba igual de derecha a izquierda, bueno ahora e estado leyendo y ya le medio adapte con PBP un contador jeje escribo medio porque no lo muestra como yo quiero esque tengo pensado hacer una secuencia de leds junto con unos botones, y pues espero que me puedan orientar.

Bueno el programa lo tengo con un PIC16F873A, un LCD 2X16 y 4 botones, y funciona de la siguiente forma:

Al momento de que un boton se acciona indica un numero en el lcd, al llegar a un conteo de 3 se enciende un led y ya no cuenta mas aunque siga accionando el boton, osea ya no se mueve el numero del lcd y el led sigue prendido  esto es igual para los 3 primeros botones, hasta aqui si es como quiero que quede, bueno el problema es que e  intentado hacer que el cuarto boton al accionarlo se prenda un cuarto led (como si indicara que se reiniciaria el programa) y despues se apague junto con los demas como un reset y se le borren los datos al lcd y al pic, osea que me reinicie el programa para empezar con el conteo de los primeros 3 botones (estoy usando la memoria del PIC para que en caso de que se me corte la energia que energiza a este o algo por el estilo pues se queden almacenados los conteos y si se vuelve a energizar pues sigue el ciclo en el que se quedo).

¿Alguien sabra que es lo que le falta  para que quede como les comento?

Espero que ustedes me puedan orientar o aclararme en que ando mal.

De antemano gracias!


----------



## autotronico (Nov 8, 2010)

Que tal estoy realizando un control de velocidad y giro con POTENCIOMETRO a través de  un driver lm293 y un pic 16f84A , el progrma es el siguiente: 
	
	



```
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

TRISB = %00000000      ; PUERTO B COMO SALIDA 
EN1      VAR PORTB.0
IN2      VAR PORTB.1
IN1      VAR PORTB.2
EN2      VAR PORTB.3
IN3      VAR PORTB.4
IN4      VAR PORTB.5

POT_VAL VAR BYTE         ; VARIABLE PARA EL POTENCIOMETRO           
MOT_PWR VAR BYTE         ;

INICIO: ;
pot PORTA.0,255,POT_VAL 
SELECT CASE POT_VAL      ; IMPLEMENTACION DE DECISIONES
CASE IS <128 
MOT_PWR = 127-POT_VAL   
HIGH IN2: LOW IN1: HIGH IN3: LOW IN4
CASE 128 
MOT_PWR = 0
CASE IS >128 
MOT_PWR = POT_VAL-127
LOW IN2: HIGH IN1: LOW IN3: HIGH IN4
CASE ELSE ;
END SELECT ;
PWM EN1, MOT_PWR, 30 : PWM EN2, MOT_PWR, 30 
GOTO INICIO
END
```

Mi inquietud es que al realizar la simulación el pwm en los enables no operan al tiempo  
aunque estables una condicional con ) para realizar las dos funciones al tiempo. que otro comando se utilizar para la realización de dos operaciones simultaneas.


----------



## atricio (Nov 8, 2010)

disculpen alguien ha hecho un control de temperatura con un lm35 y fue casi real o no se puede hacer tan preciso


----------



## autotronico (Nov 8, 2010)

Amigo realice un control de temperatura con el lm 35 y el  parametro de error fue mínimo al altas temperaturas de casi 0.1 grado


----------



## nemesismx10 (Nov 8, 2010)

Hola atricio, necesitas un PIC que use ADC, que PIC vas a utilizar? y que programa estas utilizando para programar? Estuve leyendo uno que se basa en Pic Basic Pro y al momento de simularlo da un eror de +/- 1ºC usando 8 bits de resolución del ADC, si lo quieres mas exacto entonces usas los 10 bits del ADC.


----------



## autotronico (Nov 8, 2010)

ya la simulacion en proteus me anda bien tenia un error en la descripcion a las entradas del lm 293 para el giro de los motores cambie la habilitación de las entradas y listo.


```
HIGH IN2: LOW IN1: low IN3: high IN4
CASE 128 
MOT_PWR = 0
CASE IS >128 
MOT_PWR = POT_VAL-127
LOW IN2: HIGH IN1: high IN3: low IN4
CASE ELSE ;
END SELECT ;
PWM EN1, MOT_PWR, 30 : PWM EN2, MOT_PWR, 30 
GOTO INICIO
END
```


----------



## nemesismx10 (Nov 8, 2010)

En el archivo no agregaste el .hex autotronico, entonces solo te faltaba el high invertirlo por low jeje suele pasar, lo programaste con MPLAB? los motores son de CD? haber si subes tu proyecto completo para compartirlo en el foro para la gente. 

Saludos.


----------



## autotronico (Nov 8, 2010)

Bien lo que pasa es que le estoy ayudando a un gran amigo que le habían planteado realizar un control de velocidad y giro para dos motores DC por medio de un potenciometro , pero solamente tiene el pic 16f84A y me comento que se le había paso comprar uno que tuviera conversor análogo digital  pic 16f877A u otro con conversores A/D, se ahorro el pic ya que le funciona al pelo.

como puedes ver en el documento anexo lo compile en PBP anidado en MPLAB


----------



## nemesismx10 (Nov 8, 2010)

Bravo! Muy buen aporte autotronico, el 16f877A es el que comentaba serviria para el control de temperatura que decia atricio, el ahorro de tu amigo es lo bueno yo tambien ando empezando en esto de los PIC estoy usando el 16F84A y tambien funciona para poder usar motores de CA pero se necesitan mas aditamentos como contactores y relevadores con transistores jeje, estoy usando MPLAB y tiene muchas funciones pero vi que el MikroBasic y el PBP son mas sencillos para programar por eso tambien los uso .
Gracias por el aporte!
Saludos.


----------



## atricio (Nov 8, 2010)

hola amigos si quisera usar el 16F877A o en su defecto u 16F628A mas me inclino por el 628A que opinan ustedes que tan buenos resulatados me daria?? puedes pasarme para mirar el codigo que implementaste para tu termometro digital. En lo particular yo uso proton creo que andan usando ustedes Microcode me defiendo un poquito en ese compilador les agradeceria mucho que me ayudaran


----------



## nemesismx10 (Nov 8, 2010)

Claro solo se tiene que adaptar al PIC16F628A porque ese tambien tiene entradas ADC es cuestion de que le modifiques en el codigo que te paso ya que en el ejemplo usa el PIC16F870, solo lo utilice con este pero es cuestion que le intentes acoplar y verifiques resultados, el texto es este:

'DEFINE LOS REGISTROS PARA LA PANTALLA LCD
DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB 'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO D
DEFINE LCD_RSBIT 1    'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 2     'EN EL BIT B.2
DEFINE OSC 4 'DEFINES EL OSCILADOR DE 4 MHZ

'DEFINE LOS PARÁMETROS DEL ADC
DEFINE ADC_BITS 8 'NÚMERO DE BITS, ESTE LO PUEDES MODIFICAR
                                'A 10 PARA TENER MAYOR EXACTITUD SOLO CON EL PIC16F870 
                                'VERIFICA EL QUE DICES
DEFINE ADC_CLOCK 3 'USAR CLOCK INTERNO DEL ADC
DEFINE ADC_SAMPLEUS 50 'TIEMPO DE MUESTREO EN 50uS

'DEFINES LAS VARIABLES A UTILIZAR 
RES VAR WORD 'RESULTADO DE LA CONVERSIÓN
TEMP1 VAR BYTE 'TEMPERATURA C
TRISA = 1 'RA0 (AN0) COMO ENTRADA
TRISB = 0 'PORTB SALIDA (ADC)
PAUSE 500 'PAUSA DE INICIALIZACIÓN DEL LCD EN uS

'INICIAR CONVERSIÓN A/D
ADCON1 = %00001110 'ESTABLECER SOLO UN CANAL COMO ANALÓGICO
'VOLTAJE DE REFERENCIA ES VDD
ADCON0 = %11000001 'RELOJ DEL A/D, SELECCIONA CANAL AN0 VERIFICA EL DE 16F628A
'INICIAR EL A/D
LCDOUT $FE, 1 'BORRAR LCD

INICIO:
'INICIAR CONVERSIÓN
ADCIN 0, RES 'LEER EL CANAL A0
TEMP1 = 2 * RES '2 VIENE DE->19.53 
LCDOUT $FE,2,"TEMP = ",DEC TEMP1,$DF,"C" 'MOSTRAR RESULTADO EN EL LCD
'EN LA SEGUNDA LINEA DE LA PANTALLA  
PAUSE 500 'PAUSA 0.5 SEGUNDOS
GOTO INICIO 
END

Esta en PBP y tiene error de +/- 1ºC para mas exacto se cambian los bits de 8 a 10 en este caso. Espero sea de ayuda.

Saludos.


----------



## atricio (Nov 8, 2010)

de que valor usaste el cristal me pasarias la simulacion del proteus por favor lo llegaste a armar fisicamente????


----------



## nemesismx10 (Nov 8, 2010)

El cristal es de 4 Mhz, no lo e llegado a armar fisicamente, solo lo tenia en proteus pero ahorita no lo tengo a la mano, si me das tiempo lo vuelvo a hacer y lo subo para que veas como funciona en proteus y te adjunto el .hex, recuerda que lo hare en PBP.


----------



## atricio (Nov 9, 2010)

hace un ratito lo arme en el proteus y segun este me da como tu dices un error de 1 grado..por otro lado me puedes explicar el porque de el 2 que me mencionas que viene de 19.53 muchas gracias lo subo para que miren


----------



## nemesismx10 (Nov 9, 2010)

El 19.53mV es el resultado de una formula y quiere decir que por cada 19.53mV del LM35 el PIC lo va a redondear a 2ºC para que lo muestre en la pantalla, si lo quieres mas exacto tendrias que utilizar los 10 bits del ADC, cambiaria un poco el programa que te pase, pero no tendria saltos de 2 en 2 en cada muestra de temperatura, seria un poco mas exacto que el anterior. Te lo adjunto para que lo programes.

El de 10 bits te lo mando en formato de texto para que lo compiles con tu programa, solo cambia y se le aguregan unas cosas, y al archivo que me mandaste de proteus le agregue un voltimetro en mV para que verifiques lo que comento de los 19.53mV.

Suerte.


----------



## cesarpelen (Nov 9, 2010)

ME PODRIAN ALGUIEN AYUDAR CON ESTA PARTE DEL PROGRAMA, DETALLADAMENTE.
POR LO MENOS SE QUE EN LA PRIMERA LINEA UBICA EL CURSOR EN LA CASILLO 18
EN LA SEGUNDA LA VARIABLE A TOMA VALORES DE 0 A 18 USANDOLA COMO UN CONTADOR
EN LA TERCERA LINEA Y CUARTA LINEA NO LA ENTIENDO, MUCHAS GRACIAS DE ANTEMANO

LOOP:
LCDOUT $FE,$91 ; ubicar cursor en la casilla 18
for a =0 to 18
lookup a,["CURSO PIC BASIC PRO"],B
LCDOUT,B
PAUSE 500
NEXT
GOTO LOOP


----------



## nemesismx10 (Nov 9, 2010)

Ya lo simulaste? te provoca error? o anda bien el programa en proteus?

Hola cesar, ese prgrama que comentas con que pic y lcd lo estas simulando? y que es lo que quiere que haga? tengo pocos conocimientos en esto de los pic pero haber si puedo y algo te ayudo sino pues alguien aqui a de saber lo que buscas. No te estara faltando algo mas en la linea de LCDOUT,B ? o si te funciona como quieres?


----------



## atricio (Nov 9, 2010)

gracias nemesis hoy en la noche lo armo y miro como me fue con las variantes del caso y comento lo que susedio muchas gracias por la colaboracion.

Cesar esas sentencias es para que aparezca en un lcd la palabra que pones ahi de izquierda a derecha si no me equivoco una a una las letras revisa en el gogle hay una pagina que se llama matpic ahi hay un ejemplo muy completo con un video incluso 

miralo 

http://www.matpic.com/esp/microchip/lcd.html


----------



## reyvilla (Nov 10, 2010)

buenas de nuevo por aca, con respecto al trozo de programa de @cesarpelen, lo que sucede en ese programa es que la lcd va mostrando letra por letra en vez de escribir todo de una vez:

LOOP:
LCDOUT $FE,$91 ; ubicar cursor en la casilla 18
for a =0 to 18 
lookup a,["CURSO PIC BASIC PRO"],B  ' son 18 por que son 18 espacios de la lcd que se van a usar
                                                   'hay que aclarar que la lcd solo tiene 16 para visualizar ose
                                                   'hay dos letras que no se van a ver en la lcd.
                                                   'otra cosa en ["CURSO PIC BASIC PRO"] serian 19 no 18 moscas
LCDOUT,B
PAUSE 500
NEXT
GOTO LOOP

entonces en resumen el programa no hace mas que escribir letra por letra lo que esta dentro de las casillas con un retardo de 500ms cada letra...saludossss


----------



## viggiani1975 (Nov 12, 2010)

Saludos a todos,

Quisiera trasmitirles mi inquietud respecto al manejo de las interrupciones en pic basic, hasta el momento que empiezo a mirar resulta entendible cuando se trata de aplicar a un solo interruptor pero no encuentro ejemplos que permitan la aplicación de un teclado, aclaro esto, me gustaría mantener un mensaje en un lcd hasta que se active el teclado, algo parecido a hacer un protector de pantalla mientras no hay actividad. En este momento me baso en el libro de Carlos Reyes pero la información es corta y no he podido encontrar nada en la red aparte de encender leds con un solo pulsador.

Desde ya, muchas gracias por cualquier orientación al respecto.


----------



## lubeck (Nov 12, 2010)

> En este momento me baso en el libro de Carlos Reyes pero la información es corta y no he podido encontrar nada en la red aparte de encender leds con un solo pulsador.



Porque me caes bien viggiani... te voy a dar el mejor consejo que puedo dar yo....

Agarra todos los libros de computación que tengas, siiii... todos incluyendo guías rápidas de bolsillo... todos todos... ponlos apilados dentro de un tambo, cubeta o similar, toma una garrafa y compra 1 litro de gasolina, viertela sobre el tambo, consigue un extintor, toma un cerillo y arrojalo en el tambo, observa el fuego mientras se consume el papel, manten el extinguidor en tus manos  y usalo inmediatamente en el caso de que se riegue el fuego... si dominas el arte del fuego prepara unos malvabisco insertalos en un palo o varilla y doralos un poco y disfrutalos... despues del ritual de iniciacion....

toma tu computadora... preferentemente un laptop, y usala 25hrs al dia, picale, muevele, subele, bajale a los codigos, navega en internet y busca ejemplos... repite el proceso de picale subele bajale, y asi infinatmente hasta que la computadora este totalmente domada....

La tecla *F1* es tu mejor amiga y compañera incondicional....

si hiciste los pasos al pie de la letra, seguramente estas en proceso de realizar tus propios codigos...


----------



## viggiani1975 (Nov 12, 2010)

Ja,ja,ja...

Si que no doy en esto, pero bueno, soy mas necio que niño pequeño.

Gracias por responderme amigo, fresco que todo esto que hago es solo con fines didácticos, es más, hasta ahora no he armado mas allá del protobard algunos circuitos basicos,   no creas que mi idea es lucrarme con el trabajo de ustedes, es especial el tuyo, pues si que me has ayudado bastante. La verdad, la electrónica y los micros es por hobby, a pesar que soy muy burro para esto. 

La cuestión es que andaba leyendo sobre el tema de interrupciones y veo que los ejemplos siempre están enfocados a swiches sobre el portb.0 por ejemplo, pero no he visto código referente con sensores de presencia o cosas así, será que es difícil abordar el asunto y simplemente es omitido?:


----------



## lubeck (Nov 12, 2010)

> será que es difícil abordar el asunto y simplemente es omitido?


mmm... no lo digo porque lucres o no lucres con las ayudas o consejos que pongamos, de echo para mi es molesto que no lucres con ellos... ese es el fin de aprender...

por otro lado lo de las interrupciones si son un poco complejas y para mi hasta un poco absurdo su funcionamiento, pero en fin...

 ese es mi punto del consejo que te di, desarrolla un algoritmo y te puede quedar mucho mejor que usando las interrupciones.. me explico???...

ejemplo... yo en mis algoritmos no uso ningun antirrebote  que eso te detiene el proceso de lectura, para eso existe un codificador de taclados matriciales y eso en los libros no lo vas a encontrar...


----------



## viggiani1975 (Nov 12, 2010)

Muy bien, entiendo tu punto de vista, yo apenas alcancé a tocar el intcon para ver que sucedía.  La solución podría darse con un ciclo While que mantenga por ejemplo, un mensaje determinado y que una vez la variable para el ciclo varíe, pase a x o y función.


----------



## cesarpelen (Nov 14, 2010)

Muchas gracias, por la ayuda de todos, creo que este foro es uno de los mejores por la gente que lo conforma, gracias por compartir sus conocimientos. Es una maravillosa ayuda para los amantes de los microcontroladores.


----------



## jferrero2001 (Nov 20, 2010)

Hola respetable foro,
Hace bastante que aprendo de este foro y de los consejos muy buenos que aquí se dan. Hace unos días quise profundizar el tema del comparador en el 12F675 pero no encontré nada suficientemente claro para mí, que soy bien novato. En consecuencia me puse a buscar y he terminado haciendo un tuto, que tiene cuatro partes y que adjunto por si es útil:
a) comparador con referencia externa
b) comparador con referencia interna
c) comparador con referencia externa e histéresis
d) comparador con referencia interna e histéresis
En este último punto tengo algunas dudas, a pesar que en proteus está funcionando, si encuentran errores por favor no duden en comentar!!
Todo ha sido programado en PBP y probado en Proteus.
Gracias de antemano!!


----------



## reyvilla (Nov 20, 2010)

hola gracias por el aporte, no logro abrir el archivo me da un error en el documento...saludosss


----------



## jferrero2001 (Nov 21, 2010)

Hola reyvilla,
debe ser un  problema de versiones de acrobat, yo lo bajé sin problema.
Igual lo he vuelto a subir en un .doc rareado, me imagino que ahora lo vas a poder ver. Saludos


----------



## reyvilla (Nov 21, 2010)

gracias buen aporte...saludossss


----------



## vaco_802808 (Nov 23, 2010)

Hola a todos excelente esta pagina espero me puedan ayuda me hago bolas al programar en microcode studio estoy usando pic16f628A quiero hacer un cartel con 4 o 6 matrices de 8x8 leds, no entiendo como programar el puerto data y clock que entran a los  74LS164 estoy usando  el diagrama de uControl pero no estiendo como programar el pic les agradeceria la ayuda, hay les dejo el pbp de microcode, el diagrama, proteus.


----------



## xaviergarvi (Nov 24, 2010)

hola bueno mi pregunta es para reyvilla que programa estas usando para programar los comandos me parecen mas facil de escrivir ejemplo de lo que pusiste


TRISA = %00000111 
TRISB=0 'ESTABLECER EL PUERTO B COMO SALIDA
PORTB.6 = 1

PAUSE 500 ' PAUSE DE MEDIO SEGUNDO
ESPERE" ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT 
LCDOUT $FE,$C0, "CARGANDO"    
For A = 0 to 15
LOOKUP A,[ "......." ],B
LCDOUT $FE,$0C,B
GOSUB PAUSA_12SEG
NEXT


----------



## lubeck (Nov 24, 2010)

> que programa estas usando para programar?



Microcode Studio 3.0.0.0
PicBasicPro 2.46

si no me equivoco....


----------



## reyvilla (Nov 24, 2010)

gracias lubeck por la pronta respuesta, amaneci destruido pensando lo de los moduos RF...jajaja... si es PBP 4.26 ò 4.27 y microcode studio 3...saludosss


----------



## atricio (Nov 24, 2010)

alguien podria compartir como se deberia configurar los modulos de RF y como manejar un GLCD y una toch es posible o no???


----------



## cesarpelen (Nov 24, 2010)

Que tal amigos del foro, los molesto de nuevo, tengo un problema con un lcd 16*4 lo estoy controlando con un pic 16f84a con 4 bit, le tengo conectado un lcd 16*2 el problema es que quisiera que el texto se desplegara de la misma manera en los dos lcd, pero resulta que el el lcd 16*4 aparece el texto hasta la tercera linea he tratado de ubicar la direccion en hexadecimal de cada caracter de esta pantalla pero no lo he conseguido, les adjunto el archivo con la simulacion y codigo.
Me gustaria mucho si me enviaran un pequeÑo programa que despliegue un texto en esta lcd 16*4 y asi ubicarme en la posicion de los caracteres, gracias


----------



## lubeck (Nov 25, 2010)

> alguien podria compartir como se deberia configurar los modulos de RF


uno sencillo... pero de los comunes hay xBee y no se cuantos tipos mas...

https://www.forosdeelectronica.com/posts/403031/


----------



## reyvilla (Nov 25, 2010)

creo que debe existir un ejemplo en el curso, de todas formas de dejo una guia esta en ingles pero es bien sencilla y completa, tiene las direcciones de memoria de las lcd, etc...esat bien completa...espero y les sirva a muchos...saludos

LCD1.pdf

PD:Con respecto al circuito que adjunto @cesarpelen me parece que esta muy desarreglado, si utilizas termilaes de referencia es justamente para eviarte utilizar tantas lineas de conexion trata de mejorarlo, es solo una sugerencia...saludosss


----------



## plcisrael (Nov 26, 2010)

Saludos amigos, vengo a solicitar su ayuda, realizo el circuito de comunicación i2c con una eeprom externa que se encuentra en el libro “micro controladores pic programación en basic de carlos a. reyes” en este libro realiza el circuito con una eeprom 24lc04b y un lcd mostrando la palabra “hola” al simularlo en proteus funciona con normalidad, pero yo quiero trabajar con una eeprom 24lc512 yo pensé que trabajaría con normalidad solo al cambiar el integrado pero no trabaja el lcd muestra cuadros negros no tengo idea de cuál es el problema, les dejo el programa realizado en microcode studio y muchas gracias.
define i2c_sclout 1

contro con $a0
PinSCL var Portb.1
PinSDA var Portb.0
dato var byte

Inicio:
lcdout $fe,1,"Grabando..."
pause 1000

i2cwrite pinsda,pinscl,contro,0,["H"]
pause 10
i2cwrite pinsda,pinscl,contro,1,["O"]
pause 10
i2cwrite pinsda,pinscl,contro,2,["L"]
pause 10
i2cwrite pinsda,pinscl,contro,3,["A"]
pause 10

lcdout $fe,1,"Leer memoria"

pause 1000
lcdout $FE,1

leer:

i2cread pinsda,pinscl,contro,0,[dato]
lcdout,dato
pause 1000
i2cread pinsda,pinscl,contro,1,[dato]
lcdout,dato
pause 1000
i2cread pinsda,pinscl,contro,2,[dato]
lcdout,dato
pause 1000
i2cread pinsda,pinscl,contro,3,[dato]
lcdout,dato
pause 1000
goto inicio
end


----------



## lubeck (Nov 26, 2010)

El problema esta en el control

Para escribir es $A0 y para leer es $A1


```
i2cwrite pinsda,pinscl,$A0,0,["H"]
i2cread pinsda,pinscl,$A1,0,[dato]
```

en cuantro al control debes estar pendiente de las paginas( no se si ese integrado las maneja, pero seguramente)


----------



## arturouc (Dic 3, 2010)

Hola compañeros, soy nuevo en el foro y quiero ver si me pueden ayudar
con un problema que tengo para controlar un servomotor SANYODENKI
de 24V 2.7A 3000 rpm. se trata de controlar la posicion del servomotor
para lo cual anexo el siguiente codigo con su explicacion el cual si funciona
pero solo a una velocidad muy lenta del servomotor por que el encoder
manda 2000 pulsos por revolucion a 3000 rpm = 100000 pulsos/seg
estoy utilizando un pic 16f877a con un oscilador de 8Mhz

```
'****************************************************************
'*  Name    : servodriver.BAS                                   *
'*  Date    : 21/11/2010                                        *
'****************************************************************
define osc 8   'declaracion del oscilador
Trisd = 255     'puerto D como entradas
Trisb = 0       'puerto B como salidas

Posicion var word  'Posicion a la que tiene que ir el servo
PosMenos var word  'Histeresis abajo
PosMas var word    'Histeresis arriba
Contador var word  ' Contador de pulsos del encoder
A var bit          'canal A del encoder 500 pulsos/r
B var bit          'canal B del encoder 500 pulsos/r
C var Bit          'canal C del encoder 500 pulsos/r
uA var bit         'variable para saber si cambio canal A
uB var bit         'variable para saber si cambio canal B
uC var bit         'variable para saber si cambio canal C
Giro var bit       'sentido de giro del servo

contador = 0
posicion=5000    'una posicion arbitraria
ua=0
ub=0
Cambio:          'cambiar sentido de giro
posmenos=posicion-15
posmas=posicion+15
portb=0

Inicio:
        ; si se presiona un pulsador se cambia la
        ;posicion a la que se debe de mover el servomotor
        if portd.1 =1 then  goto soltar
        if portd.0=1 then  ' LEE CANAL A  del encoder
            A=1     'activado
        else
            A=0     'desactivado
        endif 
        if portd.2=1 then ' LEE CANAL B   del encoder
            B=1     'activado
        else
            B=0     'desactivado
        endif               
        ;si el canal A mando un flanco de subida
        ;y el canal B esta activo giro=1
        IF UA=0 and A=1 and B=1 then giro=1
        ;si el canal A mando un flanco de subida
        ;y el canal B esta desactivado giro=0
        IF UA=0 and A=1 and B=0 then giro=0
        ;si cambia alguno de los canales del encoder
        ;es una posicion diferente y por lo tanto
        ;el contador se debe de incrementar
        ;dos canales de 500 pulsos con dos estados posibles
        ;me dan 2000 pulsos por revolucion (4 combinaciones)
        if A<>uA or B<>uB then
            if giro=1 then  contador =contador+1   'incremento
            if giro=0 then  contador =contador-1   'decremento
        endif
        
        uA=A   'ultimo estado del canal A
        uB=B   'ultimo estado del canal B
        
        if contador =posicion then  ' si llego a la posicion apago el motor
            portb.1 =0
            portb.2=0
        endif 
        
        if contador<posmenos then  ' giro en sentido =1
            portb.1=1 'se activa la salida para que gire el motor giro=1
        endif
       ;despues cambiare esto por PWM
       if Contador>posmas then     'giro en sentido =0
            portb.2=1 'se activa la salida para que gire el motor giro=0
         endif        
        goto inicio
Soltar:
        if portd.1=1 then goto Soltar
        ;cambio la posicion para que gire en sentido contrario
        if posicion=1000 then
            posicion=5000
        else
            posicion=1000
        endif        
        goto Cambio
end
```

P.D. quiero felicitarlos a todos por sus valiosos aportes y en especial a mecatrodatos!!!


----------



## minssss (Dic 5, 2010)

alguien me podria ayudar a programar una pantalla lcd 16x2 por el puerto a del pic 16f877a, ya lo he hecho pero en otros puertos porque el a siempre me da problemas, solo un simple mensaje por la pantalla lcd por favor estare agradecido

DEFINE LCD_DREG PORTa  
DEFINE LCD_DBIT 4   
DEFINE LCD_RSREG PORTa 
DEFINE LCD_RSBIT 4  
DEFINE LCD_EREG PORTa  
DEFINE LCD_EBIT 5
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2    
DEFINE OSC 4

si me pudieran decir que estoy haciendo mal.. estare agradecido BLESS


----------



## lubeck (Dic 5, 2010)

Pon al inicio *cmCon=7*, eso combierte las salidas analogas a digitales....

y verifica en el datashett si todos los puertos son bidireccionales.... creo que si pero no recuerdo hay algunos que solo son de entrada en los pics y para el LCD se requieren de salida...


----------



## lpnavy (Dic 5, 2010)

el programas que tiene las declaracion de variable las tienes mal, por ejemplo la variable de registro DREG si le colocas 4 significa que vas a conectar pines que serian los bit mas significativo ej: pin4, pin5,pin6,pin7 y alli en el circuito los tienen conectado en los bit menos significativo; ademas el RS lo declaraste junto con el DREG. Aqui te dejo uno que esta bien ademas recuerda que los pines del puerto A no proporcionan mucha corrriente lo mas recomendalble es usar el puerto B,C o D.

Define	LCD_DREG	PORTA
Define	LCD_DBIT	4
Define	LCD_RSREG	PORTA
Define	LCD_RSBIT	0
Define	LCD_EREG	PORTA
Define	LCD_EBIT	1
DEFINE LCD_LINES 2

PAUSE 200          ; RETARDO PARA QUE INICIALIZE EL LCD
LCDOUT $FE, 1 ;LIMPIA LCD
LCDOUT $FE,$84, "HOLA"  ;muestra mensaje en la primera linea,quinta casilla
LCDOUT $FE,$c2, "MUNDO" ;mensaje en la segunda linea,tercera casilla


----------



## serc12 (Dic 5, 2010)

una question no hablan realizado un programa en el cual se pueda leer la humedad relativa atraves del sensor hs1101 si es asi diganmelo donde lo puedo encontrar si esta en codigo mikroc seria paerfecto


----------



## arturouc (Dic 5, 2010)

minssss
pon la instruccion
ADCON1=7
para convertir el puerto A a digital


----------



## serc12 (Dic 5, 2010)

pero no tengo que hacer un arrglo para que en la pantalla me salga en porcentaje xq solo hacerlo leer me saldra un valor que pueda ser que no tenga relacion o me euqivocvo


----------



## ByAxel (Dic 5, 2010)

Que tal @serc12, no desordenemos el hilo que hay lugares donde preguntar Programacion con MikroC y la respuesta anterior no era hacia tu pregunta .

No se si entendí bien lo que buscas pero intenta escalar el valor obtenido del ADC del PIC, claro que para eso necesitas un valor de referencia... que datos técnicos te ofrece el hs1101?? inicia por eso.

saludos.


----------



## serc12 (Dic 5, 2010)

ya tengo los voltajes de referrencia q son desde 0.56 hasta 1.59 voltios eso lo logro con el arreglo del datasheet y adicionandole un lm 2907 que convierte la frecuenai a voltaje 
pero de ahi no c como lograr la lectura en el adc del microcontrolador


----------



## ByAxel (Dic 5, 2010)

mmm ya creo que te complica es saber "cuanto de humedad hay", es similar a la temperatura cuando no tienes de donde saber si realmente son n°C, por eso te dije que necesitas un valor (constante en el PIC) desde el cual parta el resto de medidas.

Por decir en su datasheet antes del circuito de prueba (el que bota frecuencia) hay una tabla que es aplicada a un módulo que saca voltaje, ahí obtuvo que 10RH son 1.41V, entonces al aplicar 1.41V al ADC del PIC (a 10 bits con referencia a VCC y GND) se obtiene el valor 288 (que representa al 1.41V), de eso se parte -valor de referencia- para hacer el resto de medidas y representarlo en RH.

Entonces te pregunto, en tu circuito cuantos RH son 0.56V o el mínimo voltaje que le aplicas al PIC?, eso es lo que tienes que obtener para así tener un valor de referencia, hacer el cálculo y representarlo en RH. Es mi idea, al menos para la capacidad de procesamiento del PIC.

saludos


----------



## atricio (Dic 5, 2010)

hola amigos intento probar este codigo de un libro pero esta hecho en microcode me compila y todo pero al rato de realizar la simulacion no me sale nada el codigo es el siguiente y tambien adjunto la simulacion les agradeceria si me ayudaran un poco por favor:

```
@deviceXT_osc
define osc 4


define LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSRED PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EBIT 4
 
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
 
TRISA=%1
ADCON1=%00001110
 
DATO    VAR WORD
TEMPBAJ VAR BYTE
TEMPALT VAR BYTE
X       VAR BYTE
G       CON 233
RELEF  VAR PORTD.2
RELEC  VAR PORTD.3
LED    VAR PORTD.4
ENTER  VAR PORTD.5
BSUBIR VAR PORTD.6
BBAJAR VAR PORTD.7
 
EEPROM 0,[20,24]
 
INICIO:
 
FOR X=1 TO 3
 
HIGH LED
PAUSE 200
LOW LED
PAUSE 200
 
NEXT

READ 0,TEMPBAJ
READ 0,TEMPALT

SENSAR:
 
ADCIN 0, DATO
 
LCDOUT $FE,1, "T.MIN T.ACTU T.MAX"
DATO=DATO/128
LCDOUT $FE,$C6, DEC DATO,G,"C"
LCDOUT $FE,$C6, DEC TEMPBAJ,G,"C"
LCDOUT $FE,$C6, DEC TEMPALT,G,"C"

FOR X=1 TO 50
 
IF ENTER=0 THEN GRABARLA
PAUSE 10

NEXT

IF DATO<TEMPBAJ THEN CALENTAR
IF DATO<TEMPALT THEN ENFRIAR
LOW RELEC : LOW RELEF

GOTO SENSAR

CALENTAR:

HIGH RELEC : LOW RELEF

GOTO SENSAR

ENFRIAR:

HIGH RELEF : LOW RELEC

GOTO SENSAR

GRABARLA:

GOSUB SOLTAR

GRABAR1:

LCDOUT $FE,1,"PROGRAMAR TEMP."
LCDOUT $FE,$C0,"BAJA=",DEC TEMPBAJ,G,"C"
PAUSE 100

IF BBAJAR =0 THEN RESTAR1
IF BSUBIR =0 THEN SUMAR1
IF ENTER=0 THEN GRABARA

GOTO GRABAR1

RESTAR1:

GOSUB SOLTAR

IF TEMPBAJ<1 THEN GRABAR1

TEMPBAJ= TEMPBAJ-1

GOTO GRABAR1

SUMAR1:

GOSUB SOLTAR

IF TEMPBAJ>40 THEN GRABAR1

TEMPBAJ= TEMPBAJ+1

GOTO GRABAR1

GRABARA:

GOSUB SOLTAR

WRITE 0,TEMPBAJ

GRABAR2:

LCDOUT $FE,1,"PROGRAMAR TEMP."
LCDOUT $FE,$C0,"ALTA=",DEC TEMPALT,G,"C"

PAUSE 100

IF BBAJAR =0 THEN RESTAR2
IF BSUBIR =0 THEN SUMAR2
IF ENTER =0 THEN GRABARB

GOTO GRABAR2


RESTAR2:

GOSUB SOLTAR

IF TEMPALT<5 THEN GRABAR2
 
TEMPALT=TEMPALT-1

GOTO GRABAR2
 
SUMAR2:

GOSUB SOLTAR

IF TEMPALT>50 THEN GRABAR2

TEMPALT=TEMPALT+1

GOTO GRABAR2

GRABARB:

GOSUB SOLTAR

WRITE 1,TEMPALT

GOTO INICIO


SOLTAR:

HIGH LED
PAUSE 150
LOW LED
 
SOLTAR2:
 
IF BBAJAR=0 THEN SOLTAR2
IF BSUBIR=0 THEN SOLTAR2
IF ENTER=0 THEN SOLTAR2

PAUSE 100
RETURN
 
END
```


----------



## lubeck (Dic 6, 2010)

> agradeceria si me ayudaran un poco por favo


yo creo que no estas cargando el archivo hex en el micro...

podrias subir el archivo dsn y pbp para ver que esta pasando....

(a la mayoria nos da flojera copiarlo al proteus, nos es mas facil abrirlo y ya)


----------



## carlos jara (Dic 6, 2010)

Creo que tambien  se te pudo haber olvido cargar  el  archivo hex  al proteus  si no  haces eso  no podras simularlo y ten  muy encuenta  que en el pbp te  pone  un codigo de pic  el cual tiene  que  el mismo que  se va  a cargar en el proteus




			
				carlos jara dijo:
			
		

> Creo que tambien  se te pudo haber olvido cargar  el  archivo hex  al proteus  si no  haces eso  no podras simularlo y ten  muy encuenta  que en el pbp te  pone  un codigo de pic  el cual tiene  que  el mismo que  se va  a cargar en el proteus




amigo  lubeck mira  me averigue  por aca sobre los TRANSCEIVER RFM12B te dejo el codigo para  que  si puedas  veas el datasheet cuesta  igual que los  modulos que estuvimos usando

amigo lubeck estuve  haciendo  una pruebas en los modulos pero  al  alimentar el pin 7 a 5v el pin 8  me marca 4.95v y si lo pongo  a masa pues  se que da  en 2.92v es como si lo conectaria  a masa  o lo dejaria en el aire sin conectar


----------



## lubeck (Dic 6, 2010)

Carlos donde andas???

estas conectado????

eso es lo que esperamos 4.95 a positivo, y 2.92 mas  o menos conectado a masa...

ya casi ya casi... 
eso de los transiver me laten mas deja los checo vale...


----------



## atricio (Dic 6, 2010)

hola amigos si le ando cargando el .hex al micro y usando el micro con el que compile pero no me anda la verdad no se que sea ayuda por favor


----------



## lubeck (Dic 6, 2010)

Yo te ayudo si subes el archivo DSN y el PBP para checarlo aca...
comprimelo en un rar...


----------



## carlos jara (Dic 6, 2010)

pues  es lo correcto nuestro amigo lubeck tiene razon tienes solamente  que cargar el archivo pero  si en caso  necesitas ayuda  pues  sube  el archivo  tanto pbp  como dsny en verdad  podremos  ayudarte

si  el proteus  es el diseño que tienes  en el msj 123  tienes un primer error, no te va a salir nada  en  la pantalla lcd  pues  por que no tiene  alimentacion, tienes que  poner el pin 1 y 3 a masa el pin 2 a 5v 
o mejor  al pin 3 ponle al comun de un potenciometro de 5K los  otros pines  a  masa y 5v ojala te pueda  ayudar amigo  si en caso no te funciona sube  el archivo para checarlo y  ver si se puede modificar


----------



## carlos jara (Dic 7, 2010)

lubeck estoy aca en linea jeje 
probe los  modulos que teniamos los dos  ultimos con el anterior  que nos quedo y recuerdas el modulo viejito  el primero que tenia  pues todos ellos estan funcionando bien amigo los  4 estan operativos

los  probe con un osciloscopio y pues los  pulsos  son magnificos


----------



## carlos jara (Dic 7, 2010)

LUBECK amigo probe los modulos emisores mandandole pulsos desde un 555 y regulando con un potenciometro su velocidad y lo mismo que me emite , los receptores  me lo recibe funciona  de las mil maravillas con el Schmitt. Trigger es decir amigo creo  que ya es un echo echarlo andar


----------



## lucasjesus (Dic 7, 2010)

Hola como estan... Necesito armar un circuito para controlar led's RGB... Utilizo en PBP con el PIC 16F628A... Por lo q averigue tengo q modificar el ancho del pulso como si fuera un motor cc... Lo q no se es si con un mismo PIC se pueden controlar la tres salidas y como armar el programa para q haga secuencias...
Gracias...


----------



## chapin (Dic 7, 2010)

siempre utiliza el buscador https://www.forosdeelectronica.com/f24/programa-manejo-led-rgb-pic-16f628a-14319/


----------



## atricio (Dic 7, 2010)

hola amigos bueno eso del lcd no hay tanta historia porque el programa casi siempre m los colocaba solo he hecho pruebas asi no me ha dado problema pero puedo intentarlo ya subo el pbp y el dsn Ojala que me puedan hechar una mano


----------



## arturouc (Dic 7, 2010)

Hola amigos en el post #835 planteo un problema donde tengo un codigo en pbp para el control de un servomotor de cd con un encoder de 2000 pulsos/revolucion. el problema que tengo es que al compilarlo me genera 312 lineas de codigo y a una velocidad del 5% del motor funciona muy bien el codigo, pero a una velocidad mayor pierde muchos pulsos del encoder. estoy utilizando un oscilador de 8 Mhz y voy a cambiar a uno de 20 Mhz pero no creo que se resuelve el problema por completo por que cambie de 4Mhz a 8 Mhz
y el cambio en la lectura del encoder fue minimo..sugerencias....


----------



## serc12 (Dic 8, 2010)

Byaxel gracias por tus consejos ya logre q mostrara en la pantalla lcd el procentaje de humedad ahora mi problema radica en que tengo que guardar eso datos en la eeprom y compararlo no c si me podrias dar algunos consejos


----------



## ByAxel (Dic 8, 2010)

serc12 dijo:


> guardar eso datos en la eeprom y compararlo


Para leer/escribir en la eeprom se usan las instrucciones READ/WRITE, encuentras ejemplos en este mismo tema.
Sobre comparar no entiendo, vas a comparar el RH guardado en al eeprom con el RH recién leído?, no veo el problema... puedes guardar el RH antes de mostrar en el LCD pero ¿es necesario usar la eeprom? ya que esta es usada para que el dato no se pierda a pesar de apagar el PIC; en escribir se demora al rededor de 10ms... ¿cada cuanto tiempo lees el sensor?.


----------



## serc12 (Dic 8, 2010)

el semsor esta en constante lectura ya q va a estar serca del lugar a sensar acada rato va a estar sensando las plantitas si detecta una variacion de humedad y es menor que la que el usuario guardo en la eeprom entonces activa una carga y si es mayo esta misma se debe desactivar es algo asi


----------



## ByAxel (Dic 8, 2010)

serc12 dijo:


> el semsor esta en constante lectura ya q va a estar serca del lugar a sensar acada rato va a estar sensando las plantitas si detecta una variacion de humedad y es menor que la que el usuario guardo en la eeprom entonces activa una carga y si es mayo esta misma se debe desactivar es algo asi


Revisa el help del compilador para que veas como es la sintaxis de las instrucciones para la eeprom. Ten en cuenta la dirección donde guardas el valor.
Luego de leer el valor deseado lo comparas con lo leído y mediante IF-ELSEIF-ELSE decides si es mayo o menor... básicamente es un control on/off lo que haces, ya luego tal vez implementas un control PID.

saludos


----------



## serc12 (Dic 8, 2010)

PID ???? no habia escuchado de esa nota me puedes comentar algo sobre eso ??? porfa por mi parte tambien investigare eres grande man te agradesco por la informacion gracias


----------



## ByAxel (Dic 8, 2010)

No tienes idea? va a ser para que investigues, con el tiempo verás su utilidad; PID, Proporcional integral derivativo y en el foro hay de este tema con microcontroladores y opamp.
salu2.


----------



## serc12 (Dic 8, 2010)

wua ...... comenzare a investigar mas aparte del enlace que haz puesto gracias man


----------



## carlos jara (Dic 9, 2010)

Lubeck ya tengo armado las 2 tarjetas para los modulos los pic aun no tienen  el programa te parece  si al rato  le seguimos


----------



## carlos jara (Dic 10, 2010)

Amigo Lubeck tengo ya los pulsos medidos en el osciloscopio


----------



## cesarpelen (Dic 15, 2010)

Hola amigos, me podrian hacer el favor de ayudarme con ejemplos o programas para desplegar textos en un lcd 16*4 en sus cuatro lineas. Lo estoy manejando con un pic 16f877. 

Pensaba en un programa en el cual un texto ocupaba 4 lineas y se desplegaba todo el texto de arriba hacia abajo. Ya que en videos de google existe un proyecto igual pero no hay codigo y no tengo ni la mas minima idea como se hace esto. 

Muchas gracias por su ayuda.


----------



## ByAxel (Dic 16, 2010)

cesarpelen dijo:


> Hola amigos, me podrian hacer el favor de ayudarme con ejemplos o programas para desplegar textos en un lcd 16*4 en sus cuatro lineas. Lo estoy manejando con un pic 16f877.
> 
> Pensaba en un programa en el cual un texto ocupaba 4 lineas y se desplegaba todo el texto de arriba hacia abajo. Ya que en videos de google existe un proyecto igual pero no hay codigo y no tengo ni la mas minima idea como se hace esto.
> 
> Muchas gracias por su ayuda.


Revisa el help del mismo programa... manual más completo no hay (en ingles).
Busca la instrucción LCDOUT que debajo de su explicación hay dos tablas, una de ellas de los comandos incluyendo la manera de pasar a la 2da, 3ra y 4ta línea.

Fragmento.

```
$FE, $C0 | Move cursor to beginning of second line 
$FE, $94 | Move cursor to beginning of third line 
$FE, $D4 | Move cursor to beginning of fourth line
```

salu2


----------



## atricio (Dic 16, 2010)

ya que estan con eso de los LCD seria bueno si se animaran ha realizar unos programas com GLCD se los agradeceriamos mucho


----------



## ByAxel (Dic 17, 2010)

atricio dijo:


> ya que estan con eso de los LCD seria bueno si se animaran ha realizar unos programas com GLCD se los agradeceriamos mucho


Lo veo complicado (hacer todo el protocolo de control) ya que el PBP no tiene instrucciones para trabajar con GLCDs. Mi sugerencia es que no se casen con uno. Por ejemplo pueden usar el Proton IDE que si tiene instrucciones para GLCDs.
Si alguien lo ha echo a buena hora que lo suba .


----------



## deniel144 (Dic 17, 2010)

hola tengo una duda con picbasic:
cual es la sintaxis de la coneccion usb yo encontré esto 

```
DoUSBOut:
   USBBufferCount = USBBufferSizeTX   
   usbservice
   USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
   return
   DoUSBIn:
   USBBufferCount = USBBufferSizeRX              ' RX buffer size
   USBService                                    ' keep connection alive
   USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   ' read data, if available
   return
```

pero usbbuffer usbbufffercount  y los demas que funcion tienen

eso espero q me ayuden 

gracias


----------



## atricio (Dic 17, 2010)

mira en el microcoede al igual que en el proton hay una herramienta con la que se puede generar el codigo directamente para poder hacer la coneccion con un uC a una PC por USB creo que el que colocaste antes es en proton no estoy seguro pero en estos campos solo se debe llenar lo que quieres que haga el uC por ejemplo un ADC o el accionar de los puertos puedes hacer relativamente todo dependiendo del micro que uses no soy un experto pero si aprendi algo algo dañoando las cosas sobre este tema


----------



## deniel144 (Dic 20, 2010)

gracias por tu respues bueno paso el codigo que tengo por no si si esta bien enfocado no es mi fuerte

```
USBBufferSizeMax   con 8  ' maximum buffer size
USBBufferSizeTX    con 8  ' input 
USBBufferSizeRX    con 8  ' output

' the USB buffer...
USBBuffer        Var Byte[USBBufferSizeMax] 
USBBufferCount   Var Byte 
dato             var byte

usbinit ' initialise USB...
ProgramStart: 
    PORTB=USBBuffer[7]
    gosub dousbin
    goto ProgramStart  

 escaneo:

     if portd.0=1 then 
      USBBuffer[0]=1
      USBBuffer[1]=1
      USBBuffer[2]=2
      
   DoUSBOut:
   USBBufferCount = USBBufferSizeTX   
   usbservice
   USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
   return
   DoUSBIn:
   USBBufferCount = USBBufferSizeRX              ' RX buffer size
   USBService                                    ' keep connection alive
   USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   ' read data, if available
   return
   
   endif

if USBBuffer[1]==1 then 
 high portb.0
 high portb.1
endif

  goto escaneo
```

bueno lo que quiero es que si el puerto rd.0 esta en estado1 envié un arreglo de bytes luego el programa en java, según la decisión del usuario prenda un led que esta en rb0 y 1 

eso espero que me ayuden con opiniones sobre el código 

saludos


----------



## atricio (Dic 20, 2010)

creo que mecatrodatos posteo antes algo en particular sobre el usb o tambien busca en el internet la pagina micros y mas micros ahi hay un ejemplo que usa en lugar de java visual basic. pero con todo el pedazito que pusiste me parece esta mal colocado revisa bien la sintaxis del programa por ahora no me acuerdo pero asi pude lograr la coneccion usb.si lo hicieras en proton esto lo deberias hacer asi mas o menos " claro esta que esta hecho con el easy hid si no lo tienes puedes descargarlo del internet sin problemas " 

```
' select MCU and clock speed
Device = 18F4550
Xtal = 48	

' descriptor file, located in \inc\usb_18 - a copy
' is located in the same folder as this file	
USB_Descriptor = "USBProjectDESC.inc"

' USB Buffer...
Symbol USBBufferSizeMax = 8
Symbol USBBufferSizeTX  = 8
Symbol USBBufferSizeRX  = 8
Dim    USBBuffer[USBBufferSizeMax] As Byte

' some useful flags...
Dim PP0 As Byte System        ' USBPOLL status return
Symbol CARRY_FLAG = STATUS.0  ' high if microcontroller does not have control over the buffer
Symbol ATTACHED_STATE = 6     ' is USB attached


' AQUI DEBES CREAR TUS VARIABLES Y ALIAS PARA TU PROGRAMA  <====



     
' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBPoll, USBIn or USBOut *
' * every couple of milliseconds or so                       *
' ************************************************************
GoSub AttachToUSB
ProgramLoop:
   GoSub DoUSBIn
   GoSub DoUSBOut
   GoTo ProgramLoop
  
' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
   USBIn 1, USBBuffer, USBBufferSizeRX, DoUSBIn
   
   'AQUI DEBEN IR TU PRCESO DE IDA A LA PC        <====
   
   Return
   
' ************************************************************
' * transmit data                                            *
' ************************************************************
DoUSBOut:   
   USBOut 1, USBBuffer, USBBufferSizeTX, DoUSBOut
   
    'AQUI DEBE IR EL PROCESO DEL UC AL PC     <====
   
   Return

' ************************************************************
' * wait for USB interface to attach                         *
' ************************************************************
AttachToUSB:
   Repeat								
      USBPoll		
   Until PP0 = ATTACHED_STATE
   Return
```


----------



## djxero (Dic 20, 2010)

Hombre  tienes que generar tus codigos con   EASY HID  QUE VIENE INCLUIDO en microcode studio
este programa te genera un plantilla en visual basic y  otra en pic basic   y una serie  mas de archivos que son necesarios para esta comunicacion.
MM  no se si podras implementar esto en java  pero creo k sip yaque visual basic hace una llamada a una libreria.


----------



## deniel144 (Dic 20, 2010)

gracias por sus respuestas bueno quiero manejar java por varias razones una de ellas me estoy especializando en este código ... ahora creo que se podría utilizar el easyhid voy a probar y les cuento como me va


----------



## deniel144 (Dic 21, 2010)

definitivamente no tendré que buscar mas opciones


----------



## yahir14 (Dic 28, 2010)

oye  amigo disculpa por la molestia pero estoy haciendo un sensor de temperatura de labview y me interesa como es que lo comunicas con labviw ya cheque el post que abriste de proyectos con labview pero la vdd estoy perdido con ese programa de echo lo poco que se es por lo e investigado por mi cuenta pero lo tengo que entregar en enero y pues si me sirvio tu post de programacion de echo el sensor ya lo tenia con un lm35 pero programadao en c la cuestion es que no se como mostrar esa informacion en labview mira te dejo la pag en donde puedes descargar el labview 2009 full www.somosmecatronica.net te vas a la parte de sofware y ahi  esta de entemano muchas gracias por la yuda que puedas brindarme


----------



## czapatasv (Dic 28, 2010)

Saludos a todos los miembros que leen este foro
Primeramente para todos una feliz navidad y mis mejores deseos para un nuevo año que nos viene seguramente de expectativas y retos, que Dios me bendiga a cada uno por su aporte desinteresado en compartir sobre microcontroladores y este lenguaje de Programacion PICBASIC que en verdad me ha ayudado a entender un poco mas la programacion comparada com ASM. Quisiera tambien aprovechar para solicitar una opinion para el siguiente codigo que consiste en un sencillo contador de 4 digitos y lo que necesito hacer es que cuente mas lento de lo que actualmente lo hace pues a pesar que me funciona no he podido hacer que cuente al menos con retardo de 1seg, notaran que las pausas que he dejado es para refrescar unos display de 7 segmentos, asi que, aca les va (sugerencias son muy bienvenidas)
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 
CMCON = 7        ; apagar comparadores puertoA
Segments   Var PORTB        ' Desde PORTB0-PORTB6 se conectan display de 7Segmentos
Digits     VAR PORTA           ' iran hacia la base de transistores PNP en este caso para Anodo Comun
i          var byte                ' contador 
n          var byte
Value      var word

TRISB = 0
TRISA = %11110000          ' puertos PORTA0 - PORTA3 como salida para los transistores
' Rutina principal para contar desde cero hasta 9999
MAINLOOP:
FOR Value = 0 to 9999
gosub Display
next Value
goto MAINLOOP

; subrutina para enviar el numero (0 - 9999) en Value
Display:
for i = 0 to 3     ' PARA MOSTRAR CUATRO DISPLAY
n = Value dig i    ' OBTIENE EL DATO MAS A LA DERECHA DESDE 0
gosub Display1     ' RUTINA DE CONVERSION
'pause 1            ' espera 1ms para refrescar rapidamente displays (subir este tiempo causa parpadeo)
next i
return

; subrutina para mostrar un digito en display; i=digito & n=numero a mostrar
Display1:
Digits = $ff
' CONVIERTE EL NUMERO A SIETE SEGMENTOS ANODO COMUN PARA ESTE CASO
lookup n,[$40,$79,$24,$30,$19,$92,$02,$78,$00,$18],Segments
' Ajustar el digito i to 0 (encendido) y el resto de los pins a 1 (apagado) logica para PNP
' ~ Bitwise NOT , funcion de negacion para cambiar el valor de Digits para la base del transistor
Digits = ~Dcd i    ' DCD RETURNA VALOR CODIFICADO SI i=2 ENTONCES 100
pause 1
return
end

Como les comento el codigo me trabaja pero la pausa de 1seg no me trabaja pues los display parpadean si pongo pausa ya sea en la subrutina de Dusplay1 o en la de Mainloop.
FELICES FIESTAS


----------



## J2C (Dic 28, 2010)

Czapatasv

El numero posterior a la sentencia "*pause*" indica en *MiliSegundos* el tiempo de Pausa, si deseas 1seg deberas cambiar el "1" por *1000 *. 

Saludos, JuanKa.-


----------



## czapatasv (Dic 28, 2010)

Gracias por vuestra respuesta Juan
Pues te comento que pense que eso me podria ayudar pero al cambiarlo sencillamente el parpadeo de los display de 7Segmentos es notable, quiero decir que el contador funciona pero en el protoboard se observa que se encienden y apagan los display. Entonces no logro entender donde ubicar la pausa de 1000mseg para lograr el efecto desado y que los display de 7 segmentos e vean como encendidos todo el tiempo y solo cambiando su valor.

CZ


----------



## J2C (Dic 28, 2010)

Czapatasv

La pausa deberia estar dentro del lazo *For ---> Next* y de esta forma tendrias 1 segundo visualizando cada numero contado, yo no puedo probarlo. Si igual ves el encendido y apagado del display en el cambio de un número al siguiente, deberíamos ver que más esta faltando.

Te debería quedar así:

for i = 0 to 3 ' PARA MOSTRAR CUATRO DISPLAY
n = Value dig i ' OBTIENE EL DATO MAS A LA DERECHA DESDE 0
gosub Display1 ' RUTINA DE CONVERSION
pause 1000 'pause 1 ' espera 1ms para refrescar rapidamente displays (subir este tiempo causa parpadeo)
next i
return



Saludos, JuanKa.-


----------



## atricio (Dic 28, 2010)

yahir14 dijo:


> oye  amigo disculpa por la molestia pero estoy haciendo un sensor de temperatura de labview y me interesa como es que lo comunicas con labviw ya cheque el post que abriste de proyectos con labview pero la vdd estoy perdido con ese programa de echo lo poco que se es por lo e investigado por mi cuenta pero lo tengo que entregar en enero y pues si me sirvio tu post de programacion de echo el sensor ya lo tenia con un lm35 pero programadao en c la cuestion es que no se como mostrar esa informacion en labview mira te dejo la pag en donde puedes descargar el labview 2009 full www.somosmecatronica.net te vas a la parte de sofware y ahi  esta de entemano muchas gracias por la yuda que puedas brindarme



mira en el foro de labview y pic basic ahi postie como debes hacer la comunicacion y lo unico que debes mandar al compu es la info del ADC leido por el micro y lo visualizes depende de ti si quieres en un termetro o un waveform chart


----------



## lanpu (Ene 8, 2011)

hola amigos,¿alguien sabe de alguna librería que me permita utilizar logaritmo en Pic Basic Pro??


Saludos! y gracias


----------



## Nano24 (Ene 11, 2011)

Saludos mecatrodatos la verdad era lo que buscaba una pagina donde encontrar de manera clara y sencilla la explicacion hacerca de PicBasic me han servido de mucho tus ejemplos para asi darme una idea de lo que vaya a realizar, tenia una pregunta amigo, se pueden transmitir datos via infrarrojos a otro pic con esos sensores de 3 pines que funcionan a 38KhZ?

Bueno el circuito que he dejado es muy sencillo 4 pulsadores y transmiten 3 codigos a b c el pic receptor compara y si es asi muestra en el lcd las letras a b c y el ultimo pulsador para limpiar, bueno espero que me puedas ayudar con esa duda, pues echando un vistazo por la web vi esto:

http://1.bp.blogspot.com/_vrRq6_c_e.../s1600/Esquema+emisor-receptor+infrarojos.png


----------



## Nano24 (Ene 11, 2011)

Bueno aqui comparto con los amigos del foro este circuito que realice, trata de un sistema para cerraduras el cual digitas un codigo de 4 numeros para acceder, si es correcto accede sino da una alerta, trae para guardar la clave en la EEPROM del pic para resetear solo basta con presionar * y para cambiar la clave presionar # pero antes pide la clave anterior para confirmar el nuevo cambio... la clave de fabrica es 1 2 3 4


----------



## atricio (Ene 11, 2011)

muchas gracias por los aportes tan ilustrativos y sirven para saber que el micro es para un sin fin de aplicaciones


----------



## chapin (Ene 11, 2011)

gracias nano24 buenos aportes


----------



## Dario (Ene 11, 2011)

hola gente del foro.
nuevamente yo por aqui solicitando su ayuda jeje... bueno, hace un par de dias me puse a practicar con uno de esos display P.O.V solo para ver que tal se veia en la realidad y la verdad que me gusto. pude proyectar un mensaje personalizado sin problemas y se veia muy bien. ahora me gustaria hacer que ese mensaje se desplazara en el display pero la verdad, no se como hacerlo. estoy usando microcode para programar ¿me dan una manito? el codigo es el siguiente:


```
Define Osc 4
CMCON = 7
TrisA=%00001111
TrisB=%00000000
PORTA = %00000000
PORTB = %00000000
repetir var byte

cartel:
for repetir = 1 to 1000
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00010000:pauseus 300
portb = 0:pauseus 300
portb = %00010000:pauseus 300
portb = 0:pauseus 300
portb = %00010000:pauseus 300
portb = 0:pauseus 300
portb = %11111111:pauseus 300
portb = 0:pause 2
portb = %01111110:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %01111110:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %10000000:pauseus 300
portb = 0:pauseus 300
portb = %10000000:pauseus 300
portb = 0:pauseus 300
portb = %10000000:pauseus 300
portb = 0:pauseus 300
portb = %00000000:pauseus 300
portb = 0:pause 2
portb = %11111110:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %11111110:pauseus 300
portb = 0:pause 4
next repetir
for repetir = 1 to 1000
portb = %01111110:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pause 2
portb = %01111110:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001110:pauseus 300
portb = 0:pause 2
portb = %10001110:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %01110001:pauseus 300
portb = 0:pause 2
portb = %11111110:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %11111110:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00011001:pauseus 300
portb = 0:pauseus 300
portb = %00101001:pauseus 300
portb = 0:pauseus 300
portb = %01001001:pauseus 300
portb = 0:pauseus 300
portb = %10001110:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00011000:pauseus 300
portb = 0:pauseus 300
portb = %00100100:pauseus 300
portb = 0:pauseus 300
portb = %01000010:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00011000:pauseus 300
portb = 0:pauseus 300
portb = %00100100:pauseus 300
portb = 0:pauseus 300
portb = %01000010:pauseus 300
portb = 0:pauseus 300
portb = %11111111:pauseus 300
portb = 0:pause 4
next repetir
goto cartel
end
```

saludosss y gracias pdeste codigo proyecta un mensaje y pasado un tiempo, el mensaje cambia)


----------



## Nano24 (Ene 12, 2011)

Bueno amigo ya la idea de la programacion la tienes, me imagino que lo que buscas es como armar el circuito, la verdad hace un tiempo pense en esos tipos de displays pero no tenia ni idea de como programarlos y viendo lo que hicistes pues parece facil la cuestion, echa un vistazo aqui  quizas te de una idea de la electronica del circuito:

http://microcoro.blogspot.com/2010/10/display-pov.html

http://arduinomdq.blogspot.com/2010_05_01_archive.html

otra pagina buena:  http://www.neoteo.com/los-mejores-montajes-de-2009-en-neoteo.neo

esta ultima esta un poco mas explicada:

http://www.ucontrol.com.ar/forosmf/proyectos-con-pic/display-pov/

Espero que te sirva de algo, saludos amigo.


----------



## Dario (Ene 13, 2011)

hola nano gracias por los links, ya los habia visitado antes. de hecho la idea del pov la saque de Ucontrol.
como decia en el post anterior, ya se como escribir mensajes en el display, lo que me gustaria ahora, es que el mensaje se desplace pero no se como lograrlo. ¿alguna idea?
saludosss


----------



## lubeck (Ene 13, 2011)

Hola Dario

A mi se me ocurre que hagas una pausa antes de comenzar un nuevo desplazamiento...
mas o menos asi...


```
Define Osc 4
CMCON = 7
TrisA=%00001111
TrisB=%00000000
PORTA = %00000000
PORTB = %00000000
repetir var byte

cartel:
[B]pause 500[/B]
for repetir = 1 to 1000
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00010000:pauseus 300
portb = 0:pauseus 300
portb = %00010000:pauseus 300
portb = 0:pauseus 300
portb = %00010000:pauseus 300
portb = 0:pauseus 300
portb = %11111111:pauseus 300
portb = 0:pause 2
portb = %01111110:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %01111110:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %10000000:pauseus 300
portb = 0:pauseus 300
portb = %10000000:pauseus 300
portb = 0:pauseus 300
portb = %10000000:pauseus 300
portb = 0:pauseus 300
portb = %00000000:pauseus 300
portb = 0:pause 2
portb = %11111110:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %11111110:pauseus 300
portb = 0:pause 4
next repetir
for repetir = 1 to 1000
portb = %01111110:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pause 2
portb = %01111110:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001110:pauseus 300
portb = 0:pause 2
portb = %10001110:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %01110001:pauseus 300
portb = 0:pause 2
portb = %11111110:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %11111110:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00011001:pauseus 300
portb = 0:pauseus 300
portb = %00101001:pauseus 300
portb = 0:pauseus 300
portb = %01001001:pauseus 300
portb = 0:pauseus 300
portb = %10001110:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00011000:pauseus 300
portb = 0:pauseus 300
portb = %00100100:pauseus 300
portb = 0:pauseus 300
portb = %01000010:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00011000:pauseus 300
portb = 0:pauseus 300
portb = %00100100:pauseus 300
portb = 0:pauseus 300
portb = %01000010:pauseus 300
portb = 0:pauseus 300
portb = %11111111:pauseus 300
portb = 0:pause 4
next repetir
goto cartel
end
```


----------



## Nano24 (Ene 13, 2011)

Ok Dario pues esa parte sino sabria decirte como pero el amigo lubeck te esta dando una mano por lo que veo   alguien sabe si se pueden enviar datos via infrarrojo de `pic a pic con la programacion SERIN ò SEROUT a 38Khz?


----------



## lubeck (Ene 13, 2011)

toda via no lo intento... pero por lo que he leido eso es en baudios, y deberian andar sobre de los 2400....  no se a cuanto equivaldria en Hz


----------



## Nano24 (Ene 13, 2011)

Pues si tienes razon en eso, para eso estoy usando un receptor de 38KHz segun vi en la web pues  usas el pic con el que mandas la señal y lo llevas al reset de un 555 modulado a 38Khz y el sera el portador de la informacion y el pic lo codifica pero loq nose es si con SERIN y SEROUT se logre enviar los datos. Mira esto:

http://robotypic.blogspot.com/2010/11/emisor-receptor-de-infrarojos-con-pic.html


----------



## lubeck (Ene 13, 2011)

> Pues si tienes razon en eso, para eso estoy usando un receptor de 38KHz segun vi en la web pues usas el pic con el que mandas la señal y lo llevas al reset de un 555 modulado a 38Khz y el sera el portador de la informacion y el pic lo codifica pero loq nose es si con SERIN y SEROUT se logre enviar los datos. Mira esto:



mmm...

pues teoricamente suena muy bonito....

pero se me hace mucho brinco estando el suelo tan parejo... segun entiendo con el timer genera el id del emisor...

pero eso se puede hacer efectivamente con el serin y el serout...  a menos que haya entendido mal...
mira yo hice el mismo proceso pero con modulos RF....

el problema que tuve no fue la comunicacion o programacion sino que las porquerias de modulos esos de juguete que venden no sirven para transmision formal de datos que era lo que yo pretendia...
pero por IR deberia haber menos problema....

hay otros esquemas mucho mas sencillos que el que muestras no se si necesariamente tenga que ser ese...


----------



## mecatrodatos (Ene 13, 2011)

Nano24 dijo:


> Saludos mecatrodatos la verdad era lo que buscaba una pagina donde encontrar de manera clara y sencilla la explicacion hacerca de PicBasic me han servido de mucho tus ejemplos para asi darme una idea de lo que vaya a realizar, tenia una pregunta amigo, se pueden transmitir datos via infrarrojos a otro pic con esos sensores de 3 pines que funcionan a 38KhZ?
> 
> Bueno el circuito que he dejado es muy sencillo 4 pulsadores y transmiten 3 codigos a b c el pic receptor compara y si es asi muestra en el lcd las letras a b c y el ultimo pulsador para limpiar, bueno espero que me puedas ayudar con esa duda, pues echando un vistazo por la web vi esto:
> 
> http://1.bp.blogspot.com/_vrRq6_c_e.../s1600/Esquema+emisor-receptor+infrarojos.png


 
Que tal si se puede desarrollar el programa pero en pwm con el registro CCP1 en el caso del pic 16f877A el Timer2 (TMR2), y PR2 (registro timer2 módulo período) se utilizan para establecer el período. 

Para determinar el tiempo necesario para generar una frecuencia de 38KHz, simplemente tome 1/38KHz, o un 38 /, 000. El resultado es 1 / 38, 000 = 0,000026316 (26.3uS). 
[/COLOR] Para calcular el valor a cargar en CCPRL1 de 38KHz @ 4 MHz con un ciclo de trabajo del 50%PR2 + 1) prescale TMR2 * * 50% = Ciclo de valor para CCPRL1, o
(25 + 1) * 1 * 0,50 = 26 * 0,50 = 13

el codigo en PBP hace funcion de los comandos  *SERin  * y *SEROUT  *


----------



## Nano24 (Ene 13, 2011)

aun sigo sin entender esa parte del PWM y el CCPRL1 ademas de manejar el TMR2, si me facilitaras algunos ejemplos que me ayudaran para iniciar mis propios proyectos de transmision de datos via infrarroja pues te lo agradeceria mucho mecatrodatos. De todas maneras gracias por la respuesta


----------



## Mushito (Ene 14, 2011)

Y donde esta el curso?


----------



## elcerdovaliente (Ene 21, 2011)

para tu circuito utilisas el max232 o es la conexion directa hacia el conector serie, soy nuevo en el foro y me gustaria saber como hiciste esa conexion gracias


----------



## JuanShoW (Ene 26, 2011)

hola a todos, me gusto mucho su foro!!!!
me gustaria que me comentaran si me pueden colaborar, para hacer un termohigrometro digital para conectarlo a una red zigbee, con pic y un sht71, en verdad lo que mas duro me a dado es entender el funcionamiento del sensor, si alguno de ustedes me puede ayudar o darme ideas se lo agradezco!!!!


----------



## tercules (Ene 29, 2011)

Excelente vuestro aporte amigos Estor trabajando con una incubadora  un pic  16f877A
Y un censor Lm35. es uno de sus aportes.
Lo  que les pido es que me  guíen com.  Lo siguiente: quiero agregar  a uno de los pines un relay,  este Pin quisiera que encienda  cada 3 horas por 10 minutos.  Les agradezco de antemano.


----------



## Dario (Ene 31, 2011)

lubeck dijo:


> Hola Dario
> 
> A mi se me ocurre que hagas una pausa antes de comenzar un nuevo desplazamiento...
> mas o menos asi...
> ...



bueno, despues de dejar el proyecto pov en pausa durante unos dias, he probado tu codigo lubeck. los resultados por ahora son negativos . no puedo hacer que el texto se desplace    
si se les ocurre alguna idea me avisan, mientras tanto, seguire rompiendome la cabeza buscando la forma de hacer que ese texto se desplace en el aire 
saludosss amigos.


----------



## Nano24 (Ene 31, 2011)

Quizas por lo que estas usando el PAUSEUS mejor cambialo por PAUSE y prueba a ver que pasa, yo la otra vez estaba trabajando con ese comando PAUSEUS y me ocasionaba muchos errores.


----------



## Dario (Ene 31, 2011)

si, pero si uso pause, no es igual el tiempo, ya que el pauseus es para tiempos en microsegundos y pause es para milisegundos. si uso pause, el led se vera como una linea y no como un pixel.
saludosss


----------



## Nano24 (Feb 3, 2011)

Bueno amigos aqui les dejo un aporte de un proyecto que me propuse a hacer con picbasic, se trata de un robot que evita obstaculos por infrarrojos, equipado con sensores de frecuencias a 38 Khz, PIC16F877A, L293, servos trucados, bueno les dejo unas fotos, los archivos hex y un video. Y aqui les dejo un enlace donde tengo el video del robot para que lo vean funcionando, me quedo muy limitado por falta de sensores, quizas si le agrara bumpers pues serviria para ayudar al robot cuando sus sensores no alcacen detectar algun objeto, nose mucho sobre robotica, apenas estoy empezando   

Aqui el enlace:


----------



## lubeck (Feb 3, 2011)

> los resultados por ahora son negativos . no puedo hacer que el texto se desplace




2 Dario...

Seguro? 
en este fin de semana hice uno y agregando un pausa... como  te comento (al principio del ciclo) se desplaza la posición... lo que faltaria a ese codigo para desplazarlo gradualmente seria ir incrementando esa pausa gradualmente... mas o menos asi...


```
Define Osc 4
CMCON = 7
TrisA=%00001111
TrisB=%00000000
PORTA = %00000000
PORTB = %00000000
repetir var byte
[B]Aumen var word
Aumen=0[/B]
cartel:
[B]pause Aumen[/B]
for repetir = 1 to 1000
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00010000:pauseus 300
portb = 0:pauseus 300
portb = %00010000:pauseus 300
portb = 0:pauseus 300
portb = %00010000:pauseus 300
portb = 0:pauseus 300
portb = %11111111:pauseus 300
portb = 0:pause 2
portb = %01111110:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %01111110:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %10000000:pauseus 300
portb = 0:pauseus 300
portb = %10000000:pauseus 300
portb = 0:pauseus 300
portb = %10000000:pauseus 300
portb = 0:pauseus 300
portb = %00000000:pauseus 300
portb = 0:pause 2
portb = %11111110:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %11111110:pauseus 300
portb = 0:pause 4
next repetir
for repetir = 1 to 1000
portb = %01111110:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pause 2
portb = %01111110:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001110:pauseus 300
portb = 0:pause 2
portb = %10001110:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %10001001:pauseus 300
portb = 0:pauseus 300
portb = %01110001:pauseus 300
portb = 0:pause 2
portb = %11111110:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %00010001:pauseus 300
portb = 0:pauseus 300
portb = %11111110:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00011001:pauseus 300
portb = 0:pauseus 300
portb = %00101001:pauseus 300
portb = 0:pauseus 300
portb = %01001001:pauseus 300
portb = 0:pauseus 300
portb = %10001110:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00011000:pauseus 300
portb = 0:pauseus 300
portb = %00100100:pauseus 300
portb = 0:pauseus 300
portb = %01000010:pauseus 300
portb = 0:pauseus 300
portb = %10000001:pauseus 300
portb = 0:pause 2
portb = %11111111:pauseus 300
portb = 0:pauseus 300
portb = %00011000:pauseus 300
portb = 0:pauseus 300
portb = %00100100:pauseus 300
portb = 0:pauseus 300
portb = %01000010:pauseus 300
portb = 0:pauseus 300
portb = %11111111:pauseus 300
portb = 0:pause 4
next repetir
[B]aumen=aumen+10
if aumen=10000 then aumen=0[/B]
goto cartel
end
```

Edito...
creo que la diferencia entre el mio y el tuyo es que yo le puse un opto abierto para indicarle al micro el inicio... como una especie de sincronizacion


----------



## atricio (Feb 3, 2011)

bueno el robotcito ojala puedas explicar un poquito mas lo de los sensores de proximidad


----------



## lubeck (Feb 3, 2011)

> bueno el robotcito ojala puedas explicar un poquito mas lo de los sensores de proximidad


podrias usar  el famosisimo CNY70


----------



## Dario (Feb 3, 2011)

> creo que la diferencia entre el mio y el tuyo es que yo le puse un opto abierto para indicarle al micro el inicio... como una especie de sincronizacion



si, el que estoy probando ahora, tambien tiene un sensor magnetico que le indica al micro en que momento comenzar.
ya probe de hacer un aumento gradual del pause y lo unico que consegui fue que el texto gire en el display... se me a ocurrido hacer una especie de animacion por cuadro de las letras y ahora estoy experimentando asi, aviso cuando lo logre jejeje.
saludosss y muchas gracias amigo


----------



## Nano24 (Feb 4, 2011)

Bueno voy a responder a la peticion del compañero, olvide colocar la explicacion de los sensores de proximidad del robot, como emisor coloque el NE555 a frecuencias entre 38Khz la cual es la que responden los sensores receptores, los receptores son los tipicos de 3 pines que funcionan a 38Khz, ahi dejo un video del emisor y una foto de los receptores y de como van alimentados.


----------



## atricio (Feb 4, 2011)

que pena sin audio el video lastima parece bueno sacame de una duda porque no genras esa frecuencia con el micro?????

y muchas gracias por atender esa curiosidad


----------



## Nano24 (Feb 4, 2011)

Bueno es verdad, no le agregue audio al microcontrolador pero claramente se ve lo que se necesita, ahora bien con lo que dices de generar la frecuencia con el microcontrolador pues nose como se hace, he estado pidiendo varias veces por aqui que me ayuden pero no he recibido respuesta, asi que decidi usar el NE555 ni modo  

jajajaja me equivoque era que no le agregue "audio al video" XD me confundi!!


----------



## lubeck (Feb 5, 2011)

> he estado pidiendo varias veces por aqui que me ayuden pero no he recibido respuesta,


Puedes usar el PWM interno del micro(si cuenta con el) en algun lado de este tema puse un link a una pagina que calcula los datos para los registros...

espero te sea un poco de ayuda... 
la verdad hace un rato que lo hice y ya no me acuerdo como era... pero  no esta complicado...


----------



## Nano24 (Feb 5, 2011)

Gracias lubeck luego chequeare a ver donde encuentro ese tema en el foro entonces, aun no he aprendido a usar el PWM he tenido muchos inconvenientes.


----------



## Dario (Feb 5, 2011)

> nose mucho sobre robotica, apenas estoy empezando



pues para estar empezando, la verdad es para felicitarte  .  dejame decirte que si el diseño del hardware y el software es tuyo, estas muy avanzado.

amigo lubeck: te cuento que estuve experimentando un poco mas con el codigo modificado que me pasaste, y logre hacerlo funcionar. con que habias cambiado los tiempos piyin...  eso esta muy bien ya que, no hay que darle el pez al hombre sino la caña y enseñarle a pezcar jejej  
ahora estoy viendo la forma de hacer que vaya desapareciendo letra por letra, en cuanto logre que funcione 100% bien, lo comparto aqui en el foro.


----------



## adrian sala (Feb 5, 2011)

Hola gente del foro, tengo un lcd en un TX Veronica con LCD, me vaje el archivo.HEX y programe el PIC16F84A y quiero ponerle el nombre de mi radio abajo y que quede fijo pero no tengo ni idea de programacion y la verdad que no me da el tiempo para aprender a programar y quiero saver si alguien podria tomarce la molestia de hacerme el favor de cambiarlo por mi ya que se me haria imposible aprender de la noche a la mañana solo para cambiar estas letras. 
dejo el archivo por si alguien quiere hacerme el favor y cambiar la linea de abajo y sacar unas letras que estan rotativas y ponerle FM Urbana y que este fijo y quede en el centro.

http://d01.megashares.com/dl/1b417af/TXFM-LM7001.hex

Pasword. electronica

Muchas gracias por las molestias.Saludos!


----------



## lubeck (Feb 5, 2011)

> me vaje el archivo.HEX y programe el PIC16F84A



A ver si entiendo bien... pero...

con solo el archivo .HEX no es suficiente para hacer lo que necesites por muy sencillo que sea...
necesitas proporcionar mas informacion... 
no tienes alguna simulacion o el link de donde bajaste el HEX???


----------



## adrian sala (Feb 5, 2011)

Ahora ya se por que pidieron las instrucciones del PIC sin compilar para poder modificar y solo suvieron el archivo hex. ahora entiendo por que uno tambien pidio algo mas al que lo iso y le dijo que se guardaba el derecho de código fuente.
_ https://www.forosdeelectronica.com/posts/207463/ __ https://www.forosdeelectronica.com/posts/207570/ _
es todo lo que tengo a mano. 
no es tan facil no?

Gracias de todos modos lubeck. Saludos!


----------



## lubeck (Feb 5, 2011)

> no es tan facil no?


no asi no es facil...

es decir no se realmente que haga el codigo... pero el tratar de descompilarlo es mucha mas dificil que si se hace uno por uno mismo.... y seguramente es algo muy sencillo...

de cualquier manera si pones algun esquema o comentas algo mas al respecto probablemente podramos desarrollarlo juntos....


----------



## adrian sala (Feb 5, 2011)

OK Muchas gracias, estare studiando sobre el tema y vere que consigo. Saludos


----------



## lubeck (Feb 5, 2011)

Ok.... estuve analizando superficialmente el caso...

en realidad el codigo del 84a debe ser una bafia(estupidez)... hasta donde entiendo, el secreto esta en interpretar o entender el funcionamiento del lm7001 que es el que se encarga de la sintonizacion del radio...

voy a intentar desifrar su funcionamiento casi por curiosidad y sin garantia ... (en realidad a mi no me llama la atencion eso de los radios)


----------



## adrian sala (Feb 5, 2011)

Que bueno, te paso el diagrama del LM 7001. Mucha suerte y gracias Compañero lubeck

Ver el archivo adjunto 26643

Saludos!


----------



## lubeck (Feb 5, 2011)

mmm.. un par de preguntas...

Lo tienes armado el circuito del daigrama que me pasaste????
Me podrias decir que estacion de radio FM se escucha mejor en la region en la que estas, es decir, la 101.5 o algo asi... para hacer un codigo que sintonice esa estacion.. si lo logramos lo demas is piece of cake!!

mmm otra cosa... 

no entraremos en dilema con derechos de autor o cosas asi... hay quienes son muy delicados... yo solo lo hago por el reto...

mmmm.. que paso amigo???

ya descifre el tren de pulsos del lm7001, pasame dos frecuencias de radio audibles....


----------



## CHR (Feb 5, 2011)

HOla que más a todos, meprodian ayudar, estoy haciendo un tacometro con el pic basic pro con el comando de COUNT, espero que me respondan gracias de antemano por la ayuda recibida


----------



## lubeck (Feb 5, 2011)

> estoy haciendo un tacometro con el pic basic pro con el comando de COUNT


y lo que llevas avanzado es...???

------
postea diagramas codigos, o en que consiste la solicitud de ayuda???


----------



## adrian sala (Feb 5, 2011)

Mira el transmisor ya esta armado, y e intentado comunicarme con el autor delcircuito y hece meses que no responde y segun vi no tiene drama para  modificar dicho archivo.
 en la frcuencia que transmito es 106.5.

Espero salga todo bien y gracias por la molestias lubeck.


----------



## lubeck (Feb 5, 2011)

> en la frcuencia que transmito es 106.5.



 primeros Ajustes... no es un receptor, verdad ??? es un transmisor... bue eso no importa....

solo es FM???...

(estoy haciendo un primer codigo que con los pulsadores se seleccionen dos frecuencias, digamos la 106.5 y la 100.5 en cuanto lo tenga lo subo y vemos los errores cometidos... )


----------



## Nano24 (Feb 5, 2011)

Pues si amigo Dario, el la circuiteria y la programacion fue ideada por mi, me costo mucho, me llevo meses investigando y probando, aun asi no quedo del todo como yo esperaba pero por lo menos fue algo, gracias por tu estimacion


----------



## adrian sala (Feb 5, 2011)

como si huvieses adivinado, estoy transmitiendo en esa frecuencia 100.5 y despues cuando me llegue la antena lo voy hacer en el 106.5. cuando lo tengas lo pruevo. gracias


----------



## lubeck (Feb 5, 2011)

Pues....

en el nombre sea de Dios....

espero que funcione....
solo es el hex... si se ve que funcione o haga algo subo el codigo fuente...

mmm..  edit....

me falto incluir los fuses con eso no tienes problemas para definirlos en el grabador o los agrego en el codigo???


----------



## adrian sala (Feb 5, 2011)

no hace falta, yo lo acomodo. mañana lo pruevo y te comento. Muchas gracias por las molestias tomdas.
la verdad que no esperaba una respuesta tan rapida.
Saludos y de nuevo te agradezco.


----------



## lubeck (Feb 5, 2011)

Vale... mañana lo comentamos...


----------



## Dario (Feb 6, 2011)

bueno, perdonen por seguir cortando sus comentarios con mi proyecto display pov pero, crei que era importante hacerles saber que por fin he conseguido hacer desplazar un texto en mi display pov. logre desplazar el texto, haciendo una especie de animacion cuadro por cuadro.
aca les dejo un video del funcionamiento y el codigo fuente.
saludosss amigos y gracias por vuestra ayuda 





NOTA: talvez el codigo sea demasiado largo para tan pocas letras pero es una prueba y todavia creo que se podria mejorar un poco mas.

```
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
 
CMCON = 7
TrisA=%11111111
TrisB=%00000000
PORTA = %00000000
PORTB = %00000000
Aumen var word
aumen=0
cartel: 
portb = 0
if porta.7 = 1 then 
gosub espacio
pause 1
gosub espacio
pause 1
gosub espacio
pause 1
gosub espacio
pause 1
gosub ache
pause 1
aumen=aumen+1
if aumen=20 then holin
endif
goto cartel

holin:
portb = 0
if porta.7 = 1 then
gosub espacio
pause 1
gosub espacio
pause 1
gosub espacio
pause 1 
gosub ache
pause 1
gosub O
pause 1
aumen=aumen-1
if aumen=0 then hol
endif
goto holin

hol:
portb = 0
if porta.7 = 1 then
gosub espacio
pause 1
gosub espacio 
pause 1
gosub ache
pause 1
gosub o
pause 1
gosub ele
pause 1
aumen=aumen+1
if aumen=20 then hola
endif
goto hol

hola:
portb = 0
if porta.7 = 1 then 
gosub espacio
pause 1
gosub ache
pause 1
gosub O
pause 1
gosub ele
pause 1
gosub a
pause 1
aumen=aumen-1
if aumen=0 then espacial
endif
goto hola

espacial:
portb = 0
if porta.7 = 1 then
pause 1
gosub O
pause 1
gosub ele
pause 1
gosub a
pause 1
gosub espacio
pause 1
gosub espacio
pause 1
aumen=aumen+1
if aumen=20 then espa
endif
goto espacial

espa:
portb = 0
if porta.7 = 1 then
gosub ele
pause 1
gosub a
pause 1
gosub espacio
pause 1 
gosub espacio
pause 1
gosub espacio
pause 1
aumen=aumen-1
if aumen=0 then retro
endif
goto espa

retro:
portb = 0
if porta.7 = 1 then
gosub a
pause 1
gosub espacio
pause 1
gosub espacio
pause 1 
gosub espacio
pause 1
gosub espacio
pause 1
aumen=aumen+1
if aumen=20 then retroced
endif
goto retro

retroced:
portb = 0
if porta.7 = 1 then
gosub espacio
pause 1
gosub espacio
pause 1
gosub espacio
pause 1 
gosub espacio
pause 1
gosub espacio
pause 1
aumen=aumen-1
if aumen=0 then cartel
endif
goto retroced




ache:
portb = %11111111:pauseus 100
portb = 0:pauseus 800
portb = %00010000:pauseus 100
portb = 0:pauseus 800
portb = %00010000:pauseus 100
portb = 0:pauseus 800
portb = %00010000:pauseus 100
portb = 0:pauseus 800
portb = %11111111:pauseus 100
portb = 0:pauseus 800
return
O:
portb = %01111110:pauseus 100
portb = 0:pauseus 800
portb = %10000001:pauseus 100
portb = 0:pauseus 800
portb = %10000001:pauseus 100
portb = 0:pauseus 800
portb = %10000001:pauseus 100
portb = 0:pauseus 800
portb = %01111110:pauseus 100
portb = 0:pauseus 800
return
ele:
portb = %11111111:pauseus 100
portb = 0:pauseus 800
portb = %10000000:pauseus 100
portb = 0:pauseus 800
portb = %10000000:pauseus 100
portb = 0:pauseus 800
portb = %10000000:pauseus 100
portb = 0:pauseus 100
portb = %00000000:pauseus 100
portb = 0:pauseus 800
return
a:
portb = %11111110:pauseus 100
portb = 0:pauseus 800
portb = %00010001:pauseus 100
portb = 0:pauseus 800
portb = %00010001:pauseus 100
portb = 0:pauseus 800
portb = %00010001:pauseus 100
portb = 0:pauseus 800
portb = %11111110:pauseus 100
portb = 0:pauseus 800
return

espacio:
portb = %00000000:pauseus 100
portb = 0:pauseus 800
portb = %00000000:pauseus 100
portb = 0:pauseus 800
portb = %00000000:pauseus 100
portb = 0:pauseus 800
portb = %00000000:pauseus 100
portb = 0:pauseus 800
portb = %00000000:pauseus 100
portb = 0:pauseus 800
return
end
```


----------



## atricio (Feb 6, 2011)

muy buena la presntacion, y creo que si hay como mejorarla dale que si puedes, y al amigo del tacometro busca un librito de programacion en pic basic de reyes ahi encuentras un ejemplo de lo que tu quieres saludos a todos


----------



## Nano24 (Feb 6, 2011)

Claro Dario esta muy bien hecha lo que falta es como dijo atricio mejorarlo mas nada, otra cosa, esta buena tu pagina sobre todo lo del robot hexadopodo con dos motores nada mas, que bien!! me has ahorrado para hacerme uno tambien con ese mecanismo


----------



## Dario (Feb 6, 2011)

jeje. gracias amigos, tratare de mejorarlo para que el desplazamiento sea mas parecido a lo que deberia ser


----------



## CHR (Feb 7, 2011)

Bueno al momento tengo esto: estoy tomando los pulsos mediante un optoacoplador.
mi problema es al armarlo en el protoboard, lo armo y lo pongo en funcionamiento pero me marca RPMs que no son , me sale que un motor de juguete esta girando a 45300 rpm y eso esta mal, y por lo menos deberia quedarse en ese valor no importa si varia una o dos rpms pero baja mucho o sube bastante. Por hay encontré que para hacerlo más preciso al disco que se usa se le hace más huequitos pero me pasa lo mismo. Le pregunte a mi maestro y me dijo que tengo que hacer un calculo dependiendo de los huecos que haga. Pero no se como hacer ese calculo, además que me explico que mi pic16F628A se esta saltando los pulsos y no avanza acontar todos y que por eso las lecturas erroneas.
De antemano gracias por la ayuda


----------



## lubeck (Feb 7, 2011)

> además que me explico que mi pic16F628A se esta saltando los pulsos y no avanza acontar todos y que por eso las lecturas erroneas.



concuerdo con tu maestro...

deberias utilizar un conformador de pulsos... se hace con un 7414 o ver si el 628a cuenta con una entrada schmit trigger (que es lo mismo que el conformador de pulsos) eso mejora mucho la calidad de los pulsos...

por otro lado considero que con un solo huequito o punto de referencia deberia ser suficiente...

hoy presisamente vi un tacometro... pero donde??? 

a si si...
mira la firma de dario..._ https://www.forosdeelectronica.com/posts/445534/ _
creo que en esa pagina lo vi... o algo relacionado a eso.... deja le doy una miradita a tus esquemas...


----------



## adrian sala (Feb 7, 2011)

hola lubeck, te cuento que todavia no he cargado el pic devido a que no tenia otro para gravarlo y no quise borrar el que tengo en el TX ya que tuve muchos problemas para que quedara grabado y no quiero gravar encima ya que esta andando de maravilla, cuando compre otro pic lo pruevo.

Gracias por las molestias tomadas. Saludos!


----------



## lubeck (Feb 7, 2011)

*2 adrian sala*


> cuando compre otro pic lo pruevo.



ok.. no te preocupes... 

si gustas en cuanto lo compres me agregas al msn (en mi firma esta mi direccion), pues si tengo curiosidad de echar a andar ese lm7001... y en cuanto tengamos resultados ponemos aqui el codigo... 
si te parece bien...

*2 CHR*

mira... yo veo un par de errores en tu diagrama y los corrijo en el anexo... o mas bien yo lo haria asi...

pd. el 628a si tiene schimit trigger en todo el puerto A... asi que cambie el phototransitor al A4

bueno checalo...
*EDIT...*
Me puse a revisar mas a fondo lo del tacometro... encontre mas errores...
pongo la rev2...


----------



## CHR (Feb 8, 2011)

Gracias por las correcciones, de los errores se aprende no, bueno con esto espero ahora si poderlo presentarlo XD

Me a salido una duda, me podrían explicar para que se ponen estos comandos:
@ Device   Intrc_Osc
@ Device   WDT_Off
@ Device   PIC16F628A
@ Device   Pwrt_On
@ Device   Mclr_On
@ Device   BOD_Off
@ Device   LVP_Off
@ Device   CPD_Off
@ Device   Protect_Off

gracias de nuevo por sus respuestas


----------



## lubeck (Feb 8, 2011)

Son los Famosos Fuses...

si usas el winpic800 veras tres pestañas.. una que dice Codigo, otra Datos y otra configuracion...

en la de configuracion veras unos botones a seleccionar... esos son los que llaman fuses...

cada micro tiene los suyos propios... en este caso el 628a esos le corresponden...
necesitas ver la ficha tecnica para ver el funcionamiento de cada uno... para modificarlos desde el codigo se pone eso de @ device... si no los pones en el codigo tienes que configurarlo en el winpic800...

te sugiero  leer algo y preguntar lo que no entiendas....


----------



## CHR (Feb 8, 2011)

Gracias por las explicaciones, me ayudan bastante


----------



## lubeck (Feb 8, 2011)

Ok...

mira esta ultima revision.... 
espero funcione... solo seria cuestion de ajustar las RPM a lo real... con el link de la firma de Dario da un metodo para hacer ese ajuste si mal no recuerdo....
creo que es todo en lo que puedo yo ayudar... suerte!!!


----------



## CHR (Feb 8, 2011)

Gracias por la ayuda, pero el calculo no es 2000ms por 30 para tener la equivalente de rpm, en el programa esta 600 por 1 no seria rpms, perdón por la duda pero asi me explico mi maestro que se saca con el calculo las rpms

aaa.. y una cosa mas por que los demas fuses estan off y solo mclr esta en on??


----------



## lubeck (Feb 8, 2011)

@ Device Intrc_Osc -> le dice que el oscilador que se utilizara es el interno del micro
@ Device WDT_Off -> este es el watch Dog o sea que si se pasma el micro se puede auto resetear... en el programa no estoy usando esta funcion...
@ Device PIC16F628A-> se defiene el tipo de pic a utilizar
@ Device Pwrt_Off -> el pwrt sirva para ahorrar energia en el micro ver ficha tecnica en este caso no se usa
@ Device Mclr_On->para usar ra4 como un puerto E/S o como reset del micro, en este caso como reset
@ Device BOD_Off-> Brown-Out ver ficha tecnica.. en este caso no se usa
@ Device LVP_Off->Low voltage progra sirve para grabar el micro con 5v o niveles TTL en este caso se programa con 12v (creo  desconozco que grabador tienes) asi que no se usa
@ Device CPD_Off->Protege los datos del eeprom para que no puedan ser leidos o pirateados en este caso no quedarian protegidos... para protegerlos seria _on
@ Device Protect_Off->Protege el codigo del micro para que no pueda ser pirateado...para protegerlos seria _on


----------



## Dario (Feb 8, 2011)

lubeck dijo:


> Ok...
> 
> mira esta ultima revision....
> espero funcione... solo seria cuestion de ajustar las RPM a lo real... con el link de la firma de Dario da un metodo para hacer ese ajuste si mal no recuerdo....
> creo que es todo en lo que puedo yo ayudar... suerte!!!



eh lubeck, que buena que esta tu version de ese  tacometro amigo
saludosss


----------



## CHR (Feb 9, 2011)

gracias por aclarar las dudas que me surgen

Bueno mi tacometro ya casi esta nada mas me falta calibrarlo y ya.
Bueno, ahora necesito que porfa me ayuden a programar una matriz 7x5 para que las letras se desplacen.
Encontre este diagrama pero no se me ocurre como hacerlo o como utilizarlo a maximo que he llegado a sido hacer números con la matriz siguiendo el libro de carlos A. reyes.
Les pido ayuda para poderlo realizar, ya que si me interesa realizar un letrero. gracias de nuevo por la ayuda recibida


----------



## adrian sala (Feb 11, 2011)

gracias lubeck por su aporte, le comento que proveel archivo que me preparo y anda ok el asunto que solo son esas dos frecuencias, por suerte Redfield29 el que progamo el original aparecio en el foro y respondio a mis pedidos. igualmente le agradezco por las molestias tomadas.
Saludos y Suerte!


----------



## lubeck (Feb 11, 2011)

> respondio a mis pedidos. igualmente le agradezco por las molestias tomadas.


.... igual te deseo suerte con el proyecto...
saludos

mmm si dices que funciono... 

este es el corazon del codigo para el lm7001.... quizas faltaria hacer un algoritmo mas proligo pero  bue...

```
@ device pic16f84A
@ device xt_osc 
@ device WDT_Off
@ device Pwrt_off
@ device Protect_off

TrisA=%10011
TrisB=%00000000

define osc 4 
DEFINE LCD_DREG PORTB 
DEFINE LCD_DBIT 0     
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 2    
DEFINE LCD_EREG PORTA 
DEFINE LCD_EBIT 3 

Up var porta.0
Dn var porta.1
CE  var portb.4
CL  var portb.5
DA  var portb.6

PortA=0
PortB=0

pause 100
Main:
if  not up then
 pause 500
 LCDout $FE,1
 lcdout $fe,$80,"Sintonizado" 
 lcdout $fe,$c0,"100.5"
 high ce
 
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  ;D0
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D1
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'D2
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'D3
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D4
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'D5
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'D6
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'D7
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'D8
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'D9
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D10
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D11
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D12
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D13
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'T0
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'T1
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'B0
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'B1
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'B2
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'TB
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'R0
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'R1
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'R2
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'S
 low ce
endif
if not dn then 
 pause 500
 LCDout $FE,1
 lcdout $fe,$80,"Sintonizado" 
 lcdout $fe,$c0,"106.5"
  high ce
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  ;D0
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D1
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D2
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'D3
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D4
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'D5
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D6
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D7
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D8
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D9
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'D10
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D11
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D12
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'D13
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'T0
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'T1
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'B0
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'B1
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'B2
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'TB
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'R0
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'R1
 DA=0:high Cl:pauseus 2:low CL:pauseus 2  'R2
 DA=1:high Cl:pauseus 2:low CL:pauseus 2  'S
 low ce
 
endif
goto Main
end
```


----------



## Nano24 (Feb 12, 2011)

Antes que nada un saludo a todos los que dan estos buenos aportes en el foro, quisiera que Dario o Lubeck me pudiesen ayudar con una idea de manejar el PWM para generar frecuencias a 38Khz, tengo el manual PicBasic pero no me ayuda mucho pues necesito una respuesta concreta, directa para generar esas frecuencias. O quizas si uso el generador de frecuencias FREQOUT tambien se pueda lograr?    la verdad aun estoy confundido en esa parte. Aprendiendo a generar esas frecuencias con el mismo PIC me evitaria montar un NE555 a la hora de elaborar algun circuito electronico con PIC.


----------



## mecatrodatos (Feb 12, 2011)

Que tal amigo primero muy impresionado por tu proyecto para ayudarte te propongo veas la siguiente pagina: 

http://www.rentron.com/Infrared_Communication.htm

si al leer la informacion hay dudas postealas por tiempo no he podido respondes a tus mensajes pero estamos prestos a colaboras en lo que podamos.


----------



## lubeck (Feb 12, 2011)

Complementando la informacion de mi estimado amigo mecatrodatos....
_ https://www.forosdeelectronica.com/posts/366099/ _
en ese post hay un link a una pagina que calcula los parametros para el PWM interno...


----------



## Nano24 (Feb 13, 2011)

Gracias mecatrodatos y tambien a ti lubeck, pronto me pondre a chequear con mucho detalle los link que me pasaron de seguro me sacaran de dudas.


----------



## Nano24 (Feb 14, 2011)

Si estoy en lo correcto o no mis amigos pues acepto sus opiniones  que de verdad las necesito, leyendo el articulo que me envio mecatrodatos y leyendo lo de lubeck, si mal no entendi creo que esta es la programacion para configurar el pic en modo de emitir frecuencias a 38Khz:


PBP Código:

'Configuración de PWM de hardware para el funcionamiento38KHz.

DEFINE OSC 4
DEFINE LOADER_USED 1 'para la programación decargador de arranque

INICIO:
TRISC.2 = 0     ' CCP1 (PortC.2 = Output)
PR2 = 25         ' Set PWM Período de aproximadamente 38KHz
CCPR1L = 13    'PWM conjunto de ciclo de un 50%
CCP1CON = %00001100    ' 'Modo PWM Seleccione
T2CON = %00000100       ' Timer2 = ON + 1:1 prescale
GOTO INICIO
END

Nada mas con este codigo realice el circuito en Proteus y use el osciloscopio para medir la frecuencia y me genera alrededor de los 38KHz por el puerto PORTC.2, tengo entendido que el dato que sigue para la parte de SEROUT seria para mandar al pic informacion modulada a traves de los 38KHz, asi como esta en el codigo original:

DEFINE LOADER_USED 1'para la programación decargador de arranque
DEFINE OSC 4
TRISC.2 = 0  ' CCP1 (PortC.2 = Output)
PR2 = 25     ' Set PWM Período de aproximadamente 38KHz
CCPR1L = 13 'PWM conjunto de ciclo de un 50%
CCP1CON = %00001100  ' 'Modo PWM Seleccione
T2CON = %00000100    ' Timer2 = ON + 1:1 prescale
TRISB.0 = 0

ADDRESS	VAR BYTE
DAT	VAR BYTE
ID	VAR BYTE
ADDRESS	= 10
ID	= 25

BEGIN:
	FOR DAT = 0 TO 255
	    SEROUT PORTB.0,4,[ID,ADDRESS,DAT]
	    PAUSE 100
	NEXT
	GOTO BEGIN
END 

Aqui les dejo el circuito para simular en proteus y el codigo compilado de una vez, echenle un vistazo para ver si es correcto que el pic genera dicha frecuencia, pueden compararlo con el circuito que guardare dentro de la carpeta NE555 que esta configurado para generar entre 34 a 40 Khz, ya lo he probado en la vida real y funciona para receptores de dichas frecuencias.

Otra cosa importante, les sugiero que reediten el archivo PBP y lo vuelvan a compilar, nose porque genera error, pero esta bien programado, bueno amigos espero que me puedan ayudar con esa duda y me hagan ese gran favor de ojear y probar el diseño para saber si estoy o no en lo correcto.


----------



## jferrero2001 (Feb 15, 2011)

Hola amigos, 
He leído y aprendido mucho en este foro, pero ahora tengo un problema (de novato) que no logro entender.
Deseo hacer un sistema para variar la luminosidad de leds, que tiene dos etapas: a) generar números 0-255 mediante un potenciómetro, b) aplicar estos números a PWM para variar el ancho del pulso.
Estoy en la etapa de leer el potenciómetro, adjunto el circuito en proteus y el programa en MStudio, PIC 16F84A.
EL PROBLEMA: Cuando voy subiendo el valor del potenciónmetro todo OK hasta 255. Cuando comienzo a bajar, desde 255 hasta 100 todo bien, pero a partir de ahí sigue mostrando tres dígitos, p.ej. si debe leer 90 indica 904; 85-> 853. 
Pensé que era problema de la simulación de proteus, armé el circuito en experimentor Y PASA LO MISMO. Ahora si reseteo cuando tengo la lectura "904", aparece 90, que sería la correcta, luego el problema está en el LCD. OTRA: he dimensionado la variable como word y como byte y es lo mismo...(como puede indicar 904 si la variable es byte???) Debe ser algo que estoy haciendo mal con el LCD... HELP PLEASE!!
Aquí el código para que no se molesten en descomprimir los adjuntos:

' LCD   PIN del 16F84A
' DB4        RA0
' DB5        RA1
' DB6        RA2
' RB7        RA3
' E          RB3
' RS         RA4
'
' DEFINICIONES
'
B0 var byte
'
' PROGRAMA PRINCIPAL
'
TRISA = 0     ' PORTA configurado como salida
TRISB = %00000001     ' PORTB configurado como salida salvo RB0
PAUSE 500     ' Espera 0,5 s para inicializar el LCD


LCDOUT $FE,1  ' Borra todo en el LCD
RPT:
b0=0          ' Rótulo para repetir
pot portb.0,255,b0
LCDOUT $FE,2             ' Manda cursor a ppio. línea
LCDOUT "lect ", dec B0 ' Muestra el valor en decimal

PAUSE 100               ' Espera 1 segundo

GOTO RPT                 ' Repite
END                      ' Fin del programa


----------



## jferrero2001 (Feb 15, 2011)

EDITO:
Encontré el problema: aparentemente no le daba tiempo de inicializar el LCD, coloque el PAUSE dentro del loop de escritura e hice otros pequeños cambios. Lo que va a continuación está funcionando correctamente en experimentor. Lo agrego por si es útil a algún otro novatito...

' PROGRAMA PRINCIPAL
'
TRISA = 0     ' PORTA configurado como salida
TRISB = %00000001     ' PORTB configurado como salida salvo RB0
PAUSE 500     ' Espera 0,5 s para inicializar el LCD


LCDOUT $FE,1  ' Borra todo en el LCD
RPT:           ' Rótulo para repetir
lect=0          
pot portb.0,255,lect
pause 500
LCDOUT $FE,1             ' Manda cursor a ppio. línea
LCDOUT "lect ", #lect ' Muestra el valor en decimal
GOTO RPT                 ' Repite



Gracias igual y saludos!!


----------



## alemayol (Feb 15, 2011)

hola tengo un problema con este control de tonos digital con pic esta en ruso anda de 10 pero en ruso y no entiendo nada alguien me podria ayudar a cambiar el idioma muchas gracias dejo aqui el link !
http://progcode.narod.ru/project/usil_628a.html

EL PIC ESTA EN ESPAÑOL PERO AY UNOS COMANDOS DE PROGRAMACION PARA EL control REMOTO QUE NO SE ENTIENDEN ...


----------



## lubeck (Feb 15, 2011)

aaaaaaaaahhhhh ruso..... facil  pense que ibas a decir chino.... :lol

bajate el google chrome lo traduce... creo que muy bien...no lo revice...


----------



## montoya8332 (Feb 16, 2011)

hola, me gustaria saber que editor y compliador usas , ya que yo tengo un programa llamado proton, pero no me funcionan tus ejemplos por error de sintaxis



mecatrodatos dijo:


> Que tal amigos uno de los lenguajes mas facil para programar micros es el basic pro sin despreciar el C por lo que abierto este hilo para empezar a ejecutar programas sencillos hasta llegar a los mas complejos.
> 
> miren lo facil que es prender un led con un pic 16f84A :
> 
> ...



Hola amigo, me gustaria saber que edityor y compilador usas, ya que yo tengo un programa llamado proton , y no me funciona ninguno de estos proyectos, siempre me da error de sintaxis


----------



## J2C (Feb 16, 2011)

Montoya8332

El titulo del thread te lo dice perfectamente y sin lugar a dudas: *Pic Basic Pro* , en cambio tu pruebas en otro Basic de otro proveedor Proton Basic !!!.-

Saludos, JuanKa.-


----------



## CHR (Feb 16, 2011)

Montoya8332:
E usado proton y para mandar 1logico pones PORTB.0=1, mientras que en microde pone HIGH PORTB.0.
Ambos son programas en basic pero con diferente sintaxis


----------



## alemayol (Feb 16, 2011)

hola me podrian ayudar con esto :s estoy perdido anda el volumen pero el control de tonos es desde un control remoto y no entiendo como grabas los codigos a la eeprom del PIC dejo link (traducido)
http://www.microsofttranslator.com/bv.aspx?ref=IE8Activity&from=&to=es&a=http%3a%2f%2fprogcode.narod.ru%2fproject%2fusil_628a.html


----------



## atricio (Feb 16, 2011)

pero cuales son tus problemas en conclusion explicate mejor


----------



## alemayol (Feb 16, 2011)

si em entra a ese link y fijate que avajo de todo dise de grabar los codigos en la eeprom del pic para que anda el control remoto porque cuando apretas la tecla del control remoto dise en la pantalla sys: y code:
esos numeros que te da ay ay que ponerlos en la eeprom del pic y no se como se hace sino esta este pero este esta en ruso lo que aparese en el diaplay se podra cambiar el idioma? dejo link 
http://www.microsofttranslator.com/bv.aspx?ref=IE8Activity&from=&to=es&a=http%3a%2f%2fradiokot.ru%2fkonkurs%2f054%2f

bueno el tema es asi colega yo arme esto que esta aca !http://www.microsofttranslator.com/bv.aspx?ref=IE8Activity&from=&to=es&a=http%3a%2f%2fprogcode.narod.ru%2fproject%2fusil_628a.html
(funciona volumen + y -) desde los swich (las teclas) que van al pic pero esto esta en protocolo rc5 de philips y cuando agarro un control remoto de philips paara bajar el volumen me da un codigo...
(volumen -) me da este codigo     SYS:0BH CODE:16H

(volumen +) me da este otro codigo   SYS:0AH CODE:2FH 

( SYS:0BH CODE:16H )  << ESTO VA EN LA EEPROM DEL PIC PARA QUE ENTIENDA AL CONTROL REMOTO 
 (SYS:0AH CODE:2FH)  <<

el tema es que no soy programador y no se como poner esos codigos que sale en el display en la eeprom que tiene interna el pic !! :S


----------



## lubeck (Feb 17, 2011)

> el tema es que no soy programador y no se como poner esos codigos que sale en el display en la eeprom que tiene interna el pic !! :S



Me parece que crees que con el archivo hex (compilado) es suficiente.... 

No es asi... N0...

el Hex es por asi decirlo el lenguaje del uC, por ejemplo Ruso... el picbasic que es de lo que trata este tema es como un traductor de tu lenguaje (español) al ruso... para traducir del ruso(hex) al español (picbasic) se requiere de un destraductor(descompilador) los cuales nunca han sido faciles de usar ni de encontrar....

si no tienes el codigo fuente en picbasic(español) es mas facil hacer tu propio codigo....


----------



## banistelrroy (Feb 17, 2011)

Hola a todos en el foro veo que es muy importante todos sus comentarios pues aquí les traigo una duda he tomado un ejemplo de este tema para ser más específicos de la página 2 del ejemplo del honorable mecatrodatos es un mensaje en la cual debe mostrar un mensaje en desplazamiento he cogido su ejemplo pero al simularlo no funciona en proteus no se porque pero no veo nada en el LCD…adjunto todo lo necesario a ver si me pueden decir porque es que no funciona en especial a mecatrodos

; proyecto 5

; visualizacion de un texto con desplazamiento en el LDC CON PIC 16F84a 


; CONFIGURACION PARA LA PROGRAMACION DEL PIC 
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

' Define registros y bits del LCD

Define LCD_DREG PORTB
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5

PAUSE 200 ; RETARDO PARA QUE INICIALIZE EL LCD

;creacion de variables 

A var byte
B var byte

; configuracion del LCD

LCDOUT $FE,$7 ; desplazamiento izquierdo
LCDOUT $FE, 1 ;LIMPIA LCD

; inicio del programa

LOOP:
LCDOUT $FE,$91 ; ubicar cursor en la casilla 18
for a =0 to 18
lookup a,["CURSO PIC BASIC PRO"],B
LCDOUT,B
PAUSE 500
NEXT
GOTO LOOP

invoco a a los miembros para ver el porque no funciona en proteus


----------



## Nano24 (Feb 18, 2011)

Cambia la configuracion de los bits a ver si cambia la cuestion y te sale el texto, yo siempre uso esta y no falla para nada:

Define LCD_DREG PORTB
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 3
Define LCD_EREG PORTB
Define LCD_EBIT 2

Sino fijate bien en la parte del ciclo FOR donde le dices a la variabla que vaya de 0 a 18, bueno modifica esos valores a ver si se resuelve.

Otra cosa define tambien la salida, coloca un TRISB=0 asi le diras al micro que todo el puerto B lo usaras como salida.

Decidi rebisar y vi unos errores que tenias en cuanto al posicionamiento de los caracteres en cada casilla del modulo LCD tenias un error que decia LCDOUT $FE,$7 y no era asi, tenia que ser LCDOUT $FE,$2 eso indica que la escritura va desde la primera linea, aparte el texto que tenias era muy grande para la LCD que va de 0 a 16 y tu texto sobre pasaba el limite, por eso la palabra PRO la centre pero en la linea inferior, y lo tienes configurado es para que el texto se muestre letra por letra. Mira este video que te va a ayudar mucho con los modulos LCD, por lo menos a mi me ayudo a entender lo basico.


----------



## yager (Feb 18, 2011)

Hola a todos , necesito de su ayuda con este  proyecto que realize que tiene las sgtes caracteristicas
 - temporizador regresivo programable de 2 a 12 horas (por defecto 2 h)
 - en modo reloj asignacion de AA:00 hasta BB:00 horas
todo esto con pic16f628a y visualizacion en 4 displays  
en proteus todo ok ,pero ya hice la placa con PCB wizard lo arme y no funciona alguien que pueda orientar por fa o que esta hecho mal ,ya se que se podia simplificar mas la programacion pero aun no domino todos los comandos del PBP,
adjunto simulacion y el programa


----------



## CHR (Feb 18, 2011)

Hola con todos de nuevo, disulpen la molestia pero necesito que porfa me expliquen algo de como usar el Timer1 del PIC16F628A, con respecto a como usar no tengo ninguna idea así que que agradecería que me ayudasen con ejemplos de proteus o alguna cosa para entenderlo mejor.
Gracias por la por la ayuda recibida de antemano.


----------



## banistelrroy (Feb 19, 2011)

gracias nano24 tienes razon la programacion tenia herrores el ejemplo es para mostrar caracter por caracter lo cogi de la pagina 2 del ejemplo que dejo mecatrodatos bueno gracias por la ayuda .........he modificado lo que decis y funciona gracias....


----------



## Nano24 (Feb 19, 2011)

De nada banistelroy espero que veas el video que subi tambien, ahi explican paso a paso como hacer que un texto se desplace en la pantalla LCD hay uno que otros detalles para que te enteres de como usa el LCD


----------



## Dario (Feb 21, 2011)

hola amigos.
¿alguno de ustedes me podria dar una idea de como configurar un pic12f683 para leer una tension desde un potenciometro? se cuales son las instrucciones que devo usar para leer la tension, pero no se como configurar las entradas analogicas del pic  ¿me ayudan?
saludosss


----------



## lubeck (Feb 21, 2011)

Hola Dario 

Revisa el datasheet pagina 33

el comando deberia de ser Ansel=XXXXXXXX

donde XXXXXXXX segun datasheet deberia ser....

bit7-No usado
Bit 6-4 el FOsc
Bir 3-0 se define el puerto como analogo o digital... el GPI0 al GPI4

segun lo que necesites...

espero estar bien .... hace mucho simule ese pic...


----------



## Dario (Feb 22, 2011)

hola lbeck.
bueno, estos son los resultados que he obtenido y asi quedo mi experimento... me parece que algo le falta al programa, ¿estara bien asi? ¿que opinas? dejo la simulacion en proteus, se trata de un led que varia el tiempo de encendido y apagado segun la posision del pote
saludosss


```
@ DEVICE pic12F683, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, bod_off, protect_off
 pulso var gpio.1
 pote var GPIO.0
 volt var byte
 ANSEL = 000001     
	  
 mainloop:
	ADCIN pote, volt
	high pulso
	pause volt
	low pulso
	pause volt
 Goto mainloop 
	  	   End
```


----------



## Nano24 (Feb 22, 2011)

te felicito Dario esta muy bien tu circuito y la programacion que has colocado me ayudado a entender un poco mas las combinaciones que se pueden agregar en este lenguaje    no sabia que a una variable de peso byte se le podia colocar como pausa, asi como lo tienes ahi:

volt var byte 

y luego mas abajo en el loop lo tienes en 

pause volt  wuao   gracias por esos detalles brindados. Por cierto Dario que quiere decir el comando ANSEL?? a que se debe eso?


----------



## Dario (Feb 22, 2011)

gracias nano 
segun lo poco que logro entender en el datasheet, seria un comando para habilitar/deshabilitar las entradas analogicas del pic. segun el datasheet, ansel seria una abreviacion de: ANALOG SELECT register.
saludosss


----------



## Nano24 (Feb 22, 2011)

ah ok entonces dependiendo del PIC que se use hay que mirar la datasheet y ver que opcion nos da para activar las entradas analogicas, de ahora en adelante prestare mas atencion a las hojas de datos de los microcontroladores, una pregunta Dario: no sabes si una web cam se puede conectar directamente a un pic? o hay que usar ajuro un RS232 y manipular el pic + la camara con un programa de visual basic? yo hace mucho tiempo he tenido las ganas de hacer un robot con vision a traves de una camara, pero suena dificil y mas hacerlo en picbasic.


----------



## Dario (Feb 22, 2011)

> de ahora en adelante prestare mas atencion a las hojas de datos de los microcontroladores


jeje... si, yo tambien, nunca les habia prestado atencion 



> una pregunta Dario: no sabes si una web cam se puede conectar directamente a un pic? o hay que usar ajuro un RS232 y manipular el pic + la camara con un programa de visual basic?



 la verdad que no se... supongo que si... alguno de los foristas ¿sabe si se puede?



> yo hace mucho tiempo he tenido las ganas de hacer un robot con vision a traves de una camara



si lo que queres es ver en tu pc lo que ve el robot, yo te recomiendo esta idea: te compras un capturador de video usb, y una camara de vigilancia inalambrica y listo... lo del control por PC se lo dejamos a lubeck que en eso es un genio jajaja  
aca hay un post donde lubeck ayudo a un forista a controlar un minihelicoptero mediante pc, usando visual basic, el solito. jajaja
saludosss


----------



## Nano24 (Feb 22, 2011)

Muy bueno de verdad la cuestion publicada en el foro, vaya lubeck sabe programar en visual basic   a mi me a costado aprender jaja gracias Dario seguro servira para algo la info


----------



## atricio (Feb 22, 2011)

se la ve muy muy interesante ojala pudieran postear algo si se puede controlar una variable analoga desde el visual podemos hacer como un control de teperatura o algo asi


----------



## Nano24 (Feb 23, 2011)

Hola amigos tengo una duda y agradeceria mucho la ayuda ya sea de Dario o Lubeck y de cualquier otro que me pueda ayudar en visual basic y picbasic, la cosa es que hice un programa en visual basic para mandar datos por el puerto serie DB9, todo funciona muy bien y tiene los pulsadores para simular, quiero realizar la simulacion en proteus de que cuando yo acciono dicho pulsador del programa VB deberia encender el LED en proteus, la programacion quedo bien del proteus y aun asi no entiendo porq mis programas no se comunican entre si?   ahi les dejo el ejemplo, por favor ayúdenme.


----------



## lubeck (Feb 23, 2011)

> la programacion quedo bien del proteus y aun asi no entiendo porq mis programas no se comunican entre si?


Nano a simple vista creo que te podria faltar el puerto virtual ....
 estoy revizando tu codigo mientras tanto dale una visitada a esto...

https://www.forosdeelectronica.com/f24/solo-ejemplos-picbasicpro-proteus-39938/#post331663


----------



## Nano24 (Feb 23, 2011)

Ok Lubeck te agradeceria mucho tu ayuda, yo me descargue de la web el Libro de Oro que habla todo sobre Visual Basic pero yo aprendo rapido es con cosas mas directas observando ejemplos, como se haria para mantener un LED encendido mientras un command button se mantiene presionado y si se suelta el command button el led se apague? bueno espero no estar pidiendo mucho


----------



## lubeck (Feb 23, 2011)

> el Libro de Oro que habla todo sobre Visual Basic


dudo mucho que hable de todo lo del visual basic.... mejor descarga el msdn.... ese si habla de todo y tiene ejemplos practicos de todo... y echo por microsoft....



> como se haria para mantener un LED encendido mientras un command button se mantiene presionado y si se suelta el command button el led se apague?



si necesitas un solo led que sea en en tiempo real utiliza el DTS o RTS del puerto, pero son solo dos...


----------



## Nano24 (Feb 23, 2011)

Bueno veras no entiendo mucho de lo que me dices, aparte el programa que coloque ahi de visual basic es de un ejemplo de un libro que tengo bueno le hice unos cambios al programa supuestamente deberia funcionar, use el puerto virtual que me dijistes y me fije un poco del programa que publicastes del LED controlado por VB y cuando presiono el command.1 se nota que envia el dato al RX del puerto virtual pero el LED no me enciende   es algo complicado estas cosas.

Sin muchas palabras mira aqui el circuito


----------



## lubeck (Feb 23, 2011)

> es algo complicado estas cosas



no es bien sencillo... pero cuesta mucho al principio... 

en lo que se batalla es en configurar los puertos...

fijate el puerto virtual si tiene conectados los dos puertos el com1 y el com2- el compimp de proteus debe estar configurado en un puerto y el control comm1 en otro puerto...


----------



## Nano24 (Feb 24, 2011)

Oye lubeck no sabes donde puedo descargar algun tutorial que me enseñe a manejar el visual basic con microcontroladores? he estado buscando pero aun nada no he consegui alguno en especifico. Saludos


----------



## lubeck (Feb 24, 2011)

> no sabes donde puedo descargar algun tutorial que me enseñe a manejar el visual basic con microcontroladores?



Mmm.. no entiendo que es lo que estas buscando... los microcontroladores no se manejan con el visualbasic hasta donde yo se... por eso del proton, PBP, etc.. etc

lo que se hace es utilizar un microcontrolador progamado en estos compliladores y utilizando el puerto paralelo USB o Serial para comunicarlo con el visual basic...

Eso Hasta donde yo se.... llevo poco menos de un año viendo esto y nunca habia escuchado tal cosa... espero haberte ayudado...


----------



## Nano24 (Feb 24, 2011)

De seguro no me supe explicar y me entendistes mal, pero bueno una ultima pregunta amigo lubeck, en el programa que usastes para encender y apagar el LED por visual basic como haria para mantener el LED encendido mientras mantengo presionado el boton y el LED se apague si suelto el boton? el que tienes esta programado para pulsar una vez y enciende, pulsas otra vez y apaga. Nose si me explique bien.


----------



## arturouc (Feb 25, 2011)

Nano24 dijo:


> De seguro no me supe explicar y me entendistes mal, pero bueno una ultima pregunta amigo lubeck, en el programa que usastes para encender y apagar el LED por visual basic como haria para mantener el LED encendido mientras mantengo presionado el boton y el LED se apague si suelto el boton? el que tienes esta programado para pulsar una vez y enciende, pulsas otra vez y apaga. Nose si me explique bien.



En VB existen diferentes tipos de eventos, estas utilizando el evento click y envias una orden por el puerto serie al micro para que encienda el led, cuando sueltas el boton del raton se genera otro evento que es el MouseUp y ahi puedes enviarle al micro que apague el led

pregunta: debe ser el puerto serie?, por que esto es mucho mas sencillo hacerlo por el puerto
paralelo, es basicamente la misma logica: cuando presionas un boton en VB activas un pin del puerto paralelo, este llega a una entrada del micro y el micro en su programa enciende el led y cuando se produce el evento MouseUp en VB desactivas el pin del puerto paralelo y el micro apaga el led....espero te sirva


----------



## Nano24 (Feb 25, 2011)

Gracias por la respuesta arturouc logre comprender lo que me dijistes y busque informacion en la web y me consegui con la opcion KeyUp y KeyDown la verdad me sirvio de mucho para entender un poco mas acerca de visual basic y manejar un micro con el programa. Ahi voy a dejar el ejemplo que hice, era lo que deseaba hacer.


----------



## czapatasv (Feb 26, 2011)

Compañeros todos de PicBasic, he tenido tiempo para leer este foro y en verdad es de mucha utilidad para aquellos que queremos aprender a programar PIC en picbasic , y me he topado con conocer mas de los comandos reservados (keywords) que aparecen en el Manual del Compilador de PICBASIC que solamente los enumera, pues seguramente para aquellos que ya tienen conocimiento de programacion no les cueste para nada dichas sentencias, y en ese sentido si alguien me puede orientar donde puedo conseguir ejemplos del uso de esas sentencias como por ejemplo:AUXIO; BANK0-15; CON; FLAGS; GET; GOT; IBIN; IDEC; IHEX; IS; ISBIN; R0-R8; RM1; RR1; SOFT_STACK (Appendix C Reserved Words) en donde algunas las encontre buscando en Basic Stamp pero otras aun no, asi que cualquier orientacion bienvenida será y muchas gracias


----------



## mecatrodatos (Feb 26, 2011)

Que tal compañero en http://melabs.com/ encontraras códigos que te podrán ayudar, por otro lado subo proyecto con del sensor Ds18b20 cuyo valor es mostrado en una lcd nokia 3310 uno de los proyectos y ayudas que le debía a mi amigo Dario que por cuestiones te tiempo vuelvo a replantear.


----------



## Dario (Feb 26, 2011)

> por otro lado subo proyecto con del sensor Ds18b20 cuyo valor es mostrado en una lcd nokia 3310 uno de los proyectos y ayudas que le debía a mi amigo Dario que por cuestiones te tiempo vuelvo a replantear.



muchas gracias por tu ayuda amigo mecatrodatos, lo tenia en pausa al proyectito jeje... en estos dias me pongo a ver si lo termino. tengo que conseguirme el proteus 7.5 sp3 para poder probar tu simulacion, ya lo estoy buscando. estoy seguro de que con ese ejemplito voy a poder terminar el proyecto y cuando lo tenga, lo posteo aqui para compartir. de nuevo, muchas gracias amigo.
saludosss


----------



## mecatrodatos (Feb 26, 2011)

Dario tienes que abrir el proyecto con el 7.7 y la librería del nokia 3310 ya la había posteado cuando preguntaste algo de las lcd NOKIA no me acuerdo de la pagina del foro esta

Por otro lado me llamo la atención el proyecto Pov con el mensaje Hola , encuentras aplicaciones practicas para la programación en Pic BASIC.


----------



## Dario (Feb 26, 2011)

> Dario tienes que abrir el proyecto con el 7.7 y la librería del nokia 3310 ya la había posteado cuando preguntaste algo de las lcd NOKIA no me acuerdo de la pagina del foro esta


tenes razon, no me acordaba jejeje... entonces, proteus, busco el 7.7 



> Por otro lado me llamo la atención el proyecto Pov con el mensaje Hola , encuentras aplicaciones practicas para la programación en Pic BASIC.


gracias amigo, eso trato de hacer. ahora estoy un poquito trabado con eso, no puedo hacer que se desplace linea por linea sin antes tener que escribir un extensisimo programa en pbp... la unica forma que tengo de lograrlo, es hacer como el programa que  lubeck me paso, ir aumentando el tiempo al pause, pero asi no puedo hacer que cuando llegue al limite se vaya borrando el mensaje linea por linea aca te dejo el codigo de lubeck con las modificaciones que hice para adaptarlo a mi pov por si te interesa, el programa lo que hace, es desplazar el texto hacia la derecha y luego lo desplaza hacia la izquierda.
saludosss 


```
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
 
CMCON = 7
TrisA=%11111111
TrisB=%00000000
PORTA = %00000000
PORTB = %00000000
Aumen var word
aumen=1
cartel: 
portb = 0
if porta.7 = 1 then 
pause aumen
gosub ache
pause 1
aumen=aumen+1
if aumen=60 then retrocede
endif
goto cartel

retrocede:
portb = 0
if porta.7 = 1 then 
pause aumen
gosub ache
pause 1
aumen=aumen-1
if aumen=0 then cartel
endif
goto retrocede





ache:
portb = %11111111:pauseus 100
portb = 0:pauseus 800
portb = %00010000:pauseus 100
portb = 0:pauseus 800
portb = %00010000:pauseus 100
portb = 0:pauseus 800
portb = %00010000:pauseus 100
portb = 0:pauseus 800
portb = %11111111:pauseus 100
portb = 0:pauseus 800
return
O:
portb = %01111110:pauseus 100
portb = 0:pauseus 800
portb = %10000001:pauseus 100
portb = 0:pauseus 800
portb = %10000001:pauseus 100
portb = 0:pauseus 800
portb = %10000001:pauseus 100
portb = 0:pauseus 800
portb = %01111110:pauseus 100
portb = 0:pauseus 800
return
ele:
portb = %11111111:pauseus 100
portb = 0:pauseus 800
portb = %10000000:pauseus 100
portb = 0:pauseus 800
portb = %10000000:pauseus 100
portb = 0:pauseus 800
portb = %10000000:pauseus 100
portb = 0:pauseus 100
portb = %00000000:pauseus 100
portb = 0:pauseus 800
return
a:
portb = %11111110:pauseus 100
portb = 0:pauseus 800
portb = %00010001:pauseus 100
portb = 0:pauseus 800
portb = %00010001:pauseus 100
portb = 0:pauseus 800
portb = %00010001:pauseus 100
portb = 0:pauseus 800
portb = %11111110:pauseus 100
portb = 0:pauseus 800
return

espacio:
portb = %00000000:pauseus 100
portb = 0:pauseus 800
portb = %00000000:pauseus 100
portb = 0:pauseus 800
portb = %00000000:pauseus 100
portb = 0:pauseus 800
portb = %00000000:pauseus 100
portb = 0:pauseus 800
portb = %00000000:pauseus 100
portb = 0:pauseus 800
return
end
```


----------



## MARCELINO74 (Mar 2, 2011)

Hola atodos los del foro, estoy haiendo un prollecto con lcd y necesito poner la leta ñ o Ñ en una pantalla lcm 2 x 16. Si aguin lo ha hecho . Se lo agradesco.


----------



## Dario (Mar 2, 2011)

te recomiendo que busques en este mismo post, ya se han tratado proyectos con lcd´s
saludosss


----------



## MARCELINO74 (Mar 2, 2011)

Hola D@rio, ya estuve investigando en post y no encontre, lo que encontre es un programa para hacer caracteres en Matrix de led, no me ayuda por el momento . si tienes algo para la "ñ" en LCD te lo agradesco


----------



## J2C (Mar 2, 2011)

Marcelino74

Pues debes fijarte en la *Datasheet* (Hoja de Datos) del *Display 16 x 2* que utilizarás en tu proyecto.

Todas las datasheet's siempre tienen una tabla con la correspondencia entre los códigos de carácteres y los pattern's almacenados en la memoria del controlador propio del display.

Saludos, JuanKa.-

de


----------



## Dario (Mar 2, 2011)

ok, me parece que entendi mal tu mensaje. el problema que tenes, es que no podes mostrar solo la letra ñ en tu lcd?


----------



## boby1356 (Mar 2, 2011)

Hola a todos. Quiciera solicitar ayuda con un conteo de pulsos externos con el TMR1 de un pic 16f628, estoy intentando hacer un frecuencímetro. Hasta ahora he logrado poner a trabajar el TMR0 generando interrupción cada 1 segundo y mostrandolo en un LCD; ahora lo que no sé es como y donde colocar el valor contado por el TMR1 para luego ser mostrado por el LCD  este es mi programa. Mil gracias a todos los que puedan colaborarme.




> cmcon = 7
> frec var word
> frec1 var word
> frec2 var word
> ...


----------



## MARCELINO74 (Mar 2, 2011)

la pura Ñ estoy haciendo un proyecto pic-plc-lcd . pero tengo que mostrar la palaba TEÑIDO  en el proceso de teñido


----------



## Nano24 (Mar 2, 2011)

Pues te digo marcelino que no creo que tu lcd vaya a poder colocar esa letra "Ñ" ya he probado y no sale, vas a tener que usar un sinonimo de "teñido", total es lo mismo  

sinonimo de teñido:

manchado, pintado, coloreado, pintarrajeado.


----------



## MARCELINO74 (Mar 3, 2011)

GRACIAS . Nano24, la idea de los sinonimos es buena


----------



## picaficionado (Mar 6, 2011)

Para MARCELINO 74:

EN LAS LCD 2X16 no es posible la Ñ en mayúscula pero si por ejemplo escribes Teñido, la ñ en minúscula corresponde al código ASii 238.


----------



## Nano24 (Mar 7, 2011)

Que raro a mi ni en minuscula logro salir la ñ  sale es un simbolo extraño. 

ahaha quise decir que NO logro salir la letra  me confundi


----------



## javierdavid2006 (Mar 7, 2011)

Hola foreros, necesito su ayuda en el manejo de interrupciones en Picbasic, tengo que manejar 2 interrupciones, la una corresponde a un pulsador que cuando es activado desenergiza una bobina, y la otra consiste en que cuando llega una comunicacion serial por parte de una computadora, el pic le ponga atencion a lo que dice, el problema que tengo es que no se como diferenciar las interrupciones, ya que con la frase "on interrupts goto"siempre va al mismo punto, me pueden ayudar en esta parte.

Gracias
David Nunez
Ecuador


----------



## MARCELINO74 (Mar 8, 2011)

Grácias por los comentarios, en contre en la pagina 2 de este curso algo que me ayudo, se explica como hacer caracteres especiales, de lo cual investigue en la red y encontre en esta pagina:

Creación de nuevos caracteres en LCDs alfanuméricos.

Algo facil de entender.

Hice el caracter y lo grave en la memoria C GRAM.

No subo la simulacion porque no se, si me dicen . . .  la subo


----------



## MARCELINO74 (Mar 8, 2011)

Dejo el archivo de la letra ñ
Ver el archivo adjunto Letra Ã‘.rar

Agrego la imagen de TEÑIDO
Ver el archivo adjunto Letra Ã‘.rar


----------



## Nano24 (Mar 9, 2011)

Bueno eso de usar la memoria de la LCD no la entendí, hice unas simulaciones de mostrar dos figuras diferente en la linea de arriba y la de abajo y me daba un error, ambas figuras se salteaban, así que desistí de empecinarme con las memorias de la LCD 

Que buen aporte Marcelino esto me ayudara un poco a experimentar con las LCD ota vez, es verdad que las GLCD no se pueden programar con Picbasic? que solo se puede en MikroBasic?


----------



## picaficionado (Mar 12, 2011)

muy buen aporte, pense que no se podia hacer


----------



## 31587 (Mar 12, 2011)

HOLA necesito porfa una ayuda con respecto a la instruccion PWM para ir incrementando el voltaje de un voltio hasta llegar a 5 voltios en el puertos RB0 a RB5 en el pic 16f877.


----------



## jeancarlos_54 (Mar 13, 2011)

_quisiera saber si alguien sabe de comunicacion SPI entre 2 pic´s 16f877a(POR INTERRUPCION), entiendo toda la logica k emplea este tipo de comunicacion excepto la parte la transmision y recepcion de datos, se k el maestro pone en bajo("o"logico) la linea de control (SS) para indicarle al esclavo q quiere enviar o recibir datos.. pero mi duda esta en q ambas partes reciben datos simultaneamente y estos se cargan en el registro SSPBUF ???? ....cualquier aporte es bien recibido, si cuentan con algo programita similar se los agradeceria eternamente....Graxxx de antemano _


----------



## arturouc (Mar 16, 2011)

31587 dijo:


> HOLA necesito porfa una ayuda con respecto a la instruccion PWM para ir incrementando el voltaje de un voltio hasta llegar a 5 voltios en el puertos RB0 a RB5 en el pic 16f877.



PWM puerto.bit, velocidad, ciclos
PWM puertoc.7, (0-255), numero entero
en velocidad un cero seria o volts, un 255 seria 5 volt, un 127 seria 2.5 volts
ecuacion      voltaje = (velocidad/255)*5


----------



## atricio (Mar 16, 2011)

alguien me pudiera explicar por favor como configurar el pwm con los modulos de pwm del micro estoy elaborando un seguidor quisiera lograr controlar la velocidad con estos modulos para los motores gracias de antemano estoy pensando usar un 16F873 o un 16F877A


----------



## arturouc (Mar 17, 2011)

atricio dijo:


> alguien me pudiera explicar por favor como configurar el pwm con los modulos de pwm del micro estoy elaborando un seguidor quisiera lograr controlar la velocidad con estos modulos para los motores gracias de antemano estoy pensando usar un 16F873 o un 16F877A



en elpost anterior #1017 esta la explicacion, si estas utilizando pic basic pro es todo lo que necesitas
PWM PUERTO.BIT, VELOCIDAD (0-255), CICLOS


----------



## atricio (Mar 18, 2011)

gracias por atender la pregunta pero quisiera saber como generar el pwm con los modulos ccp1 y ccp2 que poseen estos micros ya que la generacion de este pwm es por hadware ojala me puedan sacar de la duda


----------



## Nano24 (Mar 18, 2011)

Seria bueno que abrieran temas así para aprender a manejar esos módulos, no se que es eso de ccp1 y ccp2 tampoco.


----------



## atricio (Mar 19, 2011)

un poco que pude revisar son modulos dediccados para poder generar pwm con los que son generados por hadware y no por software incluso con unos companeros realizamos un dimer con estos modulos para generar los pulsos necesarios para un opto y este pasarlo a un triac la verdad yo le vi muy util pero la verdad no se usarlo bien


----------



## arturouc (Mar 19, 2011)

atricio dijo:


> gracias por atender la pregunta pero quisiera saber como generar el pwm con los modulos ccp1 y ccp2 que poseen estos micros ya que la generacion de este pwm es por hadware ojala me puedan sacar de la duda



ya entendi lo que buscas...
yo estoy haciendo algo parecido, timmer1 para el encoder y timmer2 para el PWM

http://ww1.microchip.com/downloads/e...Doc/33023a.pdf 
pag. 216 ejemplo del modulo pwm

en espaniol
http://es.scribd.com/doc/101179/pic16f877-en-espanol2

ESTOS EJEMPLOS ESTAN EN ENSAMBLADOR...PERO LOS QUIERO HACER CON
PIC BASIC PRO


----------



## arturouc (Mar 20, 2011)

esta la instruccion HPWM
lo que es no conocer...
HPWM es pwm por hardware que es lo que necesitamos

mas datos del CCP
http://ww1.microchip.com/downloads/en/AppNotes/00594b.pdf

http://ww1.microchip.com/downloads/en/DeviceDoc/41214a.pdf


----------



## atricio (Mar 20, 2011)

tienes razon ese pero he intentado hacerlo pero no encuentro la forma de como configurarlo bien tienes alguna idea de como hacerlo por favor gracias


----------



## autotronico (Mar 20, 2011)

Que tal aqui encontras la informacion para la utilizacion del modulo CCP:

http://www.rentron.com/Infrared_Communication.htm


----------



## arturouc (Mar 20, 2011)

atricio dijo:


> tienes razon ese pero he intentado hacerlo pero no encuentro la forma de como configurarlo bien tienes alguna idea de como hacerlo por favor gracias



este ejemplo lo enconre en la red

define osc 4

DEFINE CCP1_REG PORTC '‘Hpwm 1 pin port
DEFINE CCP1_BIT 2 '‘Hpwm 1 pin bit
DEFINE CCP2_REG PORTC '‘Hpwm 2 pin port
DEFINE CCP2_BIT 1 '‘Hpwm 2 pin bit

DEFINE HPWM2_TIMER 1 '‘Hpwm 2 timer select

HPWM 1,127,1000 '‘ envie a 50% ciclo de trabajo PWM a 1kHz


----------



## autotronico (Mar 20, 2011)

arturouc dijo:


> este ejemplo lo enconre en la red
> 
> define osc 4
> 
> ...



En este programa no se esta utilizando el CCP sino la instruccion de HPWM de pic basic para ello se tendra que utilizar el PR2 para establer el ciclo util por ejemplo:


```
PORTA=0:TRISA=%00000001
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
ADCON1= %10001110 ‘
T2CON = %00000101
PR2=249
‘—————————————————————–
@ DEVICE PIC16F877A
@ DEVICE PIC16F877A, WDT_OFF
@ DEVICE PIC16F877A, PWRT_OFF
@ DEVICE PIC16F877A, PROTECT_OFF
@ DEVICE PIC16F877A, XT_OSC
‘—————————————————————–
DEFINE OSC 4


‘**************** ADC ************************
DEFINE ADC_BITS 10 ‘ 
DEFINE ADC_CLOCK 1 ‘ 
DEFINE ADC_SAMPLEUS 3 ‘ 

 
‘****************DEFINICION CCP*********************
DEFINE CCP1_REG   PORTC  ‘Hpwm 1 pin port
DEFINE CCP1_BIT     2 ‘Hpwm 1  pin bit
DEFINE CCP2_REG   PORTC  ‘Hpwm 2 pin port

DEFINE CCP2_BIT     1 ‘Hpwm 2 pin bit


 **********VARIABLES**********
HAM var word
X   VAR WORD
DUTY VAR BYTE
‘—————————————————————————

CCP1CON.2=1
CCP1CON.3=1

TIEMPO:
DUTY=50
GOSUB SALIDA

GOTO TIEMPO
SALIDA:
ADCIN 0,HAM
PR2=((1024-HAM)*/5625)/100+24

 X=(PR2+1)* DUTY /25
CCP1CON.4=X.0
CCP1CON.5=X.1
CCPR1L=x>>2
RETURN
```


----------



## arturouc (Mar 20, 2011)

autotronico
segun lo que lei en la red
HPWM 1,127, 1000
HPWM canal, dutycycle, frecuencia
el canal puede ser 1 o 2 segun el ccp que deseas utilizar
gracias por el codigo que publicaste...


----------



## atricio (Mar 20, 2011)

muchas gracias amigo genial voy a intentarlo como dije quiero variar la velocidad de un servo trucado disculpen seria posible que me ayuden con un circuitito por favor se puede hacer con el L293D lo voy a compilar ahorita y prubare el funcionamiento con respecto a eso que dice arturouc es verdad he leido que es asi lo que no sabia es como usarlo y activarlo


----------



## autotronico (Mar 20, 2011)

Lo que pasa es que si  desea utilizar este modulo por hardware se utilizan los resistros del mismo , los comandos de pic basic facilitan el codigo pero su desarrollo es por software, si deseas debatimos que tengo tiempo.


----------



## atricio (Mar 20, 2011)

disculpen compile el programa en micro code y no me compila me imagino que pic basic es diferente la sentencia eso en ensamblador lo vi pero no lo entendi bien debemos de ley colocar como salidas estas del micro que estemos usando


----------



## arturouc (Mar 20, 2011)

autotronico
esto lo acabo de leer el dia de hoy, todavia no he probado el funcionamiento, lo que lei es que con esta instruccion HPWM trabaja el modulo del pic PWM mientras tu programa puede realizar otras tares..

tendras algun codigo de ejemplo sobre utilizar el timer1 en modo de captura? 
asi podre leer el encoder del servo, conrolar su velocidad y realizar otras tareas

yo lo compile y todo bien 159 palabras usadas...

en el codigo de autotronico son los apostrofos '


----------



## autotronico (Mar 20, 2011)

atricio dijo:


> disculpen compile el programa en micro code y no me compila me imagino que pic basic es diferente la sentencia eso en ensamblador lo vi pero no lo entendi bien debemos de ley colocar como salidas estas del micro que estemos usando



que error aparece



arturouc dijo:


> autotronico
> esto lo acabo de leer el dia de hoy, todavia no he probado el funcionamiento, lo que lei es que con esta instruccion HPWM trabaja el modulo del pic PWM mientras tu programa puede realizar otras tares..
> 
> tendras algun codigo de ejemplo sobre utilizar el timer1 en modo de captura?
> ...



ya realizaremos el codigo


----------



## atricio (Mar 20, 2011)

debes estarlo compilando en otro porque yo en microcode no lo he logrado hacer tienes mucha razon al contrario del PWM el HPWM se pude hacer otras tareas sin necesidad de ingresarla de nuevo es muy util si se desea hacer algo con el modulo

sale este miralo


----------



## autotronico (Mar 20, 2011)

quita los fuses es problema del @ device

Atricio aqui esta el codigo la simulacion y el .hex


----------



## arturouc (Mar 20, 2011)

gracias por el ejemplo autotronico...


----------



## Nano24 (Mar 20, 2011)

autotronico dijo:


> quita los fuses es problema del @ device
> 
> Atricio aqui esta el codigo la simulacion y el .hex



Esta muy interesante lo que has publicado pero podrias poner con explicaciones y detalles cada linea de la programacion en codigo PBP, aparte que describas que significa eso de PR2 o CCP1 la verdad quiero aprender a manejar esos codigos pero ni idea de como se hace.


----------



## autotronico (Mar 20, 2011)

Principalmente estas lineas de código sirven para realizar proyectos con motores el amigo mecatrodatos menciono esto el control PID en algunas lineas de este post y coloco algunos circuitos pero no lo termino seria por tiempo...

¿Tendrás algún código de ejemplo sobre utilizar el timer1 en modo de captura? 

Aquí esta el código para utilizar el timer 1 del pic 16f877A como contador o modulo de captura 
	
	



```
CLEAR 
DEFINE OSC 4 
DEFINE LCD_DREG PORTD 
DEFINE LCD_RSREG PORTE 
DEFINE LCD_RSBIT 0 
DEFINE LCD_EREG PORTE 
DEFINE LCD_EBIT 1 
DEFINE LCD_RWREG PORTE 
DEFINE LCD_RWBIT 2 
DEFINE LCD_BITS 8 
DEFINE LCD_LINES 2 
DEFINE LCD_COMMANDUS 2000 
DEFINE LCD_DATAUS 50 

DEFINE CCP1 REG PORTC
DEFINE CCP1_BIT 2 

DEFINE ADC_BITS 8 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50 

ADCON1 = %00000111 
TMR1 VAR WORD 
ADVAL0 VAR BYTE 
ADVAL1 VAR BYTE

ADVAL2 VAR BYTE 
X VAR WORD  
Y VAR WORD  
PAUSE 500 
LCDOUT $FE, 1 

TRISC = %11110001 
CCP1CON = %00000101 
T1CON = %00000011 
PORTC.3 = 0 
PORTC.2 = 1

LOOP: 

ADCIN 0, ADVAL0 
ADCIN 1, ADVAL1 
ADCIN 3, ADVAL2 

IF ADVAL0>20 THEN 
HPWM 2, ADVAL0, 32000 
LCDOUT $FE, $C0, "PWM = ",DEC ADVAL0," " 
ELSE 
LCDOUT $FE, $C0, "PWM TOO LOW ",DEC ADVAL0," "
ENDIF

TMR1H = 0 
TMR1L = 0 
T1CON.0 = 1 
PAUSE 100

T1CON.0 = 0 
TMR1.BYTE0 = TMR1L 
TMR1.BYTE1 = TMR1H 
TMR1 = TMR1 - 11 
IF TMR1 = 65525 THEN NOSIGNAL 
LCDOUT $FE, $80, DEC5 TMR1," COUNTS" 

PAUSE 10 
GOTO LOOP 

NOSIGNAL: 
LCDOUT $FE, $80, "NO SIGNAL " 
GOTO LOOP 
END
```


----------



## arturouc (Mar 20, 2011)

excelente!!!! autotronico
muchas gracias....lo voy a analizar para entenderlo

le faltara esto para el HPWM?
DEFINE CCP2 REG PORTC
DEFINE CCP2_BIT 1

pregunta
se esta utiizando el ccp1 para captura? RC2 deberia estar en 1
o la captura se hace en la patita RC0 timmer1 como lo necesito
estoy tratando de comprender...


----------



## autotronico (Mar 21, 2011)

USO TIMER1 como un contador 

La operación de Timer1 como contador es similar a la operación de TIMER0. 
Sin embargo, el  Timer1 es un temporizador de 16 bits,  puede ser manipulado y cuenta a mayor velocidad. También se puede control con  rutinas TimerLoop y  Blinker Loop si el programa está diseñado para hacerlo. Sin embargo, la puesta en marcha de Timer1 es más complicada debido a las opciones más numerosas disponibles.

Las diferencias entre el uso de los dos temporizadores tienen que ver con la configuración del control de registros. Timer1 es controlado por seis registros, en comparación con tres del TIMER0. Los registros del  Timer1son los siguientes:

INTCON     interrupción registro de control
PIR1          registro periférica de interrupción 1 
PIE1          Habilita el registro de interrupción 1
TMR1L      byte bajo del contador de registro
TMR1H     byte alto del registro del temporizador
T1CON     Timer1 control de la interrupción


EL Modo de contador se selecciona mediante el establecimiento del bit TMR1CS. En este modo, los incrementos del contador de tiempo en cada flanco ascendente se establecen en la entrada de reloj del pin RC1/T1OSI/CCP2 , cuando el bit T1OSCEN se establece, o en el pin RC0/T1OSO/T1CKI, cuando el T1OSCEN se borra.

Tres de los pines en el 16F877A se puede utilizar como insumos para el modulo TIMER1 como contador:

1. Pin PORTA.4, la entrada de reloj externo (pin 6 en el PIC)
2. Pin PORTC.0, seleccionados mediante el establecimiento de TIOSCEN = 1
3. Pin PORTC.1, seleccionados mediante el establecimiento de TIOSCEN = 0

EL Timer1 se habilita estableciendo T1CON.0 = 1. Se detiene cuando este Bit esta apagado o con discapacidad.

El reloj que usará Timer1 es seleccionado por T1CON.1. El reloj externo
seleccionados mediante el establecimiento de este a 1. La entrada para este reloj externo debe estar en PORTA.4.

En resumen, ocho bits del registro de control del Timer 1 (T1CON), proporciona las siguientes funciones :

􀁎 Bit 7: No se utiliza y que se lea como un 0
􀁎 Bit 6: No se utiliza y que se lea como un 0
􀁎 Bit 5: Entrada pre-escalador
􀁎 Bit 4: Entrada de pre-escalador
􀁎 Bit 3: oscilador permite Timer1
􀁎 Bit 2: sincronización de reloj externo Timer1
􀁎 Bit 1: Timer1 selección de reloj
􀁎 Bit 0: Timer1 permite

Si las interrupciones no se van a utilizar todos los demás registros se puede ignorar y podemos establecer:

T1CON a % 00110001

El valor de estos bits se describe en detalle en el código que poste anteriormente para el amigo arturoau. 


En primer lugar vamos a definir todos los define que vamos a necesitar. Aquí todos los define se incluyen como ejemplo, pero no todos son necesarios.

Timer1 como contador. Timer1 cuenta las señales de un codificador del servomotor.

‘DEFINICIONES PARA EL FUNCIONAMIENTO DEL LCD

CLEAR 
DEFINE OSC 4 
DEFINE LCD_DREG PORTD 
DEFINE LCD_RSREG PORTE 
DEFINE LCD_RSBIT 0 
DEFINE LCD_EREG PORTE 
DEFINE LCD_EBIT 1 
DEFINE LCD_RWREG PORTE 
DEFINE LCD_RWBIT 2 
DEFINE LCD_BITS 8 
DEFINE LCD_LINES 2 
DEFINE LCD_COMMANDUS 2000 
DEFINE LCD_DATAUS 50 

Las siguientes dos líneas definen el pin que  se va a utilizar para la señal de HPWM que controlara la velocidad del motor. 

DEFINE CCP1  REG PORTC ‘definir la configuración de HPWM
DEFINE CCP1_BIT 2 ‘pin C1

Las siguientes tres líneas definen la lectura de los tres potenciómetros en el tablero.

Sólo el potenciómetro primero se utiliza en el programa, pero los otros son definidos de forma que los puede utilizar cuando se modifica el programa. Los potenciómetros son para cambiar el tiempo real.

Definir los valores de A2D

DEFINE ADC_BITS 8; número determinado de bits en el resultado
DEFINE ADC_CLOCK 3;  ajustar fuente de reloj interno (3 = rc)
DEFINE ADC_SAMPLEUS 50, el tiempo de muestreo establecidos en Us 

A continuación, ponemos ADCON1 para que el MCU lo establezca como modo digital. 

, Establecer el registro de control analógico a digital

ADCON1 =% 00000111; necesarios para el funcionamiento del LCD

, creamos las variables que van a necesitar

TMR1  VAR WORD; establecer la variable para el temporizador
ADVAL0 VAR BYTE, crear ADVAL para almacenar resultado
ADVAL1 VAR BYTE, crear ADVAL para almacenar resultado

ADVAL2 VAR BYTE, crear ADVAL para almacenar resultado
X VAR WORD; variable de repuesto para la experimentación
Y VAR WORD; variable de repuesto para la experimentación
PAUSA 500 ; pausa para la pantalla LCD para la puesta en marcha
LCDOUT $ FE, 1; pantalla clara y ubicación del cursor

, configurar el  registro de E / S

TRISC =% 11110001; PORTC.0 va a ser la entrada
CCP1CON =% 00000101; capturar cada flanco de subida
T1CON =% 00000011; no  pre-scale/osc / señal externa
;  TMR1 en marcha el motor, utilizando un  
; codificador para la entrada
PORTC.3 = 0; habilita  el motor
PORTC.2 = 1, establecer el sentido de rotación

A continuación, vamos a entrar en el cuerpo del programa. El ciclo del programa comienza con la lectura de tres potenciómetros a pesar de que está utilizando sólo el primero para establecer el poder y por tanto la velocidad del motor.

LOOP:
ADCIN 0, ADVAL0; lea el canal 0 a ADVAL0
ADCIN 1, ADVAL1; leer el canal 1 a ADVAL1
ADCIN 3, ADVAL2; leer el canal 3 de ADVAL2

Si el ciclo de trabajo del motor es inferior a 20 sobre un total de 255, el motor se moverá, así que hacemos u alinea de código para eso y ver el estado en la pantalla LCD.

IF ADVAL0>20 THEN ;
HPWM 2, ADVAL0, 32000 ;
LCDOUT $FE, $C0, "PWM = ",DEC ADVAL0," " ;
ELSE ;
LCDOUT $FE, $C0, "PWM TOO LOW ",DEC ADVAL0," ";
ENDIF

Luego leemos los dos registros de contador de tiempo para ver cuantas cuentas pasaron. 

Sin embargo, si usted tiene una entrada de conteo rápido, es posible que desee agregar esta información a la lectura 


TMR1H = 0; claro Timer1 alta de 8 bits
TMR1L = 0; claro Timer1 baja de 8 bits
T1CON.0 = 1; iniciar el temporizador de 16 bits
PAUSA 100; captura de 100 m de la entrada
; Frecuencia de reloj

T1CON.0 = 0; parada de 16 bits del temporizador
TMR1.BYTE0 = TMR1L; lectura baja de 8 bits
TMR1.BYTE1 = TMR1H; lectura de alta de 8 bits
TMR1 = TMR1 - 11; Corrección de captura
SI = TMR1 = 65.525  THEN NOSIGNAL; ver el libro de PBP
; explicación.
LCDOUT $ FE, $ 80, DEC5 TMR1, "COUNTS", la frecuencia
; pantalla
PAUSA 10; lento
GOTO BUCLE; hacerlo de nuevo
;
NOSIGNAL:
LCDOUT $ FE, $ 80, "NO SIGNAL";
GOTO BUCLE;
END;

Nota: Con el programa comentado se puede desarrollar el circuito


----------



## atricio (Mar 21, 2011)

gracias por el programita lo voy a leer muy bien par poder realizar lo que quiero...auto gracias por la explicacion tratare de entenderla mejor


----------



## autotronico (Mar 21, 2011)

bien atricio estamos para colaborar y hacer crecer este foro y el tema abierto por nuestro amigo mecatrodatos que anda perdido


----------



## atricio (Mar 21, 2011)

por si acaso a alguien no le compilaba ya lo corregi solo le quite lo que decia @device y le inclui una linea para que le reconozca al oscilador externo ahora bien posee algunas preguntas puntuales mi querido amigo autotronico porque mandas a uno estos registros es por el micro o que razon tiene te agradeceria un poco que me explicaras por favor en el codigo coloque las lineas que quisiera que me des una mano por favor

```
'OPTION_REG =%00111111
PORTA=0:TRISA=%00000001
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
ADCON1= %10001110 '
T2CON = %00000101
PR2=249
'-----------------------------------------------------------------
'@ DEVICE PIC16F877                                                    
'@ DEVICE PIC16F877, WDT_OFF             
'@ DEVICE PIC16F877, PWRT_OFF            
'@ DEVICE PIC16F877, PROTECT_OFF        
'@ DEVICE PIC16F877, XT_OSC             
@devicext_osc
'-----------------------------------------------------------------
DEFINE OSC 4
'**************** ADC ************************
DEFINE ADC_BITS 10    ' 
DEFINE ADC_CLOCK 1    ' 
DEFINE ADC_SAMPLEUS 3 ' 
'****************HPWM ********************
DEFINE CCP1_REG   PORTC    'Hpwm 1 pin port
DEFINE CCP1_BIT     2      	'Hpwm 1 pin bit
DEFINE CCP2_REG   PORTC    'Hpwm 2 pin port
DEFINE CCP2_BIT     1      'Hpwm 2 pin bit 
'******************* VARIABLES ********************
HAM var word
X   VAR WORD
DUTY VAR BYTE   
'---------------------------------------------------------------------------

CCP1CON.2=1    'PORQUE LO COLOCAS ASI 
CCP1CON.3=1   'PORQUE LO COLOCAS ASI 

CCP2CON.2=1  'PORQUE LO COLOCAS ASI 
CCP2CON.3=1   'PORQUE LO COLOCAS ASI 


TIEMPO:
      DUTY=50
      GOSUB SALIDA
      
      GOTO TIEMPO
      
SALIDA:
       ADCIN 0,HAM
       PR2=((1024-HAM)*/5625)/100+24
       
       X=(PR2+1)* DUTY /25
       CCP1CON.4=X.0      'PORQUE LO COLOCAS ASI 
       CCP1CON.5=X.1      'PORQUE LO COLOCAS ASI 
       
       CCP2CON.4=X.0       'PORQUE LO COLOCAS ASI 
       CCP2CON.5=X.1       'PORQUE LO COLOCAS ASI 
      
       CCPR1L=X>>2          'PORQUE LO COLOCAS ASI 

      CCPR2L=X>>2	    'PORQUE LO COLOCAS ASI 
       RETURN
```

De antemano gracias por la auda


----------



## arturouc (Mar 21, 2011)

muchas gracias autotronico
voy de salida, pero mas tarde te mando comentarios...


----------



## autotronico (Mar 21, 2011)

atricio te anexo información para la utilizacion y configuración de los registros CCP


----------



## Nano24 (Mar 22, 2011)

Muchas gracias autotronico, era lo que necesitaba para poder entender el tema y has especificado con detalles cada linea de programación, vegna tío muy bien


----------



## shura (Mar 22, 2011)

holaaaa amigo esta especial este curso que nos das en la programación de microcontroladores..pero tengo una duda ¿ como puedo habilitar del PIC16F877A dos puertos ( RC0-RC7 y RD0-RD7) que son 16 pines, para encender por medio de un pulsador los 16 Leds con estos efecto???

puedes ayudarme con la programación en microcode studio...???
es para un proyecto que voy a presentar de termino de preparatoria Tecnica.......

Deanteano muchisimas gracias...espero me puedas ayudar...

Te anexo una imagen de lo que te comento...

Saludos.....


----------



## Nano24 (Mar 22, 2011)

Que tal Shura!! bueno respecto a la ayuda que pides, no se como querías que fuese exactamente la cuestión con los LEDs, aquí te hice un ejemplo que quizás te sirva para lo que estas buscando, consiste en que todos los LED están apagados y al presionar el pulsador se van encendiendo de uno en uno en un orden, desde el puerto C0 hasta C7 y de ahí continua desde D0 hasta D7 y espera que vuelvas a presionar el pulsador para volver a repetir. En el archivo PBP detalle cada linea de programacion y te vas a encontrar con una linea que dice al inicio:

PORTC=%00000001  ;eso significa que el 0 es estado bajo o 0 vts y el 1 estado alto 5 vts, puedes cambiarlos hacer combinaciones y obtendrás nuevas formas de encender y apagar los LED que están en el PIC, bueno espero haberte ayudado en tu duda.


----------



## arturouc (Mar 22, 2011)

shura
en el inicio de este curso mecatrodatos tiene ejemplos para hacerlo con pic basic pro
es bastante sencillo debes configurar el oscilador, los puertos y cuando presiones el pulsador
activas todo el puerto que quieres


----------



## shura (Mar 22, 2011)

MUCHISIMAS GRACIAS *NANO24 *y ati arturouc, me sirvio tu ejemplo que me colocaste...asi era como lo queria camarada y muchas gracias por contestar rapido...

fue de mucho tu ayuda....

te debo una...

saludos desde monterrey nuevo leon mexico...


----------



## Nano24 (Mar 22, 2011)

shura dijo:


> MUCHISIMAS GRACIAS *NANO24 *y ati arturouc, me sirvio tu ejemplo que me colocaste...asi era como lo queria camarada y muchas gracias por contestar rapido...
> 
> fue de mucho tu ayuda....
> 
> ...



Saluds Shura, desde venezuela y pues de nada, aqui estamos todos para compartir y ayudar en lo que se pueda.


----------



## atricio (Mar 22, 2011)

muchas gracias queridos colegas revisare lo que me han facilitado y lo aplicare ahora saquenme de una duda en un L293D puedo usarlo para conectar la salida del micro que me da el pulso PWM y poder hacer funcionar mi motor disculpen si mi pregunta ofende por lo basico pero es algo que me tiene un poco inquieto de antemano gracias por la ayuda


----------



## autotronico (Mar 22, 2011)

Atricio esta es la versión mejorada del control para operación y manipulación  de motores con el L293D que mecatrodatos posteo en este hilo no me acuerdo bien cual es el Numero de pagina, pero era algo de proyectos con motores seria bueno volverlo a retomar.

http://www.solarbotics.com/assets/documentation/kit10.pdf


----------



## arturouc (Mar 22, 2011)

que tal autotronico
mencionas para ver la explicacion de 
TMR1 = TMR1-11       me imagino que es para antes de que se desborde
TMR1 = 65.525


----------



## shura (Mar 23, 2011)

Hola amigos qe tal...espero q todo bien...

pues les tengo una pregunta...

estoy programando un PIC16F877A y quiero saber si no tiene nada que ver que mi programa que estoy realizando (pbp) sea muy largo (en cuestion de caracteres que forman el programa) para la capacidad del PIC? 

espero me ayan entendido y me puedan ayudar...

deantemano muchisimas gracias....

anexo el archivo "pbp"


----------



## norman sanchez (Mar 23, 2011)

que tal amigos estoy haciendo un contador de 0-99 en micro code studio y hay un error creo que de tiempos si me pudieran ayudar .. gracias hay dejo la programacion y el circuito en proteus 

TRISA=0
TRISB=0
CONTA VAR BYTE 
UNIDAD VAR BYTE
DECENA VAR BYTE
DECE VAR BYTE

UNIDAD=0
DECE=0


INCREMENTAR:
PORTA=1 
FOR CONTA= 1 TO 10
LOOKUP CONTA,[8,0,1,2,3,4,5,6,7,8,9],UNIDAD
PORTB=UNIDAD
PAUSE 150
NEXT 
GOSUB DECENAS

DECENAS:
PORTB=DECENA
PORTA=2
IF DECENA=10 THEN INCREMENTAR
DECENA=DECENA+1
PAUSE 100
GOSUB INCREMENTAR

END


----------



## snakewather (Mar 24, 2011)

shura dijo:


> Hola amigos qe tal...espero q todo bien...
> 
> pues les tengo una pregunta...
> 
> ...




Con que no pase el limite de memoria de programa del pic ya compilado esta bien


----------



## shura (Mar 24, 2011)

michas gracias amigo "snakewather" pero me puedes decir

como puedo revisar la capacidad de memoria del PIC16F877A contra mi programa compilado???

Deantemano muchas gracias///


----------



## Nano24 (Mar 24, 2011)

autotronico dijo:


> Atricio esta es la versión mejorada del control para operación y manipulación  de motores con el L293D que mecatrodatos posteo en este hilo no me acuerdo bien cual es el Numero de pagina, pero era algo de proyectos con motores seria bueno volverlo a retomar.
> 
> http://www.solarbotics.com/assets/documentation/kit10.pdf



Que tal autotronic! Quería hacerte una pregunta nada mas para que me des una idea, como haría para medir distancias por infrarrojo, yo tengo ya la configuración para poner el pic a mandar señales de 38Khz a través de IR, pero como hago para poder calcular distancias? es que pienso hacer un robot y que dependiendo de la distancia que se encuentre de los objetos el regule la velocidad de los motores. Lo de los motores es lo de menos esa parte si tengo una idea de como hacerlo, bueno lo digo para ahorrarte molestias.


----------



## shura (Mar 24, 2011)

ola amigos...me pueden ayudar si mi codigo .hex que anexo excede la capaidad de mi PIC16F877A? me pueden decir como puedo saber esto???

saludos///

espero me puedan ayudar...


----------



## snakewather (Mar 24, 2011)

shura dijo:


> michas gracias amigo "snakewather" pero me puedes decir
> 
> como puedo revisar la capacidad de memoria del PIC16F877A contra mi programa compilado???
> 
> Deantemano muchas gracias///




En la primera hoja del DATASHEET del PIC vienen las especificaciones para Program Memory.
te adjunto esta imagen para que sepas el tamaño de tu programa. 

saludos


----------



## shura (Mar 24, 2011)

gracias---amigo---- 

pero por alguna razon no me sale este dato en mi compilador..podrias hacerme el favor de probarmelo en tu compilador y decirme el espacio que ocupa..y si e excedido la memoria de mi PIC16F877A

te anexo el codigo en "PBP"
y tan bien te anexo una imagen de lo que me sale en mi compilador, de echo me sale una leyenda que me pone en duda..lo veras en la imagen

Saludos y deantemano muchisimas gracias...


aqui esta la imagen uppssss


----------



## snakewather (Mar 24, 2011)

No estas exediendo el limite de memoria de programa lo que pasa es que no te ha de salir por que no te compila eso sale cuando la compilacion fue hecha correctamente, lo mas seguro es que tengas mal algo en el codigo del archivo .PBP, mas si estas usando sentencias con ASM.

Sube el Programa en PBP para checarlo correctamente por que con el EXE no se puede.


----------



## shura (Mar 24, 2011)

te anexé el codigo  en .pbp comprimido en .rar avisame si lo puedes ver....

gracias por tu ayuda----

ahi te va amigo ...el .pbp


----------



## snakewather (Mar 24, 2011)

Un poco de orden en la estructura no estaria mal jejejeje  ya cheque tu programa estaban mal unas etiquetas las de INICIAR3 y 2  utilizas 3 IF para sensar los 3 botones entonces es un ciclo:

sensa1 =IF THEN 1
sensa2 =IF THEN 2
sensa3 =IF THEN 3


si se aplana 1 entonces GOSUB es una instruccion que brinca a la  etiqueta INICIAR ahi hace la secuencia de puertos prende pausar apagar  etc. cuando acaba se encuentra con RETURN que es una instruccion que te  ayuda a regresar al programa principal en este caso al segundo IF THEN y  asi ocurre para los demas OK.

Ademas una recomendacion si estas enviando directamente los datos a los  puertos no uses tantos ALIAS por que en mi experiencia he notado que el  PBP como que se amensa con muchos ALIAS.

De todos modos  queda un error de Logica para que corrigas: 

ERROR!: (mandas  datos de 7 bits al puertoB del pic pero recuerda que utilizas 3 bits  para sensar los botones RB0 RB1 RB2 cuando salgan los datos del PUERTO B  solo veraz los datos apartir de RB3-RB4).

eso ya te toca a ti corregirlo Sugerencia puedes poner los botones en el PUERTO E.
y todos los demas para las secuencias.


----------



## arturouc (Mar 24, 2011)

Aqui les dejo un pequenio ejemplo que hice gracias a la ayuda de este foro y de AUTOTRONICO
esta en sus origenes, pero creo que a alguien le puede servir
es el control de posicion de un servomotor que tiene acoplado un encoder incremental
estoy utilizando el timmer1 como contador y la nstruccion HPWM para controlar la velocidad del motor. Voy a cmbiar el timmer1 por el ccp1 en modo captura por que pierdo pulsos del encoder
gracias denuevo autotronico por que con tu ejemplo entendi "un poco creo" a utilizar este
temporizador. 
el programa solo tiene gravado dos posiciones pero cuado deje de perder pulsos del encoder sigue implementarle el PID al control y la comunicacion serial para desde la computadora mandarle la posicion y despues la comunicacion I2C para comunicarse con otros driver

aqui les dejo el codigo y el ejemplo en proteus...


```
DEFINE OSC 8
DEFINE LCD_DREG PORTD 
DEFINE LCD_DBIT 4     
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 2    
DEFINE LCD_EREG PORTD 
DEFINE LCD_EBIT 3 

DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
DEFINE CCP2_REG PORTC
DEFINE CCP2_BIT 1
   '
TMR1 VAR WORD              'variable de captura del timer1
VTMR1 VAR WORD             'variable para acumular captura del timer1
SENTIDO VAR BIT            'sentido de giro
FRENADO VAR BIT
FPWM VAR WORD              'frecuencia del pwm 
VEL VAR BYTE               'velocidad de gigo del motor 0-255
SP1 VAR WORD               'set point

symbol B1=PORTC.6
symbol B2=PORTC.7
LCDOUT $FE, 1
LCDOUT "SERVO DRIVER AUC"
PAUSE 500
 TMR1=0
 VTMR1=0
 SENTIDO=1
 SP1=350                   '350 pulsos del encoder
 FRENADO=0
 FPWM=320
TRISC = %11100001

CCP1CON = %00000101  'captura cada transicion de subida (primeros 4 bit)
                     'bit 5 y 6 solo se usan en PWM
T1CON = %00000011    'bit0=1 enable timmer1 TMR1ON, bit1=1 reloj externo
                     'sincroniza reloj externo, apaga oscilador, 1:1 preescaler
PORTC.3 = 1          'Enable del motor

VEL=255
PORTC.4=0
HPWM 2, VEL,FPWM        'por RC1 sale el PWM con un duty=Vel, frecuencia FPWM
TMR1H = 0
TMR1L = 0
Inicio:
    IF B1=1 THEN GOTO CAM_POS  'si presiono B1 cambio la posicion a la que
    TMR1H = 0                   'se debe mover el servo, cambia el sentido
    TMR1L = 0
    T1CON.0 = 1                 'activamos el timer1 por 1 mS para capturar
    PAUSE 1                     'informacion
    if portc.4=0 then           'Si el RC4 No esta Activo gira en un sentido
        SENTIDO=1
    ELSE                        'si esta activo gira en sentido contrario
        SENTIDO=0
    ENDIF
    T1CON.0 = 0                 'se apaga el timer1 para tomar la informacion
    TMR1.BYTE0 = TMR1L
    TMR1.BYTE1 = TMR1H

    if sentido=1 then
        VTMR1=VTMR1+TMR1    'acumula el conteo
    else
        VTMR1=VTMR1-TMR1    'resta el conteo
    endif
    LCDOUT $FE, 1, " POS = ",DEC VTMR1   'se manda al LCD
    pause 1
    IF vTMR1 = SP1 then  'si llegaste al set point PWM=0 y frena el motor 
        VEL=0
        goto Frenar
    ENDIF

GOTO Inicio

Frenar:
    hpwm 2,0,FPWM    'pwm=0
    PORTD.0=1        'si RD0 y RD1 estan en 1 se frena el motor 
    PORTD.1=1
    portc.4=0        'se desenergiza el relevador de cambio de giro
    VEL = 0
    GOTO Inicio
CAM_POS:
    if B1=1 THEN GOTO CAM_POS
    IF SP1 = 350 THEN       'si esta en la posicion 350, cambia el sentido
        SP1=50              'y se va  a la posicion 50
        PORTD.0=0
        PORTD.1=0
        PORTC.4=1
        vel=30              'a una velocidad muy lenta
        HPWM 2,VEL,FPWM
    ELSE                     'si esta en la posicion 50 cambia el sentido
        vel=255              'y se va a la posicion 350
        SP1=350              'a maxima velocidad
        PORTD.0=0
        PORTD.1=0 
        PORTC.4=0
        HPWM 2,VEL,FPWM
    ENDIF
    GOTO Inicio
END
```


----------



## shura (Mar 24, 2011)

muchisimas gracias amigo "snakewater" por tu ayuda y por la corrección que me hicistes en mi programa tomare muy encuenta tus comentarios, como te habras dado cuenta soy muy novato en esto pero me gusta la electronica y efecto de luces y pues este proyecto que estoy aciendo es para el termino de mis estudios....

te estare comentando como voy avanzando

muchisimas gracias de nuevo...

umm una pregunta en la subrutina como le ago para que me repita la misma rutina indefinidamente ya que como me la escribiste me regresa a la condición "IF"....

saludos amigo....


----------



## norman sanchez (Mar 24, 2011)

contador 0 -99
que tal amigos estoy haciendo un contador de 0-99 en micro code studio y hay un error creo que de tiempos si me pudieran ayudar .. gracias hay dejo la programacion y el circuito en proteus 

TRISA=0
TRISB=0
CONTA VAR BYTE 
UNIDAD VAR BYTE
DECENA VAR BYTE
DECE VAR BYTE

UNIDAD=0
DECE=0


INCREMENTAR:
PORTA=1 
FOR CONTA= 1 TO 10
LOOKUP CONTA,[8,0,1,2,3,4,5,6,7,8,9],UNIDAD
PORTB=UNIDAD
PAUSE 150
NEXT 
GOSUB DECENAS

DECENAS:
PORTB=DECENA
PORTA=2
IF DECENA=10 THEN INCREMENTAR
DECENA=DECENA+1
PAUSE 100
GOSUB INCREMENTAR

END


----------



## snakewather (Mar 25, 2011)

shura dijo:


> muchisimas gracias amigo "snakewater" por tu ayuda y por la corrección que me hicistes en mi programa tomare muy encuenta tus comentarios, como te habras dado cuenta soy muy novato en esto pero me gusta la electronica y efecto de luces y pues este proyecto que estoy aciendo es para el termino de mis estudios....
> 
> te estare comentando como voy avanzando
> 
> ...




Mira Te puse esto:

CONDICION:  IF (PULSADOR=1) THEN gosub INICIAR       

                       IF (PULSADOR2=1) THEN gosub INICIAR2  

                           IF (pulsador3=1) then gosub INICIAR3 

                  GOTO CONDICION     


Al correr tu programa configura todo lo de los puertos y alias que pusiste arriba de este codigo que te muestro bueno, despues llega a la etiqueta CONDICION: ahi sensa PULSADOR=1 (supongamos que es 0), se salta a PULSADOR2=1 (tambien es 0), se salta a pulsador3=1 tambien es 0 entonces se salta a GOTO CONDICION aqui se regresa a etiqueta CONDICION:

Bueno esta vez supongamos que PULSADOR2=1 si es 1 entonces salta hasta la etiqueta INICIAR2  donde hace toda la secuencia de luces cuando termina se encuentra con RETURN
que regresa al programa principal despues de IF (PULSADOR2=1) THEN gosub INICIAR2, lo que sigue es sensar pulsador3=1, supongamos que es 0 sigue con GOTO CONDICION y asi indefinidamente se esta sensando que botones se aplanan para brincar a la subrutina correspondiente y despues regresar para volver a sensar infinitamente


----------



## shura (Mar 25, 2011)

aa ok ya te entendi amigo

gracias por reacomodar mi programa...///


----------



## atricio (Mar 25, 2011)

norman sanchez dijo:


> contador 0 -99
> que tal amigos estoy haciendo un contador de 0-99 en micro code studio y hay un error creo que de tiempos si me pudieran ayudar .. gracias hay dejo la programacion y el circuito en proteus
> 
> TRISA=0
> ...



no haz subido la simulacion del proteus cuelgala ahi haber si te puedo hechar una mano aunque en este mismo hilo en paginas anteriores ya postearon uno que corre bien buscalo


----------



## norman sanchez (Mar 25, 2011)

aqui esta la simulacion te agradeceria mucho si me puedes ayudar.....


----------



## atricio (Mar 25, 2011)

mira lo unico que se me ocurre por el momento es que hagas una tabla de verdad y juegues con los binarios por ejemplo para mostra el nuemro 8 en 4 displays debes mostrar el 184 en binario porque si te pones a analizar este numero en binario 

10111000 es el 184 sino me equivoco

1011 van a activar los transistores 

y los demas bits mas bajos van al deco para mostrar el 8 es decir 1000

ademas el problema que encontre el tu programa es que haces el multiplexado en el mismo lazo de la
visualizacion del numero deberias hacerlo aparte es decir que deberias generar un contador con una variable X con la que comparandolo si es par muestres las unidades y si es par las decenas ojo que la multiplexacion no debe ser mayor a 5 ms para dar la apariencia de encendido de los displays.
si no estas de apuro dejame resuelvo unos asuntos de la U que me tienen loco y analizo mejor tu problema espero te haya ayudado un poquito por lo menos


----------



## autotronico (Mar 27, 2011)

Nano24 dijo:


> Que tal autotronic! Quería hacerte una pregunta nada mas para que me des una idea, como haría para medir distancias por infrarrojo, yo tengo ya la configuración para poner el pic a mandar señales de 38Khz a través de IR, pero como hago para poder calcular distancias? es que pienso hacer un robot y que dependiendo de la distancia que se encuentre de los objetos el regule la velocidad de los motores. Lo de los motores es lo de menos esa parte si tengo una idea de como hacerlo, bueno lo digo para ahorrarte molestias.



Amigo mira aqui:

http://www.rentron.com/PicBasic/infrared_object_detection.htm

esta en ingles pero especifican como realizar lo que necesitas

arturouc como piensas realizar el control pid para tu proyecto te aconsejo un a rutina de selet case, deja a ver como podemos potencializar el código que posteaste para que no hall perdida de pulsos.

arturouc El Programa que posteo sirve para mantener un motor en una posición con el comando HPWM, no hay perdida de señal de pulso.

```
CLEAR  
DEFINE OSC 20 

' Definicion de pines para el LCD 
DEFINE LCD_DREG PORTD 
DEFINE LCD_DBIT 4 
DEFINE LCD_BITS 4 
DEFINE LCD_RSREG PORTE 
DEFINE LCD_RSBIT 0 
DEFINE LCD_EREG PORTE 
DEFINE LCD_EBIT 1 
LOW PORTE.2 
DEFINE LCD_LINES 2 
DEFINE LCD_COMMANDUS 2000 


DEFINE LCD_DATAUS 50 
DEFINE ADC_BITS 8 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50 
DEFINE CCP2_REG PORTC 
DEFINE CCP2_BIT 1 
CCP1CON = %00111111 
TRISA = %00011111 
LATA = %00000000 
TRISB = %00000000 
LATB = %00000000 
TRISC = %00000000 
TRISD = %00000000 
ANSEL0 = %00000001 
ANSEL1 = %00000000 
QEICON = %10001000 
INTCON = %00000000 
INTCON2.7 = 0 

' Creacion de variables

POSICION VAR WORD 
MOTPWR VAR BYTE 

'Definicion de pines para manejo de motor 
PORTC.0 = 0 
PORTC.1 = 0 
PORTC.3 = 1 
PAUSE 500 ; 
LCDOUT $FE, $01, "PUESTA EN MARCHA" 
PAUSE 100 
POSCNTH = 127 
POSCNTL = 0 

' PROGRAMA PRINCIPAL
LOOP: 
POSICION = 256*POSCNTH + POSCNTL 
SELECT CASE POSICION 
CASE IS = 32512 
MOTPWR = 0 
PORTD.3 = 0 
CASE IS < 32512 
PORTC.3 = 0
PORTD.2 = 1 
PORTD.3 = 1 
MOTPWR = 18 

CASE IS > 32512 
PORTC.3 = 1 
PORTD.2 = 0 
PORTD.3 = 1 
MOTPWR = 18 
CASE ELSE 
END SELECT 
HPWM 2, MOTPWR, 20000

LCDOUT $FE, $80, "PORTC=",BIN4 PORTC,"GANANCIA=",DEC3 MOTPWR

LCDOUT $FE, $C0, "POSICION =",DEC5 POSICION 

GOTO LOOP 
END
```


----------



## arturouc (Mar 28, 2011)

autotronico dijo:


> arturouc como piensas realizar el control pid para tu proyecto te aconsejo un a rutina de selet case, deja a ver como podemos potencializar el código que posteaste para que no hall perdida de pulsos.
> 
> arturouc El Programa que posteo sirve para mantener un motor en una posición con el comando HPWM, no hay perdida de señal de pulso.



Que tal autotronico
el PWM trabaja muy bien
Lo del PID todavia no lo empiezo, hasta que ya no pierda pulsos del encoder, no del PWM,
los del encoder son los pulsos que estoy perdiendo, ayer me di cuenta de el codigo que subi que si desconecto la entrada RC0 donde "se supone que esta contando los pulsos" sigue contando....esto quiere decir que el timer1 algo le falta para contar los flancos de subida en esa patita del pic.  esta capturando solo valoresdel conteo del TMR1

lo que necesito es que el contador este capturando todos los flancos de subida que se presenten en la patita del pic y preguntarle cada cierto tiempo como va el conteo sin que pierda pulsos, asi como trabaja el HPWM el pic puede realizar otras tareas

Este es el codigo y el sentido de giro lo determino con un FF 374, ahora son los dos canales A y B del encoder con la Xor... es el mismo codigo anterior, solo cambia la manera de determnar el sentido de giro. antes era con la patita RC4 que es una salida y ahora es con la RC5 que es una entrada conectada a la salida del FF 374


----------



## shura (Mar 30, 2011)

Hola amigos del foro....

Me podrian decirme cuales son o donde puedo encontrar las especificaciones tecnicas de los leds como:
Voltage Minimo (V):
Voltage Maximo(V):
Corriente Minima(I):
Corriente Maxima(I):

etc...

lo que pasa es que si e encontrado especificaciones como por ejemplo:

LED de 5 mm, color rojo difuso
Características técnicas

- Voltaje: 2,1 Vcc
- Potencia: 31,5 mW
- Luminosidad: 80 mcd
- Corriente: 15 mA 
- Diámetro: 5 mm 


pero en estas especificaciones no me especifica los voltages maximos y minimos asi como tanpoco las corrientes...

ya que no se si mi rango de trabajo esta correcto....

espero me puedan ayudar....

saludos


----------



## 31587 (Mar 31, 2011)

Gracias por tu ayuda atricio el dato q me diste es para un voltaje constante.
 Pero quiero  que el incremento del voltaje se automatico intente con la funcion if - then  pero no me sale.
 Sale error es para encender un led q vaya incrementando su luz hasta su punto mas alto


----------



## atricio (Mar 31, 2011)

si quieres que se vaya encendiendo la luz de un led deberias usar un pwm y creo que estara listo pero como lo hiciste ????


----------



## shura (Abr 1, 2011)

ola amigos....

me podrian decir que amperaje consume el PIC16F877A, para colocarle su resistencia a una fuente de 9V...

espero me puedan ayudar...


----------



## arturouc (Abr 2, 2011)

31587 dijo:


> gracias por tu ayuda atricio el dato q me diste es para un voltaje constante.
> Pero quiero  que el incremento del voltaje se automatico intente con la funcion if - then  pero no me sale.
> Sale error es para encender un led q vaya incrementando su luz hasta su punto mas alto



incremento var byte
incremento=0
inicio:
Pwm portc.1, incremento, 1
if incremento < 255 then incremento=incremento+5
pause 100
goto inicio


----------



## 31587 (Abr 2, 2011)

el incremento es muy rapido se nota como un encendido normal en los datos q m diste varie los ciclos y remplace 255 en 5.
q vaya subiendo d 1 segundo en segundo el encendido del led


----------



## arturouc (Abr 2, 2011)

31587 dijo:


> el incremento es muy rapido se nota como un encendido normal en los datos q m diste varie los ciclos y remplace 255 en 5.
> q vaya subiendo d 1 segundo en segundo el encendido del led



se te apaga el led en la espera de 1 segundo?
puedes incrementar los ciclos....en la instruccion pwm 
que micro estas usando hay una instruccion hpwm


----------



## atricio (Abr 3, 2011)

hola amigos recurro a ustedes por una ayudita quiero desarrollar un seguidor de linea podria usar la sentencia select case y leer el puerto del micro para que me vaya haciendo los case o estoy en lo correcto o que deberia hacer


----------



## autotronico (Abr 3, 2011)

mira aqui: 
http://www.freewebs.com/glafebre/hyperion.htm


----------



## arturouc (Abr 3, 2011)

Autotronico
has podido checar el codigo que publique del servodriver
no me funciona el contador...


----------



## autotronico (Abr 3, 2011)

No espera y le hecho un vistazo

Amigo Arturoc recuerda:


MODO CAPTURE 

CARACTERÍSTICAS 

• EL REGISTRO CCPR1H:CCPR1L CAPTURA EL VALOR DE TMR1 (16 BITS) CUANDO OCURRE UN EVENTO EN EL PIN RC2/CCP1. CUANDO SE REALIZA LA CAPTURA CCP1IF=1 (REG PIR1). ESTE FLAG DEBE SER BORRADO POR SOFTWARE. EL PIN RC2/CCP1 DEBE SER CONFIGURADO COMO ENTRADA EN TRISC. 
• EL TIMER1 DEBE ESTAR EN MODO TEMPORIZADOR O EN MODO CONTADOR SINCRÓNICO 
• SI CCP1IE=1 SE GENERA INTERRUPCIÓN EN MODO CAPTURE 
• CUANDO EL MODO CAPTURE ES CAMBIADO PUEDE GENERARSE UNA INTERRUPCIÓN FALSA, DEBE EVITARSE HACIENDO CCP1IE=0 Y CCP1IF=0 

Comprueba con la configuraciones  mencionadas y me comentas

por lo que en tu programa debes configurar el modo de captura dependiendo del REGISTRO CCP1CON:

• CCP1X:CCP1Y: BITS MENOS SIGNIFICATIVOS DE PWM 

• CCP1M3:CCP1M0: SELECCIONA MODO DE CCP1 
• 0000: CCP1 DESHABILITADO 
• 0100: CAPTURE, CADA FLANCO DE BAJADA EN RC2/CCP1 
• 0101: CAPTURE, CADA FLANCO DE SUBIDA EN RC2/CCP1 
• 0110: CAPTURE, CADA 4º FLANCO DE SUBIDA EN RC2/CCP1 
• 0111: CAPTURE, CADA 16º FLANCO DE SUBIDA EN RC2/CCP1 
• 1000: COMPARE, SALIDA =1 (CCPIF =1) 
• 1001: COMPARE, SALIDA =0 (CCPIF =1) 
• 1010: COMPARE, SE GENERA INTERRUPCIÓN (CCPIF =1) 
• 1011: COMPARE, DISPARO ESPECIAL, DIFERENTE A CCP2 
• 11XX: PWM


----------



## atricio (Abr 3, 2011)

gracias mi amigo autotronico he revisado el codigo de ese robot pero no entiendo muy bien lo que hace con el loop puedo entender que con el loop revisa siempres el pueto a pero lo que no entiendo segun miro es como ir activando los case deberia entender que con el case 0 todo el puerto A esta en 0 y asi desde el bit mas bajo o me equivoco


----------



## autotronico (Abr 3, 2011)

Aqui hay algo :


mecatrodatos dijo:


> *Para ayudarte te explicare todo el código y la utilización de los comandos empezando con la función SELECT CASE que es una* estructura de control que proporciona  PBP para utilizarse se debe empezar con *select case*  y terminar la operación con *end select*.
> Su propósito es el simplificar las estructuras anidadas if, Then, else  que utilizamos cuando se da una condición, en los casos en que sea siempre la mima variable y se necesiten varias decisiones en función de los valores posibles, y su estructura es la siguiente:
> SELECT CASE variable
> CASE valor1: instruccion1
> ...


----------



## atricio (Abr 4, 2011)

que bobo ya habia preguntado esto y estaba muy bien explicado no habia visto esta explicacion del amigo mecatrodatos...Mil disculpas amigos por no buscar bien la informacion y hacerles pasar el tiempo quero hacerlo con un micro 16F873A usando sensores CNY70 espero salga bien seguire molestando cualquier pregunta muchas gracias de nuevo


----------



## arturouc (Abr 4, 2011)

autotronico dijo:


> • 0101: CAPTURE, CADA FLANCO DE SUBIDA EN RC2/CCP1



cuando se produce un flanco de subida en RC2 se genera una interrupcion "habilito las interrupciones" y voy y la atiendo y le digo que incremente o decremente en 1 el contador segun sea el caso

ASI ESTA CONFIGURADO

ON INTERRUPT GOTO Interrupcion
INTCON.7 =1      'HABILITAR INTERRUPCIONES GLOBALES
PIR1.2=0
PIE1.2=1   YA PROBE CON PIE1.2=0
CCP1CON = %00000101
T1CON = %00000011  YA PROBE CON %00000001

Interrupcion:
disable
'incrementa o decrementa en 1
enable 
resume

pero no me funciona
no se esta generando la interrupcion......

Autotronico
como es que funciona el modulo ccp1 en captura.  cuando se produce un flanco de subida captura el valpr del timer1 y genera una interrupcion y aqui es donde yo debo de incrementar o decrementar un contador?

este es un video que me encontre de lo que quiero hacer
es con un dspic30f2010 y yo estoy utilizando un 16f877a


----------



## autotronico (Abr 5, 2011)

mira este enlace especifica como utilizar el CCP como modulo de captura:
http://iesmachado.org/web insti/dep...royectos/pic_f_877/TEMA_21_modulo_ccp_pwm.pdf


----------



## arturouc (Abr 5, 2011)

autotronico dijo:


> mira este enlace especifica como utilizar el CCP como modulo de captura:
> http://iesmachado.org/web insti/dep...royectos/pic_f_877/TEMA_21_modulo_ccp_pwm.pdf



Gracias autotronico
dice que en modo captura: cuando se produce un flanco de subida captura el valor que posee el TMR1.....creo que es mejor utilizar el TMR1 como contador.....ya estoy utilizando el TMR0 como contador y en proteus si me funciona....falta ver la velocidad a la que puede leer los pulsos del encoder...la desventaja es que es un contador de 8 bit el TMR0.......el primer codigo que publique utilice el TMR1 como contador pero perdia pulsos.....

has implementado PID en un micro para un motor?


----------



## autotronico (Abr 5, 2011)

TMR1H = 0;  Timer1 alta de 8 bits
TMR1L = 0;  Timer1 baja de 8 bits
T1CON.0 = 1; iniciar el temporizador de 16 bits
PAUSE 100; captura de 100 m de la entrada
; Frecuencia de reloj
T1CON.0 = 0; parada de 16 bits del temporizador
TMR1.BYTE0 = TMR1L; lectura baja de 8 bits
TMR1.BYTE1 = TMR1H; lectura de alta de 8 bits
TMR1 = TMR1 - 11; Corrección de captura
SI = TMR1 = 65.525 THEN NOSIGNAL; ver el libro de PBP
; explicación

Esta es la rutina que debes emplear para leer una señal en modo de captura poniendo a 1 el T1CON.0 y en 0 para comparar con valor de variable creada es este caso TMR1 VAR  WORD en tu programa activas el Timer1 antes de la condicional (IF B1=1 THEN GOTO CAM_POS) y das un tiempo de captura muy corto ( PAUSE 1 ) en vez de activar y desactivar el TMR1 antes de la condicional con un Pause de 100 ( por el oscilador de 4 MHz que creo estas utilizando), por lo que el modulo de comparación no tiene el tiempo para ejecutarse y realizar la condicional del programa.  Por otro lado si he realizado control PID para motores y sistemas de temperatura.


----------



## arturouc (Abr 5, 2011)

Ya entendi el funcionamiento en modo captura y no me sirve por que cuando se da el tiempo para hacer la captura (los 100 mS que dices) lo que esta capturando son los valores del timer y no los pulsos de el encoder, ahora que paso con todo el tiempo (lineas de programa) que el micro esta trabajando, esta perdiendo pulsos del encoder, si los pulsos llegan en otro tiempo que no sea esos 100 mS ya los perdi.

estoy haciendo pruebas con el TMR0 como contador y en el proteus si me esta funcionando....deja lo pruebo con el servo y subo el codigo...


----------



## autotronico (Abr 5, 2011)

bien te dejo este proyecto como ayuda para lo que deseas


----------



## arturouc (Abr 5, 2011)

autotronico dijo:


> bien te dejo este proyecto como ayuda para lo que deseas



GRACIAS AUTOTRONICO por el ejemplo
el pic que voy a solicitar es el 18f4431
pero primero quiero hacerlo con el 16f877a
estoy checando el codigo....


----------



## autotronico (Abr 5, 2011)

el código anterior sirve para el pic 18f4431 porque todos los registros aplican, por otro lado para el pic 16f877A se debe modificar 

Otra cosa deseo saber como es el encoder que utilizas

bien aquí hay un código para el pic 16f877A con al utilzacion del TMrR1 y TMR2
	
	



```
@ Device XT_OSC         ' 
@ Device WDT_ON         ' 
@ Device PWRT_ON        ' 
@ Device BOD_ON         ' 
@ Device LVP_OFF        ' 
@ Device CPD_OFF        '

define __16F877A    1
define OSC 20

DEFINE INTHAND  DO_ISR

DEFINE DEBUG_REG    PortC
DEFINE DEBUG_BIT    6
DEFINE DEBUG_BAUD   9600
DEFINE DEBUG_MODE   0

' ------------- Direcciones de hardware---------------------------

GIE     VAR     INTCON.7    'habilitación de interrupción Global
PEIE    VAR     INTCON.6    ' Perif. Eq. Habilitación de interrupción
ADIE    VAR     PIE1.6      ' A-2-D convertidor de habilitación de interrupción

TMR1IE	VAR		PIE1.0		' PIE direccion 10h
TMR2IE  VAR     PIE1.1

TMR1ON  VAR     T1CON.0		' Registros en PIC.inc
TMR2ON  VAR     T2CON.2		


EnaPin  VAR PORTC.2     ' PWM pin
FwdPin  VAR PORTB.5
RevPin  VAR PORTB.4
QuadPin1 Var PORTC.0

LED     var PORTC.3

' ------------- Espacio para Asignar la interrupción de almacenamiento --------

wSave   VAR     BYTE    $20     SYSTEM  ; Guardar registro W en bank0
wSave1  VAR     BYTE    $A0     SYSTEM  ;  Guardar reg W en bank1
; wSave2  VAR     BYTE    $120    SYSTEM  ; 
; wSave3  VAR     BYTE    $1A0    SYSTEM  ;
sSave   VAR     BYTE    Bank0   SYSTEM  ; Guardar localizacion en registro STATUS 
pSave   VAR     BYTE    Bank0   SYSTEM  ; Guardar localizacion en reg PCLATH 

StatFlag        VAR BYTE Bank0
GyroTaskFlag	VAR	StatFlag.0
OddCycleFlag	VAR	StatFlag.1
QuadStateFlag   var Statflag.2

QuadCount   VAR Byte    Bank0   ; Contar  [-127..0..127] encoder 
QuadPins    Var Byte    Bank0   ; estado actual de los pines 
QuadPrev    VAR Byte    Bank0   ; estado del pin del encoder 
QuadByte    Var Byte    Bank0

' -------------- Asignar variables---------------------------

ADVal       Var Word
DutyCycle   Var Byte
nLoops      VAR Byte
    
'============================================================================


CodeStart:

    Goto    InitSeq        ' Pasar a subrutinas

'============================================================================

'Do_ISR
'Servicio de rutina de interrupción
'Manejar todad las interupciones
Asm

DO_ISR

    IF (CODE_SIZE <= 2)
        movwf   wsave          ; guardar registro W
        swapf   STATUS,W       ; guardar registro Status
        clrf    STATUS         ; cambiar al banco 0
        movwf   ssave          ; guardar estado de área en el banco 0
        movf    PCLATH,W       ; guardar conteo de programa 
        movwf   psave          ; guardar en el Banco 0 la localizacion
    EndIF
    
; ==========================================================================
; ver quinen causó la interrupción.
; vector a las rutinas correctas

    clrf    STATUS          ; cambio en el banco 0
    BTFSC   PIR1,TMR1IF     ; Timer1 desbordamiento?
    GOTO    T1_INT          ; Sí - Pase a la rutina de Timer1

    BTFSC   PIR1,TMR2IF     ; Desbordamiento Timer2?

    GOTO    T2_INT          ;Sí - Pase a la rutina Timer2
    CLRF    PIR1
    GOTO    ISR_Done        ; Error - no maneja la interrupción
    
; ==========================================================================
; Volver -1,0,1 en W reg
; Lo que debe ser de rutina en pzge 0

QUAD1_JUMP
    CLRF    PCLATH      ; PÁGINA CERO
    ADDWF   PCL,F       ; salto Indirectos 

    RETLW   0           ; 00 -> 00
    RETLW   1           ; 00 -> 01
    RETLW   1           ; 00 -> 10
    RETLW   1           ; 00 -> 11

    RETLW   1           ; 01 -> 00
    RETLW   0           ; 01 -> 01
    RETLW   1           ; 01 -> 10
    RETLW   1           ; 01 -> 11

    RETLW   1           ; 10 -> 00
    RETLW   1           ; 10 -> 01
    RETLW   0           ; 10 -> 10
    RETLW   1           ; 10 -> 11

    RETLW   1           ; 11 -> 00
    RETLW   1           ; 11 -> 01
    RETLW   1           ; 11 -> 10
    RETLW   0           ; 11 -> 11
    
; ==========================================================================

T1_INT                      ; Timer1 desbordamiento
    BCF     T1CON,TMR1ON    ; Apague el timer1
    BCF     PIR1, TMR1IF    ; Desactive la bandera de interrupción
;    BCF 	PORTB,5			; Apagar Pin pulso - a su veztodos los pines
;    BCF 	PORTB,4         ;
    GOTO    ISR_Done        

; ============================================================================
; Obtener los datos del codificador de cuadratura
; Inc / Dec durante interupcion ,@1.25 kHz frecuencia de muestreo
; limpiar QuadCount durante el ciclo de dirección
                           
T2_INT                      ; Timer2 / PWM de interrupción
    BCF     PIR1, TMR2IF    ; Desactive la bandera de interrupción

    MOVF    PORTC,W         ; Leer cuádruple sensor Pins - esto tiene que cambiar
    ANDLW   1               ; AND con 0001
    MOVWF   _QuadPins

    MOVF    _QuadPrev,W
    ADDWF   _QuadPins,W
    MOVWF   _QuadByte
    
    BTFSC   _QuadByte.0         ; Chequear Bit 0
    INCF    _QuadCount,F

     MOVF    _QuadPins,W
     MOVWF    _QuadPrev
    
    GOTO ISR_Done
    
    
;    BCF 	PORTB,4
    
    ;    INCF    _QuadCount,F

; ------

    BCF STATUS,C            ; Borrar bit
    MOVF    PORTC,W         ; Leer cuádruple sensor Pins - esto tiene que cambiar
    ANDLW   1               ; AND con 0001
;    ANDLW   6               ; AND con 0110

    MOVWF   _QuadPins
;    RRF     _QuadPins,F     ; Roll derecho -> 0011
    
    RLF     _QuadPrev,F     ; Roll pines anterior en bits superior
    RLF     _QuadPrev,W     ; Roll en W Reg: 1100
    IORWF   _QuadPins,W     ; O anterior y los estados CRNT: PPCC
    MOVWF   _QuadPrev       ; guardar  para la próxima vez
    
;    Movlw   1
    MOVF    _QuadPrev,W     ; parece innecesario
    CALL    QUAD1_JUMP
    ADDWF    _QuadCount,F
    
; ===============================

ISR_Done
    Movf    psave,w         ; Restaurar el registro PCLATH
    Movwf   PCLATH
    swapf   ssave,w         ; Restaurar el registro STATUS r
                            ;(banco establece a su estado original)
    Movwf   STATUS          ; mover W al reg Status 
    swapf   wsave,f         ; Swap w_guardar
    swapf   wsave,w         ; Swap w_guardar en W
    
    RETFIE
    
EndASM

'============================================================================
'============================================================================


' Subrutinas para leer voltajes A/D convertidor

Read_Pot1:
    ADCON0 = %10000001  ' 

Read_AD:
        nLoops = 0
        Pauseus 10              '
        ADCON0.2 = 1            ' iniciar conversion 
wLoop:
        nLoops = nLoops + 1
        Pauseus 5              ' tiempo para  conversion
        IF ADCON0.2 = 1 then wLoop
        
        adval.HIGHBYTE = ADRESH
        adval.LowBYTE = ADRESL
        Return

'-----------------------------------------------------------------------
'-----------------------------------------------------------------------

InitSeq:

    TRISA = %00000001	'configuracion  PORTA
    TRISB = %00000000	' PORTB
    TRISC = %10000001   ' PORTC 

    ADCON1 = %10000000	'
    CCP1CON = 0         ' MOdulo CCP en OFF

    HIGH FwdPin
    LOW RevPin

    QuadCount = 0
    QuadPrev = 0
    StatFlag = 0
    
    T2CON = %00000011   ' Timer2 Pre-Scaler = 1:16, Timer OFF
    TMR2 = 0            ' limpiar Timer2
    PR2 = 255           ' SPWM  = 1.25 kHz
    CCPR1L = 63         ' Duty Cycle a 25%
    CCP1CON = %00101100 ' modo PWM ,ciclo util= 10
    TMR2ON = 1
    
    Pause 500
    HIGH  LED
    DEBUG 13,10,"Velocidad", 13
    Pause 500

    GIE = 1     ' Habilitst interrpcion clobal
    PEIE = 1    ' Periférico de habilitación de interrupción
    TMR2IE = 1  ' habilitar bit de interrupcion del Timer2 
    
    Low    LED
    debug "Hecho que el bucle principal!", 13
    pause 1000

'-----------------------------------------------------------------------

mainloop:
    Toggle LED
    
    Gosub Read_Pot1             ; devuelve el valor 0 .. 1023
    adval = adval / 2           ; Ahora  0 .. 511
'    Debug "Pot: ", DEC ADval, 13
 
    if adval > 255 then
        adval = adval - 256
        fwdpin = 0
        revpin = 1
    else
        adval = 255 - adval
        fwdpin = 1
        revpin = 0
    Endif
    
    Adval = 255 - Adval         ; 0 = velocidad completa
                                
                                
    Debug "Ciclo Util: ", DEC ADval, "qCount: ", dec QuadCount, "qPrev:  ", dec QuadPrev, 13
    QuadCount = 0
    
    CCPR1L = ADval MIN 255      ; Establecer Ciclo 0 .. 255
                                
    Pause 400
    Goto mainloop
        
'    debug 13, "All Done.", 13
    End
        
End
```

saludos espero te sirva


----------



## arturouc (Abr 5, 2011)

que tal Autotronico
el encoder que estoy utilizando en el servomotor es similar al video del post #1091, son dos canales A y B , de 500 pulsos por canal, 3000 rpm, 24 Volts el motor y 2.7 Amp....todavia estoy probando lo del TMR0 como contador, tiene detalles espero maniana poder sacarlos y publicar el codigo...
muchas gracias por todos tus ejemplos...voy a ver que puedo utilizar de este ultimo ejemplo que publicaste

mira este video es de un robot que hice junto con dos alumnos TSU
http://www.uts.edu.mx/archivoselectronicos/Video/ArchivosElectronicos\3VideoRobot_UTS\RP5E_UTS1.rar
esta hecho con Motore Paso a Paso, este proyecto es para hacero con servomotores


----------



## electromario (Abr 7, 2011)

hola electronicos, tengan un buen dia, tengo un problema con un servo "parallax futaba" 
al desarrollar el programa con MPLAB 8.02 con un compilador pic basic pro 2.45
en un pic16f84a funciona perfecto, pero al desarrollarlo en un pic16f877a no consigo que me haga la rutina,obviamente le configuro el "device", espero que alguien ayude  gracias de antemano 
les dejo el programa:

********************************************
define osc 4
trisb=0
portb=0
i var byte
inicio:
for i=0 to 40
portb.0=1
pauseus 550
portb.0=0
pause 25
next i
pause 900
for i=0 to 35
portb.0=1
pauseus 1300
portb.0=0
pause 25
next i
pause 900
for i=0 to 35
portb.0=1
pauseus 2200
portb.0=0
pause 25
next i
goto inicio
End
**********************************


----------



## Dario (Abr 8, 2011)

hola gente del foro. 
otra vez yo por aca, desviando el tema de los demas  ...
bueno, mi pregunta es la siguiente: puedo o no puedo generar una señal de 38khz con un pic16f628 con clock interno mediante la instruccion freqout???
:cabezon:ya me he sacado las patillas de tanto renegar para que funcione un bumper inffrarrojo para un microbot que estoy haciendo y no he logrado nada 
aca les dejo el codigo por si me pueden dar una manito 
saludosss


```
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
 
CMCON = 7                     ' desactivo el convertidor AD del puerto A
TrisA=%11111111               'todo el port A como entrada
TrisB=%00000000               'todo el port B como salida
PORTA = %11111111             'todo el port A en 1
PORTB = %00000000             'todo el port B en 0
ojoder var bit
ojoizq var bit

inicio:
FREQOUT portb.4,50,38500
ojoder = porta.0
ojoizq = porta.1
if ojoder = 0 then giroder
if ojoizq = 0 then giroizq
goto inicio

giroder:
portb = %00000101            'port B 0 y port B 2 a nivel 1 giro a la derecha
goto inicio

giroizq:
portb = %00001010              'port B 1 y port B 3 a 1 giro hacia la izquierda
goto inicio
```


----------



## 31587 (Abr 8, 2011)

el pic es 16F877 tb aumente los cliclos pero igual en muy rapido el encendido


----------



## shura (Abr 8, 2011)

que tal amigos, espero q esten bien todos por ahiiii

una pregunta....

como puedo hacer por medio de PIC16f877a o componentes hacer que leds...enciendan gradualmente y a pagen gradualmente??? cual seria el programita....diagrama....para realizar esto???


----------



## HAYEKER (Abr 8, 2011)

holaa!! disculpen la molestia soy nuevo en este tema y e estado haciendo los primeros programas con leds pero luego me tope con lo de los display no se como configurarlo ya que al descargar los archivos en zip
para luego abrir la de simulacion de proteus ".DSN" no lo abre me dice que tiene que ver algo con la version q por eso no lo abre
mi pregunta es que version del proteus rekiero para abrir estos archivos??? 
espero su ayuda graciasss y saludoss


----------



## shura (Abr 8, 2011)

hola amigos...

puedo adaptar un cargador de celular que me da en la salida 5V para utilizarlo en mis circuitos de practicas..???


----------



## lubeck (Abr 9, 2011)

> como puedo hacer por medio de PIC16f877 software o componentes hacer que leds...enciendan gradualmente y a pagen gradual


 
puedes hacerlo con dos metodos PWM mediante software o con condensadores mediante Hardware....



> puedo adaptar un cargador de celular que me da en la salida 5V para utilizarlo en mis circuitos de practicas..???


para que adaptarlo???
solo conectalo a tu circuito... y dependiendo del circuito puede que te funcione... o sea si tu circuito consume 500mA y tu cargador entrega 100mA No te sirve pero si tu circuito consume 100mA y tu cargador entrega 500mA si te sirve... (leer esto mas de una vez)



> mi pregunta es que version del proteus rekiero para abrir estos archivos???


 
Adquiere la ultima version y quitate de problemas seguro que con esa se puede abrir cualquiera que este en la red.. creo que es la 7.0 SP2


----------



## autotronico (Abr 9, 2011)

buenas en el foro he visto proyectos con matrix de leds y me dio curiosidad para del desarrollo de uno a través de teclado como este:






he logrado esto con un pic 182550( dejo simulación en proteus me falta la comunicacion pc -pic o teclado-pic), vere como puedo avanzar


----------



## arturouc (Abr 11, 2011)

que tal amigos
este es el codigo para controlar un servomotor con encoder de un canal que le quite a una copiadora (el servomotor), el programa tiene 2 posiciones 650 pulsos y 2600 pulsos del encoder, si esta en 650 pulsos y presionas el pulsador se cambia a la posicion de 2600, y si esta en 2600 y presionas el pulsador se cambia a la posicion de 650... esta parte trabaja muy bien...
el problema es con la comunicacion serial...le envio un "1" y le digo al pic que me regrese lo que recibio y me regresa una "q", si le envio un "2" me gregresa una "r"

que creen que pueda ser?..... estoy usando el modulo USART del micro
ya probe con un programa que si funciona que publico Lubeck y me pasa lo mismo
cheque conexiones en el pic, en el max232, utilice otro....


```
CLEAR
INCLUDE "modedefs.bas"
DEFINE OSC 4
TRISC = %10000001
TRISB = %00000000
'Initialize USART
'TRISC = %10111111 ' Set TX (PortC.6) to out, rest in
'SPBRG = 25 ' Set baud rate to 2400
'RCSTA = %10010000 ' Enable serial port and continuous receive
'TXSTA = %00100000

'DEFINE HSER_RCSTA 90h
'DEFINE HSER_TXSTA 24h
'DEFINE HSER_BAUD 2400

INTCON = %11000000 ' activamos las interrupciones y las de periféricos
ON INTERRUPT GoTo serie ' Declare interrupt handler routine
PIE1.5 = 1 ' activamos la interrupción de recepción de la USART

SPBRG = 25              ' Set baud rate to 2400
RCSTA = %10010000       ' Enable serial port and continuous receive
TXSTA = %00100000       ' Enable transmit and asynchronous mode

OPTION_REG =%11100000   'TMR0 EN MODO CONTADOR

ADCON1=7                'PUERTO A DIGITAL
TRISA = %111111         'PUERTO A COMO ENTRADAS
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
DEFINE CCP2_REG PORTC
DEFINE CCP2_BIT 1
DEFINE HPWM2_TIMER 2  '

VTMR1 VAR WORD             'variable para acumular captura del timer1
CAPTURA VAR WORD
SENTIDO VAR BIT            'sentido de giro
FRENADO VAR BIT
MOV VAR BIT
FPWM VAR WORD              'frecuencia del pwm 
VEL VAR BYTE               'velocidad de gigo del motor 0-255
POS VAR WORD               'set point
ACUM VAR WORD
DESCONTAR VAR WORD
SENT2 VAR BIT

DATOE VAR WORD          'VARIABLE PARA CAPTURAR ENTRADA DEL RS232
DATOS VAR WORD          'VARIABLE PARA ENVIAR DATAOS POR RS232
DATOE=0
INTCON.2=0              'bandera que se activa cuando se desborda el TMR0

symbol B1=PORTA.0

 ACUM=0
 VTMR1=0
 SENTIDO=1
 POS=650                   '650 pulsos del encoder
 FRENADO=0
 FPWM=15000                'FRECUENCIA PARA HPWM
 SENT2=1
T2CON = %00000001     'sincroniza reloj externo, apaga oscilador, 1:1 preescaler
VEL=125
TMR0=0                'CONTADOR A CERO
portc.5=1             'SENTIDO DE GIRO
HPWM 2, VEL,FPWM        'MOTOR GIRA SENTIDO=1 CON HPWM DE CCP2
HPWM 1, 0, FPWM         'SENTIDO=0 NO GIRA VEL=0 EN EL CCP1
MOV=1

Inicio:
    IF B1=1 THEN GOTO CAM_POS  'si presiono B1 cambio la posicion a la que
    IF SENT2 <> PORTC.5 THEN    'si cambia el sentido de giro contador a cero
        SENT2=PORTC.5          'ultimo sentido de giro se actualiza
        TMR0=0                 'contador a cero
    ENDIF
 IF INTCON.2=1 THEN       'se desbordo el TMR0?
    
    IF PORTC.5 = 1 THEN   'sentido=1 acumula, si no descuenta
        ACUM=ACUM+256       
    ELSE
        ACUM=ACUM-256
    ENDIF
     INTCON.2=0           'apago bandera de desbordamiento
 ENDIF
    
    if PORTC.5 = 1 then    ' aqui esta el valor real del contador
        VTMR1=ACUM + TMR0  ' contador = acumulado mas valor actual del TMR0
    else
        VTMR1=ACUM - TMR0  ' contador = acumulado menos valor actual del TMR0
    endif

    IF vTMR1 = POS THEN 'si llegaste al set point PWM=0 y frena el motor 
        VEL=0
        goto Frenar
    ENDIF
 GOTO Inicio

Frenar:
    hpwm 2,0,FPWM    'VEL=0
    HPWM 1, 0, FPWM  'VEL=0

    IF PORTC.5=1 THEN  'lo qu esta en el TMR0 se pasa al acumulado
        ACUM=ACUM+TMR0
    ELSE
        ACUM=ACUM-TMR0
    ENDIF
    FRENADO=1
    TMR0=0
    VEL = 0
    GOTO Inicio
    
CAM_POS:
    if B1=1 THEN GOTO CAM_POS
    PAUSE 10
    IF POS=650 AND MOV=1 THEN   'gira en sentido =1
        POS=2600
        MOV=0
        portc.5=1
        VEL=160
        TMR0=0
        HPWM 2,VEL,FPWM
        HPWM 1, 0, FPWM
    ENDIF
 
    IF POS=2600 AND MOV=1 THEN  'gira en sentido=0
        POS=650
        portc.5=0
        VEL=160
        TMR0=0
        MOV=0
        HPWM 2,0,FPWM
        HPWM 1, VEL, FPWM
    ENDIF
    MOV=1
    GOTO INICIO 
 
 serie:
 DISABLE
 'PIE1.5=0
'if RCSTA.1=1 then
''gosub resetusart
'PORTB.4=1
'PAUSE 500
'PORTB.4=0
'RCSTA.4=0
'PAUSE 1
'RCSTA.4=1
'endif
'HSEROUT [12]
'PORTB.7=1
'PAUSE 100
'PORTB.7=0
'HSerin [char] ' Read USART and store character to next empty location
'HSEROUT [CHAR]

    If PIR1.4 = 1 Then  ' ' Wait for transmit register empty
        portb.7=1
        PAUSE 100
        PORTB.7=0
    ENDIF
    
    If PIR1.5 = 1 Then      ' If receive flag then...
           DATOE = RCREG      ' recibo datos del rs232 de la PC
     'hserin [datoe]
        PORTB.4=1
        PAUSE 100
        PORTB.4=0
        IF DATOE=="2" THEN PORTB.7 = 1   'esto nunca se cumple por que DATOE=r
        IF DATOE=="1" THEN PORTB.4 = 1   'esto nunca se cumple por que DATOE=q
        TXREG = DATOE         'envio lo que recibi hacia la PC
        Endif
    INTCON = %11000000
enable    
RESUME
    
END
```

Autotronico
esta muy bien el proyecto...en la medida de lo posible tratare de implementarlo $$$


----------



## holanda (Abr 11, 2011)

hola que tal,

quisiera saber si me pueden ayudar con el compilador picbasic pro 2.50C, ya que no me compila porque uso una versión de windows de 64 bits, no sé si exista alguna solución para que pueda compilar sin problemas en 64 bits, gracias saludos.


----------



## shura (Abr 12, 2011)

que tal amigos....

alguien me puede ayudar con un circuito de potencia de luces de 120 v

lo que pasa es q tengo un circuito secuencial y lo qiero extender a lamparas pero no se como hacer una etapa de potencia...para esto....

espero me puedan ayudar


----------



## carlos jara (Abr 12, 2011)

HOLA AMIGO MIRA ES SUPER FACIL el control de potencia lo puedes  hacer son reles o con opto o con triacs seria  bueno que pongas  un ejemplo de tu ckto  y pues  te aseguro  que te podriamos  ayudar


----------



## shura (Abr 13, 2011)

aqi agrego el circuito en proteus para ver si me pueden ayudar con un control de potencia de 110/220V y 12V....

espero me puedan ayudar...

saludos


----------



## lubeck (Abr 13, 2011)

> control de potencia de 110/220V y 12V....


 

especifica mas este punto como 110v y12v????

los 110v son CA y los 12v son CC???
necesitas dos circuitos independientes o uno solo para los 2 (110vAc y 12Vcc)???
o sera alimentado con 12v y la etapa esde 110...???

a segun lo que imagino lo podrias hacer con reles para no complicarlo  Tanto...


----------



## shura (Abr 13, 2011)

disculpen por no haber especificado jejeje

la etapa de potencia lo quiero alimentar a 12 volts con focos de 6 volts

espero me puedas ayudar....con el diseño en proteus....

necesito dos circuitos independientes, la etapa de circuito de control es alimentado por 5Vcc y la etapa de potencia quiero qe sea a 12Vcc para focos de 6Vcc, la etapa de conttrol es el archivo que les deje en proteus...


----------



## lubeck (Abr 13, 2011)

> espero me puedas ayudar....


si te ayudo pero......



> con focos de 6 volts


Sabes o puedes medir el consumo de esos focos de 6v????
o de cuantos watts son  o algo de informacion al respecto...


----------



## shura (Abr 13, 2011)

aa ok ai te van las especificaciones de los focos....

Foco miniatura de bayoneta, de 6,3 Volts, 
0,94 Watts, 
150 mA 
52 candelas. 
Mide 9,8 mm de diámetro

te sirve esto???

agrego una foto del foco....


----------



## lubeck (Abr 13, 2011)

> te sirve esto???


 
sip.. espera...

A ver....

Yo lo haria asi...

supongo que es para instalar en un auto asi que sobraria decirte que necesitarias una fuente de 2A o mayor... pero bueno...

segun mis calculos la suma de los consumos de las lamparas es de 1.2A y los reguladores como el 7806 normlmente son de 1A asi que qedaria muy justo por lo que te sugiero que metas dos reguladores o que consigas uno de 2A creo que su codigo es el 78S06 (si lo hay)...
(u otra alternativa seria poner unos transistores pero es mas complicado que poner 2 reguladores)

bue sin tanto preambulo revizalo y a ver que opinas...


----------



## shura (Abr 13, 2011)

quedo estupendo amigo..mil gracias por tu apoyo...ya lo probe en proteus y si funciona...estupendo!!!

**umm tengo una pregunta....las lamparas que pusistes en el diseño estan configuradas a 12Vcc y la qe te comente es de 6Vcc, para el diseño con mis lamparas hay qe cambiarle el valor de resistencia o se puede dejar tal y como me lo marcas con los valores q me pusistes...???

**Otra Pregunta: No entiendo muy bien el simbolo de tierra, estas van conectadas al polo negativo de la fuente? o hay que conectarlas a algun aditamento q sea tierra fisica???


----------



## lubeck (Abr 13, 2011)

> las lamparas que pusistes en el diseño estan configuradas a 12Vcc y la qe te comente es de 6Vcc, para el diseño con mis lamparas hay qe cambiarle el valor de resistencia o se puede dejar tal y como me lo marcas con los valores q me pusistes...???


 
asi dejalo sirve con esas resistencias....



> No entiendo muy bien el simbolo de tierra, estas van conectadas al polo negativo de la fuente? o hay que conectarlas a algun aditamento q sea tierra fisica???


 
si es  el polo negativo de la fuente... no no hay que poner nada a tierra fisica... (imagino que te refieres a la tierra o sea el planeta)


----------



## shura (Abr 13, 2011)

ya estas ...clarisimo

ya le agrege tambien los leds....y funciona perfecto...

muchisimas gracias amigo....


----------



## lubeck (Abr 13, 2011)

> y por ejemplo si quiero dejarle los leds,
> ¿tengo qe derivar de las salidas del PIC una resistencia de 330 para los leds???
> afectaria en algo a los focos??


 
podrias derivarlo como dices.... o estaria mas relajado el pic, si los pusieras en paralelo con el foco...

con respecto a las lamparas en el simulador dale click derecho y en las propiedades ponle 6v y una resistencia de 42 Ohms... veras que funciona igual....
asi como en la imagen...


----------



## shura (Abr 13, 2011)

ya le puse los valores que me diste y jala excelente..

solo para comprender bien 
por que defines una resistencia de 42ohms al foco?? ay alguna razon o calculo??


----------



## lubeck (Abr 13, 2011)

> ay alguna razon o calculo??


 
es calculo

el voltaje es de 6.3
y el consumo es de 150mA o sea .150A segun la info que me diste...

por ley de ohm V=I*R y despejando r=V/I donde r=6.3/.150=42 Ohms
si tu mides con un tester la resistencia interna del foco debe rondar por esos Ohms 

por otro lado creo que en la R1 puse 220 Ohms por error pero las resistencias de R1 a R8 deben ser de áprox. 1k


----------



## shura (Abr 13, 2011)

ya estas amigo..

bueno como puedo sacar la lista de estos componentes en proteus con todos sus especificaciones, por ejemplo los capacitores el voltaje qe debe ser...para poder ir y comprarlos en la electronica....o me puedas pasar la lista....


----------



## lubeck (Abr 13, 2011)

Busca en el menu una opcion que dice* bill of Materials*
*- *Los capacitores con voltaje mayor a 12v 
-las resistencias en 1/4 o 1/8 de vatio o no importa si es mayor...
-los capacitores con nF  pF son ceramicos y los de uF son electroliticos


----------



## shura (Abr 13, 2011)

gracias amigo por ayudarme en todo esto....eres buena onda...

te puedo mandar un circuito a tu correo q aparece..para ver si me lo puedes revisar y decir si esta bien o ay qe hacer correcciones??? puedes agregarle las correcciones y agregarle una fuente de voltaje de 12V a 5V, asi como me ayudaste con este pasado....


----------



## lubeck (Abr 13, 2011)

si gustas mandalo... y te doy mi opinion...


----------



## shura (Abr 13, 2011)

te envio el circuito q te comente...espero me puedas ayudar a revisarlo y mejorarlo-.--..

le puedes agregar un regulador de voltaje de 12v a 5v

saludos


----------



## CHR (Abr 13, 2011)

Que tal con todos, estuve leyendo acerca del timer1, y me surgio la idea de hacer un tacometro usando este timer en modo contador.
Le pregunte a mi profesor y me dijo que si, pero que debía calcular los ciclos de maquina y hay me mato.
Estuve leyendo acerca de esto y calcule que el ciclo de maquina con cristal de 20MHz es igual a 0.05 micro segundos.
Pero mi problema esta en como usar todo esto en una programación de un tacometro. Si me podrían explicar como hacer estos cálculos o como usarlos para sacra la equivalencia en rpm.
Gracias por su ayuda de antemano

perdon para sacar la equivalencia en rpm


----------



## shura (Abr 14, 2011)

que tal lubeck----

umm pudistes revisar mi circuito....???


----------



## Nano24 (Abr 14, 2011)

Hola a todos, quisiera pedirles una ayuda con una duda que tengo pero aun no tengo muy claro como resolverla, me compre un par de servomotores y les quite el potenciometro y aparte el tapón que lleva el engranaje para trucarlos a 360 grados, mi duda es si se pueden configurar para manejar las velocidades del servomotor con el circuito de control que ellos traen?


----------



## 31587 (Abr 14, 2011)

autotronico 
yo tb realise un proyecto con matrices de led solo q yo solo utilise dos matrices y con el pic 16f877 y me funciono.
una consulta cuales son los codigos para hacer con mas matrices de led  haber si m das una ayuda m trave en esa parte.


----------



## shura (Abr 15, 2011)

que tal amigos espero me puedan ayudar con este circuito qe debe ser intermitente, pero no me sale el efecto, lo estoy simulando en proteus..

les agrego el archivo en proteus..

espero me puedan ayudar....selos agradeceria mucho


----------



## rascueso (Abr 15, 2011)

hola amigos! tengo un codigo echo en MicroCode Studio de una cerradura electronica con pic 16f877a y lcd 2x16. no tengo conocimientos de programación pero mirando un tutorial del programa fui editando unas cuantas cosas que quería lograr. ahora me quede trabado en la ultima, el programa no tiene la salida para encender el led del lcd. me gustaría si alguien puede que me diga que tengo que hacer para que encienda cuando hay actividad en los pulsadores ej. si no se esta pulsando nada que este apagado, ahora cuando se toca algún pulsador que encienda y que quede prendido. cuando pasa un minuto sin pulsar nada que se apague. es posible esto?? yo estaba tratando de usar la salida portc.7 pero la usa para otra cosa
dejo el codigo si alguien puede darme una mano se lo agradezco. aludosss


```
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Luis Perez *
'* Notice : Copyright (c) 2010 IB-electronic *
'* : All Rights Reserved *
'* Date : 06/10/2010 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
@ device pic16f877a, wdt_off, lvp_off,xt_osc,xt_osc
define osc 4
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4 
DEFINE LCD_RSREG PORTD 
DEFINE LCD_RSBIT 0 
DEFINE LCD_RWREG PORTD 
DEFINE LCD_RWBIT 1
DEFINE LCD_EREG PORTD 
DEFINE LCD_EBIT 2

cmcon=7
TRISA=0:porta=0
trisb=%11111000:portb=0
trisc=%11111100
trisd=0:portb=0
trise=0:porte=0

Numero var byte
nu1 var byte
nu2 var byte
nu3 var byte
nu4 var byte
R var byte
x var byte
x=0

PARLAN VAR PORTC.0
LED VAR PORTC.1
PUERTA VAR PORTC.2
PC var portc.3
PA var portc.7

F1 VAR PORTB.0
F2 VAR PORTB.1
F3 VAR PORTB.2
F4 VAR PORTB.3

C1 VAR PORTB.4
C2 VAR PORTB.5
C3 VAR PORTB.6
C4 VAR PORTB.7

Car1 var byte
Car2 var byte
Car3 var byte
Car4 var byte
dato var byte

Pre: 
lcdout $FE,1:LCDout $FE,$80,"Llave electronic"
pause 500
lcdout $Fe,$C0,"ib-electronic"

INICIO:
HIGH LED : SOUND parlan,[100,50]:high parlan
LOW LED : LOW parlan

'*********************************************
'Claves por defecto=1234:
'*********************************************
eeprom 0,[1,2,3,4]
RESET:
read 0,car1
read 1,car2
read 2,car3
read 3,car4


goto TEcla1


TEcla1:
lcdout $fe,1
lcdout $FE,$80,"Clave:"

gosub teclado: lcdout $fe,$c0,"X" :gosub pid
gosub espacio
nu1=numero
if numero=car1 then TEcla2
goto false

TEcla2:
gosub teclado : lcdout $fe,$c0,"XX" : gosub pid
gosub espacio
nu2=numero
if numero=car2 then TEcla3
goto false1

Tecla3:
Gosub Teclado : lcdout $fe,$c0,"XXX" : gosub pid
gosub espacio
nu3=numero
if numero=car3 then Tecla4
goto false2

TEcla4:
gosub teclado : lcdout $fe,$c0,"XXXX" : gosub pid
gosub espacio
nu4=numero
if numero=car4 then compara
goto false3

Compara:
if (nu1=car1) and (nu2=car2) and (nu3=car3) and (nu4=car4) then open
goto false3

PID:
SOUND parlan,[100,10] : high led
pause 300
low parlan :low led
return

Espacio:
pause 300
return

False:
goto tecla2

False1:
goto tecla3

False2:
goto tecla4

False3:
lcdout $fe,1
lcdout $FE,$80,"Clave:"
lcdout $FE,$C0,"incorrecta"

for r= 1 to 20
high led : SOUND parlan,[100,10] : high pc
pause 50
low led : SOUND parlan,[50,10] : low pc
pause 50
next

high pc
pause 2000
low pc
goto tecla1

OPen:
lcdout $fe,1
lcdout $FE,$80,"Clave:"
lcdout $FE,$C0,"Correcta"

for r=0 to 2
high led:SOUND parlan,[100,10];high parlan
pause 100
low led :SOUND parlan,[50,10];low parlan
pause 100
next

Menu:
lcdout $fe,1
lcdout $fe,$80,"Bienvenido"
lcdout $fe,$C0,"RAS"
pause 1000
lcdout $fe,1
lcdout $fe,$80,"Menu"
lcdout $fe,$c0,"1-Open 2-Clave"

Op:
gosub teclado
if numero=1 then door
if numero=2 then graba1
goto op

Door:
lcdout $fe,1
lcdout $fe,$80,"Puerta"
lcdout $fe,$C5,"Abierta"

high puerta :high pa
pause 5000
low pa :low puerta
goto tecla1


Graba1:

lcdout $fe,1 
lcdout $fe,$80,"Cambiar Clave" 
lcdout $fe,$c0,"----" 

high led : SOUND parlan,[100,300] : pause 1000 : low led : low parlan
gosub teclado:gosub PID 

lcdout $fe,$c0,"X--" 

write 0,numero
pause 300

Graba2:
gosub teclado:gosub PID

lcdout $fe,$c0,"XX--" 

write 1,numero
pause 300

Graba3:
gosub teclado:gosub pid

lcdout $fe,$c0,"XXX-" 

Write 2,numero
pause 300

Graba4:
gosub teclado:gosub pid

lcdout $fe,$c0,"XXXX"

write 3,numero
pause 300

lcdout $fe,1 
lcdout $fe,$80,"Clave guardada" 
lcdout $fe,$c0,"xxxx" 

for r = 0 to 5
SOUND parlan,[100,10] : high led
pause 100
SOUND parlan,[50,10] : low led
pause 100
next
goto RESET

Teclado:
low f1
if c1=0 then numero=7:return
if c2=0 then numero=8:return
if c3=0 then numero=9:return
high f1

low f2
if c1=0 then numero=4:return
if c2=0 then numero=5:return
if c3=0 then numero=6:return
high f2

low f3
if c1=0 then numero=1:return
if c2=0 then numero=2:return
if c3=0 then numero=3:return
high f3

low f4
if c1=0 then numero=10:return
if c2=0 then numero=0:return
if c3=0 then numero=11:return
high f4

pause 10
GOTO teclado

end
```


----------



## arturouc (Abr 15, 2011)

aqui les dejo el codigo del control de un servomotor con encoder de un canal
se utiliza el Timer 0 como contador (RA4), la posicion se envia por el puerto serie (USART),
las velocidades se controlan con HPWM, ccp1 y ccp2 para cada sentido de giro
desarrolle una pequenia rutina para enviarle un numero mayor al 255 (buffer de 1 byte), lo que hace es interpretar el caracter que llego y asignarle una cantidad.   sigue el PID e I2C

Amigo AUTOTRONICO gracias por todos tus aportes, en lo que te pueda ayudar con la comunicacion serial...

aqui les dejo el codigo del micro, regresando de semana santa les subo un ejemplo de un programa en VB6 para enviarle posisiones al micro, si les interesa claro?


```
CLEAR
INCLUDE "modedefs.bas"
DEFINE OSC 4
TRISC = %10000001
TRISB = %00000000
CR CON 13

DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_BAUD 2400

INTCON = %11000000 ' activamos las interrupciones y las de periféricos
ON INTERRUPT GoTo serie ' Declare interrupt handler routine
PIE1.5 = 1 ' activamos la interrupción de recepción de la USART

OPTION_REG =%11100000   'TMR0 EN MODO CONTADOR

ADCON1=7                'PUERTO A DIGITAL
TRISA = %111111         'PUERTO A COMO ENTRADAS
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
DEFINE CCP2_REG PORTC
DEFINE CCP2_BIT 1
DEFINE HPWM2_TIMER 2  '
DATO VAR BYTE[8]
NUM VAR BYTE[8]
I VAR BYTE

INDICE VAR BYTE
VDEC VAR BYTE
BORRAR VAR BIT
VTMR1 VAR WORD             'variable para acumular captura del timer1
CAPTURA VAR WORD
SENTIDO VAR BIT            'sentido de giro
FRENADO VAR BIT
MOV VAR BIT
FPWM VAR WORD              'frecuencia del pwm 
VEL VAR BYTE               'velocidad de gigo del motor 0-255
POS VAR WORD               'set point
ACUM VAR WORD
DESCONTAR VAR WORD
SENT2 VAR BIT
DATOACUM VAR WORD
DATOACUM=0
DATOE VAR WORD          'VARIABLE PARA CAPTURAR ENTRADA DEL RS232
DATOS VAR WORD          'VARIABLE PARA ENVIAR DATAOS POR RS232
DATOE=0
INTCON.2=0              'bandera que se activa cuando se desborda el TMR0
 
 ACUM=0
 VTMR1=0
 SENTIDO=1
 POS=0                   ' pulsos del encoder
 FRENADO=0
 FPWM=15000                'FRECUENCIA PARA HPWM
 SENT2=1
T2CON = %00000001     '
VEL=0  '125
TMR0=0                'CONTADOR A CERO
portc.5=1             'SENTIDO DE GIRO =1
BORRAR=0
CARACTER=0

MOV=1
INDICE=1

Inicio:

    IF SENT2 <> PORTC.5 THEN    'si cambia el sentido de giro contador a cero
        SENT2=PORTC.5          'ultimo sentido de giro se actualiza
        TMR0=0                 'contador a cero
    ENDIF
 IF INTCON.2=1 THEN       'se desbordo el TMR0?
    
    IF PORTC.5 = 1 THEN   'sentido=1 acumula, si no descuenta
        ACUM=ACUM+256       
    ELSE
        ACUM=ACUM-256
    ENDIF
     INTCON.2=0           'apago bandera de desbordamiento
 ENDIF
    
    if PORTC.5 = 1 then    ' aqui esta el valor real del contador
        VTMR1=ACUM + TMR0  ' contador = acumulado mas valor actual del TMR0
    else
        VTMR1=ACUM - TMR0  ' contador = acumulado menos valor actual del TMR0
    endif

    IF VTMR1> POS THEN
        IF VTMR1-POS< 40 THEN VEL=60
        PORTC.5=0
        HPWM 1, VEL, FPWM
        HPWM 2,0,FPWM
    ENDIF
    IF VTMR1< POS THEN
        IF POS-VTMR1< 40 THEN VEL=60
        PORTC.5=1
        HPWM 2, VEL, FPWM        
        HPWM 1,0,FPWM
    ENDIF
    IF vTMR1 = POS THEN 'si llegaste al set point PWM=0 y frena el motor 
        VEL=0
        goto Frenar
    ENDIF
 GOTO Inicio

Frenar:
    hpwm 2,0,FPWM    'VEL=0
    HPWM 1, 0, FPWM  'VEL=0

    IF PORTC.5=1 THEN  'lo qu esta en el TMR0 se pasa al acumulado
        ACUM=ACUM+TMR0
    ELSE
        ACUM=ACUM-TMR0
    ENDIF
    FRENADO=1
    TMR0=0
    VEL = 0
    GOTO Inicio
    
 
 serie:
 DISABLE
 
HSerin [DATOE] ' recibo el caracter de la pc por el rs232
 DATO[INDICE]=DATOE
 INDICE=INDICE+1
 
 IF DATOE=="*" THEN  ' cuando del PC llaga un "*" interpreto el numero que recibi
  BORRAR=1
 INDICE=1
 FOR I=1 TO 7
    SELECT CASE DATO[I] 'dato que recibi
        CASE 48                 ' es un cero?
            NUM[I]=0           
        CASE 49                 ' es un uno?
            NUM[I]=1
        CASE 50                 ' es un dos?
            NUM[I]=2
        CASE 51                 'creo que ya entendiero....
            NUM[I]=3
        CASE 52
            NUM[I]=4
        CASE 53
            NUM[I]=5
        CASE 54
            NUM[I]=6
        CASE 55
            NUM[I]=7
        CASE 56
            NUM[I]=8
        CASE 57                   ' es un nueve?
            NUM[I]=9
        CASE ELSE    'CUALQUIER OTRO CARACTER LO TOMA COMO CERO "O"
            NUM[I]=0
    END SELECT 
 NEXT I
 'aqui determino que numero me enviaron por el PC
 DATOACUM=NUM[7] + NUM[6]*10 + NUM[5]*100 + NUM[4]*1000 + NUM[3]*10000 +NUM[2]*100000 + NUM[1]*1000000
 
 POS=DATOACUM              'asigno la posicion
 VEL=160                         ' velocidad cte...
 TMR0=0
 ENDIF       

  hserout[DATOE]             'envio lo que recibo....nomas...
 
    INTCON = %11000000
enable    
RESUME
    
END
```


----------



## atricio (Abr 16, 2011)

claro es chevere ver la interface es como si tubiera vida de verdad ojala puedas colocar un poco de informacion como se debe hacer eso con VB


----------



## autotronico (Abr 16, 2011)

arturouc estoy en eso primero vere como puedo aplicar la comunicacion serial VB6 y luego la HID USb ya que estoy utilizando un pic de la serie 18f , te felicito por tus avances en el proyecto encoder cuando ya tenga algo mas estructurado lo posteare saludos.


----------



## arturouc (Abr 16, 2011)

En esta PC no tengo visual, pero el codigo para comunicarse con el micro por el puerto serie es algo como lo siguiente:
agrego un commanbutton que en el caption diga "Abrir Puerto" y cuando presiono el boton pregunto si el puerto esta abierto, si no esta abierto lo abro con los parametros que quiero, y si esta abierto, lo cierro y lo abro con los parametros que quiero.

agrego otro commandbutton para enviar datos por el puerto serie (ejem. Nombre: cmdEnviar)
agrego un cuadro de texto (txtEnviar) para poner la posicion del servomotor
Private Sub cmdEnviar_Click()
MSComm1.Output = txtComunicacion.Text
End Sub

agrego otro cuadro de texto (este le cmbio las dimensiones, osea lo ago mas grande para mostrar todo lo que envio y recibo por el puerto serie) le cambio la propiedad Multiline=True
y ScrollBars =2 - vertical (txtComunicacion)

agrego un timmer para mostrar la comunicacion Interval=10 mS

Private Sub tmrCom_Timer()
If MSComm1.Buffercout > 0 Then
    txtComunicacion.Text = txtComunicacion.Text & MSComm1.Input & vbCrLf
End If
End Sub

para el codigo que subi del servodriver en el cuadro de texto txtEnviar pongo la posicion con un "*" al final de la posicion ejem 0002600* al mandarle este valor el servodriver cuanta 2600 pulsos y se detiene...


----------



## 31587 (Abr 17, 2011)

RASCUESO
Aquí te mando un programa de una cerradura electr+onica en el programa pic basic con el mismo pic 16F877 solo que esta tiene un teclado 4x3

' Programa en Pic Basic Pro

```
Define Osc 4 ' Define el Oscilador de 4 Mhz.

TRISA = %00000000  ' Configuración de Puertos:
TRISB = %00000000
TRISD = %01111000

I VAR Byte ' Declaramos la Variable I
VAR1 VAR Byte ' Declaramos la Variable VAR1
DIRECCION VAR Byte ' Declaramos la Variable DIRECCION
DATO VAR Byte ' Declaramos la Variable DATO

Pause 200 ' Pausa de 200 milisegundos
Lcdout $fe, 1 ' Limpia la pantalla
Lcdout $fe, 2 ' Posiciona el cursor en el inicio
Lcdout "Memoria de Datos"
Lcdout $fe,$C0, "****************"
Pause 3000 ' Pausa de 3 segundos
DIRECCION = $00 ' Asignamos una dirección inicial

Inicio:
Lcdout $fe, 1 ' Limpia la pantalla
Lcdout $fe, 2 ' Posiciona el cursor en el inicio
Lcdout "Direccion: ",#DIRECCION," "
Lcdout $fe,$C0, "Dato?: "

espera1:
Call Teclado
If VAR1 = 0 Then espera1 'Si ninguna tecla fue pulsada salta a “espera1”
If VAR1 = 10 Then espera1 'Si pulsamos la tecla asterisco salta “espera1”
If VAR1 = 11 Then VAR1 = 0 'Si pulsamos la tecla “0”, entonces VAR1 = 0
If VAR1 = 12 Then espera1 ' Si pulsamos la tecla numeral salta “espera1”
Lcdout $fe,$C0, "Dato?: ",#VAR1," "
Write DIRECCION,VAR1 ' Escribe el valor en la memoria de datos
DIRECCION = DIRECCION + 1 ' Aumentamos la posición en una unidad
Pause 1000 ' Espera 1 segundo para simular un tiempo de grabación
Lcdout $fe,$C0, "Dato Almacenado"
Pause 1000 ' Espera 1 segundo para visualizar el mensaje
If DIRECCION = $0F Then Aviso ' Revisa si llegamos al límite asignado por
' el programador en la memoria de datos
GoTo inicio
Aviso:
Lcdout $fe, 1 ' Limpia la pantalla
Lcdout $fe, 2 ' Posiciona el cursor en el inicio
Lcdout " Memoria llena! "
Lcdout $fe,$C0, "****************"
Parada:
GoTo Parada
Teclado:
VAR1 = 0
PORTD.0 = 0 ' Columna 1 = 0
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 1 ' tecla "1"
If PORTD.4 = 0 Then VAR1 = 4 ' tecla "4"
If PORTD.5 = 0 Then VAR1 = 7 ' tecla "7"
If PORTD.6 = 0 Then VAR1 = 10 ' tecla "*"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 0 ' Columna 2 = 0
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 2 ' tecla "2"
If PORTD.4 = 0 Then VAR1 = 5 ' tecla "5"
If PORTD.5 = 0 Then VAR1 = 8 ' tecla "8"
If PORTD.6 = 0 Then VAR1 = 11 ' tecla "0"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 0 ' Columna 3 = 0
If PORTD.3 = 0 Then VAR1 = 3 ' tecla "3"
If PORTD.4 = 0 Then VAR1 = 6 ' tecla "6"
If PORTD.5 = 0 Then VAR1 = 9 ' tecla "9"
If PORTD.6 = 0 Then VAR1 = 12 ' tecla "#"
Return ' Retorna una línea después del llamado "Call"
EndLcdout $fe,$C0, "Dato Almacenado"
Pause 1000 ' Espera 1 segundo para visualizar el mensaje
If DIRECCION = $0F Then Aviso ' Revisa si llegamos al límite asignado por
' el programador en la memoria de datos

GoTo inicio
Aviso:
Lcdout $fe, 1 ' Limpia la pantalla
Lcdout $fe, 2 ' Posiciona el cursor en el inicio
Lcdout " Memoria llena! "
Lcdout $fe,$C0, "****************"
Parada:
GoTo Parada
Teclado:
VAR1 = 0
PORTD.0 = 0 ' Columna 1 = 0
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 1 ' tecla "1"
If PORTD.4 = 0 Then VAR1 = 4 ' tecla "4"
If PORTD.5 = 0 Then VAR1 = 7 ' tecla "7"
If PORTD.6 = 0 Then VAR1 = 10 ' tecla "*"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 0 ' Columna 2 = 0
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 2 ' tecla "2"
If PORTD.4 = 0 Then VAR1 = 5 ' tecla "5"
If PORTD.5 = 0 Then VAR1 = 8 ' tecla "8"
If PORTD.6 = 0 Then VAR1 = 11 ' tecla "0"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 0 ' Columna 3 = 0
If PORTD.3 = 0 Then VAR1 = 3 ' tecla "3"
If PORTD.4 = 0 Then VAR1 = 6 ' tecla "6"
If PORTD.5 = 0 Then VAR1 = 9 ' tecla "9"
If PORTD.6 = 0 Then VAR1 = 12 ' tecla "#"
Return ' Retorna una línea después del llamado "Call"
End

hola rascueso
ups je je hubo un problema en el anterior codigo este es el correcto hojala q t sirva d algo  
' Programa en Pic Basic Pro
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
' Configuración de Puertos:
TRISA = %00000000
TRISB = %00000000
TRISD = %01111000
' Declaramos las variables:
X VAR Byte
VAR1 VAR Byte
DIGITO VAR Byte[7]
CLV VAR Byte[7]
' Guardamos cada digito de la clave en las posiciones elegidas previamente:
Write 10, 1 ' Primer dígito de la clave
Write 11, 2 ' Segundo dígito de la clave
Write 12, 3 ' Tercer dígito de la clave
Write 13, 4 ' Cuarto dígito de la clave
Write 14, 5 ' Quinto dígito de la clave
Write 15, 6 ' Sexto dígito de la clave
' Iniciamos el sistema con una bienvenida:
Inicio:
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut "Cont. de Acceso"
LCDOut $fe,$C0, "** Bienvenido **"
Pause 2000 ' Hacemos una pausa de 2 segundos
Call Beep ' Generamos un sonido
Clave:
X = 0 ' inicializamos la variable X = 0
Read 10, CLV[1] ' leemos el primer dígito y lo guardamos en CLV[1]
Read 11, CLV[2] ' leemos el segundo dígito y lo guardamos en CLV[2]
Read 12, CLV[3] ' leemos el tercer dígito y lo guardamos en CLV[3]
Read 13, CLV[4] ' leemos el cuarto dígito y lo guardamos en CLV[4]
Read 14, CLV[5] ' leemos el quinto dígito y lo guardamos en CLV[5]
Read 15, CLV[6] ' leemos el sexto dígito y lo guardamos en CLV[6]
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut "Introduzca su "
LCDOut $fe,$C0, "Clave de Acceso:"
Call Beep ' Generamos un sonido
Consulta:
Call Teclado ' Consultamos el teclado
If VAR1 = 0 Then consulta ' Si no hay una tecla pulsada vuelve a consultar
' Si VAR1 es diferente de cero, significa que pulsamos una tecla, por lo
' tanto generamos un sonido y continuamos…
Call Beep ' Generamos un sonido
' Seguidamente lo que hacemos es almacenar
' en seis variables definidas
' por el programador los dígitos introducidos
' desde el teclado matricial
' para luego ser comparados con los valores
' almacenados en la memoria de datos.
X = X + 1
DIGITO[X] = VAR1 ' El valor de la tecla pulsada lo
' guardamos en la variable correspondiente
If X = 6 Then comprobar ' Si X = 6 estamos guardando en DIGITO[6]
' el último valor introducido desde el
' teclado matricial
GoTo consulta ' Si X es diferente de 6 continuamos
' esperando el siguiente valor a ser
' ingresado desde el teclado
' A partir de la siguiente etiqueta empezamos la comprobación,
' y el formato es:
' Si DIGITO[X] es igual a CLV[X] el digito es correcto,
' y salta a la etiqueta “paseX”,
' si es diferente salta a la subrutina “error”; veamos…
Comprobar:
If DIGITO[1] = CLV[1] Then pase1:GoTo error
pase1:
If DIGITO[2] = CLV[2] Then pase2:GoTo error
pase2:
If DIGITO[3] = CLV[3] Then pase3:GoTo error
pase3:
If DIGITO[4] = CLV[4] Then pase4:GoTo error
pase4:
If DIGITO[5] = CLV[5] Then pase5:GoTo error
pase5:
If DIGITO[6] = CLV[6] Then correcto:GoTo error
' Si los seis dígitos han sido correctos se ejecuta la subrutina correspondiente.
Correcto:
Pause 500
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut " * * * * * * "
LCDOut $fe,$C0, "Clave Correcta!"
Call beep ' Generamos un sonido
Pause 3000 ' Pausa para visualizar el mensaje
GoTo inicio
Error:
Pause 500
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut " * * * * * * "
LCDOut $fe,$C0, " ERROR! "
Call beep ' Generamos un sonido
Call beep ' Generamos un sonido
Call beep ' Generamos un sonido
Pause 1500 ' Pausa para visualizar el mensaje
GoTo clave ' Salta a “clave” para nueva oportunidad
' La siguiente subrutina genera un “Beep” en el Buzzer
' conectado en RC0.
Beep:
High portc.0 ' Estado Lógico Alto para RC0
Pause 100 ' Pausa de 100 milisegundos
Low portc.0 ' Estado Lógico Bajo para RC0
Pause 100 ' Pausa de 100 milisegundos
Return ' Retorna una línea después del llamado "Call"
Teclado:
VAR1 = 0
PORTD.0 = 0 ' Columna 1 = 0
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 1 ' tecla "1"
If PORTD.4 = 0 Then VAR1 = 4 ' tecla "4"
If PORTD.5 = 0 Then VAR1 = 7 ' tecla "7"
If PORTD.6 = 0 Then VAR1 = 10 ' tecla "*"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 0 ' Columna 2 = 0
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 2 ' tecla "2"
If PORTD.4 = 0 Then VAR1 = 5 ' tecla "5"
If PORTD.5 = 0 Then VAR1 = 8 ' tecla "8"
If PORTD.6 = 0 Then VAR1 = 11 ' tecla "0"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 0 ' Columna 3 = 0
If PORTD.3 = 0 Then VAR1 = 3 ' tecla "3"
If PORTD.4 = 0 Then VAR1 = 6 ' tecla "6"
If PORTD.5 = 0 Then VAR1 = 9 ' tecla "9"
If PORTD.6 = 0 Then VAR1 = 12 ' tecla "#"
Return ' Retorna una línea después del llamado "Call"
End
```


----------



## dabopeyton (Abr 19, 2011)

buenas,  expertos en la materia en programacion necesito ayuda para programar un teclado hexadecimal pero lo quiero manejar con el puerto b y un display 7 segmento en el puerto C del pic, y en el puerto D conectar 4 leds en los bits menos significativos. apenas me inicializo en esto es apenas mi primera practica lo veo muy complejo, ya que es apenas es la primera practica y ni eh visto clase teorica estado leyendo tutorial de proton y proteus, El micro q uso es el PIC 16f877 y lo estoy programando en proton. quien tenga algo parecido o por lo menos ideas del teclado 4x4, por favor necesito ayuda de como lograrlo,


----------



## Nano24 (Abr 19, 2011)

Buenas amigos alguien por favor me podría dar una idea de como programar un medidor de distancias con PICBASIC?

Se que usando el comando COUNT con una variable de peso BYTE o WORD se puede lograr pero la cosa es que tengo que hacer para medir entre distancia y tiempo? No se si alguien sabe algo respecto al tema se lo agradecería.


----------



## javisknt (Abr 20, 2011)

mira veras nesesito hacer desplazar letras con leds al momento de hacer girar un motor y no tengo muxa experiencia programando mas o menos esta es la idea












ya todos esos mas o menos esta la idea nose si me puedes ayudar
saludos


----------



## rascueso (Abr 20, 2011)

31587 perdona que no te di las gracias antes amigo. tuve unos dias complicados. no lo pude compilar todavía me tira unos errores pero ya me pongo a analizar un poco. saludoss


----------



## mecatrodatos (Abr 21, 2011)

D@rio

Mi pregunta es la siguiente: puedo o no puedo generar una señal de 38khz con un pic16f628 con clock interno mediante la instruccion freqout???

Darío es mejor utilizar el CCP1CON y configúralo de la siguiente manera:



> ****** Coneccion pic 16f628a******
> 'B3(P9)  - 38KHz de salida
> 'B1(P7) SWdown --> pull-up (to 5V) via 4,7K --> a GND si esta presionado
> 'B2(P8) SWup   --> pull-up (to 5V) via 4,7K --> a GND si esta presionado
> ...


Puesto con ello se genera una onda de 38 Khz precisa y por medio de registros del mismo PIC. Para mayor entendimiento te dejo un programa que emite por el pin B3 del pic 16f628A la frecuencia para utilización de sensores infrarrojos frecuencia ajustable por dos pulsadores ubicados en b1 y b2 respectivamente:


> '****** Coneccion pic 16f628a******
> 'B3(P9)  - 38KHz de salida
> 'B1(P7) SWdown --> pull-up (to 5V) via 4,7K --> a GND si esta presionado
> 'B2(P8) SWup   --> pull-up (to 5V) via 4,7K --> a GND si esta presionado
> ...



Al final dejo como adjunto esquemático y evidencia del programa

shura:

Como puedo hacer por medio de PIC16f877a o componentes hacer que leds...enciendan gradualmente y a pagen gradualmente??? cual seria el programita....diagrama....para realizar esto???

El proyecto se puede realizar de dos formas:

Con dos pulsadores aumentar y disminuir la frecuencia de parpadeo para ello se utiliza las instrucciones FOR NEXT ejemplo:



> Bajar VAR portb.5
> Subir VAR portb.4
> Led VAR port.3
> X VAR byte
> ...



O a través de configuración del PWM:



> CMCON     = 7          ' PortA = digital I/O
> VRCON     = 0          '
> TRISB     = %11110000  ' B.3=PWM,B.0,B.1,B.2 ubicacion de LEDs
> PR2       = 25         ' Seleccinar PWM a 38KHz
> ...




CHR

Si me podrían explicar como hacer estos cálculos o como usarlos para sacra la equivalencia en rpm.
Gracias por su ayuda de antemano

Si  vas  ha realizar el proyecto con el pic 16f877A  lee esto primero:

Ver el archivo adjunto 36427



Nano24

Mi duda es si se pueden configurar para manejar las velocidades del servomotor con el circuito de control que ellos traen.

Lee esto por favor:
 _ https://www.forosdeelectronica.com/posts/329102/ _

http://www.servomotor.cc/wp-content/uploads/2010/03/Tutorial-Servomotor.pdf


31587

Una consulta cuales son los códigos para hacer con más matrices de led haber si m das una ayuda me trabe en esa parte.


rascueso

ahora cuando se toca algún pulsador que encienda y que quede prendido. cuando pasa un minuto sin pulsar nada que se apague. es posible esto?? yo estaba tratando de usar la salida portc.7 pero la usa para otra cosa


dabopeyton

Buenas, expertos en la materia en programación necesito ayuda para programar un teclado hexadecimal pero lo quiero manejar con el puerto b y un display 7.

Sube el diagrama y con gusto te colaboro

Nano24


Buenas amigos alguien por favor me podría dar una idea de como programar un medidor de distancias con PICBASIC.
Ver aquí:

http://www.rentron.com/Micro-Bot/IR_Sonar.htm


javisknt

Mira veras nesesito hacer desplazar letras con leds al momento de hacer girar un motor y no tengo muxa experiencia programando mas o menos esta es la idea

Mira aqui:
 _ https://www.forosdeelectronica.com/posts/445534/ _#934


----------



## rascueso (Abr 21, 2011)

mecatrodatos no entendí la parte de tu respuesta dirigida a mi... sera que hiciste copy/paste sin responder o mi pregunta es muy bolud../delirante?


----------



## mecatrodatos (Abr 22, 2011)

Cordial saludo perdona rascueso se me paso 

Con referente a lo tuyo hay un led indicador de tareas en programa que comentas , Ubicado en portc.1 , puedes realizar lo que necesitas con TMR0 en el  inicio del foro realice un contador hasta 5 minutos para poner a 1 seria de la siguiente manera:



> ' Define registros y bits del LCD  ‘ esto sobra en el programa de tu clave ya que están establecido lo dejo para que comprendas si lo desea o ve al proyecto :_ https://www.forosdeelectronica.com/posts/166115/ _
> 
> Define	LCD_DREG	PORTB
> Define	LCD_DBIT	0
> ...




Espero con ello haberte podido ayudar.

31587

Una consulta cuales son los códigos para hacer con más matrices de led haber si m das una ayuda me trabe en esa parte.

Ya que el proyecto difiere del integrado que utilices para realizar la comunicación del pic a la matriz de led cambia lo programación para los caracteres, si tienes algo súbelo por favor y con base a ello podemos trabajar.

electromario el codigo que subite se ve bien pero porque no subes el circuito debe haber algo con el hardware



dabopeyton dijo:


> buenas,  expertos en la materia en programacion necesito ayuda para programar un teclado hexadecimal pero lo quiero manejar con el puerto b y un display 7 segmento en el puerto C del pic, y en el puerto D conectar 4 leds en los bits menos significativos. apenas me inicializo en esto es apenas mi primera practica lo veo muy complejo, ya que es apenas es la primera practica y ni eh visto clase teorica estado leyendo tutorial de proton y proteus, El micro q uso es el PIC 16f877 y lo estoy programando en proton. quien tenga algo parecido o por lo menos ideas del teclado 4x4, por favor necesito ayuda de como lograrlo,



ir al tutorial de Proton


----------



## 31587 (Abr 22, 2011)

perdona rascueso hubo un error en el primer codigo hay una segunda corregida haber si te sirve 
ojo q el segundo corre sin ningun problema en pic basic


----------



## arturouc (Abr 22, 2011)

Aqui les dejo la simulacion completa del servodriver
Este ejemplo sirve para servomotores con encoder de 1 o 2 canales (1 canal RC5 salida, 2 canales RC5 entrada). utilizo el TMR0 como contador, ccp1 y ccp2 como HPWM, modulo USART para la comunicacion serie.
desde la PC se le envia la velocidad y la posicion ejem. 0102600*--> el "1" significa la velocidad y la posicion es SP=2600......otro ejm  0401456*--> el 4 es la velocidad y la posicion es SP=1456.....esto se lo pueden enviar por el hyperterminal van tecleando cada numero y cuando presionen "*" empieza el movimiento.....en el proteus pueden ver el set point y el valor real de posicion en un LCD

para poder simularlo en la PC necesitan un emulador de puerto serie aqui les dejo la pag. del que estoy utilizando   *Como no cumplo las Políticas del Foro. Me editaron el mensaje.*
      el Virtual Serial Ports Emulator trabaja muy bien lo configure en  dispositivo "Pair"........si tienen visual basic aqui les dejo un programa que baje de la web del programador, con este programa en el cuadro de texto le envio toda la informacion en un click. tambien les dejo un archivo para registrar el MSCOMM para VB6

Este proyecto es un driver para controlar la posicion de robots, le falta agregar el control PID y la comunicacion con otros drivers por el puerto I2C...

gracias a este foro y a la ayuda de Mecatrodatos (este hilo y muchos ejemplos), Autotronico (ejemplos avanzados de los modulos del pic), esavalla (ideas para leer el encoder), chico3001(ideas generales y de electronica), lubek (ejemplos proteus y comunicacion ) SOY ING. INDUSTRIAL y pude realizar este proyecto. SI SE PUEDE...

HABLANDO DE CONOCIMIENTO: Todos tenemos la misma capacidad, pero no todos tenemos la misma actitud para adquirirlo (AUC)

P.D. el servomotor de un canal se lo quite a una copiadora


----------



## holanda (Abr 22, 2011)

hola que tal:

quiero hacer un medidor de distancia con el SENSOR ULTRASONICO PING de paralax que solo tiene tres pin el de GND, 5V y sig, lo que no entiendo es como programarlo en el pic no se si este sensor genere por si solo el disparo de 40 khz, tengo este codigo hecho pero no se que tenga que configurarsele aun más o corregirle para mostrar el tiempo de ancho de pulso por ejemplo, creo que la formula para mostrar la distancia es (tiempo de ancho de pulso * 340(que sería la velocidad del sonido a 20°C)/2

codigo:

tiempo VAR Word

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50

TRISA=%1
ADCON1=%00001110

INICIO:

 PULSIN PORTD.0, 1,tiempo
 lcdout $fe,$80, "Tiempo = ", DEC5 tiempo

  pause 500

GOTO INICIO

END
========================
les agradecería mucho si me pudieran ayudar, gracias saludos.


----------



## atricio (Abr 22, 2011)

en el foro de proton hablaron de este tipo de cosas busca ahi creo que puedes encintrar esa informacion


----------



## rascueso (Abr 22, 2011)

no hay caso soy muy burro... voy a seguir intentando grax mecatrodatos y 31587 saludos


----------



## electromario (Abr 23, 2011)

Holanda, el PING de parallax no tienes mandar 40KHz, sino que tienes que mandar un pulso  (pulsout) por el mismo pin que el pulsin, recuerda que después de la instrucción pulsout el pin automáticamente se vuelve entrada, no necesitas usar ADC espero pasarte el código pronto. saludos

Acá te mando el código para el ping parallax



```
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto en el uC para el bus de datos de la LCD
DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 2 ' "RS" estará conectado en RD2
DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 3 ' "E" estará conectado en RD3
DEFINE osc 4
inicio:
Ping var portb.0 

Trigger  VAR word                               '10 uS Pulso de disparo 
Scale    var word                               'raw x 10.00 =uS 
RawToIn  var WORD                               '1/73.746 (ancho**) 
RawToCm  var word                               '1/29.034(ancho**) 
IsHigh   var word                               'para PULSOUT 
IsLow    var word 
Trigger = 1 
Scale = 10 
RawToIn = 889 
RawTocm = 2257 
IsHigh = 1 
IsLow = 0  

rawDist  var word                          
inches   var word 
cm       var word 

init:
 Goto Get_Sonar                               'leer el valor del sensor 
 after_Get_Sonar:                                                              
  inches = rawDist ** RawToIn                  'convertir a pulgadas 
  cm = rawDist ** RawToCm                      'convertir a centimetros 

Lcdout $fe, 1
Lcdout $fe, 2  
Pause 100   ' Esperar 0.5 segundos
Lcdout "Tiempo ",DEC rawDist  ' mostrar tiempo"
Lcdout $fe, $c0, "Distancia ", DEC cm, " cm"  'Mover a la linea 2 y mostrar distancia
Pause 300       ' Esperar 0.5 segundos
GOTO init 
Get_Sonar: 
LOW Ping                               'hacer el disparo 0-1-0 
PULSOUT  Ping, Trigger                 'activar sensor 
PULSIN  Ping, Ishigh, rawDist          'medir el eco del pulso 
rawDist = rawDist * Scale              'convertir a uS 
rawDist = rawDist / 2                          
goto after_Get_Sonar
```


----------



## holanda (Abr 23, 2011)

hola electromario

muchas gracias por tu ayuda, ya me puse a estudiar tu código y esta muy bien explicado, solo me queda una duda en la parte donde pones 

LOW Ping 'hacer el disparo 0-1-0
PULSOUT Ping, Trigger 'activar sensor 

entiendo que cuando pones LOW es que mandas un 0 lógico pero en el comentario pones que hace un disparo de 0-1-0 no entiendo muy bien esa parte del disparo es que apenas empece a estudiar la función pulsout y pulsin, disculpa mi ignorancia jejeje y gracias por tu aporte, saludos.


----------



## electromario (Abr 23, 2011)

holanda, entiendo tu duda, te explico:
low hace que el pin se ponga en cero  (0)
luego atravez de la instruccion PULSOUT se manda un pulso (1)
enviado el pulso el mismo pin (portb.0) se transforma en entrada atraves de la instruccion PULSIN recibiendo el eco de pulso. (0)


----------



## mecatrodatos (Abr 23, 2011)

rascueso dijo:


> no hay caso soy muy burro... voy a seguir intentando grax mecatrodatos y 31587 saludos



Amigo para superar tu falencia como es en todo comienzo cuando se aprenden cosas nuevas te dejo esto para que lo descargues y empieces a prender basic desde cero.

http://www.unrobotica.com/manuales/basic.pdf

ver aquí también:
https://www.forosdeelectronica.com/posts/211320/


----------



## dabopeyton (Abr 23, 2011)

hola mecatrodatos, puedes darme una breve explicacion de los siguientes comandos,

PULSIN
PULSOUT
HPWM
SERVO
INKEY

Soy buevo en esto y tengo muchas dudas, tambien me gustaria saber, si cuando trabajo en proton los comandon siempre son iguales? o no. ya que veo que unos guardan en ,psp. .asm o .bas. y su diferencia amigos. gracias de atemanos


----------



## mecatrodatos (Abr 23, 2011)

amigo dadopeyton mira aqui:

https://www.forosdeelectronica.com/posts/487011/


----------



## rascueso (Abr 23, 2011)

mecatrodatos muchas gracias por tu tiempo.. te cuento soy aficinado a la electronica. me gusta mucho el tema de los pic por eso el interes en aprender pero... lo estoy haciendo por mi propia cuenta ando con el manual pbp que subiste a pleno. se que no voy a aprender de un dia para otro y para colmo se me esta haciendo mucho lio ya que el codigo que tengo es largo y tmb el que me pasaste vos y 31587 pero bue... voy a seguir intentando un poco mas sino la otra que se me esta ocurriendo es usar el port1 con un 555 para que amplié el tiempo. de alguna forma va a salir. saludos y una vez mas gracias


----------



## 31587 (Abr 27, 2011)

mecatrodatos una consulta sobre el manual pic basic q subiste tiene el software en la pagina www.picallw.com tiene problemas es que no descarga haber si tu lo tienes puedas subirlo seria de gran ayuda


----------



## rascueso (Abr 27, 2011)

cual es el que buscas amigo??? lo taringuiaste? saludos


----------



## 31587 (Abr 30, 2011)

es el PICALL/P16PRO PIC ES EL SOFTWARE PARA QUEMAR PIC


----------



## mecatrodatos (May 1, 2011)

mira aqui esta el PICALL/P16PRO PIC


----------



## chapin (May 1, 2011)

mecatrodatos una pregunta. En el post 1144 le contestaste a D@rio sobre la configuración de el modo pwm
Y colocaste:
 Al final dejo como adjunto esquemático y evidencia del programa.
Ya busque en el mismo post pero no la encuentro,

Tengo una duda, ¿cómo es que seleccionas en la subrutina hacia la que debes de ir, pues no ubico como es que se van a ir incrementando los gosub?
Gracias por tu respuesta.


```
SWdown=0 then Plspattern1
If SWup=0 then Plspattern2
Goto Keyin

Plspattern1: 
Gosub w40msH 
Gosub w3p5msL 
Gosub w3p35msH
Gosub w0p85msH 
Gosub w0p85msH 
Gosub w0p85msH 
Gosub w2p5msH 
Gosub w0p85msH '5
Gosub w2p5msH '6
Gosub w0p85msH '7
Gosub w0p85msH '8
Gosub w0p85msH '9
Gosub w0p85msH '10
Gosub w0p85msH '11
Gosub w2p5msH '12
Gosub w2p5msH '13
Gosub w2p5msH '14
Gosub w2p5msH '15
Gosub w0p85msH '16
Gosub w2p5msH '17
Gosub w0p85msH '18
Gosub w2p5msH '19
Gosub w2p5msH '20
Gosub w2p5msH '21
Gosub w2p5msH '22
Gosub w2p5msH '23
Gosub w0p85msH '24

Goto Start

Plspattern2: 
Gosub w40msH 
Gosub w3p5msL 
Gosub w3p35msH 
Gosub w0p85msH 
Gosub w0p85msH 
Gosub w0p85msH 
Gosub w2p5msH 
Gosub w0p85msH '5
Gosub w2p5msH '6
Gosub w0p85msH '7
Gosub w0p85msH '8
Gosub w0p85msH '9
Gosub w0p85msH '10
Gosub w0p85msH '11
Gosub w0p85msH '12
Gosub w2p5msH '13
Gosub w2p5msH '14
Gosub w2p5msH '15
Gosub w0p85msH '16
Gosub w2p5msH '17
Gosub w0p85msH '18
Gosub w2p5msH '19
Gosub w2p5msH '20
Gosub w2p5msH '21
Gosub w2p5msH '22
Gosub w2p5msH '23
Gosub w2p5msH '24

Goto Start

'Subrutinas --- ?????????????????
w40msH: 
CCP1CON=0 
Low PORTB.3 
Pause 40
CCP1CON=12 
Return

w3p5msL: 
CCP1CON=12 
Pauseus 3500
Return

w3p35msH: 
CCP1CON=0 
Low PORTB.3 
Pauseus 3350
CCP1CON=12 
Pauseus 1000 
Return

w0p85msH: 
CCP1CON=0 
Low PORTB.3 
Pauseus 850
CCP1CON=12 
Pauseus 1000 
Return

w2p5msH: 
CCP1CON=0 
Low PORTB.3 
Pauseus 2500
CCP1CON=12 
Pauseus 1000 
Return
```


----------



## ruse85 (May 1, 2011)

hola alguien m eprodria ayudar acabo de comprar un display seid pero no puedo visualizar nada es este display les en vio tambien el programa. 

gracias


----------



## 31587 (May 2, 2011)

gracias mecatrodatos por ya ayuda ya lo descargue, are la prueba del soft


----------



## tazma (May 3, 2011)

hola mi pregunta es la siguiente como y que tengo que usar para empezar com la programacion de pics  por que leo y leo y mas me lio


----------



## atricio (May 3, 2011)

mira en las primeras paginas del foro ahi muestran muchos ejemplos muy bien explicados paso a paso para ir aprendiendo poco a poco hay un libro muy bueno explicado es desarrollo de proyectos con 16f628A de reyes es en basic es uno del los mas faciles de aprender revisa este limk te puede servir mucho ahi esta el libro 

http://www.vagos.es/showthread.php?t=654952

o que es lo que quieres hacer te puedo ayudar un poquito


----------



## tazma (May 3, 2011)

ok ya descarge el librolo leere si tengo dudas que las tendre ya te preguntare gracias


----------



## dabopeyton (May 3, 2011)

Buenas tardes amigos, y en especial a mi amigo mecatrodos para que me hechen una mano con los siguientes comandos y la sintaxis de lookup, lookDown, EDATA, EWRITE, EREAD, Y SI ES POSIBLE la diferencia de lookup respecto a lookDown  y  Edata con EWRITE Xfavor, amigo. Gracias de ante manos

trabajo con proton amigo


----------



## ivanchomao (May 4, 2011)

*mecatrodatos*, buenas tardes veo que manejas muy bien el tema de microcontroladores y en especial basic pro. Es posible que me des una manito con este proyecto:

*Ayuda proyecto PIC para activar relé*
Buenos días, soy nuevo en el foro y en general en la electrónica, pero aprovecho para agradecer al foro y a los participantes por que es mucha la ayuda que he recibido de parte de ustedes.

En esta ocasión quiero solicitar ayuda para enfocar un proyecto con PIC que pretende activar un relé durante varios minutos (2 ó 3 minutos aprox.) partiendo de dos señales en milivoltios que son entregadas por unos sensores de gases.

El relé se debe activar si la primera señal esta entre 0.0 y 0.1 milivoltios y si la segunda señal esta entre 500 y 2000 milivoltios.

Agradezco sugerencias para iniciar el proyecto y seleccionar el mejor PIC e iniciar la programación ojalá en lenguaje Basic que es el único que hasta ahora medio manejo.


----------



## mecatrodatos (May 6, 2011)

*chapin*:  te dejo el proyecto de 38 khz con pwm.
*ruse85* : tu programa esta bien mira el contraste del LCD con el potenciometro ubicado en el pic 3 del mismo o da mayor retardo al LCD para que muestre mensajes una ve utilices el comando $fe,1 que es el de limpiar Lcd y ubicar el primer carácter en la primera linea o al pic que estas utilizando la coneccion del MCLR a vdd con resistencia de 1k.
*dabopeyton*: en el tutorial y manual de proton te respondo.
*ivanchomao*: Te recomendaría el PIC de la sera 16f con entrada A/D puede ser le 16f628A, el pic 16f873A o el pic 16f877A por si los sensores de gas son analógicos.


----------



## ivanchomao (May 6, 2011)

mecatrodatos, gracias por la ayuda.


----------



## lubeck (May 6, 2011)

> Te recomendaría el PIC de la sera 16f con entrada A/D puede ser le 16f628A,


*Mecatrodatos*...
Me llamo la atencion esto... y me surgio la duda...

se puede utilizar el 628A como conversor A/D o solo como comparador???


----------



## J2C (May 6, 2011)

El *16F628A* solo puede ser usado como *Comparador* por que no tiene el modulo de conversión de 10bit A/D.

En cambio el grupo *16F873A*, 1*6F874A*, *16F876A* y *16F877A* pueden ser usados como *Comparadores o con Conversión A/D de 10 bit*.

Saludos, JuanKa.-


----------



## lubeck (May 6, 2011)

Oki J2C...

eso tenia entendido pero me dije... mejor lo confirmo para no quedarme con la duda 

Gracias por la aclaracion...


----------



## tazma (May 7, 2011)

hola a ver tengo dudas jeje  e encotrado un codigo para una alarma pero hay que modificar alguna lineas eso es posible ?


----------



## Nano24 (May 7, 2011)

J2C dijo:


> El *16F628A* solo puede ser usado como *Comparador* por que no tiene el modulo de conversión de 10bit A/D.
> 
> En cambio el grupo *16F873A*, 1*6F874A*, *16F876A* y *16F877A* pueden ser usados como *Comparadores o con Conversión A/D de 10 bit*.
> 
> Saludos, JuanKa.-



Como se logra eso, tengo un PIC16F877A y quisera saber de algun ejemplo para hacer un comparador.


----------



## J2C (May 7, 2011)

Nano24

Disculpa pero yo no soy experto en Programación, si lo piensas realizar con Pic Basic Pro seguro don Mecatrodatos ha colocado algún ejemplo en este thread y si piensas usar el Proton Ide también de seguro ha colocado algo en el otro thread.

Solo preguntale en el thread adecuado y con paciencia (*espera que el se desocupe de todo lo que ayuda a todo el mundo*) y te dira donde ha colocado algo.

Como pequeña idea se que en programas con el 16F628A para desactivar los comparadores usan algo asi: *CMCON* , con lo cual me parece que deberias pegarle una leida a la datasheet del µControlador que piensas usar buscando referencias a esa clave.

Saludos, JuanKa.-

P.D.: Don Mecatrodatos disculpe Ud. que lo haya desviado a Nano24 hacia sus conocimientos.


----------



## montoya8332 (May 7, 2011)

Buenas tardes :

Que tal amigos como estan, escribo para ver si me pueden ayudar con un problema que tengo.
Estoy construyendo un sensor de temp con el Pic 18F252, resulta que simulado en el Proteus me funciona de maravilla, pero lo monto en protoboard y no funciona igual, mido el voltaje en el pin out del sensor y me da bien el voltaje deacuerdo a  la temp pero en el lcd sale un valor diferente. Este es el codigo:

Device 18F252                              'DEFINICION  REFERENCIA DEL PIC
XTAL = 4                           'DEFINICION DE OSCILADOR EXTERNO
Declare  WATCHDOG FALSE                    'DESHABILITAR PERRO GUARDIAN
ALL_DIGITAL true                           'CONFIGURAMOS PUERTOS COMO DIGITALES
OSCCON = %1100100                   'calibra oscilador interno a 4Mhz

'**********************************************************************************************
'*CONFIGURACION DEL LCD  Y TECLADO

Declare LCD_TYPE        0                   ' TIPO DE LCD , 1 PARA GRAFICAS, 0 PARA ALFANUMERICO
Declare LCD_INTERFACE   4                   ' LINEAS A USAR 4 
Declare LCD_DTPIN       PORTC.0             'C0-D4  C1-D5  C2-D6  C3-D7
Declare LCD_LINES       2                   'PORQUE EL LCD ES 2 X 16
Declare LCD_ENPIN       PORTA.3            ' PIN E DEL LCD AL PUERTO A.3
Declare LCD_RSPIN       PORTA.2             'PIN RS DEL LCD AL PUERTO C.3
Declare KEYPAD_PORT     PORTB               'PUERTO PARA EL TECLADO
PORTB_PULLUPS TRUE                          'ACTIVA PULL UPS PUERTO B
Output PORTC 
Output PORTA.4
Output PORTA.5                               'PUERTO C COMO SALIDA

'**********************************************************************************************
'DECLARACION DE VARIABLES

Declare ADC_BITS      10
Declare ADC_CLOCK     3
Declare ADC_SAMPLEUS  50
Dim SENSAR   As Word
Dim TEMP1 As Byte
TRISA = %1
DelayMS 1000

ADCON1 = %10001110   

DelayMS 100


Cls
INICIO:
SENSAR = ADIn 0

TEMP1 = (SENSAR *4.88) /10
Print " ",0," TEMP:",DEC3,TEMP1,1 ,"C" 
DelayMS 1000
Print Cls 
GoTo INICIO



'***********************************************************************************************
'CARACTERES ESPECIALES LCD LOGO DE TERMOMETRO Y º EN TEMP.


Print $FE,$40,$04,$04,$04,$04,$04,$0E,$1F,$0E     'ESPACIO 0 CGRAM
Cls
Print $FE,$40,$04,$04,$04,$04,$0E,$1F,$0E,$04
Cls
Print $FE,$48,$00,$06,$06,$00,$00,$00,$00,$00     'ESPACIO 1 DE CGRAM   
Cls
Print $FE,$50,$00,$00,$00,$1F,$1F,$00,$00,$00     'ESPACIO 2 DE CGRAM
Cls


PD. el codigo lo hice en el software proton y en lenguaje basic.
de antemano muchas gracias.


----------



## Nano24 (May 7, 2011)

J2C dijo:


> Nano24
> 
> Disculpa pero yo no soy experto en Programación, si lo piensas realizar con Pic Basic Pro seguro don Mecatrodatos ha colocado algún ejemplo en este thread y si piensas usar el Proton Ide también de seguro ha colocado algo en el otro thread.
> 
> ...



Ok esperare a que Mecatrodatos me de alguna ayuda que por cierto le agradezco el tema de los servomotores que me envió para controlar las velocidad del servomotor. Una cosa mas, he leído que en PicBasic no se puede programar pantallas GLCD, es eso cierto?


----------



## mecatrodatos (May 7, 2011)

*tazma*: Claro es posible adaptar cualquier código a tus requerimientos solamente tienes que mantener una flujo grama o comentarios para que se fácil de cambiar, adicionar o quitar comandos.

*lubeck y J2C*: tienen razón el PIC 16f628A tiene funcionalidad como comparador se me paso y doy gracias por la aclaración al amigo ivanchomao.

*Nano24*: te dejo un ejemplo del uso del comparador con el pic 16f877A.



> ' Definicion Coneccion LCD
> Define LCD_DREG  PORTD
> Define LCD_DBIT  4
> Define LCD_RSREG PORTE
> ...


*montoya8332*: Te respondo en  https://www.forosdeelectronica.com/f24/tutorial-manejo-proton-ide-27932/index11.html  pero anexa en el hilo la silumacion y el tipo de sensor que utilizas para mirar su rango de funcionamiento.


----------



## lubeck (May 7, 2011)

Ahora ando muy pregunton...jejeje...

A que se refiere esta linea...



> Define LOADER_USED 1 ' Sólo se requiere para el uso con cargador de arranque


 
por ahi vi en algun lado que en los micros se puede instalar (por decirse asi) un sistema operativo o un programa de arranque... 

han visto alguno o saben como funcionan...

me parece que se llaman BootLoader si mal no recuerdo...


----------



## mecatrodatos (May 7, 2011)

Mira aqui :http://www.mecanique.co.uk/code-studio/loader/index.html#Programming Requirements , esto te despejara las dudas;  el amigo *Atricio* esta utilizando el gestor de arranque con proton ide en un proyecto de robot para no malograr el pic programandolo una y otra vez, paso que realiza a traves de la interfaz usb serial ya que esta utilizando un portatil sin puerto Rs232. realiza todos los cambios necesarios en su programa previamente programando el software gestor de arranque  en el microcontrolador de destino, compila con F9 y programa con f10 y listo.

al decir "malograr" es intoducir y retirar el Pic de una placa de protoboarddon de pueden dañar sus pines.


----------



## lubeck (May 7, 2011)

Corrijeme si me equivoco o lo que me falta....

1.- Dentro de la carpeta Microcode Studio hay una carpeta nombrada LoaderHex que contiene todos los Hex dependiendo el uC y la velocidad es decir si tengo el 16f877a le grabo al pic el 16f877a_04.hex
2.- Me armo el Circuito que esta en el link que pusiste (http://www.mecanique.co.uk/code-stud...ml#Programming )
3.-Hago mi programa en el editor del microcode y agrego la linea Define LOADER_USED 1
4.-Lo compilo con el ICD compile & prorgram 
5.- listo... tengo una programacion serial....

o no es tan sencillo???  (se me hace demasiado bello para ser verdad!!! donde esta lo complicao...)


----------



## mecatrodatos (May 8, 2011)

Que tal lubeck te aclaro las dudas en el documento anexo saludos.


----------



## lubeck (May 8, 2011)

Excelente tutorial Mecatrodatos!.... Gracias...

Manos a la obra.... hoy mismo empiezo con el primero...


----------



## Nano24 (May 8, 2011)

mecatrodatos dijo:


> *tazma*: Claro es posible adaptar cualquier código a tus requerimientos solamente tienes que mantener una flujo grama o comentarios para que se fácil de cambiar, adicionar o quitar comandos.
> 
> *lubeck y J2C*: tienen razón el PIC 16f628A tiene funcionalidad como comparador se me paso y doy gracias por la aclaración al amigo ivanchomao.
> 
> ...




Muchas gracias Mecatrodatos por la ayuda, ese ejemplo me va a servir a la hora de realizar un comparador con el PIC16F877A.


----------



## atricio (May 8, 2011)

ya somos 2 con el bichito del bootloader ahora una preguntilla amigo segun lei recien para no sobre escribir el bootloader que mas debo agregar a mi programa para que otra vez vuelva a realizar esto muchas gracias por la ayuda si ya lo lograste lubeck ojala puedas contarnos como te fue y que posibles problemas tubiste


----------



## javisan190 (May 8, 2011)

Felicitaciones. muy buen aporte


----------



## Nano24 (May 8, 2011)

Si no es mucho pedir Mecatrodatos tengo una duda, es cierto que PicBasic no maneja los GLCD? aparte creo que se vendria bien al foro que publicaras unos nuevos ejemplos para manejar caracteres en el LCD, bueno de todas maneras se te agradecen tus aportes.


----------



## mecatrodatos (May 8, 2011)

*Nano24*: He estado en deuda con este foro y el de Proton, pero veré si puedo sacar algo de tiempo para subir ejemplos y realizar como una especie de texto ( Libro) con todos los ejemplos posteados ( son sus respectivas explicaciones), pero necesitaría ayuda ya que llevaría tiempo, gracias a ti como a otros compañeros que preguntan, colaboran e indagan y no pasan de visita para solamente tomar lo que necesitan sin dejar algún comentario es que este hilo a crecido.


----------



## lubeck (May 8, 2011)

> es cierto que PicBasic no maneja los GLCD?


 
Yo diria que si se maneja pero no como con proton... en pbp se utiliza un generador de tramas... 
si mal no recuerdo los nombran glcd generator recuerdo tener uno pero no se donde lo encontre en la red ni donde lo tengo...


----------



## Nano24 (May 8, 2011)

lubeck dijo:


> Yo diria que si se maneja pero no como con proton... en pbp se utiliza un generador de tramas...
> si mal no recuerdo los nombran glcd generator recuerdo tener uno pero no se donde lo encontre en la red ni donde lo tengo...



Ok gracias por la respuesta Lubeck, pues buscando por internet consegui algo que hace referencia a los modulos lcd o glcd pero no estoy claro en el tema, aun me cuesta hacer caracteres en el lcd.

http://www.ucontrol.com.ar/forosmf/...utorial-basico-de-control-de-lcd-y-mini-glcd/


----------



## lubeck (May 8, 2011)

Mira para LCD no es tan complicado...
aqui un ejemplo...https://www.forosdeelectronica.com/f24/solo-ejemplos-picbasicpro-proteus-39938/#post333309
para el glcd mira este link...http://www.compsys1.com/workbench/Benchware/Glipic/glipic.html


----------



## Nano24 (May 8, 2011)

lubeck dijo:


> Mira para LCD no es tan complicado...
> aqui un ejemplo...https://www.forosdeelectronica.com/f24/solo-ejemplos-picbasicpro-proteus-39938/#post333309
> para el glcd mira este link...http://www.compsys1.com/workbench/Benchware/Glipic/glipic.html




Ok lubeck voy a chequear los links que me has pasado, la verdad ando buscando hacer alguna animacion en el LCD y aqui en youtube encontre un ejemplo de lo que mas o menos me gustaria lograr.


----------



## lubeck (May 12, 2011)

*I HAVE NEWS....*

con respecto a esto..._ https://www.forosdeelectronica.com/posts/494287/ _ 
Resulta que arme el circuito utilice un pic16f877A con un oscilador de 4Mhz (?¿?¿) y nada... *no funciono*... puse uno de 20MHZ (obviamente grabando el respectivo archivo hex como se indica en el tutorial de mecatrodatos) y *si funciono*... 

con el de 4MHz tengo un par de cuestiones, al cargar el archivo HEX en el winpic, al oscilador en las configuraciones lo pone como HS (High Speed) 4MHZ Alta velocidad??? por lo que se me ocurrio cambiar a XT_Osc peroooo... tampoco funciono... lo que estoy en duda es que mi cristal este dañado.... (probare con otro cuando lo compre y comento)

Con el de 20MHz Funciona bien pero me hizo un par de cosas raras... es decir... lo grabe conectando un led en el puertoB0 que prendiera y apagara cada 500mS .... lo grabe y se empezo inmediatamente a prender y apagar cada 500mS como era de esperarse... le cambie el codigo para aumentar de 500mS a 1500mS sin mover otra cosa mas que eso... intente grabar y nada se apago el led y se quedo asi apagado... movi una linea de los buses que tengo asi "@ device XT_osc" por "@ device HS_Osc" y grabe y volvio a funcionar con los nuevos segundos... volvi a cambiar el codigo a 500mS y volvio a fallar regrese el codigo del fuse a XT_osc y volvio a funcionar...

Bueno... como resumen... eso de Loader esta Bacan... no hay necesidad de quitar el micro de donde esta ni apagar el circuito mientras se graba... incluso tiene hasta un debbuger (que todavia no se usar )... lo malo y los problemas que se me presentaron es con los dichosos osciladores... ahi esta el talon de aquiles...


----------



## lubeck (May 13, 2011)

Oki pues termine con las pruebas...

le puse un Oscilador nuevo al pic de 4Mhz y funciono sin problemas....

en un par de dias mas pongo el convertidor USB a Paralelo  y comento resultados....

entonces... reitero en lo unico que se debe tener cuidado segun yo... es en poner el oscilador de forma correcta... de ahi en mas todo facil y rapido...


----------



## agustinem (May 15, 2011)

hola amigos soy nuevo en el foro y estoy aprendiendo aprogramar pic quien me podria colaborar con el codigo para un reloj con display de  7 seg que tenga segundero de antemano gracias son unos genios


----------



## lubeck (May 15, 2011)

> estoy aprendiendo aprogramar pic quien me podria colaborar


 
en este tema me parece haber visto uno.... te toca buscarlo...

te recomiendo que empieces gateando, despues camines y por ultimo tratar de correr...


----------



## ajcl19 (May 15, 2011)

mecatrodatos dijo:


> que tal amigos uno de los lenguajes mas facil para programar micros es el basic pro sin despreciar el c por lo que abierto este hilo para empezar a ejecutar programas sencillos hasta llegar a los mas complejos.
> 
> Miren lo facil que es prender un led con un pic 16f84a :
> 
> ...








queria saber como consigo el programa o como lo instalo si lo tuviera


----------



## lubeck (May 15, 2011)

> queria saber como consigo el programa


 
Comprandolo... pon PBP o pic basic pro o microstudio en el Google... seguro habra muchos links de tu interes...



> como lo instalo si lo tuviera


 
si usas güindous buscas el iconito que dice install o setup... y le das click... respondes lo que te pregunte en caso de que lo haga y listo...


----------



## ajcl19 (May 16, 2011)

Ya lo  consegui, pero como nemo o prueba. Y la verda no quiero tenerlo asi de limitado.
Gracia por tu interes en ayudarme. Estaremos en contacto.


----------



## lubeck (May 16, 2011)

> Ya lo consegui, pero como nemo o prueba. Y la verda no quiero tenerlo asi de limitado.
> Gracia por tu interes en ayudarme. Estaremos en contacto.


 
Hay que buscar en todos lados....




Otra pista...
https://www.forosdeelectronica.com/posts/489495/


----------



## rascueso (May 16, 2011)

lo buscaste en (tajinga) yo lo saque de ahi. saludos


----------



## diodito (May 16, 2011)

hola a todo los foreros soy nuevo en este cuento de los pic y quisiera aprender mas de este campo, alguien quiere ser mi asesor ....


saludos..............


----------



## lubeck (May 16, 2011)

> hola a todo los foreros soy nuevo en este cuento de los pic y quisiera aprender mas de este campo, alguien quiere ser mi asesor ....


 
Pues yo creo que investigues primero un poco... lee los primeros post de este tema... y si te surguen dudas plantealas aqui e intentare(mos) responderte...


----------



## atricio (May 16, 2011)

diodito dijo:


> hola a todo los foreros soy nuevo en este cuento de los pic y quisiera aprender mas de este campo, alguien quiere ser mi asesor ....
> 
> 
> saludos..............



en post anteriores coloque un enlace para que puedas descargarte libros muy interesantes para que puedas empezar tu aprendizaje


----------



## javisan190 (May 17, 2011)

mecatrodatos.. ola mam, agradecerte de este curso q esta muy cvr, tengo una duda o me podias explicar tengo en mente en hacer un termometro con el sensor de temperatura lm35 con pic16f628a, lcd en rango de -55 hasta +150) espero q me respondas .. gracias .


----------



## lubeck (May 17, 2011)

> mecatrodatos.. *¿¿¿¿"ola mam"???'*, agradecerte de este curso *que* esta muy *¿¿¿¿"cvr"????,* tengo una duda o me podias explicar tengo en mente en hacer un termometro con el sensor de temperatura lm35 con pic16f628a, lcd en rango de -55 hasta +150) espero *que* me respondas .. gracias .


 
En uno de los post de este mismo tema hay uno... 

procura escribir correctamente... son normas del foro y ...muchos hacemos el intento de escribir bien


----------



## javisan190 (May 17, 2011)

muchas gracias amigo


----------



## banistelrroy (May 17, 2011)

hola aver si me pueden ayudar resulta que tengo un programa en visual la cual permite enviar mensajes al LCD desde visual basic la simulacion esta en proteus el programa es simple solo escribes texto en la primera linea y en la segunda y la envias al pic por el puerto serial y se muestra en  el lcd pero no puedo hacer comunicacion si alguien me puede ayudar ....anexo todo lo necesario para que lo analizen.... gracias a todos de ante mano

tambien agrego el programa en visual basic MSCOMM32.OCX para los que no tengan instalados visual basic

fuente:
http://micros.mforos.com/1149907/6339470-terminal-para-lcd-rs232/?marcar=terminal+lcd+rs232


----------



## lubeck (May 17, 2011)

Lo tienes armado en la realidad.. o lo quieres simular???

.....

Bueno....


Yo lo unico que veo raro (por encimita) es el oscilador que lo tiene de 12MHz y segun el data...

deberia ser...


Imagino que no lo quieres simular puesto que tiene muchisimas cosas mal... en el proteus...


----------



## banistelrroy (May 18, 2011)

lubeck gracias por la respuesta bueno tengo comprado todo he hecho varios circuitos con pic y uso microcode, de electronica se lo necesario para poder armar pero de visual basic no se casi nada.......no se si el error esta en el programa de visual o en el PBP.



 pude ver que hay errores en el proteus los corregi espero este bien
 otra cosa en la simulacion es necesario abrir en visual el programa ya que esta programado con COM1 y para simularlo habra que cambiarlo si se usan puertos virtuales para la comunicacion y en el proteus esta COM2, T2400.
Adjunto los nuevos archivos
invoco a todos los que puedan ayudarme....gracias por la respuesta ojala me puedan ayudar.....gracias


----------



## lubeck (May 18, 2011)

Mira ....

para no poner el diagrama...


del *compim* desconecta el *pin 2 rxd* que va al MAX232 y *mandalo* directamente *al pic pin 20....*

y veras que funciona...

yo ya corregi ese error del max232 pero no me acuerdo como le hice... al armarlo en la realidad si funciona como lo tienes...

Bueno... pongo imagen...


----------



## banistelrroy (May 18, 2011)

bueno estoy astoy probando se me fue el internet gracias por la respuesta ahora te digo como salio

gracias lubeck funciono el error estaba en el max creo que era eso .......otra consulta no seria mejor usar el pin 25 del pic PORTC.7 ya que este tiene la opcion de RX propiamente en el pic....por lo demas funciono...gracias muchas gracias


----------



## lubeck (May 18, 2011)

> otra consulta no seria mejor usar el pin 25 del pic PORTC.7 ya que este tiene la opcion de RX propiamente en el pic


 
Existen dos maneras de hacer la comunicacion por el puerto Serial....

Por Hardware o por Software....

Por Software puedes utilizar cualquier puerto de salida/Entrada y los comandos SerIn y SerOut no importa cual mientras que cumpla que sea de entrada o salida respectivamente...

Por Hardware primero tienes que verificar que el pic tenga el modulo de comunicacion serial (USART me parece que le llaman) y solo puedes usar los puertos asignados a el (en el caso del 877 seria el C7 y C6 si mal no recuedo) y debes utilizar los comandos HSerIn y HSerout

En mi Opinion por Hardware ofrece mayores ventajas... es un poco mas dificil.. y pues seria cuestion de valuar la aplicacion en la que se requiere....

he dicho...


----------



## banistelrroy (May 18, 2011)

denuevo la ultima consulta y porque no funciona el mx232 en este y en otros ejemplos si
sera porque el PBP sera que hay diferencia el velociad de trasmicion T2400 y N2400 uno par copn max232 y el otro si el max o cual sera la razon del error del max


----------



## lubeck (May 18, 2011)

> sera porque el PBP sera que hay diferencia el velociad de trasmicion T2400 y N2400 uno par copn max232 y el otro si el max o cual sera la razon del error del max


 
Mmmm.. no... el T2400 y N2400 es la misma velocidad la diferencia es la polaridad.... diagmos que con T es Positiva y con N es negativa la transmicion....

Honestamente no recuerdo como corregi ese problema en el simulado... por ahi en algun lado tengo archivada la simulacion... si la encuentro la posteo...

y de echo al armarlo puede que tengas que cambiar los cables de TXD o RDX no recuerdo bien... pero bueno si tienes problemas cuando lo hagas... nos echas un grito...


----------



## banistelrroy (May 18, 2011)

bueno hay te cuento como salio.......voy a la u se me hace tarde te cuento como me va


----------



## ferdy575 (May 19, 2011)

hola soy nuevo por estos lados por eso tal vez sea tardia mi respuesta, te cuento que estube viendo tu proyecto y encontre un pequeño error en la conexión del pic pues en el programa que escribiste con nombre giro basico 5 envias la señal de control por el portb.1 y en el proteus lo tienes conectado en el portb.0 hice esta correción y funciono perfectamante


----------



## banistelrroy (May 19, 2011)

saludos a todos funciono el proyecto de enviar mensaje el lcd desde visual gracias a lubeck por la ayuda

ahora un aoprte esta se trata de una interfaz para puerto serial donde se puede encender cualquier led del puerto B desde la PC el programa esta hecho en Visual Basic y microcode, em un principio esta hecho para un pic 16F876 y a 20Mhz pero lo adapte a un PIC16F877A con crystal de 4Mhz .

ahora quiero una manito.

sino coloco la linea PORTB=%00000000


1.cuando inicio proteus primero sale cualquier cosa./pero con esa linea aseguro todos a cero. Sin la linea primero se ejecuta el intefaz de visual y despues proteus para que no salga errores en la salidas.
Ahora una vez ejecutado si cierro visual y lo vuelvo abrir los leds que estaban prendidos de apagan. CREO QUE la razon de iniciar visal envia la imformacion y resetea la antigua orden del pic.
AQUI ES DONDE LES PIDO AYUDA


----------



## lubeck (May 19, 2011)

Yo no entendi.... 

de cuales leds estamos hablando ... ¿te falto subir el archivo?


----------



## banistelrroy (May 19, 2011)

ahora un aoprte esta se trata de una interfaz para puerto serial donde se puede encender cualquier led del puerto B desde la PC el programa esta hecho en Visual Basic y microcode, em un principio esta hecho para un pic 16F876 y a 20Mhz pero lo adapte a un PIC16F877A con crystal de 4Mhz .


ahora quiero una manito.

sino coloco la linea PORTB=%00000000



1.cuando inicio proteus primero sale cualquier cosa./pero con esa linea aseguro todos a cero. Sin la linea primero se ejecuta el intefaz de visual y despues proteus para que no salga errores en la salidas.
Ahora una vez ejecutado si cierro visual y lo vuelvo abrir los leds que estaban prendidos de apagan. CREO QUE la razon de iniciar visal envia la imformacion y resetea la antigua orden del pic.
AQUI ES DONDE LES PIDO AYUDA lo que pasa esque se muy poco de visual y creo que se podria modificar el programa y obteniendo lo siguiente:


Poder ejecutar visual o proteus primero y aun haci empezar todas las salidas = 0 y creo que se soluciona agregando PORTB=%00000000
Al cerrar visual y cuando lo abramos denuevo leer primero la imformacion que esta en el pic osea las salidas y se muestre en la interfaz grafica y no resetea nada a noser que se modifique manualmente desde la intefaz.
Quiero conseguir esto ya que haci se podra cerrar la intefaz y abrir las veces que sea y no modificar el tabajo que esta realizando el pic hasta que se reciba una nueva orden que se realiza presionando con el maus el circulo correspondiente e la interfaz

ADJUNTO DOLO LO NESARIO.
haber si me pueden ayudar ya que mi profe se enterquesio en esto no solo se contento con la comunicacion gracias de ante mano a todos.........ayudenme porfa se que es molestia pero que alguien tambien le podra servir

se me olvido hay lo adjunte todo lubeck espero no molestarte pero eres de gran ayuda gracias de ante mano haber si me ayudas


----------



## lubeck (May 19, 2011)

Yo creo que Step by step..



> Al cerrar visual y cuando lo abramos denuevo leer primero la imformacion que esta en el pic osea las salidas y se muestre en la interfaz grafica y no resetea nada a noser que se modifique manualmente desde la intefaz.


 

estas utilizando el timer a 1ms para enviar los datos... eso te va a crear conflictos graves... quita ese timer... y lo que debes hacer es que cada que cambies algo o pierda el foco del objeto hagas el envio del dato al puerto...

digamos como utilizas el text utiliza el evento change o de preferencia el lostfocus ahi desecadenas la rutina que esta en timer...

en pocas palabras hazlo pero sin usar el timer... y lo vemos...


----------



## banistelrroy (May 19, 2011)

hayyyyyyyy bueno lo que pasa que como les dige nose mucho de visual es casi menos que poco lo que se pense que al cerrar el programa y al volver abrir el programa comenzaba todas las salidas en cero y eso era lo que envia al pic por eso hace todos cero en en las salidas del pic bueno lo que pense esque la interfaz despues de cerrarce al volverla sea capaz de leer las salidas del pic y mostrarla y haci podemos cerrar y abrir sin modificar las salidas en pleno trabajo a noser que la habras y modifiquemos algo.........bueno lamentablemente no se mucho de visual


----------



## lubeck (May 19, 2011)

> bueno lamentablemente no se mucho de visual


 
Mmm.. por eso... yo tampoco se mucho pero algunas cosas si las he echo...

intentalo... y ahorita lo platicamos... no uses el timer.... lo estoy revizando mas a fondo y lo que te suguiero que utilices es el evento click del objeto image...


----------



## banistelrroy (May 19, 2011)

ok bueno voy haber lo que pueda hacer si me ayudas le lo agradecere bueno ojala se pueda solucionar


----------



## lubeck (May 19, 2011)

Checa esto... 
(Todo lo puse en una sola carpeta)

Lo puse en una matriz de Objetos para ahorrar codigo... bue... analiza y comentamos...
pongo el codigo de VB aqui...


```
Option Explicit
Dim DatoSalida As String, B(8) As Integer

Private Sub Form_Load()
 MSComm1.PortOpen = True
 Text2.Text = "En Obras"
End Sub
Private Sub Form_Unload(Cancel As Integer)
    If MSComm1.PortOpen = True Then
        MSComm1.PortOpen = False
    End If
End Sub
Private Sub Image1_Click(Index As Integer)
    Dim I As Integer
    If B(Index) Then
        B(Index) = 0
        Shape1(Index).FillColor = &H40&
    Else
        B(Index) = 1
        Shape1(Index).FillColor = &HFF&
    End If
    DatoSalida = ""
    For I = 0 To 7
     DatoSalida = DatoSalida & B(I)
    Next I
    Text1.Text = DatoSalida
    DatoSalida = Chr$(BinADec(Val(DatoSalida)))
    MSComm1.Output = DatoSalida
End Sub
 
Public Function BinADec(Valbin As String) As Integer
Dim ValAn As Integer
Dim PosBin As Integer
ValAn = 0
PosBin = 1
Do
   If PosBin = (Len(Valbin) + 1) Then Exit Do
   If Right(Left(Valbin, PosBin), 1) = "1" Then
      ValAn = (ValAn + 0.5) * 2
   Else
      ValAn = ValAn * 2
   End If
   PosBin = PosBin + 1
Loop
BinADec = ValAn
End Function
Public Function DecABin(ValDec As Integer) As String
Dim Valdec2 As String
Dim Valdec1 As Integer
Dim res As Integer
Dim Bin As String
Valdec1 = ValDec
    Do
        If Valdec1 = 0 Then
            Exit Do
        End If
        res = Valdec1 Mod 2
        Bin = res
        Valdec2 = Bin + Valdec2
        Valdec1 = Int(Valdec1 / 2)
    Loop
If Len(Valdec2) < 9 Then Valdec2 = String$((8 - Len(Valdec2)), "0") + Valdec2
DecABin = Valdec2
End Function
```
 
y se me olvido quitar el objeto timer  pero no lo estoy usando...


----------



## banistelrroy (May 19, 2011)

bueno me voy engo clases a las 8 aqui en peru son las 7 voy haber lo que pusiste.......mi hermano gracias por todo si sulcionas lo subes haci a alguien tambien le servira de eso estoy seguro gracias espero m ayudes voy a tener que llevar un curso de visual jejejejej....estoy preocupado ya que lo presento el sabado......espero me ayuden....gracias lubeck


----------



## lubeck (May 19, 2011)

Mmmm.. no creas que soy mala leche pero yo ya lo he hecho e incluso via internet... lo que intento yo es que tu le pienses un poco y yo te ayudo...


----------



## banistelrroy (May 19, 2011)

bueno devuelta aqui ...lubeck vi el archivo bueno es elgo parecido a lo que se quiere conseguir lo que aun no se puede es que el abrir la interfaz lea las salidas del pic osea:

si tenemos D0,D2;D5 encendidos al cerrar la interfaz y al abrirla denuevo lea estos valores y lo muestre haci que si quiero prender D3 por ejemplo solo haga eso y lo demas quede como estubo no resetee todo denuevo.......

adjunto el archivo original: interfaz comunicacion

adjunto el archivo modificado por lubeck: Web On Ware Serial

lamentablemente no se visual por eso invoco al que me pueda ayudar espero puedan ayudarme gracias a lubeck por el interez ........


----------



## lubeck (May 20, 2011)

Lo que yo no alcanzo a entender es como los maestros piden cosas sin enseñar a hacerlas.... 

me cai que asi... hasta yo soy un p*t* maestro de esos....

P.D. Me dices que calificacion obtuve!! 
Mira este...


----------



## Nano24 (May 20, 2011)

lubeck dijo:


> Checa esto...
> (Todo lo puse en una sola carpeta)
> 
> Lo puse en una matriz de Objetos para ahorrar codigo... bue... analiza y comentamos...
> ...



Lubeck por favor necesito una ayuda tuya ya que te he visto manejar los temas de VB6, sabes encontre un programa en internet que detecta colores con una camara web, la cuestion es que yo le agregue un archivo wav que avisa con una voz cuando se a detectado el color, pero tengo un grandisimo problema y es que mientras se detecta el color el archivo wav se queda pegado osea no finaliza su reproduccion normalmente, que puedo hacer en ese caso, que me sugeririas, ya use el comando SLEEP y lo que hace es colgar el programa  sin mas que decir aqui te dejo el archivo para que lo chequees, en el modulo bas llamado MatrizImagen esta un parte que dice:

'+++++++++++++++++++detecta el color rojo+++++++++++++++++++++++++++++++++++
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

If (Rojo - Tolerancia > Azul) And (Rojo - Tolerancia > Verde) Then

*PlaySound App.Path & "\SOUNDS.wav"* 'Aqui el comando que reproduce el sonido 

n = n + 1
Rojo = 0
Verde = 200
Azul = 0
posX = posX + (ContadorX / 3 - 2) '+ posX
posY = posY + (234 - ContadorY) '+ posY

End If


https://www.forosdeelectronica.com/posts/500115/


----------



## lubeck (May 20, 2011)

Mmm.. el commando playsound no es de VisualBasic... casi seguro es una Api , una vez que se ejecuta una API para controlarla tiene que ser de la API misma por lo que ningun comando de VB lo controlaria...
ya es un poco tarde por aca... si ves este post... mañana lo descargo y lo revizamos... a ver que podemos hacer...

saludos...


----------



## Nano24 (May 20, 2011)

lubeck dijo:


> Mmm.. el commando playsound no es de VisualBasic... casi seguro es una Api , una vez que se ejecuta una API para controlarla tiene que ser de la API misma por lo que ningun comando de VB lo controlaria...
> ya es un poco tarde por aca... si ves este post... mañana lo descargo y lo revizamos... a ver que podemos hacer...
> 
> saludos...



Ok te lo agradeceria mucho, yo nose mucho de VB6   bueno lubeck espero tu ayuda y gracias.


----------



## lubeck (May 21, 2011)

Hola Nano...

Efectivamente es una API de Windows... la cual se llama desde esta instruccion


```
Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
    (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
```
 
lo estoy revizando pero a mi ejecuta el sonido y tarda mucho para activarse de nuevo... estoy analizandolo mas detalladamente...

A ver mira....

si te entiendo bien... creo la solucion seria utilizar una bandera para despues ejectuar la Api...

mas o menos a si....
(en azul los cambios)

```
Public Sub DetectaColores(Pic As PictureBox, Color As Long, Intensidad As Integer)
Dim BytesPerLine As Long
Dim WinDC As Long
Dim TmpDC As Long
Dim dl As Long
Dim mBmp As Long
Dim AntBmp As Long
Dim Addrs As Long
Dim ContadorX As Long
Dim ContadorY As Long
Dim lpBits() As Byte
Dim mSizeImage As Long
Dim Rojo As Long, Verde As Long, Azul As Long, Gris As Long
Dim M_BitmapInfo As BITMAPINFO24
Dim SA As SAFEARRAY2D
Dim posX, posY, n As Long
Dim postX, postY As String
Dim repeat As Long
Dim repetir As Integer
Dim Matris, Tolerancia
[B][COLOR=blue]Dim colorD As Boolean[/COLOR][/B]
[B][COLOR=blue]colorD = False[/COLOR][/B]
Tolerancia = Form1.HScroll1.Value
'Screen.MousePointer = 11
GetRGB Color, R, G, B
Pic = Pic 'solo para refrescar a la imagen original
Pic.ScaleMode = 3
Pic.AutoRedraw = True
BytesPerLine = ScanAlign(Pic.ScaleWidth * 3)
mSizeImage = BytesPerLine * Pic.ScaleHeight
With M_BitmapInfo.bmiHeader
.biSize = Len(M_BitmapInfo.bmiHeader)
.biWidth = Pic.ScaleWidth
.biHeight = Pic.ScaleHeight
.biPlanes = 1
.biBitCount = 24
.biCompression = BI_RGB
.biSizeImage = mSizeImage
End With
WinDC = GetDC(0)
TmpDC = CreateCompatibleDC(WinDC)
mBmp = CreateDIBSection(WinDC, M_BitmapInfo, DIB_RGB_COLORS, Addrs, 0, 0)
dl = ReleaseDC(0, WinDC)
With SA
.cbElements = 1
.cDims = 2
.Bounds(0).lLbound = 0
.Bounds(0).cElements = Pic.ScaleHeight
.Bounds(1).lLbound = 0
.Bounds(1).cElements = BytesPerLine
.pvData = Addrs
End With
CopyMemory ByVal VarPtrArray(lpBits), VarPtr(SA), 4
AntBmp = SelectObject(TmpDC, mBmp)
dl = BitBlt(TmpDC, 0, 0, Pic.ScaleWidth, Pic.ScaleHeight, Pic.hDC, 0, 0, SRCCOPY)
For ContadorY = 0 To Pic.ScaleHeight - 1
For ContadorX = 0 To (Pic.ScaleWidth * 3) - 1 Step 3
Rojo = lpBits(ContadorX + 2, ContadorY)
Verde = lpBits(ContadorX + 1, ContadorY)
Azul = lpBits(ContadorX, ContadorY)
'++++++++++++++++++++++detecta el color rojo+++++++++++++++++++++++++++++++++++
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
If (Rojo - Tolerancia > Azul) And (Rojo - Tolerancia > Verde) Then
n = n + 1
Rojo = 0
Verde = 200
Azul = 0
posX = posX + (ContadorX / 3 - 2) '+ posX
posY = posY + (234 - ContadorY) '+ posY
[B][COLOR=blue]colorD = True[/COLOR][/B]
 
End If
'Form1.Text4 = Form1.Text4 & "(" & Rojo & "," & Verde & "," & Azul & ")" & "  "
'++++++++++++++++mezcla los colores del pixelll++++++++++++++++++++++++++++++++++
lpBits(ContadorX, ContadorY) = Azul '- Rojo / Intensidad + B / Intensidad
lpBits(ContadorX + 1, ContadorY) = Verde ' - Verde / Intensidad + G / Intensidad
lpBits(ContadorX + 2, ContadorY) = Rojo   '- Azul / Intensidad + R / Intensidad
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
Next ContadorX
Next ContadorY
CopyMemory ByVal VarPtrArray(lpBits), 0&, 4
dl = BitBlt(Pic.hDC, 0, 0, Pic.ScaleWidth, Pic.ScaleHeight, TmpDC, 0, 0, SRCCOPY)
dl = SelectObject(TmpDC, AntBmp)
dl = DeleteObject(mBmp)
dl = DeleteDC(TmpDC)
 
[B][COLOR=blue]If colorD Then PlaySound App.Path & "\SOUNDS.wav"[/COLOR][/B]
 
'Form1.Text4.Text = Matris
'Screen.MousePointer = 0
'+++++++++++++++++dibujo el circulo sobre el color rojo derectado y promedio+++++++
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
On Error Resume Next
Form1.Text1.Text = CLng(posX / n)
Form1.Text2.Text = CLng(posY / n)
Form1.Text3.Text = n
With Form1.Picture2
Form1.Picture2.FillStyle = 7
Form1.Picture2.FillColor = RGB(0, 189, 0) 'verde
Form1.Picture2.Circle (posX / n, posY / n), _
                 30, _
                 vbRed
End With
Pic.Refresh
End Sub
```
 
comenta si entendi bien el problema....


----------



## Nano24 (May 21, 2011)

lubeck dijo:


> Hola Nano...
> 
> Efectivamente es una API de Windows... la cual se llama desde esta instruccion
> 
> ...



Muchas gracias por tomarte la molestia de ayudarme lubeck, pero el problema aun persiste porque lo que deseo es que el api se reproduzca completamente cuando este presente el color, pero no pasa así pues se queda colgado cuando el color rojo esta presente y no termina la reproducción sino hasta que se le quita el color rojo. Ves ese es el detalle.


----------



## lubeck (May 21, 2011)

Mm... me parece que no estas en linea....

creo que ahora si te voy entiendo... mira busca esto... ademas del cambio que te mencione antes...

```
Private Sub Command5_Click()
Timer1.Interval = [COLOR=darkslateblue][COLOR=red]2000 ' aumenta el tiempo a que de chance de terminar la reproduccion...[/COLOR]
[/COLOR]Timer1.Enabled = True
End Sub
```
 
Y no entiendo si quieres que:
1- lo reproduzca indefinidamente mientras este el color, 
2- que lo reproduzca una sola vez y hasta nueva deteccion lo reproduzca...

con estos cambios que te sugiero hace la primera opcion...

Listo... si lo que buscas es la segunda opcion prueba este anexo (con auto-aceleracion de deteccion ) y me comentas......
...


----------



## Nano24 (May 21, 2011)

lubeck dijo:


> Mm... me parece que no estas en linea....
> 
> creo que ahora si te voy entiendo... mira busca esto... ademas del cambio que te mencione antes...
> 
> ...



Muchas gracias lubeck por tu ayuda, le aumente el interval a 2000 y ahi si reproduce por completo el archivo wav, gracias sos un genio


----------



## diodito (May 21, 2011)

lubeck dijo:


> Pues yo creo que investigues primero un poco... lee los primeros post de este tema... y si te surguen dudas plantealas aqui e intentare(mos) responderte...



esta bien pero le hago una pregunta yo estuve mamipulando un programa llamado mplab y no entiwndo lagunas cosas por ejemplo los comandos que tienes no se suponen que tienen que ir en hex, bueno digo yo 


saludos


----------



## lubeck (May 21, 2011)

> yo estuve mamipulando un programa llamado mplab


 
Ok... El Mlab es un programa para un lenguaje llamado ensamblador....

el tema o lenguaje que estamos viendo aqui es PicBasic no se cual sea la ultima version yo tengo la 2.46 y puedes usar un editor llamado microstudio yo tengo la version 3.0.

lo que hacen estos programas es que es un lenguaje que al compilarlo lo traduces a ensamblador y despues se genera el archivo Hex que es el que se graba al micro....

el ensamblador para hacer algo muy sencillo tienes que hacer un pograma kilometrico... que en basic con una linea lo pudieras hacer...

conforme vayas aprendiendo te daras cuenta las bondades de uno u otro...
y ademas existe otro muy bueno que es el C y digamos esta intermedio entre estos dos...

se entiende???


----------



## diodito (May 21, 2011)

lubeck dijo:


> Ok... El Mlab es un programa para un lenguaje llamado ensamblador....
> 
> el tema o lenguaje que estamos viendo aqui es PicBasic no se cual sea la ultima version yo tengo la 2.46 y puedes usar un editor llamado microstudio yo tengo la version 3.0.
> 
> ...



lo pasa de bonario a hex


----------



## lubeck (May 21, 2011)

> lo pasa de bonario a hex


 
Mmmm.. no exactamente... todos los lenguajes trabajan en binario....

Digamos que....

Basic un lenguaje facil de entender y manipular...
Ensamblador Un lenguage de PC
Hex el lenguage de los micros...

entonces tu haces tu progrmama en basic y la pc con su lenguaje ensamblador hace el lenguaje hex del micro-controlador...

igual te lo explico de una manera en que te formes una idea y conforme vayas viendo iras puliendo y formandote una idea mas real...ok..


----------



## diodito (May 21, 2011)

lubeck dijo:


> Mmmm.. no exactamente... todos los lenguajes trabajan en binario....
> 
> Digamos que....
> 
> ...



ya entonces el programa  PicBasic  es un compilador igual que el mplab


----------



## lubeck (May 21, 2011)

> ya entonces el programa PicBasic es un compilador igual que el mplab


 
Asi es... 


con MLab por asi decirlo utilizas el lenguaje maquina por eso es que es al programar es mas largo... pero podria ser mas rapido que un programa en basic (si se es buen programador) puesto que en este las rutinas en ensamblador son prediseñadas... y con bucles o rutinas que podrian estar sobrando...y hacerlo lento... aunque basic tambien despues tambien se convierte en ensamblador....


----------



## diodito (May 21, 2011)

lubeck dijo:


> Asi es...
> 
> 
> con MLab por asi decirlo utilizas el lenguaje maquina por eso es que es al programar es mas largo... pero podria ser mas rapido que un programa en basic (si se es buen programador) puesto que en este las rutinas en ensamblador son prediseñadas... y con bucles o rutinas que podrian estar sobrando...y hacerlo lento... aunque basic tambien despues tambien se convierte en ensamblador....



ya te estoy entendieno....



			
				diodito dijo:
			
		

> ya te estoy entendieno....



me gustaria aprender a manipular este programa se interesante


----------



## lubeck (May 21, 2011)

Ok... ya es cuestion de que decidas si te gustaria programar en Ensamblador, En Basic o como te digo en C... para C hay un compilador muy bueno que se llama CCS (aunque e oido que este no es de los mejores)

En basic hay otros compiladores como el Proton y otros que no recuerdo...


Pero... Aqui solo Picbasic pro...


----------



## diodito (May 21, 2011)

lubeck dijo:


> Ok... ya es cuestion de que decidas si te gustaria programar en Ensamblador, En Basic o como te digo en C... para C hay un compilador muy bueno que se llama CCS (aunque e oido que este no es de los mejores)
> 
> En basic hay otros compiladores como el Proton y otros que no recuerdo...
> 
> ...



este una preguntita, eso de c que es


----------



## lubeck (May 21, 2011)

> este una preguntita, eso de c que es


 
C es otro lenguaje como Basic... digamos que es un poco mas compleja su programacion pero se obtienen mejores resultados que en Basic...

Claro que el malo no es el burro sino el arriero... todo depende del programador y de las aplicaciones que quieras hacer...

mmm.. si me preguntas cual es mejor... te diria.. que ninguno o los tres...

si me preguntas cual aprender te diria que los tres...

si me preguntas por cual empezaria te diria que con basic... despues C y despues Ensamblador...


----------



## diodito (May 21, 2011)

lubeck dijo:


> C es otro lenguaje como Basic... digamos que es un poco mas compleja su programacion pero se obtienen mejores resultados que en Basic...
> 
> Claro que el malo no es el burro sino el arriero... todo depende del programador y de las aplicaciones que quieras hacer...
> 
> ...



ok amigo, sera otro dia y gracias por aclararme  las dudas


----------



## banistelrroy (May 22, 2011)

lubeck dijo:


> Lo que yo no alcanzo a entender es como los maestros piden cosas sin enseñar a hacerlas....
> 
> me cai que asi... hasta yo soy un p*t* maestro de esos....
> 
> ...



lubeck tienes un 10 de 10 eres un maestro logre resolver mi problema ayer lo presente de paso aproveche para decir a mi profe que su curso no llevaba relacion con la realidad se que no hay nada imposible pero tampoco se puede pedir lo que aun no se puede hacer desgraciadamente la educacion en el peru esta haci te pedin cosas que nunca te enseñaron bueno ese tema lo dejo aparte.............................doy gracias a lubeck por la ayuda que me ha brindado todos estos dias creo es uno de los mejores colaboradores de este foro que he visto hasta ahora sos un maestro gracias por todo ......

un saludo desde PERU
+10.....de...10


----------



## Nano24 (May 23, 2011)

Bueno por aca dejare unos aportes de manejo de LCD con animaciones y un manual de picbasic que trata sobre el uso de la CGRAM para crear nuestras imagenes personalizadas, aqui les presento un pequeño por decirlo asi un mini juego donde se muestra un caballo en la LCD se presiona BOTON_1 para iniciar, todo lo que se debe hacer e saltar el obstaculo mucho antes de llegar sino nuestro amigo virtual se desarmara jeje


----------



## chapin (May 24, 2011)

buenisimo nano gracias.


----------



## Nano24 (May 24, 2011)

chapin dijo:


> buenisimo nano gracias.



De nada, el manual no lo pude subir pero intentare de nuevo a ver que sucede.


----------



## lubeck (May 24, 2011)

Esta Bacan! Nano....


----------



## Nano24 (May 24, 2011)

lubeck dijo:


> Esta Bacan! Nano....


 

Que bueno que les a gustado, en cuanto pueda subo el manual que nose por que me da error en la subida la pagina.


----------



## lubeck (May 24, 2011)

Lo estas empacando .rar el servidor no acepta todos los formatos


----------



## Nano24 (May 24, 2011)

lubeck dijo:


> Lo estas empacando .rar el servidor no acepta todos los formatos



Lo coloque en rar pero tampoco lo acepta, da un error, no entiendo la verdad y el manual es buenísimo tiene varios ejemplos, que broma y quería compartirlo con ustedes.


----------



## lubeck (May 24, 2011)

sera lo pesado que esta.... intenta partirlo con el winrar... con 200000


----------



## Nano24 (May 24, 2011)

lubeck dijo:


> sera lo pesado que esta.... intenta partirlo con el winrar... con 200000



Intente e intente pero nada, ni como pdf que pesaba menos, pero bueno aqui les dejo la pagina donde encontraran el libro de animacion  de caracteres con la CGRAM de un LD 16X2.

*Link de descarga:*

http://www.conexionelectronica.com/download/cdpicbasic.zip 

Disfrútenlo amigos, por lo menos me sirvió para crear un mini juego con el PIC16F877A.



			
				Nano24 dijo:
			
		

> Intente e intente pero nada, ni como pdf que pesaba menos, pero bueno aqui les dejo la pagina donde encontraran el libro de animacion  de caracteres con la CGRAM de un LD 16X2.
> 
> *Link de descarga:*
> 
> ...



Regreso por aca lubeck porque la pagina de donde encontre el libro pues no era el de animacion pero no esta demas las practicas que alli se encuentran en basic, aqui dejo un link de un pdf que muestra como manejar sensores inteligentes en picbasic, cuando consiga el del libro de animacion publico el link.

sensores inteligentes:

http://www.parallax.com/Portals/0/Downloads/docs/prod/sic/SmartSensors-v1.0-Spanish-v1.0.pdf

Manual Picbasic de manejo y uso de la CGRAM, con ejemplos para crear caracteres personalizados, libro pdf en español.  

*link de descarga del pdf:*

http://www.unrobotica.com/manuales/basic.pdf


----------



## cjefferson (May 25, 2011)

Saludos Cordiales, estoy aprendiendo a programar microcontroladores y elegido el Basic  como lenguaje de programación estoy usando Microcode Estudio y el Compilador Pic Basic Pro, como referencia el libro Programación en Basic de Carlos Reye, una de mis dudas es que he visto varios proyectos de este foro y declara el oscilador dentro de la programación Ejemplo: 
	
	



```
" @ device xt_osc  ; oscilador externo xt
define osc 4     ; especifica que se va a utilizar uno de 4 mhz "
```
 pase un dia entero tratando de hacer titilar un led en un Pic 16f628a, no sabia que el PicKit2 clone hay que configurar el oscilador con unos bit para usar uno externo o el interno, les pregunto se puede declarar el uso del oscilador interno del 16f628a dentro de la programación y no configurar en el pickit clone; de ser posible como se declararía,  muchas gracias por su ayuda.

Saludos..


----------



## lubeck (May 25, 2011)

Mira a estos se le nombran Fuses


```
@ Device   PIC16F628A
@ Device   Intrc_Osc
@ Device   Protect_Off
@ Device   WDT_Off
@ Device   Pwrt_Off
@ Device   MCLR_On
@ DEvice   BOD_Off
@ Device   LVP_Off
@ Device   CPD_Off
```
 
Cada Pic tiene los suyos propios y muchos son comunes entre si...

en tu caso segun entiendo en lugar de poner 

```
@ device xt_osc  ; oscilador externo xt
```
deberias poner


```
@ Device   Intrc_Osc  oscilador interno
```


----------



## cjefferson (May 25, 2011)

lubeck dijo:


> Mira a estos se le nombran Fuses
> 
> 
> ```
> ...



Gracias Amigo , que bueno es contar con este foro...
Estaré por aquí muy a menudo tratando de despejar mis dudas..

Saludos


----------



## ferdy575 (May 25, 2011)

hola a todos los felicito veo que saben muchisimo de este tema, por eso me animo a molestarlos a ver sí me pueden ayudar con esto, quisiera saber como convierto un código escrito en MCS para 16f628a para que me funcione con un 16f873a ó un 16f877a estoy haciendo un robot sencillo pero el 16f628a se me esta quedando pequeño por falta de más puertos por eso decidí cambiarlo les agradezco de antemano su ayuda.


----------



## lubeck (May 25, 2011)

Sube el codigo y te echo una mano, casi es solo de de cambiar los fuses y si no usas analogos en lugar de poner cmCon=7 pones AdcOn1=7 (creo que a si es) y compilarlo como 16f8XXA...

pero seria cuestion de darle una checadita...


----------



## Nano24 (May 26, 2011)

Amigos del foro se que esta sección es de programación en lenguaje Basic pero quise compartir con ustedes estos libros que como todo electrónico necesitamos para nutriros de información y conocimiento, espero que lo disfruten hay una gran variedad de libros.

*
LINK DE LA PAGINA:
*

http://www.electronicapura.com.ar/2009/10/libros.html


----------



## ferdy575 (May 27, 2011)

lubeck dijo:


> Sube el código y te echo una mano, casi es solo de de cambiar los fuses y si no usas análogos en lugar de poner cmCon=7 pones AdcOn1=7 (creo que a si es) y compilarlo como 16f8XXA...
> 
> pero seria cuestion de darle una checadita...


 
hola gracias por ver mi mensaje te cuento es un robot seguidor de lineas pero tiene otras funciones como buscar la luz y todas las luces de un vehículo real pero también quiero que tenga el pito de la reversa, que según la inclinación del terreno ó el peso que lleve haga cambios de velocidad pues es un camión y no me alcanzan los puertos además quiero añadirle otras funciones pues tengo pensado convertirlo en una retroexcavadora te envió la simu y el código a ver como uso un pic más grande inicialmente lo hice con 16f84a pero me presntaba fallas veras mucha repetición pero es para evitar errores en las subrutinas de antemano muchas gracias


----------



## lubeck (May 27, 2011)

Pue si amigo.... creo que lo unico que tienes que quitar es el alldigital, y ponerle adcon1=7

respetar los mismo puertos y deberia funcionar...
PD. no lo simule porque los colores de los cablecitos esta muy feos  y casi no se ven...


----------



## ferdy575 (May 28, 2011)

lubeck dijo:


> Pue si amigo.... creo que lo unico que tienes que quitar es el alldigital, y ponerle adcon1=7
> 
> respetar los mismo puertos y deberia funcionar...
> PD. no lo simule porque los colores de los cablecitos esta muy feos  y casi no se ven...


 
jejeje gracias por tu ayuda ya hice al prueba como tú dices y si me funciono


----------



## yoship (May 30, 2011)

Hola a todos, estuve probando el PBP y cuando le pongo el codigo @ device xt_osc o de esta forma @device xt_osc me manda un error al compilar bueno no entiendo porque y si alguien lo sabe porfa responda gracias


----------



## lubeck (May 30, 2011)

puedes subir tu archivo... empaquetalo en un rar


----------



## ferdy575 (Jun 1, 2011)

hola a todos otra vez por aqui molestando. Quisiera saber como escribo un codigo y como configuro 2 puertos del 16f84a porta.0 y porta.1 para detectar una señal de por ejemplo 455 khz o menos que a su vez sea generada por el porta.2 ¿si existe una función inversa a frecOut? ¿algo como frecIn? para no tener que utlizar un LM567 como decodificador aparte del pic de antemano gracias por su ayuda


----------



## Nano24 (Jun 3, 2011)

ferdy575 dijo:


> hola a todos otra vez por aqui molestando. Quisiera saber como escribo un codigo y como configuro 2 puertos del 16f84a porta.0 y porta.1 para detectar una señal de por ejemplo 455 khz o menos que a su vez sea generada por el porta.2 ¿si existe una función inversa a frecOut? ¿algo como frecIn? para no tener que utlizar un LM567 como decodificador aparte del pic de antemano gracias por su ayuda



Si, hay una funcion llamada PULSIN que es para leer los pulsos que entran en un pin, por ejemplo quieres leer los pulsos que llegan a un puerto, tienes que declarar el puerto por donde se van a leer los pulsos y una variable.

La resolución de PULSIN depende de la frecuencia del oscilador . Si se usa un oscilador de 4 Mhz , el
ancho de pulso se obtiene en incrementos de 10 us .Si se usa un oscilador de 20 Mhz ,el ancho de pulso
tendrá una resolución de 2 us .Definir un valor de OSC no tiene efectos sobre PULSIN . La resolución
siempre cambia con la velocidad del oscilador en uso .

*DEFINE* OSC 4                          ;Definir oscilador a 4Mhz(claro puedes usar uno mayor, ese lo coloco de ejemplo.

TRISB=%00000010                            ;Se especifican los puertos de entrada y salida "0" salida "1" entrada, se cuentan de mayor a menor en sentido de izquierda a derecha, osea, 7,6,5,4,3,2,1,0 el 1 que es el puerto PORTB.1 es la entrada.

Leer *VAR* PORTB.1                    ;PIN por el que se leeran los pulsos.

Contar *VAR* *WORD*           ;Variable contar con un peso de 65535.

LED_AMARILLO *VAR* PORTB.2      ;LED para simular la salida como ejemplo del conteo de pulsos si llega a ser mayor de 455000 Hz.

LED_ROJO *VAR* PORTB.3            ;LED para simular la salida como ejemplo del conteo de pulsos si llega a ser menor de 455000 Hz.


INICIO:

*PULSIN* Leer,1000,Contar   ;Se prepara la función para leer los pulsos por el puerto 1 a un 1 segundo.

*IF* Contar>455000 *THEN* encender_led_amarillo       ;Si Contar es mayor a 455000 Hz entonces encender led amarillo.

*IF* Contar<455000 *THEN* encender_led_rojo            ;Si Contar es menor a 455000 Hz entonces encender led rojo.

*LOW* LED_AMARILLO:*LOW* LED_ROJO     ;Mantener apagado a led amarillo y rojo.

*GOTO* INICIO       ;Volver al INICIO.

encender_led_amarillo:

*HIGH* LED_AMARILLO
*LOW* LED_ROJO

*GOTO* INICIO

encender_led_rojo:

B]HIGH[/B] LED_ROJO
*LOW* LED_AMARILLO

*GOTO* INICIO

*END*


Espero que te sirva de ayuda el ejemplo que te he puesto ahí, saludos.


----------



## ferdy575 (Jun 3, 2011)

Nano24 dijo:


> Si, hay una funcion llamada PULSIN que es para leer los pulsos que entran en un pin, por ejemplo quieres leer los pulsos que llegan a un puerto, tienes que declarar el puerto por donde se van a leer los pulsos y una variable.
> 
> La resolución de PULSIN depende de la frecuencia del oscilador . Si se usa un oscilador de 4 Mhz , el
> ancho de pulso se obtiene en incrementos de 10 us .Si se usa un oscilador de 20 Mhz ,el ancho de pulso
> ...


 
hola gracias por tu ayuda lo probe y funciona bien pero y si quisiera detectar al mismo tiempo 2 señales distintas y obtener respuesta en 2 puertos como lo haria? la verdad siempre he estado trabajando con pics pero con funciones digitales no habia necesitado hacerlo con señales y no se muy bien como se hace por ejemplo:
Define osc 4
trisa = %11111111
trisb = %00000000

if porta.0 = 455khz and porta.1 = 450khz then
high portb.0
high portb.1
endif

if porta.0 = 455khz and porta.1 = 0khz then
high portb.0
low portb.1 
endif

ahí me perdonas la ignorancia y la molestadera


----------



## lubeck (Jun 3, 2011)

Me parece que esto no es asi...



> *PULSIN* Leer,1000,Contar ;Se prepara la función para leer los pulsos por el puerto 1 a un 1 segundo.


 

es PULSIN Pin, State,Var

si pones...
PULSIN PORTA.0,1,LUBECK Va a colocar en la variable LUBECK el tiempo que dure en estado alto(1) el puertoA.0

si pones...
PULSIN PORTA.0,0,LUBECK Va a colocar en la variable LUBECK el tiempo que dure en estado bajo(0) el puertoA.0


----------



## Nano24 (Jun 3, 2011)

lubeck dijo:


> Me parece que esto no es asi...
> 
> 
> 
> ...



Pues que raro yo e usado justo como el manual picbasic me dice 

PULSIN PORTA.0,1500,LUBECK  y es a 1500 milisegundos y funciona, bueno.


----------



## lubeck (Jun 3, 2011)

estaremos hablando de lo mismo???



Traduccion:
Mide el Ancho del pulso en el Pin. Si "State" es cero, el ancho del pulso en bajo es medido, si "State" es 1 el ancho del pulso en Alto es medido.La medicion del ancho del pulso es puesto en "Var".Si el cambio de estado nunca ocurre o es demasiado largo para ser medido, "Var" sera igual a cero.


----------



## Nano24 (Jun 3, 2011)

lubeck dijo:


> estaremos hablando de lo mismo???
> 
> Ver el archivo adjunto 54417
> 
> ...



Bueno Lubeck ahí si me quede corto amigo, seria bueno si subes un ejemplo para asi entender mejor, de todas maneras tus aportes siempre son buenos, gracias.


----------



## demonjeff (Jun 7, 2011)

autotronico dijo:


> buenas en el foro he visto proyectos con matrix de leds y me dio curiosidad para del desarrollo de uno a través de teclado como este:
> 
> http://www.youtube.com/watch?v=G24WxjtKsqQ
> 
> he logrado esto con un pic 182550( dejo simulación en proteus me falta la comunicacion pc -pic o teclado-pic), vere como puedo avanzar


hola autotronico estoy interesado en tu proyecto te agradeceria su pusieras los codigos en PBP recien estoy aprendiendo a usar este lenguaje de programación ..  gracias ... atte Jeff


----------



## lubeck (Jun 7, 2011)

*demonjeff*


> autotronico estoy interesado en tu proyecto te agradeceria su pusieras los codigos en PBP


 



> recien estoy aprendiendo a usar este lenguaje de programación ..


 





Empieza con cosas mas sencillas como prender un led... o directamnte pidele que te regale su trabajo!!!


*Autotronico*


> he logrado esto con un pic 182550( dejo simulación en proteus me falta la comunicacion pc -pic o teclado-pic), vere como puedo avanzar


 
Comenta si ya lograste eso del teclado... yo ya lo consegui y podria echarte una mano...


----------



## autotronico (Jun 8, 2011)

lubeck: 

Que tal ya realice el control por teclado pero no me reconoce todos los caracteres deseo llegar a algo como esto:






por lo que he estado usado el comando select case para contener todos los caracteres del teclado cuando pueda subo avances.

saludos.

este es un pequeño fragmento del programa:



> tabla:
> Select case caracter
> case "A"
> For T=0 to 7
> ...


----------



## Nano24 (Jun 8, 2011)

autotronico dijo:


> lubeck:
> 
> Que tal ya realice el control por teclado pero no me reconoce todos los caracteres deseo llegar a algo como esto:
> 
> ...



Deberias explicar como lo hiciste? se ve genial y si es en lenguaje Basic uffs mucho mejor, para eso es el foro no!! Para impartir conocimiento


----------



## atricio (Jun 8, 2011)

si es asi la matriz una maquina felicitaciones por el desarrollo muy interesante ojala puedas postear los resultados para aprender todos


----------



## torres.electronico (Jun 9, 2011)

Saludos a todos, y hace un par de dias me tope con este topic que me gusto mucho linea a linea que fui viendo... 
voy a ver si me hago de un espacio de tiempo, e irles sumando proyectos mios... algunos quizas no suba el diagrama por una razon personal, y otro quizas si...
Arranco con un sencillo y eficaz Controlador de Largada, con tacometro incluido...
Tengo una version mejorada, que incluye mas funciones, pero que corre con un 877a y una eeprom.
Saludos


```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : Martin A. Torres Fortelli                         *
'*  Notice  : Copyright (c) 2010 Escuela Tecnica Virtual        *
'*          : All Rights Reserved                               *
'*  Date    : 03/09/2010                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ Device   PIC16F876
@ device xt_osc
define osc 20

define LCD_DREG    PORTB
define LCD_DBIT    4
DEFINE LCD_RSREG   PORTB
DEFINE LCD_RSBIT   3
DEFINE LCD_EREG    PORTB
DEFINE LCD_EBIT    2
define ADC_BITS    8
define ADC_CLOCK   3
DEFINE ADC_SAMPLEUS 10
;*******************************************************************
;********************* Config I/0 etc ******************************
ADCON1 = %00001110                       
Symbol boton_uno = PORTC.0          ;BOTON PULSADOR UNO
symbol boton_ctrlRPM = PORTC.3      ;BOTON CONTROLADOR DE LARGADA
symbol boton_enter = PORTC.5        ;BOTON PULSADOR ENTER
SYMBOL boton_subir = PORTC.6        ;BOTON PULSADOR SUBIR
SYMBOL boton_bajar = PORTC.7        ;BOTON PULSADOR BAJAR

ent_RPM var portb.0                 ;Entrada de señal PWM
btn_1 var portC.0                   ;BOTON PULSADOR UNO
led_G var portC.2                   ;BOTON PULSADOR TRES
btn_CRPM var portC.3                ;BOTON CONTROLADOR DE LARGADA
enter var portC.5                   ;BOTON PULSADOR ENTER
bsubir var portC.6                  ;BOTON PULSADOR SUBIR
bbajar var portC.7                  ;BOTON PULSADOR BAJAR
releC var portC.4                   ;Salida relay corte RPM
led var portC.1                     ;Salida indicador LED
     
linea1 con $80
linea2 con $C0
       
temp VAR byte                       ; Byte Variable temporal
Cnt VAR word                        ; Cnt es una variable tipo byte
RPMalta var word                    ; RPMalta es una variable tipo word
RPMbaja var word                    ; RPMbaja es una variable tipo word
RPMaviso var word
lamda var byte

x var byte                          ; x es una variable tipo byte
x1 var byte                         ; x1 es una variable tipo byte
revo var word                       ; revo es una variable tipo word
disparo var byte                    ; disparo es una variable tipo byte

eeprom 0, [22,26]

;**********************************************************************
;********************** Cuerpo del programa ***************************
;**********************************************************************

ini1:
        lcdout $FE,1
        lcdout $FE, linea1,"Controlador de"
        LCDOUT $FE,$C3, "RPM V0.2a"
        pause 1000
        gosub loop

;*******************************************************************************
;******************* Visor simple de RPM ***************************************
;** Esta funcion, solo se emplea para monitorizar las RPM , el sensor Lambda****
;********************** y las opciones de config o control *********************
;*******************************************************************************
                
LOOP:
     ADCIN 0,lamda
     count portb.0, 125, revo
       revo= (revo / 4)/2 * 240 
     LCDOUT $FE,1,"RPM=",dec revo," L=",dec lamda      
     LCDOUT $FE,linea2,"En=CtrL 1=ProgCL"
     temp = 0
     BUTTON boton_enter, 0, 255, 0, temp, 1,PM_CL          ;boton_uno = PORTC.0
     temp = 0
     BUTTON boton_uno, 0, 255, 0, temp, 1,PM_Prog
     GOTO LOOP   

control_rpm:
count portb.0, 125, revo
       revo= (revo / 4)/2 * 240
LCDout $FE,1,"CONTROL LARGADA"
pause 100
if PORTC.3 = 1 then PM_CL
if revo > RPMbaja then
lcdout $FE,$c0,"RPM=",dec revo
high releC 
pause 250
low releC
endif 
goto control_rpm

;**---------------------------------------------------------**   
;**---------------------------------------------------------**
;**---------------------------------------------------------**

PM_CL:
       ADCIN 0,lamda
       count portb.0, 125, revo
       revo= (revo / 4)/2 * 240 
       LCDOUT $FE,1,"RPM=",dec revo," L=",dec lamda       
       lcdout $FE,$c0,"C=",dec RPMalta," CL=",DEC RPMbaja
       pause 100
       if PORTC.3 = 0 then control_rpm
       if enter= 0 then LOOP       
       gosub visor
       gosub control2
       GOTO PM_CL

;**---------------------------------------------------------** 
;**---------------------------------------------------------**
;**---------------------------------------------------------** 

visor:
       IF revo > RPMaviso then disparoLED
       if revo < RPMaviso then disparoLED_V
       if PORTC.3 = 0 then control_rpm
       if enter = 0 then LOOP
       pause 100
       return
disparoLED_V:
       temp = 0
      if boton_enter = 0 then LOOP
      high led_G : Low led
      pause 100
      low led_G
      goto control1
       
disparoLED:  
temp = 0
         
       high led : low led_G
       pause 100
       low led
       goto control1
control1:
       IF revo > RPMalta then corte1
       goto PM_CL       

;**---------------------------------------------------------**  
;**---------------------------------------------------------**
;**---------------------------------------------------------**  
   
control2:   
       if PORTC.3 = 0 then control_rpm
      if enter = 0 then LOOP  
       IF revo > RPMalta then corte1
       return

;**---------------------------------------------------------**   
;**---------------------------------------------------------**
;**---------------------------------------------------------**    

corte1:
LCDout $FE,1,"CORTE"
For disparo= 1 to 3
high releC 
pause 500
low releC
next
goto PM_CL

;****************************************************************
;********************** Seccion de Prog RPM *********************
;****************************************************************

 PM_Prog:
 RPMalta = 19500
 RPMbaja = 3500
 RPMaviso = 4000
 gosub soltar

;**---------------------------------------------------------**   
;**---------------------------------------------------------**
;**---------------------------------------------------------**

 grabar1:
 lcdout $FE,1,"Prog Visor Led" 
 lcdout $FE,$c0,"LED=",dec RPMaviso,"RPM"                                                        
 pause 100
 if bbajar = 0 then restar1
 if bsubir = 0 then sumar1
 if enter = 0 then grabarA
 goto grabar1
 
 restar1:
 RPMaviso = RPMaviso - 5
 goto grabar1
 
 sumar1:
 RPMaviso = RPMaviso + 5
 goto grabar1
 
 grabarA:
 gosub soltar
 write 0, RPMaviso
 
;**---------------------------------------------------------**   
;**---------------------------------------------------------**
;**---------------------------------------------------------**

 grabar2:
 lcdout $FE,1,"Prog Corte RPM" 
 lcdout $FE,$c0,"Corte=",dec RPMalta,"RPM"                                                        
 pause 100
 if bbajar = 0 then restar2
 if bsubir = 0 then sumar2
 if enter = 0 then grabarB
 goto grabar2
 
 restar2:
 RPMalta = RPMalta - 5
 goto grabar2
 
 sumar2:
 RPMalta = RPMalta + 5
 goto grabar2
 
 grabarB:
 gosub soltar
 write 0, RPMalta

;**---------------------------------------------------------**   
;**---------------------------------------------------------**
;**---------------------------------------------------------**

 grabar3:
 lcdout $FE,1,"Prog Ctrl larg" 
 lcdout $FE,$c0,"Corte=",dec RPMbaja,"RPM"                                                        
 pause 100
 if bbajar = 0 then restar3
 if bsubir = 0 then sumar3
 if enter = 0 then grabarC
 goto grabar3
 
 restar3:
 RPMbaja = RPMbaja - 5
 goto grabar3
 
 sumar3:
 RPMbaja = RPMbaja + 5
 goto grabar3
 
 grabarC:
 gosub soltar
 write 3, RPMbaja
 goto LOOP
 
 soltar:
 high led
 pause 150
 low led
 
 soltar2:
 If bbajar = 0 then soltar2
 If bsubir = 0 then soltar2
 If enter = 0 then soltar2
 pause 100
 return
 end
```


----------



## lubeck (Jun 9, 2011)

> Que tal ya realice el control por teclado pero no me reconoce todos los caracteres deseo llegar a algo como esto:


 
Mmm..  pero la lectura del teclado como la haces???... tienes algo avanzado?


----------



## lubeck (Jun 9, 2011)

Solicito Ayuda....

Con eso de los Timers...

 uso un pic16f628a con un cristal de 10MHz

Tengo este codigo...

```
@ Device PIC16F628A
@ Device HS_Osc
@ Device WDT_Off
@ Device Pwrt_off
@ Device Mclr_off
@ Device BOD_Off
@ Device LVP_Off
@ Device CPD_Off
@ Device Protect_Off
 
Define Osc 10
 
OPTION_REG = %00000000 
INTCON = %11100000 
 
On Interrupt Goto intr 
 
SH Var PortB.0
High SH
Tmr0=$FF
 
Main:
Goto Main
 
Intr:
Disable
 toggle sh 
 resume 
enable
```
 
segun la calculadora esta...



obtengo .0008ms/1000=0.0000008s

para sacar los Hz= 1/0.0000008s=1250000Hz=1.25MHz

pero....








65.7KHz... niii poooooooooqqqqquito cercas del 1.25MHz
que estoy haciendo mal???


----------



## guigo (Jun 10, 2011)

Hola: Vivo en medellin y quiciera saber si me puedes dar asesoria para producir pwm basado en una fracuanecia o pulso generado por un receptor. La idea es camptar esa seÑal con un micro y enviarla atravez de un pin a un motor. Quiciera saber como puedo hacer en pbp esta instruccion. Se que con pulsin puedo leer seÑales que produce el receptor pero quiero generar pwm con seÑal de entrada para producir pwm salida segun entrada.




montoya8332 dijo:


> hola, me gustaria saber que editor y compliador usas , ya que
> 
> yo tengo un programa llamado proton, pero no me funcionan tus ejemplos por error de sintaxis
> 
> ...


----------



## lubeck (Jun 10, 2011)

> Se que con pulsin puedo leer seÑales que produce el receptor pero quiero generar pwm con seÑal de entrada para producir pwm salida segun entrada.



Si intentas con PULSOUT.... o PWM


----------



## ferdy575 (Jun 11, 2011)

respecto a pulsin quisiera saber si al usar esta función el pic queda condenado a realizar esta sola función ó puede realizar otras más mientras tanto, es decir por ejemplo controlar un motor o un lcd, generar pulsos o controlar luces, o sería necesario usar otro pic? un pic para cada función? o es pòsible que el pic haga todo el solito? alguien que por favor me explique esto pues no se como se haria el codigo para realizar varias funciones distintas al mismo tiempo; les agradezco su ayuda.


----------



## lubeck (Jun 11, 2011)

> alguien que por favor me explique esto pues no se como se haria el codigo para realizar varias funciones distintas al mismo tiempo; les agradezco su ayuda.



Mmmm... eso violaria todas la leyes de la termodinamica (no te creas no se)

yo creo que ni  los procesadores CoreDuo pueden procesar dos cosas exactamente al mismo tiempo...
por eso se hacen a varias velocidades 4Mhz, 20MHz etc... lo que puedes es agilizar la velocidad de procesamiento...


----------



## guigo (Jun 11, 2011)

ferdy575 dijo:


> respecto a pulsin quisiera saber si al usar esta función el pic queda condenado a realizar esta sola función ó puede realizar otras más mientras tanto, es decir por ejemplo controlar un motor o un lcd, generar pulsos o controlar luces, o sería necesario usar otro pic? un pic para cada función? o es pòsible que el pic haga todo el solito? alguien que por favor me explique esto pues no se como se haria el codigo para realizar varias funciones distintas al mismo tiempo; les agradezco su ayuda.



te cuento que apenas estoy empezando a conocer un poco el PBP, ya he sacado algunos proyectos y he tenido resultados como en otros no los he tenido. si pretende generar un PWM la instruccion que podes citar es HPWM, esto hace que el pwm interno trabaje y a la ves permite que el micro realice otras instrucciones:

HPWM 1 , 255 , 1000 : portb.0 = 1  pause 100 : portb.0=0


fijate en la instruccion: HPWM activa el pic cpp1 del micro que es pin por el cual va a salir la señal. 255 es el duty cicle, este cuando lo varias te da el ancho de pul y 255 es el maximo valor en HPWM. 1000 es la frecuencia o ciclos por segundo. espero que te sirva.



mecatrodatos dijo:


> Que tal amigos uno de los lenguajes mas facil para programar micros es el basic pro sin despreciar el C por lo que abierto este hilo para empezar a ejecutar programas sencillos hasta llegar a los mas complejos.
> 
> miren lo facil que es prender un led con un pic 16f84A :
> 
> ...




quiciera que me ayudaras con un algoritmo. quiero captar la señal que emite un receptor  hobbico con una instruccion sea pulsin o count y convertir esa señal a PWM. es posible cojer esa variable y que HPWM varie segun la señal de entrada?. como puedo crear esa instruccion.



autotronico dijo:


> lubeck:
> 
> Que tal ya realice el control por teclado pero no me reconoce todos los caracteres deseo llegar a algo como esto:
> 
> ...



quiciera que me ayudaras con un algoritmo. quiero captar la señal que emite un receptor hobbico con una instruccion sea pulsin o count y convertir esa señal a PWM. es posible cojer esa variable y que HPWM varie segun la señal de entrada?. como puedo crear esa instruccion.


----------



## lubeck (Jun 11, 2011)

> quiciera que me ayudaras con un algoritmo. quiero captar la señal que emite un receptor hobbico


Probablemente ellos sepan como funciona un receptor hobbico pero si pusieras mas informacion acerca de el, osea la señal que recibes es analoga o digital??? o que se yo... asi como que los pones a estudiar en algo que probablemente no lo hayan echo o no les interese... si pones que frecuencia recibes o como las recibes...bla bla .. no  se eso digo yo...


----------



## arturouc (Jun 12, 2011)

autotronico dijo:


> lubeck:
> 
> Que tal ya realice el control por teclado pero no me reconoce todos los caracteres



Que tal autotronico
yo tube un problema similar con el driver del servomotor y el probema estaba en la velocidad de comunicacion y en otra ocacion en los capacitores del max232 (falso contacto)


----------



## guigo (Jun 12, 2011)

lubeck dijo:


> Probablemente ellos sepan como funciona un receptor hobbico pero si pusieras mas informacion acerca de el, osea la señal que recibes es analoga o digital??? o que se yo... asi como que los pones a estudiar en algo que probablemente no lo hayan echo o no les interese... si pones que frecuencia recibes o como las recibes...bla bla .. no  se eso digo yo...



OK...
creo que no me hice entender.

pulsin es una instruccion que lee el ancho de pulso bajo o alto segun el caso que una persona determine determine. 

la señal es digital onda cuadrada. lo que yo necesito es hacer una instruccion de salida variable segun la señal que entra....


----------



## arturouc (Jun 13, 2011)

guigo dijo:


> OK...
> creo que no me hice entender.
> 
> pulsin es una instruccion que lee el ancho de pulso bajo o alto segun el caso que una persona determine determine.
> ...



BASIC PARA MICROCONTROLADORES PAG. 116
Count
Sintaxis: Count pin, duración, variable
Con esta instrucción se puede medir la frecuencia de una señal simple,
contando el número de pulsos durante un tiempo determinado, definido en el
campo “duración” de la instrucción. Se pueden medir frecuencias de hasta 25
khz con un oscilador de 4 MHz. Para un oscilador de 20 MHz la frecuencia
máxima a ser medida será de 125 khz.

DICES QUE TU ONDA ES CUADRADA
debes caracterizar la señal de entrada para que determines que quieres a la salida
dependiendo de la cantidad de "pulsos" que valor debe tener el HPWM

ESTOY USANDO EL 16F877A
DEFINE OSC 4
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
TRISB = %11111111
TRISC = %10000001    'puerto C bit 2 es el CCP1==>PARA EL HPWM
Pulsos Var Word
VEL VAR BYTE

Inicio:
Count PORTB.1, 500, Pulsos ' Cuenta los pulsos introducidos a través
                                        ' del pin RB1, durante 500 milisegundos y el
                                        ' resultado del conteo es almacenado en la

DEPENDIENDO DE LA CANTIDAD DE PULSOS
AQUI CALCULAS CUANTO DEBE VALER TU SALIDA
DE PWM (0-255)==>se lo cargas a VEL

HPWM 1, VEL, FPWM       '1==>CCP1, VEL==> 0 - 255, FPWM es la frecuencia
GOTO Inicio
End 

Espero te sirva...


----------



## guigo (Jun 13, 2011)

arturouc dijo:


> BASIC PARA MICROCONTROLADORES PAG. 116
> Count
> Sintaxis: Count pin, duración, variable
> Con esta instrucción se puede medir la frecuencia de una señal simple,
> ...



comprendo...
creo que en lo que estoy bloqueado es en la operacion que debe hacer el micro.
lo que pasa es que no entiendo muy bien como puedo hacer la operacion por ejemplo:

conunt portb.0,(0-500),vel ' que cuante de 0 a 500 y 500 sea = 255,
 segun entrada 0 a 500 = 0-255 hpwm.

no se si esto funcione:

if vel =0< 500 then

hpwm 1 , vel , 1000

que pena amigo, jajajaaa estoy perdido con esto...te agradesco mucho el aporte.


----------



## arturouc (Jun 14, 2011)

guigo dijo:


> comprendo...
> creo que en lo que estoy bloqueado es en la operacion que debe hacer el micro.
> lo que pasa es que no entiendo muy bien como puedo hacer la operacion por ejemplo:
> 
> ...



0-255
0-500
saca una constante 255/500 (Nota:tambien puede ser 500/255)
255/500=0.51 ESTA ES TU CONSTANTE

el valor que se almacene en tu variable pulsos lo multiplicas por 0.51 y se lo asignas a vel
VEL=pulsos*0.51 ejemplo
si pulsos vale 500
VEL=500*0.51=255 
ejemplo 2
si pulsos=300
VEL=300*.51=153

Y ESTE SERIA EL VALOR DEL PWM
NOTA: si tu cte es 500/255=1.9607.. la operacion seria pulsos/cte

espero te sirva...


----------



## inspector gadget (Jun 14, 2011)

Saludos amigos del foro. Es la primera vez que ingreso asi que espero que mi pregunta sea clara para ustedes que tan amablemente han compartido su sabiduria y experiencia con los que estamos iniciando con la programacion en pic bsic. Uso el pic 16f628A ,se trata de leer el estado de un pulsador, encender un led por un segundo y que luego se apague. Hasta aqui todo marcha bien, pero si lo que quiero es que con otro pulsador conectado a rb1, al presionarlo 1 vez, el programa inicie y realice su rutina y se mantenga en ese estado hasta presionarlo nuevamente donde el programa se detendra y asi sucesivamente.  Esto solo con aplicarle un pulso negativo a rb1. (on-off). La verdad lo he intentado con IF- THEN pero esta instruccion requiere que el pulso o estado  siempre esté presente y pretendo usar un pulsador no un swiche. Espero me puedan ayudar con sus siempre utiles sugerencias mil gracias.
 cmcon =7
pro:
     if porb.3 =0 then encen
     goto pro
encen:
     high porta.1
     pause 1000
     low porta.1
     goto pro 
end


----------



## Dario (Jun 14, 2011)

autotronico dijo:


> lubeck:
> 
> Que tal ya realice el control por teclado pero no me reconoce todos los caracteres deseo llegar a algo como esto:
> 
> ...



amigo autotronico: 

¿podrias explicar mejor tu proyecto? deveras que se ve muy interesante y me gustaria, o mejor dicho, nos gustaria experimentarlo ¿verdad amigos?
saludosss


----------



## cridram (Jun 14, 2011)

Amigos me pueden ayudar en detectar cual es el error en esta programacion porque cuando le programo al pic no me funciona es un pic 16F628A es el programa para un variador de velocidad de un motor DC gracias ayuuuuuuuuuuuuuuuuuuuuuuuda maestros 
'****************************************************************
'*  Name    : VARIADOR DE VELOCIDAD.BAS                                      *
'*  Author  : [CHRISTIAN BENAVIDES]                    *
'*  Notice  : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 01/06/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
botsubir VAR portb.1   
botbajar VAR portb.2
LED      VAR portb.3
FREC     VAR BYTE
bandera  VAR BIT
FREC = 125

HIGH LED
PAUSE 500
LOW LED

PROG:
  PWM PORTB.0,FREC,30
  LOW LED
  IF botsubir=0 THEN SUBIR
  IF botbajar=0 THEN BAJAR
  bandera =0
GOTO PROG
SUBIR:
  IF FREC>249 THEN aviso
  IF bandera=1 THEN prog
  HIGH LED
  bandera=1
  FREC=FREC+25
  GOTO prog
BAJAR:
   IF FREC<26 THEN aviso
   IF bandera=1 THEN prog
   HIGH LED
   bandera=1
   FREC=FREC -25
   GOTO prog
aviso:
   high led
   goto prog
end


----------



## lpnavy (Jun 14, 2011)

Que tal!! a todos!! tengo un inconveniente en mi programacion en un pic16f887 ya que deseo obtener de 2 a 4 salidas PWM controladas por ADC del pic, por ejemplo el AN0 controla en PWM_1, el AN1 controla el PWM_2 y asi sucesivamente. Hasta ahora he podido hacerlo con un solo PWM ya que si pongo 2 PWM hay un solapamiento del micro, ya que necesito controlar por PWM 4 dispositivos diferentes independientemente uno del otro, ademas he probado usando el PWM tanto como por software como por hardware si tener un buen resultado Si alguien sabe como resolver este tipo de problema con gusto lo agradeceria.


----------



## lubeck (Jun 15, 2011)

imagino que al presionar el pulsador aterrizas los puertos.... verdad???

si es asi, Prueba esto....


```
botsubir VAR portb.1 
botbajar VAR portb.2
LED VAR portb.3
FREC VAR BYTE
bandera VAR BIT
FREC = 125

HIGH LED
PAUSE 500
LOW LED

PROG:
 PWM PORTB.0,FREC,30
 IF botsubir=0 THEN [B]GOSUB[/B] SUBIR
 IF botbajar=0 THEN [B]GOSUB[/B] BAJAR
GOTO PROG

SUBIR:
 IF FREC>=225 THEN
  HIGH LED
  FREC=225
 ELSE
  HIGH LED
  FREC=FREC+25
  PAUSE 200
  LOW LED
 ENDIF
RETURN

BAJAR:
 IF FREC<=125 THEN
  HIGH LED
  FREC=125
 ELSE
  HIGH LED
  FREC=FREC-25
  PAUSE 200
  LOW LED
 ENDIF
RETURN
```

*LPNAVy*



> ya que necesito controlar por PWM 4 dispositivos diferentes independientemente uno del otro, ademas he probado usando el PWM tanto como por software como por hardware si tener un buen resultado Si alguien sabe como resolver este tipo de problema con gusto lo agradeceria



Y que opinas de usar cuatro micros diferentes como esclavos y un maestro, o utilizar un poco de electronica y poner cuatro PWM controlados por un micro (puede ser el poderoso 555)

*Dario:*

Mira este link...

http://micros.mforos.com/1149907/8023880-desarrollo-panel-90x8-16f877a-24lc256-ds1307-con-usb/

de ahi saque el ideas para el que hice....


----------



## torres.electronico (Jun 15, 2011)

cridram dijo:


> Amigos me pueden ayudar en detectar cual es el error en esta programacion porque cuando le programo al pic no me funciona es un pic 16F628A es el programa para un variador de velocidad de un motor DC gracias ayuuuuuuuuuuuuuuuuuuuuuuuda maestros
> '****************************************************************
> '*  Name    : VARIADOR DE VELOCIDAD.BAS                                      *
> '*  Author  : [no es el autor ]                    *
> ...



Ese ejemplo lo cita cristian en su curso y doy fe que funciona por que en su momento lo estuve pispeando en un miniboot casero.... Yo creo que el problema esta en los fuses que no puso o bien, quizas en el oscilador que no se menciona en ningun lado...


----------



## ferdy575 (Jun 16, 2011)

ayuda por fa' hola a todos estando "cacharreando" y repasando el libro: Basic para pic me doy cuenta que no puedo leer con un 16f877a los pulsos generados por el mismo si le ingreso pulsos de otro pic los lee bien pero los suyos no puse el osciloscopio para ver si generaba pulsos y si genera, a que se debe esto aguien tiene idea de que me quedaría mal en en codigo?


----------



## arturouc (Jun 16, 2011)

lpnavy dijo:


> Que tal!! a todos!! tengo un inconveniente en mi programacion en un pic16f887 ya que deseo obtener de 2 a 4 salidas PWM controladas por ADC del pic, por ejemplo el AN0 controla en PWM_1, el AN1 controla el PWM_2 y asi sucesivamente. Hasta ahora he podido hacerlo con un solo PWM ya que si pongo 2 PWM hay un solapamiento del micro, ya que necesito controlar por PWM 4 dispositivos diferentes independientemente uno del otro, ademas he probado usando el PWM tanto como por software como por hardware si tener un buen resultado Si alguien sabe como resolver este tipo de problema con gusto lo agradeceria.



Ese micro solo tiene dos modulos CCP, yo he trabajado con pwm de manera independiente pero solo con 2 motores, hay otros micros que manejan mas modulos CCP

la instrucción que utilizarías es HPWM, con esta instrucción el micro puede realizar otras tareas

en este mismo curso hay varios ejemplos de como utilizar HPWM


----------



## guigo (Jun 16, 2011)

cridram dijo:


> Amigos me pueden ayudar en detectar cual es el error en esta programacion porque cuando le programo al pic no me funciona es un pic 16F628A es el programa para un variador de velocidad de un motor DC gracias ayuuuuuuuuuuuuuuuuuuuuuuuda maestros
> '****************************************************************
> '*  Name    : VARIADOR DE VELOCIDAD.BAS                                      *
> '*  Author  : [CHRISTIAN BENAVIDES]                    *
> ...




deberias especificar que es lo que pretendes hacer con el programa. te pregunto: en la simulacion funciono?. al quemar el pic muestra errores?. si pretendes variar a diferentes velocidades te recomiendo que en ves de PWM utilices HPWM. esta instruccion permite que el micro haga varios trabajos mientras hpwm hace su trabajo. ha si me explicas que pretendes en cada linea con gusto te hare mi aporte.



arturouc dijo:


> 0-255
> 0-500
> saca una constante 255/500 (Nota:tambien puede ser 500/255)
> 255/500=0.51 ESTA ES TU CONSTANTE
> ...



GRAAACIAS PARCERISIMO JAJAJA.....

ME FUNCIONO EN LA SIMULACION ESO ES UN PASO GRANDE. POR AHORA QUIERO PREGUNTARTE: PORQUE LA INSTRUCCION PULSOUT Y PULSIN NO PRODUCEN NINGUN EFECTO EN EL PIC 12f683. ALMENOS EN LA SIMULACION NO MUESTRA NADA, ME SERSIORO CON EL OCSILOSCOPIO Y HUMMMM, PROBE CON OTROS MICROS Y SI FUNCIONA. HICE EL EJERCICIO CON UN 12f629 Y PULSOUT ME JENERA EN SIMULACION, EL PROGRAMA PRINCIPAL LO HICE EN UN 16f628A Y PERFECTAMENTE HACE LO QUE ESPERABA.
QUICIERA DE NUEVO ABUSAR DE TU CONOCIMIENTO PARA RESOLVER EL PROBLEMA QUE PRESENTA EL 12f683.

TE ESTOY SUPER AGRADESIDO....


----------



## lpnavy (Jun 16, 2011)

arturouc dijo:


> Ese micro solo tiene dos modulos CCP, yo he trabajado con pwm de manera independiente pero solo con 2 motores, hay otros micros que manejan mas modulos CCP
> 
> la instrucción que utilizarías es HPWM, con esta instrucción el micro puede realizar otras tareas
> 
> en este mismo curso hay varios ejemplos de como utilizar HPWM



Yo se como usar el HPWM la cuestion es q se me desborda el micro si ves el  el programa lo veerias mejor


----------



## arturouc (Jun 17, 2011)

lpnavy dijo:


> Yo se como usar el HPWM la cuestion es q se me desborda el micro si ves el  el programa lo veerias mejor



en el programa que subiste no estas utilizando la instruccion HPWM, estas haciendo PWM por software
por eso no puedes tener de manera independiente el PWM


```
la declaracion que tienes
DEFINE CCP1_REG PORTC 'Hpwm 1 pin port

DEFINE CCP1_BIT 2 'Hpwm 1 pin bit
                 ESTE ES EL CANAL 1
DEFINE CCP2_REG PORTC 'Hpwm 2 pin port

DEFINE CCP2_BIT 1 'Hpwm 2 pin bit                 ESTE ES EL CANAL 2
es correcta, pero utilizas la instruccion PWM
es lo que debes de cambiar por HPWM canal(1 o 2),vel(0-255), frecuencia
puedes tener solo dos instrucciones HPWM  solo necesitas caracterizar la entrada
analogica para que conviertas ese valor a un numero entre 0 y 255
POR EJEMPLO
if (B0>0) and (B0<5) THEN 

     VEL=10
     endif 

     if (B0>5) and (B0<10) THEN 

    VEL=30
     endif

     if (B0>10) and (B0<15) THEN

     VEL=60

     endif 

     IF (B0>15) AND (B0<20) THEN 

     VEL=100
     endif

     IF (B0>20) AND (B0<25) THEN 

     VEL=127
     endif

     IF (B0>25) AND (B0<28) THEN 

     VEL=160
     endif 

     IF (B0>28) AND (B0<30) THEN 

     VEL=200
     endif 

     if (B0>30) and (B0<32) then

     VEL=255

     endif
    
    HPWM 1,VEL, frecuencia

NOTA: te recomiendo cambiar los if pos CASE

HAY QUE HACER LO MISMO PARA EL OTRO CANAL
```

ESPERO TE SIRVA...


----------



## megatecpower (Jun 17, 2011)

como puedo hacer que un HPWM  de frecuencias menores de 100 Hz porque tienen un limite minimo de frec para un determinado pulso. La cuestion es que quiero un pulso con frecuencias mas bjas agradeceria su pronta respuesta gracias


----------



## demonjeff (Jun 17, 2011)

hola amigos ... bueno amigos soy estudiante de telecomunicaciones y bueno como la base de las telecomunicaciones es la electronica lleve los cursos pero solo lo basico y bueno uno de los cursos q me gusto fue el de uPic y bueno ahora estoy aprendiendo la programacion en el PBP y bueno necesito ayuda .. lo que pasa es que no c como programar un registro de desplazamiento, he visto en muchos foros y paginas de internet pero no encuento la programacion en basic asi que recurro a uds .. miren es simple el circuito y lo que quiero hacer.



la idea es hacer que los un led y luedo pase desde la primera posicion hasta la ultima ... espero que me entiendan y me puedan ayudar ... de antemano muchas gracias ... y fue algo genial que ayan habierto esta linea para aprender la programacion es PBP


----------



## javisan190 (Jun 17, 2011)

ola a todos alguien me podia me puede explicar como seprograma el codigo fuente para usb en pic18f2550 o los comandos de instrucciones para poder expirementar los pic 18f2550 pos usb. gracias


----------



## javisan190 (Jun 19, 2011)

ola a todos alguien tiene el manual de pic18f2550 de si pueden postearlo.


----------



## lubeck (Jun 19, 2011)

> ola a todos alguien tiene el manual de pic18f2550 de si pueden postearlo.





yo no entiendo  que es lo que necesitas...

esto?...
http://ww1.microchip.com/downloads/en/DeviceDoc/39632b.pdf

hay una diferencia entre Hola y ola,Hola-- Saludo, Ola--- algo asi como una onda que se forma en el mar..


----------



## cjefferson (Jun 19, 2011)

Saludos amigos como puedo hacer para ver punto flotante en una LCD, ejemplo temperatura 32.08 o voltaje 12.06 vol, gracias


----------



## lpena628 (Jun 21, 2011)

amigos tengo un problema necesito que un pic 16f877 identifique una trama de pulsos que son enviadas desde un sensor son 41 bits que contienen una cabecera que no cambia nunca que es 11011 con esto se puede identificar donde comienza la señal el protocolo de funcionamiento lo pueden ver en http://www.rd-1000.com/chpm78/lacrosse/Lacrosse_TX23_protocol.html hasta el momento he programado algo pero creo que es muy lento y no funcionara
espero puedan ayudarme 
gracias


----------



## lubeck (Jun 21, 2011)

> hasta el momento he programado algo pero creo que es muy lento y no funcionara



puedes subir lo que llevas???
---------------------------------
Utiliza las interrupciones y mide los tiempos entre ellas ... configura el flanco y no recuerdo que mas... pero asi se hace...


----------



## lpena628 (Jun 21, 2011)

gracias por responder mira el programa se trata de un sensor de viento que mide direccion y velocidad y envia la trama que postie anteriormente todo esto es mostrado en un lcd 16x2 solo tengo problemas con la identificacion me lo demas funciona super ademas me envia datos a un telefono que utilizo como modem


----------



## lubeck (Jun 21, 2011)

> solo tengo problemas con la identificacion



que te parece si nos concentramos en esto... según entiendo la comunicación con el anemómetro es bidireccional o sea que tienes que mandar un estado bajo en el puerto de la comunicación y no lo vi...
lo esta considerando????...

(recuerda que yo es la primer vez que veo tu código y quizás tu ya llevas meses asi que paciencia porfavor)


----------



## J2C (Jun 21, 2011)

Lpena628

Interpreto que el BUS en el estado Idle se encuentra en 1 siempre, cuando el Master (tu µControlador) lo pone a 0 durante 500 ms el Slave (Sensor de Velocidad y Dirección del Viento) envia un 1 y lo pone a 0 hasta que comienza la secuencia de los 41 bit's.

Creeria que la indicación de señal a trasmitir por el Slave comienza en el pulso de 1 que envia el mismo Slave, dando equis tiempo a que el µControlador se acomode para recibir el encabezado 11011 y el resto de la información. 


Saludos, JuanKa.-


----------



## lpena628 (Jun 21, 2011)

realmente no lo considere porque solo lo alimente y luego lo conecte a un osciloscopio y corrobore la trama de pulsos


----------



## lubeck (Jun 21, 2011)

> realmente no lo considere porque solo lo alimente y luego lo conecte a un osciloscopio y corrobore la trama de pulsos



Ok... como bien te comenta juanka tienes que poner en bajo durante 500ms el puerto, con eso le dices al dispositivo que le estas pidiendo informacion despues este te va amandar un pulso diciendo que esta listo para enviar y despues todo el protocolo asi que lo que tienes que hacer es estar cambiando el puerto...

es decir algo asi...

TrisB.0=0...
low portb.0
pause 500

TrisB.0=1..
a=portb.0

etc...

ademas te recomendaria que pusieras una resistencia pullup en ese puerto.....


----------



## javisan190 (Jun 21, 2011)

ola a todos espero me ayuden quiero hacer un conteo por un lcd de 0-100 con un ckto de un sensor de proximidad en este link esta http://www.pablin.com.ar/electron/circuito/varios/proximid/index.htm. conectarlo al pin 8 ( del integrado lm567) en el portb.0 con el pic16f84a y cuando llege a 100 vuelva ah contar de nuevo.


pulso var byte
a var byte
inicio:
count portb.0,1000,pulso
pulso=0
Lcdout $FE,1
Lcdout $FE,$82,"conteo:"
LcdOut $FE,$C5,dec pulso
a=pulso+1

GoTo Inicio 
End

al hacer esta programacion los numeros me salen aleatoriamente sin conectarlo al pin 8 del ckto


----------



## lubeck (Jun 21, 2011)

esto es lo que necesitas???


```
pulso var byte
a var byte
inicio:
count portb.0,1000,pulso
pulso=0
Lcdout $FE,1
Lcdout $FE,$82,"conteo:"
LcdOut $FE,$C5,dec pulso
a=pulso+1
[B]If a>=100 then a=0[/B]
GoTo Inicio
```


----------



## javisan190 (Jun 21, 2011)

hacer un conteo 0-100, y cuando llegen 100 vuelva contar de 0-100 mediante el ckto de que esta en el  http://www.pablin.com.ar/electron/ci...imid/index.htm


----------



## lubeck (Jun 21, 2011)

> al hacer esta programacion los numeros me salen aleatoriamente sin conectarlo al pin 8 del ckto



y si subes como hiciste el acoplamiento del cicuito con el pic...

creo que ya te voy entendiendo...


```
TrisB.0=1
pulso var portb.0
a      var byte
Flag  var bit
low flag
inicio:
Lcdout $FE,1
Lcdout $FE,$82,"conteo:"
LcdOut $FE,$C5,dec pulso
if pulso then
  if not flag then a=a+1
  high flag
else 
 low flag
endif

If a>=100 then a=0
GoTo Inicio
```

a ver si funciona... me lo avente a capela...


----------



## javisan190 (Jun 21, 2011)

gracias, voy ah probarlo


----------



## lpena628 (Jun 21, 2011)

LUBECK gracias por responder...ahora lo que necesito es reconoce los pulsos cuando me los envia el sensor por que me manejo poco con lo de los flancos


----------



## javisan190 (Jun 21, 2011)

en esto dias subo el el diagrama ademas decirte que es lo hace el ckto, consta con 2 led infrarojo cuando se bloquea automaticamente el led indicadora se apaga y con ese ckto unir un con el pic 16f84a por un lcd con un conteo.


----------



## lubeck (Jun 21, 2011)

> ahora lo que necesito es reconoce los pulsos cuando me los envia el sensor por que me manejo poco con lo de los flancos


mira es que necesitas manejar interrupciones en realidad es mas facil.... pero para ello es preferible o por lo menos yo necesito estarlo simulando... y yo lo hago en proteus,, tu utilizas algun simulador????



> en esto dias subo el el diagrama ademas decirte que es lo hace el ckto, consta con 2 led infrarojo cuando se bloquea automaticamente el led indicadora se apaga y con ese ckto unir un con el pic 16f84a por un lcd con un conteo.



sip.... ya me lo imagino....  prueba el codigo y me dices en que la regue y lo corregimos vale!


----------



## lpena628 (Jun 21, 2011)

te envio lo que tengo simulado


----------



## javisan190 (Jun 21, 2011)

gracias por la ayuda


----------



## lpena628 (Jun 21, 2011)

ahi esta la simulacion para que puedas ayudarme


----------



## lubeck (Jun 21, 2011)

Jaivisan190

oye ya vi un error.. bue... era de esperarse... 
donde dice:
LcdOut $FE,$C5,dec pulso
es
LcdOut $FE,$C5,dec a


----------



## javisan190 (Jun 21, 2011)

gracias ,ahora los numeros salen muy rapido jajjajajja


----------



## lubeck (Jun 21, 2011)

y asi...


```
TrisB.0=1
pulso var portb.0
a      var byte
Flag  var bit
low flag
inicio:
if pulso then
  if not flag then
   a=a+1
   Lcdout $FE,1
   Lcdout $FE,$82,"conteo:"
   LcdOut $FE,$C5,dec a
 endif

  high flag
else 
 low flag
endif

If a>=100 then a=0
GoTo Inicio
```

mmm como lo estas probando???


----------



## javisan190 (Jun 21, 2011)

lo estoy probando en ckto real


----------



## lubeck (Jun 21, 2011)

aaahhh ok...


```
TrisB.0=1
pulso var portb.0
a      var byte
Flag  var bit
low flag
inicio:
if [B]Not[/B] pulso then   ;------>> prueba asi
  if not flag then
   a=a+1
   Lcdout $FE,1
   Lcdout $FE,$82,"conteo:"
   LcdOut $FE,$C5,dec a
 endif

  high flag
else 
 low flag
endif

If a>=100 then a=0
GoTo Inicio
```

Javisan...

que paso funciono o no????


Lpena...

oye ya le estoy agarrando la onda.... nada mas confirmame la señal del anemometro si entra por el RB0 verdad????


----------



## lpena628 (Jun 22, 2011)

si entra por rb0 asi es mas facil  utilizar la interrupcion


----------



## atricio (Jun 22, 2011)

hola amigos buenos dias nose si me puedieran ayudar quiero controlar un brazo robot son motores DC de corriente pico de 1,2 A y en uso son de 200 mA como deberia aislar la salida para el microcontrolador hay un driver para motores de este tipo parecido a el L293D o no lo hay o como deberia realizar el control para que no se me resete el micro controlador he realizado un seguidor y por el arranque constante de los motores se me colgaba el micro.
que recomendaciones me daria para emprender mi proyecto alguien tiene algo de informacion sobre el tema les agradezco de antemano


----------



## lpena628 (Jun 22, 2011)

lubeck ayudame un poco con el tema de las interrupciones por favor...no se porque me cuestan utilizarlas


----------



## lubeck (Jun 22, 2011)

> no se porque me cuestan utilizarlas



mmm... mira estuve sacando el codigo del protocolo, pero tuve  otro trabajo que realizar si gustas investigar un poco por tu cuenta y de cualquier forma si te ayudo con eso del protocolo...


----------



## picaficionado (Jun 23, 2011)

atricio dijo:


> hola amigos buenos dias nose si me puedieran ayudar quiero controlar un brazo robot son motores DC de corriente pico de 1,2 A y en uso son de 200 mA como deberia aislar la salida para el microcontrolador hay un driver para motores de este tipo parecido a el L293D o no lo hay o como deberia realizar el control para que no se me resete el micro controlador he realizado un seguidor y por el arranque constante de los motores se me colgaba el micro.
> que recomendaciones me daria para emprender mi proyecto alguien tiene algo de informacion sobre el tema les agradezco de antemano



En la U tuve problemas con los motores DC y los PIC, y en algo solucione el problema, instalando condesadores de poliester 100 nanofaradios lo mas cerca posible entre las terminales de +5v y 0v del PIC; y entre las conexiones de alimentación del o los motores DC.


----------



## arturouc (Jun 23, 2011)

atricio dijo:


> hola amigos buenos dias nose si me puedieran ayudar quiero controlar un brazo robot son motores DC de corriente pico de 1,2 A y en uso son de 200 mA como deberia aislar la salida para el microcontrolador hay un driver para motores de este tipo parecido a el L293D o no lo hay o como deberia realizar el control para que no se me resete el micro controlador he realizado un seguidor y por el arranque constante de los motores se me colgaba el micro.
> que recomendaciones me daria para emprender mi proyecto alguien tiene algo de informacion sobre el tema les agradezco de antemano



Yo utilizo el L298N es un driver que te sirve para manejar 2 motores de CD de 2 Amps. y controlar el sentido de giro y tambien les puedes mandar PWM o puedes conectar las entradas y las salidas en paralelo y puedes manejar un motor de hasta 4 Amps
http://www.datasheetcatalog.org/datasheet/SGSThomsonMicroelectronics/mXxwur.pdf
en el datasheet estan los diagramas para conectarlo pag. 6 y 7
espero te sirva


----------



## atricio (Jun 24, 2011)

hola gracias por responder si he revisado un poco el driver L298N me podrias explicar un poquito como es eso de entradas y salidas en paralello porque creo que necesito usar un arreglo asi para los motores que requiero ojala me puedas ayudar


----------



## autotronico (Jun 25, 2011)

atricio te recomiendo que mires el puente H SN754410


----------



## mecatrodatos (Jun 26, 2011)

ya que estoy en vacaciones puedo seguir con mi labor les dejo el tomo uno del Libro Pic Basic Pro y en los otros donde me quede subire los PDF saludos.


----------



## atricio (Jun 26, 2011)

gracias por el aporte.... amigo autotronico gracias por la recomendacion pero segun mire el driver es hasta 1 amp y es casi la misma configuracion del L293D o me equivoco gracias amigo


----------



## arturouc (Jun 27, 2011)

atricio dijo:


> hola gracias por responder si he revisado un poco el driver L298N me podrias explicar un poquito como es eso de entradas y salidas en paralello porque creo que necesito usar un arreglo asi para los motores que requiero ojala me puedas ayudar



claro que si..mira
en la pag. 7 del datasheet del L298N vas a mirar una conexion donde los enables (pin 6 y 11) estan en paralelo (conectados), las entradas (pin 5 y 12) estan en paralelo, las entradas (pin 7 y 10) tambien estan en paralelo, las salidas (pin 2 y 14) que crees...en paralelo y las salidas (pin 3 y 13) tambien.    Esta conexion lo que hace es que puedas manejar mayor corriente en la salida, puedes utilizar motores de cd de hasta 4 amps.

en las salidas conectas el motor (con sus respectivos diodos de proteccion del circuito), los enables los puedes tener a +5v CD para que tu motor este habilitado y dependiendo de hacia donde quieres que gire el motor le puedes enviar PWN por una de las entradas

yo utilice este integrado para mover motores paso a paso bipolares y ahora lo estoy utilizando para mover servomotores de CD.... hasta la fecha no me ha reseteado el microcontrolador

espero te sirva...

NOTA: el L293 tambien lo puedes conectar en paralelo para aumentar su salida a 2 amps.



mecatrodatos dijo:


> ya que estoy en vacaciones puedo seguir con mi labor les dejo el tomo uno del Libro Pic Basic Pro y en los otros donde me quede subire los PDF saludos.



Que tal mecatrodatos gracias por el aporte ...
en la pag. 12 de este curso habias iniciado un tema sobre servomotores con encoder y empezabas a hablar de PID (27 de diciembre del 2009). podrias retomar el tema?


----------



## demonjeff (Jun 27, 2011)

Hola chicos .. Bueno tengo un problema al simular en proteus una matriz .. No se simula como otras matricez que he visto por aqui ... Haber si alguine lo revisa y me ayuda .... Gracias 
pd.:adjunto el programa con simu.


----------



## atricio (Jun 28, 2011)

muchas gracias mirare lo probare y les cuento


----------



## ferdy575 (Jun 29, 2011)

demonjeff dijo:


> Hola chicos .. Bueno tengo un problema al simular en proteus una matriz .. No se simula como otras matrices que he visto por aquí ... Haber si alguien lo revisa y me ayuda .... Gracias
> pd.:adjunto el programa con simu.


 
Hola estuve viendo tu matriz y encontré que tienes todos los displays conectados al reves, tienes que desconectarlos todos y girarlos 180º y volverlos a conectar tambien te falta conectar el mclr del pic a vcc, por fa revisa y me cuentas como te fue.


----------



## ivanchomao (Jun 30, 2011)

mecatrodatos dijo:


> *chapin*:  te dejo el proyecto de 38 khz con pwm.
> *ruse85* : tu programa esta bien mira el contraste del LCD con el potenciometro ubicado en el pic 3 del mismo o da mayor retardo al LCD para que muestre mensajes una ve utilices el comando $fe,1 que es el de limpiar Lcd y ubicar el primer carácter en la primera linea o al pic que estas utilizando la coneccion del MCLR a vdd con resistencia de 1k.
> *dabopeyton*: en el tutorial y manual de proton te respondo.
> *ivanchomao*: Te recomendaría el PIC de la sera 16f con entrada A/D puede ser le 16f628A, el pic 16f873A o el pic 16f877A por si los sensores de gas son analógicos.



Mecatrodatos: En días pasados me habías ayudado con este tema y me habías recomendado trabajar con PIC de la serie 16f. Te cuento que sigo con el proyecto, pero estudiando sobre el tema y revisando las fichas técnicas de los PIC, entiendo que ellos deben recibir señales con voltajes más altos (superiores a 2 voltios). Para esto he estado tratando de amplificar la señal del sensor con amplificadores operacionales 741 y 358. Las ultimas pruebas que hice con LM358 (Vcc de 5V) me da una salida de 3.66 voltios sin haber conectado el sensor, cuando conecto el sensor (sin hacer mediciones) la señal baja hasta 2 voltios aproximadamente y empieza a oscilar mucho (desde 1.7 hasta 2.2 aprox.).

Te agradezco si me puedes orientar sobre si lo que estoy haciendo esta bien y si es asi como puedo evitar la oscilación de voltaje a la salida del amplificador... o que otras recomendaciones puedes darme. Agradezco enormemente la ayuda con este tema. Gracias.


----------



## ferdy575 (Jul 3, 2011)

Hola a todos estoy haciendo un trabajo donde tenemos 2 compresores, ambos funcionan al mismo tiempo y cada uno tiene su respectivo presostato que lo apaga cuando esta cargado, uno de ellos tiene motor trifásico de 3 HP con encendido normal y el otro tiene un motor trifásico de 8 HP con encendido inicial en Y y luego se pasa a delta todo esto se está haciendo manualmente con cuchillas, quise automatizar y que el circuito además tenga la función de guardamotor verificando que siempre estén las 3 fases, escribí un código que debería funcionar pero no lo hace por favor alguien que me lo revise a ver que me quedo mal.
De antemano les agradezco su ayuda.


----------



## lpnavy (Jul 4, 2011)

hola a todos!! ando haciendo un sistema de control usando el sensor de temperatura MCP9700a ya que segun entiendo es identico a LM35, pero a la hora de simular en proteus el MCP9700a no me arroja los valores reales en lcd. ejemplo el sensor esta en 30º Cº  y en lcd sale 78º, ademas la logica de programacion no deberia cambiar ya que el LM35 y el MCP9700 su resolucion es de 1ºC por cada 10mV y estoy usando 8 bit de resolucion. les dejo un fragmento donde estoy haciendo la conversion

sensor var byte
tempera var byte
adcon1=0

inicio:
adcin 0, sensor
tempera=2*sensor
LCDOUT $FE,2,"TEMPERATURA:",dec tempera,"C"
goto inicio


----------



## atricio (Jul 4, 2011)

amigos he tenido problemas al querer hacer funcionar el L298N tiene unas resistencias y otros elementos adicionales que no entiendo para que son ojala me pudieran ayudar por favor para poderlo manejar gracias de antemano


----------



## mecatrodatos (Jul 4, 2011)

lpnavy dijo:


> hola a todos!! ando haciendo un sistema de control usando el sensor de temperatura MCP9700a ya que segun entiendo es identico a LM35, pero a la hora de simular en proteus el MCP9700a no me arroja los valores reales en lcd. ejemplo el sensor esta en 30º Cº y en lcd sale 78º, ademas la logica de programacion no deberia cambiar ya que el LM35 y el MCP9700 su resolucion es de 1ºC por cada 10mV y estoy usando 8 bit de resolucion. les dejo un fragmento donde estoy haciendo la conversion
> 
> sensor var byte
> tempera var byte
> ...


 
Aqui te dejo un ejemplo

*Atricio*: mira la imagen anexa dc motor


----------



## lpnavy (Jul 5, 2011)

gracias mecatrodatos, probare ese factor de conversion en mi codigo a ver que tal me sale.


----------



## Nano24 (Jul 8, 2011)

mecatrodatos dijo:


> Aqui te dejo un ejemplo
> 
> *Atricio*: mira la imagen anexa dc motor



Hola mecatrodatos, quería comentarte que use el generador de 38Khz directo desde el PIC justo como me habías aconsejado hace tiempo, pero la cuestión es que programe un robot que envía el tren de pulsos de esta manera:

TRISB=%11110110   'B.3= salida PWM , B.1&2= pulsadores
PR2=25                  'Setleccionar PWM a 38KHz
CCPR1L=13            'Seleccionar ciclo util de PWM a 50% 
CCP1CON=%00001100    'modo de seleccion  PWM?ON/OFF
T2CON=%00000100        'Timer2 ON + 1:1 prescale

Los sensores cuando captan la señal a 38Khz ellos caen a 0V y cuando no hay señal están a 5V, lo digo porque ya medí con el tester, bueno cuando le coloco el LED infrarrojo que esta conectado al PIC no pasa nada, no capta la emisión infrarroja que esta enviando el microcontrolador, ¿que podría estar pasando? no entiendo amigo, todo lo que quiero hacer es que cuando uno de los sensores cae a 0V haga una función es todo.



			
				Nano24 dijo:
			
		

> Hola mecatrodatos, quería comentarte que use el generador de 38Khz directo desde el PIC justo como me habías aconsejado hace tiempo, pero la cuestión es que programe un robot que envía el tren de pulsos de esta manera:
> 
> TRISB=%11110110   'B.3= salida PWM , B.1&2= pulsadores
> PR2=25                  'Setleccionar PWM a 38KHz
> ...




Esta es la programacion que estoy usando para el robot evita obstaculos mejorado

;*******************************************************************************
DEFINE OSC 4
DEFINE LCD_DREG PORTD 
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD 
DEFINE LCD_RSBIT 2 
DEFINE LCD_EREG PORTD 
DEFINE LCD_EBIT 3 
DEFINE ADC_BITS 8 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50 
define LOADER_USER 1
;*******************************************************************************
TRISC.2 = 0  
PR2 = 25   
CCPR1L = 13 
CCP1CON = %00001100  
T2CON = %00000100
;*******************************************************************************
TRISB=%00011111
PORTB.5=0ORTB.6=0ORTB.7=0
TRISD=%00000011
PORTD=0
;*******************************************************************************
LED_DERECHO VAR PORTB.5
LED_CENTRAL VAR PORTB.6
LED_IZQUIERDO VAR PORTB.7
LED_DERECHO=0
LED_CENTRAL=0
LED_IZQUIERDO=0
PITIDO VAR PORTC.1
PITIDO=0
BOTON_1 VAR PORTD.0
BOTON_2 VAR PORTD.1
;*******************************************************************************
SENSOR_DERECHO VAR PORTB.0
SENSOR_DERECHO_LATERAL VAR PORTB.1
SENSOR_IZQUIERDO VAR PORTB.2
SENSOR_IZQUIERDO_LATERAL VAR PORTB.3
;*******************************************************************************
MOTOR_DERECHO_A VAR PORTC.4
MOTOR_DERECHO_B VAR PORTC.5
MOTOR_IZQUIERDO_A VAR PORTC.6
MOTOR_IZQUIERDO_B VAR PORTC.7
;*******************************************************************************
ACTIVAR CON 1
DESACTIVAR CON 0
SI CON 1
NO CON 0
Res var word
Voltaje_total var word
PULSOS_1 var word
Volts1 var word
Volts2 var word
Conv1  con 19
Conv2  con 53
POSICION_1 var byte
POSICION_1=$CF
POSICION_2 VAR BYTE
POSICION_2=$80
lcdout $fe,1
pause 200
GOTO BUCLE_INICIO
PAUSA_1:
HIGH PITIDO
PAUSE 150
LOW PITIDO
PAUSE 150
GOTO BUCLE_INICIO
;*******************************************************************************
BUCLE_INICIO:
lcdout $fe,1
IF BOTON_1=1 THEN GOSUB MEDIR_CARGA
IF BOTON_2=1 THEN GOSUB MEDIR_CARGA
PULSIN SENSOR_DERECHO,1500,PULSOS_1
IF PULSOS_1>100 THEN 
gosub INICIANDO_PROGRAMA
ELSE
LCDOUT $FE,2,"ROBOT EN ESPERA"
ENDIF
pause 2000
GOTO BUCLE_INICIO
;*******************************************************************************
INICIANDO_PROGRAMA:
LED_DERECHO=ACTIVAR:LED_CENTRAL=DESACTIVAR:LED_IZQUIERDO=ACTIVARITIDO=ACTIVAR
PAUSE 200
LED_DERECHO=DESACTIVAR:LED_CENTRAL=ACTIVAR:LED_IZQUIERDO=DESACTIVARITIDO=DESACTIVAR
PAUSE 300
LED_DERECHO=DESACTIVAR:LED_CENTRAL=ACTIVAR:LED_IZQUIERDO=ACTIVARITIDO=ACTIVAR
PAUSE 200
LED_DERECHO=ACTIVAR:LED_CENTRAL=ACTIVAR:LED_IZQUIERDO=DESACTIVARITIDO=DESACTIVAR
PAUSE 300
LED_DERECHO=DESACTIVAR:LED_CENTRAL=ACTIVAR:LED_IZQUIERDO=DESACTIVARITIDO=ACTIVAR
PAUSE 200
LED_DERECHO=DESACTIVAR:LED_CENTRAL=DESACTIVAR:LED_IZQUIERDO=ACTIVARITIDO=DESACTIVAR
PAUSE 300
LED_DERECHO=ACTIVAR:LED_CENTRAL=DESACTIVAR:LED_IZQUIERDO=ACTIVARITIDO=ACTIVAR
PAUSE 200
LED_DERECHO=DESACTIVAR:LED_CENTRAL=DESACTIVAR:LED_IZQUIERDO=DESACTIVARITIDO=DESACTIVAR
PAUSE 300
GOTO BLOQUE_PRINCIPAL
;*******************************************************************************
BLOQUE_PRINCIPAL:
PULSIN SENSOR_DERECHO,1500,PULSOS_1
IF PULSOS_1>100 THEN 
gosub PAUSA_1
ELSE
GOSUB LOGICA_CONTROL:GOSUB MEDIR_CARGA
PAUSE 100
endif
GOTO BLOQUE_PRINCIPAL
;*******************************************************************************
LOGICA_CONTROL:
if sensor_derecho=1 and sensor_derecho_lateral=1 and sensor_izquierdo=1 and sensor_izquierdo_lateral=1 then gosub MARCHAR
IF SENSOR_DERECHO=0 AND SENSOR_DERECHO_LATERAL=1 AND sensor_izquierdo=1 and sensor_izquierdo_lateral=1 then gosub IZQUIERDA
IF SENSOR_DERECHO=1 AND SENSOR_DERECHO_LATERAL=1 AND sensor_izquierdo=0 and sensor_izquierdo_lateral=1 then gosub DERECHA
IF SENSOR_DERECHO=1 AND SENSOR_DERECHO_LATERAL=0 AND sensor_izquierdo=1 and sensor_izquierdo_lateral=1 then gosub DERECHA
IF SENSOR_DERECHO=0 AND SENSOR_DERECHO_LATERAL=0 AND sensor_izquierdo=1 and sensor_izquierdo_lateral=1 then gosub IZQUIERDA
if sensor_derecho=1 and sensor_derecho_lateral=1 and sensor_izquierdo=0 and sensor_izquierdo_lateral=0 then gosub DERECHA
if sensor_derecho=0 and sensor_derecho_lateral=1 and sensor_izquierdo=0 and sensor_izquierdo_lateral=1 then gosub RETROCEDER
if sensor_derecho=0 and sensor_derecho_lateral=0 and sensor_izquierdo=0 and sensor_izquierdo_lateral=0 then gosub TESTEAR_ZONA
if sensor_derecho=1 and sensor_derecho_lateral=0 and sensor_izquierdo=1 and sensor_izquierdo_lateral=0 then gosub MARCHAR
RETURN
;*******************************************************************************
MEDIR_CARGA:
LCDOUT $FE,$40,$E,$1B,$1F,$1F,$1F,$1F,$1F,$1F
LCDOUT $FE,$48,$E,$1B,$11,$11,$1F,$1F,$1F,$1F
LCDOUT $FE,$50,$E,$1B,$11,$19,$15,$13,$1F,$1F
ADCIN 0, Res 
Volts1 = Res * Conv1 
Volts2 = Res * Conv2 
Volts2 = Volts2 / 100
voltaje_total = Volts1 + Volts2 
if voltaje_total => 4000 THEN GOSUB FULL_CARGA
if voltaje_total <  3900 and voltaje_total > 3500 THEN GOSUB CARGA_MEDIA
if voltaje_total <  3500 THEN GOSUB BATERIA_BAJA
return
;*******************************************************************************
FULL_CARGA:
LCDOUT $FE,1
LCDOUT $FE,POSICION_1,0:lcdout $fe,$c0,"V =",DEC voltaje_total," mV"
return
;*******************************************************************************
CARGA_MEDIA:
LCDOUT $FE,1
LCDOUT $FE,POSICION_1,1:lcdout $fe,$c0,"V =",DEC voltaje_total," mV"
return
;*******************************************************************************
BATERIA_BAJA:
LCDOUT $FE,1                                                        
LCDOUT $FE,POSICION_1,2:lcdout $fe,$c0,"V =",DEC voltaje_total," mV"
RETURN
;*******************************************************************************
MARCHAR:
MOTOR_DERECHO_A=NO:MOTOR_DERECHO_B=SI:MOTOR_IZQUIERDO_A=NO:MOTOR_IZQUIERDO_B=SI
RETURN
;*******************************************************************************
RETROCEDER:
MOTOR_DERECHO_A=SI:MOTOR_DERECHO_B=NO:MOTOR_IZQUIERDO_A=SI:MOTOR_IZQUIERDO_B=NO
PAUSE 800
MOTOR_DERECHO_A=SI:MOTOR_DERECHO_B=NO:MOTOR_IZQUIERDO_A=NO:MOTOR_IZQUIERDO_B=SI
PAUSE 800
RETURN
;*******************************************************************************
IZQUIERDA:
MOTOR_DERECHO_A=SI:MOTOR_DERECHO_B=NO:MOTOR_IZQUIERDO_A=NO:MOTOR_IZQUIERDO_B=SI
PAUSE 800
RETURN
;*******************************************************************************
DERECHA:
MOTOR_DERECHO_A=NO:MOTOR_DERECHO_B=SI:MOTOR_IZQUIERDO_A=SI:MOTOR_IZQUIERDO_B=NO
PAUSE 800
RETURN
;*******************************************************************************
TESTEAR_ZONA:
if sensor_derecho=0 and sensor_derecho_lateral=0 and sensor_izquierdo=0 and sensor_izquierdo_lateral=0 then
MOTOR_DERECHO_A=NO:MOTOR_DERECHO_B=SI:MOTOR_IZQUIERDO_A=SI:MOTOR_IZQUIERDO_B=NO
PAUSE 800
else
goto BLOQUE_PRINCIPAL
endif
END


----------



## ferdy575 (Jul 9, 2011)

hola, quisiera saber sí en basic pbp existe una función que haga repetir de forma obligada e infinita el programa así como en C lo hace la función: "while(TRUE) { } //loop forever", por favor alguien que me ayude gracias de antemano


----------



## guigo (Jul 9, 2011)

ferdy575 dijo:


> hola, quisiera saber sí en basic pbp existe una función que haga repetir de forma obligada e infinita el programa así como en C lo hace la función: "while(TRUE) { } //loop forever", por favor alguien que me ayude gracias de antemano



pues si lo que petendes es hacer que tu programa cuando llegue a la utima linea vuelva al inicio del prgrama pues muy sencillo: goto etiqueta

EJEMPLO

inicio:      'etiqueta de inico

portb.0 = 1   ' prende por 1 segundo el pin 0 del puerto B
pause 1000
portb.0 = 0   ' apaga por 1 segundo el pin 0 del puerto B
pause 1000


goto inicio    ' vuelve a la etiqueta inicio

end             ' fin

este ejemplo prende y apaga un led indefinidamente hasta que el micro sufra un reset o se apague o se reinicie. espero que esto sea lo que necesites. si no es lo que necesitas explica con mas detalle y si puedo aydar con gusto lo hare.


----------



## ferdy575 (Jul 10, 2011)

guigo dijo:


> pues si lo que pretendes es hacer que tu programa cuando llegue a la utima linea vuelva al inicio del programa pues muy sencillo: goto etiqueta
> 
> EJEMPLO
> 
> ...


 

si tienes razón esto lo se bien, pero tengo un proyectito donde el pic no se actualiza no se por que motivo, sí quiero que actualice debo resetearlo para que vuelva a empezar el programa como sí el "goto main" no estuviera funcionando, y estuviera haciendo solo una lectura del programa y no volviera a empezar, te pongo una copia del código para que lo veas y sí puedes me ayudes a corregir lo que este mal o lo que me haya faltado te agradezco tu ayuda...

@ DEVICE pic16F877A, WDT_ON ;Watchdog Timer ON conectado
@ DEVICE pic16F877A, PWRT_ON ;Power-On Timer conectado
@ DEVICE pic16F877A, BOD_ON ;Brown-Out Detect conectado 
@ DEVICE pic16F877A, LVP_OFF ;Bajo voltaje de programación desconectado
@ DEVICE pic16F877A, CPD_OFF ;Protección del código de memoria OFF
@ DEVICE pic16F877A, PROTECT_OFF ;protección de código OFF
@ device xt_osc ;oscilador externo XT
DEFINE osc 20 ;cristal de 20MHz
AdcOn1=7 ;todos los puertos serán digitales

trisb = %00000000
trisc = %00000000
trisd = %11111111

SYMBOL fase1 = PORTD.0
SYMBOL fase2 = PORTD.1
SYMBOL fase3 = PORTD.2
SYMBOL psi1 = PORTD.3
SYMBOL psi2 = PORTD.4
SYMBOL motor_1 = PORTC.0
SYMBOL motor_2_Y = PORTC.1
SYMBOL motor_2_delta = PORTC.2

'' Define registros y bits del LCD 
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5 
LCDOUT $FE, 1 


main:
IF fase1 = 1 AND fase2 = 1 AND fase3 = 1 THEN
GOSUB normal
ELSE
GOSUB falla_electrica
ENDIF
GOTO main


normal:
GOSUB mensaje1
IF PSI1 = 1 THEN motor_1 = 1
IF PSI1 = 0 THEN motor_1 = 0 
IF PSI2 = 1 THEN encender_motor2
IF psi2 = 0 THEN apagar_motor2
RETURN

falla_electrica:
GOSUB mensaje2
motor_1 = 0
motor_2_Y = 0
motor_2_delta = 0
RETURN

encender_motor2:
motor_2_Y = 1
motor_2_delta = 0
pause 10000
motor_2_Y = 0
motor_2_delta = 1
stop
return

apagar_motor2:
motor_2_Y = 0
motor_2_delta = 0
return

mensaje1:
LCDOUT $FE,$81, "Funcionamiento" ;mensaje en la primera linea
LCDOUT $FE,$c5, "Normal" ;mensaje en la segunda linea
return

mensaje2:
LCDOUT $FE,$81, "ERROR" ;mensaje en la primera linea
LCDOUT $FE,$c1, "FALLA ELECTRICA" ;mensaje en la segunda linea
return

end

Se supone que el pic debe verificar la presencia de las 3 fases del circuito eléctrico de un taller, sí llegara a faltar alguna debe parar los motores para que no se averíen y debe dar el informe en un lcd 2x16.


----------



## demonjeff (Jul 12, 2011)

hola amigos nuevamente recurro a uds. y sus conocimientos en pbp, bueno esta vez tengo problema para poner una variable como tiempo, bueno lo que estoy haciendo es contar los pulsos en el pin porta.2  el resultado multiplicarlo por 2 y este tomarlo como tiempo, algo asi ... sorry si hay error en el ejemplo perorecien comienzo a entender este tipo de programacion.

pulsos var byte
tiem var byte

inicio:
    count porta.2,1000,pulsos
    tiem= pulsos * 2

    portb=%0000011
    pause ----> aqui quiero poner "tiem"

    portb=%1111111
    pause ----> aqui quiero poner "tiem"

    portb=%0000011
    pause ----> aqui quiero poner "tiem"
    .
    .    
    .
end

cuando pongo 
pause tiem ... me sale error al compilar

espero que acudan en mi ayuda .....de antemano gracias
atte. Jeff A. L.


----------



## lpena628 (Jul 16, 2011)

demonjeff que tal si haces una subrutina con la pausa y luego la llamas cuando la necesites algo asi

pulsos var byte
tiem var byte

inicio:
count porta.2,1000,pulsos

portb=%0000011
gosub tiempo

portb=%1111111
gosub tiempo

portb=%0000011
gosub tiempo

tiempo:
tiem= pulsos * 2 
.
end

amigos del foro vuelvo con una duda, necesito identificar los pulsos provenientes de un sensor digital, lo primero es identificar una cabecera compuesta con 11011 y luego de eso me envia una trama de 40 bits lo que necesito es almacenar cada uno de los bits en un vector para luego utilizarlos en el programa.


----------



## ferdy575 (Jul 23, 2011)

Lastima parece que todos se olvidaron de este foro ya nadie viene por aquí....


----------



## atricio (Jul 28, 2011)

la verdad parece que si creo que todos andan muy ocupados o se aburrieron de los micros cosa la cual no creo pero bueno si puedo ayudar en algo aqui ando pero sin mas alguien puede dicirme como hacer una comuniacion I2C


----------



## picaficionado (Jul 30, 2011)

El documento adjunto te puede ayudar.


----------



## atricio (Jul 30, 2011)

muchas gracias lo chequeo y preguntare cualquier cosa le molestare de nuevo


----------



## javisan190 (Jul 30, 2011)

ola a todos alguien me puede ayudar de como hacer q se conecte de pc a pic 18f2550 q sea inalambrico para poder controlar  un carrito  por visual basic. agradesco su ayuda.


----------



## lubeck (Jul 31, 2011)

javisan190 dijo:


> Hola a todos alguien me puede ayudar de como hacer que se conecte de pc a pic 18f2550 que sea inalambrico para poder controlar  un carrito  por visual basic. agradezco su ayuda.



Que opinas si mejor aprendes a escribir????, es mas facil....


----------



## atricio (Jul 31, 2011)

lubeck dijo:


> Que opinas si mejor aprendes a escribir????, es mas facil....



pues creo que si pero deberias definir que quieres hacer y como por usb por serial y enviarlo por radio frecuencia o algo asi creo que si quieres que te ayuden primero deberias definir tus espectativas y para que los capos del foro te pudan dar una ayuda


----------



## nicolas (Ago 2, 2011)

chicos necesito ayuda... no se mucho de programacion pero algo he entendido... la cuestion es que me baje un tacometro de aca... la idea mia es hacerlo para mi fiat600... la idea es mostrar un mensaje de bienvenida y luego mostrar las rpm del motor... la señal seria tomada del negativo de la bobina osea los platinos... 

De esta manera al tener 4 pulsos realiza una vuelta el motor... la idea es ver como puedo hacer para tomar el pulso del platino y tambien como se podria agregar 1 o 2 sensores de temperatura uno interior y otro exterior... les mando los archivos.. espero su ayuda gracias....

La señal de temperatura es tomada desde un bulbo de temperatura electrico...


----------



## lubeck (Ago 2, 2011)

> la idea es ver como puedo hacer para tomar el pulso del platino



Usese bajo su propio riesgo... (no lo he probado)






> tambien como se podria agregar 1 o 2 sensores de temperatura uno interior y otro exterior...



necesitas un conversor Analogo a digital y especificar el tipo de sensor que puedes conseguir y que caracteristicas tiene el bulbo y donde va cada uno... o saco mi Adivinoscopio USB

-Ve la funcion *Pot* ( por RC no es muy preciso)
-Busca conversores Analogo Digital como el ADC0800....
-Cambia de Pic del 628 al 877 (el 877 tiene modulos de conversores AD o a algun otro que tenga)


----------



## CHR (Ago 3, 2011)

Puedes Guiarte en estos proyectos CEKIT..tacometro para auto, esta en la pagina 62
http://www.4shared.com/file/q8E-qLmo/cekit_-_Electronica_Digital_y_.html


----------



## lubeck (Ago 3, 2011)

CHR dijo:


> Puedes Guiarte en estos proyectos CEKIT..tacometro para auto, esta en la pagina 62
> http://www.4shared.com/file/q8E-qLmo/cekit_-_Electronica_Digital_y_.html



 a mi me pide contraseña


----------



## nicolas (Ago 3, 2011)

yo tengo el archi y leyendo un poco veo que lo puedo utilizar... el tema es que segun mi entender deberia cambiar el diodo zener de 9.1 a 5.1 voltios para adaptarlo al pic... 

la otra consulta es si yo pondria un encendido transistorizado como el que sale aca en el foro
https://www.forosdeelectronica.com/f28/encendido-transistorizado-automovil-36489/index3.html

de donde podria tomar la señal para meterla al generador de pulsos?? o hay algun lugar para tomar la señal y mandarla directamente al pic??? muchas gracias...


----------



## ferdy575 (Ago 3, 2011)

hola muchachos, quisiera saber sí se puede implementar un voltímetro LCD DE 0 A 15V con un pic chico como el16f628a para ponérselo a mi fuente que es muy chica y el 16f877a ocupa mucho espacio


----------



## javisan190 (Ago 3, 2011)

hola amigos de foro necesito que  me oriente sobre visual basic con 3 botones adelante, derecha, y izquierda para comunicar por usb el 18f2550 con un carrito de 2 motores que gira a la izquierda y a la derecha , ambos motores van hacia adelante.

el codigo del pic es :


' include the HID descriptor
include	"DESCUSBProject.bas"

DEFINE OSC 12
DEFINE LOADER_USED 1

USBBufferSizeMax   con 8  ' maximum buffer size
USBBufferSizeTX    con 8  ' input
USBBufferSizeRX    con 8  ' output

' the USB buffer...
USBBuffer        Var Byte[USBBufferSizeMax] 
USBBufferCount   Var Byte 


 TRISB = 0
' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBService every couple  *
' * of milliseconds or so...                                 *
' ************************************************************
usbinit ' initialise USB...

 Inicio:

   gosub DoUSBIn 

   PORTB = USBBuffer[7]

 goto Inicio  

' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
   USBBufferCount = USBBufferSizeRX              ' RX buffer size
   USBService                                    ' keep connection alive
   USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   ' read data, if available
   return

agradesco la ayuda


----------



## czapatasv (Ago 3, 2011)

*EJEMPLO DE LECTURA ANALOG-DIGITAL 10 BITS USUANDO 16F690*
Saludos colegas de microcontroladores, para mi es un placer poder compartir este codigo mediante el 16F690 que integra conversion A/D y se muestra en LCD, tomando como referencia un voltaje de +5V y con resolucion de 4.9mv por paso (1023 pasos en total), a nivel practico lo utilize mediante puerto USB que me entrego segun tester 4.67V por tanto a nivel real tuve que cambiar la escala a 4.5mv obteniendo apenas un error entre el multimetro y el pic de 4mv, pero puedo vivir con eso, a continuacion el codigo usando los registros de este  PIC. Muestra dos decimales en pantalla

@ device  pic16F690, intrc_osc_noclkout
DEFINE OSC 4            ' SE DEFINE 4MHz OSCILATOR
' CONFIGURACION PUERTOS LCD
Define LCD_DREG   PORTC
Define LCD_DBIT   4
Define LCD_RSREG  PORTC
Define LCD_RSBIT  2
Define LCD_EREG   PORTC
Define LCD_EBIT   3
DEFINE LCD_LINES2                 ; define utilizar 2 lineas del LCD
DEFINE LCD_COMMANDUS 2000  ; define retardo en microseg entre envio comandos al LCD
DEFINE LCD_DATAUS 50            ; define el delay en miliseg entre enviar datos

DATADC  VAR WORD        ' VARIABLE A GUARDAR DATO DE CONVERSION
TEMPO   VAR WORD
' Parametros para configurar el ADC del PIC
ANSEL = 4              ' ANS6 Y ANS7 DIGITAL I/O, ANS2 ANALOG INPUT
ANSELH = 0            ' ANS8 - ANS11 COMO DIGITAL I/O
TRISA = 4              ' AN2 ENTRADA
TRISC = 0              ' RESTO PINES SALIDA
ADCON0 = %10001001      ' RIGHT JUSTIFIED, VCFG=VDD, ADON ENABLE, CHANNEL AN2
ADCON1 = %00110000      ' Frc CONVERSION CLOCK
PAUSE 300

INICIO:
ADCON0.1=1              ' INICIA CONVERSION

PROCESO:
PAUSE 5
IF ADCON0.1=1 THEN PROCESO     ' VERIFICA SI TERMINO CONVERSION

DATADC.HIGHBYTE = ADRESH
DATADC.LOWBYTE = ADRESL         ' DATADC es el valor de 10 bits de la conversion
TEMPO = (DATADC*49/1000)

LCDOUT $FE,1
LCDOUT "Dato:",DEC DATADC," ",DEC (TEMPO/10),".",DEC (DATADC*49) DIG 3,dec (DATADC*49) DIG 2,"v"
LCDOUT $FE,$C0 : LCDOUT "ANALOG-DIG 10BITS"
PAUSE 500
GOTO INICIO
END


----------



## Nano24 (Ago 3, 2011)

javisan190 dijo:


> hola amigos de foro necesito que  me oriente sobre visual basic con 3 botones adelante, derecha, y izquierda para comunicar por usb el 18f2550 con un carrito de 2 motores que gira a la izquierda y a la derecha , ambos motores van hacia adelante.
> 
> el codigo del pic es :
> 
> ...



Seria bueno si definieras que significa cada una de las lineas de programacion, e buscado referente a estos temas en la web y no e encontrado hasta ahora algun tutorial que me explique como crear un programa para establecer comunicacion del pic via usb, aunque les digo algo es mucho mas pero mucho mucho mas facil comunicar el PIC por el COM1.


----------



## lubeck (Ago 3, 2011)

ferdy575 dijo:


> hola muchachos, quisiera saber sí se puede implementar un voltímetro LCD DE 0 A 15V con un pic chico como el16f628a para ponérselo a mi fuente que es muy chica y el 16f877a ocupa mucho espacio



el 628a No tiene conversor Analogo a Digital..... las entradas analogas que tiene son para los modulos de Comparadores(son amplificadores operacionales configurados como comparadores)... cualquier cosa que hagas ocupara mas espacio que si usas un 877a


----------



## ferdy575 (Ago 3, 2011)

lubeck dijo:


> el 628a No tiene conversor Analogo a Digital..... las entradas analogas que tiene son para los modulos de Comparadores(son amplificadores operacionales configurados como comparadores)... cualquier cosa que hagas ocupara mas espacio que si usas un 877a


 
Gracias por tu respuesta, y el 873a no serviria? es más chico que el 877a


----------



## lubeck (Ago 3, 2011)

ferdy575 dijo:


> Gracias por tu respuesta, y el 873a no serviria? es más chico que el 877a


sip. ese si tiene 5 canales de 10 bits o el 876A


----------



## torres.electronico (Ago 4, 2011)

nicolas dijo:


> chicos necesito ayuda... no se mucho de programacion pero algo he entendido... la cuestion es que me baje un tacometro de aca... la idea mia es hacerlo para mi fiat600... la idea es mostrar un mensaje de bienvenida y luego mostrar las rpm del motor... la señal seria tomada del negativo de la bobina osea los platinos...De esta manera al tener 4 pulsos realiza una vuelta el motor... la idea es ver como puedo hacer para tomar el pulso del platino


Esta parte es sencilla, ya que con un capacitor de 10nf, una resistencia de 100 Ohms 1w y un zener de 5.1v 1/2w la entrada queda protegida y el microinterpreta perfectamente a señal...
Lo que si, te recomiendo que modifiques el modo en quecontas los pulsos...mira:

_*count portb.0, 125, revo
       revo= (revo / 4)/2 * 240
LCDout $FE,1
lcdout $FE,$c0,"RPM=",dec revo*_

Te anexo un proyecto mio, que esta en su 3er fase beta...
Arranque con un simple tacometro que funciono de 10, despues le sume un controlador de largada, shift light y corte por altas revoluciones, y al dia de hoy, ya le sume mas cosas como control / emulacion de señal de zonda lambda par engordar un poco mas la mezcla...
Quedo en un 90% satisfactorio, pero ahora quiero modificarlo para que esta señal que le miento a la ecu, sea proporcional su aumento y decremento, segun rpm... Me quedo chico el 877a, asi que voy a ver como hagopara sumarle todo... en fin, ahi te paso el pcb y el hex para que juegues con fitito
Respecto al sensor de temperatura, no son lineales por lo general, por lo tanto, si necesitas algo con presicion, tenes que implementar algoritmos, por ende, olvidate de un 16fxxx
Ahora, si es algo aproximado, toma los valores de la resistencia segun diferentes temperturas y arma un tabla... yo me volvi loco tratando de inventar unos numeros locos jajaja...

quiero sumar un par de fotos, pero excede lo limites


----------



## nicolas (Ago 4, 2011)

muy buena tu respuesta...... como tendria que conectar el capacitor la resistencia y el zener??? y otra cosa... podria medir la temperatura interior del auto con un lm35??? si es asi como sumo la programacion para que vea esta temperatura al presionar un pulsador???


----------



## lubeck (Ago 4, 2011)

> podria medir la temperatura interior del auto con un lm35???



Si, si puedes... bueno el lm35 si puede...


----------



## torres.electronico (Ago 4, 2011)

seria bueno saber, que tipo de temperatura queres sensar, por que yo estaba suponiendo que querias ver la delmotor.... si la del motor, el lm35 no sirve, salvo que te sirva superficie de blok y que implementes un amplificador operacional, para filtrar ruidos... Ahora, si es tempertura exterior, ese te queda como anillo al dedo...ahi te anexo el diagrama de como adaptar tu entrada del micro, mas unas fotos...
Saludos


----------



## Nano24 (Ago 4, 2011)

lubeck dijo:


> Si, si puedes... bueno el lm35 si puede...




Hola lubeck, te quería preguntar si sabes de alguna pagina para investigar acerca de establecer comunicaciones vía USB en lenguaje Picbasic? me baje uno pero no estaba explicado del todo y pues quería saber si hay alguno con el cual se aprenda de manera precisa y se entienda.


----------



## lubeck (Ago 4, 2011)

Mira todo lo que necesite para aprende a usar el USB esta _aqui_

necesitas el microcodestudio y el Easy HID (tambien en el microcode aparece)...

si tienes dudas comenta...


----------



## Nano24 (Ago 4, 2011)

lubeck dijo:


> Mira todo lo que necesite para aprende a usar el USB esta _aqui_
> 
> necesitas el microcodestudio y el Easy HID (tambien en el microcode aparece)...
> 
> si tienes dudas comenta...



Gracias por los links Lubeck, me pondre a chequear y practicar para aprender a establecer comunicaciones de PC a PIC via USB


----------



## norman sanchez (Ago 5, 2011)

Hola mecatrodatos hace un tiempo que vengo con un contador de 0-99 con un pulsador que incremente mi problema es que cuando las unidades llegan a 9 las decenas prenden y se apagan instantaneamente y otra ves las unidades y asi ... He buscado, he intentado pero me voy dando por vencido veo que tambien utilizas micro code studio y sabes bastante de esto posiblemente y si me hicieras el favor de poder ayudarme te lo agradeceria mucho lo necesito muy urgente gracias


----------



## lubeck (Ago 5, 2011)

> lo necesito muy urgente



La recomendación cuando se necesitan las cosas urgentes es que le paguen a alguien que sepa para que lo haga... y normalmente es mas costoso (ley de oferta y demanda)

o comprarlo ya echo si hay en el mercado...


----------



## torres.electronico (Ago 5, 2011)

Una consulta lubeck... Se te ocurre como se podria controlar el estado de 2 o 3 puertos en un 16f877a para hacer una especie de vumetro o escala luminica con led? Osea, por ejemplo... Dependiendo del valor obtenido por el puerto analogo o bien, por el conteo de pulsos y previo almacenamiento en una variable... Se te ocurre como podria hacer esto sin tener que recurrir a una tabla de comparacion?
En ASM se hacerlo, pero en basic no me salio, y queria implementar la instruccion de insercion de assembler, y no funciona bien...
De ante mano, te agradezco el tiempo tuyo

PD: Es para ver si puedo simplificar el proyecto mio del tacometro, y en vez de implementar el LCD para ver las RPM, quizas sea mas visible con led (en el 1/4 de milla, es imposible ver el display de LCD); Por tanto, tenia pensado en usar el LCD solo para configurar el corte y shift light y los led para visualizar las RPM... Sera viable esta idea, o implemento un 16f628 en paralelo para esta funcion?


----------



## lubeck (Ago 5, 2011)

si entiendo bien... 

lo que tienes que hacer es asi

PortB=255 pone en alto todos los pines del puerto B

PortB=128 pone en alto solo el portb.7

a eso te refieres???


----------



## torres.electronico (Ago 5, 2011)

Claro, hasta ahi todo bien, eso lo se hacer; Lo que no se me ocurre, es como hacer para controlar por ejemplo el portB y el portC juntos sin tener que aplicar una tabla de comparaciones (osea segun dato, compara tabla y pone en alto o bajo deerminados puertos).
hay manera de controlar los dos puertos a la vez?


----------



## lubeck (Ago 5, 2011)

> hay manera de controlar los dos puertos a la vez?



Okcreo que ya entendi....

mira una manera es que una variable tipo word 16bits la pàrtas en dos esjemplo...

Lubeck=34525...
PortA=Lubeck.byte0
PortB=Lubeck.Byte1

aparte de eso no conozco otra manera, sin hacer un algoritmo, para separar la variable...


----------



## torres.electronico (Ago 5, 2011)

aaaa, me gusto la idea; Gracias Lubeck... ahora a la noche me pongo con este tema y lo chequeo...
Yo tenia un ejemplo en PicBasic de como armar un vumetro de 20 led, pero tengo un desorden en la PC, que no encuentro nada; Igualmente, un millon de gracias...
Queres que suba lo que estoy haciendo?


----------



## lubeck (Ago 5, 2011)

> Queres que suba lo que estoy haciendo?



Pue si estaria bien para que aprendamos todos...


----------



## CHR (Ago 5, 2011)

Bueno...si les sirve, aqui posteo un vumetro hecho con un pic 16F877A que tiene diferentes visualizanes hechas utilizando la CGRAM del LCD.
como nota yo lo arme con un PIC 16F870 que tiene 4 conversores analógico-digital y es algo pequeño, funciono exitosamente con este pic


----------



## Dario (Ago 6, 2011)

hola gente.
mi inquietud es la siguiente: ¿se puede sacar PWM por tres pines de un pic16f628A utilizando el comando HPWM? estoy experimentando pero no puedo ni se muy bien como lograrlo, solo he podido hacer salir por un solo pin. aca les dejo el codigo para ver si me dan una manito. pd: (el ancho de pulso es variado por un potenciometro de 10kcolocado en porta.0) saludosss

```
@ DEVICE MCLR_ON,  hs_osc, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
 define osc20
 CMCON=7  
   TRISB.3 = 0            ' RB.3=PWM output
   PR2       = 25         ' Set PWM for approximately 38KHz
   CCPR1L    = 1         ' Set PWM Duty-Cycle to 50%
   CCP1CON   = %00001100  ' Mode select = PWM
   T2CON     = %00000100  ' Timer2 ON + 1:1 prescale 
pote var byte   
inicio:
pot porta.0,255,pote
hpwm 2,pote,38000
goto inicio
end
```


----------



## lubeck (Ago 6, 2011)

> ¿se puede sacar PWM por tres pines de un pic16f628A utilizando el comando HPWM?



No... no se puede...

el pic 16f628A tiene estos perifericos, modulos (o no se como mas los llaman)



1 CCP(PWM)
1 USART
2 Comparadores
1 Timer de 16bits
2 Timers de 8bits

16 puertos de Entrada y Salida

Por ende lo demas no lo tiene...

es decir no tiene ADC, no tiene USB, no tiene 4 comparadores, no tiene 4 PWM, no tiene  bueno lo que se imaginen si no esta en esa tabla no lo tiene...

cada datashit que he visto tiene una tabla similar con lo que tiene(por razones obvias esa tabla no muestra lo que NO tiene, si no... se imaginan de que tamaño seria )...

en el caso del PIC18C452 tiene dos modulos PWM y el 17c756A tiene tres modulos PWM....

y copy& paste de como se manejarian...


```
Some devices, such as the PIC18C452, have alternate pins that may be used for HPWM. The following DEFINEs allow using these pins:
Algunos Dispositivos, como el 18c452, tienen pines alternos que podrian ser usados para el HPWM.. las siguientes sentencias permiten el  uso en esos pines:

DEFINE CCP1_REG PORTC 'Hpwm 1 pin port
DEFINE CCP1_BIT 2 'Hpwm 1 pin bit
DEFINE CCP2_REG PORTC 'Hpwm 2 pin port
DEFINE CCP2_BIT 1 'Hpwm 2 pin bit

The following DEFINEs specify which timer, 1 or 2, to use with PWM channel 2 and PWM channel 3 for the PIC17C7xx devices. The default is timer 1 if no DEFINE is specified.
Las siguinetes sentencias especifican cual temporizador, 1 o 2, sera usado con el canal 2 y 3 del pwm para los dispositivos  pic 17c7xx.El valor predeterminado es el temporizador 1 si no es especificado.
DEFINE HPWM2_TIMER 1 'Hpwm 2 timer select
DEFINE HPWM3_TIMER 1 'Hpwm 3 timer select

Example
Ejemplo
HPWM 1,127,1000 ' Send a 50% duty cycle PWM signal at 1kHz
HPWM 1,64,200   ' Send a 25% duty cycle PWM signal at 2kHz
```


----------



## Dario (Ago 6, 2011)

ya me lo imaginaba... soy poco amigo de leer los datasheet`s   gracias amigo lubeck


----------



## Dario (Ago 8, 2011)

bueno, ya que al parecer no hay nuevas preguntas en este post, voy a aprovechar para hacer una nueva consulta. beno, resulta que he vuelto al diseño de un viejo autodesafio postergado  se trata de un variador brushless sensorless programado en pic basic. talvez si se vuelven un poquito para atras lo encuentren junto con un par de respuestas interesantes. el tema es que, he programado una secuencia de control simple en un pic16f628A, solo para hacer girar el motor como para lograr sacar la secuencia del back emf por medio de unos operacionales pero me encuentro con el problema de que el mosfet Q3 que en proteus es Q6 del puente, calienta un monton y revisando con el osciloscopio de mi taller, he notado que la señal de control que llega al mosfet, es diferente incluso en el pin del micro, por lo que deje el microcontrolador funcionando solo y efectivamente, la señal que sale del micro tambien es diferente. aca subo el codigo y el diseño en proteus para ver si me dan una mianito. por cierto, la señal se ve normal en proteus pero en el diseño real no es lo mismo, de hecho, ni en proteus ni en el diseño real, la señal de control se parece a lo que deberia ser... 
saludosss y gracias 
pd: (el diseño en proteus con los transistores conectados no me funciona bien, no se si sera por falta de recursos en la pc... ah, aclaro por si alguno pregunta, que el controlador funciona con esta secuencia de control, solo que el problema es que el Q3 que en proteus es Q6, calienta demasiado...  )


```
@ DEVICE MCLR_OFF,  hs_osc, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
 define osc20
 CMCON=7                  'desactivo los comparadores del puerto A
 TRISA=%11111111           'todo el puerto A como salidas
 porta=%11111111                          'el puerto A a nivel 0
 trisb=%00000000           'RB0 a RB2 salidas y RB3 a RB6 como entradas
 portb=%00000000 
 uno:    '1 
pwm portb.0,100,1
high portb.1
high portb.2
low portb.3
low portb.4
high portb.5
low portb.6
low portb.7
pause 1
 '2 
pwm portb.0,100,1
high portb.1
high portb.2
low portb.3
low portb.4
low portb.5
high portb.6
low portb.7
pause 1  
'3 
high portb.0
pwm portb.1,100,1
high portb.2
low portb.3
low portb.4
low portb.5
high portb.6
low portb.7
pause 1  
'4
high portb.0
pwm portb.1,100,1
high portb.2 
low portb.3
high portb.4
low portb.5
low portb.6
low portb.7
pause 1 
'5
high portb.0
high portb.1
pwm portb.2,100,1
low portb.3
high portb.4
low portb.5
low portb.6
low portb.7
pause 1 
'6
high portb.0
high portb.1
pwm portb.2,100,1
low portb.3
low portb.4
high portb.5
low portb.6
low portb.7
pause 1
goto uno
```


----------



## torres.electronico (Ago 11, 2011)

lubeck dijo:


> Pue si estaria bien para que aprendamos todos...



Bueno, tiro la version beta que tiene algunos bugs, pero funciona algo...



```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [prof.martintorres@educ.ar]                       *
'*  Notice  : Copyright (c) 2011 [® MT&F ©2011-12 ]             *
'*          : All Rights Reserved                               *
'*  Date    : 08/07/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;****************************************************************
 @ device HS_OSC  
DEFINE OSC 20 
DEFINE ADC_BITS 8 
DEFINE ADC_CLOCK 2 
DEFINE ADC_SAMPLEUS 50 
DEFINE LCD_DREG PORTD 
DEFINE LCD_BITS 4 
DEFINE LCD_DBIT 4 
DEFINE LCD_RSREG PORTD 
DEFINE LCD_RSBIT 2 
DEFINE LCD_EREG PORTD 
DEFINE LCD_EBIT 3 
DEFINE LCD_LINES 2 
LCDOut $fe, $48, $00, $00, $00, $00, $00, $00, $1F, $1F 'Figura 1.
LCDOut $fe, $50, $00, $00, $00, $00, $1F, $1F, $1F, $1F 'Figura 2.
LCDOut $fe, $58, $00, $00, $1F, $1F, $1F, $1F, $1F, $1F 'Figura 3.
LCDOut $fe, $60, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F 'Figura 4.
TRISA = 1 
ADCON1 = 0 
ADCON0 = %11000001
TRISB = %11111111
TRISC = %00000000
TRISD = %00000000

boton_ctrlRPM var PORTB.0      
botonSUBIR var PORTB.2
botonBAJAR var PORTB.3
botonMODO  var PORTB.1
botonLUZ  var PORTB.5
ent_RPM var PORTB.4

relay1 var PORTC.4
relay2 var PORTC.5
led1   var PORTC.6
led2   var PORTC.7

Res      Var Word 
Res1     var word
Volts1   Var Word 
Volts2   Var Word
Volts3   Var Word 
Volts4   Var Word
nivel    var byte
c        var byte
temp     VAR byte                       
Cnt      VAR word                        
RPMalta  var word                    
RPMbaja  var word                  
RPMaviso var word
x        var byte                          
x1       var byte                         
revo     var word
revo1    var word
revo2    var word
revoalta var word
revobaja var word                       
disparo  var byte                   

Conv1  Con 19 
Conv2  Con 53 
linea1 con $80
linea2 con $C0
    
eeprom 0, [22,26]

;***********************************************************************
;*************************** INICIO - MENU *****************************
;***********************************************************************
Inicio:     ; inicia apagado, si no hay accion a los 5 seg, pasa a espejo
LCDOUT $FE, 1 
LCDOUT "MT&F  TeamRacing"
LCDOut $fe,$C0, "Picadas Comodoro"
pause 1000

Inicio3: 
pause 100
LCDOUT $FE, 1 
LCDOUT "   CLMT  v3.0   "
LCDOut $fe,$C0, "Sistema  APAGADO"
temp = 0
BUTTON botonsubir, 0, 255, 0, temp, 1,inicio2    
                                               temp = 0
;if botonmodo = 0 then inicio2    
low led1 : low relay2
goto inicio3

Inicio2:    
pause 100
LCDOUT $FE, 1 
LCDOUT " Seleccione MODO"
LCDOut $fe,$C0 
LCDOUT "y pres ENTER"
     temp = 0
     BUTTON botonsubir, 0, 255, 0, temp, 1,menu1    
     temp = 0
     BUTTON botonbajar, 0, 255, 0, temp, 1,menu2
     temp = 0
     goto inicio2

menu1:
toggle led1
pause 100
LCDOUT $FE, 1 
LCDOUT " Entrar en MODO"
LCDOut $fe,$C0 
LCDOUT "HALL METRE?"
     temp = 0
     BUTTON botonsubir, 0, 255, 0, temp, 1,menu2    
     temp = 0
     BUTTON botonbajar, 0, 255, 0, temp, 1,menu3
     temp = 0
     IF botonMODO  = 0 THEN Hall_metre
     goto menu1

menu2:
toggle led1
pause 100
LCDOUT $FE, 1 
LCDOUT " Entrar en MODO"
LCDOut $fe,$C0 
LCDOUT "MAPEO MANUAL?"
     temp = 0
     BUTTON botonsubir, 0, 255, 0, temp, 1,menu3    
     temp = 0
     BUTTON botonbajar, 0, 255, 0, temp, 1,menu1
     temp = 0
     IF botonMODO  = 0 THEN manual
     goto menu2

menu3:
toggle led1
pause 100
LCDOUT $FE, 1 
LCDOUT " Entrar en MODO"
LCDOut $fe,$C0 
LCDOUT "Control de RPM?"
     temp = 0
     BUTTON botonsubir, 0, 255, 0, temp, 1,menu1    
     temp = 0
     BUTTON botonbajar, 0, 255, 0, temp, 1,menu2
     temp = 0
     IF botonMODO  = 0 THEN LOOP1
     goto menu3

;*************************************************************************
;**************** rutina para visualizar valor real en la ****************
;************* sonda lambda, con mensajes de estado de mezcla ************
;*************************************************************************
Hall_metre:
low led1
LCDOUT $FE, 1 
lcdout " MODO VISOR"
LCDOUT $fe,$C0,"HALL METRES"
pause 1500
Hall_metre1:
if botonMODO = 0 then Inicio
ADCIN 1, Res1
Volts3 = Res1 * Conv1 
Volts4 = Res1 * Conv2 
Volts4 = Volts4 / 100
Volts3 = Volts3 + Volts4 
if volts3 > 800 then nivel5E
if volts3 > 600 then nivel4E
if volts3 > 400 then nivel3E
if volts3 > 200 then nivel2E
if volts3 < 200 then nivel1E
goto Hall_metre1

;*************************************************************************
;**************** rutina para poner en salida valor deseado **************
;************* mas lectura de valor verdadero leido por lambda ***********
;*************************************************************************

Manual: 
low led1
LCDOUT $FE, 1 
lcdout " Atencion MODO!!"
LCDOUT $fe,$C0,"MAPEO MANUAL"
pause 1500
LCDOUT $FE, 1
nivel = 0
high relay2

Manual1:
pause 100
if botonSUBIR = 0 then gosub subir
if botonbajar = 0 then gosub bajar
if botonMODO = 0 then Inicio
LCDOUT $fe, 1
ADCIN 0, Res
ADCIN 1, Res1
Volts1 = Res * Conv1 
Volts2 = Res * Conv2 
Volts2 = Volts2 / 100
Volts1 = Volts1 + Volts2 
LCDOUT $fe, 2 ,"VS= ",DEC4 Volts1 , "mV"
Volts3 = Res1 * Conv1 
Volts4 = Res1* Conv2 
Volts4 = Volts4 / 100
Volts3 = Volts3 + Volts4 
LCDOUT $fe, $C0,"VE= ",DEC4 Volts3 , "mV"
gosub graficonivel
HPWM 1,nivel,1000 
;PWM PORTC.2,nivel,100
goto manual1

subir:
IF Volts1 > 1000 THEN aviso 
nivel = nivel +1 
return

bajar:
if Volts1 < 50 then aviso
nivel = nivel -1 
return 

aviso: 
HIGH LED1
pause 800
low led1
goto manual1


;***************************************************************
;*********** rutina para ver valor de entrada LAMBDA ***********
;*************** mas lectura de salida generada ****************
;***************************************************************

LOOP1:
low led1
LCDOUT $FE, 1 
lcdout " Atencion - Modo"
LCDOUT $fe,$C0,"Control RPM"
pause 1500
nivel= 1
LCDOUT $FE, 1
LOOP:
     pause 100
     LCDOUT $FE,1," MOD=menu 1=CRPM"      
     LCDOUT $FE,linea2,"(+)=Vis (-)=Prog"
     temp = 0
     BUTTON botonsubir, 0, 255, 0, temp, 1,visor    
     temp = 0
     BUTTON botonbajar, 0, 255, 0, temp, 1,PM_Prog
     temp = 0
     BUTTON botonmodo, 0, 255, 0, temp, 1,Inicio2
     temp = 0
     GOTO LOOP   
;**---------------------------------------------------------**   
;**---------------------------------------------------------**
;**---------------------------------------------------------**

visor:
low led1
LCDout $FE,1," Modo Visor"
pause 1500
nivel= 1
LCDOUT $FE, 1

visor1:

       count portb.4, 125, revo
       revo= (revo / 4)/2 * 240 
       LCDOUT $FE,1," RPM=",dec revo       
       lcdout $FE,$c0,"C=",dec RPMalta," CL=",DEC RPMbaja
       pause 100
       temp = 0
     BUTTON botonsubir, 0, 255, 0, temp, 1,loop    
     temp = 0
     BUTTON botonbajar, 0, 255, 0, temp, 1,loop
     temp = 0
     BUTTON botonmodo, 0, 255, 0, temp, 1,Inicio2
     temp = 0
     if boton_ctrlRPM = 0 then control_rpm
     IF revo2 > RPMalta then corte1
     IF revo2 > revoalta then corte1
     GOTO visor1
 
control_rpm:

count portb.4, 125, revo
       revo1= (revo / 4) 
       revo2= (revo1/2)* 240
       
LCDout $FE,1,"CONTROL LARGADA"
pause 100
if botonMODO = 0 then Inicio
if boton_ctrlRPM = 1 then visor1
if revo2 > RPMbaja then
high relay1 
pause 250
low relay1
endif
if revobaja > RPMbaja then 
high relay1 
pause 250
low relay1
endif
goto control_rpm       
    
;**---------------------------------------------------------**  
;**---------------------------------------------------------**
;**---------------------------------------------------------**  

corte1:
LCDout $FE,1,"CORTE"
For disparo= 1 to 3
high relay1 
pause 500
low relay1
next
goto visor1

;****************************************************************
;********************** Seccion de Prog RPM *********************
;****************************************************************

 PM_Prog:
 RPMalta = 8000
 RPMbaja = 3000
 gosub soltar

;**---------------------------------------------------------**   
;**---------------------------------------------------------**
;**---------------------------------------------------------**

 grabar1:
 lcdout $FE,1,"Prog Corte RPM" 
 lcdout $FE,$c0,"Corte=",dec RPMalta,"RPM"                                                        
 pause 100
 if botonbajar = 0 then restar2
 if botonsubir = 0 then sumar2
 if botonmodo = 0 then grabarB
 goto grabar1
 
 restar2:
 RPMalta = RPMalta - 5
 goto grabar1
 
 sumar2:
 RPMalta = RPMalta + 5
 goto grabar1
 
 grabarB:
 gosub soltar
 write 0, RPMalta
 revoalta = RPMalta

;**---------------------------------------------------------**   
;**---------------------------------------------------------**
;**---------------------------------------------------------**

 grabar3:
 lcdout $FE,1,"Prog Ctrl larg" 
 lcdout $FE,$c0,"Corte=",dec RPMbaja,"RPM"                                                        
 pause 100
 if botonbajar = 0 then restar3
 if botonsubir = 0 then sumar3
 if botonmodo  = 0 then grabarC
 goto grabar3
 
 restar3:
 RPMbaja = RPMbaja - 5
 goto grabar3
 
 sumar3:
 RPMbaja = RPMbaja + 5
 goto grabar3
 
 grabarC:
 gosub soltar
 write 3, RPMbaja
 revobaja = RPMbaja
 goto LOOP
 
 soltar:
 high led1
 pause 150
 low led1
 
 soltar2:
 If botonbajar = 0 then soltar2
 If botonsubir = 0 then soltar2
 If botonmodo = 0 then soltar2
 pause 100
 return
 
;***************************************************************
;********************** Barra grafica  *************************
;***************************************************************

graficonivel:
if volts3 > 800 then gosub nivel5
if volts3 > 600 then gosub nivel4
if volts3 > 400 then gosub nivel3
if volts3 > 200 then gosub nivel2
if volts3 < 200 then gosub nivel1
return

nivel1:
LCDOut $fe,$CB, 1 
return
nivel2:
LCDOut $fe,$CB, 1 
LCDOut $fe,$CC, 2
return
nivel3:
LCDOut $fe,$CB, 1 
LCDOut $fe,$CC, 2
LCDOut $fe,$CD, 3
return
nivel4:
LCDOut $fe,$CB, 1 
LCDOut $fe,$CC, 2
LCDOut $fe,$CD, 3
LCDOut $fe,$CE, 4
return
nivel5:
LCDOut $fe,$CB, 1 
LCDOut $fe,$CC, 2
LCDOut $fe,$CD, 3
LCDOut $fe,$CE, 4
LCDOut $fe,$CF, 4
return

nivel1E:
pause 100
LCDOUT $FE, 1
LCDOUT $fe, $C0,"VE= ",DEC4 Volts3 , "mV"
LCDOut $fe,2,"Mezcla muy POBRE" 
LCDOut $fe,$CB, 1
goto Hall_metre1

nivel2E:
pause 100
LCDOUT $FE, 1
LCDOUT $fe, $C0,"VE= ",DEC4 Volts3 , "mV"
LCDOut $fe,2,"Mezcla POBRE"
LCDOut $fe,$CB, 1 
LCDOut $fe,$CC, 2
goto Hall_metre1

nivel3E:
pause 100
LCDOUT $FE, 1
LCDOUT $fe, $C0,"VE= ",DEC4 Volts3 , "mV"
LCDOut $fe,2,"Mezcla BUENA"
LCDOut $fe,$CB, 1 
LCDOut $fe,$CC, 2
LCDOut $fe,$CD, 3
goto Hall_metre1

nivel4E:
pause 100
LCDOUT $FE, 1
LCDOUT $fe, $C0,"VE= ",DEC4 Volts3 , "mV"
LCDOut $fe,2,"Mezcla RICA"
LCDOut $fe,$CB, 1 
LCDOut $fe,$CC, 2
LCDOut $fe,$CD, 3
LCDOut $fe,$CE, 4
goto Hall_metre1

nivel5E:
pause 100
LCDOUT $FE, 1
LCDOUT $fe, $C0,"VE= ",DEC4 Volts3 , "mV"
LCDOut $fe,2,"Mezcla muy RICA"
LCDOut $fe,$CB, 1 
LCDOut $fe,$CC, 2
LCDOut $fe,$CD, 3
LCDOut $fe,$CE, 4
LCDOut $fe,$CF, 4
goto Hall_metre1

LUZ:
Toggle led2
Pause 500
return

end
```

Mi idea, era sacar las rpm del display, y verlas directamente con los led... Los errores aactuales son en la lectura del valor de sonda lambda. creeria que el error esta en que me falta implementar la misma maza del vehiculo, o bien, quizas me falte configurar la tension de referencia...
El otro error que tengo, es en la visualiozacion del display algunos caracteres, pero quizas sea por que no tengo justo un cristal de 20 mhz y estoy implementando uno de 8mhz...


----------



## torres.electronico (Ago 13, 2011)

D@rio dijo:


> ... me encuentro con el problema de que el mosfet Q3 que en proteus es Q6 del puente, calienta un monton y revisando con el osciloscopio de mi taller, he notado que la señal de control que llega al mosfet, es diferente incluso en el pin del micro, por lo que deje el microcontrolador funcionando solo y efectivamente, la señal que sale del micro tambien es diferente. aca subo el codigo y el diseño en proteus para ver si me dan una mianito. por cierto, la señal se ve normal en proteus pero en el diseño real no es lo mismo, de hecho, ni en proteus ni en el diseño real, la señal de control se parece a lo que deberia ser...


Hola amigo, un gusto saludarte.
Te comento que todos los software de simulacion, si bien son una excelente herramienta de diseño, hay que tener en cuenta que el software desprecia muchos factores, por eso, no hay que confiar un 100%.
El problema que presentas, puede estar dado por la carencia de una proteccion apropiada al semiconductor. Lo que debes hacer, es implementar una red snuber y estaria solucionado en un 50%. No vi el circuito, lo tienes por ahi en formato imagen? mas que nada para ver que consumo tiene la carga y que mosfet implementastes (digo imagen por que no estoy en mi PC y aca no tengo proteus)....
Bien no recuerdo si fuistes vos u otra persona que habia presentado un dimmer con pic, pero en ese mismo caso, tambien carecia de una proteccion y por ende, la respuesta de otro forista,que se le calentaba el triac y se le quemaba...
Para ese caso en particular, la proteccion es una sencilla bobina de autoinduccion, que si se le asocia dos elementos pasivos mas (resistencia y capacitor), se puede controlar hasta un pequeño motor AC.
Saludos


PD: te sumo teoria al respecto
http://pels.edv.uniovi.es/pels/Pels/Pdf/Leccion Snubbers.pdf
http://www.uv.es/marinjl/electro/transistores.html


----------



## Dario (Ago 14, 2011)

torres.electronico dijo:


> Hola amigo, un gusto saludarte.
> Te comento que todos los software de simulacion, si bien son una excelente herramienta de diseño, hay que tener en cuenta que el software desprecia muchos factores, por eso, no hay que confiar un 100%.
> El problema que presentas, puede estar dado por la carencia de una proteccion apropiada al semiconductor. Lo que debes hacer, es implementar una red snuber y estaria solucionado en un 50%. No vi el circuito, lo tienes por ahi en formato imagen? mas que nada para ver que consumo tiene la carga y que mosfet implementastes (digo imagen por que no estoy en mi PC y aca no tengo proteus)....
> Bien no recuerdo si fuistes vos u otra persona que habia presentado un dimmer con pic, pero en ese mismo caso, tambien carecia de una proteccion y por ende, la respuesta de otro forista,que se le calentaba el triac y se le quemaba...
> ...



pues muchas gracias amigo por el interes. mira, aca subo unas imagenes de la simulacion en proteus, los codigos en pbp de las dos secuencias que estoy experimentando y las formas de ondas que obtengo con ellas. primero tengo que aclarar que en esta simulacion estoy usando transistores y no mosfets por el hecho de que, asi ahorro recursos en la pc para la simulacion.
vamos con la primera: 

esquematico:


codigo sin pwm


```
@ DEVICE MCLR_ON,  hs_osc, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
define osc 20
CMCON=7
TRISA=%11111111 
TRISB=%00000000

pas:
portb=%00000000
high portb.0
high portb.5
pause 10

portb=%00000000
high portb.0
high portb.6
pause 10

portb=%00000000
high portb.1
high portb.6
pause 10

portb=%00000000
high portb.1
high portb.4
pause 10

portb=%00000000
high portb.2
high portb.4
pause 10

portb=%00000000
high portb.2
high portb.5
pause 10
goto pas
```

forma de onda obtenida:


se puede decir que con este codigo, obtengo la señal correcta pero sin pwm por lo que los mosfets calientan muchisimo. (correcto pero no viable)

codigo con pwm:

```
@ DEVICE MCLR_ON,  hs_osc, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
define osc 20
CMCON=7
TRISA=%11111111 
TRISB=%00000000

pas:
portb=%00000000
pwm portb.0,50,1
high portb.5
pause 10

portb=%00000000
pwm portb.0,50,1
high portb.6
pause 10

portb=%00000000
pwm portb.1,50,1
high portb.6
pause 10

portb=%00000000
pwm portb.1,50,1
high portb.4
pause 10

portb=%00000000
pwm portb.2,50,1
high portb.4
pause 10

portb=%00000000
pwm portb.2,50,1
high portb.5
pause 10
goto pas
```

forma de onda obtenida:

 la señal obtenida no es correcta y por lo tanto, no sirve

me gustaria saber como lograr hacer que la señal pwm se presente en la parte positiva de la onda cubriendo todo el tiempo on de la misma y no como dos pulsos que ademas, estan invertidos...
saludos y espero alguien me de una mano con esto...


----------



## Chico3001 (Ago 14, 2011)

Me preocupan esos Picos que se ven en las graficas..... casi podria asegurar que son corto-circuitos entre los transistores en la simulacion, y la posible causa de que se calienten en la aplicacion... 

Que transistores manejas? y cuales son las caracteristicas de la carga?


----------



## Dario (Ago 15, 2011)

Chico3001 dijo:


> Que transistores manejas? y cuales son las caracteristicas de la carga?



hola chico.
Si, ami tambien me llama la atencion esos picos que se ven en la simulacion. te cuento que estoy utilizando mosfets del tipo IRFZ44N que segun el datasheet, se aguantan hasta 49 amper.
tambien estoy utilizando unos pre driver en los mosfets T1, T2, T3, del tipo bc548 Q7,8y9 configurados como inversor. aca subo el puente de transistores que estoy utilizando, en un rar porque la imagen es muy grande jeje... saludos y gracias por contestar  ah, el codigo para este puente es algo diferente porque los estados logicos que se necesitan son diferentes al del diagrama anterior.
aca una muestra del codigo sin pwm.


```
@ DEVICE MCLR_ON,  hs_osc, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
define osc 20
CMCON=7
TRISA=%11111111 
TRISB=%00000000

pas:
portb=%00000111
low portb.0
high portb.5
pause 10

portb=%00000111
low portb.0
high portb.6
pause 10

portb=%00000111
low portb.1
high portb.6
pause 10

portb=%00000111
low portb.1
high portb.4
pause 10

portb=%00000111
low portb.2
high portb.4
pause 10

portb=%00000111
low portb.2
high portb.5
pause 10
goto pas
```


----------



## Chico3001 (Ago 15, 2011)

OK... van unas preguntas por que no se mucho de programacion en bsic...

Veo que defines el oscilador a 20, son 20MHz? por que estudiando la hoja de datos el tiempo de apagado del mosfet es de 44nS y se acerca mucho al ciclo de trabajo del PIC que estimo que es de 200nS, si no se cuida el codigo puede haber un caso donde 2 mosfets (Q1 y Q4 o Q2 y Q5 o Q3 y Q6) pueden estar encendidos al mismo tiempo y provocar un corto... 

Es necesario el pre-driver inversor? no podrias encender todos los mosfets directos???


----------



## lubeck (Ago 15, 2011)

Dario:
La verdad es que yo no entiendo lo que necesitas porque nunca he manejado un brushless, pero ya intentaste esto...

```
pas:
portb=%00100001
pause 10
portb=%01000001
pause 10
portb=%01000010
pause 10
portb=%00010010
pause 10
portb=%00010100
pause 10
portb=%00100100
pause 10
goto pas
```


----------



## Dario (Ago 15, 2011)

hola chico.
si, el oscilador es de 20mhz pero la pausa entre conmutaciones es de 10 milisegundos osea que eso esta bien lejos del ciclo de trabajo del pic. 



> puede haber un caso donde 2 mosfets (Q1 y Q4 o Q2 y Q5 o Q3 y Q6) pueden estar encendidos al mismo tiempo y provocar un corto...



mi sospecha es justamente esa ya que, he visto por ahi en una pagina de bicicletas electricas que para controlar un motor trifacico de contina, usan un pic16f84 y pic basic para su programacion y las bobinas son conmutadas directamente sin pwm. segun su diseñador, el codigo es totalmente funcional, pero yo lo he modificado para un f628, lo he cargado y sin pwm los mosfets hierven hasta su ruptura. y eso que estoy usando un motor de una cd rom sin modificar. este es el sitio http://bicicletaselectricas.wordpress.com/programa-de-control-para-un-motor-de-bicicleta-con-un-pic/
edit2. (claro, el sujeto utilizo reles para la conmutacion, eso explica su funcionamiento, de otra manera le hubiese pasado lo mismo que ami  )
si lubeck ya lo intente... pero el resultado es el mismo... 
saludosss


----------



## Chico3001 (Ago 15, 2011)

Ya revise la secuencia y es correcta... asi que el problema debe estar en otro lado.... no sera que tienes algun cable mal conectado? que motor estas usando y cuantos cables tiene?

tambien comenzaria por quitar el predriver... y hacer todo positivo...


----------



## torres.electronico (Ago 15, 2011)

Hola amigo, perdon por tardar.... como no me llega notificaciones a mi correo, me olvido. Respecto a tu tema, si es esa la configuracion que estas implementando en tu etapa de potencia, esta claro el problema, es como te comentaba al principio (te estaria faltando la protecciones adecuadas para los transistores)... Yo en tu caso, en vez de usar los npn, implementaria un array con entrada ttl. .. si no le pifio, creo que el TTL era el uln2803...
Te digo de implementar el array, ya que este ya viene con sus propias protecciones internas.
De ultima, si queres usar ese mismo, implementa un zener segun la carga o quizas, si es pequeñó el motor, con un simple diodo en paralelo al transistor ya tendria que funcionar perfecto en frecuencias bajas... en altas frecuencias no sabria decirte...


----------



## Dario (Ago 15, 2011)

> no sera que tienes algun cable mal conectado?


jeje... ya revise las conexiones y nada... esta todo ok.


> que motor estas usando y cuantos cables tiene?


estoy usando un motor de una cd rom 


> tambien comenzaria por quitar el predriver... y hacer todo positivo...


ya he probado eso y nada... 



> Hola amigo, perdon por tardar.... como no me llega notificaciones a mi correo, me olvido.


 jeje... pues no hay problemas amigo, no te preocupes 



> Respecto a tu tema, si es esa la configuracion que estas implementando en tu etapa de potencia, esta claro el problema, es como te comentaba al principio (te estaria faltando la protecciones adecuadas para los transistores)...


¿ya viste el rar? estoy utilizando mosfets. les cuento que esta etapa de potencia, esta copiada de un variador brushles que funciona y por lo tanto, no tengo dudas al respecto. aca lo pueden ver en el diagrama del rar se me pasaron por alto 3 resistencias que van a masa jeje...
saludos y gracias por responder. PDseria muy facil hacer este variador pero yo quiero aprender como hacerlo yo mismo desde cero )


----------



## Dario (Ago 16, 2011)

hola gentes yo por aqui de nuevo para dejarles mis avances en esto del blmc.  bueno, al final me decidi por generar una señal PWM maestra por hardware con el pic y luego inyectarla al puente mediante puertas AND. la señal que obtuve es la siguiente:

como veran, la señal es correcta y todo de maravillas en la siguiente simulacion con transistores:

pero el verdadero problema se da en el diseño real y se da porque la conmutacion de los mosfets, inserta demasiado ruido en la alimentacion del micro haciendo que este, conmute erraticamente y por lo tanto, se da el calentamiento extremo de los mismos. ese ya es un problema que no se soluciona con programacion sino con el diseño de algun filtro para la tension de la circuiteria logica. aqui dejo el diseño final del inversor trifacico que voy a utilizar. obviamente el tema de la programacion del micro no se termina aqui ya que, todavia falta la deteccion de cruce por cero y su posterior procesado, asi que estense listos para una nueva consulta de mi parte jejeje  saludos a todos y gracias por ayudarme amigos 

edit2: me olvidaba de dejarles tambien el codigo que utilice jeje...



> @ DEVICE MCLR_ON,  hs_osc, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
> define osc 20
> CMCON=7
> TRISB.3 = 0            ' RB.3=PWM output
> ...


----------



## torres.electronico (Ago 17, 2011)

Dario, como te comente desde un principio, el problema que persistes, es justamente problemas por carencia de una proteccion apropiada, de ahi mi recomendacion de que miraras la teoria sobre redes snuber... 
Una vez mas, te recomiendo que leas aunque sea este documento, que es un poco mas practico qu8e el resto, y notaras que con la asociacion de un par de elementos mas, tu problema se va 
http://es.scribd.com/doc/54810284/Diseno-y-constr-de-un-inversor-trifasico
Saludos


----------



## Meta (Ago 17, 2011)

D@rio dijo:


> hola gentes yo por aqui de nuevo para dejarles mis avances en esto del blmc.  bueno, al final me decidi por generar una señal PWM maestra por hardware con el pic y luego inyectarla al puente mediante puertas AND. la señal que obtuve es la siguiente:
> Ver el archivo adjunto 58541
> como veran, la señal es correcta y todo de maravillas en la siguiente simulacion con transistores:
> Ver el archivo adjunto 58540
> ...




Hola:

Como curiosidad. ¿Realmente hace falta usar las puertas que has puesto?

http://www.educaplus.org/play-164-Puerta-lógica-AND.html


----------



## Dario (Ago 18, 2011)

> Dario, como te comente desde un principio, el problema que persistes, es justamente problemas por carencia de una proteccion apropiada, de ahi mi recomendacion de que miraras la teoria sobre redes snuber...


perdon por mi ignorancia  es que yo no conocia esa clase de proteccion con el nombre de SNUBBER  ahora estoy viendo la forma de implementarla en mi circuito 



> Como curiosidad. ¿Realmente hace falta usar las puertas que has puesto?


pues generando una sola señal pwm si...
se que se puede hacer que el micro genere una señal pwm independiente por cada salida pero ya me canse de experimentar... lo que todavia no entiendo, es porque cuando diseñe el _controlador brushless discreto_, no tube problemas. sin embargo con micro deberia ser mas facil pero no es asi para mi sorpresa... 
saludosss


----------



## Chico3001 (Ago 18, 2011)

Lo que meta trata de decirte es que el circuito se puede simplificar aun mas.... siento que quieres correr antes de aprender a caminar... 

Primero elimina esas AND que salen sobrando, solo invierte los bits desde dentro del codigo del programa, el PIC puede hacer eso sin problemas... Despues te recomendaria que probaras el motor con un puente de transistores normales y revisaras que todo funciona bien... para posteriormente hacer el mismo intento cambiando los transistores por los MOSFETS

Asi vas eliminando errores y vas asegurando que cada etapa anterior funciona bien antes de pasar a la siguiente...


----------



## reyvilla (Ago 18, 2011)

hola que tal, estuve viendo tu idea y esta muy buena he conseguido algo de información que te puede ayudar no se si ya la has visto te la coloco para que lo revises, estuve viendo que si necesitas de un filtro para el circuito a la final. 

http://www.neoteo.com/Default.aspx?...eader$headerMaster$ucSearch$ctl00=+>>+buscar+


----------



## torres.electronico (Ago 18, 2011)

D@rio dijo:


> ...ahora estoy viendo la forma de implementarla en mi circuito ...


Implementa un sencillo diodo en el transistor, y si vemos despues con el oscillooscopio en la placa que estas experimentando que mejora la señal, con los datos de corriente del motor, le sumamos un capacitor y una resisitencia... necesitas un diagrama para ver como va el diodo?chiflame cualquier cosa, saludos


----------



## Dario (Ago 18, 2011)

> Implementa un sencillo diodo en el transistor


¿te referis a algo como esto?
los irfz44n, tienen diodo interno...




> Primero elimina esas AND que salen sobrando, solo invierte los bits desde dentro del codigo del programa, el PIC puede hacer eso sin problemas


 perdon si estoy entendiendo mal pero,esas AND no estan ahi para invertir bits, estan ahi para distribuir la señal PWM a cada mosfet. la señal pwm, no son bits, es una señal de onda cuadrada de anchura variable con la que se puede variar el torque del motor. 



> hola que tal, estuve viendo tu idea y esta muy buena he conseguido algo de información que te puede ayudar no se si ya la has visto te la coloco para que lo revises, estuve viendo que si necesitas de un filtro para el circuito a la final.
> 
> http://www.neoteo.com/Default.aspx?s...>>+buscar+


gracias reyvilla. esta muy interesante, lo voy a estudiar un poco, talves me sirva.
saludosss


----------



## Meta (Ago 18, 2011)

Esas AND las puedes quitar y hacer los PWM en cada pin del PIC. Si es más fácil hacerlo como dices ya que en un sólo pin del PIC, puedes generar tres PWM iguales para los transistores. Por un lado es buena idea, si lo haces directamente con el PIC y te ahorra electrónica, mejor que mejor, aunque tengas que programar mucho.

Cuanto más complejo es el circuito, más posibilidad hay de tener errores, más cuesta encontrarlos, más caro, etc.

Usted decide campeón.


----------



## Dario (Ago 18, 2011)

Meta dijo:


> Esas AND las puedes quitar y hacer los PWM en cada pin del PIC. Si es más fácil hacerlo como dices ya que en un sólo pin del PIC, puedes generar tres PWM iguales para los transistores. Por un lado es buena idea, si lo haces directamente con el PIC y te ahorra electrónica, mejor que mejor, aunque tengas que programar mucho.
> 
> Cuanto más complejo es el circuito, más posibilidad hay de tener errores, más cuesta encontrarlos, más caro, etc.
> 
> Usted decide campeón.



el problema es que cuando genero el pwm en cada pin del pic, al parecer ocurre un retraso que termina deformando la señal como habras visto en los post anteriores. al final de tanto intentar hacerlo asi, me canse y decidi aumentar un componenta mas. aparte de eso, generar el pwm asi, me ahorra proceso del micro ya que es generada por hardware interno del pic. si conoces alguna manera de que el comando PWM del pbp funcione sin deformar la señal, me avisas gracias amigo  .
saludosss


----------



## Meta (Ago 18, 2011)

Para esas cosas sin retraso, es mejor usar un dsPIC o PIC32. Están preparados para señales de audio los dsPIC, son buenísimos en ello incluido PWM.

Procura usar entonces para probar un PIC18F como mucho. Si de tu manera te funciona de maravilla, entonces déjalo así, de una manera o otra debe funcionar para el PIC16F.

Suerte....


----------



## lubeck (Ago 18, 2011)

> Para esas cosas sin retraso, es mejor usar un dsPIC o PIC32. Están preparados para señales de audio los dsPIC, son buenísimos en ello incluido PWM.



El pbp no soporta dsPic ni Pic32 hasta donde se....

la mejor manera de economizar en componentes es buscar un pic con 3 modulos PWM... puse unos en algunos post anteriores...


----------



## Meta (Ago 18, 2011)

Hay integrados que su funcionamiento se dedica sólo a PWM, eso son buenísimos. Es buena opción.


----------



## autotronico (Ago 18, 2011)

mirar aqui: 
Build a DIY brushless motor controller in a day (ish)

http://s3.amazonaws.com/files.poste...723750&Signature=Utwv+lBQBjefT6rl/tK5Y5gLeS0=
http://blog.spingarage.com/build-a-diy-brushless-motor-controller-in-a-d-0


----------



## Dario (Ago 18, 2011)

amigos muchas gracias a todos por contestar.  
bueno, digamos que la parte de programacion para la secuencia de control simple que intentaba hacer, esta lista y por ahora, para experimentar, voy a utilizar las puertas AND y pwm generado por hardware. lo que me queda, es corregir un poco el circuito y luego empezar con lo del BACKEMF, la deteccion de cruce por cero y su proceso.
amigo autotronico: muchas gracias por los link, los estoy revisando. como veran, el tipo de spingarage, utiliza un PIC18F4431 que segun dice, contiene 4 modulos pwm en su interior. yo utilizo un pic que contiene solo un modulo y le agrego las AND para lograr 3 señales pwm.
saludosss


----------



## Pull1988 (Ago 20, 2011)

Amigo, una pregunta se puede poner comandos AT directos en el microcode studido?por favor ayudame con esa interrogante


----------



## lubeck (Ago 21, 2011)

> una pregunta se puede poner comandos AT directos en el microcode studido?


Si...(pero especifica que tan directos)

se utiliza la comunicacion serial...


----------



## Pull1988 (Ago 21, 2011)

Bueno amigo mi idea es poder controlar las luces y la apertura de una puerta mediante el celular, osea poder mandar un mensaje de texto (SMS), este sería receptado por un modulo GSM y este a su vez enviarlo al PIC 877a para poder controlar los reles, entonces he investigado y veo q la mejor opcion para  esto es usar precisamente comandos AT, pero por mi ignorancia en este tema no se como intrucir estos comandos AT en el modulo GSM, por tal razon mi pregunta iba a que si yo podía poner estos comandos no desde el Hyperterminal sino desde microcode studio, usando alguna librería x ejm. Muchas gracias por su ayuda y disculpen mi ignoracia.


----------



## lubeck (Ago 21, 2011)

> usando alguna librería x ejm.



en pbp no usas librerias sino funciones, para eso tienes que usar la función SEROUT (busca los parametros en las ayudas)...

si ya tienes los comandos del AT y como conectar el modulo GSM ya lo tienes casi todo...


----------



## Pull1988 (Ago 21, 2011)

si te entiendo mi amigo yo pretendo usar serial RS232, pero usando la funcion SEROUT yo le mando los comandos con esa funcion?x ejm. SEROUT(AT +CMGL) solo es un ejm mi amigo, y como voy a usar un modulo GSM ese se conecta via serial a la placa de control (en donde estaria el PIC)


----------



## lubeck (Ago 21, 2011)

> y como voy a usar un modulo GSM ese se conecta via serial a la placa de control (en donde estaria el PIC)


No tengo idea de que modulo hablas...


> pero usando la funcion SEROUT yo le mando los comandos con esa funcion?x ejm. SEROUT(AT +CMGL)


el comando seria mas o menos asi...

Serout *pin,Mode*,["AT +cmgl"]

donde *pin* es el puerto que vayas a utilizar para el TX
y el *mode* depende de la velocidad y la polaridad que vayas a utilizar con tu modulo GSM


----------



## Dario (Ago 21, 2011)

> el comando seria mas o menos asi...
> Serout pin,Mode,["AT +cmgl"]



hey lubeck ¿de verdad? asi de simple es? suena interesante amigo... y, supongamos que enves de un modulo gsm fuese un celular motorola c236 ¿seria lo mismo? 
saludosss


----------



## lubeck (Ago 21, 2011)

> ¿seria lo mismo?


pues si es muy facil el enviar los comandos, lo dificil es conectarlo (saber que pin del tel es el de tX) y conseguir los codigos...
es decir yo tengo un Nokia 5300 y en algun tiempo quise hacerlo pero nunca encontre los comandos AT, solo podia realizar llamadas y descolgar pero no podia enviar mensajes ni leerlos ni otros comandos que tenia... en fin no es tan sencillo esa parte...


----------



## Dario (Ago 21, 2011)

ah, ok. voy a investigar un poco jeje... saludosss


----------



## Pull1988 (Ago 21, 2011)

Amigos, entonces solo eso sería la programación para introducir los comandos AT en el microcode verdad?
Y que telefono me recomendarían para configurarle los comandos AT??
Gracias por toda su ayuda


----------



## lubeck (Ago 22, 2011)

> entonces solo eso sería la programación para introducir los comandos AT en el microcode verdad?



Si... 


> Y que telefono me recomendarían para configurarle los comandos AT??



Cada telefono, Modem o Modulo GSM ,dependiendo de la marca, tiene sus codigos AT Propios... asi que no entiendo a que te refieres...
digamos los de Nokia son diferentes a los de Motorola Etc...Etc...


----------



## Pull1988 (Ago 22, 2011)

Ya amigo muchas gracias x toda su ayuda, les volvere a molestar cuando se me presente algun otro incoveniente, disculpandome x mi exceso de confianza


----------



## torres.electronico (Ago 25, 2011)

comandos AT para los nokia: 
http://nds1.nokia.com/phones/files/guides/at_commands.pdf
http://alfredocampos.blogspot.com/2008/09/comandos-at-para-celulares-nokia.html 
http://ncsp.forum.nokia.com/download/?asset_id=11579;ref=devx


----------



## Pull1988 (Ago 25, 2011)

Muy buen aporte amigo


----------



## lpnavy (Ago 29, 2011)

Hola a todos!! he aprendido a usar ya con mayor fluides los micros de la familia 16f ahora quiero hacerlo con la familia 18f ya que me llama la atencion hacer procesos usando el puerto usb, pero en la red no se consigue libros usando PBP para esta clase de familia, si alguien sabe donde pobria conseguir o descargar manuales, tutoriales o libros se le agradeceria.


----------



## Dario (Sep 14, 2011)

bueno gente. como lo prometido es deuda y aprovechando la inactividad de este tema, voy a poner una nueva consulta. 
si recuerdan hace un par de semanas creo, estaba tratando de diseñar un variador brushless sensorless programado en pbasic. logre hacer funcionar la secuencia anterior que es una especie de arranque a ciegas y me estrelle nuevamente con el proceso de la señal de cruce por cero que a diferencia de mi circuito a base de logica cmos, con micro no me anda jeje... estuve investigando un poco para saber como procesarla con el micro y encontre este documento que trata el tema y que por cierto es muy interesante. y en la pagina 72 del mismo encontre una pista interesante de como hacerlo y dice de la siguiente manera: 





> El detector de Back EMF esta ahora activado junto con las rutinas de
> interrupcion de calculo de velocidad y de conmutacion. Esta ultima se realiza
> utilizando la informacion provista por el detector de cruces por cero. (a ese ya lo tengo)
> Habilitando uno de los contadores disponibles en el microcontrolador, se
> ...


lo que veo aqui si no me equivoco, es que se utilizan interrupciones para habilitar el contador(¿TIMER?) y asi calcular el tiempo hasta la siguiente conmutacion. ahora viene mi transgresion a la regla del minimo esfuerzo  ¿como puedo lograr esto con un pic16f628A y pic basic???  me dan una idea con algunas lineas de codigo si no es mucho pedir?   saludosss y gracias por perder el tiempo con mis pavadas e intentar ayudarme


----------



## Dario (Sep 23, 2011)

bueno amigos aca estoy de nuevo y esta vez es para preguntar por las interrupciones. encontre un codigo que lee el estado de los pines rb4 a rb7 por medio de interrupciones y lo he practicado pero me encuentro con que pulsando cualquier puerto rb4,5,6,o 7, da lo mismo. me gustaria saber si me pueden dar una idea de como puedo hacer para diferenciar si la interrupcion se produjo en el rb4 o en el rb5 por ejemplo. aca dejo el codigo que encontre. saludosss

```
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
TRISA = %00000000 ' Configura el puerto A como salida.
TRISB = %11110000 ' Configura los 4 bits más significativos como
' entrada.
I VAR Byte ' Declaración de la variable "I" tipo Byte
Symbol LED1 = PORTA.0 ' Alias para el pin RA0
Symbol LED2 = PORTA.1 ' Alias para el pin RA1
On Interrupt GoTo Interrup ' Define el vector de interrupción
INTCON = %10001000 ' habilita la interrupción RB4-RB7
Inicio:
LED1 = 1 ' Enciende el Led 1
Pause 1000 ' Pausa de 1 segundo
LED1 = 0 ' Apaga el Led 1
Pause 1000 ' Pausa de 1 segundo
GoTo Inicio ' Salta a la etiqueta "Inicio"
189
Interrup:
Disable
For I = 1 To 6
LED2 = 1 ' Enciende el Led 2
Pause 1000 ' Pausa de 1 segundo
LED2 = 0 ' Apaga el Led 2
Pause 1000 ' Pausa de 1 segundo
Next I
INTCON = %10001000 ' habilita las interrupciones (GIE=1)
' habilita la interrupción RB4-RB7 (RBIE=1)
' Inicializa la interrupción (RBIF=0)
Resume
Enable
End
```


----------



## lubeck (Sep 24, 2011)

podrias intentarlo con algo como esto...


```
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
TRISA = %00000000 ' Configura el puerto A como salida.
TRISB = %11110000 ' Configura los 4 bits más significativos como
' entrada.
I VAR Byte ' Declaración de la variable "I" tipo Byte
Symbol LED1 = PORTA.0 ' Alias para el pin RA0
Symbol LED2 = PORTA.1 ' Alias para el pin RA1
On Interrupt GoTo Interrup ' Define el vector de interrupción
INTCON = %10001000 ' habilita la interrupción RB4-RB7
Inicio:
LED1 = 1 ' Enciende el Led 1
Pause 1000 ' Pausa de 1 segundo
LED1 = 0 ' Apaga el Led 1
Pause 1000 ' Pausa de 1 segundo
GoTo Inicio ' Salta a la etiqueta "Inicio"
189
Interrup:
Disable
[B]if portb.4 then .... tu rutina
if portb.5 then .... tu rutina
if portb.6 then .... tu rutina
if portb.7 then .... tu rutina[/B]
For I = 1 To 6
LED2 = 1 ' Enciende el Led 2
Pause 1000 ' Pausa de 1 segundo
LED2 = 0 ' Apaga el Led 2
Pause 1000 ' Pausa de 1 segundo
Next I
INTCON = %10001000 ' habilita las interrupciones (GIE=1)
' habilita la interrupción RB4-RB7 (RBIE=1)
' Inicializa la interrupción (RBIF=0)
Resume
Enable
End
```


----------



## Dario (Sep 24, 2011)

ok, gracias lubeck, es lo que estaba pensando. en ese caso las interrupciones no hacen falta. todavia no entiendo bien que diferencia hay entre una interrupcion y un if...then. jeje...  
muchas gracias amigo.
saludosss


----------



## lubeck (Sep 24, 2011)

> en ese caso las interrupciones no hacen falta. todavia no entiendo bien que diferencia hay entre una interrupcion y un if...then. jeje...



es que son cosas diferentes una interrupcion y una sentencia if, then...

digamos que con la interrupcion el micro esta ejecutando una rutina o bucle... cuando cambia de estado un registro que desencadene una interrupcion en este caso el del puerto b, esa rutina se interrumpe o se desatiende y se ejecuta por decirlo asi una subrutina propia de la interrupcion...

por ejemplo... si yo estoy comiendo plácidamente y en eso suena el telefono, entonces este me interrumpe de lo que estoy haciendo y tengo que contestar la llamada... tons el estar comiendo es el bucle principal, el sonido del telefono es la interrupcion, y el contestar el telefono es la subrutina de la interrupcion... 

dentro de esa subrutina de la interrupcion ,ya que fue interrumpido el bucle principal, ya puedes seleccionar con una sentencia *if then* con cual fue echa la interrupcion....

hago la aclaracion que si hay una sentencia *Pause* dentro de la bucle principal (como el pause 1000 de tu ejemplo) y se desencadena un interrupcion primero termina el *pause* y despues pasa a la subrutina de la interrupcion, o lo que es lo mismo un *pause* no se interrumpe en PBP..


----------



## reyvilla (Sep 24, 2011)

Hola muchachos ahora que veo el codigo nunca he manejado interrupciones voy a ponerlo a prueba con un circuito sencillo con el pic12f509, aparte me surge una duda con una parte del código que se para que sirve mas no uso esa exactamente para lograr lo mismo. 

es;  Symbol LED1 = PORTA.0 ,yo lo hago asi;   LED1 var porta.0 

afecta en algo, las dos formas son validas? 
Ya que si afecta lo tomaría en cuenta para mis códigos...gracias


----------



## Dario (Sep 24, 2011)

ok, entonces la diferencia es que se gana tiempo con una interrupcion ¿verdad?
saludosss


----------



## lubeck (Sep 24, 2011)

> ok, entonces la diferencia es que se gana tiempo con una interrupcion ¿verdad?


Mm, no ... 

en realidad una interrupcion se usa o es util  porque se interrumpe el software por hardware, es decir que aunque el micro este ocupado en otras cosa se enterara si se efectúa una interrupción. digamos que si no utilizas las interrupciones y esta ocupado el micro en algo y se presiona o se modifica el puertob, puede que ni se entere si lo haces por software.

no hay diferencia entre una y otra porque tienen fines distintos.


----------



## Dario (Sep 24, 2011)

jeje... bueno, entonces digamos que utilizar interrupciones resulta ser mucho mejor que un simple IF THEN. perdon por ser tan bestia jajaja...
EDIT:
no vayan a pensar algo asi...


----------



## lubeck (Sep 24, 2011)

Yo diria que depende de lo que se necesite y como lo ocupes....y no siempre es necesario utilizarlas

digamos que si yo tengo esto...


```
on interrupt goto subint

main

for I=1 to 100
 toggle porta.0
next I
goto main

subint:
Disable
 toggle portb.1
INTCON = %10001000 
Resume
Enable
End
```

si te fijas nada tiene que ver con los if then, pero me sirve para interrumpir una sentencia For Next
y vaya se pueden poner un sin fin de algoritmos en los que sea necesario y en los que no...

(el codigo que puse es solo ilustrativo le faltan mas cosas para funcionar )


----------



## reyvilla (Sep 24, 2011)

Una cosa que note es que el pic12f509 al parecer no tiene interrupciones, otra yo conozco las interrupciones y se que hay varias y como funcionan mas no las he aplicado a ningún programa ya que no he tenido la necesidad, una interrupción según mi concepto es como una parada de emergencia, la cual actua de inmediato, mas hay diferentes modos de aplicarlo de echo se puede encontrar bastante al respecto en internet.

1. - Mediante una accion interna. El desbordamiento de la Pila (Stack) por una operacion indebida, por ejemplo: 
Al completarse la escritura de datos en una EEPROM.
Por desbordamiento del registro TMR0 al rebasar el valor 255 (FFh) a 0.

2. - Mediante una accion externa, la mas util. Al producirse un cambio del nivel en uno de sus pines por una accion externa.
 Estando en el modo de reposo (SLEEP), un cambio de nivel en el pin RB0/INT .
Un cambio de nivel en uno de los pines  RB4 a RB7 estando configurados como entrada.

Eso por ejemplo, tratando de hacer interrupciones con el 12f509 pero al parecer con el picbasic pro no se puede, si alguien sabe algo al respecto me avise gracias.

Al no poder hacerlo por interrupciones, la idea era que en cualquier parte del programa al yo presionar un botón este dejara lo que esta haciendo y se fuera una sub-rutina y ejecutara el incremento de una variable y dependiendo del valor saltara a otra sub-rutina, luego pensé que no tenia mucha lógica hacerlo interrupción ya que al terminar la interrupción este volvería donde quedo antes de la interrupción, asi que lo que hice fue utilizar el call en cada parte del programa calculando que cada cierta cantidad de instrucciones ejecutadas me diera aproximadamente 200ms y luego ejecutar el call del pin del boton y de esa forma hacer un tipo de interrupción sin necesidad de volver al ultimo estado antes de la interrupción si no continuar con el resto del código.

Hice un ejemplo con el 12f629 que anexo esta funcionando bastante bien, ahora si ven que se puede mejorar avísenme y les agradecería.


----------



## Dario (Sep 24, 2011)

muchas gracias amigo lubeck, ya tengo una mejor idea de lo que quiero hacer. reyvilla: tu secuenciador esta genial, muy bueno.
saludosss


----------



## reyvilla (Sep 24, 2011)

gracias estoy practicando con camtasia les dejo un vídeo de la explicación del circuito es uno de mis primeros vídeos así que disculpen si no se oye muy bien y si me equivoque al expresarme...






saludosss


----------



## Dario (Sep 24, 2011)

muy buena la explicacion de tu circuito amigo, solo le falta darle un poco mas de volumen al microfono jeje... esta muy bajo el audio. saludos


----------



## Dario (Sep 28, 2011)

hola amigos tengo un problema (cuando no  ) estoy tratando de implementar un programa muy simple en un pic12f675, se trata de hacer titilar un led en el gpio.0. lo he simulado en proteus y funciona, pero en la realidad no me funciona... aca dejo el programita para ver si alguno de uds me da una idea de que puedo estar haciendo mal. ¿me ayudan??? gracias 
saludosss

```
@ DEVICE pic12F675, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, bod_off, protect_off


adcon0=0     '  desactiva el ADC
ansel=0 '  digital
cmcon=7'comparador apagado
trisio=0
VRCON=0 
define OSCCAL_1K 
     L1 VAR GPIO.0
     inicio:
     high L1
     pause 500
     low L1
     pause 500
     goto inicio
```


----------



## reyvilla (Sep 28, 2011)

estas utilizando un oscilador externo? Yo desactivaría el pwrt lo digo por a mi me a dado bastantes problemas, es una opcion en caso de que haya un bajo de voltaje el pic se resetea y eso es fastidioso si se esta probando en un protoboard ya que normalmente siempre hay muchas interferencias, no necesitas desactivar el adc yo por experiencia no lo he utilizado y funciona sin desactivarlo, el seteo del osccal creo le falta un 1 al final segun el manual,  "DEFINE OSCCAL_1K 1", por otro lado no veo la frecuencia de trabajo del pic, si es interno seria "DEFINE OSC 4".Bueno eso de momento te dejo un ejemplo de como lo colocaría yo:


@ DEVICE pic12F675, intrc_osc, wdt_off, pwrt_on, mclr_off, bod_off, protect_off

DEFINE OSC 4
DEFINE OSCCAL_1K 1

CMCON = 7
TRISIO=%00001000

L1 VAR GPIO.0

INICIO:
high L1
pause 500          
low L1 
pause 500     
goto INICIO

Aparte hay algún motivo especial para setear el pic?


----------



## Dario (Sep 28, 2011)

reyvilla dijo:


> Aparte hay algún motivo especial para setear el pic?



hola reyvilla, gracias por responder. te comento que estoy tratando de utilizar el oscilador interno del pic y no, la verdad solo intento hacer que el led encienda y se apague pero no logro hacer que funcione en el montaje real. no soy un experto en esto, solo hice copi paste de la configuracion de otro programita para el mismo pic voy a desactivar el pwrte en el codigo que has dejado, lo voy a compilar y aver que sucede jeje. luego te aviso que sucedio...
saludosss


----------



## reyvilla (Sep 28, 2011)

dale espero lo pruebes, el "DEFINE OSCCAL_1K 1" es para hacer un seteo del oscilador interno del pic, seria como calibrar el pic o algo así, no esto muy claro de su uso, para utilizar el oscilador interno, dentro de la configuración de los fuses colocas nada mas " intrc_osc" y luego lo defines "DEFINE OSC 4" y listo no necesitas mas nada.Espero por tus pruebas...saludoss

PD:Ya vi la razón de esa definición, y si tiene que ver con la calibración del oscilador interno, resulta los pic con oscilador interno hay que antes de programar anotar el valor del osccal eso para que en caso de que se borre del pic poder programarselo luego. Esa instruccion segun el link que coloco es para que el PBP lo mantenga y segun mejora la sincronizacion. Revisalo y ya veras como es la cosa...saludoss

http://www.ucontrol.com.ar/forosmf/programacion-en-basic/oscilador-interno-pic12f629/


----------



## Dario (Sep 29, 2011)

bueno amigo. compile y probe el codigo que me dejaste y funciona pero aveces, al parecer seria problema de calibracion del oscilador interno. yo uso un jdm para cargar mis pics, por lo general utilizo pic16f628 y no tengo problemas. pero parece que con los pic12fxx, existe el problema de que ese programador o mejor dicho, icprog o winpic, le borra el valor de calibracion de fabrica y lo sustituye poniendo uno por defecto con lo que el oscilador interno se vuelve inestable y los programas no funcionan correctamente. encontre un firm aqui para recalibrar el oscilador interno del pic. se vale de un circuito con el que supuestamente se recalibra el oscilador intero, lo voy a probar mañana. de ultima, voy a comprar el pic y esta vez voy a tener la precaucion de copiar la linea donde sale el valor osccal y pegarla debajo del pic jeje... hasta que consiga un PIC18F2550 para hacerme un pickit usb, dicen que con ese programador no existe este problema  
despues te cuento como me fue... gracias, saludos.


----------



## J2C (Sep 29, 2011)

D@rio

En Córdoba Capital y en una empresa de estaba sobre la calle Deheza y ahora se mudo se conseguia el 18F2550, cualquier cosa te la paso por MP.

Saludos, JuanKa.-


----------



## Dario (Sep 29, 2011)

hola juanka.
bueno, mejor compartila aqui en el foro. estoy seuro que debe haber mas de 1 cordobes que se quiere hacer de un pickit y no consigue este bendito micro jejeje...
saludos


----------



## Nano24 (Sep 29, 2011)

D@rio dijo:


> hola juanka.
> bueno, mejor compartila aqui en el foro. estoy seuro que debe haber mas de 1 cordobes que se quiere hacer de un pickit y no consigue este bendito micro jejeje...
> saludos



Dario que tal, una pregunta, tienes alguna idea de como leer una LDR? e estado intentando con el comando POT y RCTIME pero nada, no se si sea el simulador proteus o es que no funciona asi.

Lo intente leyendo como entrada analogica pero no se como hacer para que me lea dos puertos a la vez.


----------



## J2C (Sep 29, 2011)

D@rio

No es mi intención hacer publicidad, lo aclaro por las dudas.

La empresa que digo es LINETEC S.A. (http://www.linetec.com.ar/) que hace poco se ha mudado al barrio de Los Boulevares a cuadra y media de la Pablo Cabrera. 

Si bien soy de Bs. As. cada tanto viajo a la Docta y suelo pasarme un mes alla; buscando componentes la ubique tiempo atras a través de la página de CIKA Electrónica, le pedire a los moderadores que la agreguen en la Wiki de Proveedores.

Espero te sea de utilidad, pues algun participante del thread https://www.forosdeelectronica.com/...-pic-memorias-puerto-usb-pickit2-clone-18080/ consiguio ahi su 18F2550.


Saludos, JuanKa.-


----------



## Dario (Sep 29, 2011)

ok, gracias che. siempre me olvido de las reglas del foro... :cabezon:cabeza dura yo... por las dudas pido perdon a los moderadores y les digo que j2c no tiene la culpa, fuy yo con la intencion de que la info les sirva a todos y no a uno solo... perdon
saludos y gracias de nuevo juanka


----------



## Chico3001 (Sep 29, 2011)

Siempre y cuando la informacion sea compartida con fines didacticos y no de promocion esta bien... 

De echo al rato la subo a la wiki a la seccion de proveedores...


----------



## Dario (Sep 29, 2011)

Chico3001 dijo:


> Siempre y cuando la informacion sea compartida con fines didacticos y no de promocion esta bien...
> 
> De echo al rato la subo a la wiki a la seccion de proveedores...


muchas gracias chico, vos siempre tan comprensivo 



> Dario que tal, una pregunta, tienes alguna idea de como leer una LDR? e estado intentando con el comando POT y RCTIME pero nada, no se si sea el simulador proteus o es que no funciona asi.
> 
> Lo intente leyendo como entrada analogica pero no se como hacer para que me lea dos puertos a la vez.


nano: subi el circuito y el codigo pbp para ver en que te puedo ayudar. saludosss


----------



## Nano24 (Oct 3, 2011)

D@rio dijo:


> muchas gracias chico, vos siempre tan comprensivo
> 
> 
> nano: subi el circuito y el codigo pbp para ver en que te puedo ayudar. saludosss



Que tal Dario?!!! pues veras esto era lo que yo queria saber y curioseando un poco me fije que el comando ADCIN uno le puede decir por cual canal leera las señales analogicas, estoy diseñando un sistema para un robot que busque la luz a través de 4 LDR, el medira cual es el nivel mas alto y escogera por donde ir, mira mas o menos mi ejemplo en este circuito, total ya logre hacer lo que queria y era medir cuatro entradas distintas de ADCIN, ADCIN 0, ADCIN 1, ADCIN 2, ADCIN 3 aca comparto estas ideas para que otros tengan una ayuda por si se ven en aprietos como yo lo estuve  



			
				Nano24 dijo:
			
		

> Que tal Dario?!!! pues veras esto era lo que yo queria saber y curioseando un poco me fije que el comando ADCIN uno le puede decir por cual canal leera las señales analogicas, estoy diseñando un sistema para un robot que busque la luz a través de 4 LDR, el medira cual es el nivel mas alto y escogera por donde ir, mira mas o menos mi ejemplo en este circuito, total ya logre hacer lo que queria y era medir cuatro entradas distintas de ADCIN, ADCIN 0, ADCIN 1, ADCIN 2, ADCIN 3 aca comparto estas ideas para que otros tengan una ayuda por si se ven en aprietos como yo lo estuve



ahhh si ves en la programacion el comando INCLUDE "modedefs.bas" es porque pienso enviarle las señales a otro PIC, a ver si puedo hacerlo estilo hexapodo.


----------



## Nano24 (Oct 4, 2011)

D@rio dijo:


> muchas gracias chico, vos siempre tan comprensivo
> 
> 
> nano: subi el circuito y el codigo pbp para ver en que te puedo ayudar. saludosss



Dario una pregunta, cuanto voltaje soporta las entradas analogicas del PIC16F877A del puerto PORTA. Es que quisiera saber cuanto voltaje logra soportar porque estoy haciendo un medidor de energía para batería pero de 12v.


----------



## J2C (Oct 4, 2011)

Nano24

Todos los µControladores de Microchip soportan como *maxima entrada analogica ó digital* una tensión *igual a Vdd ó ligeramente mayor* debida a los diodos de protección de todas las entradas.

En tu caso deberas escalar los +12V y tenerlos en cuenta en el programa que haras.

Saludos, JuanKa.-


----------



## lubeck (Oct 4, 2011)

> Es que quisiera saber cuanto voltaje logra soportar porque estoy haciendo un medidor de energía para batería pero de 12v.



Con un simple divisor de voltaje puedes acondicionar la señal....


----------



## Nano24 (Oct 4, 2011)

lubeck dijo:


> Con un simple divisor de voltaje puedes acondicionar la señal....




Y ese divisor de voltaje debe de llevar un regulador 7805? es que veras lubeck, yo tome como idea tu medidor de carga que publicaste pero lo tienes directo de la batería de 12v seguido a unas resistencias como divisor de voltaje.

Eso no quemaría el PIC como lo tienes?


----------



## lubeck (Oct 4, 2011)

> Y ese divisor de voltaje debe de llevar un regulador 7805?


No...



> yo tome como idea tu medidor de carga que publicaste pero lo tienes directo de la batería de 12v seguido a unas resistencias como divisor de voltaje.



Ese medidor de carga yo se ha armado y esta probado.... (bueno, no recuerdo de cual hablas pero casi todos los que pongo los he probado)



> Eso no quemaría el PIC como lo tienes?


No... no se quema el pic...

Claro que si requieres de alta presicion seguramente ese no es para nada el metodo adecuado...


----------



## Nano24 (Oct 4, 2011)

lubeck dijo:


> No...
> 
> 
> 
> ...



Pues si ese es el que busco de alta precisión, bueno de todas maneras gracias a ti y lo que has publicado e aprendido algunas cosas que desconocía.


----------



## Dario (Oct 4, 2011)

hola nano, me alegra que hayas solucionado lo de las ldr´s. con respecto a lo del voltaje, te recomiendo que investigues un poco el data del pic y sigas los consejos de lubeck. por otra parte les cuento que todavia sigo:cabezon: renegando con el pic12f675. compre un pic nuevo y antes de programarlo, lo lei y guarde el numero que sale en la linea final de la memoria de programa para asi agregarselo al programita que le cargo pero ni asi he tenido resultados, el pic sigue como si estuviese roto, no hace nada. ¿que puedo estar haciendo mal?  la verdad que, estoy a punto de darme por vencido, no puedo creer que esa porqueria de pic enano me tenga contra la pared:enfadado: :cabezon:
 saludosss amigos


----------



## Chico3001 (Oct 5, 2011)

Nano24 dijo:


> Pues si ese es el que busco de alta precisión, bueno de todas maneras gracias a ti y lo que has publicado e aprendido algunas cosas que desconocía.



Entonces usa un divisor con resistencias metalicas de 1% de tolerancia y un buffer con OPAMP de bajo ruido... tambien puedes añadir un optoacoplador analogico.... como el HCNR201


----------



## reyvilla (Oct 5, 2011)

D@rio dijo:


> hola nano, me alegra que hayas solucionado lo de las ldr´s. con respecto a lo del voltaje, te recomiendo que investigues un poco el data del pic y sigas los consejos de lubeck. por otra parte les cuento que todavia sigo:cabezon: renegando con el pic12f675. compre un pic nuevo y antes de programarlo, lo lei y guarde el numero que sale en la linea final de la memoria de programa para asi agregarselo al programita que le cargo pero ni asi he tenido resultados, el pic sigue como si estuviese roto, no hace nada. ¿que puedo estar haciendo mal?  la verdad que, estoy a punto de darme por vencido, no puedo creer que esa porqueria de pic enano me tenga contra la pared:enfadado: :cabezon:
> saludosss amigos



No te desesperes.

Tu programador cual es? No recuerdo creo que lo mencionaste pero no lo conseguí
que programas utiliza para programar? winpic800 tiene configuraciones aparte de los fuses
coloca tu código a ver si veo algo que tu no ves? abecés pasa que nos embotamos y no vemos bien las cosas...a mi me a pasado y cosas tan simples como configuración de OSC.

Voy a programar un pic12f675 con el código del secuencidor que coloque,  con un vídeo y lo subo en un rato para que veas como lo hago yo...saludosss


----------



## reyvilla (Oct 5, 2011)

aquí esta el vídeo tarde porque estoy aun practicando con el camtasia se los recomiendo esta muy bueno.
bueno un detalle del circuito es que el código lo había probado con el 12f629 osea funcionaba o estaba echo para el 12f629 pero para no perder tiempo lo que hice fue adaptarlo al 12f675 y por eso no tiene la secuencia que debería ni en la simulación ni en la practica, pero en fin así como en la simulación funciono en la practica, lo que si note es que puede que no este trabajando a 4mhz si no a otra frecuencia cercana por eso sigue funcionando espero que el vídeo sea lo mas explicativo posible.


----------



## Dario (Oct 5, 2011)

hola reyvilla, esta muy bueno el video. 
te cuento que yo estoy utilizando un programador jdm con el que nunca he tenido problemas. es mas, he cargado en otra ocacion pic12f675 sin ningun problema. viendo el procedimiento que usas para cargar el pic, no he notado diferencia con el que yo utilizo. estoy pensando que talvaez los pic que estoy comprando no sean muy buenos y talvez esa sea la razon por la que no puedo programarlos... te cuento que he probado un pic12f683 y he obtenido el resultado que queria y sin siquiera utilizar el valor oscal que tenia el pic de fabrica. ahora voy a probar con un pic12f629 y despues cuento que sucede. muchas gracias por tu ayuda, saludos.


----------



## reyvilla (Oct 5, 2011)

Aquí te coloco otro mas completo ahora logre corregir el problema de las secuencias y descubrí otras cosas interesantes sobre como saber si realmente esta malo el pic o no, si no puedes leer el pic porque pasa, y cuando lo lees por que dice que esta bloqueado si aun así te permite volver a grabarlo, aparte de algunos percances que desmostaron que los pic son muy buenos a pesar de una mala conexión...jejeje


----------



## Dario (Oct 6, 2011)

hola reyvilla.
ese proyecto de juego de luces esta genial... te cuento que estoy haciendo mi proyecto con el pic12f683, que es un poco mas caro, pero no me da dolores de cabeza a la hora de programar jeje... en cuanto lo tenga listo lo cuelgo aqui para compartirlo. te doy las gracias por ayudarme amigo. saludos cordiales


----------



## HAYEKER (Oct 8, 2011)

disculpen!! la molestia compañeros soy algo nuevo pero e estado leyendo y ai buenos ejemplos a seguir en este hilo pero me tope con un problema en uno de los ejemplo posteados por mecatrodos
setrata de que  quemador master prog que me sale un aviso diciendo que me faltan los bits de configuracion en el HEX toy programando un pic18f4550 apenas lo estoy empezando a usar e usa otros y sin funciona pero este no  y pido que hacer en ese caso ya e actualizado a distintas versiones el pbp y microcode studio pero sigue igual

el programa es este 


define    LOADER_USED    1
Define    RESET_ORG    800h   
Define    OSC    20        ' Define Oscilador a 48MHz
                          ' Se definen registros del LCD
Define    LCD_DREG    PORTD
Define    LCD_DBIT    4
Define    LCD_RSREG    PORTD
Define    LCD_RSBIT    2
Define    LCD_EREG    PORTD
Define    LCD_EBIT    3


' Se definen pararametros ADCIN 
Define    ADC_BITS    10             ' Establece el número de bits en el resultado
Define    ADC_CLOCK    3             ' Ajuste el reloj de origen (rc=3)
Define    ADC_SAMPLEUS    50     ' Establezca el tiempo de muestreo en uS

Medicion var    Word         ' Crear variable para almacenar resultado

TRISA = %11111111    ' Selecciona PORTA como entrada
ADCON1 = %00001010    ' Selecciona Puerto A como analogo
ADCON2 = %10000000    ' Jstifica muestro hacia la derecha
Low PORTE.2        
Pause 500                                ' pausa
inicio:    
ADCIN 0, Medicion                ' leer pin y guardar en variable medicion 
Lcdout $fe, 1                        ' limpiar LCD
Lcdout "MEDICION: ", Dec Medicion    ' mostrar valor decimal 
Pause 100                                ' pausa 
GoTo inicio                                ' Repetir proceso

End


----------



## lubeck (Oct 14, 2011)

> disculpen!! la molestia compañeros soy algo nuevo pero e estado leyendo y ai buenos ejemplos a seguir en este hilo pero me tope con un problema en uno de los ejemplo posteados por mecatrodos
> setrata de que quemador master prog que me sale un aviso diciendo que me faltan los bits de configuracion en el HEX toy programando un pic18f4550 apenas lo estoy empezando a usar e usa otros y sin funciona pero este no y pido que hacer en ese caso ya e actualizado a distintas versiones el pbp y microcode studio pero sigue igual


ya lo solucionaste?
lo que tienes que hacer es configurarlo por codigo....

Da click en la liga->


----------



## atricio (Oct 14, 2011)

disculpen la pregunta alguien dijo que habia aprendido a saber cuando el micro esta sañado o esta bloqueado cual es la tecnica que usas podrian explicarme un poco por favor


----------



## reyvilla (Oct 16, 2011)

atricio dijo:


> disculpen la pregunta alguien dijo que habia aprendido a saber cuando el micro esta sañado o esta bloqueado cual es la tecnica que usas podrian explicarme un poco por favor



Hola yo lo que descubrí es como saber si un pic12f675/629/509/508 todos de la gama baja con oscilador interno aun funciona a pesar de no tener el valor original del osccal, el cual es un valor casi único para cada pic y es para la calibración del oscilador interno yo particularmente habré botado unos 20 PIC12F, creyendo que los había quemado ya que no funcionaban y resulta es que no guardaba el valor del osccal, ahora a pesar de no tener ese valor puedo seguir utilizando el pic sin ningún problema colocando un valor de otro pic, en el vídeo esta la demostración.

PD: Aclaro que el echo de que funcione no quiere decir que este calibrado con el valor que lo coloquemos, puede ser un valor cercano al original mas no es el original.


----------



## Dario (Oct 16, 2011)

bueno, ami me ha ido muy mal con esos pic12f:enfadado: afortunadamente, no pasa lo mismo con los 12f683 aunque son un poco mas caros... estuve probando con los 12f629 y solo tube problemas con uno de dos. estos cuestan 2 veces menos dinero que un f683 jeje... bueno, esa es mi experiencia con los enanos de microchip... 
saludosss


----------



## atricio (Oct 16, 2011)

disculpen mi pregunta la verdad es que tube una experiencia con un 16F873A lo programaba me corria y se quedaba quieto bueno lo programaba una vez mas se quedabo muerto pero la pickit2 me la reonocia como que si estaba vivo asi me paso con 2 mas de esos micros los queria reprogramar pero nada a pasar que los reconocia la programadora la verdad no entiendo lo que me paso un pana me dijo que talvez se bloqueo por eso no funcionaba la verdad no se si sea esto verdad


----------



## ferdy575 (Oct 17, 2011)

D@rio dijo:


> bueno, ami me ha ido muy mal con esos pic12f:enfadado: afortunadamente, no pasa lo mismo con los 12f683 aunque son un poco mas caros... estuve probando con los 12f629 y solo tuve problemas con uno de dos. estos cuestan 2 veces menos dinero que un f683 jeje... bueno, esa es mi experiencia con los enanos de microchip...
> saludosss


 
Hola Dario, no se si te informo bien pues todavía estoy un poco "buñuelo" en esto y me perdonas sí me equivoco pero creo que estos picsitos son tecnología "picaxe" ¿no te iría mejor sí lo trabajas con el "picaxe programing editor"?


----------



## mecatrodatos (Oct 17, 2011)

Que tal les anexo parte del libro que estoy realizando desde la utilizacion de pic 12 f hasta el  18f, espero sea de su agrado esta en formato  pdf


----------



## Dario (Oct 17, 2011)

ferdy575 dijo:


> Hola Dario, no se si te informo bien pues todavía estoy un poco "buñuelo" en esto y me perdonas sí me equivoco pero creo que estos picsitos son tecnología "picaxe" ¿no te iría mejor sí lo trabajas con el "picaxe programing editor"?


no hay problemas 
estos pics son de microchip. los picaxe, son de la revolution education. esta les compra los pics vacios a microchip y les inserta un firmware capaz de interpretar directamente el lenguaje pic basic que por cierto es ligeramente diferente al pbpro que utilizamos aqui. a estos picaxe se les carga directamente el archivo .BAS mientras que con los pics normales hay que compilar el archivo .BAS para obtener el hexa y recien cargar el pic con este ultimo.
un saludo. 
amigo meca: tanto tiempo  estoy bajando tu archivo para hcharle un vistazo.
saludosss


----------



## chapin (Oct 17, 2011)

gracias mecatrodatos se esta muy bueno


----------



## HAYEKER (Oct 21, 2011)

ya lo solucionaste?
lo que tienes que hacer es configurarlo por codigo....

no lubeck todavia y y pues meti el codigo con @ y asm y no funciona me sale errores al campilar
y ya actualice el PBP y el micro code y nada sigue apareciendo
que mas podria acerrr??

graciass saludoss!!


----------



## lubeck (Oct 21, 2011)

> que mas podria acerrr??



Que error te pone???

Eliminaste la lineas del archivo 18f4550.inc???

Ver el archivo adjunto 59029


----------



## HAYEKER (Oct 21, 2011)

Eliminaste la lineas del archivo 18f4550.inc???

pues puse el codigo qu avias puesto en tu codigo del link de la liga y pues me salen estos errores







que creees q podria serr???

 graciass  saludoss!!



http://www.subirimagenes.com/privadas-dibujo-1647643.html

jeje creo q todavia nose insertar imagenes ese es el link


----------



## Dario (Oct 22, 2011)

bueno para empezar, les cuento que estoy intentando hacer un cronometro de 4 digitos con un pic 16f628A y practicamente, lo he logrado jeje... como ahora tengo que pasar al protoboard, necesito hacer que aumente la cuenta cada 1 segundo y bueno, ese es mi problema, que no se como insertar esa base de tiempos en el programa porque por ejemplo: si coloco un pause 500, el multiplexado de los digitos se frena y deja de funcionar correctamente... ¿como puedo hacer?  les dejo el rar con el diseño en proteus y el codigo en pbp para ver si pueden darme una manito jeje  saludosss
nota: (el tiempo de multiplexado esta asi para poder ver el cambio de digitos)


----------



## lubeck (Oct 22, 2011)

HAYEKER dijo:


> Eliminaste la lineas del archivo 18f4550.inc???
> 
> pues puse el codigo qu avias puesto en tu codigo del link de la liga y pues me salen estos errores
> 
> ...



mira este video...





recuerda que la fam 18 se compila con MPASM (yo tengo el 5.20), y tu proyecto debe estar lo mas cerca del directorio raiz (ejmplo: C:\miprojecto\18f4550.pbp)


----------



## Dario (Oct 22, 2011)

bueno, finalmente encontre la solucion al problema que tenia.  solo tuve que aumentar una variable mas y hacer contar el numero de veces que la etiqueta display se repetia  
saludosss


----------



## lubeck (Oct 22, 2011)

es como te digo, pero no se la instruccion... busca como se escribe en labview  el puerto como por ejemplo

writeport 890,&B10000

aprovecho para corregir el puerto de control es el 890 no el 889...


----------



## Dario (Oct 23, 2011)

hola gente que tal?
bueno, les cuento que estoy con esto del cronometro todavia jeje... les cuento que funciona pero atraza... bueno, lo que quisiera saber como podria hacer para obtener un conteo correcto ya que, no puedo lograr que el aumento de la cuenta sea exactamente cada un segundo. alguien me ayuda un poquito?  aca les dejo el codigo en pbp para que lo vean y me digan como puedo hacer... ¿talvez utilizando el tmr0?
saludosss


```
@ DEVICE MCLR_OFF, XT_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
  define OSC 4
  cmcon=7
  TrisA=%00001110
  TrisB=%00000000
  PORTA = %00000110
  PORTB = %00000000
  numero2 var word
  numero var word
  contador var word
  unid var byte
  dece var byte
  cent var byte
  mile var byte
  contar var porta.3
  encera var porta.2
  pausa var porta.1
  activar var bit
  numero=0
  numero2=0
  contar=0
  goto display2
  
  encerar:
  numero = 0
  goto display
  
  aumen:
  numero2=numero2+1
  if numero2>99 then numero2=0
  goto encerar 
  

  display:
  unid=numero dig 0
  dece=numero dig 1
  cent=numero2 dig 0
  mile=numero2 dig 1 
  portb=224+mile
  pause 5
  portb=208+cent
  pause 5
  portb=176+dece
  pause 5
  portb=112+unid
  pause 5
  contador=contador+1
  gosub teclas
  goto display
  
  teclas:
  high porta.0
  if contador=50 then sumar
  if encera=0 then resetear
  if pausa=0 then display2
  activar=1
  return
  
  sumar:
  if activar=0 then return
  activar=0
  numero=numero+1
  low porta.0
  contador=0
  if numero>59 then aumen
  return 
  
   resetear:
 numero=0
 numero2=0
 if contar=1 then display
 goto display2 
 
  display2:
  unid=numero dig 0
  dece=numero dig 1
  cent=numero2 dig 0
  mile=numero2 dig 1 
  portb=224+mile
  pause 5
  portb=208+cent
  pause 5
  portb=176+dece
  pause 5
  portb=112+unid
  pause 5
  high porta.0
  if contar=1 then display
  if encera=0 then resetear
  goto display2 
  end
```


----------



## lubeck (Oct 23, 2011)

> ¿talvez utilizando el tmr0?



Lamento informarte mi estimado Dario, que yo creo que si necesitarias un Timer para lograr un poco de presicion, yo no he hecho nada parecido, pero creo, y solo digo que creo(si ves algo que me contradiga creele mas ), que para lograr presicion puedes utilizar un oscilador adicional de 3.57mHz como auxiliar, osea aparte del que ya usas si es externo... por algun lado vi un proyecto que lo hacia asi...


----------



## Dario (Oct 23, 2011)

lubeck dijo:


> Lamento informarte mi estimado Dario, que yo creo que si necesitarias un Timer para lograr un poco de presicion, yo no he hecho nada parecido, pero creo, y solo digo que creo(si ves algo que me contradiga creele mas ), que para lograr presicion puedes utilizar un oscilador adicional de 3.57mHz como auxiliar, osea aparte del que ya usas si es externo... por algun lado vi un proyecto que lo hacia asi...


osea, ¿sacar señal de reloj del cristal del micro e introducirla en un pin del mismo y procesarla de tal forma que se pueda obtener una base de tiempos de un segundo mas precisa?
saludosss


----------



## lubeck (Oct 23, 2011)

D@rio dijo:


> osea, ¿sacar señal de reloj del cristal del micro e introducirla en un pin del mismo y procesarla de tal forma que se pueda obtener una base de tiempos de un segundo mas precisa?
> saludosss



estuve tratando de buscar donde lo vi.... pero no lo encuentro...

la teoria es que se utiliza el timer0 y su respectiva interrupcion, pero el puerto RA4 se configura para utilizar el TOCK1 o sea un reloj de entrada y me parece que el pulso de reloj lo hacia el oscilador de 32.768Hz... o algo asi.. 

si lo encuentro lo posteo...

mira creo que si estoy bien en la teoria....

https://www.forosdeelectronica.com/f24/reloj-despertador-pic-cristal-32-768khz-22387/


----------



## Dario (Oct 23, 2011)

que bueno. veo que al parecer esta programado en pic basic, le voy a hechar un vistazo aver que puedo sacar de ahi... gracias amigo


----------



## lubeck (Oct 23, 2011)

> esta programado en pic basic



parece estar en basic del Pic simulator IDE, toma en cuenta que estaba equivacado en que se usa el timer0 y el RB4, se usa el Tmr1 y el RB7/RB6, para pulsar(no se como se diga) el timer, y si estaba bien en que se usa la interrupcion para incrementar el tiempo....

pues hasta ahi te dejo encaminado...


----------



## Dario (Oct 23, 2011)

lubeck dijo:


> parece estar en basic del Pic simulator IDE, toma en cuenta que estaba equivacado en que se usa el timer0 y el RB4, se usa el Tmr1 y el RB7/RB6, para pulsar(no se como se diga) el timer, y si estaba bien en que se usa la interrupcion para incrementar el tiempo....
> pues hasta ahi te dejo encaminado...



si, parece que para los botones se usan las interrupciones por rb4 a rb7 y el aumento de la cuenta se haria mediante el timer1 si no me equivoco.


----------



## HAYEKER (Oct 24, 2011)

superr!! graciasss lubeck si funciona muchisimas graciasss!!

y que tengas un buen dia!

graciass saludoss!!


----------



## Dario (Oct 25, 2011)

bueno amigo lubeck, consegui hacer que el contador avance en funcion de una interrupcion utilizando el tmr0 para producir una interrupcion cada 50ms y asi repetirla 20 veces para obtener 1 segundo. lamentablemente no logro la precision que quiero...  atrasa 1 seg por minuto...  aca dejo el codigo esta vez sin botones. aver si me pueden dar una manito porfas. y me dicen en que estoy metiendo la pata... 
saludosss



```
@ DEVICE MCLR_OFF, XT_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
DEFINE OSC 4
  cuenta var byte
  numero2 var word
  numero var word
  unid var byte
  dece var byte
  cent var byte
  mile var byte
  contar var porta.3
  encera var porta.2
  pausa var porta.1
  
  trisb=0
  cmcon=7
  cuenta=0
  numero=0
  numero2=0
     
  OPTION_REG = %0000111   ' Configuración del Registro OPTION 
        INTCON = %10100000    ' Configuración del Registro INTCON           
        ON INTERRUPT GOTO interrup 
  display: 
  unid=numero dig 0
  dece=numero dig 1
  cent=numero2 dig 0
  mile=numero2 dig 1 
  portb=224+mile
  pause 5
  portb=208+cent
  pause 5
  portb=176+dece
  pause 5
  portb=112+unid
  pause 5
  goto display
  
  ;************** Handler de interrupciones para incrementar contador *************** 
DISABLE                 ;deshabilita interrupciones durante el proceso 
interrup: 
 cuenta = cuenta + 1          ;cuenta las interrupciones del TMR0 
 TMR0=61       ;resta 61 al contador de 256 del TMR0 
 
        IF cuenta < 20 THEN reset      ;20 cuentas
        cuenta = 0 
        numero = numero + 1 
        IF numero >= 60 THEN 
            numero = 0 
            numero2 = numero2 + 1 
           IF numero2 >= 99 THEN 
            numero2 = 0  
            ENDIF 
            ENDIF
 reset:  
      INTCON.2 = 0           ;resetea la bandera de interrupción del TMR0 
 
      RESUME 
      END
```


----------



## lubeck (Oct 25, 2011)

si no me equivoco, no creo que lo logres sin el cristal de 32.768Hz, a menos que con el tmr0 logres exactamente esa frecuencia... ademas de que el codigo que ocupas para la interrupcion tambien "consume" un  tiempo determinado aunque sean nanosegundos que hace que varie el tiempo...

por eso la razon de hacerlo con el cristal en rb6 y rb7, este es el que va desencadenando el conteo del tmr1, y no importa como hagas el codigo o que cristal uses en el micro, ese tiempo en tmr1 nunca va a variar....

otra manera es que compres un ds1307 que tambien lleva un crisital de 32.768Hz...


----------



## lem1 (Oct 25, 2011)

buenas tardes soy nuevo en esto estoy haciendo un pequeño proyecto en basic y tengo par de problemas entre aqui porque me lo han recomendado muchos y de los post que he visto me ayudado vastante... bueno el proyectico que estoy haciendo es que trato de recibir 4 señales analogicas para llevarlas a presentarse un una lcd 16x2 pero alli comienza mi problema porque ni detecta la señal de entrada y en la lcd me salen unos cuadritos negros en la primera fila e leido que tiene que ver con la configuracion del pic pero ya me he leido sopotocientos manuales de lcd y a/d y nada alguna orientacion sobre el caso... bueno las señales las recibo de la siguiente manera 2 vienen de unos transformadores y las otras dos de un sensor de corriente de la famiia allegro el asc712.. lo que estoy tratando de hacer practicamente es un voltimetro y un amperimetro con la misma lcd cada linea para cada 2 variables. gracias aqui anexo como tengo en este momento la configuracion  de la lcd y los accon

'**************************************************** 
Device=16F877A
XTAL= 4
'****************************************************
'  configuarción de los puertos y los regitros
'****************************************************
TRISA =%00000011
TRISC =%00000000 
TRISD =%00000000                      
ADCON1 =%10000001
ADCON0 =%01000101 

'*******************************************************
' declaraciones
'******************************************************* 
 DelayUS 2000
Declare	LCD_DTPIN  PORTB.4	
Declare	LCD_RSPIN  PORTB.3
Declare	LCD_ENPIN  PORTB.2
Declare	LCD_INTERFACE4	
Declare LCD_LINES2
Declare LCD_TYPE0
Declare ADIN_TAD8_fosc					
Declare ADIN_STIME100					
Declare ADIN_RES8
'****************************************************
'  definicion de las variables
'****************************************************            
Dim  valor1  As Word 
Dim  valor2  As Word
Dim  valor3  As Word
Dim  valor4  As Word
Dim  acumulaa As Word
Dim  acumulab As Word
Dim  acumulac As Word
Dim  acumulad As Word
Dim  medir   As Byte
Dim  voltaje1 As Float
Dim  voltaje2 As Float
Dim intensidad1 As Float
Dim intensidad2 As Float


----------



## lubeck (Oct 25, 2011)

> estoy haciendo un pequeño proyecto en basic



que basic estas usando, en este tema se ve el Pic Basic Pro, hay otros temas dedicados a otros Basics(proton, etc)


----------



## lem1 (Oct 25, 2011)

ok si es pro hermano pero lo que preguntaba era una idea en la que me podria encaminar para arreglarlo o hacer alguna modificacion una idea?


----------



## lubeck (Oct 25, 2011)

mmm a tu codigo le falta mucho....

y si ves primero esto...
https://www.forosdeelectronica.com/f24/solo-ejemplos-picbasicpro-proteus-39938/#post328872
muchos usamos el proteus para simularlo...


----------



## pablo 1 (Oct 25, 2011)

Hola amigos , quiero empezar a aprender a programar pic , y por lo que se ,el pic basic pro , es el mas fácil para empezar .
_me gustaría saber ¿ Que necesito para poder cargar el programa que haga en lenguaje basic pro ? Porque yo compre este un Programador De Pic Y Memorias Eeprom. _Buscar en Mercadolibre: MLA-129318691-programador-de-pic-y-memorias-eeprom-soporta-microwire-_JM_ ¿Este programador me sirve ?

espero que me puedan orientar .saludos


----------



## J2C (Oct 25, 2011)

Pablo1

Cuando te dije que miraras en este thread, te aclare que empezaras por *la página 1!!!*.

Estan llenas de ejemplos las 75 páginas previas y tu preguntas cosas que ya han sido respondidas.


Saludos, JuanKa.-


----------



## lubeck (Oct 25, 2011)

mira... ya esta super explicado durante el tema eso, pero entiendo un poco que son un monton de mensajes y terminaras confundiéndote mas... ahi te va.



> ¿ Que necesito para poder cargar el programa que haga en lenguaje basic pro ?


para que sea facil minimo necesitas 
-el  microcode studio plus -es un editor para facilitar hacer el programa
-el picbasic pro- es el que compila y genera un archivo con extencion .Hex
-el winpic 800- es el que carga en tu pic con el  programador el archivo Hex que compilaste
-tu programador JDM



> ¿Este programador me sirve ?


si. si te sirve...

fijate que programas tiene en el CD que trae, si tiene el winpic, icprog o algun otro...

*Edito:*
 bueno lo mejor es lo que te dice juanka...


----------



## J2C (Oct 25, 2011)

Lubeck

Si quiere escribir el programa en Pic Basic Pro y directamente cargarlo al PIC como dice en su mensaje, no tiene la menor idea que debe ENSAMBLARLO (pasarlo a ASM y a HEX) antes de usar el Programador!!.

Le dije que viniera aqui por que lo habian "moderado".


Saludos, JuanKa.-


----------



## lubeck (Oct 25, 2011)

ok, si me di cuenta.... lo que se hizo simpatico es que pense exactamente lo mismo que escribiste antes de de que se grabara el mensaje que estaba escribiendo....

a ver si capta el amigo...

Saludos Juanka!


----------



## lem1 (Oct 26, 2011)

ok lubeck ya voy a checar lo que pusistes gracias..... y gracias por decir que estoy en pañales aun jejejejejeje


----------



## pablo 1 (Oct 26, 2011)

Gracias  JuanKa y lubeck  por sus respuestas , voy a leer detenidamente  75 páginas previas para ir aprendiendo .
Estoy contento porque el programador JDM que compre , me va a servir ...jejejejejeje
Respondiendo a tu pregunta ,si el programador me vino con varios programitas (winpic, icprog , PonyProg) yo uso el ponyprog para grabar las memorias eeprom de televisores .(Me dedico a  reparar televisores ).
bueno voy a leer detenidamente 75 páginas previas . En cualquier momento lo estaré molestando de nuevo con preguntas jejejeje .
A.. disculpen si hice preguntas que ya estaban respondidas a lo largo del  Curso programacion de pic en bsic pro . lo que pasa que estaba en el cyber y estaba medio con poco tiempo .espero que no se hayan ofendidos , no lo hice de vago de no querer leer ....saludos


----------



## Nano24 (Oct 26, 2011)

lubeck dijo:


> ok, si me di cuenta.... lo que se hizo simpatico es que pense exactamente lo mismo que escribiste antes de de que se grabara el mensaje que estaba escribiendo....
> 
> a ver si capta el amigo...
> 
> Saludos Juanka!



Hola Lubeck, te tenia una pregunta, no sabes donde pueda conseguir algun manual que me diga como manejar una CMUCAM para conectarla a un Pic en lenguaje picbasic? descargue un libro y medio logre traducir algunas partes y dan unos ejemplos, no se si tu tienes alguna experiencia en este tema y me ayudes.

Esta es una porción de un ejemplo del libro:



Ejemplo en picbasic:


```
‘CMU tracking program
‘By J. Iovine
define osc 16
recdata var byte[10]
x var byte
confid var byte
trisb = 0
portb = 0
pause 1500
serout port.1,6,[“CMU Prg.”]
serout portb.2,2,[“RS”, 13]
pause 1250
‘Reset CMU camera
serout portb.2,2,[“RS”, 13]
262 Chapter Fourteen
gosub display
‘Turn green CMU LED on
serout portb.2,2,[“L1 1”,13]
gosub display
portb.3 = 1
‘Turn on auto lighting adjust & fluorescent band filter ***
serout portb.2,2,[“CR 45 7 18 44”, 13]
gosub display
serout portb.1,6,[“A L”] ‘Auto lighting adjustment
pause 20000 ‘Hold 20 seconds
‘Turn off auto lighting adjust
serout portb.2,2,[“CR 18 44 19 32”, 13]
gosub display
‘Turn green CMU LED off
serout portb.2,2,[“L1 2”,13]
gosub display

portb.3 = 0
‘Set poll mode1
packet
serout portb.2,2,[“PM 1”, 13]
pause 100
‘Set raw data
serout portb.2,2,[“RM 3”, 13]
for x = 0 to 10 ‘Blink red LED to tell user to ready target
portb.3 = 1
pause 250
portb.3 = 0
pause 250
next x
portb.6 = 1 ‘Track LED on
‘Track window command looks at center of CMU window
‘Grabs data and sends it to track color function
‘Track:
serout portb.2,2,[“TW”, 13]
pause 2000
portb.6 = 0 ‘Track LED off
main:
Color Robotic Vision System 263
portb.3 = 1
‘Send commandtrack
color (with no arguments)
‘Will track last color grabbed by TW command
serout portb.2,2,[“TC”, 13]
‘Gather the m statistics packet from TW command
serin2 portb.0,84,[str recdata\10]
confid = recdata[9]
if recdata[2] > 50 and confid > 20 then left ‘MMX
if recdata[2] < 40 and confid > 20 then right ‘MMX
if recdata[8] < 175 and confid > 25 then fwd ‘PIX
if recdata[8] > 200 and confid > 25 then bwd ‘PIX
serout portb.1,6,[254,1,“S”] ‘Stop
portb.3 = 0
pulsout portb.4, 668 ‘Right servo stop
pulsout portb.5, 676 ‘Left servo stop
pause 18
portb.3 = 1
goto main
left:
serout portb.1,6,[254,1,“L”, #recdata[2]]
for x= 1 to 7
pulsout portb.4, 696 ‘Right servo forward
pulsout portb.5, 676 ‘Left servo stop
pause 20
next x
goto main:
right:
serout portb.1,6,[254,1,“R”,#recdata[2]]
for x= 1 to 7
pulsout portb.4, 668 ‘Right servo stop
pulsout portb.5, 648 ‘Left servo forward
pause 20
next x
goto main:
fwd:
serout portb.1,6,[254,1,“F”,#recdata[8]]
for x= 1 to 7
pulsout portb.4, 696 ‘Right servo forward
pulsout portb.5, 648 ‘Left servo forward
pause 20
next
264 Chapter Fourteen
goto main:
bwd:
serout portb.1,6,[254,1,“B”,#recdata[8]]
for x= 1 to 7
pulsout portb.4, 640 ‘Right servo backward
pulsout portb.5, 704 ‘Left servo backward
pause 20
next x
goto main:
display:
serin2 portb.0,84,20,main,[str recdata\3]
for x = 0 to 3
serout2 portb.1,16468,[“ ”,recdata[x]]
next x
pause 1500
serout2 portb.1,16468,[254,1]
return
```


----------



## lubeck (Oct 27, 2011)

> no sabes donde pueda conseguir algun manual que me diga como manejar una CMUCAM para conectarla a un Pic en lenguaje picbasic?



nop....

pero mira este manual ahi estan todos los comandos seriales...

http://cmucam.org/wiki/Documentation

en el apartado de applications el que dice CMUcam2 MAnual


----------



## Dario (Oct 27, 2011)

hola amigos. perdon por desentonar este tema pero les queria compartir la solucion al cronometro de 4 digitos con pic16f628. solo tuve que experimentar un poco con el valor cargado al tmr0 y cambiar el valor de 61 por 65 y listo.  a continuacion, el codigo.
saludosss


```
@ DEVICE MCLR_ON, XT_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
DEFINE OSC 4
  cuenta var byte
  numero2 var word
  numero var word
  unid var byte
  dece var byte
  cent var byte
  mile var byte
  contar var porta.3
  encera var porta.2
  pausa var porta.1
  
  trisb=0
  cmcon=7
  cuenta=0
  numero=0
  numero2=0
     
OPTION_REG = %0000111   ' Configuración del Registro OPTION 
INTCON = %10100000    ' Configuración del Registro INTCON
ON INTERRUPT GOTO interrup
inicio:
cuenta=0
if contar=0 then display
goto display2
      
  display: 
  unid=numero dig 0
  dece=numero dig 1
  cent=numero2 dig 0
  mile=numero2 dig 1 
  portb=224+mile
  pause 2
  portb=208+cent
  pause 2
  portb=176+dece
  pause 2
  portb=112+unid
  pause 2
  gosub teclas
  goto display
  
  display2: 
  unid=numero dig 0
  dece=numero dig 1
  cent=numero2 dig 0
  mile=numero2 dig 1 
  portb=224+mile
  pause 2
  portb=208+cent
  pause 2
  portb=176+dece
  pause 2
  portb=112+unid
  pause 2
  goto inicio
  
  teclas:
      if pausa=0 then inicio
      return
      
    
  
;************** Handler de interrupciones para incrementar contador *************** 
DISABLE                 ;deshabilita interrupciones durante el proceso 
interrup: 
    cuenta = cuenta + 1        
 TMR0=65       
 
        IF cuenta < 20 THEN reset      
        cuenta = 0
        numero = numero + 1 
        IF numero >= 60 THEN 
            numero = 0 
            numero2 = numero2 + 1 
           IF numero2 >= 99 THEN 
            numero2 = 0  
            ENDIF 
            ENDIF
 reset:  
      INTCON.2 = 0           ;resetea la bandera de interrupción del TMR0 
 
      RESUME 
      END
```


----------



## torres.electronico (Nov 4, 2011)

D@rio dijo:


> hola amigos. perdon por desentonar este tema pero les queria compartir la solucion al cronometro de 4 digitos con pic16f628. solo tuve que experimentar un poco con el valor cargado al tmr0 y cambiar el valor de 61 por 65 y listo.  a continuacion, el codigo.



Hola Dario, como andas... disculpame por no responder anteriormente, me perdi tu topico.
Che, mira, yo hice exactamente lo mismo con menos recursos y mas sencillo para un sistema experimental de carreras 1/4 milla... osea, con tan solo un 16f877, me arme el cronometro y el resto de los puertos los use para los semaforos y sensores...
Para no tomar muchas lineas de programacion en el ontrol de los display, implemente el CD4026, que es un array-driver de display led 7 segmentos, que funciona por pulsos... Osea, segun la cantidad de pulsos que le das a clock, tenes un numero dado en el display... lastima que no tengo a mano las cosas asi te muestro, pero con la hoja de datos te vas a dar cuenta que es muy basico el manejo, ya que son dos pines de control... uno que es el clock, y el otro que es el reset que lo pone a cero....
el comando que implemente es pulsout 
Igualmente, te felicito por tu trabajo


----------



## ferdy575 (Nov 6, 2011)

Por fa' ¿alguien sabe sí es posible controlar 2 LCD 2x16 con un 16f877a? y sí es así como lo puedo hacer como los controlo en el MCS para enviar mensajes distintos a cada uno de ellos? o como envio mensajes independientes a cada una de las 4 lineas? he estado tratando de muchas formas y no me ha sido posible por favor ayudenme con esto, y conseguir en el mercado de mi pais un LCD de 4 lineas es practicamente imposible, les agradezco su ayuda.


----------



## Trinquete (Nov 6, 2011)

D@rio dijo:


> hola amigos. perdon por desentonar este tema pero les queria compartir la solucion al cronometro de 4 digitos con pic16f628. solo tuve que experimentar un poco con el valor cargado al tmr0 y cambiar el valor de 61 por 65 y listo.  a continuacion, el codigo.
> saludosss
> 
> 
> ...


 
Hola Dario,he cargado ese codigo y no me funciona.
Un saludo.


----------



## lubeck (Nov 6, 2011)

ferdy575 dijo:


> Por fa' ¿alguien sabe sí es posible controlar 2 LCD 2x16 con un 16f877a? y sí es así como lo puedo hacer como los controlo en el MCS para enviar mensajes distintos a cada uno de ellos? o como envio mensajes independientes a cada una de las 4 lineas? he estado tratando de muchas formas y no me ha sido posible por favor ayudenme con esto, y conseguir en el mercado de mi pais un LCD de 4 lineas es practicamente imposible, les agradezco su ayuda.


mi opinion es que trates de conseguir un lcd de 4 lineas, si de plano no puedes... entonces te sugiero que utilices 2 pic esclavos que controlen cada  lcd(puede ser serial USART o I2C), porque otra alternativa  con un solo pic seria utilizando ensamblador(el cual puede ser echo desde picbasic) ¿dificil?... Siiiii. creo 
espero te sirva mi consejo...


----------



## Dario (Nov 6, 2011)

Trinquete dijo:


> Hola Dario,he cargado ese codigo y no me funciona.
> Un saludo.


¿que problema tenes? ¿que hace?
saludos


----------



## Nano24 (Nov 7, 2011)

Hola amigos pues por aca traigo un programita que estaba diseñando, se trata de un teclado alfabetico aunque tengo un problema que no puedo resolver, el programa se compone de 9 teclas para escribrir el abecedario completo funciona parecido al sistema de los celulares, bueno ahora el problema es que nose como hacer para que escriba en cualquier parte de la pantalla, me podrian ayudar amigos?


----------



## reyvilla (Nov 8, 2011)

Hola nano realice unas pruebas con tu circuito y lo mejore y modifique un tanto, ya puedes escribir en cualquier parte que te desplaces en la lcd, puedes bajar, subir, ir a la izquierda o la derecha y en cualquier punto que estes colocado puedes empezar a escribir, el teclado que coloque es uno matricial para simplificar el código un poco, aunque el teclado tiene las teclas A,B,C Y D , puedes seleccionar cualquier letra del abecedario con las teclas de arriba y abajo, dejándola pulsada por un tiempo se empiezan a desplazar todas las letras y los caracteres son 50 pueden ser mas con una pequeña modificacion en el comando LOOKUP, y el contador del mismo, dejo esto como aporte al foro en caso de que alguien mas lo necesite espero sirva como ejemplo aunque aun le falta bastante es un buen comienzo...saludosss


----------



## Nano24 (Nov 8, 2011)

reyvilla dijo:


> Hola nano realice unas pruebas con tu circuito y lo mejore y modifique un tanto, ya puedes escribir en cualquier parte que te desplaces en la lcd, puedes bajar, subir, ir a la izquierda o la derecha y en cualquier punto que estes colocado puedes empezar a escribir, el teclado que coloque es uno matricial para simplificar el código un poco, aunque el teclado tiene las teclas A,B,C Y D , puedes seleccionar cualquier letra del abecedario con las teclas de arriba y abajo, dejándola pulsada por un tiempo se empiezan a desplazar todas las letras y los caracteres son 50 pueden ser mas con una pequeña modificacion en el comando LOOKUP, y el contador del mismo, dejo esto como aporte al foro en caso de que alguien mas lo necesite espero sirva como ejemplo aunque aun le falta bastante es un buen comienzo...saludosss



 Muchas gracias amigo eso me va a ayudar mucho en otras ideas, te quedo super bien  lo que pasa es que quiero guardar una serie de nombres en la memoria del PIC y al escribirlas el determine si es correcto y la muestre en la LCD


----------



## pimpedadrian (Nov 9, 2011)

hola espere que me puedan ayudar 

actualmente estoy usando en PBP y el pic18f4550

y cuando uso el envio de datos buffetout todo me va de maravilla 

el problema es que cuando quiero recibir datos bufferin ya funciona bien 

este es el codigo que tengo:


```
USBBufferSizeMax   con 8  ' maximum buffer size
USBBufferSizeTX    con 8  ' input 
USBBufferSizeRX    con 8  ' output

' the USB buffer...
USBBuffer        Var Byte[USBBufferSizeMax] 
USBBufferCount   Var Byte 
Symbol USBON = PORTC.6 
Symbol USBOFF = PORTC.7  
Temp var word
DEFINE  ADC_BITS        8 

TRISD= 0
PORTD= 0
TRISC.7= 0
TRISC.6= 0
USBON=0
USBOFF=0
TRISA=1
ADCON0=%00100011
ADCON1=%00000000
ADCON2=%00001000 
' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBService every couple  *
' * of milliseconds or so...                                 *
' ************************************************************
usbinit
ProgramStart: 
 
   USBOFF = 0
   USBON = 1
   ADCIN 0,Temp
   usbservice
   USBBuffer[7]=Temp 
   gosub DoUSBOut
   gosub dousbin
   PORTD= USBBuffer[1]
   goto ProgramStart  
' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
  If PORTC.0 = 0 Then FUERA2 'CONTROLO SI SE DESCONECTÓ DE USB
   USBBufferCount = USBBufferSizeRX              ' RX buffer size
   USBService                                    ' keep connection alive
   USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   ' read data, if available
   return
    
' ************************************************************
' * wait for USB interface to attach                         *
' ************************************************************
DoUSBOut:
  If PORTC.0 = 0 Then FUERA2 'CONTROLO SI SE DESCONECTÓ DE USB
   USBBufferCount = USBBufferSizeTX              ' TX buffer size
   USBService                                    ' keep connection alive
   USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
   return
   
'sin usb 
   FUERA2:                               'COMIENZO LAZO CERRADO HASTA                                        'VOLVER A CONECTAR A USB
   USBOFF = 1
   USBON = 0


   If PORTC.0 = 1 Then programStart     'CONTROLO SI SE CONECTÓ A USB
   GoTo FUERA2	                         'CIERRO EL LAZO EJEMPLO DE ACTIVIDADES QUE
```

Gracias


----------



## arturouc (Nov 10, 2011)

mecatrodatos dijo:


> Que tal les anexo parte del libro que estoy realizando desde la utilizacion de pic 12 f hasta el  18f, espero sea de su agrado esta en formato  pdf



Gracias Mecatrodatos
pregunta alguien
ha manejado el modulo QEI del 18f2431


----------



## lubeck (Nov 10, 2011)

> pregunta alguien
> ha manejado el modulo QEI del 18f2431



Quien pregunto???

suena interesante ese modulo 

va de lujo para este tipo de encoders no?


----------



## arturouc (Nov 10, 2011)

lubeck dijo:


> Quien pregunto???
> 
> suena interesante ese modulo


Que tal Lubeck
estoy manejando un encoder incremental de un servomotor industrial
con el 16f877 y PIC Basic Pro pero me quiero cambiar al
18f2431 que tiene un modulo especial para los encoders

es un driver para controlar servomotores de un robot industrial
este es el prototipo que tengo





TRAYECTORIA LINEAL


----------



## lubeck (Nov 10, 2011)

Esta muy bueno el proyecto, me encanta ver esos robots...

con respecto al 18f2431... estoy tratando de simularlo pero hasta ahorita no lo logro  lo estaba haciendo en el simulator ide pero no me incrementa el registro de la posicion ni la interrupcion... lo voy a intentar con el proteus.... 

si me sale algo te paso lo que he conseguido... hasta pronto...


----------



## arturouc (Nov 10, 2011)

lubeck dijo:


> Esta muy bueno el proyecto, me encanta ver esos robots...
> 
> con respecto al 18f2431... estoy tratando de simularlo pero hasta ahorita no lo logro  lo estaba haciendo en el simulator ide pero no me incrementa el registro de la posicion ni la interrupcion... lo voy a intentar con el proteus....
> 
> si me sale algo te paso lo que he conseguido... hasta pronto...



este es un ejemplo que publico autotronico en la pag. 55 post _#1096_

ejemplo de autotronico

es el 18f4331


----------



## lubeck (Nov 10, 2011)

ya no entendi... 


lo que tu buscas es saber si alguien ha tenido una experiencia fisica con el QEI,?
porque en ese ejemplo esta como se configura... no?

pd.. por cierto yo no puedo simular el ejemplo de proteus tu si?


----------



## reyvilla (Nov 10, 2011)

logre programar una eeprom externa en el proteus generando un archivo tipo .bin binario les dejo otro video mas para que vean de que se trata se seguro les ayudara a unos cuantos...saludoss


----------



## arturouc (Nov 10, 2011)

lubeck dijo:


> ya no entendi...
> 
> 
> lo que tu buscas es saber si alguien ha tenido una experiencia fisica con el QEI,?



siii, no he tenido tiempo para entrarle a un 18F



lubeck dijo:


> porque en ese ejemplo esta como se configura... no?



creo que si.




lubeck dijo:


> pd.. por cierto yo no puedo simular el ejemplo de proteus tu si?



Si lo puedo simular
pero puedo variar el PWM y en el display cambia
per la posicion no cambia...

espero dentro de 2 semanas poder empezar a trabajar con un 18F2431
lo que avances para controlar un servomotor con encoder incremental de 2 canales
seria excelente lubeck...

del video anterior donde el robot es de acrilico, ya tenemos la mayor parte de aluminio
faltan algunas bases, pero lo mejor es que ya tengo unos motores de 24v con un
reductor de velocidad de 1:25 y tambien unos encoder de 500 pulsos/rev
para armar ese mismo robot pero ahora mas rapido, rigido, preciso, fuerte, etc., etc., etc.
por eso me interesa mucho hacer el driver con el micro adecuado y no con el 16f877
que actualmente tengo...


----------



## lubeck (Nov 11, 2011)

> Si lo puedo simular
> pero puedo variar el PWM y en el display cambia
> per la posicion no cambia...



ya tambien lo pude simular tenia un problema mi proteus 

si tu encoder es incremental y genera un patron como el siguiente....




(el index si lo tiene puedes o no usarlo)

entonces es asi para simularlo y el codigo del amigo autotronico es correcto...




en el video estoy incrementándolo y decrementandolo según las pulsaciones...

lo que no entendi es porque con el pic simulator IDE no se puede, pero bueno, quizas es un error de ese simulador... ya que tengas el pic no olvides comentar los avances...

pd..Revisando las cualidades de este pic me doy cuenta que tiene conversores AD simultaneos , en un tema alguien necesitaba uno de estos, pero no me acuerdo donde...


----------



## autotronico (Nov 12, 2011)

que tal volvieron a retomar el manejo de motores con encoders con el pic 18f2431 estare atento.


----------



## AldebaranElectronico (Nov 12, 2011)

josb86 dijo:


> tu me perdonaras pero alli no veo que trabajen con flancos hacen lo mismo que yo



Espero te sirva este ejemplo, lo hice con el 16F628A, es un contador el cual al detectar un estado (cero o uno) incrementa o decrementa el conteo,


```
DEFINE OSC 4

' DEFINICIÓN DE REGISTROS PARA EL LCD
DEFINE LCD_DREG PORTB 
DEFINE LCD_DBIT 4     
DEFINE LCD_RSREG PORTB 
DEFINENE LCD_RSBIT 1   
DEFINE LCD_EREG PORTB 
DEFINE LCD_EBIT 2     
Define	LCD_BITS	4	
Define	LCD_LINES	2	
Define	LCD_COMMANDUS 2000
Define	LCD_DATAUS	50	

Conteo	var	word	

   TRISA = %11111111  	
   TRISB = %00001001
   Pause 500       ' 
   Lcdout $fe, 1   
   Lcdout "   CONTANDO "
   
   CONTEO=0
   LOP:	
   If PORTB.3 = 0 Then LOP	

loop2: 
   If PORTB.3 = 1 Then loop2	
   Pause 50

   If PORTB.0 = 1 Then Conteo = Conteo + 1
   If Conteo > 9999 then Conteo = 0
   If PORTB.0 = 0 Then Conteo = Conteo - 1
   if conteo = 0 then conteo = 9999
   

   Lcdout $fe, $c2
   lcdout $FE, $C2,#CONTEO, " PULSOS "
   Pause 100		

   
   Goto LOP		' Cierra el Bucle
   End
```


----------



## D@rkbytes (Nov 13, 2011)

Saludos AldebaranElectronico
Que código tan extraño te inventaste para tu contador.

' DEFINICIÓN DE REGISTROS PARA EL LCD
DEFINE LCD_DREG PORTB 
DEFINE LCD_DBIT 4     
DEFINE LCD_RSREG PORTB 
DEFINENE LCD_RSBIT 1  <- Esto esta mal
DEFINE LCD_EREG PORTB 
DEFINE LCD_EBIT 2     
Define    LCD_BITS    4    
Define    LCD_LINES    2    
Define    LCD_COMMANDUS 2000
Define    LCD_DATAUS    50    

CONTEO=0 
   LOP: 
   If PORTB.3 = 0 Then LOP                                 <- Esto no tiene sentido 

loop2: 
   If PORTB.3 = 1 Then loop2    <- Esto tampoco tiene sentido 
   Pause 50

   If PORTB.0 = 1 Then Conteo = Conteo + 1 <- Aquí incrementas la variable Conteo
   If Conteo > 9999 then Conteo = 0
   If PORTB.0 = 0 Then Conteo = Conteo - 1 <- Aquí la decrementas por el mismo pin
   if conteo = 0 then conteo = 9999

Y la persona que hizo la pregunta, la hizo en marzo del 2010
Creo ya debió haber resuelto su duda.


----------



## arturouc (Nov 13, 2011)

autotronico dijo:


> que tal volvieron a retomar el manejo de motores con encoders con el pic 18f2431 estare atento.



Que tal Amigo autotronico
dentro de unos 12 días espero me llegue el 18f2431
espero me puedas apoyar con la programación del micro

es continuar lo que empece con el 16f877 y que me apoyaste mucho
con los 18f no he tenido experiencia
una vez intente compilar el ejemplo que me enviaste de pic basic pro
pero no pude con el micro code studio....

estamos en contacto...


----------



## GoX F4yCk3r DB (Nov 17, 2011)

Hola, que tal ando realizando comunicacion en serie con labview, ya tengo mis programa de LV pero el del pic me esta dando problemas, lo que quiero hacer es que cuando llegue un dato de labview, en este caso un numero encienda un puerto del pic.
Mis datos a recibir son 128,64,32,16,8,4,2,1.

mi estructura es con if
if dat="1" then high portb.0
if dat="2" then high portb.1
if dat="4" then high portb.2
if dat="8" then high portb.3
if dat="16" then high portb.4

con los primeros numeros del 1 al 8 no tengo problemas, pero cuando meto un numero mayor al 10, me salen los siguientes errores:

ERROR Line 24: Bad expression.
ERROR Line 24: Bad expression or missing THEN.
ERROR Line 24: IF without a matching ENDIF.

a que se debe esto?


----------



## MAXTORCAMPOS (Nov 17, 2011)

Hola: GoX F4yCk3r DB, creo que el problema te lo esta dando porque encierras los numeros en comillas y los asume como lectras prueba sin las comillas y me avisas, saludos

if dat=1 then high portb.0
if dat=2 then high portb.1
if dat=4 then high portb.2
if dat=8 then high portb.3
if dat=16 then high portb.4


----------



## GoX F4yCk3r DB (Nov 17, 2011)

=)
 muchas gracias maxtorcampos, ese era mi problema.
Te lo agradesco
salu2 desde Mexico

Por cierto de pura casualidad sabras simular la comunicacion en serie??
Tengo el proteus y el Labview, ya descargue el serial port driver, pero no me hace la comunicacion =(


----------



## lubeck (Nov 17, 2011)

GoX F4yCk3r DB dijo:


> Hola, que tal ando realizando comunicacion en serie con labview, ya tengo mis programa de LV pero el del pic me esta dando problemas, lo que quiero hacer es que cuando llegue un dato de labview, en este caso un numero encienda un puerto del pic.
> Mis datos a recibir son 128,64,32,16,8,4,2,1.
> 
> mi estructura es con if
> ...



y no es mas facil que pongas...

*portb=dat* 
asi no necesitas tantos if...then

digo como sugerencia quizas no te sirve asi...


----------



## GoX F4yCk3r DB (Nov 17, 2011)

lubeck dijo:


> y no es mas facil que pongas...
> 
> *portb=dat*
> asi no necesitas tantos if...then
> ...



:S, no entendi del todo, aunque supongo que los leds se iran encenciendo de acuerdo a los bits..
algo asi tengo la idea, es esto correcto?


----------



## lubeck (Nov 17, 2011)

> se iran encenciendo de acuerdo a los bits..
> algo asi tengo la idea, es esto correcto?



creo que si es correcto....

quita todos los if then estos



> if dat="1" then high portb.0
> if dat="2" then high portb.1
> if dat="4" then high portb.2
> if dat="8" then high portb.3
> if dat="16" then high portb.4



y pon solo la linea


> portb=dat


y se supone que es lo mesmo...


----------



## GoX F4yCk3r DB (Nov 17, 2011)

lo intentare =). 
gracias lubeck
disculpa de casualidad sabras simular la comunicacion en serie?, tengo el proteus, labview y el virtual serial port drive..
ya lo intente pero no mas no simula =(


----------



## lubeck (Nov 17, 2011)

mmm.. a medias...

en labview no lo he usado, pero en proteus tienes que poner el compim y lo configuras a una velocidad y asignas un puerto digamos el COM1 y 9600, en el virtual serial port haces un enlace de virtual del  com1 con el com2, y el labview lo configuras con COM2 y 9600, ojo que los puertos que asignes no deben existir fisicamente, podria utilizar el COM4 y COM5 o el par que quieras....


----------



## arturouc (Nov 17, 2011)

GoX F4yCk3r DB dijo:


> lo intentare =).
> gracias lubeck
> disculpa de casualidad sabras simular la comunicacion en serie?, tengo el proteus, labview y el virtual serial port drive..
> ya lo intente pero no mas no simula =(



Aqui hay un ejemplo de lubeck click aqui con este ejemplo yo lo pude simular
_mi ejemplo_

estamos en contacto...


----------



## GoX F4yCk3r DB (Nov 18, 2011)

Hola que tal, les comento que ya logre establecer comunicacion en serie virtualmente, aunque algo le paso y ya no kiere jalar =(.
Bueno en el rato que pude establecer comunicacion, solo los 4 primeros leds hacian el corrimiento, pero lo raro es que algunos de ellos ya estaban encendidos sin aun enviar ningun dato. por que puedo estar pasando eso?
este es mi programa en microcode
------
include "modedefs.bas"
@ device xt_osc 
trisc=%10000000
dat var byte 
trisb=0


inicio:
serin portc.7, T2400,dat
portb=dat
goto inicio

end
----------
cuando me llega el dato 1 prende el portb.0
cuando llega el 2 prende el portb.1
cuando llega el 4 prende el portb.2
cuando llega el 8 prende el portb.3
cuando llega el 16 prende el portb.1 y portb.2
cuando llega el 32 prende el portb.1
cuando llega el 64 prende el portb.2
cuando llega el 128 prende el portb.3

y cuando le doy run al proteus se encienden los leds del puerto 0,1,2,3 y 7, sin haber establecido comunicacion en serie con el labview.
alguna sugerencia??



les agradesco mucho su ayuda. Me ha servido mucho
salu2 a todos


----------



## D@rkbytes (Nov 18, 2011)

GoX F4yCk3r DB dijo:


> Hola que tal, les comento que ya logre establecer comunicacion en serie virtualmente, aunque algo le paso y ya no kiere jalar =(.
> Bueno en el rato que pude establecer comunicacion, solo los 4 primeros leds hacian el corrimiento, pero lo raro es que algunos de ellos ya estaban encendidos sin aun enviar ningun dato. por que puedo estar pasando eso?
> 
> y cuando le doy run al proteus se encienden los leds del puerto 0,1,2,3 y 7, sin haber establecido comunicacion en serie con el labview.
> alguna sugerencia??


Porque solo declaraste TRISB = 0 ' Puerto B como salidas
Pero no lo inicializaste con PORTB = 0 ' Para que al iniciar el programa todo el puerto B este en 0


----------



## MAXTORCAMPOS (Nov 18, 2011)

Saludos amigo GoX F4yCk3r : acá te dejo el link de un video que te puse en youtube para darte algunas recomendaciones, primero no te recomiendo que lo hagas con la sentencia, *portb=dat *ya que estarías muy limitado, te aconsejo que lo hagas como inicialmente lo tenias pues allí podrás enviarle hasta letras y podrás hacer lo que quieras con las salidas, sin tener que regirte por el patrón binario aunque esto implique algunas lineas mas en el programa, el video que te subí tiene una función muy eficiente ya que el programa envía una señal al PIC y hasta que el PIC no le confirme que efectivamente recibió y procesó la señal dicho programa no mostrará la palabra *encendido* ni aparecerá el botón rojo, un saludo

Te recomiendo que lo veas en pantalla completa


----------



## mayki0101 (Nov 18, 2011)

mecatrodatos dijo:


> proyectos lcd:
> 
> los LCD son utilizados para mostrar mensajes que indican la consecusion de un proceso en forma visual , instrucciones de manejo , mostrar valores , en si permiten la comunicacion entre maquinas y humanos pudiendo mostrar cualquier caracter ASCII.
> 
> ...



hola puedes poner un ejemplo usando el asd del 16f877 , quiero mostrar voltaje eb la lcd con punto decimal,pero nose como sacar los los milkivolts,, si tengo4.3 volts solo puedo mostrar 4 ...ayuda


----------



## lubeck (Nov 18, 2011)

> primero no te recomiendo que lo hagas con la sentencia, portb=dat ya que estarías muy limitado, te aconsejo que lo hagas como inicialmente lo tenias pues *allí podrás enviarle hasta letras y podrás hacer lo que quieras con las salidas*


, 

*GoX F4yCk3r *

en picbasic no se reciben letras todo se recibe en variables solo tipo word, byte o bit, e igual puedes procesarlo a posteriori como quieras.... pero bueno es tu decision, como dije puede no servirte....



> *sin tener que regirte por el patrón binario*


*MAXTORCAMPOS*

  dale una revizada a los principios basicos de la programacion/computacion.... tooooodoooo es binario....


----------



## MAXTORCAMPOS (Nov 18, 2011)

Hola amigo lubeck 

con todo respeto debo decirte que estas equivocado, con respecto a la recepcion de informacion de un Microcontralodor PIC, el no recibe Variables, recibe valores de variables y las almacena en variables, y debo ademas aclararte que si recibe letras, numeros, pulsos, voltaje ETC. ETC. eso no son variables son valores a los que comunmente llamamos señales, gracias por decirme que le de un vistazo a los principios de programacion, sin embargo debo confesarte que ya pase por esa etapa has mas de 15 años aca te dejo un link donde veras un tipo de comunicacion que use en una empresa y todo lo hice enviando Letras, por supuesto que para el pic leerlas debe transformar todo a su propio lenguaje que es el binario pero eso es otra cosa, un abrazo


----------



## chapin (Nov 18, 2011)

torres.electronico dijo:
muchachos, creo que ambos son muy buenos foristas ya que cada uno aporta lo suyo tratando de ayudar a los demas... Dejen las diferencias de lado y veamos si podemos seguir con este topico

totalmente de acuerdo.


----------



## lubeck (Nov 18, 2011)

*Gox*

algo esta raro aqui...



> cuando me llega el dato 1 prende el portb.0
> cuando llega el 2 prende el portb.1
> cuando llega el 4 prende el portb.2
> cuando llega el 8 prende el portb.3
> ...



no puede ser posible que lo ponga asi, si el pic esta recibiendo bien el dato...
indiscutiblemente...
el 7ºbit =128
el 6ºbit =64
el 5ºbit =32
el 4ºbit =16
el 3rbit =8
el 2ºbit =4
el 1rbit =2
el bit0 =1

algo anda mal al enviar los datos en el labview,no?


----------



## technique (Nov 22, 2011)

Hola; compañeros de foro:
Por favor necesito su ayuda, estoy aprendiendo sobre el pic 16f628a en PBP y trato de hacer un timer para un ventilador manejado con  optotriacs, no se como hacer que presionando el boton de stop por 10 segundos, entre a una parte del programa para cambiar el tiempo de funcionamiento, es algo asi:

if botonstop=0 (por >=10 seg.) then (gosub) (goto?) timer
....
....
....
timer:
if botonfrente= 0 then sumartiempo(para incrementar el tiempo de encendido)
if botonretro=0 then restartiempo (para reducir el tiempo de encendido)
return? goto inicio?
muchas gracias de antemano.


----------



## MAXTORCAMPOS (Nov 22, 2011)

Saludos *technique*, dime exactamente lo que quieres que haga el programa y quizas pueda ayudarte, pero explica detalladamente y seguro aca te lo resolvemos, me gustaria saber que significa tiempo de encendido? es el tiempo que dura para encender o el tiempo que dura encendido? saludos


----------



## torres.electronico (Nov 23, 2011)

Hablando mal y pronto por que no me sente a pensarlo bien, creeria que podrias insertar la condicion if ... then para saltar a una rutina con un bucle de 10 segundoss con for...next y dentro de este bucle, si no ve que esta presionado el pulsador, retornar o ir a donde quieras...osea, que si esta presionado el pulsaodr hasta finalizar el bucle, al final solo tendrias que poner un goto e irias a la subrutina donde  tendrias la parte de configutracion del temporixzador... 
El tema esta en que en el momento en que entra en el bucle, el timer anterior, o mejor dicho, la cuenta del temporizador que tenias programado, al no correr en segundo plano, se pararia y si volves, retomaria desde donde lo dejo siempre y cuando no te4nga un reset la variable que almacena el dato del contador...Se entiende esto ultimo? De ultima, solo muestra parte de tu programa, y ahi sera mas facil ayudarte
Saludos


----------



## GoX F4yCk3r DB (Nov 25, 2011)

Hola que tal
antes que nada quiero agradecer a lubeck y a Maxtorcampos por su ayuda! Muchas Gracias 
Les comento, ya logre establecer comunicacion con el pic, y mi practica ya quedo al 100%.
Lucbeck cuando ponia 
portb=dat
me encendia los leds en el orden que mencione anteriormente. Por lo que opte por poner un if en cada dato, quedando asi
If dat=1 then high portb.0

y asi sucesivamente hasta encender el ultimo bit.

Maxtorcampos:
cuando ponia
if dat=128 then high portb.7
efectivamente el compilador ya no me mandaba errores, sin embargo el pic no reconocia esta instruccion, ya que no encendia ningun led.
porque pudo haber pasado esto?

reitero mis agradecimientos y si alguien gusta que comparta mi programa de labview y el del pic, con gusto los subo =)

un saludo


----------



## lubeck (Nov 25, 2011)

> reitero mis agradecimientos y si alguien gusta que comparta mi programa de labview y el del pic, con gusto los subo =)



Lastima que ahora no tengo instalado el labview, no podras ponerlo en proteus....

me mata de curiosidad, el porque en ese pic, el binario no es binario....


----------



## GoX F4yCk3r DB (Nov 25, 2011)

hola lubeck, con gusto, adjunto el de proteus y el que del pic que utilice para mi comunicacion.
por cierto veras que hay mas de 8 if's, bueno esto es porque era un corrimiento en sentido a la derecha y a la izquierda


----------



## lubeck (Nov 25, 2011)

Oki... deja darle una mirada... Gracias...


----------



## GoX F4yCk3r DB (Nov 25, 2011)

una duda existencial.
Porque cuando pongo if dat=20 then high portb.0 el compilador no me marca errores, pero al momento de simularlo, no mas no enciende el led.


----------



## lubeck (Nov 25, 2011)

Pues no entiendo GOX.... ese codigo que me pasaste ni siquiera deberia de funcionar....

puse este y va de 10 


```
include "modedefs.bas"
@ device xt_osc 

trisc=%10000000
dat var byte 
trisb=0
portb=0

inicio:

serin portC.6, 0,dat
portb=dat
goto inicio

end
```


----------



## GoX F4yCk3r DB (Nov 25, 2011)

originalmente mi programa lo tenia asi,  de verdad que me encendia los leds, en una secuencia muy rara, y el que te pase me sirve al 100% tanto virtualmente como fisicamente.


----------



## lubeck (Nov 25, 2011)

mmm.. fijate que en el proteus tienes el TX en RC6 y en el programa pones portC.1....

con respecto a los if .....thens.....

ya no se como mandas desde labview, es decir....

no es lo mismo un "1" (ascii) que en hexadecimal es un 31 o en binario es 00011001
a que mandes un 1 (numerico) que en hexadecimal es un 1 o en binario  es un 00000001

ves la diferencia....

ahora si mandas un "1" es correcto como lo tienes....
si mandas un 1 es correcto como lo tengo...


----------



## GoX F4yCk3r DB (Nov 25, 2011)

desde labview recibo datos numericos, que son convertidos a string, para que puedan ser escritos en el puerto serial.


----------



## lubeck (Nov 25, 2011)

me rindo.....



> desde labview recibo datos numericos,



como es que recibes datos en labview.... si utilizas en el pic el comando SERIN????

quien manda a quie????

el labview no manda al pic???? , los manda en string(es lo mismo que Ascii).????

si es asi, entonces estas bien, y todo el problema estuvo en que tu intentaste recibir una cadena de caracteres (cadena de caracteres es la suma de dos o mas ascii o string) y por eso te marcaba error PICBASIC NO MANEJA CADENAS DE CARACTERES ejem Dat="18" (mal),  Dat="1" (bien), y lo que paso es que MAXTORCAMPOS te suguirio quitar las comillas y yo me fui con el error y que recibias un dato numerico... por eso el portb=dat..... 


al tu poner Dat="1" picbasic internamente traduce a DAt=00011001 y deja de manejar los ascii....

espero te sirva mi explicacion


----------



## GoX F4yCk3r DB (Nov 25, 2011)

si asi es, labview le manda al pic los datos.
entonces no puedo recibir un numero >10 en el pic??
porque en realidad labview si manda datos numericos, el problema es que esos datos numericos no pueden ser escritos en el "visa write" (que es el encargado de mandar los datos), debido a que este visa write no puede recibir datos numericos es necesario convertirlos a string, pero siguen siendo datos numericos solo que en otro formato para que el visa write pueda escrbirlos en el pic, se que los datos son numericos por que los obtengo de un for loop, el cual hace un conteo y con este conteo encendia y apagaba mis leds.

lubeck mi duda es.. envio datos numericos >10 previamente convertidos a string, como puedo hacer para que el pic me interprete este dato y pueda asi encender algo, se puede hacer esto?

ejemplo

IF dat=10 then HIGH portb.0

ya lo intente sin las comillas pero no enciende el led


----------



## lubeck (Nov 25, 2011)

> lubeck mi duda es.. envio datos numericos previamente convertidos a string, como puedo hacer para que el pic me interprete este dato y pueda asi encender algo, se puede hacer esto?



pues si te entiendo bien, (yo no   he usado el labview), lo que tienes que hacer es mandar al visa write el codigo ascii del numero, es decir si  quieres mandar un 65 al pic entonces mandas una "A" que es el numerico que le corresponde, busca la tabla de codigos ascii...

si tu mandas una "A" que es el codigo 65 que es 1000001 te va a prender el bit 0 y el 6....
en microcontroladores debes de estar pensando siempre o lo mas posible en Binario...


----------



## GoX F4yCk3r DB (Nov 25, 2011)

ejemplo si mando un 75 que es una K que es 0100 1011
puedo poner
esto...
IF dat=K then high portb.0??

sin mandar una K necesariamente de labview, mando un 75, pero el pic, me puede interpretar este 75 como una K?


----------



## Chico3001 (Nov 25, 2011)

El PIC siempre hace lo que su programa le indique.... Si el programa indica que el dato recibido se debe tratar como "k" entonces el PIC la tratara como K, pero si le indica que la trate como numero entonces asi se hara.... 

No se si me explique....


----------



## GoX F4yCk3r DB (Nov 25, 2011)

Chico3001 dijo:


> El PIC siempre hace lo que su programa le indique.... Si el programa indica que el dato recibido se debe tratar como "k" entonces el PIC la tratara como K, pero si le indica que la trate como numero entonces asi se hara....
> 
> No se si me explique....



si, pero es que ese es mi problema, cuando yo recibo un 10 o un numero mayor a 10 el pic no hace  nada, desde labview y debido a la programacion que tengobno puedo enviarle letras puro numero, si pudiera enviar letras se facilitaria todo. bueno cuando mando un 10 y el pic lo recibe simplemente no hace nada con este dato, y es lo que no entiendo, como puedo hacer para que el pic interprete este dato y asi pueda enecender un puerto


----------



## lubeck (Nov 25, 2011)

seguro que esta recibiendo un 10 (numerico)  o estas recibiendo dos caracteres un "1" y un "0" osea un "10"???

el segundo picbasic no es posible que lo reciba...


es diferente....


----------



## arturouc (Nov 25, 2011)

yo hice este codigo que recibe caracteres y lo convierte en numero el pic
la idea es que mandes desde la computadora una serie de caracteres por ejemplo
"0000123*" cuando lo recibe el pic
el primer caracter que es un "1" le asigna  DATO[5]=49 despues DATO[6]=50, despues DATO[7]=51 
y cuando recibe el "*"
hace la conversion a 123 numerico

 DATO[INDICE]=DATOE   'este es el caracter que recibo por el puerto serie
 INDICE=INDICE+1
  IF DATOE=="*" THEN  ' cuando del PC llaga un "*" interpreto el numero que recibi
  INDICE=1
 FOR I=1 TO 7
    SELECT CASE DATO_ 'dato que recibi
        CASE 48                 ' es un cero?
            NUM=0           
        CASE 49                 ' es un uno?
            NUM=1
        CASE 50                 ' es un dos?
            NUM=2
        CASE 51                 'creo que ya entendiero....
            NUM=3
        CASE 52
            NUM=4
        CASE 53
            NUM=5
        CASE 54
            NUM=6
        CASE 55
            NUM=7
        CASE 56
            NUM=8
        CASE 57                   ' es un nueve?
            NUM=9
        CASE ELSE    'CUALQUIER OTRO CARACTER LO TOMA COMO CERO "O"
            NUM=0
    END SELECT 
 NEXT I
 'aqui determino que numero me enviaron por el PC
 DATOACUM=NUM[7] + NUM[6]*10 + NUM[5]*100 + NUM[4]*1000 + NUM[3]*10000 

espero te sirva..._


----------



## lubeck (Nov 25, 2011)

GoX F4yCk3r DB dijo:


> ejemplo si mando un 75 que es una K que es 0100 1011
> puedo poner
> esto...
> IF dat=K then high portb.0??
> ...



no vi este mensaje...

si es correcto....

pero seria

IF dat="K" then high portb.0


----------



## lubeck (Nov 25, 2011)

mmmm

bueno mi conclucion a tu duda, es que tienes dos posibilidades de enviar un dato a un pic....

1.-una es mandar una cadena de caracteres y recibirlos en un arreglo como se ha mencionado antes o con el codigo del amigo arturouc u cualquier otro algoritmo que cumpla con el fin...
y utilizando los if then necesarios o un select case... para prender bit por bit como lo estas haciendo...

2.- la otra es mandar un solo caracter y prender los bits nesesarios... y para esto prepare este video...


----------



## autotronico (Nov 26, 2011)

Que tal amigos quiero compartir un proyecto de efecto de luces como las que se presentan para la fecha dicembrina he aqui el codigo:



```
LD1 Con 1
LD2 Con 2
LD3 Con 4
LD4 Con 8
LD5 Con 16
LD6 Con 32
LD7 Con 64
LD8 Con 128

PB_Up   var PortA.0 
PB_Dn   var PortA.1 
PB_Auto var PortA.2 

Up_Dn   var bit
Mode    var byte 
ModeOld var byte
PBData  var byte
Cnt1    var byte 
Cnt2    var word 

TrisA = %11111 
TrisB = %00000000
PortA = 0
PortB = 0

modeOld = 0
Up_Dn  = 1   
Cnt1   = 0 

Main: 
   Mode = PortA >> 3      
   
   if modeOld <> Mode then 
      Modeold = Mode       
      PBData = 0           
      Up_Dn  = 1           
      Cnt1   = 0 
   endif    
   
   gosub Chk_PB_UpDn
   
   if PB_Auto then 
      if Up_Dn = 1 then 
         gosub Run_Up 
      else 
         gosub Run_Dn
      endif
   endif
   
   PortB = PBData
   
   if PB_Auto then
      pause 100
   else
      gosub DeBounce
   endif

Goto Main    


Chk_PB_UpDn:   
   if PB_Up then 
      Up_Dn = 1
      if not PB_Auto then gosub Run_Up
   else 
      if PB_Dn then 
         Up_Dn = 0
         if not PB_Auto then gosub Run_Dn
      endif
   endif   
return      

Run_Up:
   select case Mode
      case 0  
         if Cnt1 = 16 then 
            if PB_Auto then 
               Up_Dn = 0
            else   
               cnt1 = 0    
            endif   
         endif
         Cnt1 = cnt1 + 1 
         gosub Mode0
      case 1 
         if Cnt1 = 9 then 
            if PB_Auto then 
               Up_Dn = 0
            else   
               cnt1 = 0    
            endif   
         endif
         Cnt1 = cnt1 + 1 
         gosub Mode1
      case 2
         PBData = PBData + 1
      
      case 3
         if Cnt1 = 11 then 
            if PB_Auto then 
               Up_Dn = 0
            else   
               cnt1 = 0    
            endif   
         endif
         Cnt1 = cnt1 + 1 
         gosub Mode3
    end select
return      

Run_Dn:
   select case Mode
      case 0  
         if Cnt1 = 0 then 
            if PB_Auto then
               Up_Dn = 1
            else
               cnt1 = 16
            endif
         endif
         Cnt1 = cnt1 - 1 
         gosub Mode0
      case 1
         if Cnt1 = 0 then 
            if PB_Auto then
               Up_Dn = 1
            else
               cnt1 = 9
            endif
         endif
         Cnt1 = cnt1 - 1 
         gosub Mode1
      case 2
         PBData = PBData - 1
      
      case 3
         if Cnt1 = 0 then 
            if PB_Auto then
               Up_Dn = 1
            else
               cnt1 = 11
            endif
         endif
         Cnt1 = cnt1 - 1 
         gosub Mode3
    end select
return

Mode0:
   select case cnt1 
      case 00 : PBData =  0
      case 01 : PBData =  ld1
      case 02 : PBData =  ld1+ld2
      case 03 : PBData =  ld1+ld2+ld3
      case 04 : PBData =  ld1+ld2+ld3+ld4
      case 05 : PBData =  ld1+ld2+ld3+ld4+ld5
      case 06 : PBData =  ld1+ld2+ld3+ld4+ld5+ld6
      case 07 : PBData =  ld1+ld2+ld3+ld4+ld5+ld6+ld7
      case 08 : PBData =  ld1+ld2+ld3+ld4+ld5+ld6+ld7+ld8
      case 09 : PBData =  ld2+ld3+ld4+ld5+ld6+ld7+ld8
      case 10 : PBData =  ld3+ld4+ld5+ld6+ld7+ld8
      case 11 : PBData =  ld4+ld5+ld6+ld7+ld8
      case 12 : PBData =  ld5+ld6+ld7+ld8
      case 13 : PBData =  ld6+ld7+ld8
      case 14 : PBData =  ld7+ld8
      case 15 : PBData =  ld8
      case 16 : PBData =  0
    end select
return

Mode1:
   select case cnt1 
      case 00 : PBData =  0
      case 01 : PBData =  ld1
      case 02 : PBData =  ld2
      case 03 : PBData =  ld3
      case 04 : PBData =  ld4
      case 05 : PBData =  ld5
      case 06 : PBData =  ld6
      case 07 : PBData =  ld7
      case 08 : PBData =  ld8
      case 09 : PBData =  0
    end select
return

Mode3:
   select case cnt1 
      case 00 : PBData =  0
      case 01 : PBData =  ld1
      case 02 : PBData =  ld1+ld2
      case 03 : PBData =  ld1+ld2+ld3
      case 04 : PBData =  ld2+ld3+ld4
      case 05 : PBData =  ld3+ld4+ld5
      case 06 : PBData =  ld4+ld5+ld6
      case 07 : PBData =  ld5+ld6+ld7
      case 08 : PBData =  ld6+ld7+ld8
      case 09 : PBData =  ld7+ld8
      case 10 : PBData =  ld8
      case 11 : PBData =  0
    end select
return

DeBounce:
   Cnt2 = 0
   repeat 
      Cnt2 = Cnt2 + 1
      pause 1
    until (PB_Dn = 0) and (PB_Up = 0) or (Cnt2 > 200)
    if Cnt2 < 50 then pause (50 - Cnt2)    
return

End
```


----------



## lubeck (Nov 26, 2011)

Lindo codigo autotronico.....

oye una pregunta... para que sirven los diodos D1 al D4 en el esquema?
no les veo razon aparente...


----------



## J2C (Nov 26, 2011)

Solo D1 y D2 no tendrian razon de estar (salvo para igualar a D3 y D4), pero D3 y D4 cumplen una clara función.



Saludos, JuanKa.-


----------



## lubeck (Nov 26, 2011)

Mmm no pues no le encuentro, segun yo RA3 y RA4 siempre son iguales... no entiendo para que los diodos...

¿cual es la funcion?


----------



## J2C (Nov 26, 2011)

Lubeck

Vuelve a analizar *detenidamente* el circuito "_*juego de luces.pdf*_" que coloco Autotronico y veras que RA3 y RA4 no son siempre iguales, sino que siguen una secuencia determinada *según el Modo* que hayas elegido.

Mode0 .......

Mode1 .......

Mode3 ....... 





Saludos, JuanKa.-


----------



## autotronico (Nov 26, 2011)

J2C : los diodos son para proteger el puerto A en caso de conectar la alimentacion mal 
lubeck: en el esquema esta puentiado el selector con RA3 y RA4, equivocacion mia pero ya lo corregui,  con lo cual las opciones del juego de luces se amplia, lo arme en proteus y les dejo la simulacion al igual que el diagrama correguido en el punto de RA3 y Ra4.





			
				autotronico dijo:
			
		

> J2C : los diodos son para proteger el puerto A en caso de conectar la alimentacion mal
> lubeck: en el esquema esta puentiado el selector con RA3 y RA4, equivocacion mia pero ya lo corregui,  con lo cual las opciones del juego de luces se amplia, lo arme en proteus y les dejo la simulacion al igual que el diagrama correguido en el punto de RA3 y Ra4.


 por otro lado con la condicon anterior el mode se ejecuta en deteminar la entrada por el puerto sin que el programa  corra en la opcion es como si en ambos casos llegara un 1 logico.


----------



## lubeck (Nov 26, 2011)

ya le entendi.... 



gracias...


----------



## J2C (Nov 26, 2011)

Autotronico

En este caso:


autotronico dijo:


> J2C : los diodos son para proteger el puerto A en caso de conectar la alimentacion mal


 
Como que el PIC ya paso a *mejor vida* y no tiene ningun sentido proteger las entradas del puerto A.




Por otra parte considero totalmente ilogico colocar la llave de 4 posiciones y los 4 diodos de acuerdo a tu ultimo esquema:

llave 1 : ------ RA3=1 ; RA4=0
llave 2 : ------ RA3=0 ; RA4=1
llave 3 : ------ RA3=1 ; RA4=0
llave 4 : ------ RA3=0 ; RA4=1

Dado que las posicines 1 y 3 serian exactamente lo mismo entre ellas, y las 2 y 4 también serian lo mismo entre ellas.




Sin embargo, y es lo que di a entender, en el primer esquema tenia logica:

llave 1 : ------ RA3=1 ; RA4=0
llave 2 : ------ RA3=0 ; RA4=1
llave 3 : ------ RA3=1 ; RA4=1

Permitiendo elegir entre 3 modos distintos que puedes manejar por programa.



Saludos, JuanKa.-


----------



## lobopic (Nov 26, 2011)

hola amigos recien estoy iniciandome en este mundo de electronica con microcontroladores
en esta ocacion quiero realizar un temporizador de 0 - 99 minutos programable.
nose como empesar espero de su ayuda adjunto el diagrama en proteus


----------



## lubeck (Nov 26, 2011)

> nose como empesar


yo te recomendararia que....

no pretendas que alguien te haga el codigo... 
empieza como la mayoria empezamos.... encendiendo un led... para eso puedes ir a la pagina #1 de este tema... y ya que hayas leido gran parte y echo un codigo propio aunque este mal, lo pones y te podemos echar una mano los que gustemos hacerlo...


----------



## autotronico (Nov 27, 2011)

*J2C* "Como que el PIC ya paso a mejor vida y no tiene ningun sentido proteger las entradas del puerto A"

Amigo, claro que protego al pic, en la alimentacion siempre coloco un diodo de proteccion en el caso de que la alimentacion este mal.

Al igual puedo colocar un unico diodo entre la alimentacion y el selector y otro en la alimentacion al PIC.

Por otro lado tenes mucho razon en la configuracion opcional de las entradas.

SALUDOS


----------



## GoX F4yCk3r DB (Nov 27, 2011)

lubeck dijo:


> mmmm
> 
> bueno mi conclucion a tu duda, es que tienes dos posibilidades de enviar un dato a un pic....
> 
> ...







Muchas gracias Lubeck . me ha servido de mucho tu ayudam duda resuelta.
Gracias  mil gracias
salu2


----------



## Dario (Nov 28, 2011)

hola amigos por aqui de nuevo con mis ideas y problemas jeje... bueno, les cuento que he diseñado un controlador de motores microcontrolados para usar en robotica. el circuito se basa en un micro pic12f629, un l293 y funciona asi: recibe un tren de pulsos por gpio3 usando pulsin y los guarda en la variable t1 para despues compararlos con los valores 50,100,150'200 y 250 con los que se logran las funciones ADELANTE, ATRAS, IZQUIERDA y DERECHA. estoy probandolo con un robot que arme, que evade obstaculos mediante dos bumpers hechos con microswitchs. el problema que tengo, es que cuando lo pongo en funcionamiento y detecto un obstaculo, aveces funciona y aveces no. yo pense que se trataba de ruido en el sistema pero no, lo extraño, es que en proteus me hace lo mismo y no entiendo cual es el error que estoy cometiendo, yo creo que es el micro del driver de motores y por eso les dejo el codigo y la simulacion en proteus para ver si me pueden dar una manito con esto... muchas gracias a todos.


----------



## Dario (Nov 29, 2011)

bueno gente del foro, ya solucione el problema jejeje...  les gane ... no era el control de motores, era el pic maestro el que hacia el problema. la solucion fue encerrar las rutinas de giro y retroceso del pic maestro en un lazo for...next y listo  
aca les dejo el codigo corregido por si lo necesitan jeje... les cuento que esta practica forma parte del tutorial de robotica que estoy haciendo y pronto compartire en el post de robotica que hice hace un tiempo.
saludos y gracias amigos


```
@ DEVICE MCLR_OFF, XT_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_OFF, PROTECT_OFF
DEFINE OSC 4                  'define el oscilador a 4MHZ
CMCON = 7                     'comparadores off
TrisA=%11111111               'todo el port A como entrada
TrisB=%00000000               'todo el port B como salida
PORTA = %11111111             'todo el port A en 1
PORTB = %00000000             'pone a cero todo el puerto b
derecho var porta.0
izquierdo var porta.1
pulso var portb.0
x var byte
low pulso
inicio:
pulsout pulso,100      'avanza si no hay bumper en contacto   
if derecho=0 AND IZQUIERDO=1 then doblaizq  'ir a doblaizq si hay contacto en bumper derecho 
if DERECHO=1 AND izquierdo=0 then doblader 'ir a doblader si hay contacto en bumper izquierdo
if derecho=0 and izquierdo=0 then retro 'ir a retro si ambos bumpers estan
goto inicio

doblader:                       'contacto en bumper derecho, ir a la izquierda     
for x=1 to 10                    
pulsout pulso,200
pause 200
next 
for x=1 to 10 
pulsout pulso,250
pause 200
next
goto inicio

doblaizq:                     'contacto en bumper izquierdo, ir a la derecha
for x=1 to 10 
pulsout pulso,250
pause 200
next 
for x=1 to 10                    
pulsout pulso,200
pause 200
next
goto inicio

retro: 
for x=1 to 10                   'ambos bumpers en contacto 
pulsout pulso,150          ' retrocede y dobla a la derecha
pause 200
next
for x=1 to 10 
pulsout pulso,250
pause 200
next
goto inicio
```


----------



## D@rkbytes (Nov 29, 2011)

Saludos D@rio.
  Una pregunta + un comentario.
Por que usas For x=0 To 10 Step 1 
Si hará lo mismo que For x=0 To 10 
Ya que los pasos de un For Next se dan de uno en uno por default.
Ósea que el Step 1 esta redundando en el código 
hará 11 pasos de todos modos con o sin el Step 1 
Si quieres hacer 10 pasos solamente, seria For x=1 To 10
  Ok. Buen código y suerte.


----------



## Nano24 (Nov 29, 2011)

D@rio dijo:


> hola amigos por aqui de nuevo con mis ideas y problemas jeje... bueno, les cuento que he diseñado un controlador de motores microcontrolados para usar en robotica. el circuito se basa en un micro pic12f629, un l293 y funciona asi: recibe un tren de pulsos por gpio3 usando pulsin y los guarda en la variable t1 para despues compararlos con los valores 50,100,150'200 y 250 con los que se logran las funciones ADELANTE, ATRAS, IZQUIERDA y DERECHA. estoy probandolo con un robot que arme, que evade obstaculos mediante dos bumpers hechos con microswitchs. el problema que tengo, es que cuando lo pongo en funcionamiento y detecto un obstaculo, aveces funciona y aveces no. yo pense que se trataba de ruido en el sistema pero no, lo extraño, es que en proteus me hace lo mismo y no entiendo cual es el error que estoy cometiendo, yo creo que es el micro del driver de motores y por eso les dejo el codigo y la simulacion en proteus para ver si me pueden dar una manito con esto... muchas gracias a todos.



Que tal dario, una forma mas resumida ya que estas usando trenes de pulso, pues usa un PIC y un Servomotor, quitale el tapón de tope para que gire a 360 grados y déjale el circuito de control que trae, así descartarías la idea de usar un L293, menos complicado, menos circuito y menos consumo.


----------



## Dario (Nov 29, 2011)

> Saludos D@rio.
> Una pregunta + un comentario.
> Por que usas For x=0 To 10 Step 1
> Si hará lo mismo que For x=0 To 10
> ...


jeje... tenes razon, es verdad, ya lo modifico jeje... 



> Que tal dario, una forma mas resumida ya que estas usando trenes de pulso, pues usa un PIC y un Servomotor, quitale el tapón de tope para que gire a 360 grados y déjale el circuito de control que trae, así descartarías la idea de usar un L293, menos complicado, menos circuito y menos consumo.


hola nano, te cuento que no estoy usando servomotores, si te fijas en la simulacion en proteus y en lo que dije en el primer mensaje, estoy usando un controlador de motores que diseñe que se comporta como un servo pero este tiene la capacidad de controlar 2 motores usando una sola linea de control. de todas formas, gracias por tu recomendacion.
saludosss


----------



## GoX F4yCk3r DB (Nov 30, 2011)

Hola que tal, aqui molestando de nuevo jeje
bueno ahora ando controlando un motor a paso unipolar de 5 hilos.
ya logre hacer todas sus velocidades horario y antihorario.
solo tengo una pequeña problematica...
cuando pulse un pulsador que se haga una sola secuencia del motor. por ejemplo


trisb=0 ;hacer salidas el puerto b
antihorario:
portb=%0011 ;energiza bobina A y C
PAUSE 5 ;espera 5 mls
portb=%0110 ;energiza bobina C y B
PAUSE 5 ;espera 5 mls
portb=%1100 ;energiza bobina B Y D
PAUSE 5 ;espera 5 mls
portb=%1001 ;energiza bobina D Y A
PAUSE 5 ;espera 5 mls
GOTO antihorario ;continuar girando
END

este programa hace el full step del motor, bueno cuando yo presione un boton solo quiero que se energize la bobina A y C y cuando vuelva a presionar el boton que se energicen las siguiente bobinas que serian C y B, tengo una vaga idea de como hacerlo pero no la puedo aterrizar =(.
Imagino que es con un if dentro de un for, pero no tengo clara la idea

alguna sugerencia??
de antemano gracias


----------



## ricbevi (Nov 30, 2011)

GoX F4yCk3r DB dijo:


> Hola que tal, aqui molestando de nuevo jeje
> bueno ahora ando controlando un motor a paso unipolar de 5 hilos.
> ya logre hacer todas sus velocidades horario y antihorario.
> solo tengo una pequeña problematica...
> ...



Hola..infinidad de formas de hacer lo que planteas una....

trisb=0 ;hacer salidas el puerto b
antihorario:

  AC:    if porta.1=1 the goto AC ' mientra el boton presente en el puerto A1 este alto
                                              ' se detiene alli
portb=%0011 ;energiza bobina A y C
PAUSE 5 ;espera 5 mls
  CB:     if porta.1=1 the goto CB ' mientra el boton presente en el puerto A1 este alto
                                              ' se detiene alli
portb=%0110 ;energiza bobina C y B
PAUSE 5 ;espera 5 mls
BD:       if porta.1=1 the goto BD ' mientra el boton presente en el puerto A1 este alto
                                              ' se detiene alli
portb=%1100 ;energiza bobina B Y D
PAUSE 5 ;espera 5 mls
DA :       if porta.1=1 the goto DA ' mientra el boton presente en el puerto A1 este alto
                                              ' se detiene alli
portb=%1001 ;energiza bobina D Y A
PAUSE 5 ;espera 5 mls
GOTO antihorario ;continuar girando
END

Ric.


----------



## lubeck (Nov 30, 2011)

Estoy deacuerdo con ric... en que hay muchas maneras...
yo soy fan de los arreglos.. naaaaaaa


pero se podria hacer uno y manejarlo mas o menis asi


```
a[0]=%0011
a[1]=%0110
a[2]=%1100
a[3]=%1001

if porta.1=1 then
 b=b+1
 portb=a[b]
 pause 5
endif
```

 le faltan los detalles pero se entiende la idea no?


----------



## reyvilla (Nov 30, 2011)

Buenas compañeros espero estén bien, me encuentro en un dilema con el diseño de un circuito, se trata de el control de una lampara con triac y moc, el circuito tiene una adaptación de 110VAC a 5VDC, con diodo rectificadores y un zener aparte de resistencias y condensadores, la cuestión es que quiero activar la lampara con un MOC3041 que tiene deteccion de cruce por cero, eso era para ahorrarme código, ahora monte el circuito y lo estoy probando con 12VAC, y funciona regula a los 5v y el traic se activa cuando lo hago directo, cuando le conecto el MOC3041, se activa e inmediatamente se apaga la lampara, lo hago de diferentes maneras pero no se mantiene activa, aplique un pwm, un pulsout, pero no funciona.

La pregunta seria habría algún comando o forma en que pudiera mantener activa la lampara o necesariamente tengo que realizar la detección del cruce por cero con el pic para poder activarla?


----------



## lubeck (Nov 30, 2011)

> tengo que realizar la detección del cruce por cero con el pic para poder activarla?



segun lo que yo se, es que si... pero no es pwm... ni tampoco pulsos

lo que se que se tiene que hacer es que detectas el cruce por cero y apartir de ahi enciendes un lapso de tiempo y apagas... osea con una frecuencia de 60kHz tu maximo de encendido es 16mS, si quieres encender al 50% entonces detectas el cruce por cero y prendes 8mS y apagas.... y repites el ciclo, para eso es casi indispensable el uso de interrupciones...

espero te sirva


----------



## J2C (Nov 30, 2011)

El triac una vez disparado, por más que cancele la operación con el OptoAcoplador, seguira conduciendo hasta el proximo cruce por cero siempre y cuando no vuelva a ser disparado.

Con lo cual en redes de 50 Hz conducira durante 10 mseg. y en redes de 60 Hz lo hara durante 8.33 mseg, que son el equivalente a medio ciclo de la señal de red.


Saludos, JuanKa.-

Agregado:

Para el control de lamparas incandescentes si utilizas OptoAclopadores con detección de cruce por cero, deberas controlar cuantos semiciclos la quieres encendida y cuantos apagada. En cambio si usas OptoAclopadores sin detección del cruce de cero podes controlar el tiempo durante el cual el triac conducira durante cada semiciclo.


----------



## GoX F4yCk3r DB (Nov 30, 2011)

lubeck dijo:


> Estoy deacuerdo con ric... en que hay muchas maneras...
> yo soy fan de los arreglos.. naaaaaaa
> 
> 
> ...


Que tal lubeck en mi corta vida con los Uc nunca había manejado este tipo de arreglós. Podrías darme ayuda más detallada de favor . Para ke sirven los corchetes¿ Supongo ke "b" la tengo ke declarar como variable e iniciarla en 0¡


----------



## lubeck (Nov 30, 2011)

si tienes que declar la variable y dimensionar el arreglo... los corchetes es para definir el valor de cada variable...

si gustas sube algun codigo y esquema, es mas facil.... asi lo vamos depurando... 

Con lo del triac... casi le atinaba... 

pero no me queda claro para que el optoacoplador.... ta muy raro...


----------



## GoX F4yCk3r DB (Nov 30, 2011)

:S tendrás algún ejemplo tú?. Xq la verdad no tengo idea de como hacer esto. Nunca he manejado arreglos . Tendrás información acerca de esto?
Gracias x tú ayuda lo agradesco mucho


----------



## lubeck (Nov 30, 2011)

en la ayuda del microcode esta el uso

para definirlo es...

a var byte[4]

4  es la dimension del arreglo o sea 0,1,2,3. son 4 

no estoy en la compu donde tengo los ejemplos...


----------



## reyvilla (Nov 30, 2011)

Muchas gracias lubeck y j2c, por lo que veo tendré que utilizar una fuente para poder controlar con una fuente aislada dc, digo por lo practico y así no complicarme con lo del cruce por cero, ademas de que son muy pocos los focos que ahora se pueden controlar con dimmer, por ejemplo en mi casa ninguno, por eso lo que me interesa es encender el bombillo y apagarlo. Si tienen un ejemplo o una idea de como seria el programa seria genial, ya que he realizado varios y aun no doy con ese cruce por cero.

Ejemplo:
Se supone que al introducir 115VAC a un pin del pic a través de una resistencia de 1M o mas, el pin del pic solo detecta hasta cierto voltaje debido a los diodo, y que de echo se comportaría los 115V, en el ciclo positivo como 1 logico y en el ciclo negativo como un 0 logico, entonces de ser asi el programa seria.

If ciclo = 0 then
triac = 1
pause 8.33
triac = 0
endif

o como seria?


----------



## lubeck (Nov 30, 2011)

> Se supone que al introducir 115VAC a un pin del pic a través de una resistencia de 1M o mas, el pin del pic solo detecta hasta cierto voltaje debido a los diodo, y que de echo se comportaría los 115V, en el ciclo positivo como 1 logico y en el ciclo negativo como un 0 logico, entonces de ser asi el programa seria.



bueno en realidad yo no lo he hecho y te mentiria si lo asegurara, pero creo que para dimerizar con pic no se utiliza el optoacoplador, el triac se dispara directamente con el puerto, y no se hace con el pause, se hace con un timer, y la resistencia no es de 1M segun la norma AN  ( no recuerdo el numero ) es de 5M, y creooooooooo e insisto, lo que se recorta es la onda... no recuerdo si completa o el semiciclo...


----------



## GoX F4yCk3r DB (Dic 1, 2011)

Hola lubeck ya estuve leyendo un poco sobre arreglos aunque no encontre mucha informacion.
con lo poco que lei pude hacer este codigo, basandome en el tuyo.

cmcon=7
portb=0
trisb=0

b var byte
a VAR byte[3]


inicio:
a[0]=%0011
a[1]=%0110
a[2]=%1100
a[3]=%1001

if porta.1=0 then
 b=b+1
 portb=a*
 pause 1000
endif
goto inicio

ya lo simule y no hace lo que pensaba, en donde cometi mi error?*


----------



## D@rkbytes (Dic 1, 2011)

GoX F4yCk3r DB dijo:


> ya lo simule y no hace lo que pensaba, en donde cometi mi error?


Saludos GoX F4yCk3r DB No soy lubeck pero te comentare donde estan tus errores.
Y aprovechando la oportunidad saludos tambien a lubeck.
Mira GoX F4yCk3r DB El primer error esta en que empiezas a incrementar la variable b
antes mandar el valor de Array a* al puerto B
Por lo tanto el valor de b ya es de 1 (0+1)=1 Así que el programa manda el valor del Array a[1]
El segundo error es que la variable b se sigue incrementando, y ya no sirve de nada su incremento.
Ósea que el código funcional vendria quedando así.


		Código:
	

Inicio:
IF PORTA.1=0 THEN
PAUSE 350               ' Opcional para antirrebote si se usa Pushbutton
PORTB=a[b]              ' La variable b debe estar en 0 al iniciar
b=b+1                   ' Incrementar la variable b
IF b>=4 THEN b=0        ' Si la variable b llega a 4 regresarla a 0
ENDIF
GOTO Inicio
END

Ok. Espero te sirva de ayuda 
PD. Dejo aqui la simulación con LED's para que veas como funciona.*


----------



## GoX F4yCk3r DB (Dic 1, 2011)

Darkbytes dijo:


> Saludos GoX F4yCk3r DB No soy lubeck pero te comentare donde estan tus errores.
> Y aprovechando la oportunidad saludos tambien a lubeck.
> Mira GoX F4yCk3r DB El primer error esta en que empiezas a incrementar la variable b
> antes mandar el valor de Array a* al puerto B
> ...


*

hola que tal muchas gracias, me sirvio de mucho tu ayuda, ya logre hacer lo que quiera, pero tengo una pequeña duda??
puedo poner mas de un array en mi codigo???
pq ya puse tres y al parecer el uC no hace los tres arrays*


----------



## lubeck (Dic 1, 2011)

si se puede...

pero depende como lo estas haciendo... pon el codigo.... osea que lo que depende es cuanta memoria y largo del arreglo que ocupas...


----------



## GoX F4yCk3r DB (Dic 1, 2011)

mmm tal ves ese sea mi problema, bueno aqui les dejo mi codigo.


```
include "modedefs.bas"
@ device xt_osc 
trisc=%10000000
dat var byte 
trisb=0
portb=0
'****************************HORARIO WAVE DIRVE*********************************
a VAR BYTE[3]
b VAR BYTE


a[0]=%0011
a[1]=%0110
a[2]=%1100
a[3]=%1001
'****************************ANTIHORARIO WAVE DRIVE*****************************
c var byte[3]
d var byte


c[0]=%1100
c[1]=%0110
c[2]=%0011
c[3]=%1001
'*****************************HORARIO NORMAL STEP*******************************
e var byte[3]
f var byte
clear

E[0]=%0001
E[1]=%0010
E[2]=%0100
E[3]=%1000
'*******************************************************************************
inicio:

serin portc.1, T2400,dat

if dat="0" then     ' horaio     normal
            portb=%0001 ;energiza bobina A
            pause 1000
            portb=%0010 ;energiza bobina C
            pause 1000
            portb=%0100 ;energiza bobina B
            pause 1000
            portb=%1000 ;energiza bobina
            pause 1000
endif

if dat="1" then    ' wave drive horario
            portb=%0011 ;energiza bobina A y C
            PAUSE 1000 
            portb=%0110 ;energiza bobina C y B
            PAUSE 1000 
            portb=%1100 ;energiza bobina B Y D
            PAUSE 1000 
            portb=%1001 ;energiza bobina D Y A
            PAUSE 1000 
endif 

if dat="2" then  ' HALF STEP HORARIO
            portb=%0001 ;energizar bobina A
            PAUSE 1000  ;retardo de 5 mls
            portb=%0011 ;energizar bobina A y C
            PAUSE 1000 ;retardo de 5 mls
            portb=%0010 ;energizar bobina C
            PAUSE 1000 ;retardo de 5 mls
            portb=%0110 ;energizar bobina C y B
            PAUSE 1000 ;retardo de 5 mls
            portb=%0100 ;energizar bobina B
            PAUSE 1000 ;retardo de 5 mls
            portb=%1100 ;energizar bobina B y D
            PAUSE 1000 ;retardo de 5 mls continúa ...
            portb=%1000 ;energizar bobina B
            PAUSE 1000 ;retardo de 5 mls
            portb=%1001 ;energizar bobina B y D
            pause 1000
endif

if dat="3" then   'ANTIHORARIO NORMAL STEP
            portb=%1000 ;energiza bobina D
            pause 1000
            portb=%0100 ;energiza bobina B
            pause 1000
            portb=%0010 ;energiza bobina C
            pause 1000
            portb=%0001 ;energiza bobina A
            pause 1000
ENDIF

if dat="4" then    'ANTIHORARIO WAVE DRIVE
            portb=%1100 ;energiza bobina A y C
            PAUSE 1000 ;espera 5 mls
            portb=%0110 ;energiza bobina C y B
            PAUSE 1000 ;espera 5 mls
            portb=%0011 ;energiza bobina B Y D
            PAUSE 1000 ;espera 5 mls
            portb=%1001 ;energiza bobina D Y A
            PAUSE 1000 ;espera 5 mls
endif            

if dat="5" then  ' ANTIHORARIO HALF STEP
            portb=%1000 ;energizar bobina A
            PAUSE 1000  ;retardo de 5 mls
            portb=%1100 ;energizar bobina A y C
            PAUSE 1000 ;retardo de 5 mls
            portb=%0100 ;energizar bobina C
            PAUSE 1000 ;retardo de 5 mls
            portb=%0110 ;energizar bobina C y B
            PAUSE 1000 ;retardo de 5 mls
            portb=%0010 ;energizar bobina B
            PAUSE 1000 ;retardo de 5 mls
            portb=%0011 ;energizar bobina B y D
            PAUSE 1000 ;retardo de 5 mls continúa ...
            portb=%0001 ;energizar bobina B
            PAUSE 1000 ;retardo de 5 mls
            portb=%1001 ;energizar bobina B y D
            pause 1000
endif

if dat="7" then
PAUSE 350               ' Opcional para antirrebote si se usa Pushbutton
PORTB=a[b]              ' La variable b debe estar en 0 al iniciar
b=b+1                   ' Incrementar la variable b
IF b>=4 THEN b=0        ' Si la variable b llega a 4 regresarla a 0
ENDIF
 
IF DAT="9" then
pause 350
portb=c[D]
d=d+1
if d>4 then d=0
endif   

IF DAT="B" then
pause 350
portb=E[F]
E=E+1
if E>4 then E=0
endif    

goto inicio
end
```

sigo con lo de comunicacion en serie con labview pero ahora es con un motor a pasos, bueno les cuento.
lo que tengo que hacer es hacer el full step, normal step y el half step, añadido a eso tengo que mover el motor digamos 45°,15°,90° etc y eso lo logro  solo activando ciertas bobinas tanto en sentido horario como en sentido antihorario.
el uC que uso es un 17f877A


----------



## lubeck (Dic 1, 2011)

creo (no lo he revizado bien) que puedes utilizar un solo arreglo con los 8 pasos (half y full) y lo unico que tienes que hacer es incrementar el indice de dos en dos o decrementarlo.... o segun lo necesites...

ahorita estoy comiendo, si gustas intentarlo si me explique o mas al rato te pongo un ejemplo



Mira....

primero... la definicion que estas haciendo del arreglo esta mal tu pones* a VAR BYTE[3]* ahi estas diciendo que tienes tres variables a[0],a[1] y a[2], te falta una....

debes poner *a var byte[4]* osea a[0], a[1],a[2],a[3] si las cuentas son cuatro... quedo claro???

por otroo lado me hize bolas con el codigo y como no se como va te dejo solo un ejemplo de como se hace con un solo arreglo...


```
include "modedefs.bas"
@ device xt_osc 
trisc=%10000000
dat var byte 
trisb=0
portb=0
'****************************HORARIO WAVE DIRVE*********************************
a VAR BYTE[8]
b VAR BYTE


a[0]=%0001
a[1]=%0011
a[2]=%0010
a[3]=%0110
a[4]=%0100
a[5]=%1100
a[6]=%1000
a[7]=%1001

'*******************************************************************************
inicio:

serin portc.1, T2400,dat

if dat="0" then
 for b=0 to 6 step 2
  portb=a[b]
  pause 1000
 next b  
endif

if dat="1" then
 for b= 1 to 7 step 2
  portb=a[b]
  PAUSE 1000 
 next b            
endif 

if dat="2" then  ' HALF STEP HORARIO
 for b= 0 to 7 
  portb=a[b]
  PAUSE 1000 
 next b            
endif

if dat="3" then   'ANTIHORARIO NORMAL STEP
 for b=6 to 0 step -2
  portb=a[b]
  pause 1000
 next b  
ENDIF

if dat="4" then    'ANTIHORARIO WAVE DRIVE
 for b= 7 to 1 step -2
  portb=a[b]
  PAUSE 1000 
 next b            
endif            

if dat="5" then  ' ANTIHORARIO HALF STEP
 for b= 7 to 0 step -1 
  portb=a[b]
  PAUSE 1000 
 next b            
endif

if dat="7" then
PAUSE 350               ' Opcional para antirrebote si se usa Pushbutton
PORTB=a[b]              ' La variable b debe estar en 0 al iniciar
b=b+1                   ' Incrementar la variable b
IF b>7 THEN b=0        ' Si la variable b llega a 4 regresarla a 0
ENDIF
 
IF DAT="9" then
pause 350
portb=a[b]
b=b-1
if b<0 then b=7
endif   

IF DAT="B" then
pause 350
portb=a[b]
b=b+2
if b>7 then b=0
endif    

goto inicio
end
```

puede tener errores, me entenderas que hay que probarlo en un simulador para estar seguro de que esta bien.... cosa que me da fiaca hacer...


----------



## andresjavierl (Dic 1, 2011)

Hola a todos, tengo un problema y no se como solucionarlo, leo el estado de un potenciometro con la palabra "POT", y lo muestro en un LCD desde 0 hasta 255, ahora, como hago para cambiar la escala, para cuando este en 0 muestre 88, y cuando este en 255 muestre 108. Esto no puedo resolverlo con una regla de tres directa ya que no es lineal. Como se podra resolver?, desde ya muchas grasias.


----------



## GoX F4yCk3r DB (Dic 2, 2011)

lubeck dijo:


> creo (no lo he revizado bien) que puedes utilizar un solo arreglo con los 8 pasos (half y full) y lo unico que tienes que hacer es incrementar el indice de dos en dos o decrementarlo.... o segun lo necesites...
> 
> ahorita estoy comiendo, si gustas intentarlo si me explique o mas al rato te pongo un ejemplo
> 
> ...



 
Mil gracias lubeck, el codigo corre de 10, solo al cuando va en sentido antihorario en donde se presionan los pulsadores como que se traba y no hace el regreso ya estuve intentando y no mas no logro hacerlo.
Seguire intentando, aunque aun no entiendo muy bien como funciona un array.
Muchas gracias, te lo agradesco mucho


----------



## D@rkbytes (Dic 2, 2011)

lubeck dijo:


> primero... la definicion que estas haciendo del arreglo esta mal tu pones* a VAR BYTE[3]* ahi estas diciendo que tienes tres variables a[0],a[1] y a[2], te falta una....
> 
> debes poner *a var byte[4]* osea a[0], a[1],a[2],a[3] si las cuentas son cuatro... quedo claro???


lubeck. Se te esta olvidando que los arrays empiezan en 0 y terminan en su tamaño.
a VAR BYTE[3]
a[0]=1
a[1]=2
a[2]=3
a[3]=4
Ósea que (a VAR BYTE[3]) tiene 4 lugares de memoria.


----------



## lubeck (Dic 2, 2011)

*
Gox*

tienes el archivo de proteus???

como lo estas probando?

*Dark*
no te entendi muy bien

pero mira este texto de la ayuda del microcode...


> The first array location is element 0. In the fish array defined above, *the elements are numbered fish[0] to fish[7] yielding 8 elements in total.* Because of the way arrays are allocated in memory, there are size limits for each type:


----------



## D@rkbytes (Dic 2, 2011)

lubeck dijo:


> *
> Gox*
> 
> tienes el archivo de proteus???
> ...


Ya viste como tengo razón, el primer elemento es 0 y el ultimo 7 ocupa 8 lugares en total.


----------



## GoX F4yCk3r DB (Dic 2, 2011)

lo que pasa es lo siguiente, en sentido horario esta a la perfeccion y cuando completa una vuelta lo repite sin ningun problema, pero cuando selecciono el sentido antihorario, digamos que hace una vuelta completa y despues energiza 3 bobinas y se para y ya no responde.
Adjunto el codigo que utilizo y mi archivo de proteus.
PD: deje parte de mi codigo, para no hacerme bolas (todavia no le entiendo bien ), tome parte final de tu codigo y lo anexe al mio.


----------



## lubeck (Dic 2, 2011)

Darkbytes dijo:


> Ya viste como tengo razón, el primer elemento es 0 y el ultimo 7 ocupa 8 lugares en total.



Por eso, eso es lo que estoy tratando de decir....

que de* a[0] a a[3] deber ser a var word[4]*

o que no estoy entendiendo...

*Gox*
 deja ver y mañana te digo


----------



## GoX F4yCk3r DB (Dic 2, 2011)

lubeck dijo:


> Por eso, eso es lo que estoy tratando de decir....
> 
> que de* a[0] a a[3] deber ser a var word[4]*
> 
> ...



Gracias lubeck


----------



## D@rkbytes (Dic 2, 2011)

Traducción de la ayuda de PBP

La primera ubicación dentro del arreglo es el elemento cero. En el arreglo fish anterior los elementos 
están numerados fish (0) a fish (7) conteniendo 8 elementos en total . 
Dada la forma en que los arreglos están localizados en memoria hay límites de tamaño para cada tipo.
Ósea que lubeck tu dices colocar un Array[4] por que se usaran 4 valores
Pero para que declarar a VAR BYTE[4] si a VAR BYTE[3] ya contiene 4 elementos.


----------



## lubeck (Dic 2, 2011)

mmm.. creo que estoy dormido ya, porque no entiendo a que te refieres Dark... 
mañana le doy una leida completa.... para ver en que la estoy errando... 

buenas noche a ambos!!


----------



## ricbevi (Dic 2, 2011)

andresjavierl dijo:


> Hola a todos, tengo un problema y no se como solucionarlo, leo el estado de un potenciometro con la palabra "POT", y lo muestro en un LCD desde 0 hasta 255, ahora, como hago para cambiar la escala, para cuando este en 0 muestre 88, y cuando este en 255 muestre 108. Esto no puedo resolverlo con una regla de tres directa ya que no es lineal. Como se podra resolver?, desde ya muchas grasias.



En este momento solo se me ocurre 2 opciones....una que hagas una tabla con la correspondencia de cada valor entre POT y el valor que quieres que represente y otra es que encuentres una expresión matemática que refleje los valores que toma el POT.......ya sabes que la regla de 3 simple no se puede aplicar pero la matemática no se termina ahí. Habría que muestriar(ya que con 2 valores de 256 posibles solo se puede adivinar los valores intermedios) y buscar una expresión que represente dichos valores lo mas exactos posible según tu proyecto tolere/requieras.

Ric.


----------



## lubeck (Dic 2, 2011)

> Pero para que declarar a VAR BYTE[4] si a VAR BYTE[3] ya contiene 4 elementos.



me parece que no Dark... 

mira el archivo adjunto a este link...
https://www.forosdeelectronica.com/f24/matrix-leds-arrays-pic-basic-pro-45923/

igual voy a hacer una prueba, pero a mi me habia omitido la ultima variable, y alguien en el tema ya lo menciono... y como lo he dimensionando siempre asi y nunca he tenido problemas pues no lo he verificado....


----------



## lubeck (Dic 2, 2011)

*GOX*

lo de los array no tiene ningun chiste....

tienes un numero de variables digamos...

jorge=100
lubeck=200
pedro=40
kilo=300
son cuatro variables con cuatro diferentes valores.... lo mismo puedes hacer con un array...
a[0]=100
a[1]=200
a[2]=40
a[3]=300
tambien son cuatro diferntes variables pero la diferencia es que se llaman igual y tienen un "indice" el cual puedes manejar con una constante u otra variable....

digamos
 a[1]=1
es lo mismo que si cuando b=1...
a*=1

y mira este codigo... en teoria conserva la posicion del motor...*


----------



## GoX F4yCk3r DB (Dic 2, 2011)

lubeck dijo:


> *GOX*
> 
> lo de los array no tiene ningun chiste....
> 
> ...


*

Hola lubeck, muchas gracias de verdad estoy agradecido y a la vez un poco avergonzado , el codigo que me proporcionaste, va a la perfeccion.
Hay partes que no le entiendo, pero tendre que ponerme a leer y estudiar para entender bien este pequeño universo de los microcontroladores .
Mil gracias, tendras alguna pagina o informacion para ponerme a estudiar y leer .
salu2*


----------



## atricio (Dic 2, 2011)

andresjavierl dijo:


> Hola a todos, tengo un problema y no se como solucionarlo, leo el estado de un potenciometro con la palabra "POT", y lo muestro en un LCD desde 0 hasta 255, ahora, como hago para cambiar la escala, para cuando este en 0 muestre 88, y cuando este en 255 muestre 108. Esto no puedo resolverlo con una regla de tres directa ya que no es lineal. Como se podra resolver?, desde ya muchas grasias.



hola mi amigo ojala pueda ayudarte yo hice lago parecido 

si tu dices que quieres hacer esto solo deberias hacer esto con una simple regla de 3 no se si usaste eso me avisas como vas con esto asi podemos resolverlo o mira antes yo postie un programa que usaba 3 potenciometros con el ADC y escale los valores para que me los indique en un LCD 16x2


----------



## D@rkbytes (Dic 2, 2011)

lubeck dijo:


> me parece que no Dark...
> 
> mira el archivo adjunto a este link...
> https://www.forosdeelectronica.com/f24/matrix-leds-arrays-pic-basic-pro-45923/
> ...


OK. Saludos
Bien, pues me puse a jugar con el manejo de Arrays y encontre algo interesante.
Si creo un Array de 3 Elementos PEj. a VAR BYTE[3]
se supone me deberia cargar desde el 0 hasta el 3 y lo hace pero al modo que experimente.
Los cargo como:
a[0]=1
a[1]=2
a[2]=3
a[3]=4

Si los mando llamar independientemente, si me muestra el valor de a[0] hasta a[3] 
En cambio si los mando llamar por medio de un FOR x=0 TO 3
Si me omite el valor de a[3] 
Entonces si declaro a VAR BYTE[4] con el FOR... NEXT si me da el valor de a[3] 
Ahora lo que no entiendo es porque si me da el valor de a[3] si lo llamo independientemente.
Hice la misma prueba en VB6 y ahí si me muestra el valor de a[3] con un FOR x=0 TO 3
Así que puede ser debido a que VB6 es de 32Bits aunque me parece ilogico
porque solo se esta trabajando con un Array de 4 valores.
Bien, así que entonces queda claro que para que no se omita el valor del ultimo elemento
se tiene que declarar uno mas.
Pero ya me quedo esa duda de por que un llamado independientemente x=a[3] si funciona.
Declarando solo a VAR BYTE[3] y con un FOR... NEXT no funciona.....
No hice la prueba con valores WORD que pudiera ser otra causa.
Gracias lubeck  y saludos a todos. 
Aqui les dejo el resultado del experimento. BYE4NOW


----------



## atricio (Dic 4, 2011)

esto de los arreglos lo veo muy importante me ha dado una idea como para seguir con mi seguidor de linea 
ademas amigos alguien m puede explicar una conexion serie por 485 lo quiero hacer con labview y 2 esclavos mas y si no es mucho pedir pueden explicarme como son las iterrupciones en este compilador no la entiendo bien


----------



## lubeck (Dic 4, 2011)

> puede explicar una conexion serie por 485 lo quiero hacer con labview y 2 esclavos mas


a mi también me gustaría aprender esa comunicacion.... no he visto ninun codigo en PBP aunque debo aclarar que no lo he buscado mucho...



> y si no es mucho pedir pueden explicarme como son las iterrupciones en este compilador no la entiendo bien



las interrupciones tampoco son muy complicadas, lo que hay que visualizar es que es lo que se llama como una bandera o un Flag, osea un 1 o un 0, y que esa variable siempre esta en un registro del pic y se cambia por Hardware y generalmente la modifica un modulo del pic (como el USART, Timer, I2c, etc) o los puertos IO....

como ya dije se cambia por Hardware, el picbasic lo detecta y llama una rutina a la hora que se detecta...

la instruccion que pone en "alerta" es On interrupt goto MiInt, donde MiInt es la subrrutina...

En la subrrutina se de deshabilita esa "alerta" para no crear conflicto o que se vuelva a ejecutar mientras la esta realizando , se regresa de donde fue llamada con las sig. instrucciones y se habilita la "Alerta"...

DISABLE 
MiInt:
led = 1 
RESUME
ENABLE 

cada pic tiene su forma de activar esas interrupciones....
generalmente hay que ver el Datashit del pic en cuestion para configurar los registros involucrados dependiendo del modulo, el IntCON, y el Option_reg...

espero no haber olvidado mucho


----------



## atricio (Dic 4, 2011)

muchas gracias pero no tendras por ahi un ejemplito para poder entenderte mejor la verdad no te entiendo muy bien que se diga disculpandome por la ignorancia


----------



## lubeck (Dic 4, 2011)

> un ejemplito para poder entenderte mejor la verdad no te entiendo muy bien que se diga disculpandome por la ignorancia



ok... el tema es que no hay un ejemplo que siempre te funcione... porque cada modulo es diferente, es a base de configurar registros...

o lo que es lo mismo de que interrupcion quieres un ejemplo es diferente el de los puertos IO al del USART o al del I2c etc etc...

por otro lado ya investigue un poco del 485, y a lo que entiendo es lo mismo que el serial la diferencia es que hay que activar un puerto para habilitar la transimision del max485, si es half-duplex... voy intentar hacer un ejemplo pronto y lo subo, si alguien tiene uno ya echo pues que mejor...


----------



## lubeck (Dic 4, 2011)

a ver que opinan....

hice este ejemplo del RS-485... todos los pics tiene el mismo codigo (para no batallar) segun yo la unica diferencia de enviarlo como i2c, spi, o por serial entre el 485 y el 232, es que se tiene que habilitar el envio con un puerto....

Va el ejemplo con el Serin....


----------



## lubeck (Dic 6, 2011)

Aca un video-ejemplo de PC 2 RS-485


----------



## arturouc (Dic 6, 2011)

Muy bien lubeck!!! el próximo año construire una red 485 con PLC's y espero
poder poner un micro en la red con tu ejemplo...

P.D. podrías pasarme tu fondo de escritorio...


----------



## atricio (Dic 6, 2011)

muchas gracias por el aporte estudiare lo que pretendiste hacer porque yo tengo quq hacelo con LAbview haber que sale


----------



## lubeck (Dic 6, 2011)

atricio dijo:


> muchas gracias por el aporte estudiare lo que pretendiste hacer porque yo tengo quq hacelo con LAbview haber que sale



el esquema del video se supone que sirve para cualquier programa que maneje el puerto serial...
sea labview, VB, VC o similar...


*no lo he probado en la realidad*, me base en el datashit del max-485



> P.D. podrías pasarme tu fondo de escritorio...



la imagen la baje del internet, nada mas pon Bandera de mexico en google imagenes, seguro te sale....


----------



## baterod3 (Dic 7, 2011)

Hola a todos y de antemano les agradezco su ayuda, Estoy armando un pequeño panel por cierto ya tengo una parte construído, el problema es que quiero mostrar una frase larga "TECENTER TE DESEA FELIZ NAVIDAD" y solo he podido mostrar "TECENTER TE DE", adjunto mi simulacion en proteus y mi codigo en pbp, espero me puedan ayudar....gracias


----------



## reyvilla (Dic 7, 2011)

baterod3 dijo:


> Hola a todos y de antemano les agradezco su ayuda, Estoy armando un pequeño panel por cierto ya tengo una parte construído, el problema es que quiero mostrar una frase larga "TECENTER TE DESEA FELIZ NAVIDAD" y solo he podido mostrar "TECENTER TE DE", adjunto mi simulacion en proteus y mi codigo en pbp, espero me puedan ayudar....gracias



Hola muy simpatico el proyecto el problema que veo es la cantidad de elementos que quieres colocar en la variable FILA[96], el pbp no te permite mas ya que lo maximo para el tipo de variable ya lo superaste.

4.5 ARRAYS (ARREGLOS)
Los arreglos de variables pueden ser creados en una manera similar a las variables.
Etiqueta VAR tamaño (número de elementos)
Etiqueta es cualquier identificador, excluyendo palabras claves, como se describió anteriormente. 
Tamaño es BIT, BYTE ó WORD. Número de elementos es cuantos lugares en el arreglo se desean. Algunos ejemplos de creación de arreglo son los siguientes:
sharks var byte[10]
fish var bit [8]

La primera ubicación dentro del arreglo es el elemento cero. En el arreglo fish anterior los elementos están numerados fish (0) a fish (7) conteniendo 8 elementos en total .
Dada la forma en que los arreglos están localizados en memoria hay límites de tamaño para cada tipo.

Tamaño Número máximo de elementos
BIT 128
BYTE 64
WORD 32

de momento es lo unico de echo ya modifique tu codigo y avance hasta "teccenter te desea",
con otra variable fila 2 te dejo el aechivo para que lo revises...saludoss

PD: Por cirerto hay otro post que es el correcto para este tema te dejo el link.

https://www.forosdeelectronica.com/f24/matriz-leds-pic-pbp-66035/


----------



## baterod3 (Dic 7, 2011)

Gracias por tu aporte, pero no logro solucionar del todo, además cuando lo simulo en proteus aparece la ultima letra y regresa al inicio sin terminar el recorrido del panel....q hagooo ayudaaa por favor


----------



## reyvilla (Dic 7, 2011)

Bueno ese fue solo un ejemplo de como solucionar el problema, lo otro esta de tu parte, yo modifique el código para que no hiciera todo el recorrido ya que tarda bastante y no tenia tiempo de esperar, tu puedes modificarlo a tu gusto...saludoss

Vídeo de la simulación y correcion del inicio de la matriz


----------



## Nano24 (Dic 18, 2011)

Hola amigos del foro, se que esto no tiene que ver con picbasic pero queria dejar un aporte de un reloj parlante en Visual Basic, solo le falta programar la parte del TEXT1.TEXT y decirle al programa que cuando sea igual label2 a text de una alerta para la alarma, el reloj dice la hora cada vez que pasa de una hora a otra.


----------



## atricio (Dic 18, 2011)

reyvilla dijo:


> Bueno ese fue solo un ejemplo de como solucionar el problema, lo otro esta de tu parte, yo modifique el código para que no hiciera todo el recorrido ya que tarda bastante y no tenia tiempo de esperar, tu puedes modificarlo a tu gusto...saludoss
> 
> Vídeo de la simulación y correcion del inicio de la matriz
> 
> ...



parec estar chevere el video pero no se lo puede ver dice que es privado


----------



## reyvilla (Dic 18, 2011)

gracias por el comentario de no ser por el no me fijo en ese pequeño detalles... avísenme cualquier cosa.


----------



## baterod3 (Dic 18, 2011)

Reyvilla una pregunta, bueno aun no soluciono del todo este problema que tengo pero te agradezco tu apoyo. Dime es cuestión solamente de modificar código de programa para mostrar todo el mensaje o derrepente la memoria del pic no abastece....


----------



## atricio (Dic 18, 2011)

una pregunta sera que yo puedo enviar un array de 16 bits mediante el serial para implementarlo a mi red 485 del micro osea 

var1[16]=1101010011011101

esto me facilitaria para no tener que operar nada solo enviar y listo

ojala alguien me pueda ayudar





lubeck dijo:


> Aca un video-ejemplo de PC 2 RS-485
> 
> http://www.youtube.com/watch?v=PsMPc_8okpU



amigo lubek seria posible me ayudes el codigo y un poco me expliques como hiciste la comu
nicacion con el pc y visual la verdad tengo que hacerlo con labview pero no entiendo como usar
los max485


----------



## lubeck (Dic 19, 2011)

atricio dijo:


> una pregunta sera que yo puedo enviar un array de 16 bits mediante el serial para implementarlo a mi red 485 del micro osea
> 
> var1[16]=1101010011011101
> 
> ...


Mmmm.... creo que si... porque no deberia?, nada mas define el arreglo tipo word...






atricio dijo:


> amigo lubek seria posible me ayudes el codigo y un poco me expliques como hiciste la comu
> nicacion con el pc y visual la verdad tengo que hacerlo con labview pero no entiendo como usar
> los max485



es exactamenete igual al 232 excepto que hay que actvar unos milisegundos el pin 2 y 3 del max 485... en el ejemplo del 485 que puse la diferencia entre hacerlo con un 232  serian las lineas marcadas con rojo...


```
CmCOn=7
TrisA=1
TrisB=0
Define BUTTON_PAUSE 200
BVar var byte
SVar Var Byte
Low PortB.0
BVar=0

Main:
 serin PortB.1,0,0,Sub_ser,Svar
  if Svar="J" then toggle portA.1 
 Sub_Ser:
 Button PortA.0,1,150,50,Bvar,0,Sub_button
[COLOR="Red"]  High PortB.0 ' activa pin 2 y 3 del max 485
  pause 10[/COLOR]
  serout   PortB.2,0,["J"]
 [COLOR="Red"] low PortB.0 'desactiva pin 2 y 3 del max 485[/COLOR]
 sub_button:
 
Goto Main
```

para hacerlo con labview tienes que usar ademas del TX y RX el *RTS del puerto serial, para activar el pin 2 y 3*


----------



## javisan190 (Dic 29, 2011)

ola a todo del foro me pueden ayudar con el pic12f675, algun comando para poner el cristal interno


----------



## lubeck (Dic 29, 2011)

En el 12f675 se tiene que calibrar el oscilador con la instruccion DEFINE OSCCAL_1K 1
*si ya se borro de la memoria el dato de calibracion que viene de fabrica la instruccion no servira y tendrias que ajustarlo manualmente con el registro OSCCAL... o no calibrarlo pero obviamente estará fuera de tiempo (o sea que no seran los 4MHz exactos) o podria no funcionar el pic...

y claro definir el fuse INTOSCIO  sin ClkOut

@ device intoscio

o el Intosc con ClkOut

@ device intosc


----------



## baterod3 (Dic 29, 2011)

Algún manual para aprender a usar tmr0 en pic basic pro?


----------



## lubeck (Dic 29, 2011)

baterod3 dijo:


> Algún manual para aprender a usar tmr0 en pic basic pro?



Las ayudas de referencia del PBP y los datashits de cada pic, son para mi los mejores manuales.... y claro googlear para ver ejemplos....


----------



## reyvilla (Dic 29, 2011)

baterod3 dijo:


> Algún manual para aprender a usar tmr0 en pic basic pro?



hola no creo que exista un manual especifico para el TMR0 del 12F675 y PBP, yo utilizo mucho la ayuda del datasheet para ese tipos de cosas ya que alli es donde se encuentra la información necesaria para controlar el TMR0 como la dirección y los bit para la Habilitación de cada uno de los bit's de registro OPTION, en el PBP tu indicas que bit deseas cambiar, ejemplo para habilitar las interrupciónes por desboramiento del TMR0 si lees en la hora de datos te indica que tienes que colocar el bit 7 del registro INTCON en 1, para hacer eso con el PBP seria: 

 INTCON = %10000000 ' con esto habilitas todas las interrupciones.

Ahora si quieres habilitar por desbordamiento del TMR0 la hoja te indica que tienes que colocar el bit 2 del mismo registro INTCON en 1 entonces quedaria asi:

 INTCON = %10000100 ' con esto habilitas todas las interrupciones y habilitas la interrupcion por desbordamiento del TMR0.


 Y quedaria asi.

ON INTERRUPT GOTO SUSB-RUTINA 'Define el vector de interrupción y a donde debe dirigirse al 
producirse la interrupción.

INTCON = %10010000 'Habilita únicamente la interrupción externa por el GPIO.2

Nota: En el caso de las interrupciones hay que recordar desabilitarlas momentáneamente 
para que no ocurran errores si se mantiene la interrupción o se ejecuta otra, y al finalizar la 
sub-rutina de la interrupcion volver habilitarlas para eso:


ON INTERRUPT GOTO SUSB-RUTINA 'Define el vector de interrupción y a donde debe dirigirse al 
producirse la interrupción.

INTCON = %10010000 'Habilita únicamente la interrupción externa por el GPIO.2

INICIO:
...
...
...
GOTO INICIO

SUSB-RUTINA:
Disable 'Deshabilita el procesamiento de ON INTERRUPT
...
...
...
INTCON = %10010000         'habilita la interrupción GPIO.2
Resume 'Continua la ejecucion despues de una interrupción
Enable  'Habilita el procesamiento de ON INTERRUPT
GOTO INICIO
END

Bueno así como para el 12F675 ocurre igual con lo demás PIC, lo que hay que estar pendiente es que quieren que haga el pic con la interrupción y después de ella y que tipo de interrupción va a usar.

Yo apenas estoy con esto y me interesa para la detección de cruce por cero para la activación de un triac voy a ver si hago un ejemplo y lo coloco...cualquier cosa me avisas








Y así como para interrupciones también para el presscaller y el registro OPTION.

A mi me costo bastante entenderlo hasta que me puse con la hoja de datos del 12F675
y una vez lo entiendes lo demas registros puede controlarlos de forma directa y a gusto de lo que se requiera.


----------



## reyvilla (Ene 2, 2012)

Hola a todos feliz año, retomando el tema de las interrupciones con el PIC12F675 en PBP, me he decidido a realizar un pequeño circuito de un dimmer digital con dos pulsadores, con los cuales se baja o se sube la intensidad de luz, el programa es bien sencillo no llega a los 300bytes.

Descripcion y Funcionamiento:
El circuito consta de 3 entradas:
GPIO-5 y GPIO-4, los cuales son los pulsadores para atenuar la luz.
GPIO-2, Detección del cruce por cero por INT. Externa.
GPIO-3, NC

La salida.
GPIO.1, para el control del Gate del Triac.

A traves de la activacion de la interrupcion exeterna del PIC-INT.GPIO.2, se logra detectar
los flancos de bajada o subida.

Para lograr eso con PBP, se realiza una configuracion en el REGISTRO INTCON del pic
el cual tiene los siguientes bit's de configuracion segun Hoja de Datos:

REGISTRO INTCON, conformado de 8 bits de configuración:

bit 7 GIE: Global Interrupt Enable bit 'bit de habilitación de todas las interrupciones
1 = Enables all unmasked interrupts
0 = Disables all interrupts

bit 6 PEIE: Peripheral Interrupt Enable bit 'bit de habilitación de interrupción perimetral
1 = Enables all unmasked peripheral interrupts
0 = Disables all peripheral interrupts

bit 5 T0IE: TMR0 Overflow Interrupt Enable bit 'bit de habilitación de interrupción por desborde del TMR0
1 = Enables the TMR0 interrupt  
0 = Disables the TMR0 interrupt

bit 4 INTE: GP2/INT External Interrupt Enable bit  'bit de habilitación de interrupción externa por GPIO.2
1 = Enables the GP2/INT external interrupt
0 = Disables the GP2/INT external interrupt

bit 3 GPIE: Port Change Interrupt Enable bit(1)'bit de habilitación de interrupción externa por cambio de estado en el puerto completo GPIO.
1 = Enables the GPIO port change interrupt
0 = Disables the GPIO port change interrupt

bit 2 T0IF: TMR0 Overflow Interrupt Flag bit(2) 'bit de habilitación de bandera de interrupción por desborde del TMR0 
1 = TMR0 register has overflowed (must be cleared in software)
0 = TMR0 register did not overflow

bit 1 INTF: GP2/INT External Interrupt Flag 'bit de habilitación de bandera interrupción externa por GPIO.2
1 = The GP2/INT external interrupt occurred (must be cleared in software)
0 = The GP2/INT external interrupt did not occur

bit 0 GPIF: Port Change Interrupt Flag 'bit bit de habilitación de bandera interrupción externa por cambio de estado en el puerto completo GPIO.
1 = When at least one of the GP5:GP0 pins changed state (must be cleared in software)
0 = None of the GP5:GP0 pins have changed state

ENABLE: habilitado
DISABLE: des-habilitado

Ya conociendo cada bit del registro, tome la decisión de realizar la siguiente configuración:

INTCON = %10010000 'Habilita la interrupción GPIO.2

Ya teniendo esta configuración cuando exista un cambio en el PIN GPIO.2 se generara una interrupción.

Ahora el problema esta en que tipo de cambio se va a detectar, por flanco de bajada o de subida, en este caso como es para la detección de cruce por cero para la activación del triac se necesitan detectar ambos flancos de lo contrario no se encendería de manera optima la lampara. 

Para definir el tipo de detección o el modo, esta el registro OPTION, el cual también esta conformado por 8Bit.

bit 7 GPPU: GPIO Pull-up Enable bit ' bit de habilitación de las resistencias PULL-UP internas
1 = GPIO pull-ups are disabled
0 = GPIO pull-ups are enabled by individual PORT latch values

bit 6 INTEDG: Interrupt Edge Select bit ' bit de habilitación del tipo de flanco de interrupción externa por GPIO.2
1 = Interrupt on rising edge of GP2/INT pin 'Por flanco ascendente
0 = Interrupt on falling edge of GP2/INT pin 'Por flanco descendente

bit 5 T0CS: TMR0 Clock Source Select bit  ' bit de habilitación de tipo de fuente clock para el TMR0
1 = Transition on GP2/T0CKI pin
0 = Internal instruction cycle clock (CLKOUT)

bit 4 T0SE: TMR0 Source Edge Select bit  ' bit de habilitación del tipo incremento del clock si es GPIO.2 la fuente.
1 = Increment on high-to-low transition on GP2/T0CKI pin
0 = Increment on low-to-high transition on GP2/T0CKI pin

bit 3 PSA: Prescaler Assignment bit' bit de habilitación y pre-establecimiento del presscaler
1 = Prescaler is assigned to the WDT
0 = Prescaler is assigned to the TIMER0 module
bit 2-0 PS2S0: Prescaler Rate Select bits


El bit que nos permite elegir por que tipo de flanco va activarse la interrupcion externa del GPIO.2 es el bit 6 el cual establece dos modos por flanco(1) ascendente y por flanco(2) descendente.

Como necesitamos ambos pero solo permite uno, se debe jugar con la configuración de estos bit turnandolos en cada flanco de tal manera que se logre detectar ambos.

Se puede hacer con sentencias IF...THEN
con ! ó con ^...

He realizado pruebas con todas y funcionan y quedarian asi:

OPTION_REG.6 = OPTION_REG.6 ^%1
OPTION_REG.6 = !OPTION_REG.6
en el caso de if...then
se pregunta si se encuentra en 1 ó 0 y se cambia de estado.

Teniendo esto claro con un ciclo de interrupción se puede lograr controlar el triac.

Aquí un ejemplo de incremento de una variable para la atenuación de un bombillo.

@ device pic12f675,intrc_osc,wdt_on,pwrt_off,mclr_oFF,bod_off,protect_off
Define OSC 4


DEFINE OSCCAL_1K 1	
CMCON = 7             
ANSEL = 0             
TRISIO = %00111101   
GPIO  = %00000000    
OPTION_REG = %01000000
WPU = %00110000      

SUBE VAR GPIO.5
BAJA VAR GPIO.4
TRIAC VAR GPIO.1
A VAR WORD

TRIAC = 0
a = 0   'PUNTO DE ACTIVACION MINIMO 0ms MAXIMO 8.3ms EN TEORIA 
PAUSE 500 

ON INTERRUPT GOTO CRUCE_POR_CERO 'Define el vector de interrupción
INTCON = %10010000 'Habilita la interrupción GPIO.2

INICIO:
A = A + 1
IF A >= 3800 THEN
A = 0
ENDIF
GOTO INICIO

DISABLE
CRUCE_POR_CERO: 
PAUSEUS A
IF A => 1 THEN
TRIAC = 1
PAUSEUS 100
TRIAC = 0
ENDIF
INTCON.1=0
OPTION_REG.6 = OPTION_REG.6 ^%1
RESUME
ENABLE
END

Bueno hasta aquí he logrado llegar cualquier cosa que este mal me avisan para corregirla aun sigo aprendiendo de los triac, PIC y del PBP...saludosss 

PD: Luego subo la simulacion.


----------



## atricio (Ene 2, 2012)

hola amigos una gran pregunta ya porfin pude comprar los micros para mi red y los 75176 para la comunicacion 485 pero tengo un gran problema tengo 1 16F877A para usarlo como master y otros dos 16F628A como esclavos pero no se como configurarlos y poder usarlos para la comunicacion serial ojala me pudieran ayudar a hacerlo


----------



## atricio (Ene 2, 2012)

lubeck dijo:


> Aca un video-ejemplo de PC 2 RS-485
> 
> http://www.youtube.com/watch?v=PsMPc_8okpU



Amigo lubeck en el diseño de esa pequena red 485 colocas entre el max232 y el max485 unas 40106 asi esta bien el conversor 232 a 485 o es por fines de la simulacion nada disculpen la pregunta tan ignorante pero estoy tratando de hacer la red y con ello quiero ver si comienzo a armarla y poder seguir probando de antemano gracias por la ayuda que me puedan brindar


----------



## lubeck (Ene 2, 2012)

atricio dijo:


> Amigo lubeck en el diseño de esa pequena red 485 colocas entre el max232 y el max485 unas 40106 asi esta bien el conversor 232 a 485 o es por fines de la simulacion nada disculpen la pregunta tan ignorante pero estoy tratando de hacer la red y con ello quiero ver si comienzo a armarla y poder seguir probando de antemano gracias por la ayuda que me puedan brindar



sip. es un 40106, entre el 232 y el 485...

pero si entendi bien tu vas a comunicar un 877 como master y unos 628 como esclavos asi que no se necesita ni el max232 ni el 40106... 

intenta subir algo para ver que estas tratando de hacer... seria mas facil...


----------



## atricio (Ene 2, 2012)

Gracias por contestar amigo mira lo que pretendo hacer es una red de hasta 3 esclavos como master la PC realizar un VI en Labview para comandar las operaciones de los esclavos como control y monitoreo eso lo debo hacer con microcontroladores mas o menos como planteaste el video pero con operacion de lectura y escritura de variables como activar y desactivar entradas leer las entradas analogas de los mismos con la ventaja de ser esclavos manipular a mi conveniencia que esclavo mando a realizar he tratado en empezar pero me hago mucho lio a tratar de enviar y recibir como tambien direccionar los esclavos no logro estructurar el protocolo...por lo que trato de hacer es primero ultimar el codigo simulandolo que he tradado de hacer pero sin exito no se si es mi proteus o no logre armarlo bien ahi adjunto una grafica de lo que he probado


----------



## lubeck (Ene 3, 2012)

bueno es que el esquema que pones es para conectar una PC a la red 485 y primero dices que el 877 iba a ser un master y dos 628 como esclavos...por eso mi intension de que primero hagas algo (en archivo proteus) para que definas bien lo que deseas hacer..

si lo vemos en el sentido estricto, no creo que ninguno sea esclavo ni maestro, sino que todos pertencen a una Red de comunicacion....

yo lo que haria si fuera tu seria hacer la comicacion serial normal primero entre dos pic, ya que se comunican haciendo lo que quieres, y hasta despues  pones los integrados 75176...

para comunicar dos, tres, cuatro o etc pics  hice este _ejemplo_....


----------



## atricio (Ene 4, 2012)

hola mi amigo gracias de nuevo por responder mira mi intencion como te dije es que hacer una red con una comunicacion maestro esclavo con el computador hacer la aplicacion desde labview para controlar y direccionar los esclavos y las tareas que quiero que haga desde el labview para manipular a los micros...pero como te mencione anteriormente quiero intentar hacer la simulacion con el proteus y asi poder ir depurando los problemas que tenga pero no logro establecer la comunicacion simulada por serie sera que tu me puedes ayudar con el diagrama para simularlo al parecer no puedo copiarlo bien desde el video que hiciste el favor de colgar en el foro disculpa las molestias de antemano


----------



## Dario (Ene 5, 2012)

hola gente del foro, feliz año nuevo.
bueno, comenzando el año en este post. les cuento que estoy intentando hacer funcionar una matriz de leds de 5x7 con in pic16f628 sin registros de desplazamientos, solo pic. bueno, despues de investigar un poco y haciendo un poco de copy paste , logre hacer desplazar un HOLA. el problema es que, la multiplexacion es muy lenta. me gustaria saber si alguno de uds me tira algunas otras ideas o si me dan una idea de como hacer para que no se vea ta lenta la multiplexacion modificando el programilla que ya les comparto mas abajo.
saludos a todosss.


```
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
DEFINE OSC 4 
CMCON = 7                     ' desactivo el convertidor AD del puerto A
TrisA=%10110000               'todo el port A como entrada
TrisB=%00000000               'todo el port B como salida
PORTA = %10110000             'todo el port A en 1
PORTB = %00000000             'todo el port B en 0

k var word 
j var byte 
x var byte [30]
i var byte
y var byte [5]   

'columnas
'H
x[0]=%11000000
x[1]=%11110111
x[2]=%11110111
x[3]=%11000000
x[4]=%11111111
'O
x[5]=%11100001
x[6]=%11011110
x[7]=%11011110
x[8]=%11100001
x[9]=%11111111
'L
x[10]=%11000000
x[11]=%11011111
x[12]=%11011111
x[13]=%11011111
x[14]=%11111111
'A
x[15]=%11000001
x[16]=%11110110
x[17]=%11110100
x[18]=%11000001
x[19]=%11111111
'/
x[20]=%11111101
x[21]=%11111011
x[22]=%11110111
x[23]=%11101111
x[24]=%11011111
'/
x[25]=%11111101
x[26]=%11111011
x[27]=%11110111
x[28]=%11101111
x[29]=%11011111


'col
y[0]=%00000001
y[1]=%00000010
y[2]=%00000100
y[3]=%00001000
y[4]=%01000000

inicio: 
for k=0 to 100
for i=0 to 26
for j=0 to 4
portb=x[i+j]
porta=y[j]
pause 25
next j 
next i
next k
porta=0
portb=0
goto inicio
```


----------



## D@rkbytes (Ene 5, 2012)

D@rio dijo:


> hola gente del foro, feliz año nuevo.
> bueno, comenzando el año en este post. les cuento que estoy intentando hacer funcionar una matriz de leds de 5x7 con in pic16f628 sin registros de desplazamientos, solo pic. bueno, despues de investigar un poco y haciendo un poco de copy paste , logre hacer desplazar un HOLA. el problema es que, la multiplexacion es muy lenta. me gustaria saber si alguno de uds me tira algunas otras ideas o si me dan una idea de como hacer para que no se vea ta lenta la multiplexacion modificando el programilla que ya les comparto mas abajo.
> saludos a todosss.
> 
> ...



Saludos D@rio y Prospero año 2K12
Una pregunta, ¿El sistema lo probaste armado en Protoboard o solo lo has simulado?
Por que note un error en la configuración del proyecto en ISIS tienes el oscilador configurado a 1Mhz.
Y en el programa lo defines a 4Mhz y como usas el interno pues a esa velocidad trabajara.
Yo solo cambie la configuración del Cristal a 4Mhz y trabajo mas rápido.
También modifique la pausa de 25 Ms por 10 Ms y también con eso se obtubo mayor velocidad.
Bueno, eso fue lo que realize.  
PD. Los comentarios de PORTA estan mal, pero bueno solo son comentarios.


----------



## Dario (Ene 5, 2012)

gracias darkbytes.


> Una pregunta, ¿El sistema lo probaste armado en Protoboard o solo lo has simulado?


estoy probandolo armado en un protoboard, por eso no preste atencion al isis jeje...



> También modifique la pausa de 25 Ms por 10 Ms y también con eso se obtubo mayor velocidad.


si, yo tambien hice eso, pero solo logre que las letras pasaran mas rapido, por lo que decidi dejarlo asi...



> PD. Los comentarios de PORTA estan mal, pero bueno solo son comentarios.


jeje... si, eso pasa cuando uno hace copi paste jajaja... 
saludos y gracias de nuevo amigo, sigo escuchando ideas


----------



## ferdy575 (Ene 5, 2012)

D@rio dijo:


> hola gente del foro, feliz año nuevo.
> bueno, comenzando el año en este post. les cuento que estoy intentando hacer funcionar una matriz de leds de 5x7 con in pic16f628 sin registros de desplazamientos, solo pic. bueno, despues de investigar un poco y haciendo un poco de copy paste , logre hacer desplazar un HOLA. el problema es que, la multiplexacion es muy lenta. me gustaria saber si alguno de uds me tira algunas otras ideas o si me dan una idea de como hacer para que no se vea ta lenta la multiplexacion modificando el programilla que ya les comparto mas abajo.
> saludos a todosss.
> 
> ...


 

hola Dario revise tu trabajo y está fácil la reforma solo basta con activar el oscilador externo del pic a 4 mhz en el programa y en la rutina de columnas ponemos a4 en alto y a6 en bajo ponemos el porta4 para la salida uno y le ponemos una resistencia de 10k en pull up y así funciona bien revisa la rutina y veras los cambios que le hice suerte con tu proyecto...


----------



## Dario (Ene 5, 2012)

ferdy575 dijo:


> hola Dario revise tu trabajo y está fácil la reforma solo basta con activar el oscilador externo del pic a 4 mhz en el programa y en la rutina de columnas ponemos a4 en alto y a6 en bajo ponemos el porta4 para la salida uno y le ponemos una resistencia de 10k en pull up y así funciona bien revisa la rutina y veras los cambios que le hice suerte con tu proyecto...



pues, no se si sere demasiado burro pero ya probe asi y sigue igual... bueno, voy a seguir investigando aver si le doy en el clavo jeje... gracias amigo fredy 
saludosss


----------



## baterod3 (Ene 5, 2012)

Dario, a ver si me proporcionas algun manual bien ilustrado sobre el uso del TMR0 te agrdaecería....


----------



## Dario (Ene 5, 2012)

baterod3 dijo:


> Dario, a ver si me proporcionas algun manual bien ilustrado sobre el uso del TMR0 te agrdaecería....



¡¡¡SEÑOR!!!, ¡¡¡SI, SEÑOR!!! :enfadado::enfadado::enfadado:  
:estudiando: ... ... ...
 te recomiendo este libro, con el y con el manual de pic basic, he aprendido lo que se y como veras, no soy un genio jejeje... saludosss
(no te enojes por la broma )


----------



## atricio (Ene 6, 2012)

es muy buen libro ami me ha ayudado un monton, alguien ha probado la simulacion del proteus con el compim para realizar simulaciones con el pueto serie yo no lo logro ojala me puedan ayudar aqui cuelgo lo que he realizado.


----------



## lubeck (Ene 6, 2012)

atricio dijo:


> es muy buen libro ami me ha ayudado un monton, alguien ha probado la simulacion del proteus con el compim para realizar simulaciones con el pueto serie yo no lo logro ojala me puedan ayudar aqui cuelgo lo que he realizado.



estas utilizando el virtual serial Port para simular la comunicacion entre el labview y el proteus???

es necesario eh!....

cuando comunicas directamente un pic con el puerto serial del pc, no es necesario que pongas el max232, el pic tiene diodos de proteccion para limitar los voltajes y dejarlos en niveles TTL....

yo utilice en mi esquema el max232 porque solo estoy utilizando el puerto serial del pc y el max485 sin microcrontrolador y ahi si tengo que ajustar a los niveles ttl....


----------



## ucusita (Ene 6, 2012)

Hola Foreros, tengo un problema y tal vez me puedan ayudar.
Hice una interface para visualizar datos que se integraría a un sistema de domos instalados en distintos ambientes. Cada Domo puede controlar varias de estas interfaces como por ejemplo: expansión de salidas, expansión de entradas y un módulo de visualización de datos.
Ahi viene el problema, yo uso PICBASIC PRO v2.42, Microcode Studio v4 para generar el Hex (obvio con MPASM) sobre un PIC 16f628A.

El programa debería leer dos teclas y esperar un "pseudocomando" que inventé que le actualizaría algunos parámetros como Fecha actual, Temperatura ext., Humedad relativa, Veloc del Viento y Visibilidad.

A este parámetro lo debería guardar en una dirección de memoria EEPROM y mostrarlo secuencialmente en un display LCD, hasta aquí todo bonito, pero al compilar me da un error:

Warning[219] c:\pbp\pbppic14.lib 5974 : Invalid RAM location specified.

Abro esta librería y tal parece que estuviera relacionado con los READ y los WRITE, pero no puedo encontrar el error.

Me darían una mano?

Por anticipado mil gracias!


----------



## lubeck (Ene 6, 2012)

> Me darían una mano?



pues pon la parte del codigo donde intentas escribir en el eeprom 

aunque yo creo que lo deberias compilar con el pbp y no con el mpasm, pero solo viendo que estas haciendo con el codigo...


----------



## reyvilla (Ene 6, 2012)

Hola a todos estoy realizando un dimmer ya logre la deteccion por cruce por cero y la activacion del triac, el programa funciona al 100%, lo probe en el protoboard y anda muy bien, les dejo este pequeño aporte para quien lo necesite, ahora tengo un problemita, quiero adaptarle otro programa que ya realice y que se que funciona pues ya lo he probado solo, la cuestion es que cuando trato de acoplarlo con el del dimmer no me funciona quisiera saber si alguien me puede echar una mano, el codigo que quiero hacer es este:


```
'****************************************************************
'*  Name    : DIMMER 2 BOTONES.BAS                              *
'*  Author  : REIMY VILLAMIZAR                                  *
'*  Notice  : Copyright (c) 2011                                *
'*          : All Rights Reserved                               *
'*  Date    : 04/12/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ device pic12f675,intrc_osc,wdt_on,pwrt_off,mclr_oFF,bod_off,protect_off
  
  Define OSC 4
  Include "modedefs.bas"
    
'DEFINE OSCCAL_1K 1    
CMCON = 7            
ANSEL = 0             
TRISIO = %00111101     
GPIO  = %00000000    
OPTION_REG = %00000000
WPU = %00000000 
     
LED VAR GPIO.0
SUBE VAR GPIO.5
IN VAR GPIO.4
TRIAC VAR GPIO.1
A VAR WORD
DATO VAR BYTE


A = 1
DATO = 0


ON INTERRUPT GOTO CRUCE_POR_CERO 
INTCON = %10010000 



INICIO:
DATO = 0
SERIN IN,N2400,1,INICIO,["."],DATO

GOTO INICIO


DISABLE
CRUCE_POR_CERO:
IF DATO = "2"  THEN
A = A + 20 
ENDIF
PAUSEUS A
IF A => 1 THEN
TRIAC = 1
PAUSEUS 100
TRIAC = 0
ENDIF
INTCON.1=0
OPTION_REG.6 = OPTION_REG.6 ^%1
RESUME
ENABLE
END
```

y el que  si funciona como dimmer con dos pulsadores es este:


```
@ device pic12f675,intrc_osc,wdt_on,pwrt_off,mclr_oFF,bod_off,protect_off
Define OSC 4
     
DEFINE OSCCAL_1K 1    
CMCON = 7             
ANSEL = 0            
TRISIO = %00111101     
GPIO  = %00000000     
OPTION_REG = %00000000
WPU = %00110000      


SUBE VAR GPIO.5
BAJA VAR GPIO.4
TRIAC VAR GPIO.1
A VAR WORD

TRIAC = 0


a = 1   
PAUSE 500 

ON INTERRUPT GOTO CRUCE_POR_CERO 
INTCON = %10010000

INICIO:
IF SUBE = 0 AND BAJA = 0 THEN GOTO INICIO
IF SUBE = 0 AND BAJA = 1 THEN GOTO INCREMENTA
IF SUBE = 1 AND BAJA = 0 THEN GOTO DECREMENTA
IF SUBE = 1 AND BAJA = 1 THEN GOTO INICIO 
GOTO INICIO


INCREMENTA:
IF A => 6000 THEN GOTO INICIO
A = A + 1
GOTO INICIO

DECREMENTA:
IF A =< 1 THEN GOTO INICIO
A = A - 1
GOTO INICIO 

DISABLE
CRUCE_POR_CERO: 
PAUSEUS A
IF A => 1 THEN
TRIAC = 1
PAUSEUS 100
TRIAC = 0
ENDIF
INTCON.1=0
OPTION_REG.6 = OPTION_REG.6 ^%1
RESUME
ENABLE
END
```

PD: Un video de la activacion del triac con el codigo del dimmer con dos botones:



http://www.youtube.com/watch?v=QOQshwNctBo&feature=youtu.be


----------



## atricio (Ene 6, 2012)

lubeck dijo:


> estas utilizando el virtual serial Port para simular la comunicacion entre el labview y el proteus???
> 
> es necesario eh!....
> 
> ...



muchas gracias por la respuesta si estoy usando el virtual serial port pero al momento de usarlo y quererlo conectar no se envian los datos yo subi el esquema del proteus y del labview que he estado probando pero no lo he logrado..segun no mal entiendo tengo que usar el max232 por acomples de niveles porque quiero transmitir y recibir desde el micro a la pc
esa es mi duda que no puedo simularlo o soy bien inutil o bien bruto que no alxanzo ha hacerlo


----------



## reyvilla (Ene 6, 2012)

Bueno ya logre hacer funcionar mas o menos el codigo del triac con el serin cuando lo tenga mas completo lo coloco, ahora les dejo otro aporte de control de dos lcd con un solo pic, un ejemplo que saque de otro foro de http://www.picbasic.co.uk muy bueno de echo tienen librerias para picbasic pro, en fin aca esta la simulacion y el codigo...saludosss


----------



## atricio (Ene 6, 2012)

muy interesante que microcode estas usando


----------



## D@rkbytes (Ene 7, 2012)

reyvilla dijo:


> ahora les dejo otro aporte de control de dos lcd con un solo pic, un ejemplo que saque de otro foro de http://www.picbasic.co.uk muy bueno de echo tienen librerias para picbasic pro, en fin aca esta la simulacion y el codigo...saludosss


Saludos reyvilla.
Te comento que hay 2 errores en el código.
En la variable LCD2_Disable  VAR  PORTB.6
En el resto del programa esta como LDC2_Disable
y esta referencia LCDEN = 1 + 2 no se usa en el programa.
Solo hay que corregir eso, y si funciono


----------



## reyvilla (Ene 7, 2012)

a OK gracias por la correcion, se me olvido quitarlo yo me fije despues igual gracias, estoy usando microcode  version 3.0


----------



## lubeck (Ene 7, 2012)

reyvilla dijo:


> Bueno ya logre hacer funcionar mas o menos el codigo del triac con el serin cuando lo tenga mas completo lo coloco, ahora les dejo otro aporte de control de dos lcd con un solo pic, un ejemplo que saque de otro foro de http://www.picbasic.co.uk muy bueno de echo tienen librerias para picbasic pro, en fin aca esta la simulacion y el codigo...saludosss



Muy buen aporte Reyvilla
 me quedan dos preguntas....

1.- Lo has probado en la realidad?
2.- Las resistencias a RB7 de cuantos Ohms son? de 4k7?





atricio dijo:


> muchas gracias por la respuesta si estoy usando el virtual serial port pero al momento de usarlo y quererlo conectar no se envian los datos yo subi el esquema del proteus y del labview que he estado probando pero no lo he logrado..segun no mal entiendo tengo que usar el max232 por acomples de niveles porque quiero transmitir y recibir desde el micro a la pc
> esa es mi duda que no puedo simularlo o soy bien inutil o bien bruto que no alxanzo ha hacerlo





> pero al momento de usarlo y quererlo conectar no se envian los datos yo subi el esquema del proteus y del labview que he estado probando pero no lo he logrado.


Yo estoy haciendo mi mejor esfuerzo en decirte como lo puedes hacer, lamentablemente yo ni instalado tengo el labview por eso no puedo ayudarte con esa parte del codigo...



> segun no mal entiendo tengo que usar el max232 por acomples de niveles porque quiero transmitir y recibir desde el micro a la pc



si mal entiendes, te repito no es necesario porque el pic tiene diodos de proteccion que hace que trabaje a niveles TTL, en muchos lados esta explicado eso...


> esa es mi duda que no puedo simularlo o soy bien inutil o bien bruto que no alxanzo ha hacerlo


Al principio se batalla un poco pero es bien sencillo... verificaste que el pic este en un puerto com y el labview en otro....

digamos el pic que trabaje con el COM1 y el labview con el COM2 y en el virtual port este el enlace entre ellos y ambos trabaje con los mismos baudios? digamos 9600...


----------



## reyvilla (Ene 7, 2012)

Hola lubeck si están probados físicamente, no por mi pero si por darrel taylor que de echo el tiene un gran aporte de librerias de interrupción en picbasic, las resistencias son de 1K...aqui esta la imagen del circuito la pagina de donde lo saque...saludosss

http://www.google.co.ve/imgres?q=LC...rt=0&ndsp=21&ved=1t:429,r:12,s:0&tx=116&ty=40


----------



## atricio (Ene 7, 2012)

*Yo estoy haciendo mi mejor esfuerzo en decirte como lo puedes hacer, lamentablemente yo ni instalado tengo el labview por eso no puedo ayudarte con esa parte del codigo...
*
DE nuevo muchas gracias por la respuesta lo cual es muy valiosa de antemano agradezco la paciencia que me tienes y a las preguntas que realizo


*si mal entiendes, te repito no es necesario porque el pic tiene diodos de proteccion que hace que trabaje a niveles TTL, en muchos lados esta explicado eso...
*
La verdad sabia que las entradas del micro tienen los diodos de proteccion pero no sabia que habia como conectarlo directamente pero he escuchado que he puede entorpecer la transmision y la recepcion lo cual investigare bien para salir de dudas 

*Al principio se batalla un poco pero es bien sencillo... verificaste que el pic este en un puerto com y el labview en otro....

digamos el pic que trabaje con el COM1 y el labview con el COM2 y en el virtual port este el enlace entre ellos y ambos trabaje con los mismos baudios? digamos 9600...[/QUOTE]
*
te comento que los programas que subi tengo conectado el circuito del proteus al com2 y el labview al com3 creados con el virtual serial port....los he configurado para 8 bits de datos sin paridad un bit de stop y una velocidad de 9600 

Sigo intentando hacerlo pero le hare la lucha


----------



## lubeck (Ene 8, 2012)

> Sigo intentando hacerlo pero le hare la lucha



vi el archivo que anexaste  y no esta el archivo de PBP, hay un codigo en basic pero es para otro compilador, ahora digo.... y si preguntas en el tema adecuado?


----------



## atricio (Ene 8, 2012)

perdon cometi un grave error subi el que realice en mikrobasic ya lo subo el que hice en pbp lo realice en microcode disculpame por favor


----------



## reconato (Ene 15, 2012)

Hola reyvilla, el dimmer está funcionando perfectamente y es el más simple que he visto, felicitaciones.


----------



## baterod3 (Ene 15, 2012)

Reconato puedes proporcionarnos el esquema de tu dimmer?.....gracias


----------



## reyvilla (Ene 15, 2012)

gracias reconato por las referencias, ahora me gustaría poder realizar otro pero con un control ya sea RF o infrarojo, el problema esta es en fusionar ambos códigos ya que el del dimmer trabaja con detección por cruce por cero con  interrupción externa y eso limita bastante el código si alguien me da alguna sugerencia o ayuda les agradecería de verdad igual muchas gracias por sus criticas...saludosss


----------



## Dario (Ene 18, 2012)

hola gente...
bueno, les cuento que ya solucione mi problema de matriz 5x7 y aqui como siempre, comparto la solucion que esta a su ves en otro post del foro. aqui va_ https://www.forosdeelectronica.com/posts/605281/ _. bueno, paso a contarles el problema que tengo ahora con otro proyecto que estoy tratando de llevar adelante. hoy me ha llegado un wii motion que compre por internet para experimentar. se me ocurrio de ver si se podia leer las señales del giroscopo de tres ejes que trae este aparatito jeje... este tiene un puerto i2c. 
se que con las declaraciones i2cread e i2cwrite del pbp podria leerlo pero no se como poner los bits de control que corresponden al wii motion y no tengo idea de como hacer para leerlo. tengo algunos ejemplos de lectura y escritura en eeproms pero obviamente no es lo mismo, al menos en parte. podran acaso darme una manito con este proyectito? gracias, saludosss


----------



## lubeck (Ene 18, 2012)

> hoy me ha llegado un wii motion


Hola dario...

pon por aqui  la ficha tecnica del aparato.... 
en esta debe estar el protocolo, o las direcciones y los datos....


----------



## Dario (Ene 18, 2012)

lubeck dijo:


> Hola dario...
> 
> pon por aqui  la ficha tecnica del aparato....
> en esta debe estar el protocolo, o las direcciones y los datos....



hola lbeck, gracias por responder.
bueno, lo que pude conseguir es esta descripcion en ingles de la wikipedia:

http://wiibrew.org/wiki/Wiimote/Extension_Controllers creo que es lo que mas se acerca. podrias ayudarme a descifrar un poco esto? saludosss

aca consegui el datasheet del giroscopo itg3205 que es el sensor que lleva incorporado, lo dejo adjunto


----------



## lubeck (Ene 19, 2012)

Mmm.. pues lei el  link del wiki pero no creo que sea lo mismo a lo que necesitas... y el protocolo del giroscopio puede no ser igual al protocolo del aparato en si, es decir, puede que uno se comunique externamente con un microcontrolador que tenga el aparato y ese comunicarse con el giroscopio, tu necesitarias el protocolo del microcontrolador del aparato obvio....no el del giroscopio.

ese protocolo debe ser similar a esto...



y debe estar explicado para que sirve cada instruccion, sino es como intentar manejar un avion sin algun manual de vuelo, ni instructivo, ni instructor


----------



## judex (Ene 19, 2012)

bueno he hecho mi primer programilla un poco dificil, se trata de un contador y unos led, dependiendo de que numero estes se encienden unos led u otros. tiene un pequeño fallo, que justo al arrancarlo en proteus se encienden los tres led primeros, pero luego ya no vuelve a pasar. si alguno de vosotros sabe como arregrarlo me lo podria decir por favor, ya que no logro encontrar la solucion.
es un 16f877 con 4 led, un pulsador para aumentar el numero y un 7447 de d0 a d4 con un 7 segmentos para ver el numero:
El programa es:

trisd=%11110000                      
trisb=0
numero var byte                                          
flag var bit                        
z var byte
x var byte
led var portb.0
led1 var portb.1
led2 var portb.2
led3 var portb.3
led4 var portb.4
bot var portc.7
encerar:                            
numero=0                            
display:                           
portd=numero                       
if bot=0 then aumentar              
pause 80                             
flag=0                              
goto display
aumentar:                           
if flag=1 then goto display         
flag=1                              
if numero=9 then encerar            
numero=numero+1                              
inicio:
z=numero
select case z
case is <3
for x=0 to z
portb=%00000001
pause 200
portb=%00000010
pause 200
portb=%00000100
pause 200
portb=%00001000
pause 200
portb=%00010000
pause 200
low led4
next
case 4
for x=0 to 4
high led3
pause 50
low led3
pause 70
next
case is >8
for x=3 to z
pause 200
high led1
pause 200
low led1
high led2
pause 200
low led2
pause 200
next
end select
goto display
end


----------



## Dario (Ene 19, 2012)

lubeck dijo:


> Mmm.. pues lei el  link del wiki pero no creo que sea lo mismo a lo que necesitas... y el protocolo del giroscopio puede no ser igual al protocolo del aparato en si, es decir, puede que uno se comunique externamente con un microcontrolador que tenga el aparato y ese comunicarse con el giroscopio, tu necesitarias el protocolo del microcontrolador del aparato obvio....no el del giroscopio.
> 
> ese protocolo debe ser similar a esto...
> 
> ...



pues si que tenes razon  es bastante incomprensible jeje... bueno, he estado investigando unpoco mas y he encontrado un codigo para comunicar un nunchak con un 16f628 hecho en pbp, aqui lo dejo, lo voy a investigar un poco para ver como hace la lectura. obviamente el nunchak no tiene el mismo codigo de control que me hace falta pero me sirve para saber como leer estos aparatitos. ah, tambien encontre un codigo en c para arduino que puede leer los datos del wii motion, se trata de un sistema imu para estabilizar un cuadrocoptero. esta buenisima la idea. aca comparto la parte en la que yo pienso que comienza la lectura del wii notion, talves alguno  de los que entienden c para arduino nos ayude a descifrar como se produce la lectura del wii motion.
saludosss


```
#if !GYRO 
// ************************************************************************************************************
// I2C Wii Motion Plus + optional Nunchuk
// ************************************************************************************************************
// I2C adress 1: 0xA6 (8bit)    0x53 (7bit)
// I2C adress 2: 0xA4 (8bit)    0x52 (7bit)
// ************************************************************************************************************
void WMP_init(uint8_t d) {
  delay(d);
  i2c_writeReg(0xA6, 0xF0, 0x55); // Initialize Extension
  delay(d);
  i2c_writeReg(0xA6, 0xFE, 0x05); // Activate Nunchuck pass-through mode
  delay(d);
  if (d>0) {
    // We need to set acc_1G for the Nunchuk beforehand; It's used in WMP_getRawADC() and ACC_Common()
    // If a different accelerometer is used, it will be overwritten by its ACC_init() later.
    acc_1G = 200;
    uint8_t numberAccRead = 0;
    // Read from WMP 100 times, this should return alternating WMP and Nunchuk data
    for(uint8_t i=0;i<100;i++) {
      delay(4);
      if (WMP_getRawADC() == 0) numberAccRead++; // Count number of times we read from the Nunchuk extension
    }
    // If we got at least 25 Nunchuck reads, we assume the Nunchuk is present
    if (numberAccRead>25)
      nunchuk = 1;
    delay(10);
  }
}

uint8_t WMP_getRawADC() {
  uint8_t axis;
  TWBR = ((16000000L / I2C_SPEED) - 16) / 2; // change the I2C clock rate
  i2c_getSixRawADC(0xA4,0x00);

  if (micros() < (neutralizeTime + NEUTRALIZE_DELAY)) {//we neutralize data in case of blocking+hard reset state
    for (axis = 0; axis < 3; axis++) {gyroADC[axis]=0;accADC[axis]=0;}
    accADC[YAW] = acc_1G;
    return 1;
  } 

  // Wii Motion Plus Data
  if ( (rawADC[5]&0x03) == 0x02 ) {
    // Assemble 14bit data 
    gyroADC[ROLL]  = - ( ((rawADC[5]>>2)<<8) | rawADC[2] ); //range: +/- 8192
    gyroADC[PITCH] = - ( ((rawADC[4]>>2)<<8) | rawADC[1] );
    gyroADC[YAW]  =  - ( ((rawADC[3]>>2)<<8) | rawADC[0] );
    GYRO_Common();
    // Check if slow bit is set and normalize to fast mode range
    gyroADC[ROLL]  = (rawADC[3]&0x01)     ? gyroADC[ROLL]/5  : gyroADC[ROLL];  //the ratio 1/5 is not exactly the IDG600 or ISZ650 specification 
    gyroADC[PITCH] = (rawADC[4]&0x02)>>1  ? gyroADC[PITCH]/5 : gyroADC[PITCH]; //we detect here the slow of fast mode WMP gyros values (see wiibrew for more details)
    gyroADC[YAW]   = (rawADC[3]&0x02)>>1  ? gyroADC[YAW]/5   : gyroADC[YAW];   // this step must be done after zero compensation    
    return 1;
  } else if ( (rawADC[5]&0x03) == 0x00 ) { // Nunchuk Data
    ACC_ORIENTATION(  ( (rawADC[3]<<2)      | ((rawADC[5]>>4)&0x02) ) ,
                    - ( (rawADC[2]<<2)      | ((rawADC[5]>>3)&0x02) ) ,
                      ( ((rawADC[4]>>1)<<3) | ((rawADC[5]>>5)&0x06) ) );
    ACC_Common();
    return 0;
  } else
    return 2;
}
#endif

void initSensors() {
  delay(200);
  POWERPIN_ON
  delay(100);
  i2c_init();
  delay(100);
  if (GYRO) Gyro_init();
  else WMP_init(250);
  if (BARO) Baro_init();
  if (ACC) {ACC_init();acc_25deg = acc_1G * 0.423;}
  if (MAG) Mag_init();
```

codigo en pbp para leer un nunchak:


```
'****************************************************************
'*  Name    : NUNCHUCK RF.BAS                                   *
'*  Author  : [Hugo Oliveira]                                   *
'*  Notice  : Copyright (c) 2010                                *
'*          : All Rights Reserved                               *
'*  Date    : 09-07-2010                                        *
'*  Version : 1.0                                               *
'*  Notes   : BreadBoard                                        *
'*          : PIC16F628A                                        *
'****************************************************************
include "modedefs.bas"
DEFINE OSC 4
DEFINE I2C_HOLD 1

@ DEVICE pic16F628A, INTOSC_OSC_NOCLKOUT
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_OFF
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, BOD_OFF
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, CPD_OFF
@ DEVICE pic16F628A, PROTECT_OFF


'                               VARIÁVEIS
' ====================================================================
Jx var byte
Jy var byte
Ax var Byte
Ay var byte
BE var bit
BD var bit
buffer var byte[6]

'                       REGISTOS PINOUT 1 = IN; 0 = OUT
' ====================================================================
         '76543210
TRISA  = %00000000 
TRISB  = %00000010
CMCON = 7  
VRCON = 0  
'                              NOMES PINOUT
' ====================================================================
LED    VAR PORTA.1
TX     Var PORTB.2
RX     VAR PORTB.1
SDA    var PORTB.4
SCL    var PORTB.5
'                              DEFENIÇÕES
' ====================================================================
DEFINE DEBUG_REG PORTB  
DEFINE DEBUG_BIT 2
DEFINE DEBUG_BAUD 19200
DEFINE DEBUG_MODE 0

'                             INICIO PROGRAMA
' ====================================================================
Start:
 HIGH LED
 PAUSE 500
 LOW LED
 PAUSE 500
 HIGH LED
 PAUSE 500
 LOW LED
 PAUSE 500
 HIGH LED
 
Main:

 GOSUB NUNCHUCK
'                             JoyStick Eixo X
' ====================================================================
  if JX>70 and JX<=100 then
   'SEROUT TX,T9600,["%TE"]
   DEBUG "%TE"
   pause 20
  endif
  
   if JX>0 and JX<=70 then
   'SEROUT TX,T9600,["%TE1"]
   DEBUG "%TE1"
   pause 20 
  endif 
  
  if Jx>180 and Jx<210 then
   'SEROUT TX,T9600,["%TD"]
   DEBUG "%TD"
   pause 20
  endif 
  
  if Jx>=210 then
   'SEROUT TX,T9600,["%TD1"] 
   DEBUG "%TD1"
   pause 20
  endif
'                             JoyStick Eixo Y
' ====================================================================  
  if JY>70 and JY<=100 then
   'SEROUT TX,T9600,["%TB"]
   DEBUG "%TB"
   pause 20 
  endif
  
  if JY>0 and JY<=70 then
   'SEROUT TX,T9600,["%TB1"]
   DEBUG "%TB1"
   pause 20 
  endif  
  
  if Jy>180 and Jy<210 then
   'SEROUT TX,T9600,["%TC"]
   DEBUG "%TC" 
   pause 20
  endif
  
  if Jy>=210 then
   'SEROUT TX,T9600,["%TC1"]
   DEBUG "%TC1" 
   pause 20
  endif    
'                             Axis -  Eixo X
' ====================================================================
  if Ax<100 then
   'SEROUT TX,T9600,["%TE2"]
   DEBUG "%TE2"
   pause 20 
  endif
  
 if Ax>140 then
   'SEROUT TX,T9600,["%TD2"]
   DEBUG "%TD2" 
   pause 20
  endif
'                             Axis -  Eixo Y
' ====================================================================  
  if Ay<110 then
   'SEROUT TX,T9600,["%TB2"]
   DEBUG "%TB2" 
   pause 20
  endif
  
  if Ay>140 then
   'SEROUT TX,T9600,["%TC2"]
   DEBUG "%TC2" 
   pause 20
  endif
'                             Botões
' ====================================================================    
  IF BE = 0 then
   'SEROUT TX,T9600,["%RL1"]
   DEBUG "%RL1" 
   pause 80
  endif

  IF BD = 0 then
   'SEROUT TX,T9600,["%RD1"]
   DEBUG "%RD1" 
   pause 80
  endif    
goto Main
'                      SUB ROTINA - LEITURA DADOS NUNCHUK
' ====================================================================
NUNCHUCK:
 i2cwrite sda,scl,$A4,$40,[$00]
  pause 10
 i2cwrite sda,scl,$A4,[$00]
  pause 10
 i2cread sda,scl,$A5,[STR buffer\6]
  pause 10
  
 Jx=(buffer[0] ^ $17)+ $17 
 Jy=(buffer[1] ^ $17)+ $17
 Ax=(buffer[2] ^ $17)+ $17
 Ay=(buffer[3] ^ $17)+ $17
 buffer[5]=((buffer[5] ^ $17)+ $17 )

 if (buffer[5] & $01) <> 0 then
   BE=1
  else
   BE=0
 endif
 
 if (buffer[5] & $02) <> 0 then
   BD=1
  else
   BD=0
 endif
 
RETURN
END
```


----------



## reyvilla (Ene 19, 2012)

Hola dario hace poco realice un sistema de lectura y escritura de una memoria y un real timer por un bus ic2, y me encontré con el problema de identificar o poder diferenciar con quien me estaba comunicando y descrubri que hay un comando llamado "con" en el PBP que se utiliza para determinar los bit de control de cada dispositivo conectado en el bus ic2, en tu caso seria: "CONT CON %110100" para poder indicarle al dispositivo que esta abierta la comunicación con el, luego de eso esta las direcciones y el contenido de cada una de ellas, donde puedes leer cada dato de posición y guardarlo en una variable tipo byte ejemplo:

TEMPERATURAH VAR BYTE
TEMPERATURAL VAR BYTE
EJEZH VAR BYTE
EJEZL VAR BYTE
EJEYH VAR BYTE
EJEYL VAR BYTE
EJEXH VAR BYTE
EJEXL VAR BYTE

CONT CON %110100
ADDR VAR BYTE


ADDR = $1B
I2CREAD sda,scl,cont,addr,[TEMPERATURAH, TEMPERATURAL, EJEZH, EJEZL, EJEYH, EJEYL, EJEXH_
EJEXL] 
PAUSE 10

'hasta este punto ya tendrías los valores de cada eje, los bit bajos y los altos, ahora quedaría
'mostrarlos en una lcd que valores son ya que lei que son con formato de complemento a dos o algo así
'lo otro seria sumar ambos valores L y H para tener un valor completo bueno eso creo de todas formas es solo una idea cual quier cosa me avisas...saludosss


----------



## Dario (Ene 19, 2012)

ok, muchas gracias amigo reyvilla por el ejemplo. ahora me que da una duda, he estado leyendo el codigo en c y he notado que al principio dice: I2C adress 1: 0xA6 (8bit)    0x53 (7bit) al parecer el bit de control del wii motion seria este y el de abajo seria para el nunchak ¿uds que opinan?
y si fuera este y yo quisiera leer los datos utilizando tu ejemplo amigo rey ¿deberia quedar algo asi?

I2CREAD sda,scl,0xA6,addr,[TEMPERATURAH, TEMPERATURAL, EJEZH, EJEZL, EJEYH, EJEYL, EJEXH_
 EJEXL]
 o la declaracion CONT CON %110100 es valida para cualquier dispositivo? perdon si me estoy equivocando 
saludosss


----------



## reconato (Ene 19, 2012)

baterod3 dijo:


> Reconato puedes proporcionarnos el esquema de tu dimmer?.....gracias




Hola a todos, baterod3 el esquema está por debajo. reyvilla  también tratando de conseguir algo para poner aquí. Perdón por la mala pronunciación, estoy utilizando un traductor.
 Saludos.


----------



## lubeck (Ene 19, 2012)

reconato dijo:


> Hola a todos, baterod3 el esquema está por debajo. reyvilla  también tratando de conseguir algo para poner aquí. Perdón por la mala pronunciación, estoy utilizando un traductor.
> Saludos.



pues yo creo que esta bien el diagrama....aunque veo que los diodos 1n4007 no se necesitan...
la resistencia R2 yo la pondria de 5M... y creo que el simbolo del Triac mas bien parece de Tiristor


----------



## reyvilla (Ene 19, 2012)

D@rio dijo:


> ok, muchas gracias amigo reyvilla por el ejemplo. ahora me que da una duda, he estado leyendo el codigo en c y he notado que al principio dice: I2C adress 1: 0xA6 (8bit)    0x53 (7bit) al parecer el bit de control del wii motion seria este y el de abajo seria para el nunchak ¿uds que opinan?
> y si fuera este y yo quisiera leer los datos utilizando tu ejemplo amigo rey ¿deberia quedar algo asi?
> 
> I2CREAD sda,scl,0xA6,addr,[TEMPERATURAH, TEMPERATURAL, EJEZH, EJEZL, EJEYH, EJEYL, EJEXH_
> ...



Yo manejando un real timer y una memoria eerprom me quedo asi:

CONT CON %10100000 'memoria eeprom 24C04
CONT2 CON %11010000 'real timer DS1303 

el comando con es como la identificación del dispositivo, digamos que tienes 100 dispositivos con conexión i2c, para poder controlar individualmente cada uno, tiene que poder identificarlo y llamarlo, seria como un numero de telefono, al llamarlo el dispositivo se activa y ya puedes leerlo o escribirlo. 

En la hoja de cada dispositivo tiene ese comando, para la eeprom 24c04 es %10100000 para el dc1307 es  %11010000 y para tu dispositivo es %11010000, con lo cual un ejemplo para controlar los 3 por el mismo bus seria:

addr var byte
CONT CON %10100000 'memoria eeprom 24C04
CONT2 CON %11010000 'real timer DS1303 
CONT3 CON %11010010 'tu dispositivo, donde el los últimos bit son de identificación 

Nota: el dispositivo tiene un registro que se llama WHO_AM_I, quien soy yo? se trata 
de un identificador modificable el cual te permite utilizar varios al mismo tiempo
por el mismo bus de datos.

luego para escribir y leer o modificar registros seria:

ADDR = 0
I2CREAD sda,scl,cont2,addr,[SEGUNDOS,MINUTOS,HORA,DIAS,DIAF,MES,ANO] 'DS1307
PAUSE 10

addr = 1B
I2CREAD sda,scl,cont3,addr,[TEMPERATURAH, TEMPERATURAL, EJEZH, EJEZL, EJEYH, EJEYL, EJEXH, EJEXL]' tu dispositivo
pause 10

addr = 0
I2CREAD sda,scl,cont,addr,[VAR1,VAR2,VAR3]'VA DE LA 0 A 3 EEPROM
PAUSE 10

Y cualquier cosa me avisas me interesa tu proyecto ya que nunca he manejado uno y se ve interesante...


----------



## Dario (Ene 19, 2012)

ok, aver si estoy entendiendo bien. lo que intentas decirme es que no importa que que numero o codigo traiga de fabrica el aparato, yo le puedo asignar una identificacion a mi gusto siempre que sea en binario? por ejemplo si enves de: CONT3 CON %11010010 yo quisiera ponerle: CONT3 CON %10010010 ¿es asi? perdon por lo cabeza dura jajaja


----------



## reyvilla (Ene 19, 2012)

Mas o menos aun ni yo estoy muy seguro, según la hoja de datos te dice que el registro 

WHO_AM_I:

Traductor de google:

Registro Quien soy yo?

Descripción:
Este registro se utiliza para verificar la identidad del dispositivo.

Parámetros:

ID Contiene la dirección I2C del dispositivo, que también se puede cambiar a través de este registro.

El Bit7 siempre debe estar en "0".
El valor de Power-on-reset de bit6: Bit1 es 110 100.
************************
Por lo que logro entender con siempre va hacer %110100
************************
Por otro lado dice tambien:

La dirección del esclavo del ITG-3205 dispositivos se b110100X que es de 7 bits de longitud. El bit LSB de la dirección de 7 bits es determinado por el nivel lógico en el pin 9. Esto permite que dos ITG-3205 dispositivos sean conectados al bus I2C mismo. cuando es utilizado en esta configuración, la dirección de uno de los dispositivos deben ser b1101000 (pin 9 es lógico bajo) y la dirección de la de la otra debe ser b1101001 (pin 9 es lógico alto). La dirección I2C es almacenado en el registro 0 (WHO_AM_I registro).

Entonces únicamente puedes conectar dos, uno con dirección %110100 y el pin nueve en 0V y otro con %1101001 y el pin 9 en alto. Y así tendrías dos ITG-3205 en la misma linea de querer conectar otro necesitarías otros pines del microcontrolador.

PD: Lo que tu hablas del 0xA6 se refiere a otro comando para otro dispositivo al parecer, ya que si lo pasas a binario queda %10100110, lo cual no coincide con la hoja de datos del que tu nombras ITG-3205, parece, mas bien el de una memoria eeprom que es %10100.


----------



## lubeck (Ene 20, 2012)

> yo le puedo asignar una identificacion a mi gusto siempre que sea en binario? por ejemplo si enves de: CONT3 CON %11010010 yo quisiera ponerle: CONT3 CON %10010010 ¿es asi? perdon por lo cabeza dura jajaja



mmm... yo creo que no.... todos los perifericos I2c como memoria, expansores, giroscopios...etc...

tienen un identificador unico y de fabrica que es el Addres.... en algunos se configuran 3bits o 2 bits por hardware para identificarse si se van a usar del mismo tipo...
ejemplo un expansor de 16bits tiene 3bits que hace que solo se puedan usar hasta 8 del mismo tipo...

poniendo esto: CONT3 CON %10010010  solo estas diciendo que cont3 es una constante (no variable) con el byte 10010010...  ver lo que significa Variables y Constantes....

yo insisto... podrias poner la ficha tecnica del aparato... o estoy entendiendo mal y el wiimote es un giroscopio?


----------



## Dario (Ene 20, 2012)

amigo mio, ahora comprendo porque no nos entendiamos jejeje... yo estoy tratando de leer el wiimotion directamente desde su conector y vos indicandome como leer el ITG3205 jejeje... he visto en un foro de aeromodelismo como cortan los pines de comunicacion i2c del itg y los sacan directamente a un arduino jejeje. aqui una imagen. ¿que opinas? ¿combiene hacer lo mismo? 
saludosss

pd: amigo lubeck: no consigo la ficha tecnica del aparato


----------



## lubeck (Ene 20, 2012)

> he visto en un foro de aeromodelismo como cortan los pines de comunicacion i2c del itg y los sacan directamente a un arduino jejeje. aqui una imagen. ¿que opinas? ¿combiene hacer lo mismo?


a mi eso ya me suena mas coherente....

si puedes ponerlo directo entonces la direccion del giroscopio es segun el datashit....


> The slave address of the ITG-3205 devices is b110100X which is 7 bits long



ahi tu puedes usar dos giroscopios en una misma red i2c y el 7bit lo defines por hardware con el pin 9 AD0 si lo pones a tierra ese pin la direccion seria 1101000 si lo pones a positivo la direccion seria 1101001

y el comando en PBP seria...
I2CRead Datapin,Dataclock,%1101000,27 'esto para leer el temp_out_H

espero se entienda...


----------



## reyvilla (Ene 20, 2012)

Hola lubeck con lo que indicas no es lo mismo que mencione arriba de los dos dispositivos? y se entendió como una variable debido a que "cont" pareciera una, pero mas que una variable es como un symbol para el comando "con" que es el address que tu indicas que mencione o puse de ejemplo como si fuera un numero de teléfono para cara dispositivo, claro es una manera de decir, se sabe que es una identificación unica para cada tipo de dispositivo i2c, La que es variable es la Addr que utilizo para hacer el código mas claro para mi, por otro lado hubo una confusión con respecto a lo que se quiere hacer, una cosa es controlar el ITG-3205 directamente y otra es controlarlo a trabes de la tarjeta del control de wii, y por mi lado y para seguir aportando mas al foro voy a comprar unas memorias para hacer pruebas y quizás tal vez un control para hacer mas pruebas y según me vaya les voy indicando cualquier cosa si me equivoque me avisan saludoss

PD: Ya conseguí los controles unos tirados en mi casa de casualidad ahora los reviso y les aviso para empezar hacer pruebas...saludoss


----------



## reconato (Ene 20, 2012)

lubeck dijo:


> pues yo creo que esta bien el diagrama....aunque veo que los diodos 1n4007 no se necesitan...
> la resistencia R2 yo la pondria de 5M... y creo que el simbolo del Triac mas bien parece de Tiristor


 


lubeck gracias por tu comentarios . Lo que realmente es el símbolo de Tiristor  es justo lo que había en Livewire. La resistencia y la más alto posible. Experimenté con el 16F628 y sólo funciona por debajo de 680K.


----------



## reyvilla (Ene 20, 2012)

Hola reconato, yo utilice 2M y me funciono, con respecto a los diodos no utilice ningun diodo puse la resistencia directo al pin del pic, recuerda colocar como entrada el pin del pic a utilizar y de configurar bien las interrupciones, por otro lado te recomiendo trates de conseguir el proteus para realizar mejor tus esquemas y así también poder probar y depurar bien el código antes de montarlo físicamente...saludosss


----------



## lubeck (Ene 20, 2012)

> Hola lubeck con lo que indicas no es lo mismo que mencione arriba de los dos dispositivos?



Es que no habia leido bien lo que pusiste , pero efectivamente estamos hablando practicamente de lo mismo, y yo tambien me confundi de como querian controlar el dispostivo...  

lo que creo que no queda muy claro es lo de una constante, una variable y un symbol...

segun yo en una variable su valor puede ser cambiado durante la ejecucion de un programa, y una constante no.. se asigna una sola vez y no puede ser cambiada durante la ejecucion... en PBP la instruccion symbol efectivamente pareciera una constante pero no lo es, symbol es un reemplazo de un nombre... o sea que cada que el compilador vea eso lo reemplaza por lo que se le haya asignado... los tres son similares pero no son lo mismo...


----------



## reyvilla (Ene 20, 2012)

Exacto se supone que cada uno tiene un propósito especifico, symbol yo lo uso nombrar pines del pic, y "con" segun el pbp y lo que yo entiendo significa parámetro de control o dirección de control para el bus i2c, y las constantes nunca que yo recuerde las he manejado, a menos que sean definiciones 
por ejemplo OSC 20 aunque no es parte del programa igual es una constante ya que su valor no cambia en todo el codigo.


----------



## lubeck (Ene 20, 2012)

a ver si no estamos hablando ahora si de cosas diferentes  ehhhh 

esto es sacado de la ayuda de PBP


> Named constants may be created in a similar manner to variables. It can be more convenient to use a constant name instead of a constant number. If the number needs to be changed, it may be changed in only one place in the program; where the constant is defined. Variable data cannot be stored in a constant.
> 
> Example
> 
> ...



las llamadas constantes son creadas de manera similar a las variables, puede ser mas conveniente usar un nombre de una constante en lugar de un numero constante... si se necesita cambiar el numero, este puede ser cambiado solo en un lugar del programa,cuando esta es definida. el valor de una variable no puede ser definida en una constante... (o algo asi dice )

con el ejemplo mice siempre va a tener el valor de 3...
traps siempre va a ser 3000...

si yo durante la ejecucion del programa pongo mice=mice+1 seguramente me marcara un error(no lo he probado) porque es como si dijera 3=3+1...


----------



## reyvilla (Ene 20, 2012)

Cierto ya logre ver porque el ejemplo del pbp, como el ejemplo es de una memoria, para simplificar lineas ellos colocan el valor de direccionamiento en una constante llamada cont, que se refiere al control del dispositivo i2c que este conectado.

Osea en ves de decir:

I2CREAD PORTA.0,PORTA.1,%10100000,0,[VAR1]

QUEDARIA ASI:

addr = 0
I2CREAD SDA,SCL,CONT,addr,[VAR1]

DONDE SDA = PORTA.0 ; SCL = PORTA.1 ; cont = %10100000 ; addr = 0

Osea el ejemplo del PBP es para ponerlo de una manera que se entienda a la hora de leer y se vea mas bonito por que de resto le veo mucho sentido.


----------



## D@rkbytes (Ene 20, 2012)

Saludos. Yo realize un programa para clonar memorias I2C
en ese programa obviamente se necesitan dos memorias o mas XD
Esa palabra de control %10100000  o $A0 no cambia por eso se usa una Constante
que coincidentemente la llaman de control.
Yo para referirme a una o a otra memoria lo que hago es solo definir dos líneas SDA y SCL

Esta es la traducción de la ayuda en PBP del uso de Constantes

4.6 CONSTANTES 

Las llamadas constantes pueden ser creadas de manera similar a las variables.
Puede ser mas conveniente usar un nombre de constante en lugar de un número constante.
Si el número necesita ser cambiado, únicamente puede ser cambiando
en un lugar del programa donde se define la constante.
No pueden guardarse datos variables dentro de una constante.

Etiqueta CON expresión constante

Algunos ejemplos son:

Mice CON 3
Traps CON Mice *1000


----------



## lubeck (Ene 20, 2012)

> Osea el ejemplo del PBP es para ponerlo de una manera que se entienda a la hora de leer y se vea mas bonito por que de resto le veo mucho sentido.



Sip.. es solo por comodidad y que se vea mas bonito... 

como dices es lo mismo poner
I2CREAD PORTA.0,PORTA.1,%10100000,0,[VAR1]

que:
SDA Var PortA.0
SCL var PortA.1
Cont Con %10100000
I2CREAD SDA,SCL,CONT,addr,[VAR1]

quizas cuando es una sola linea i2cread  sea mas conveniente no definir las constantes y variables, pero si son dos o mas pues es mas conveniente usarlas, solo para ahorrarse tiempo y que se vea mas lindo el codigo....


----------



## Dario (Ene 20, 2012)

hola amigos, gracias por sus comentarios. les cuento que mañana voy a hacer la primera prueba de lectura del wiimotion, primero voy a intentar leer directamente el wiimotion como dispositivo y despues leer directamente el giroscopio. 
saludosss


----------



## lubeck (Ene 20, 2012)

> primero voy a intentar leer directamente el wiimotion como dispositivo



Oki... yo la verdad con la información que esta en el wiki, no me queda nada claro como es que se maneja como dispositivo si no te daba alguna opinion....

espero que funcione y te deseo suerte...


----------



## Dario (Ene 21, 2012)

ok, gracias por tu ayuda amigo lubeck. te cuento que para intentar leer el wii directamente, voy a usar la direccion que aparece en el comentario del programa en c que a segun creo yo, es la direccion del integrado wiimotion. el comentario es el siguiente:

// I2C adress 1: 0xA6 (8bit)    0x53 (7bit)

yo creo que la direccion o bit de control es 0x53  a segun estuve leyendo en el foro todopic, aca dejo el enlace http://www.todopic.com.ar/foros/index.php?topic=30669.0 

saludosss


----------



## lubeck (Ene 21, 2012)

esto se me hizo interesante....


> La dirección I2C de del mando es 0x52 (0b1010010), por lo que para realizar lecturas direccionaremos a 0xA5 (0b10100101) y para escrituras a 0xA4 (0b10100100).
> 
> El procedimiento para obtener los datos es el siguiente:
> 
> ...



sacado de aqui


----------



## Dario (Ene 21, 2012)

lubeck dijo:


> esto se me hizo interesante....
> 
> 
> sacado de aqui



si, eso seria para leer el nunchak. estube haciendo unas comparaciones entre los pasos que da para empezar a leerlo y el codigo en pbp que puse anteriormente y eso es exactamente lo que hace ese codigo, aca dejo la parte en la que creo que lo hace.

```
NUNCHUCK:
 i2cwrite sda,scl,$A4,$40,[$00]
  pause 10
 i2cwrite sda,scl,$A4,[$00]
  pause 10
 i2cread sda,scl,$A5,[STR buffer\6]
  pause 10
  
 Jx=(buffer[0] ^ $17)+ $17 
 Jy=(buffer[1] ^ $17)+ $17
 Ax=(buffer[2] ^ $17)+ $17
 Ay=(buffer[3] ^ $17)+ $17
 buffer[5]=((buffer[5] ^ $17)+ $17 )

 if (buffer[5] & $01) <> 0 then
   BE=1
  else
   BE=0
 endif
 
 if (buffer[5] & $02) <> 0 then
   BD=1
  else
   BD=0
 endif
 
RETURN
```

para escribir el mio, me voy a basar en ese haciendo primero rutinas simples de lectura de cada eje y como no tengo un lcd, voy a utilizar un servo para mostrar el movimiento del mismo, apenas tenga novedad la subo.
saludos


----------



## mecatrodatos (Ene 21, 2012)

Dario mira estos proyectos:

http://www.starlino.com/usb_gamepad.html

http://www.photopete.com/swarm/balbot.htm

te serviran demasiado para tu proyecto saludos


----------



## baterod3 (Ene 21, 2012)

Ese diagrama dimmer q muestran está medio loco o yo no lo entiendo?....


----------



## reyvilla (Ene 25, 2012)

Hola baterod3 a cual diagrama de dimmer te refieres?
Y que es lo que no entiendes?


----------



## baterod3 (Ene 25, 2012)

Algún diagrama diferente de dimmer q alguien por ahi tenga a la mano....


----------



## lubeck (Ene 25, 2012)

porque diferente ese de reyvilla esta bien... o a que te refieres?


----------



## shura (Ene 27, 2012)

Que tal amigos...

Les dejo un circuito regulador de voltaje variable con un LM317, simulado en proteus, para los que les agrade esta bueno...


*Por otra parte pido de sus apoyos *para agregarle a este circuito un LCD que me indique el voltaje presente en mi regulador de voltaje...

pueden modificar el circuito y dejar el programa para el LCD

o algun circuito que me recomienden en proteus que traiga este LCD que me indique los volts presentes....

Saludos///


----------



## reyvilla (Ene 27, 2012)

En esta pagina: http://www.esteca55.com.ar/proye-fuente-valdorre.html 
El compañero comparte una fuente muy completa con LCD..saludosss


----------



## shura (Ene 27, 2012)

esta padrisima amigo, deja la entiendo primero por que se ve muy completa, aparte que no manejo mucho el Eagle...


----------



## judex (Ene 27, 2012)

hola amigos, he conseguido este programa de un libro de basic de una sht11 con un pic 18f2250, pero no comprendo unas pocas cosas de el y me gustaria saber si podriais ayudarme a comprenderlas. el programa funciona bien pero como dije no entiende esas cositas.lo pongo y os comento mis dudas

```
1 DEFINE OSC 8
2 DEFINE LCD_DREG PORTB   
3 DEFINE LCD_DBIT 4   
4 DEFINE LCD_RSREG PORTB
5 DEFINE LCD_RSBIT 0      
6 DEFINE LCD_EREG PORTB   
 7 DEFINE LCD_EBIT 1   
 8 CONTROL VAR BYTE             
 9 ISI1    VAR BYTE      
 10 ISI2    VAR BYTE      
 11 U1      VAR BYTE        
 12 U2      VAR BYTE
 13 H0      VAR HAM.BYTE0
 14 H1      VAR HAM.BYTE1
 15 HAM     VAR WORD
 16 RAI    var word
 17 ISI     VAR WORD
 18 P1      VAR WORD
 19 P2      VAR WORD
20 P3      VAR WORD            
 21 W       VAR WORD
 22 DTA     VAR PORTC.4
 23 CLK     VAR PORTC.5    
 24 ISARET  VAR BIT  
 25 HATA    var BIT
 26 PORTC=0
 27 PORTB=0
 28 TRISC=0
 29 TRISB=0
 30 INICIO:
     31   CONTROL=%00000101
       32 HAM=0
      33 GOSUB CONTROL_PULSO
   34     GOSUB DATO_HUMEDAD
      35  GOSUB HUMEDAD      
      36  PAUSE 50
       37 CONTROL=%00000011
       38 HAM=0
       39 RAI=HAM  
      40  GOSUB CONTROL_PULSO
        41 Gosub DATO_TEMPERATURA
     42   GOSUB TEMPERATURA          
43 HUMEDAD:    
   44     LCDOut $FE,2
    45    LCDOut "    HUME = ",DEC U1 , "," , DEC1 U2," % "
   46   RETURN           
 47 TEMPERATURA:    
     48   LCDOut $FE,$C0  
   49     if ISARET=1 THEN  
      50    LCDOut "    TEMP =-",DEC ISI1 , "," , DEC1 ISI," C "
       51   RETURN  
       52 endIF  
     53   LCDOut "    TEMP = ",DEC ISI1 , "," , DEC1 ISI2," C "
     54   RETURN          
55 EMPEZAR:
   56     OUTPUT DTA
      57  OUTPUT CLK
    58    HIGH DTA
   59     LOW CLK
   60     PAUSE 1
   61     HIGH CLK
      62  LOW DTA
     63   PAUSE 1
    64    LOW CLK
     65   PAUSE 1
     66   HIGH CLK
     67   PAUSE 1
     68   HIGH DTA
   69     LOW CLK
     70   RETURN
71 RESET:  
   72     OUTPUT DTA
     73   OUTPUT CLK
     74   high DTA=1
     75   FOR W=0 TO 9
   76     HIGH CLK
    77    pause 1
     78   LOW CLK
      79  Next W
      80  Return
81 CONTROL_PULSO:
   81     GOSUB EMPEZAR
      83  SHIFTOUT DTA,CLK,1,[CONTROL]
    84    INPUT DTA
    85    PULSOUT CLK,10
    86    HATA=0
   87     FOR W=0 to 65500
      88     IF DTA=0 then SALIR
    89    NEXT W
     90   HATA=1        
 91 SALIR:  
     92   SHIFTIN DTA,CLK,0,[H1]
    93    OUTPUT DTA
      94  LOW DTA
      95  PULSOUT CLK,10
     96   INPUT DTA
    97    SHIFTIN DTA,CLK,0,[H0]
       98  PULSOUT CLK,10
      99  RETURN
100 DATO_TEMPERATURA:
     101   if ham<4200 then
       102   ISARET=1
       103   ISI1=(4200-HAM)/100
      104    ISI2=((4200-ham)//100)/10
     105     goto EXCESO
      106  endif
    107    ISI1=(HAM-3850)/100
    108    ISI2=((HAM-3850)//100)/10
109 EXCESO:
     110   if HAM>16384 then
       111   ISI1=0
    112      ISI2=0
   113     endif  
    114    RETURN          
115 DATO_HUMEDAD:
    116    p1=(28542-(54722**ham+ham))**ham-80    
   117     P2=655+(HAM*5)+(HAM**15917)         
   118     P3=(P2**2480)-(P2**2730)+P1  
   119     U1=p3/10
    120    U2=p3//10
 121       IF ham>3710 THEN
  122        u1=0
   123       U2=0
   124     ENDIF  
   125     return
```

1. en la linea 13,14, pone var ham.byte0, hambyte1, que significa esto?
2. en la linea 87 que funcion tiene este for?
3. cuando llega a la subrutina dato  humedad y dato temperatura, no entiendo de donde toma valor el ham y porque se mueve de valor.
gracias por su atencion, saludos


----------



## guigo (Ene 27, 2012)

amigo...
te puedo colaborar en algo
tenes que revisar todas las variables.
vos sabes que var significa convertir o darle nombre a una variable de tamaño bite byte o word eso quiere decir por ejemplo que 

rodrigo var word

es darle a word un nombre lo que es lo mismo darle un valor al nombre rodrigo un peso word.
me comprendes. entonces segun tus dudas el nombrar una funcion en la que se hace una operacion se toma en cuenta que esa variable es la que se opera es como decir 1+2 = 3

si al principio yo llamo a 1 como him, a 2 como her  y a 3 como man diria entonces





siendo constantes

him con 1
her con 2
man con 3

inicio

him + her = man

el simplemente cojio una variable de nombre ho y le dio otro nombre de peso byte en el cual el peso del byte sea 0 o 1. fijate que el coloca ham.byte0, lo mismo mas abajo pero con un peso 1 y luego da valor a ham como word. eso con el fin de que los bytes sean solo 1nos o ceros.

el ejercicio indica que en un momento determinado el programa tiene que leer solo 0 o unos en una salida.

el for en tu siguiente pregunta indica que

la variable que el nombro como W que es de peso word, va ir en asenso hasta llegar a esa sifra osea
hasta 65500

es decir. 0.1.2.3...65500 en decimal. has la convercion decimal a binaria y te daras cuenta de que se trata.

si ham es un peso word osea que vale 65500, l ejercicio indica que hay que hacer una operacion lo cual se le cede a otra variable.

ejemplo

ham var word
p1 var word

inicio

p1 = ham + 48     '' quiere decir que p1 toma un valor de 65548


----------



## reyvilla (Ene 28, 2012)

Hola de nuevo por aca me llegaron unos componentes nuevos que pedi, unos servos, DS1307, 24C16, LM315, entre otros ya ire haciendo pruebas con cada uno en fisico e ire comentando al respecto, ahora estoy con los servo motores son modelo SG-5010 de tower pro, y tengo una duda sobre que decisión tomar al respecto del programa a realizar ya hice varias pruebas con el comando PULSOUT, una con pulsadores externos y otra con un joystick tipo PS2 con ADC. Con el adc utilice un PIC16F877A ya que con el 16F628A no logre ver bien si tenia ADC y como configurarlo. Con el 16F877A y el adc logre mover el servomotor y posicionarlo en 0° grados con un pulsout de 150, ahora cuando lo mando a +180° o -180° con pulsout 255 o 50 tiende a seguir moverse pero por el tope interno que trae no se mueve pero si se siente que vibra, ahora lo coloque a 45 y 250 y se le quito, luego queria mejorar la velocidad ya que estaba muy lenta logre subir un poco la velocidad pero ahora me da un problema al posicionarlo se queda temblando. 

Vi que con el comando PWM también se puede hacer pero como no es un PWM  real no se si alguien lo ha realizado y si no da problemas y si hay otra manera de que sea rápido y seguro mover el motor, no digo que sea super rápido pero si lo suficientemente aceptable como para mover un brazo robot...saludosss


----------



## Dario (Ene 29, 2012)

hola gente, yo por aqui de nuevo. bueno, les cuento como voy con el wiimotion jejeje... un fracazo total en mi esfuerzo, he estado todos estos dias tratando de leer primero el wiimotion directamente y despues el itg3205 y con eso estoy ahora. bueno, aqui les dejo el codigo para leer el itg que estoy intentando hacer funcionar ahora para ver si me dan una manito y me dicen de paso si esta bien asi como lo estoy haciendo. el codigo lo que hace, es leer el eje x y segun la lectura, mueve un servo que es lo unico que tengo para ver la señal externamente jeje... bueno, aca lo dejo. saludos y espero puedan ayudarme... 


```
@ DEVICE MCLR_OFF, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
 DEFINE   OSC   4              ' Para trabajar con un cristal de 4MHz
 DEFINE I2C_HOLD 1
 trisa=%000000
 trisb=%00000000
 porta=%000000
 portb=%00000000
SDA VAR PORTB.1
 SCL VAR PORTB.2 
 
a1 var byte
a2 var byte
a3 var byte
a4 var byte
a5 var byte
a6 var byte
med1 var byte

leer:
I2CREAD sda,scl,%1101000,$29,[a1]
I2CREAD sda,scl,%1101000,$30,[a2]  
PAUSE 10
med1=a1+a2
pulsout portb.0,med1
pause10
goto leer
```


----------



## D@rkbytes (Ene 29, 2012)

Hola D@rio.
Haber, un detalle que note en esta parte del código.
leer:
I2CREAD sda,scl,%1101000,$29,[a1]
I2CREAD sda,scl,%1101000,$30,[a2]
PAUSE 10
; ¿Cuanto pesa cada valor que ingresa a a1 y a a2? que son del tipo BYTE
med1=a1+a2 ; Lo pregunto porque al sumarlas puede ser que no quepan dentro de med1
pulsout portb.0,a2 ; ¿Que haces con med1? que también es del tipo BYTE
pause10
goto leer


----------



## reyvilla (Ene 29, 2012)

Hola Darkbytes y D@rio en unas paginas a tras comente al respecto de los bit de cada parametro son de 16bits con un complemento a dos lo cual no se que significa, he visto que con el DS1307 se utiliza para mostrar los datos en la lcd un HEX2 pero a que se refiere y si tiene algo que ver?

Me imagino que A1 = GYRO_XOUT_L ; y ; A2 = GYRO_XOUT_H 
que según el datasheet ambos suman 16bits con el complemento a 2


----------



## D@rkbytes (Ene 29, 2012)

reyvilla dijo:


> Hola Darkbytes y D@rio en unas paginas a tras comente al respecto de los bit de cada parametro son de 16bits con un complemento a dos lo cual no se que significa, he visto que con el DS1307 se utiliza para mostrar los datos en la lcd un HEX2 pero a que se refiere y si tiene algo que ver?
> 
> Me imagino que A1 = GYRO_XOUT_L ; y ; A2 = GYRO_XOUT_H
> que según el datasheet ambos suman 16bits con el complemento a 2


Ok. Saludos.
 Si, yo por eso le pregunte a D@rio sobre el peso de cada dato ingresado a A1 y A2
ya que una variable BYTE es de 8 BITS y al hacer A1+A2 el resultado será de 16 BITS
y no se podrá guardar dentro de la variable med1 por ser del tipo BYTE
Si esta bien declarar las variables como BYTE para leer la EEPROM porque es un BYTE
el que se leerá, como valor máximo se tendrá, FF o 255 en decimal que es el valor
de una localidad virgen en caso de una EEPROM. Si A1=255 se suma con A2=255 el resultado será 510
y excede la capacidad de med1. Por lo tanto med1 debe ser del tipo WORD


----------



## Dario (Ene 29, 2012)

hola darkbytes, hola reyvilla. 
bueno, lo que dicen es muy cierto y la verdad no lo habia tenido en cuenta jeje... les cuento que acabo de probar el programa cambiando la variable med1 del tipo byte por una variable word y sigue sin funcionar... les cuento que al encender el circuito, el servomotor se va al minimo, osea como si le estuviese llegando una señal de 0,5ms, me da la impresion de que el numero que le esta llegando es 0, osea que la variable no aumenta su numero. 
pd: (el servo se mueve segun el numero de la variable med1)
saludosss


----------



## reyvilla (Ene 29, 2012)

En la variable med1 justamente yo veo el problema, fíjate que lo mejor seria visualizar el valor de la variable para poder trabajarla, si no tienes una lcd puedes grabar el valor en la eeprom del pic y luego verla al leer el pic con el mismo programador y de esa manera ya tendrías una idea de los valores ya que si los valores están por debajo de 50 o por encima de 255 no te va a funcionar para mover el servo en este caso pareciera ser mayor siempre ya que son 16bit por eje, prueba grabando en la eeprom del pic como te indico es facil y no tienes que cambiar nada en el circuito solo agregar en el codigo (write 00,med1) y listo lo lees y ya tendrás el primer valor de referencia...saludoss

PD: Otra cosa que me acabo de dar cuenta es que las direcciones que tu colocas como 

a1 = $29 y  a2 = $30 estas serian a1 = $1D Y a2 = $1E ya que si colocas 29 y 30 serian en decimal pero como le colocas el símbolo $ lo transformas a hexadecimal y esa seria otra direccion de memoria...saludosss


----------



## D@rkbytes (Ene 29, 2012)

D@rio, mira este ejemplo que adjunto, lo use para otro que transmite el valor del ADC vía serial.
Como el valor entregado por la lectura máxima del ADC es de 1024 (En realidad me entregaba 1023)
y ese valor no lo podía enviar vía serial, lo dividí entre 4 y en el receptor lo multiplicaba.
Aún no se como enviar valores WORD vía serial, Tengo una idea usando tres variables.
Una del tipo WORD y dos del tipo BYTE, usando el nombre de tus variables seria:
med1 VAR WORD
a1 VAR BYTE
a2 VAR BYTE
; Y luego hacer
ADCIN ,0,med1
a1=med1.HighByte
a2=med1.LowByte
luego enviar a1, después a2 y en el receptor sumarlas en otra variable WORD
No lo he hecho, pero puede funcionar. (Luego lo probare) 
El ejemplo que realicé _se encuentra por acá_
Hasta luego y suerte



reyvilla dijo:


> PD: Otra cosa que me acabo de dar cuenta es que las direcciones que tu colocas como
> 
> a1 = $29 y  a2 = $30 estas serian a1 = $1D Y a2 = $1E ya que si colocas 29 y 30 serian en decimal pero como le colocas el símbolo $ lo transformas a hexadecimal y esa seria otra direccion de memoria...saludosss


Si. Ese es un detalle muy importante


----------



## reyvilla (Ene 29, 2012)

Darkbytes,  vi tu circuito y el código pero por ningún lado veo lo que indicas del envió serial de una variable tipo word y el problema lo tienes en el envió o a la hora de recibirlo?

PD: El standar para la trasmisión seria rs-232 en el envio de datos de 5,6, 7 u 8 bits a la ves, los que tienes que hacer en un tipo de tabla para enviar y recibir información de tal manera que al enviarla tenga una señalizacion especifica y al recibirla según la señalizacion puedas armar los datos sin ningún problema, puedes enviar un paquete de informacion con una señalizacion pero sera enviada de 8 bits a la vez por lo cual que al recibirla según la señalizacion debes ir ordenandola que seria lo mismo reconstitulirla para poder leer el dato completo, bueno eso si se tratase de varios valores y varias constantes cualquier cosa me avisas


----------



## D@rkbytes (Ene 29, 2012)

reyvilla dijo:


> Darkbytes,  vi tu circuito y el código pero por ningún lado veo lo que indicas del envió serial de una variable tipo word y el problema lo tienes en el envió o a la hora de recibirlo?
> 
> PD: El standar para la trasmisión seria rs-232 en el envio de datos de 5,6, 7 u 8 bits a la ves, los que tienes que hacer en un tipo de tabla para enviar y recibir información de tal manera que al enviarla tenga una señalizacion especifica y al recibirla según la señalizacion puedas armar los datos sin ningún problema, puedes enviar un paquete de informacion con una señalizacion pero sera enviada de 8 bits a la vez por lo cual que al recibirla según la señalizacion debes ir ordenandola que seria lo mismo reconstitulirla para poder leer el dato completo, bueno eso si se tratase de varios valores y varias constantes cualquier cosa me avisas


Ok. Gracias reyvilla.
En ese ejemplo que subi no es donde hago el envio del ADC via serial sino en el del link
que puse mas abajo, ese ejemplo es el que use para el ejemplo final.



Darkbytes dijo:


> D@rio, mira este ejemplo que adjunto, lo use para otro que transmite el valor del ADC vía serial.
> 
> El ejemplo que realicé _se encuentra por acá_


Y Upps!! necesitaria ver algún ejemplo porque no entendi. 
Gracias.


----------



## reyvilla (Feb 1, 2012)

Hola muy buenas estoy de nuevo por acá realice un sistema de control para un brazo con servomotores el sistema lo hice con un control tipo ps2 con los dos joystick con un pot de 10k y 4 ADC del pic 16f877a, funciona muy bien algo lento cuando se controla con los joystick, pero logre agregar una sistema de grabado de posiciones del brazo, de tal manera que puedo hacer una secuencia completa y al ejecutarla se hace de manera rápida ya que el pic no pierde tiempo en leer los adc si no que en base a los datos guardados en la eeprom que seria como las coordenadas activa los motores de manera muy rápida. Ahora mi codigo para guardar los datos me funciona perfecto pero quisiera poder depurarlo un poco mas pensaba utilizar la sentencia for...next y un loockup o algo asi pero no me termina de dar. 

El problema es el siguiente:
Pretendo guardar los ángulos de los servomotores en posiciones de memoria eeprom del pic.
para lograrlo me aprovecho de la variable donde trabajo los angulos de los motores en mi caso llamada MPOS1 de tipo word que va de 55 a 250.
Como son 6 datos a guardar continuamente se debe incrementar a la par la direccion de memoria lo cual quiere decir que si MPOS1 se guardo por primera ves en la direccion de  memoria $00 y son 6 datos, el siguiente dato para esa variable debe ser guardado en la direccion de memoria $06 y asi con todos los demas no se si se entiende pero dejo el codigo que uso para lograrlo y ver si me echan una mano a mejorarlo.

Código para grabar los ángulos actuales de los 6 servomotores.

GRABANDO:

WRITE ADDRM1,MPOS1  'GRABA EN LA EEPROM EL VALOR DE MPOS1 EN LA DIRECCION ADDRM1
WRITE ADDRM2,MPOS2  'GRABA EN LA EEPROM EL VALOR DE MPOS2 EN LA DIRECCION ADDRM2
WRITE ADDRM3,MPOS3  'GRABA EN LA EEPROM EL VALOR DE MPOS3 EN LA DIRECCION ADDRM3
WRITE ADDRM4,MPOS4  'GRABA EN LA EEPROM EL VALOR DE MPOS4 EN LA DIRECCION ADDRM4
WRITE ADDRM5,MPOS5  'GRABA EN LA EEPROM EL VALOR DE MPOS5 EN LA DIRECCION ADDRM5
PAUSE 10

ADDRM1 = ADDRM1 + 5  'INCREMENTA ADDRM1 DE 5 EN 5 PARA DIRECCION DE MEMORIA
ADDRM2 = ADDRM2 + 5  'INCREMENTA ADDRM2 DE 5 EN 5 PARA DIRECCION DE MEMORIA
ADDRM3 = ADDRM3 + 5  'INCREMENTA ADDRM3 DE 5 EN 5 PARA DIRECCION DE MEMORIA
ADDRM4 = ADDRM4 + 5  'INCREMENTA ADDRM4 DE 5 EN 5 PARA DIRECCION DE MEMORIA
ADDRM5 = ADDRM5 + 5  'INCREMENTA ADDRM5 DE 5 EN 5 PARA DIRECCION DE MEMORIA

RETURN               'Retorna


*****************************************************
Cada vez que se va esta subrutina incrementa la dirección de memoria de 5 en 5 para lograr que al grabar nuevamente no se monten los datos uno sobre otro.

Así como esta funciona pero creo que con un next se puede mejorar...saludoss


----------



## jpetatob (Feb 1, 2012)

Hola si se quisiera hacer un semaforo cual seria la programacion en el pic???
y si tuviera un contador de 12 a 0 hasta que se cambie de rojo a verde pero antes tiene que esperar 2 segundo en amarillo???


----------



## reyvilla (Feb 1, 2012)

Hola jpetatob si te refieres al código depende de que funciones va a tener el semaforo, si es sencillo de uno o dos bombillos como el de los trenes, o si es peatonal o vehicular. Si tiene un contador con 7 segmentos...etc.


----------



## arturouc (Feb 1, 2012)

reyvilla dijo:


> GRABANDO:
> 
> WRITE ADDRM1,MPOS1  'GRABA EN LA EEPROM EL VALOR DE MPOS1 EN LA DIRECCION ADDRM1
> WRITE ADDRM2,MPOS2  'GRABA EN LA EEPROM EL VALOR DE MPOS2 EN LA DIRECCION ADDRM2
> ...


QUE TE PARESE LO SIGUIENTE
Declaras estos arreglos
ADDRM VAR BYTE[5]
MPOS VAR BYTE[5]

FOR I=1 TO 5
      WRITE ADDRM_,MPOS
NEXT I
FOR I=1 TO 5
      ADDRM=ADDRM + 5
NEXT I

este codigo hace lo mismo, pero con next..._


----------



## lubeck (Feb 1, 2012)

> Así como esta funciona pero creo que con un next se puede mejorar



Intenta con esto...


```
MPos  Var Byte[5]
I     var byte
Add   var byte
Add=0

Main:
Goto Main

Grabando:
 for I=0 to 4
  write i+add,mpos[i]
  pause 10
 Next I
 add=add+5
 if add>=256 then add=0  'limite de direccion de memoria
Return
```


----------



## jpetatob (Feb 1, 2012)

Es con contador de 7 segmentos........para paso peatonal.......y con 2 semaforos tipo vehicular.....el codigo seria dificilll???

se pueden realizar con cualquier pic??


----------



## lubeck (Feb 1, 2012)

> el codigo seria dificilll???


No... 
pero depende de quien lo haga...



> se pueden realizar con cualquier pic??


No....
se necesita uno con los puertos necesarios....


----------



## reyvilla (Feb 1, 2012)

Muchas gracias muchachos ya lo pongo en prueba y les comento en un rato...saludoss

PD:Me acabo de fijar en algo la variable MPOS1 son independientes ya que las uso para la sentencia de pulsout de cada servo motor alli es donde coloco el valor de la suma según el valor del adc asignado es  este. 

PULSOUT M1,MPOS1  'Envia un pulso a M1 con duracion de MPOS1 en msg donde m1 es el servomotor
PAUSE 10                'Pausa de 10 msg

y el valor de MPOS1 lo obtengo de:

ADC0: 

ADCIN 0, SM1                              'Lee la entrada adc 0 y guarda su valor en H 			
IF SM1 <= 400 THEN                     'Si SM1 es menor o igual a 400 entonces
MPOS1 = MPOS1 - 2                     'MPOS1 es igual a MPOS1 - 2
IF MPOS1 <= 55 THEN MPOS1 = 55  'Si MPOS1 es menor o igual a 55 entonces MPOS1 es igual a 55
ENDIF                                         'Finaliza la condicion

IF SM1 => 600 THEN                       'Si SM1 es mayor o igual a 600 entonces
MPOS1 = MPOS1 + 2                       'MPOS1 es igual a MPOS1 - 2
IF MPOS1 => 250 THEN MPOS1 = 250'Si MPOS1 es menor o igual a 250 entonces MPOS1 es igual a 250
ENDIF                                           'Finaliza la condicion
RETURN                                         'Retorna 


Espero ahora este algo mas claro la situación, lo mismo se repite con adc1, adc2...m1,m2...MPOS1, MPOS2.

En total son 5 motores controlados según el valor de MPOS1 que se decrementa o incrementa según el valor obtenido en el adc.


----------



## lubeck (Feb 2, 2012)

Si te funciono el post anterior que puse, puede que te sirva asi:


```
MPos  Var Byte[5]
I     var byte
Add   Var byte
SM    Var Byte

Add=0

Main:
 PulsOut PortA.0,MPos[I]
 Pause 10 
 Gosub ADC_X
 Gosub Rec_Mem
Goto Main

ADC_X: 
 For I=0 to 4
  ADCIn I, SM 
  If SM <= 400 Then  
   MPos[i] = MPos[I] - 2 
   If MPos[I] <= 55 Then MPos[I] = 55 
  EndIf 
  If SM => 600 Then
   MPos[I] = MPos[I] + 2 
   If MPos[I] => 250 Then MPos[I] = 250
  EndIf 
 Next I
Return 

Rec_Mem:
 For I=0 to 4
  Write I+Add,MPos[I]
  Pause 10
 Next I
 Add=Add+5
 If Add>=256 Then Add=0  'limite de direccion de memoria
Return
```


----------



## reyvilla (Feb 2, 2012)

lubeck interesante el codigo me puse analizarlo y resulta que puedo lograr leer todos los adc segun veo pero lo que no estoy seguro es si lograre mover los 5 servomotores ya que estan en distintos pines del pic por lo cual quedaria la duda si usar otro for next para ir alternandolo de salida, por otro lado aun no entiendo bien lo de porque usar una variable tipo byte estoy algo confundido con eso ya que creía que tenia que ser de tipo word para el adc?


----------



## lubeck (Feb 2, 2012)

> lo que no estoy seguro es si lograre mover los 5 servomotores ya que estan en distintos pines del pic por lo cual quedaria la duda si usar otro for next para ir alternandolo de salida,



yo tambien tengo esa duda 

no se si segun el pic se pueda...

en lugar de poner 
PulsOut PortA.0,MPos_

poner ....
for I=0 to 4
 PulsOut I,MPos
next I
no creo que funcione...  voy a investigar si se puede o hay alguna alternativa... 




			por otro lado aun no entiendo bien lo de porque usar una variable tipo byte estoy algo confundido con eso ya que creía que tenia que ser de tipo word para el adc?
		
Hacer clic para expandir...


bueno eso depende de la resolucion que ocupes en el ADC algunos los puedes configurar de 8bit y otros de 10bits si lo usas de 8 pues esta bien tipo byte si los usas de 10 pues lo pones tipo word...

eso se define con la instruccion...*DEFINE ADC_BITS 8       ' Set number of bits in result*_


----------



## reyvilla (Feb 2, 2012)

Exacto yo utilizo 10bit por eso decía lo de byte, ahora lo otro si lo creo posible con for...next, déjame intentarlo con y lcd a ver que tal y te aviso.


----------



## reyvilla (Feb 3, 2012)

Hola lubeck logre avanzar pero no mucho aun no logro que funcione, el codigo que logre hacer es el siguiente:

FOR I = PORTD.0 TO PORTD.3 
PulsOut I,150
Pause 10
NEXT I

Donde I debe de ir desde PORTD.0 hasta PORTD.3 enviando un pulso de 1,5 milisegundos, PBP lo compila pero al tratar se simularlo no envía los pulsos...Que crees que pueda ser?


----------



## lubeck (Feb 3, 2012)

> Que crees que pueda ser?



 no creo que funcione...

que pic estas usando?



no rey....

no es posible con un for...next....  
porque cuando lo ensambla lo pone asi *sin* el for next...

	PULSOUT?TC	_PORTB??5, 096h  lo rojo es el puerto donde va hacer el pulso

y *con* el for... next lo ensambla asi...
	MOVE?CB	005h, _i  
	PULSOUT?BC	_i, 096h

para que funcionara deberia ensamblarlo asi...
	MOVE?CB	_PORTB??5, _i  
	PULSOUT?BC	_i, 096h

lo que quizas el ensamblador no lo reconozca....

asi que lo tienes que hacer separado...

osea
pulseout portD.0,mpos[0]
pulseout portD.1,mpos[1]
pulseout portD.2,mpos[2]
pulseout portD.3,mpos[3]


----------



## reyvilla (Feb 3, 2012)

Ya me estaba emocionando el de haber sido, el codigo de 2 paginas lo hubriera reducido a media o menos...jajaja casi, casi, bueno ya desisto de igual forma sigo con el proyecto aun no lo termino de armar es un brazo con 6 servos, esta quedando algo grande para lo que estime pero lo importante es que funcione a penas lo termine subo un video muchas gracias por tu tiempo amigo lubeck...


----------



## lubeck (Feb 3, 2012)

algo no me cuadra 

lo unico que no se puede hacer es el PulsOut con el for next, lo del resto del programa que te puse deberia ser funcional, pero claro... solo tu sabes si te funcionaria... si puedes ( y quieres) sube los archivos que llevas y vemos si se puede depurar....


----------



## reyvilla (Feb 3, 2012)

Ok el circuito y el codigo completo, cada motor tiene una funcion, hay dos que se mueven juntos, y uno que se mueve por dos pulsadores y todos los demas cada uno tiene un pot...Para grabar una secuencia de movimiento primero posicionas los motores y luego le das al pulsador grabar y el pin portb.6 se pone a 1 y luego a 0 para indicar que ya grabo esa posicion, luego de grabar varias posiciones le das al boton reproducir y ves como repite los movimientos grabados en los servomotores...cualquier cosa me avisas.

PD: Te dejo un vídeo para que veas como funciona por si acaso, los pot recuerda que son de un joystick por eso hay que estar pendiente de retornar el pot a 50%.

Gracias D@rio, corrijo:


----------



## Dario (Feb 3, 2012)

reyvilla dijo:


> Ok el circuito y el codigo completo, cada motor tiene una funcion, hay dos que se mueven juntos, y uno que se mueve por dos pulsadores y todos los demas cada uno tiene un pot...Para grabar una secuencia de movimiento primero posicionas los motores y luego le das al pulsador grabar y el pin portb.6 se pone a 1 y luego a 0 para indicar que ya grabo esa posicion, luego de grabar varias posiciones le das al boton reproducir y ves como repite los movimientos grabados en los servomotores...cualquier cosa me avisas.
> 
> PD: Te dejo un vídeo para que veas como funciona por si acaso, los pot recuerda que son de un joystick por eso hay que estar pendiente de retornar el pot a 50%.
> 
> http://www.youtube.com/my_videos_upload



amigo rey, te salio mal, el link te lleva a la seccion cargar video. saludosss y muy buen aporte







pdme robe sin querer un gif de daringa  )


----------



## Dario (Feb 4, 2012)

bueno, cambiando un poco de tema y volviendo al tema del wii motion,  les cuento que todavia no puedo entablar comunicacion con el bendito ITG3205 y por eso anoche, estuve hasta las 4 y media de la madrugada traduciendo un poco el datasheet del mismo. como soy cabeza dura para entender los documentos escritos, comparto aqui la traduccion que hice valiendome del poco ingles que se y del babel fish para las partes dificiles   y haber si me ayudan a entender como iniciar correctamente la comunicacion entre pic e ITG  aca la dejo:



> *protocolo de comunicaion
> condiciones de Start y Stop*
> 
> La comunicacion en el bus i2c comienza cuando el master pone la condicion de start (S)
> ...


saludos y espero puedan ayudarme


----------



## reyvilla (Feb 4, 2012)

Yo te diria que es exactamente igual a la comunicacion con una memoria 24C o un reloj de tiempo real tipo ds1307, la diferencia es que este tiene unos registros de control y configuración para los ejes x,y,z. Tu has trabajado con memorias i2c y las has logrado leer alguno? Digo ya que no cambia leer en i2c es igual para todos los sistemas colocar la id del dispositivo, colocar la dirección a leer y ya deberías poder leer sin ningún problema tu realizaste la prueba que te sugerí?


----------



## Dario (Feb 4, 2012)

reyvilla dijo:


> Yo te diria que es exactamente igual a la comunicacion con una memoria 24C o un reloj de tiempo real tipo ds1307, la diferencia es que este tiene unos registros de control y configuración para los ejes x,y,z. Tu has trabajado con memorias i2c y las has logrado leer alguno? Digo ya que no cambia leer en i2c es igual para todos los sistemas colocar la id del dispositivo, colocar la dirección a leer y ya deberías poder leer sin ningún problema tu realizaste la prueba que te sugerí?


segun lo que yo se, deberia ser asi y no deberia existir ningun problema. y con respecto a la prueba que me sugeriste, no se ¿se puede con el programador jdm? ahora estoy armando un cable para conectar al puerto serie de mi pc y ver si puedo ver los datos en la ventana de comunicacion del microcode  ahora lo que he visto es que ahi habla del bit de lectura/escritura ¿cual seria este en el comando que estoy enviando? lo que yo hago es esto: I2CREAD sda,scl,%1101000,$1D,[a1] ademas, la direccion i2c tiene 7 bits y no deberia ser de 8 bits? ¿acaso sera este 1 o 0 faltante la causa del problema?
saludosss


----------



## reyvilla (Feb 4, 2012)

Si de echo yo lo hice una vez asi y me funciono con el jdm, lo que te digo, programa el pic con la instrucción write después de leer la memoria y después lo lees con el mismo programador si logro leer la memoria entonces en la eeprom del pic al leerla con el mismo programador que lo quemaste te vas a datos de la eeprom y alli va estar la información leída, con respescto al bit de lectura y escritura eso lo hace automáticamente el comando I2CREAD y es igual para todos los dispositivos I2C...Y otra cosa fijate bien en la dirección de memoria que vas a leer colocarla en hex con $...Otra cosa como se llama el control que compraste no logro ubicar uno con ese integrado.


----------



## Dario (Feb 4, 2012)

aaaaahhhhhh!!!! lo logreeee!!!! logre comunicarme con el itg!!! era ese bit faltante, el bit 0  aca dejo el codigo funcionando, es para leer la parte alta del eje X pero ya de ahi es casi pan comido lo demas jajaja  gracias por la ayuda muchachos, graciaaasss!!!    PDel ser-vo semueve, else-rvo se mueve, elser-vo se mueve!!! ) lo siento, estoy muy contento 



> Otra cosa como se llama el control que compraste no logro ubicar uno con ese integrado.


se llama wii motion plus, es el que se conecta al mando de la consola wii de nintendo. por otra parte, que suerte, yo solo consigo el mando con itg3205, pero tambien hay con un simlar que es el 3200. he visto que los que no traen el itg, son mas faciles de leer ya que sacan directamente las 3 señales de sus ejes en forma analogica. saludos


```
@ DEVICE MCLR_OFF, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
 DEFINE   OSC   4              ' Para trabajar con un cristal de 4MHz
 DEFINE I2C_HOLD 1
 trisa=%000000
 trisb=%00000000
 porta=%000000
 portb=%00000000
SDA VAR PORTB.1
 SCL VAR PORTB.2 
 
a1 var byte
a2 var byte
a3 var byte
a4 var byte
a5 var byte
a6 var byte
med1 var word
clear

leer:
I2CREAD sda,scl,%11010000,$1D,[a1]
I2CREAD sda,scl,%11010000,$1E,[a2]  
PAUSE 10
med1=a1+a2
pulsout portb.0,a1
pause10
goto leer
```


----------



## reyvilla (Feb 4, 2012)

Que bueno amigo D@rio mis felicitaciones, por otra parte me gustaría que si puedes hicieras una prueba, el problema era ese bit, en el manual de picbasic pro solo sugiere colocar los primeros 4 que seria %1101 para el caso del itg3205, pudieras hacer esa pequeña prueba, lo digo ya que tu tenias 7 como indicas y a lo mejor eso mismo ocasionaba el problema, es solo para sacarme la duda si es necesario o no colocar los 8bit o solo con la ID addres es suficiente.


----------



## Dario (Feb 4, 2012)

amigo rey: acabo de probar poniendo los primeros 4 bits como me dijiste y no funciona, asi que parece que hay que poner los 8 bits de control porque por lo que pude entender del datasheet, en esos bits tambien va el bit que le señala al dispositivo si el master esta intentando leer o escribir en el dispositivo esclavo. aca dejo una version light de la anterior donde controlo el movimiento de un servo segun el movimiento del eje x.
saludosss

pd: (el pic es un 16f628)


```
@ DEVICE MCLR_OFF, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
 DEFINE   OSC   4              ' Para trabajar con un cristal de 4MHz
 DEFINE I2C_HOLD 1
 trisa=%000000
 trisb=%00000000
 porta=%000000
 portb=%00000000
SDA VAR PORTB.1
 SCL VAR PORTB.2 
 
a1 var byte

clear

leer:
I2CREAD sda,scl,%11010000,$1D,[a1]  
PAUSE 10
pulsout portb.0,a1
pause10
goto leer
```


----------



## D@rkbytes (Feb 4, 2012)

Si es importante colocar el valor de los 8 Bits
Porque %11010000 = D0 Hex. 208 Dec. Y %1101 = D Hex 13 Dec.
Osea que si cambia el valor del ID
No sería importante si los primeros son 0 y se omiten, porque los ceros a la izquierda no cuentan.

De hecho aquí D@rio otra vez está la redundancia:
 trisa=%000000
trisb=%00000000
porta=%000000
portb=%00000000
; Se resume en:
 trisa=0
trisb=0
porta=0 
portb=0


----------



## reyvilla (Feb 4, 2012)

A ok interesante y a tomar en cuenta ya que yo me guió mucho por el manual del PBP, debe ser que este mal escrito alli, muchas gracias D@rio por la prueba me sacas de una gran duda, Y si Darkbytes yo opino igual solo que tenia esa duda por lo que comento del manual, bueno ya lo tendré en cuenta...Bueno D@rio espero con ansias a ver como te queda el proyecto mucho éxito...Yo aun no termino con el brazo con servo aun lo ando armando me quedan como 3 horas mas de trabajo para poder arrancarlo y si me da chance subo un video para que lo vean en accion...


----------



## Dario (Feb 4, 2012)

ok, gracias amigos.  gracias por la aclaracion darkbytes, buena suerte con tu proyecto reyvilla y no te olvides del video 
saludosss


----------



## lubeck (Feb 5, 2012)

de que me perdi con eso del ITG  buen al rato le doy una leida...

Rey... le acabo de dar una revizada a tu codigo... y  yo intentaria algo asi como el archivo main.pbp del archivo que anexo...


----------



## atricio (Feb 5, 2012)

reyvilla dijo:


> Ok el circuito y el codigo completo, cada motor tiene una funcion, hay dos que se mueven juntos, y uno que se mueve por dos pulsadores y todos los demas cada uno tiene un pot...Para grabar una secuencia de movimiento primero posicionas los motores y luego le das al pulsador grabar y el pin portb.6 se pone a 1 y luego a 0 para indicar que ya grabo esa posicion, luego de grabar varias posiciones le das al boton reproducir y ves como repite los movimientos grabados en los servomotores...cualquier cosa me avisas.
> 
> PD: Te dejo un vídeo para que veas como funciona por si acaso, los pot recuerda que son de un joystick por eso hay que estar pendiente de retornar el pot a 50%.
> 
> ...



felicitaciones que bien esta ojala logres hacer lo que deseas hacer


----------



## reyvilla (Feb 6, 2012)

Muchas gracias amigos, aqui lo prometido la puesta en marcha del brazo, cabe destacar que aun le falta bastante para hacer lo cometido grabar una secuencia, hice unas pruebas pero al parecer el pic se resetea y no hace la secuencia de manera apropiada el brazo se vuelve loco y empieza a dar golpes por todos lados pareciera que tuviera vida propia jejeje ...Pero espero poder lograrlo, creo que es cuestión de velocidad esta muy rápido y lo otro lo de la fuente.
Bueno espero sus criticas y sugerencias...saludosss


----------



## Dario (Feb 6, 2012)

jeje... esta muy bueno tu brazo, un poco erratico pero con un poco de programacion eso se soluciona jeje... PDme acabo de dar cuenta que lo controlas con un stik de play station) y, hablando de programacion, les cuento que sigo practicando con el itg3205 y me he encontrado con la sorpresa de que no solo se trata de leerlo, sino tambien de escribirlo. ressulta que para que funcione correctamente, hay que configurar varios parametros que todavia no logro entender bien...   uno de ellos es el que tiene que ver con la lectura correcta de sus ejes. como viene configurado por defecto, la lectura de sus ejes siempre es la minima y si no entiendo mal, configurando el registro que se ocupa de eso, se puede obtener una lectura que siempre mantenga el eje en su punto medio, por ejemplo: si yo le conecto un servo a mi circuito, este deberia quedar en su posicion central pero la lectura del sensor, le indica que tiene que ir a la posicion minima. traducido a pbp, seria como si yo pusiera: PULSOUT portb.0,100. 
aca dejo el datasheet de nuevo, para ver si me ayudan a identificar cual es el registro que se  necarga de eso. ami me parece que son los registros 23 y 26, pero no se que debo escribir para configurarlos. obviamente se como escribir el registro pero no se que poner...  ¿me ayudan? 
saludosss


----------



## J2C (Feb 6, 2012)

D@rio

Creeria segun el siguiente parrafo:

_5.6 Sensor Data Registers_
_The sensor data registers contain *the latest gyro and temperature data*. They *are read-only registers*, and are accessed via the Serial Interface. Data from these registers may be read at any time, however, the interrupt function may be used to determine when new data is available._


Que dichos registros son de "*solo lectura*" para el usuario (Nosotros) y que también "*contienen los ultimos datos registrados/memorizados*".


Una prueba a realizar que lo confirmaria podria ser: 

Mover el componente y volverlo a leer pasados unos segundos, luego desconectar la alimentación lo suficiente como para que se descarguen los electroliticos y realizar la lectura a ver si han quedado los valores iniciales o los de la ultima posición que obtuviste al moverlo.



Saludos, JuanKa.-


----------



## atricio (Feb 6, 2012)

reyvilla dijo:


> Muchas gracias amigos, aqui lo prometido la puesta en marcha del brazo, cabe destacar que aun le falta bastante para hacer lo cometido grabar una secuencia, hice unas pruebas pero al parecer el pic se resetea y no hace la secuencia de manera apropiada el brazo se vuelve loco y empieza a dar golpes por todos lados pareciera que tuviera vida propia jejeje ...Pero espero poder lograrlo, creo que es cuestión de velocidad esta muy rápido y lo otro lo de la fuente.
> Bueno espero sus criticas y sugerencias...saludosss
> 
> http://www.youtube.com/watch?v=6Ui3kS5R2AY



una maquina que bueno felicitaciones !!!!!!


----------



## Dario (Feb 6, 2012)

J2C dijo:


> D@rio
> 
> Creeria segun el siguiente parrafo:
> 
> ...



si, esos son los registros a los que ya puedo acceder, leer y procesar. pero el problema es que el giroscopio siempre comienza desde la posision 0, por lo tanto, el servo siempre se va a -45°  cando lo que yo estoy intentando es que siempre comience a 90° y segun como mueva el sensor, ya sea izquierda o derecha, el servo se mueva a -45° y +45°. por otra parte, estaba pensando que talvez este leyendo mal los datos porque solo leo la parte alta de uno de los ejes y este cuenta con una salida alta y una salida baja, por ejemplo: GYRO_XOUT_H y GYRO_XOUT_L corespondientes a los registros  1D y 1E. como cada registro contiene 8 bits, en total sumados serian 16 bits, pero me pregunto si talvez cada registro medira un angulo distinto  y al faltarme la medida de uno de los angulos, es que me ocurre esto 
saludosss


----------



## J2C (Feb 6, 2012)

D@rio

Es que te entrega los datos en formato de 16 bits y como "Complemento a 2", por lo que deberías leer los "*dos byte*" *GYRO_XOUT_H* y *GYRO_XOUT_L* y luego procesarlos para recien ahi obtener realmente el giro. Supongo que el H=Byte_High y el L=Byte_Low.


Pero por otra parte, leyendo mas detenidamente la datasheet (entre _*8.1*_ y *8.7*) hay toda una "*secuencia de inicialización*" que se deberia realizar al principio del trabajo, digamos cada vez que energizamos nuestro circuito. Me esta resultando bastante tediosa de entenderla dado que se reparte por varios Registros y los mismos no estan secuencialmente (uno a continuación del otro). 

Te comento que cuando empeze a leer más detenidamente me enganche para tratar de entenderla, si me das un poco de tiempo trato de colocar algo hoy en formato de texto (no manejo el PBP) por que desde hace tiempo leo el thread para tratar de aprender algo.



Saludos, JuanKa.-


----------



## reyvilla (Feb 6, 2012)

Gracias ya subiré otro cuando este terminado, D@rio recuerda que es un complemento a dos como te dije y como te indica J2C, por lo que logro entender va desde -255 a 255 o algo asi, son 16bits pero en si creo que esta dividido en dos 7 y 7 es el mismo, lo que quiere decir que debes saber diferenciar cuando es -255 y cuando es +255, y creo que si es 0 esta en plano y no has intentado grabar el dato como te dije y luego leerlo otra cosa que seria mejor aun es usar una interface por rs-232 y así verías todos los valores.


----------



## Dario (Feb 6, 2012)

:cabezon: si... soy un porfiado cabeza dura  tiene que ser asi, -255 y +255 para el otro lado y 0 para el plano, pasa que la emocion de poder finalmente haber comunicado este integradito con el pic, fue mas grande que el uso de razon  . voy a retomar el asunto con mas calma y no tan rapido... voy a volver a la idea de ver los datos en la pc que tenia antes de haber logrado leer el ITG  ¿en algun momento die casi pan comido?  creo que me equivoque y me deje llevar por el momento jajaja...  gracias amigos, voy a seguir renegando hasta hayarle solucion. de todas formas, sigo escuchando sugerencias saludosss


----------



## ferdy575 (Feb 7, 2012)

reyvilla dijo:


> Ok el circuito y el codigo completo, cada motor tiene una funcion, hay dos que se mueven juntos, y uno que se mueve por dos pulsadores y todos los demas cada uno tiene un pot...Para grabar una secuencia de movimiento primero posicionas los motores y luego le das al pulsador grabar y el pin portb.6 se pone a 1 y luego a 0 para indicar que ya grabo esa posicion, luego de grabar varias posiciones le das al boton reproducir y ves como repite los movimientos grabados en los servomotores...cualquier cosa me avisas.
> 
> PD: Te dejo un vídeo para que veas como funciona por si acaso, los pot recuerda que son de un joystick por eso hay que estar pendiente de retornar el pot a 50%.
> 
> ...


 
hola te felicito está super tu proyecto, lo estuve viendo y creo y me perdonas sí me equivoco pero creo que de los 2 motores que tienes trabajando juntos deberías retirar uno, ponerle otro potenciometro y usarlo para darle rotación a la muñeca ó te quedara faltando un movimiento en tu brazo, suerte con tu proyecto...


----------



## reyvilla (Feb 7, 2012)

Gracias ferdy575, lo hice así porque se limito el movimiento de la muñeca a un solo eje de rotación en la propuesta, y los dos motores es por la carga ya que uno solo temblaría, ahora estoy haciendo unas grandes modificaciones, ya que era la primera prueba para ver como se comportaba ahora viene la depuración del código y de la parte mecánica también dentro de 2 días o menos ya estará listo ya veras como queda, de momento esta a dieta...jejeje...lo que significa que regresara mas delgado por cuestiones de movimiento, y se reforzó el agarre y fijación de los motores para evitar el movimiento sobre el mismo, se bajo la velocidad ya que se perdía la precisión y la estabilidad de los motores y como todo proyecto tenias muchos detalles que mejorar...Pero ya lo verán en el próximo vídeo...saludos


----------



## arturouc (Feb 8, 2012)

Que tal muchachos
estoy retomando lo del driver para servomotor con encoder en encuadratura
estoy trabajando con el pic 18f4431 que tiene su propio modulo QEI
gracias al ejemplo de autotronico he podido hacer algunos ejercicios con este pic
el problema que tengo ahorita es manejar las variables coma flotante (decimales)
para los parametros PID. alguien a manejado variables de tipo coma flotante en PBP? algun ejemplo?

el dia de hoy les publico el codigo que llevo hasta ahorita..


----------



## D@rkbytes (Feb 8, 2012)

arturouc dijo:


> Que tal muchachos
> estoy retomando lo del driver para servomotor con encoder en encuadratura
> estoy trabajando con el pic 18f4431 que tiene su propio modulo QEI
> gracias al ejemplo de autotronico he podido hacer algunos ejercicios con este pic
> ...


Saludos arturouc
Adjunto las librerias necesarias para trabajar con punto flotante en PBP
mas el ejemplo de MELABS (microEngineering Labs, Inc.) que no pude compilar. 
Mas referencias sobre este tema se encuentran en estos enlaces. Enlace1 Enlace2 Enlace3 
Ok. Espero te puedan servir.


----------



## arturouc (Feb 8, 2012)

Que tal Darkbytes
gracias por la información
voy a ver estas subrutinas de FP 
y subo los ejemplos...


----------



## D@rkbytes (Feb 8, 2012)

Bien, pues ya pude compilar el ejemplo FP.bas
La cosa fue mas sencilla de lo que me esperaba, y todos los errores que me aparecian,
se debian a la falta de una definición. Esta-> Define    __16F84    1
Esta definición si esta declarada en el ejemplo FP.bas
Y en los enlaces que indique arriba el ejemplo no incluye esa definición en el programa.
Así que abri el ejemplo FP.bas con MicroCode Studio, le di a compilar normalmente con F9
y el programa se compilo perfectamente y sin usar MPASM 
El ejemplo es para un 16F84 no probe con otros de gama mas alta.

Ok. Ahora separe solo los archivos necesarios para usar punto flotante en PBP
Estos archivos de deben copiar dentro de la carpeta de instalación de PBP Compiler.
Tambien hice el ejemplo de la simulación en Proteus para ver el resultado.
Adjunto los archivos del ejemplo y las librerias que se requieren solamente para PBP

PD. En el archivo adjunto PBP FP Library vienen otros 3 ejemplos mas para el 16F877
4FUNC32.BAS, 4FUNCTN.BAS y AB-CD.BAS

Como dijo arturouc esperamos mas ejemplos con estas librerias...
Suerte y hasta luego.


----------



## arturouc (Feb 9, 2012)

gracias Darkbytes por los ejemplos
este es el vídeo de simulación en proteus





este es el codigo:

```
define OSC 20
    DEFINE LCD_DREG PORTD   
    DEFINE LCD_DBIT 4      
    DEFINE LCD_BITS 4      
    DEFINE LCD_RSREG PORTE  
    DEFINE LCD_RSBIT 0      
    DEFINE LCD_EREG PORTE   
    DEFINE LCD_EBIT 1       
    DEFINE LCD_LINES 2      
    DEFINE LCD_COMMANDUS 2000   
    DEFINE LCD_DATAUS 50    
    DEFINE ADC_BITS 8       
    DEFINE ADC_CLOCK 3      
    DEFINE ADC_SAMPLEUS 50  
    DEFINE CCP2_REG PORTC   
    DEFINE CCP2_BIT 1       
                                          
'------------Variables-------------

    mot_pwr  var    word  
    Upos     var    word
    vel      var    word      
    pot_val  var    byte        
    posicion var    word  
    posH     var    byte
    posL     var    byte
    posHtem  var    byte   
    FreMot  var     word
    a       var     word
    b       var     word
    c       var     word
    rt      var     word
    eT      var     word
    iT      var     word
    dT      var     word
    yT      var     word
    uT      var     word
    iT0     var     word
    eT0     var     word
    vmax    var     word
    vmin    var     word   
    	 
'----------Initialization----------
    
    CCP1CON = %00111111         
    ANSEL0 = %00000001          
    ANSEL1 = %00000000            
    TRISA = %00011111          
    LATA  = %00000000           
    TRISB = %00000000           
    TRISC = %00010000          
    QEICON = %10001000          
    PORTC.0 = 1                 
    PORTC.1 = 0                  
    LCDOUT $FE, $80, "  Iniciando... "   
    LCDOUT $FE, $C0, " parametros... "
    'pause 500  
    fremot = 15000                  'frecuencia para el hpwm
    PORTC.0 = 0                 
    PORTC.3 = 0                           
    upos=1                                                         
    posicion= 0                 'variable posicion real       
    POSCNTH = 0                 
    POSCNTL = 0         
    vmin= 125                   'pwm minimo para el motor
    vmax= 255                   'pwm maximo para el motor
    it0= 0                      'variable para calulo de termino derivarivo
    et0= 0                      'variable para calculo del error
    a=2                         'parametro proporcional
    b=1/2                       'parametro integral
    c=1/20                      'parametro derivativo
             
lop:                                                                                           
    gosub CalPos                'ir a calcular la posicion actual
    
     gosub campos               'ir a ver si cambio la posicion
     gosub calvel               'calcular PWM para el motor
    IF mot_pwr > posicion then  'si set point es mayor que posicion actual                         
        HPWM 1, vel, fremot     'sale PWM por CCP1
        HPWM 2, 0, fremot       'por CCP2 no sale nada
    else                        'en caso contrario posicion actual > set point
        HPWM 2, vel, fremot     'no sale nada por CCP1  
        HPWM 1, 0, fremot       'sale pwm por CCP2
    endif                             
    gosub lcd                   'muestra informacion en LCD
    GOTO lop                      
    end  
    
lcd:                            'sub que muestra en lcd

    LCDOUT $FE, $80, "SP= ",dec4 mot_pwr," ", dec4 vel   
                               
    LCDOUT $FE, $C0, "posicion = ",DEC5 POSIcION
                               
    return    
CalPos:                        'sub para calcular posicion
    posH = POSCNTH
    posL = POSCNTL
    POShTEM = POSCNTH
    IF posh - poshtem = 0 then goto Listo
    posH = POSCNTH
    posL = POSCNTL    
Listo:    
    POSIcION = 256*posh + posL 'se convierte en 16 bit la pos
    yT=posicion
    RETURN  
campos:                        'sub para cambiar de posicion
    ADCIN 0, pot_val   
    rT=pot_val * 8
    'if pot_val <200 then  vel=200
                 
    mot_pwr = rT 'POT_VAL '11*pot_val/16 + 77
    'mot_pwr = mot_pwr '* 2
    return         
calvel:                  'CALCULO DEL PWM CON PID
    eT = abs (rT - yT)   'calculo del error
    iT = b*eT + iT0      'calculo de valor integral (magnitud del error)
    dT = c * (eT - eT0)  'calculo del valor derivativo (tiempo de respuesta)
    uT = iT + a * eT + dT 'valor del PID
    if uT> vmax then      'si la salida del PID es mayor que el valor de PWM
        uT = vmax          'que puedo mandar asignale el valor 255
    else
        if uT< vmin then uT=vmin  'PWM minimo que quiero enviar
    endif
    vel=uT                'velocidad del motor en PWM
        
    return
```

falta incluir variables en punto flotante...
este driver es con el objetivo de mover un robot paralelo
que ya les había mostrado _aqui_, pero ahora es de aluminio
luego les subo un vídeo...


----------



## J2C (Feb 10, 2012)

D@rio

Disculpa mi demora, pero estuve ocupado con temas laborales. Desconozco sobre que esquema circuital de conexiones estas trabajando, por eso se desconoce como esta *seteado* el ITG-3205. De lo que he leido la Datasheet, he interpretado lo siguiente:

1) *Registro 67*
- Se debe definir la fuente del *Clock de Entrada* en el PowerUp con *CKL-SEL*.
- Se deben habilitar los "Gyro's" a usar alguno/todos en nuestra aplicación con *STBY_XG* y/ó *STBY_YG* y/ó *STBY_ZG*. Para conocer bien el funcionamiento yo habilitaria uno solo.

2) *Registro 22*
- Se debe definir el fondo de escala *FS_SEL* dado que el Reset Inicial en el PowerUp lo pone a *00h* y es necesario ajustarlo a *03h* !!!.
- El *DLPF_CFG* ajusta la configuración del filtro digital y esta relacionado con el *SMPLRT_DIV* del *Registro 21* y entre ambos determinan la tasa de refresco en las mediciones de los Gyro's.

3) *Registro 21*
- Se debe ajustar el *SMPLRT_DIV* que esta relacionado con el *DLPF_CFG* del _*Registro 22*_.

4) *Registro 23*
- Cargar "*0*" en los bit's *1* y *3*.
- Poner a "*1*" el *INT_ANYRD_2CLEAR* para que se pueda leer cualquier *Registro*.
- El bit *RAW_RDY_EN* habilita al *RAW_DATA_RDY* del *Registro 26* para que indique la disponibilidad de *datos nuevos* en los *Registros 27 ÷ 32* de los Gyro's y de esa forma la aplicación se entera de todas las actualizaciones de posición de todos los Gyro's. Aunque se pueden leer en cualquier momento los *Registros 27 ÷ 32* no podras saber si hubo algun cambio desde la lectura anterior.



Hay muchos más Registros, algunos de solo Lectura y otros de Lectura y/ó Escritura que en definitiva se usan dependiendo de la aplicación/circuito que se le de a este "Sensor/Detector de 3D". Hay otros que de seguro no les di importancia y son tanto o más importantes que los que cite.

Dado que es muy tedioso saber en que condiciones esta conectado, supongo que tendra algun _µControlador_ el control que tienes y que desconocemos que programa tiene dicho _µControlador_, por lo tanto no podemos saber como realiza el seteo inicial.

Podria ser interesante ya que tu has realizado un circuito para pruebas y programado algo especifico en PBP; cambiar el programa para leer de una sola vez el estado de todos los *Registros*, en formato Hexadecimal y poder anotarlos en algun lado/posición de Memoria de tu circuito de pruebas.


El tema de los registros de los Gyro's/Temperatura y el *Doble Byte* con *Complemento a 2* solo me centre en "http://es.wikipedia.org/wiki/Complemento_a_dos" y si bien muestra un ejemplo con 4 bit's se traslada de forma comprensible a los 16 bit's que nos entregan los Gyro's con su parte H y L.


Hasta aca llegue y creo que aun queda mucho por investigar, pero es necesario comenzar a hacer alguna prueba para que empieze a darnos respuestas el ITG y saber si analizamos en el sentido correcto o no. Disculpa lo largo del presente y quedo a tu disposición.



Saludos, JuanKa.-


----------



## Dario (Feb 10, 2012)

hola juanka.
gracias por el tiempo que dedicaste a tratar de ayudarme, estoy muy agradecido.  te cuento que estuve haciendo algunas pruebas de lectura del gyro en la pc utilizando el serial comunicator del microcode. configurando el FS_SEL a 03h, pude leer la parte baja del eje X y este es el que me da la medida que necesito para lograr lo que estoy intentando hacer. el eje X en su parte baja, me da una lectura inicial de 150, lo que equivale a un pulso de salida de 1.5ms con lo que el servo se mantiene en una posision central si el gyro no se mueve. si todo estuviese bien, al mover el gyro hacia la izquierda, el servo se moveria hacia la izquierda, si yo moviese el gyro a la derecha, el servo se muoveria a la derecha. el unico problema en esto ahora, es que esa lectura, es erratica, por lo que el servo se mueve como loco para todos lados si yo lo muevo, incluso si yo lo dejo quieto, en la pantalla del serial comunicator se ve una variacion desde 150 a 165. sospecho que todavia deberia configurar algun registro que seguramente tiene que ver con eso. seguire investigando y sigo escuchando  seguimos en contacto, saludosss y gracias de nuevo.
edit: aca te dejo el codigo que escribi para lograr lo que te conte.

```
@ DEVICE MCLR_OFF, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF

 DEFINE   OSC   4              ' Para trabajar con un cristal de 4MHz
 DEFINE I2C_HOLD 1
 define I2C_SCLOUT 1
 trisa=%000000
 trisb=%00000000
 porta=%000000
 portb=%00000000
SDA VAR PORTB.1
 SCL VAR PORTB.2 
 
a1 var byte
a2 var byte
x var byte
clear

leer:
i2cwrite sda,scl,%11010000,22,["03h"]
I2CREAD sda,scl,%11010000,29,[a1]  
I2CREAD sda,scl,%11010000,30,[a2] 
pulsout portb.3,a2
pause 10
goto leer
```


----------



## AldebaranElectronico (Feb 10, 2012)

Buenas noches amigos, soy nuevo en la programación de PIC´s, alguien me puede decir como utilizar un GLCD en PBP? como hacer las librerias, alguien tiene algún programa ejemplo? gracias


----------



## YIROSHI (Feb 11, 2012)

AldebaranElectronico dijo:


> Buenas noches amigos, soy nuevo en la programación de PIC´s, alguien me puede decir como utilizar un GLCD en PBP? como hacer las librerias, alguien tiene algún programa ejemplo? gracias



Empiesa mirando este blog y esta web compañero

http://monasezaelectronics.blogspot.com/2008/11/pic-basic-pro-pbp.html
http://www.warburtech.com/products/compilers/picbasic.pro.compiler/sample.code/lcd.pbp/

Saludos


----------



## syryus (Feb 12, 2012)

Hola a todos, he estado buscando a lo largo de este post como hacer una cosa pero aún no lo he conseguido.

Lo que trato de hacer es muy simple:

Tengo 4 leds y un pulsador. Los leds están ejecutando una rutina, al pulsar el pulsador pasan a otra, al pulsar de nuevo vuelven a cambiar...

Solo consigo hacer un cambio de rutina, pero de ahí no salgo...


----------



## YIROSHI (Feb 12, 2012)

syryus dijo:


> Hola a todos, he estado buscando a lo largo de este post como hacer una cosa pero aún no lo he conseguido.
> 
> Lo que trato de hacer es muy simple:
> 
> ...



Voy a buscarlo creo que lo tengo por ahi


----------



## syryus (Feb 12, 2012)

Hola amigo Yiroshi. Lo que has posteado es para manejar 4 interrupciones distintas y yo quiero manejar varias rutinas a través de una sola interrupción (ademas está en assembler y la verdad es que no lo manejo)

Gracias!


----------



## reyvilla (Feb 12, 2012)

Hola syryus yo hace un tiempo realice un programa sencillo que creo es lo que buscas revisa esta aquí:

https://www.forosdeelectronica.com/posts/560264/


----------



## D@rkbytes (Feb 12, 2012)

AldebaranElectronico dijo:


> Buenas noches amigos, soy nuevo en la programación de PIC´s, alguien me puede decir como utilizar un GLCD en PBP? como hacer las librerias, alguien tiene algún programa ejemplo? gracias


Saludos. Aqui hay algunos _ejemplos para un GLCD NOKIA_
Y Aqui dejo otros más son en PICBASIC pero para Proton.
Adjunto el programa GLCD Font Creator (Gratuito) para MikroBasic mas unas librerias.

En este enlace hay un código para PBP usando un PIC16F877 con un GLCD KS0108
Suerte y hasta luego.


----------



## alejandrozama (Feb 13, 2012)

hola que tal,

tengo algo de tiempo enseñandome a programar con este programa, se "supone" que se lo basico pero el maestro nos dejo una practica muy sencilla y no supe como hacerla por lo que recurro a ustedes.

1.- utilizando la pic 16f877, que todo lo que entre en el puerto d salga por el puerto b, digamos que si pongo en alto d0 el puerto b0 se ponga en alto, o si meto varios en el puerto d esas mismas señales salgan por el puerto b

2.- seria basicamente lo mismo que en el primero pero solo se utilizaria el pueto b (4 puerto como entrada y cuatro como salida). digamos que si pongo en alto b0 se ponga en alto b4, y si pongo en alto b1 se ponga en alto b5. y asi susesivamente.


trate de hacerlo con condicionantes pero se hacen muchas condicionantes y quisiera saber si alguien sabe como hacer esto de una manera sencilla.

de antemano gracias y estare pendiente de sus respuestas.


----------



## lubeck (Feb 13, 2012)

> 1.- utilizando la pic 16f877, que todo lo que entre en el puerto d salga por el puerto b, digamos que si pongo en alto d0 el puerto b0 se ponga en alto, o si meto varios en el puerto d esas mismas señales salgan por el puerto b


Trisb=0
Trisd=255
main:
portb=portd
goto main



> 2.- seria basicamente lo mismo que en el primero pero solo se utilizaria el pueto b (4 puerto como entrada y cuatro como salida). digamos que si pongo en alto b0 se ponga en alto b4, y si pongo en alto b1 se ponga en alto b5. y asi susesivamente.



Trisb=%1111
Main:
portb.4=portb.0
portb.5=portb.1
portb.6=portb.2
portb.7=portb.3
Goto main

y asi deberia funcionar (no he echo la prueba)


----------



## AldebaranElectronico (Feb 13, 2012)

Muchas gracias amigo, los voy a revisar....





Darkbytes dijo:


> Saludos. Aqui hay algunos _ejemplos para un GLCD NOKIA_
> Y Aqui dejo otros más son en PICBASIC pero para Proton.
> Adjunto el programa GLCD Font Creator (Gratuito) para MikroBasic mas unas librerias.
> 
> ...


----------



## baterod3 (Feb 13, 2012)

Yo creo q eso debería funcionar eh....simulalo en proteus camarada


----------



## lubeck (Feb 14, 2012)

Oigan... alguien me puede confirmar o rechazar mi teoria de que con el pic 16f628A no se puede utilizar el RA5/MCLR/vpp como puerto Digital IO y ademas usar el Oscilador interno...

o lo que es lo mismo no es valido si pongo 
@ DEVICE INTRC_OSC
@ DEVICE MCLR_OFF
porque se deshabilita el oscilador interno...

y se deberia poner...
@ DEVICE INTRC_OSC
@ DEVICE MCLR_On
ademas de utilizar una resistencia de 4k7 de RA5/MCLR/vpp a vdd...

Cierto o Falso?


----------



## D@rkbytes (Feb 14, 2012)

lubeck dijo:


> Oigan... alguien me puede confirmar o rechazar mi teoria de que con el pic 16f628A no se puede utilizar el RA5/MCLR/vpp como puerto Digital IO y ademas usar el Oscilador interno...
> 
> o lo que es lo mismo no es valido si pongo
> @ DEVICE INTRC_OSC
> ...



Saludos lubeck.
Haber si entendi, lo de usar RA5 como IO pues ya se sabe que solo es Input.
Ahora, yo he usado
@ DEVICE INTRC_OSC,MCLR_OFF
; ó
@ DEVICE INTRC_OSC_NOCLKOUT,MCLR_OFF
Para usar RA5 como entrada, y el oscilador interno siempre ha funcionado.
Lo unico que pasa es que no existe la función de RESET

Por cierto, sobre el segundo código que escribiste arriba para el amigo alejandrozama
dejame decirte que si funciona, lo probe sobre protoboard.

;************************************************************************
Una cosa rara que estoy notando en este momento y que nunca se me habia ocurrido comprobar es.
La palabra de configuración INTRC_OSC se refiere a que el oscilador interno tendra salida de clock por RA6.
y la palabra de configuración INTRC_OSC_NOCLKOUT que el oscilador interno no tendra salida de clock.
Porque se libera el pin RA6 para ser usado como IO

En la hoja de datos dice esto:

*INTRC is now called INTOSC.
Timer1 Oscillator is now designed for 32.768 kHz operation. In the PIC16F627/628,
the Timer1 oscillator was designed to run up to 200 kHz.*

*Note 1: INTOSC with RA6 = I/O or RC with RA6 = I/O.
          2: INTOSC with RA6 = CLKOUT or RC with RA6 = CLKOUT.*

Bien pues, configure el oscilador interno de las dos formas y nada que tengo salida de clock por RA6 
En cambio si lo configuro con oscilador a Xtal (Use uno de 4Mhz) Si que tengo salida de clock (Obvio)
Use osciloscopio y frecuencimetro para esta prueba.
Lo raro es que configurando el PIC para oscilador interno no obtuve salida de clock.
Y configure RA6 como salida.


----------



## lubeck (Feb 14, 2012)

Hola Dark....



> Haber si entendi, lo de usar RA5 como IO pues ya se sabe que solo es Input.


 tienes razon me resbale... RA5 es solo input



> La palabra de configuración INTRC_OSC se refiere a que el oscilador interno tendra salida de clock por RA6.
> y la palabra de configuración INTRC_OSC_NOCLKOUT que el oscilador interno no tendra salida de clock.



segun el archivo inc de pbp estos dos son lo mismo...
*INTRC_OSC_CLKOUT*   equ	3FEC0011h       ; XX XXXX XXX1 XX01
*INTOSC_OSC_CLKOUT* equ	3FEC0011h       ; XX XXXX XXX1 XX01

y estos tres son lo mismo....
*INTRC_OSC_NOCLKOUT*   equ	3FEC0010h       ; XX XXXX XXX1 XX00
*INTOSC_OSC_NOCLKOUT* equ	3FEC0010h       ; XX XXXX XXX1 XX00
*INTRC_OSC*   	            equ       3FEC0010h       ; XX XXXX XXX1 XX00

el valor 3FEC0011h clkout  tiene salida por ra6
y el valor 3FEC0010h  noclkout no tiene salida....

(dato solo como reafirmacion.)



> Timer1 Oscillator is now designed for 32.768 kHz operation. In the PIC16F627/628,
> the Timer1 oscillator was designed to run up to 200 kHz.


yo estoy intentando usar el timer1 como entrada de oscilador con el cristal de 32.768...

pero se me queda pasmado el pic, lo tengo con un lcd y no aparece nada... solo se ve la primer linea con los cuadritos negros y la segunda linea nada (tengo un lcd de 16x2)

anexo simulacion que si funciona pero en la realidad no.... por si alguien tiene chance de analizarlo, seguramente es algo tonto que estoy pasando por alto... (probe con tres pics  y dos lcd que supuestamente funcionan y lo mismo, revice 800mil veces las conexiones en el proto) 



> Bien pues, configure el oscilador interno de las dos formas y nada que tengo salida de clock por RA6
> En cambio si lo configuro con oscilador a Xtal (Use uno de 4Mhz) Si que tengo salida de clock (Obvio)
> Use osciloscopio y frecuencimetro para esta prueba.
> Lo raro es que configurando el PIC para oscilador interno no obtuve salida de clock.
> Y configure RA6 como salida.



entonces deduzco que en lo que basaba mi teoria del mcrl y el oscilador no se refiere al oscilador en si, sino a que se deshabilita el reloj del ra6 no?

segun el datashit...


----------



## D@rkbytes (Feb 15, 2012)

lubeck dijo:


> yo estoy intentando usar el timer1 como entrada de oscilador con el cristal de 32.768...
> 
> pero se me queda pasmado el pic, lo tengo con un lcd y no aparece nada... solo se ve la primer linea con los cuadritos negros y la segunda linea nada (tengo un lcd de 16x2)
> 
> anexo simulacion que si funciona pero en la realidad no.... por si alguien tiene chance de analizarlo, seguramente es algo tonto que estoy pasando por alto... (probe con tres pics  y dos lcd que supuestamente funcionan y lo mismo, revice 800mil veces las conexiones en el proto)


  Saludos lubeck.
Upps! Lo que voy a relatar no se si solo me pase a mi, sucede que al programar el PIC16F628A
con el código que adjuntaste. (Usando el programador JDM y el programa WinPic800)
Todo durante la programación aparece muy normal, así que deduje que el PIC había sido bien grabado.
Mhhh!!! lo monte al proto y también, el LCD en blanco, ni cuadritos negros ni nada.
Como si el PIC estubiera sin grabar, entonces lo coloque al programador y lo leí.
Vaya sorpresa! el programador me mostró "Dispositivo Desconocido" y no aparece el código original,
sino otro código totalmente diferente al del programa ingresado, entonces lo trate de reprogramar
pensando el algún error momentáneo de programación, pues nop! igualmente me mostró
"Dispositivo Desconocido" y error de escritura en la posición 0X0000
"Escrito 0X1B se encontró 0X sabe que!  (No recuerdo)
"Cabe aclarar que no se trata del clasico error de fuses de protección activados"
A mi no me aparece ese error aún con los fuses de protección activados.
Cambie de programa al IC Prog NT y lo mismo,
 mas tardado para aparecer el error por que lo muestra después de verificar los datos.
Mhhh!!!  Coloque otro PIC16F628A y lo leí, con el WinPic800 con este si detectaba un 16F628A
Colocando el primero no lo detecta y no permite grabarlo, "Catalepsia en el PIC" 
Sip. Ya que logre recuperarlo con el IC Prog haciendo unos pequeños cambios a la configuración.
Esto es, Delay con valor 13, todo el Buffer de datos en 3FF y el de la EEPROM en 0FF
Oscilador en XT, Bits de configuración solo PWRT y MCLR en ON y a Programar todo.
Ok. Con eso recupero los PIC que les sucede eso.
Lo intente de nuevo con otro PIC y sucedió lo mismo, así que no se si solo a mi me suceda esto.
Pero solo me pasa con el programa del fútbol. ¿Que podrá ser? 
No se si ya probaste a leer el PIC después de grabado.
Me avisas si lo puedes leer y regrabar otra vez, ya que yo no puedo leerlo como debe, y al regrabarlo
queda irreconocible por Winpic800 y ni con IC Prog se puede volver a grabar si no lo revivo.
Suerte y hasta luego.


----------



## lubeck (Feb 15, 2012)

> Lo intente de nuevo con otro PIC y sucedió lo mismo, así que no se si solo a mi me suceda esto.
> Pero solo me pasa con el programa del fútbol. ¿Que podrá ser?
> No se si ya probaste a leer el PIC después de grabado.
> Me avisas si lo puedes leer y regrabar otra vez, ya que yo no puedo leerlo como debe, y al regrabarlo
> queda irreconocible por Winpic800 y ni con IC Prog se puede volver a grabar si no lo revivo.



 no tengo idea de que pueda ser, sera el primer virus para PICS  

a mi me pasa algo similar...

tengo un programador master-prog (usb) que al programar el codigo main.hex del futbolito, se graba la primer vez pero despues al leerlo me marca lo mismo Dispositivo desconocido, y es imposible volverlo a leer con ese programador....

tambien tengo mi programador (uCIIBurn) que es paralelo y con winpic800 si lo reconoce, lee y graba... de echo lo verifico y no me marca ningun error, lo leo con el masterprog y ahi queda irreconocible por la eternidad....

pedi soporte a masterprog y me preguntaron que si el pic  configuraba con mcrl y con pwrt, les contste que si pero ya no he tenido respuesta....


----------



## D@rkbytes (Feb 15, 2012)

lubeck dijo:


> no tengo idea de que pueda ser, sera el primer virus para PICS


  Ok. Como mencionaste eso del primer virus para PICS, busque acerca de eso en Google
y apareció un tema similar, en donde una persona al grabar cierto código, le ocurrió lo mismo,
lo hizo hasta con 12 PICS y cuenta que sus 12 PICS quedaron inutilizables, ya que no los pudo volver a recuperar.
¿Recuerdas un tema que se inicio, en donde se pretendía usar RA5 como salida?
Pues dentro de ese tema Daniel Meza cita que es una burrada usar el oscilador interno y con RA5 como entrada.
Este es el enlace del comentario y una solución para recuperar el PIC
 Sin embargo yo he usado RA5 como entrada usando el oscilador interno y no ha pasado nada.
Al parecer el "virus" entra en acción cuando se utiliza el registro T1CON y oscilador interno.
ya que acabo de probar el mismo código, pero usando configuración XT_OSC
y no pasa nada, el PIC se puede leer y regrabar como siempre.
En tu código usas el PIN RA7 como entrada por lo cual no se puede usar XT_OSC (Solo probé)
Como comente anteriormente, si he podido recuperar los PIC otra vez, pero con el método que cite.
Me ha pasado algo similar también con el PIC12F675 pero por mala calibración del OSCCAL
He igualmente lo he podido recuperar. La persona que daño los 12 PIC16F628A pidió a Microchip
una respuesta y pidiendo que sacaran al mercado una nueva versión del PIC16F628A
que seria la versión PIC16F628B  con ese BUG corregido.
Este es el enlace del post del foro de Microchip en el 2007 Mucho tiempo y al parecer no le dieron respuesta.
Esta persona quedo con sus PICS inservibles debido a este BUG en el 16F628A
Me parece lubeck que tendras que reconfigurar el programa para usar cristal.  Pero te faltara un pin.
Suerte y hasta luego.


----------



## lubeck (Feb 15, 2012)

> Me parece lubeck que tendras que reconfigurar el programa para usar cristal.  Pero te faltara un pin.
> Suerte y hasta luego.



Ok... el RB7... en el diseño solo esta simulando el descuento del tiempo que hara la interrupcion del timer1... se puede eliminar... 
intentare lo mismo pero con el oscilador externo... a ver que pasa...

lo que se me hace raro es que este proyecto esta basado en este reloj alarma, lo unico diferente por asi decirlo es el uso del LCD... 

ahora mismo estoy rearmando un programador JDM para usarlo con el winpic800 y ver que pasa... en fin un proyecto que pense que iba a ser cuestion de un dia me esta sacando canas verdes...  ya contare los avances...

Gracias dark.. y hasta luego..


----------



## alejandrozama (Feb 15, 2012)

hola que tal, primeramente gracias a lubeck por su respuesta me funciono a la perfeccion.

bueno pues estoy aqui nuevamente con una pregunta muy sencilla pero ya llevo un tiempo no logro que me funcione.

la cuestion es que necesito usar compuertas logicas pero no logro que me queden todas.

@ device xt_osc 
define osc 4
trisb=0
trisd=1
inicio:
portb.0= portd.0 or portd.1
portb.1= portd.2 and portd.3
goto inicio

estas dos compuera si me quedan pero cuando escrivo:
portb.1= portd.2  NOT AND portd.3  (me marca error)
portb.1= NOT portd.2 AND portd.3 (me compila pero no hace la funcion de la compuerta)


alguien sabe como se utilizan estas compuertas?????


----------



## lubeck (Feb 15, 2012)

> portb.1= portd.2 NOT AND portd.3 (me marca error)
> portb.1= NOT portd.2 AND portd.3



debes poner que debe hacer al ser verdadera la condicion ejemplo:

*if (portb.1= portd.2)  AND not portd.3 then*
 aqui lo que va hacer si se cumple la condicion
*endif*

o el otro

*if (portb.1 and not portd.2) AND portd.3 then *
 aqui lo que va hacer si se cumple la condicion
*endif*


----------



## reyvilla (Feb 15, 2012)

Hola muchachos les comento mi experiencia similar con los pic12f675 y 16f877a, he tenido problemas de lectura despues de grabarlos y ha sido como comenta Darkbytes, por mala configuración del osccal, he contado con la suerte de poderlos recuperar con el mismo winpic800 cambiando configuraciones de wdt, mcl, etc... y regrabandolo todo en FF, en el caso del 12f675 copiando la ultima dirección el valor de fabrica del osscal, y de esa manera logro que vuelva a ser autodetectado por el winpic800.

Otra cosa aparte que me paso es que compile un código para el pic12f675 con interrupción interna y no me permitía programarlo con el mcl desactivado, cada vez que lo mandaba a programar llegaba hasta 99 y luego me decía error de verificación en la dirección 2007h, luego no me leía ni me permitió programarlo mas, para lo cual aplique algo similar lo borre varias veces 3 mas o menos y luego lo programe con otro código ya probado que si se programaba sin problemas y vuala lo programaba todo ok pero no se porque me da ese problema ya que tengo muchos códigos probados sin el mcl activado que si programa y funcionan bien...Bueno espero les sirva de algo mis experiencia saludosss


----------



## lubeck (Feb 15, 2012)

> Pero que necesitas específicamente?



ya lo dijo Dark...

"No hacer nada y conseguirlo todo".

no crees?


----------



## ugt (Feb 16, 2012)

hola a los colegas del foro!!! quiero ver si alguien me puede ayudar con este codigo, UNA RADIO BALIZA y encontré esto en la red pero no se en que lenguaje estará ??? este es el codigo:


----------



## lubeck (Feb 16, 2012)

*UGT*
Eso es Lenguaje C
(mete el codigo entre acotacion de codigo para que no sea vea tan largo si puedes )

Con respecto a mi problema del 628A

Ya arme el programador JDM y ese tampoco reconoce al pic....

el unico que borra, lee, reconoce y escribe sin problemas es el programador paralelo que hice(uCIIBurn)....

lo que no me queda claro es porque????


----------



## ugt (Feb 16, 2012)

gracias lubeck , no conozco ese lenguaje. no se en que compilarlo!!! un abrazo gracias, yo todavia con mis pic16f84a...


----------



## lubeck (Feb 16, 2012)

> no se en que compilarlo!!!



Parece que es para el compilador en mikro C (no estoy muy seguro) 

pero se ve facil migrarlo a PBP... creo... 


------------------------------------------------------------
de nuevo yo con los avances de mi problema....


bueno el problema de porque solo se graba una vez y despues no se reconoce el micro en algunos programadores, se debe al usar el oscilador interno del pic 16f628A...

me explico...

cuando se mete al programador este alimenta al micro entonces como el oscilador es interno el programa que fue grabado por primera vez se empieza a ejecutar y esto hace que se bloquee para que lo reconozca el programador... 

el porque con mi programador paralelo (uCIIBurn) no tiene ese problema? es porque este solo alimenta los 5v de vdd, milisegundos antes de activar el vpp que es el que se encarga de grabar el micro...

asi que ya saben....  si tienen problemas al grabar el pic16f628A, lo mas probable es que esten utilizando el oscilador interno, y cuesta uno y la mitad del otro borrarlo si no se puede manipular el vdd del micro...

ya llevo el 50% resuelto de mi proyecto que iba a ser de un ratito...


----------



## reyvilla (Feb 16, 2012)

lubeck probaste reprogramarlo todo en FF y configurando todo como si fuera uno nuevo osea con el mcl, wdt, boren, lvp...etc...Intenta programarlo asi y luego chequea de nuevo...saludosss


----------



## lubeck (Feb 16, 2012)

reyvilla dijo:


> lubeck probaste reprogramarlo todo en FF y configurando todo como si fuera uno nuevo osea con el mcl, wdt, boren, lvp...etc...Intenta programarlo asi y luego chequea de nuevo...saludosss



hola rey...


el problema es que una vez grabado por primera vez, el programador ya sea el masterprog o el JDM ya no lo reconoce , o por lo menos yo no logre que lo reconociera ni con el icprog ni con el winpic ni con el propio del masterprog...

lo que hice a la mexicana   fue meter el pic e instantes despues (lo mas rapido) presionar el boton de borrar, antes de que se empezara a ejecutar el programa... y listo... se borra cuantas veces quiera...

Ojo que solo cuando esta el intrc_osc cuando esta el xt_osc no hay ningun problema con ninguno de los programadores...


----------



## ugt (Feb 16, 2012)

Parece que es para el compilador en mikro C (no estoy muy seguro) 

pero se ve facil migrarlo a PBP... creo... 


gracias lubek si eso estaba biendo pasarlo a pbp pero me queda un tanto grande la tarea ya que ase mucho que no miro los programas


----------



## lubeck (Feb 18, 2012)

Bueno pues les tengo buenas y malas noticias con mi proyecto, que en realidad es un temporizador y un cuenta goles para un futbolito de mesa

el 50% del problema  restante era que el pic que estaba usando estaba dañado algun pin que iba al LCD, pero ese pic era nuevo asi que no supuse que estaba dañado, (se debio haber dañado con estatica o algo asi), puse otro nuevo y listo ya funciona como se supone que debia hacerlo 

ya tenia los sensores de los goles, el monedero electronico para las monedas, y un bedito actuador para detener las pelotas cuando el tiempo se acabara.... todo funcionaba de maravilla peroooooooo... que se atora el bendito actuador y se sobrecalento el circuito y se quemo el ultimo pic 628A que me quedaba... 

ahora hare lo mismo pero con uno de los dos 877A que tengo... y empezar de nuevo...


----------



## shura (Feb 22, 2012)

Que tal amigos lo que pasa es que quiero hacer un display que marca la hora...
y e conseguido por la red este circuito pero no me sale el codigo para programarlo en PIC BASIC..
espero me puedan ayudar a programarlo en PIC BASIC, les dejo el circuito diseñado en Proteus
pero si tienen algun otro modelo o diseño ayudenme....please....


----------



## lubeck (Feb 22, 2012)

espero te sirva _este_ ejemplo


----------



## Meta (Feb 22, 2012)

ugt dijo:


> gracias lubeck , no conozco ese lenguaje. no se en que compilarlo!!! un abrazo gracias, yo todavia con mis pic16f84a...



Lo gracioso que ese lenguaje en el futuro lo dejan de usar y se mete en el C, más estandar y más ejemplos. Vale más la pena.

También con el 16F84A y 16F88.


----------



## shura (Feb 23, 2012)

gracias lubeck, por compartirme...sin embargo ando buscando algo con Displays de 7 segmentos...


----------



## D@rkbytes (Feb 23, 2012)

shura dijo:


> gracias lubeck, por compartirme...sin embargo ando buscando algo con Displays de 7 segmentos...


El colega lucassiglo21 en este foro compartio un proyecto con displays de 7 segmentos.

Este es el enlace: *Reloj despertador con pic y cristal de 32.768khz*


----------



## shura (Feb 23, 2012)

gracias amigo Darkbytes, esta buenisimo el link que me compartes, deantemano gracias a Luccassiglo21 por sus diseños ya que me ayudaran mucho es lo que andaba buscando


----------



## alejandrozama (Feb 23, 2012)

hola que tal pues sigo con mis practicas ya realice varias de motores a pasos pero una me cuestan trabajo,

la cuestion es que deves de controlar cuantos pasos da un motor segun la entrada del puerto D con 7 bit los cuales se utilizarian como numeros binarios para dictar cuantos pasos de el motor, talvez no me explique muy bien por eso dejo la imagen, no se como me tome esas entradas como binario.


----------



## reyvilla (Feb 23, 2012)

lubeck dijo:


> Bueno pues les tengo buenas y malas noticias con mi proyecto, que en realidad es un temporizador y un cuenta goles para un futbolito de mesa
> 
> el 50% del problema  restante era que el pic que estaba usando estaba dañado algun pin que iba al LCD, pero ese pic era nuevo asi que no supuse que estaba dañado, (se debio haber dañado con estatica o algo asi), puse otro nuevo y listo ya funciona como se supone que debia hacerlo
> 
> ...



Hola lubeck, disculpa me distraje con el trabajo y no preste mucha atencion, tengo un aporte de un programador_ https://www.forosdeelectronica.com/posts/572897/ _con  el cual llevo mas de 3 o 4 años utilizando sin ningún tipo de problemas, te comento esto porque incluso en un proyecto llegue a programar unos 300 pic's 12F509 con oscilador interno y todos fueron reconocidos luego de ser programados no causo ningun conflicto, igual con el 12F675, 12F629, 16F628A. Se que a lo mejor es algo tarde pero para que lo tengas de referencia. En un solo caso el winpic no me permitio programar el pic sin el MCL, y fue un receptor IR con interrupcion y sin embargo logre recuperar el pic activando el MCL y re-programandolo, en estos dias hago un vídeo para que observes que es lo que sucede y como lo solucione...saludosss


----------



## lubeck (Feb 24, 2012)

Hola rey....

ese es el JDM no??'...

yo lo arme y no lo pude echar a andar... 
y desisti de revisarlo a fondo porque haciendo pruebas con el winpic nunca deshabilitaba los 5v(vdd).... 
lo que marco en el recuadro rojo es para controlar el vdd pero no se puede... o sea que siempre estan activos... si gustas verificarlo con tu multimetro....


ahora que ya me haces dudar en cuanto a eso  si dices que se reprograma sin problema algo esta raro...


----------



## reyvilla (Feb 24, 2012)

Bueno si yo también tuve muchas dudas en su momento que aun no aclare mucho ya que me da cierto miedo descubrir algo que no sabia y pueda que este haciendo mal...jejeje...Te digo porque justo el programador yo tome de referencia un pin que dice ser de gnd no porque así lo quise si no que mi programador es como un clon prácticamente del JDM llevado a solo icsp, a pesar de que el pin 5 del db9 es gnd normalmente, pero en el programador queda como +5V y de echo lo medi por la duda en aquel entonces y efectivamente mide +5V, entonces la duda porque si dice que es GND mido +5V?, con referencia a tierra de los diodos y el zener. Vistes el circuito?


----------



## D@rkbytes (Feb 24, 2012)

Saludos.
Les quiero dejar aquí una información acerca del funcionamiento del JDM
Esta información explica como es que hace el programador para tomar los voltajes de funcionamiento.
Antes que nada les presento mi programador JDM 2-1 en la primer foto y en la tercera usando ICSP.
En la segunda foto, su diagrama esquemático.
Graba muchos tipos de PIC de la serie 12XXXX y la 16XXXX así como EEPROMS 24CXXX.
Trabaja con programas como los famosos PonyProg, el ICProg o el WinPIC800
Está fabricado en PCB de fibra de vidrio muy delgada con serigrafía, y cuenta con conector ICSP.
La información que muestro a continuación, la encontré hace años en una pagina que todavía esta en línea.
;******************************************************************
Este programador por puerto serie hace uso de las siguientes señales:  

*TXD*
- Tensión de alimentación y de programación, patilla */MCLR*
 
*RTS*
- Pulsos de reloj, patilla *RB6*
 
*DTR* (salida), *CTS* (entrada)
- Datos en serie (serial data), patilla *RB7*
 
  La tensión de la entrada de reloj está limitada mediante D3 y D4 sin que sea necesaria ninguna resistencia limitadora.
  Los diodos a Vdd internos del PIC protegen también las entradas.
Los dispositivos 24CXX no tienen ningún diodo a Vdd, y D4 es absolutamente necesario.

Q2 aumenta el voltaje de salida a niveles RS232. Entonces funciona como base común.
R2 es una resistencia pull-up que no resulta fundamental debido a la corriente limitada del puerto RS232.
Q2 también limita la tensión de la entrada al PIC cuando DTR es de nivel alto.
Entonces funciona como un seguidor de emisor y se reduce la tensión de la entrada a Vdd-0.7V.
  Cuando DTR se pone a nivel bajo, Q2 trabaja invertido y la ganancia sólo es aproximadamente de 5.
La resistencia equivalente es aproximadamente 10K/5 = 2K.
Esto reduce la corriente de entrada de datos al PIC junto con la resistencia R2.
Cuando DTR cambia de nivel bajo a nivel alto, Q2 cambia de modo invertido saturado a seguidor de emisor activo.
Esta causa un pico sobre los datos, pero el pico está extinguido cuando cambia el reloj.
Esto garantiza que las EEPROM no pasen el modo de prueba. 
  Q1 trabaja en cierto modo como seguidor de emisor también, pero se satura cuando está activo.
En ese caso su tensión CE es muy baja. El transistor activa o desactiva la tensión para MCLR. 
  TXD alimenta a C2 para que alcance 13V a través de la unión base-colector de Q1.
La tensión en C2 está limitada por el zener D6 y es aproximadamente 5.1V+8.2V = 13.3V.
Cuando TXD está a nivel alto la tensión en MCLR no excede esta tensión.
La base sube a una tensión más alta, pero Q1 se satura y la salida no excederá la tensión de colector.
  C2 proporciona el Vpp y el Vdd a través del diodo zener D6.
Pero Vdd sólo aparece si el voltaje en C2 es aproximadamente de 13V.
Si tiene 8V, entonces será posible controlar la alimentación mediante RTS y DTR.
La alimentación C2 se reduce aproximadamente a 8V por medio de TXD, DTR y RTS
mantenidas a nivel alto durante aproximadamente 0.5s.
  El diodo extra, D5, limita la tensión sobre TXD.
En principio se utiliza para alimentar la EEPROM cuando DTR y RTS están a nivel alto.
También garantiza que MCLR sea mayor de -0.2V cuando TXD está a nivel bajo.
El diodo D7 pone MCLR a nivel bajo cuando TXD está a nivel bajo.
  El PIC también es alimentado por RTS mediante D3.
La corriente de entrada "On Data" también alimenta el PIC por Vss.
Ambas señales necesitan ser negativas para alimentar al dispositivo con la máxima corriente posible.
C2 alimenta al PIC si las señales son positivas. RTS y DTR no son criticas al programar las 24CXX,
porque el diodo D5 pone Vss a nivel bajo.
  Al programar un PIC sólo D3 puede utilizarse. RTS y DTR necesitan ser de nivel bajo para alimentarlo,
y no deben estar a nivel alto durante demasiado tiempo.
La corriente es excepcionalmente alta al leer los ceros del PIC,
y el tiempo de lectura activo con DTR a nivel alto debe ser corto.
Para compensar la corriente utilizada, un nivel bajo debe aplicarse a RTS durante un tiempo extra.
  Si reemplaza D5 y D7 por un BC557B, es importante que sepa que,
la base-emisor se comporta como un un diodo zener.
Sólo D7 pueden actuar como un zener, y MCLR necesita ser conectado al emisor,
mientras el colector del BC557B se conecta a Vss.
El transistor trabaja en cierto modo como seguidor de emisor, y proporciona a MCLR una corriente alta extra.
  Esta corriente alta no es necesaria, y puede incluso dañar al BC557B si el programador se conecta con alimentación externa.
Conectar el programador a una fuente de alimentación externa siempre puede causar problemas,
y no se permite para el uso normal.
  El peligro de conectar una fuente de alimentación externa está en que el diodo zener interior reduce el voltaje a 5.1V.
Y puede ser perjudicial que se aplique una tensión demasiado alta.
Las conexiones externas pueden causar problemas también debido a tensiones negativas.
Vdd se conecta a la masa del PC y pueden provocarse cortocircuitos si un circuito externo se conecta con la masa del ordenador, por ejemplo a traves de la toma de tierra.
Una fuente de alimentación externa también puede dar problemas de seguridad si los PIC u otros dispositivos no se insertan adecuadamente.
;******************************************************************
Ok. Así es como funciona el programador JDM

Referencias:
*Programador PIC y EEPROM JDM*

Suerte y hasta luego.


----------



## mecatrodatos (Feb 24, 2012)

shura dijo:


> Que tal amigos lo que pasa es que quiero hacer un display que marca la hora...
> y e conseguido por la red este circuito pero no me sale el codigo para programarlo en PIC BASIC..
> espero me puedan ayudar a programarlo en PIC BASIC, les dejo el circuito diseñado en Proteus
> pero si tienen algun otro modelo o diseño ayudenme....please....


 
Que tal espero te sirva el ejemplo que te anexo 

Saludos


----------



## Meta (Feb 24, 2012)

Por si acaso. 

Manual del ic-prog.


Saludo.


----------



## shura (Feb 24, 2012)

Que tal mecatrodatos

esta padrisimo el circuito que me compartiste, lo voy a empezar a revisar pa entenderle muco mejor, a un que de entrada sabes tu por que la tempratura siempre meda negativo -10°C por ejemplo... sabes por que...o ay algo qe corregirle...???

saludos...amigo...


----------



## Dario (Feb 26, 2012)

hola amigos, yo por aqui de nuevo.
bueno, en estos dias he retomado la experimentacion con el bendito itg3205 y he podido leer el numero que me dan sus ejes sin mover el gyro en mi pc utilizando el serial comunicator del microcode.
la lectura que me da sin moverlo de su lugar es la siguiente:

 eje  H/L  numero
 Xout-H = 255
 Xout-L = 0
 Yout-H = 255
 Yout-L = 0
 Zout-H = 0
 Zout-L = 0

los ejes X-H, Y-H y Z-H, varian al mover el gyro pero X-L, Y-L y Z-L, no lo hacen, se quedan constantemente en 0. teoricamente al configurar el registro 22 – DLPF, Full Scale en $03, deberia cubrir toda la escala leyendo asi por ejemplo, el eje X en su parte alta y su parte baja y ambos deberian variar al mover el gyro, pero no lo hace. aca dejo el codigo que estoy usando para ver si alguien ve lo que yo no veo y me dice que estoy haciendo mal  ... espero no sea mucho pedir jeje...  (ah, el programa lee el eje Xout-H, la lectura que hice fue hecha de a un eje.)
saludosss


```
@ DEVICE MCLR_OFF, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
include "modedefs.bas"
 DEFINE   OSC   4              ' Para trabajar con un cristal de 4MHz
 DEFINE I2C_HOLD 1
 define I2C_SLOW 0 ' Velocidad de I2C de 400KHz
trisa=0           'puertos como salidas
trisb=0
porta=0 
portb=0
SDA VAR PORTB.1 'entrada y salida de datos
SCL VAR PORTB.2 'reloj 
a1 var byte     'variable para almacenar los datos recibidos
i2cwrite sda,scl,%11010000,62,[$80]  'resetear el ITG a 0
pause 10
i2cwrite sda,scl,%11010000,21,[$09]  'configuro SAMPLE RATE
pause 10
i2cwrite sda,scl,%11010000,22,[$3]  'registro 22 full scale a ±2000°/sec 
pause 10
i2cwrite sda,scl,%11010000,23,[$00] 'sin interrupcion
pause 10

leer:
I2CREAD sda,scl,%11010000,29,[a1]  'leer eje Xout-H y guardar en a1
pause 5
serout portb.0,N2400,[#a1,"-"]   'enviar el valor de a1 a la pc
pause 5
goto leer                        'vuelve a iniciar lectura
```


----------



## reyvilla (Feb 27, 2012)

Hola d@rio, volvi a revisar el datasheet, y no veo por ningún lado lo de des-habilitar la interrupción, veo solo configuraciones de como hacer la interrupción, en todo caso revisa el pin 12 del integrado si esta al 5V o esta a 0V, porque de eso depende la configuración de la interrupción, aunque dices que la parte alta si cambia, por otro lado lo del registro 22, no es un solo registro son dos registros en la direccion 22, el FS_SEL que son los bit 4 y 3 y el registro DLPF_CFG que son los bit 0 1 2.
Yo te recomiendo no trabajar en hexadecimal ya que tiende a traer mas confuciones. Fijate tu estas enviando lo siguiente.

a la direccion 22 en hexa $3 en binario 00000011, 

lo que quiere decir que al registro  DLPF_CFG lo colocaste en hex $3 binario 011, lo que quiere decir que seleccionaste el parametro 3 del filtro pasa bajo.


y al registro  FS_SEL le enviaste en hex $00 y en binario 00, lo que quiere decir que seleccionaste
otra escala.

revisa bien y me avisas, por cierto creo que esta semana ya estoy por comprar el motion plus.

cualquier cosa me avisas saludos


----------



## Dario (Feb 27, 2012)

hola amigo rey, tenes razon  con lo del registro full scale, lo que yo tendria que poner seria 00011000, asi pondria 3 en el registro fs_sel y 000 en el registro dlpf_cfg. por otra parte, seria de gran ayuda si compras un wiimotion con este itg, 2 cerebros piensan mejor que 1  ... ademas,la verdad que estoy a punto de tirar la tohalla jejeje... me tiene contra la cuerdas el muy desgraciado 
saludosss


----------



## J2C (Feb 27, 2012)

Dario 

Yo leeria los dos byte de una sola vez como en el adjunto:


```
@ DEVICE MCLR_OFF, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
include "modedefs.bas"
DEFINE   OSC   4                     'Para trabajar con un cristal de 4MHz
DEFINE I2C_HOLD 1
define I2C_SLOW 0                    'Velocidad de I2C de 400KHz
trisa=0                              'puertos como salidas
trisb=0
porta=0 
portb=0
SDA VAR PORTB.1                      'entrada y salida de datos
SCL VAR PORTB.2                      'reloj 
a1 var byte                          'variable para almacenar los datos recibidos
 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
a2 var byte     'variable para almacenar los datos recibidos   (LOW)
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
 
i2cwrite sda,scl,%11010000,62,[$80]  'resetear el ITG a 0
pause 10
i2cwrite sda,scl,%11010000,21,[$09]  'configuro SAMPLE RATE
pause 10
i2cwrite sda,scl,%11010000,22,[$18]  'registro 22 full scale a ±2000°/sec
                                     'Modificado según ReyVilla 
pause 10
i2cwrite sda,scl,%11010000,23,[$00]  'sin interrupcion
pause 10
leer:
I2CREAD sda,scl,%11010000,29,[a1]    'leer eje Xout-H y guardar en a1
pause 5
 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
I2CREAD sda,scl,%11010000,30,[a2]    'leer eje Xout-L y guardar en a2
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
 
serout portb.0,N2400,[#a1,"-"]       'enviar el valor de a1 a la pc
pause 5
 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
serout portb.0,N2400,[#a2,"-"]       'enviar el valor de a2 a la pc
pause 5
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
 
goto leer                            'vuelve a iniciar lectura
```
 
Y lo enviaria a la PC siempre y cuando la manera que tengas implementado todo el banco de pruebas ahora te lo permita.

Por otra parte creo conveniente leer los 2 byte de los 3 Gyro de una sola vez.



Saludos, JuanKa.-


----------



## Dario (Feb 27, 2012)

amigo juanka: gracias por tu codigo, lo acabo de probar y funciona perfecto, puedo leer el eje X completo, tanto la parte baja como la parte alta, muchas gracias por tu tiempo amigo, ahora voy a intentar leer los tre ejes de una sola vez como me sugieres.
ahora, lo que noto, es que la parte baja del eje X varia sin mover el aparato ¿a que podra deberse eso?
saludos y gracias


----------



## J2C (Feb 27, 2012)

D@rio



D@rio dijo:


> amigo juanka: gracias por tu codigo,.....


 
Que código ???, es *tu código* con un pequeño agregado mio (colaboración apenas) y sin probarlo cosa que has hecho tu. Muchas veces leyendolos en el pasado me doy cuenta de la dificultad de trabajar de esta manera, pero eso no quita que intente colaborar con alguien cuando veo que mi aporte tiene lógica para probar y tengo un tiempo para elaborar la respuesta/idea.



Ahora yendo a la cuestión técnica; respecto a las variaciones de la parte baja del eje X supongo varias alternativas distintas:

*A*) Son debido a la sensibilidad de posee este Gyroscopo= 2000°/seg.

*B*) Tenemos que pensar que el mismo tiene internamente 3 ADC's de 16bit, 65536 posibles posiciones!!!!!!!!!! dentro de un giro de 360°. O mejor pensando que la información por eje esta en *2 Byte y como Complemento a 2*, _*divago*_ que tengo 360° a la izquierda con 32768 posibles posiciones (una cada 0.010986328125°) y otro tanto hacia la derecha, MUCHISIMA precisión para mi gusto!!!.

*C*) Son ruidos de Cuantificación (http://es.wikipedia.org/wiki/Cuantificación_digital) producidos durante la Conversión de Analógico a Digital. Y para esto "*creo*" que se debe trabajar en la elección del *DLPF_CFG* dentro del *byte 22* para filtrar mejor la señal con el "Digital Low Pass Filter" interno del Gyro aunque tal vez se pierda algo de exactitud, esto deberas probarlo ya que tu tienes el banco de pruebas funcional.



Por otra parte y tratando de avanzar más en la investigación te adjunto una modificación del código para leer los *3 Ejes y el Sensor de Temperatura*, no se si funcionara ni si el tamaño del programa te entrara en el Pic que estas utilizando como Interfaz entre el Gyro y la PC.


```
@ DEVICE MCLR_OFF, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
include "modedefs.bas"
DEFINE   OSC   4                     'Para trabajar con un cristal de 4MHz
DEFINE I2C_HOLD 1
define I2C_SLOW 0                    'Velocidad de I2C de 400KHz
trisa=0                              'puertos como salidas
trisb=0
porta=0 
portb=0
SDA VAR PORTB.1                      'entrada y salida de datos
SCL VAR PORTB.2                      'reloj 
a1 var byte                          'variable para almacenar los datos recibidos
 
[COLOR=red]'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#[/COLOR]
a2 var byte     'variable para almacenar los datos recibidos   (Low)
b1 var byte     'variable para almacenar los datos recibidos   (High)
b2 var byte     'variable para almacenar los datos recibidos   (Low)
c1 var byte     'variable para almacenar los datos recibidos   (High)
c2 var byte     'variable para almacenar los datos recibidos   (Low)
d1 var byte     'variable para almacenar los datos recibidos   (High)
d2 var byte     'variable para almacenar los datos recibidos   (Low)
[COLOR=red]'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#[/COLOR]
 
i2cwrite sda,scl,%11010000,62,[$80]  'resetear el ITG a 0
pause 10
i2cwrite sda,scl,%11010000,21,[$09]  'configuro SAMPLE RATE
pause 10
i2cwrite sda,scl,%11010000,22,[$18]  'registro 22 full scale a ±2000°/sec
                                     'Modificado según ReyVilla 
pause 10
i2cwrite sda,scl,%11010000,23,[$00]  'sin interrupcion
pause 10
leer:
I2CREAD sda,scl,%11010000,29,[a1]    'leer eje Xout-H y guardar en a1
pause 5
 
[COLOR=red]'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#[/COLOR]
I2CREAD sda,scl,%11010000,30,[a2]    'leer eje Xout-L y guardar en a2
pause 5
I2CREAD sda,scl,%11010000,31,[b1]    'leer eje Yout-H y guardar en b1
pause 5
I2CREAD sda,scl,%11010000,32,[b2]    'leer eje Yout-L y guardar en b2
pause 5
I2CREAD sda,scl,%11010000,33,[c1]    'leer eje Zout-L y guardar en c1
pause 5
I2CREAD sda,scl,%11010000,34,[c2]    'leer eje Zout-L y guardar en c2
pause 5
I2CREAD sda,scl,%11010000,27,[d1]    'leer eje Temp-L y guardar en d2
pause 5
I2CREAD sda,scl,%11010000,28,[d2]    'leer eje Temp-L y guardar en d2
pause 5
[COLOR=red]'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#[/COLOR]
 
serout portb.0,N2400,[#a1,"-"]       'enviar el valor de a1 a la pc
pause 5
 
[COLOR=red]'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#[/COLOR]
serout portb.0,N2400,[#a2,"-"]       'enviar el valor de a2 a la pc
pause 5
serout portb.0,N2400,[#b1,"-"]       'enviar el valor de b1 a la pc
pause 5
serout portb.0,N2400,[#b2,"-"]       'enviar el valor de b2 a la pc
pause 5
serout portb.0,N2400,[#c1,"-"]       'enviar el valor de c1 a la pc
pause 5
serout portb.0,N2400,[#c2,"-"]       'enviar el valor de c2 a la pc
pause 5
serout portb.0,N2400,[#d1,"-"]       'enviar el valor de d1 a la pc
pause 5
serout portb.0,N2400,[#d2,"-"]       'enviar el valor de d2 a la pc
pause 5
[COLOR=red]'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#[/COLOR]
 
goto leer                            'vuelve a iniciar lectura
```
 

En lo personal me gustaria y si puedes armarlo aunque sea un archivo de texto (*.txt) tener una tirada de la respuesta que entraga el Gyro y visualizas en la PC aunque sean las respuestas en Hex minimamente separadas como:
Eje_X , Byte_L , Byte_H
Eje_Y , Byte_L , Byte_H
Eje_Z , Byte_L , Byte_H
Temp , Byte_L , Byte_H

para realizar una planilla en Excel y tratar de ver las variaciones a ver si se saca alguna idea de los cambios espaciales. Creo que seria mas fácil de comprender cambiando la posición de un eje a la vez digamos 45° y ver como varia. No se si te animas a probarlo pero ese archivo *.txt con pruebas de ese tipo nos enseñaria muchisimo acerca de la filosofia del funcionamiento del mismo Gyro, fuera que sepamos actualmente que es lo que hace. 



Saludos, JuanKa.-


P.D.1: D@rio y demas foristas disculpen la extensión de esta respuesta.

P.D.2: Como siempre lo que se encuentra entre "* '#=#=# *" es el agregado que he realizado.

P.D.3: Corregido errores (HORRORES) dentro de los Comentarios del Código.


----------



## reyvilla (Feb 27, 2012)

JAJAJA  amigos como que se nos desperto un gran interes por el giroscopio , yo recien termino mi código, que coloco acá una mejora al que colocastes antes, es algo mas reducido y hace prácticamente lo mismo, ya sacaremos uno mas optimisado entre nosotros, este código es mas corto pero hace lo mismo en menos lineas...saludoss 



```
@ DEVICE MCLR_OFF, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
include "modedefs.bas"
DEFINE   OSC   4                     'Para trabajar con un cristal de 4MHz
DEFINE I2C_HOLD 1
define I2C_SLOW 0                    'Velocidad de I2C de 400KHz
trisa=0                              'puertos como salidas
trisb=0
porta=0 
portb=0
SDA VAR PORTB.1                      'entrada y salida de datos
SCL VAR PORTB.2                      'reloj 

TEMP_OUT_H  VAR BYTE  'variable de TEMP_OUT_H
TEMP_OUT_L  VAR BYTE  'variable de TEMP_OUT_L
GYRO_XOUT_H VAR BYTE  'variable de GYRO_XOUT_H
GYRO_XOUT_L VAR BYTE  'variable de GYRO_XOUT_L
GYRO_YOUT_H VAR BYTE  'variable de GYRO_YOUT_H
GYRO_YOUT_L VAR BYTE  'variable de GYRO_YOUT_L
GYRO_ZOUT_H VAR BYTE  'variable de GYRO_ZOUT_H
GYRO_ZOUT_L VAR BYTE  'variable de GYRO_ZOUT_L
 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
a2 var byte     'variable para almacenar los datos recibidos   (LOW)
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
 
i2cwrite sda,scl,%11010000,62,[$80]  'resetear el ITG a 0
pause 10
i2cwrite SDA,SCL,%11010000,21,[$09,$18,$00] 'configuracion del igt
pause 10 

leer:
I2CREAD sda,scl,%11010000,27,[TEMP_OUT_H,TEMP_OUT_L,GYRO_XOUT_H,_
GYRO_XOUT_L,GYRO_YOUT_H,GYRO_YOUT_L,GYRO_ZOUT_H,GYRO_ZOUT_L]    'leer desde la direccion 27 a la 34
pause 10                                                         'y lo guarda en su respéctiva variable
 
serout portb.0,N2400,["TEMP-H",#TEMP_OUT_H,"-",10,13]       'enviar el valor de TEMP_OUT_H a la pc
serout portb.0,N2400,["TEMP-H",#TEMP_OUT_L,"-",10,13]       'enviar el valor de TEMP_OUT_H a la pc
pause 5
serout portb.0,N2400,["X-H",#GYRO_XOUT_H,"-",10,13]       'enviar el valor de GYRO_XOUT_H a la pc
serout portb.0,N2400,["X-L",#GYRO_XOUT_L,"-",10,13]       'enviar el valor de GYRO_XOUT_L a la pc
pause 5
serout portb.0,N2400,["Y-H",#GYRO_YOUT_h,"-",10,13]       'enviar el valor de GYRO_YOUT_H a la pc
serout portb.0,N2400,["Y-L",#GYRO_yOUT_l,"-",10,13]       'enviar el valor de GYRO_YOUT_L a la pc
pause 5
serout portb.0,N2400,["Z-H",#GYRO_ZOUT_h,"-",10,13]     'enviar el valor de GYRO_ZOUT_H  a la pc
serout portb.0,N2400,["Z-L",#GYRO_ZOUT_l,"-",10,13]       'enviar el valor de GYRO_ZOUT_L  a la pc
pause 5
goto leer                            'vuelve a iniciar lectura
```

EDITO: gracias, no lo habia usado antes, si me preguntaba como lo hacen pero gracias a ti ya lo se y lo tomare en cuenta y es cierto queda mejor asi...


----------



## J2C (Feb 27, 2012)

ReyVilla



reyvilla dijo:


> ...... yo recien termino mi código, que coloco acá una mejora al que colocastes antes, es algo mas reducido y hace prácticamente lo mismo.......


 
Perdón, pero yo solo modifique/amplie unas líneas del que coloco D@rio y ni sabia si iba a ser posible compilarlo y que funcionara, ya que aun a pesar de mi edad *NO se programar todavía*, me costo un triunfo con la ayuda del µCodePlus comprender el significado de algunas sentencias. Y si bien varias veces desde que pregunto el por el Gyro le respondi es por que vi al leer la Datasheet que la mayoria le daba *respuestas fuera del tarro*!!! (_expresión tipica Argentina_) y solo intente aclararle lo que yo comprendia.

También habia pensado colocar las variables en una matriz pero insisto, como no se programar aun tenias mas dudas que certezas. Y de esta manera quedaba 100% comprensible para el autor inicial del mismo y facilmente modificable con agregados o quitas de líneas.

Por otra parte y al desconocer todo el proceso no tengo la certeza que el producto final en formato *.hex sea mas *corto*, ya que desconozco como cambia el tamaño al compilar y linkear el µCodeStudioPlus  !!. Y antes que me olvide te pediria que el proximo código que subas/coloques lo hagas dentro de las etiquetas *["CODE"]* y *["/CODE"]*  sin las comillas (*"*) para que sea mas legible para quienes no estan practicos como yo. 


En definitiva, el unico que podra tener avances es D@rio al ser el unico en tener el Gyro delante de sus ojos!!!, todo un Conquistador Avanzado . Yo por ahora ni pienso en comprar uno para probar.



Saludos, JuanKa.-

P.D.: Todo lo expresado ha sido realizado con la *MEJOR ONDA*, de manera de *aprender, trabajar y reirnos* todos.-


----------



## reyvilla (Feb 27, 2012)

Por otro lado, D@rio ya compre el wii motion el día de mañana me lo dan,  me gustaría ir armando el circuito si no es mucha molestia de mi parte, como es tu circuito si tienes un esquema o una imagen, si le hicistes modificaciones y la interface si es con max-232...etc...gracias


----------



## alejandrozama (Feb 27, 2012)

hola saludos a todos, recurro a ustedes porque estoy realizando unas practicas de motores a pasos, ya realice la mayoria de las practicas solamente una no logro conseguir que me funcionen.

pic16f877a
el puerto b.0 a b.3 son para el motor pap unipolar
el puerto d se utiliza como entrada

es sobre una cierta cantidad de pasos que debe de dar el motor segun el puerto d. adjunto la imagen para que entiendan mejor, en este tambien logre hacer que funcionara pero no correctamente ya que yo logre que diera ciclos (4 pasos) y no pasos. me imagino que se deve de hacer con con el comando de desplazamiento pero no se como hacer el desplazamiento "<<" en solo las las salidas b.0,b.1,b.2,b.3


talvez  no me explique muy bien por eso dejo la imagen
de antemano gracias y estare pendiente de sus respuestas


----------



## elaveriguador (Feb 27, 2012)

mecatrodatos dijo:
			
		

> Bienvenido al foro Cesar 8k gracias por tu aporte le servira a nuestro amigo electroandres como una base para el proyecto que tiene planteado.



buenos dias hermano muy buen programa quiciera aserte una observacion y es la siguiente ubiese sido fantastico que le ubieses puesto los comentarios para que fuese mas didactico y cumpliece su rol educativo con mayor puntualidad te aseguro no ubiece un programa mas fenomenal seria el padre de dicho tutorial hermano siempre hay quienes empesamos y desde luego todos perdidos y tambaliantes


----------



## J2C (Feb 27, 2012)

*Modo OFF Topic ON *

ReyVilla 


reyvilla dijo:


> #1848
> 
> .....EDITO: gracias, no lo habia usado antes, si me preguntaba como lo hacen pero gracias a ti ya lo se y lo tomare en cuenta y es cierto queda mejor asi...


 
De eso se trata, aprender en todo sentido incluso en mejorar nuestras presentaciones que nos serviran en el resto de nuestra vida, "*Know How*" que le dicen por el norte!  .
Me costo un tiempito (meses) conocer como funcionaba, te adjunto una imagen de ayuda. 





reyvilla dijo:


> Por otro lado, D@rio ya compre el wii motion el día de mañana me lo dan, me gustaría ir armando el circuito si no es mucha molestia de mi parte, como es tu circuito si tienes un esquema o una imagen, si le hicistes modificaciones y la interface si es con max-232...etc...gracias


Ahora mañana comenzamos con otra *ForoNovela* buscando información sobre otro Gyro     !!!!.



Saludos, JuanKa.-


*Modo OFF Topic OFF *


----------



## Dario (Feb 27, 2012)

bueno muchachos, aqui les subo una imagen y un archivo .rar con el diagrama que estoy usando para leer el itg con la PC junto con el archivo pbp+hex de reyvilla y con los resultados de la lectura hecha con el serial comunicator en un archivo de texto, una inmovil y otra en movimiento, ambas en el mismo texto. ahora a ver que sacamos de todo esto. les cuento que mi proyecto con el itg, se trata de una especie de estabilizador de camara parecido a este que dejo en video de mas abajo para que tengan una idea aproximada de lo que intento hacer, obvio que el codigo sera mas extenso al comprender como funciona al 100% este gyro saludos y gracias por colaborar 

atencion!!! la coneccion del conector db9 en archivo rar esta equivocada, el terminal a conectar, es el pin 2 y no el 3 como muestra la figura
*esta imagen esta corregida*


----------



## alejandrozama (Feb 28, 2012)

ayuda con el tema #1851

por favor


----------



## lubeck (Feb 28, 2012)

> ayuda con el tema #1851
> 
> por favor





> en este tambien logre hacer que funcionara pero no correctamente ya que yo logre que diera ciclos (4 pasos) y no pasos



Paisano Panza Verde....

Sube lo que lleves, asi no se entiende nada... o da flojera entender lo que prentendes 
(archivo PBP y simulacion en Proteus es mejor)


----------



## reyvilla (Feb 28, 2012)

Hola D@rio te tengo buenas y malas noticias, la buena es que ya me llego el wii motion, la mala es que al abrirlo me consigo con otro circuito, son dos sistemas de gyroscopio analogos, subo la imagen para que la chequees, revise el datasheet y ni se parece, ahora lo que estoy haciendo es tratando de cambiarlo a ver si me envian uno original pero usado, de echo te iba a preguntar si el tuyo era original y si existían varios modelos o es uno solo, para estar mas seguro.


----------



## Dario (Feb 28, 2012)

reyvilla dijo:


> Hola D@rio te tengo buenas y malas noticias, la buena es que ya me llego el wii motion, la mala es que al abrirlo me consigo con otro circuito, son dos sistemas de gyroscopio analogos, subo la imagen para que la chequees, revise el datasheet y ni se parece, ahora lo que estoy haciendo es tratando de cambiarlo a ver si me envian uno original pero usado, de echo te iba a preguntar si el tuyo era original y si existían varios modelos o es uno solo, para estar mas seguro.


hola reyvilla, que pena... bueno, te cuento que el Wiimotion que yo compre, es la version clon y me lo vendieron con el cuento de que era original jeje  yo buscaba que me vendieran uno que tuviese un gyro con salidas analogicas y asi se me hacia mas facil programar el pic, pero no tuve suerte jeje...  bueno, espero que tengas suerte y te lo cambien... 
de todas formas, aqui te dejo el data del ISZ650 http://invensense.com/mems/gyro/isz650.html se ve medio complicado jeje... y el del IDG650 que creo que es igual al 655
http://invensense.com/mems/gyro/idg650.html
y creo que aqui hay un wiimotion parecido al tuyo con los mismos gyros. http://www.rcgroups.com/forums/showpost.php?p=17104873&postcount=566 saludosss y suerte con el cambio


----------



## alejandrozama (Feb 28, 2012)

ya me han dicho bastantes veces que no me se explicar creo que no podre dedicarme a la docencia, ahora si subo los archivos y tratare de explicarme nuevamente.

1.- El puerto B.0 B.1 B.2 B.3  se utilizan para el motor a pasos

2.- El puerto D se utiliza como entrada, los primeros 7 de este puerto son para utilizar un dip swicht y asi poder introducir de manera binaria cuantos pasos debe de dar el motor, el ultimo puerto el D.7 se utiliza para el giro del motor si es 0 el motor girara en sentido contario al reloj y si D.7 es igual a 1 el motor girara en el sentido de las manesillas del reloj.


en la simulacion podran ver que como yo lo relice no es la forma correcta, tengo entendido que la forma correcta seria con el FOR y NEXT y utilizando el comando de desplazamiento >>

pero no se como programar esto.


----------



## reyvilla (Feb 28, 2012)

gracias D@rio, si yo vi las mismas paginas antes, pero no me convence ya que no voy arriesgarme hacer con dos integrados analogicos lo que puedo hacer con uno solo digital...Ya mañana te cuento si pude realizar el cambio...Ahora cuéntame has realizado mas pruebas con el que tu tienes?


----------



## lubeck (Feb 28, 2012)

> en la simulacion podran ver que como yo lo relice no es la forma correcta, tengo entendido que la forma correcta seria con el FOR y NEXT y utilizando el comando de desplazamiento >>


una posibilidad es esta....


```
@ device xt_osc 
define osc 4

x var byte
y var byte
D var Byte
f var byte
trisb=%00000000
trisd=%11111111
  
  portb=%00000000
  portd=%00000000
  
      
INICIO:
 pause 200
 x=PortD-(portd.7*128)
 if (portd.7=0) then ccw
 if (portd.7=1) then cw
goto inicio
end

ccw:
FOR y=1 TO x
 F=1
 For D=0 to 3
  portb=f
  f=F<<1
  pause 200
 Next D
NEXT
portb=0
pause 10000
goto inicio

cw:
FOR y=1 TO x
f=8
for d=0 to 3
 portb=f
 f=f>>1
 pause 200
Next D
NEXT Y
portb=%00000000
pause 10000
goto inicio
```

pero a mi no me gusta ese metodo porque solo es para full step, y si quieres half step pues no se puede con desplazamiento... (creo)

pd.
arriba el Lion...


----------



## Dario (Feb 28, 2012)

reyvilla dijo:


> gracias D@rio, si yo vi las mismas paginas antes, pero no me convence ya que no voy arriesgarme hacer con dos integrados analogicos lo que puedo hacer con uno solo digital...Ya mañana te cuento si pude realizar el cambio...Ahora cuéntame has realizado mas pruebas con el que tu tienes?


ok, suerte entonces... ¿que si he hecho mas pruebas? si que las hice y las estoy haciendo jeje...  lo que me preocupa ahora, son las variaciones que hace el gyro sin siquiera moverlo y como puedo solucionarlo, realmente no entiendo porque lo hace...   ¿viste el adjunto que deje? ahi esta el archivo de texto con los datos que me entrega el sensor. ¿que opinas al respecto?
saludosss


----------



## reyvilla (Feb 28, 2012)

Lo acabo de ver, habria que sacar un promedio recuerda que debido a que es un sensor muy sencible al movimiento puede haber un margen de error, el cual por lo que vi la variación no es mucha, hay que armar un archivo con esos valores y sacar la media y ver cuanto es la variación, de echo logre leer en la hoja de datos que indica algo sobre el error de orientacion con una tabla que llega hasta el 1,75% de error para un 1° grado de movimiento, lo cual debe compensarse a la hora de hacer el código, osea indicando que al establecer el valor de inclinación tenga una aceptabilidad de mas o menos 1, bueno eso es una idea ya en la practica habria que ver como funciona y no creo que sea tanto como para complicar mucho el codigo, voy hacer el archivo en excel y mañana lo subo para que veas de lo que hablo...saludoss...


----------



## alejandrozama (Feb 28, 2012)

pd.
arriba el Lion...





[/QUOTE]

jajajjaajjaj bastante buena la imagen,


la cuestion es que creo no me explique bien, este nuevo programa que me pasaste realiza lo mismo que el que yo utilizaba solo que este con el comando de desplazamiento.

lo que el programa deve de realizar es dar el numero de pasos y con este programa sigue realizando ciclos (4 pasos). por ejemplo si pongo en alta el puerto D.O solo debe de dar un paso, osea solo magnetizaria la bobina A (puerto B.0.)
si pongo en alta los puertos D.0 Y D.1 deveria de dar 3 pasos, (secuencia de bobinas A,B,C) etc.

de antemano gracias por tu paciencia y tratare de formular mejor mis explicaciones en futoros comentarios.


----------



## Dario (Feb 28, 2012)

reyvilla dijo:


> Lo acabo de ver, habria que sacar un promedio recuerda que debido a que es un sensor muy sencible al movimiento puede haber un margen de error, el cual por lo que vi la variación no es mucha, hay que armar un archivo con esos valores y sacar la media y ver cuanto es la variación, de echo logre leer en la hoja de datos que indica algo sobre el error de orientacion con una tabla que llega hasta el 1,75% de error para un 1° grado de movimiento, lo cual debe compensarse a la hora de hacer el código, osea indicando que al establecer el valor de inclinación tenga una aceptabilidad de mas o menos 1, bueno eso es una idea ya en la practica habria que ver como funciona y no creo que sea tanto como para complicar mucho el codigo, voy hacer el archivo en excel y mañana lo subo para que veas de lo que hablo...saludoss...



si, puede ser propio del sensor, eso estava pensando yo. tambien estaba pensando en como compensar el error en el programa del micro, es un poco complicado parami ya que es la primera vez que intento hacer algo con un giroscopio y mas dificil aun, por el hecho de ser i2c, aunque es facil la comunicacion en pbp. saludos amigo y gracias de nuevo.


----------



## lubeck (Feb 28, 2012)

> la cuestion es que creo no me explique bien, este nuevo programa que me pasaste realiza lo mismo que el que yo utilizaba solo que este con el comando de desplazamiento.
> 
> lo que el programa deve de realizar es dar el numero de pasos y con este programa sigue realizando ciclos (4 pasos). por ejemplo si pongo en alta el puerto D.O solo debe de dar un paso, osea solo magnetizaria la bobina A (puerto B.0.)
> si pongo en alta los puertos D.0 Y D.1 deveria de dar 3 pasos, (secuencia de bobinas A,B,C) etc.
> ...



A ver si ya entendi 


```
@ device xt_osc 
define osc 4

x var byte
y var byte
D var Byte
f var byte
trisb=%00000000
trisd=%11111111
  
  portb=%00000000
  portd=%00000000
  
f=1      
INICIO:
 pause 200
 x=PortD-(portd.7*128)
 if (portd.7=0) then Gosub ccw
 if (portd.7=1) then gosub cw
goto inicio
end

ccw:
FOR y=1 TO x
  portb=f
  f=F<<1
  if f>8 then F=1  
  pause 200
NEXT
portb=0
pause 10000
Return

cw:
FOR y=1 TO x
 portb=f
 if f=1 then f=16 
 f=f>>1
 pause 200
NEXT Y
portb=%00000000
pause 10000
Return
```


----------



## alejandrozama (Feb 28, 2012)

haaaaaaa eres un genio, yo estube tratando pero no se parecia nada a este programa que me pasaste.

deja lo estudio un rato para entender la logica que utilizaste

gracias


----------



## WUANEJO (Feb 29, 2012)

Corrijanme si me equivoco pero la función count de pic basic no funciona si no se utiliza un LATCH por ejemplo el 4511, ya que count se detiene a contar y detiene cualquier proceso. la forma mas idonea de contar pulsos y multiplexar display es usando el TIMER0 por desbordameinto bueno si se trabaja con 16f84 y con una variable contar las veces que se ha desbordado.

gracias por sus respuestas.


----------



## judex (Feb 29, 2012)

disculpad, podriais decirme como se puede meter esta formula para calcular la presion con un mpx4115,es que tiene decimales y el pbb no acepta decimaels y no me da correctamente el resultado:
la formula esresion = (( V out / V alimentacion)+ 0.095 ) / 0.009
lo he intentado multiplicando por 100 los numeros con decimal y luego diviendo pero no sale correctamente.
gracias por la ayuda


----------



## alejandrozama (Feb 29, 2012)

oye lubeck si no es mucho abusar de tu ayuda me podrias echar la mano con la ultima practica

trate de hacer lo que tu hiciste, pero eso no resulto.

es muy parecida con la que me ayudaste solo que esta vez con dos motores, osea que son 6 bits para el numero de pasos. 1 bit para seleccionar el motor, *motor 1* portb.0 al b.3  *motor 2* portb.4 al 7. y el otro bit es para seleccionar el sentido del giro del motor.

adjunto la imagen

perdon que sea tan pregunton pero  los de electromecanica solo llevamos una clase de programasion en primer semestre, y aparte ami como que no se me da mucho esto de programar.

de antemano gracias


----------



## D@rkbytes (Feb 29, 2012)

judex dijo:


> disculpad, podriais decirme como se puede meter esta formula para calcular la presion con un mpx4115,es que tiene decimales y el pbb no acepta decimaels y no me da correctamente el resultado:
> la formula esresion = (( V out / V alimentacion)+ 0.095 ) / 0.009
> lo he intentado multiplicando por 100 los numeros con decimal y luego diviendo pero no sale correctamente.
> gracias por la ayuda


Saludos.
Hace un tiempo subí a este foro las librerías para trabajar con _punto flotante en PBP_
Espero te sirvan


----------



## J2C (Feb 29, 2012)

D@rio

He adjuntado a este mensaje dos archivos *.pdf con las tablas de lo que tu has adjuntado en el post #1854, las he separado como "*Tabla Inmovil*" y "*Tabla en Movimiento*" y el numero al final "_31_" es de "_Uso Interno/Versión_" para que me indique en que punto las he impreso. Me he demorado pues me ha entrado trabajo que debía entregar.

En este punto y para conocer mejor la variación con respeto al Orden Anterior deberiamos unir ambos Byte y sacar el bendito "*Complemento a 2*". Si bien tengo claro como obtener el Complemento a 2 de un Byte, no lo tengo totalmente claro en el caso de dos Byte y seguire mirando esas dos tablas.

Salvando la diferencia de 2 a 3 Gyros en un solo encapsulado para realizar algo parecido al video me parece que era mejor el que le han dado a ReyVilla (IDG-655 [http://www.dzsc.com/uploadfile/company/772705/201182123753733.pdf]) por que directamente nos muestra en analógico la posición.



D@rio dijo:


> .....lo que me preocupa ahora, son las variaciones que hace el gyro sin siquiera moverlo y como puedo solucionarlo......


Como dije en mi post #1847:


J2C dijo:


> ...........
> B) Tenemos que pensar que el mismo tiene internamente 3 ADC's de 16bit, 65536 posibles posiciones!!!!!!!!!! dentro de un giro de 360°. O mejor pensando que la información por eje esta en 2 Byte y como Complemento a 2, divago que tengo 360° a la izquierda con 32768 posibles posiciones (una cada 0.010986328125°) y otro tanto hacia la derecha, MUCHISIMA precisión para mi gusto!!!. ..........


Me parece que se debe investigar en esa dirección.





ReyVilla

En la imagen que has adjuntado estan el IDG655 y el ISZ650 que son Sensores Analógicos con 2 y 1 Gyro respectivamente y *casi* complementarios según "• _Complements IDG-650 dual axis (X/Y) gyro, for a solution where all sensors mount in-plane with the rest of the system electronics_" (http://invensense.com/mems/gyro/isz655.html) para tener en una sola plaqueta lo mismo que que con el ITG3205 pero en Analógico.

En definitiva todo depende del uso que le daras y la complejidad del programa a realizar para el µControlador.





Judex



judex dijo:


> ....la formula esresion = ((V out/V alimentacion)+0.095)/0.009......


 
Si bien ya Darkbytes te dio la alternativa *correcta*, aquí te paso otra y para este caso particular:

Presion = (*[*(V out/V alimentacion)**1000]*+95)/9 

por que 0.095 y 0.009 son milesimos y debemos convertir Vout y Valimentacion tambien a milesimos.



Saludos, JuanKa.-


----------



## J2C (Feb 29, 2012)

D@rio

Adjunto a este post un archivo *.pdf de lo que presumo seria el *Complemento a 2* usando los *2 Byte* (*Byte_H* y *Byte_L*) del IGT-3205, no tengo la más minima seguridad que sea correcto, podrian estar ordenados al reves ambos Byte's, etc. . Quedo a la espera de algun comentario.

Para mi es el próximo paso a realizar a continuación de la Tablas en estado Estático y Dinámico del Gyro una vez que estemos seguros de como manejar esto.



Saludos, JuanKa.-

P.D.: Si bien el tema de "Complemento a 2" permite habilitar/agregar un thread, creo correcto haberlo colocado junto con el trabajo que estan llevando a cabo del Gyro IGT-3205.-


----------



## TiTaNB009 (Mar 4, 2012)

Que tal bandiita

bueno ps aqui molestando con una ayuda que por favor me puedan auxiliar.Primero este programa que les pongo lo vi en un libro, y de ahi me lo copie y lo modifique a mi gusto.

Lo que quiero es que se apague el cto cuando mantenga presionado el boton en pin 4 digamos que lo mantenga presionado durante 3seg y se apague.

La otra opcion es si me pueden decir si puedo reducirlo lo mas que se pueda, esto mas que nada es para aprenda mas comandos.

Ok.. espero sus respuestas y ojala no suene muy exigente y si fue asi no es mi intension......Saludos




> INCLUDE "modedefs.bas"
> 
> @ device pic12F683, FCMEN_OFF
> @ device pic12F683, IESO_OFF
> ...


----------



## reyvilla (Mar 5, 2012)

Hola TiTaNB009, lo de los 3 segundos lo puedes hacer con una variable tipo contador y while, algo asi:

trampa: ; etiqueta para salto llamada ciclo
while pulsador = 0 and variablecount <= 3
variablecount = variablecount + 1
PAUSE 1000
goto trampa ;si pulsador sigue presionado salte a trampa
wend
return ;casco contrario retorne a la linea donde se quedo
end

Bueno habría que probarlo y depurarlo pero mas o menos es una idea de como se podría hacer saludos


----------



## TiTaNB009 (Mar 7, 2012)

ok.. reyvilla, voy a checarlo luego comento.......


----------



## alejandrozama (Mar 8, 2012)

hola que tal, pues yo nuevamente solicitando su ayuda, debo de realizar un contador de 0 a 99 don display de 7 segmentos he visto varios ejemplos aqui en el foro y un libro, la cuestion es que el profe quiere especificamente un diseño el cual 7 pines del puerto van directo al display y el ultimo pin se conecta a dos transistores uno pnp y otro npn, esto para con 1 solo pin controlor los dos comunes de los displays


la verdad no tengo idea de como realizar eso, si alguien me pudiera ayudar se los agradeceria mucho, adjunto la imagen para que me entiendan mejor


----------



## reyvilla (Mar 8, 2012)

Hola alejandrozama, es mas fácil de lo que parece, si vas a utilizar los 7 pines del puerto, y conociendo el pinaje del 7 segmentos lo que tendrías que hacer es codificar, osea lo mismo que hace el 7447 o el 7448, pero con los 7 pines del pic directos, como veo ya tienes el diagrama es catodo comun, lo que significa que debes enviar unos para activar cada segmento y con el arreglo de transistores siempre va estar activado uno o el otro y es cuestión de ir turnandolos mientras vas activando los segmentos, ejemplo para mostrar 01, digamos que a primera instancia siempre esta habilitado el primer display con el arreglo de transistores, entonces envías para que se vea un cero, activas los segmentos a,b,c,d,e y f 
y eso lo haces enviando por el puerto b, %001111111, y allí ya tendrías en el primer display un 0, para el segundo habilitas el otro display y activas los segmentos b y c seria así: %10000110, si tienes una simulación y un código ya empezado es mucho mejor para poder ayudarte...saludoss


----------



## D@rkbytes (Mar 9, 2012)

Saludos.
El amigo mecatrodatos subio un ejemplo el 16 de julio del 2009 en este mismo curso de pbp
sobre como hacer un _contador de 0 a 99 con displays de 7 segmentos._ 
Con algunas modificaciones se puede hacer trabajar para cátodo común, y solo una línea de control.


----------



## alejandrozama (Mar 10, 2012)

consegui un programa de un libro, este este es un contador de 0-99 ya lo probe y funciona muy bien solo que este diseño utiliza 2 pines para el control del comun de cada display (estoy utilizando de anodo comun), la simulacion se ve como parpadeando pero como dije en fisico funciona bien.

he tratado de hacer el areglo para solo utilizar un purto para el control de los comunes, la cuestion es que soy uan persona que se confunde con facilidad y se me pierde el hilo de lo que estoy haciendo 30 min despues vuelvo a donde empeze jajajja este es algo desesperante alguien me podria ayudar a como seria el areglo???


```
@ device xt_osc 
define osc 4
Cnt VAR Byte 
Digit VAR Byte
Pattern VAR Byte 
Digit1 VAR PORTA.0
Digit2 VAR PORTA.1
First VAR Byte 
Second VAR Byte 
i VAR Word 

CMCON=7
TRISA=0 
TRISB=0

INTCON=%00100000
OPTION_REG=%00000111
TMR0=217
ON INTERRUPT GOTO ISR
INTCON=%10100000

LOOP:
Cnt=0

NXT:
Digit=Cnt DIG 1 
GOSUB CONVERT 
First=Pattern 
Digit=Cnt DIG 0 
GOSUB CONVERT 
Second=Pattern 
FOR i=1 to 500
Pause 1 
NEXT i
Cnt=Cnt + 1
IF Cnt>99 THEN LOOP
GOTO NXT 

DISABLE
ISR:
TMR0=216
PORTB=First
Digit2=0
Digit1=1
PAUSE 5

Digit1=0
PORTB=Second
Digit2=1
PAUSE 1
INTCON.2=0 
RESUME 
ENABLE 
CONVERT:

LOOKUP Digit,[$3F, $06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F],Pattern
Pattern=Pattern^$FF 
RETURN
END
```


----------



## D@rkbytes (Mar 10, 2012)

alejandrozama dijo:


> consegui un programa de un libro, este este es un contador de 0-99 ya lo probe y funciona muy bien solo que este diseño utiliza 2 pines para el control del comun de cada display (estoy utilizando de anodo comun), la simulacion se ve como parpadeando pero como dije en fisico funciona bien.
> 
> he tratado de hacer el areglo para solo utilizar un purto para el control de los comunes, la cuestion es que soy uan persona que se confunde con facilidad y se me pierde el hilo de lo que estoy haciendo 30 min despues vuelvo a donde empeze jajajja este es algo desesperante alguien me podria ayudar a como seria el areglo???


Saludos.
Revisa estas modificaciones que realice al código, quedaron como comentadas.
Estos cambios involucran también el cambio de PIC por un 16F84A
ya que use el código del link que cite anteriormente y al parecer es el mismo que subes.
solo que el que cite tiene unos cambios para incremento manual.
Las modificaciones son para cátodo común y una sola línea de control para los dos TR's.
Las simulaciones funcionan bien, pero no probé el circuito en la realidad.


----------



## ferdy575 (Mar 11, 2012)

Hola a todos, de nuevo por aqui molestandoles estoy algo desocupado y se me ocurrio hacer una herramienta multiple para mi banco de trabajo se trata de un circuito que me sirva para contar eventos para voltimetro y frecuencimetro pero no logro hacer que el pic me cuente los pulsos de un pulsador por ejemplo aqui subo el ejemplo a ver sí me pueden ayudar aver que me estara haciendo falta en mi programa de antemano gracias


----------



## D@rkbytes (Mar 11, 2012)

ferdy575 dijo:


> Hola a todos, de nuevo por aqui molestandoles estoy algo desocupado y se me ocurrio hacer una herramienta multiple para mi banco de trabajo se trata de un circuito que me sirva para contar eventos para voltimetro y tacometro pero no logro hacer que el pic me cuente los pulsos de un pulsador por ejemplo aqui subo el ejemplo a ver sí me pueden ayudar aver que me estara haciendo falta en mi programa de antemano gracias


Me parece que se te olvido adjuntar el código pss:


----------



## ferdy575 (Mar 12, 2012)

Darkbytes dijo:


> Me parece que se te olvido adjuntar el código pss:


si tienenes razón gracias



Hola a todos, de nuevo por aqui molestandoles estoy algo desocupado y se me ocurrio hacer una herramienta multiple para mi banco de trabajo se trata de un circuito que me sirva para contar eventos para voltimetro y frecuencimetro pero no logro hacer que el pic me cuente los pulsos de un pulsador por ejemplo, adicionalmente me esta presentando errores al medir frecuencias inferiores a 50 Hz:enfadado:, no importa sí tengo que usar otro pic como por ejemplo un 877a, aqui subo el ejemplo a ver sí me pueden ayudar aver que me estara haciendo falta en mi programa de antemano gracias


----------



## D@rkbytes (Mar 12, 2012)

ferdy575 dijo:


> Hola a todos, de nuevo por aqui molestandoles estoy algo desocupado y se me ocurrio hacer una herramienta multiple para mi banco de trabajo se trata de un circuito que me sirva para contar eventos para voltimetro y frecuencimetro pero no logro hacer que el pic me cuente los pulsos de un pulsador por ejemplo, adicionalmente me esta presentando errores al medir frecuencias inferiores a 50 Hz:enfadado:, no importa sí tengo que usar otro pic como por ejemplo un 877a, aqui subo el ejemplo a ver sí me pueden ayudar aver que me estara haciendo falta en mi programa de antemano gracias


Saludos.
Revisa los cambios que realice a tu programa.
Para la función de voltimetro si necesitas cambiar de PIC
Suerte y hasta luego.


----------



## alejandrozama (Mar 12, 2012)

Darkbytes dijo:


> Saludos.
> Revisa estas modificaciones que realice al código, quedaron como comentadas.



estube algo ocupado el fin de samana ya arme el circuito y fucniona a la perfeccion, por como pude ver eres vastante rapido programando, muchas gracias y creo me seguiran viendo por el foro, ya que aparte de mis practicas he tenido en mente varios proyectos personales, como que las pics son adictivas.

saludos


----------



## reyvilla (Mar 12, 2012)

Hola interesante código del contador, nunca había utilizado la instrucción DIG ahora se su significado muy bueno el dato, hice un pequeño cambio al código y me gustaría saber si esta correcto ya que funciona igual solo que no uso interrupciones coloco el código modificado:


```
REM PIC16F84A
@ DEVICE XT_OSC,PROTECT_OFF,WDT_OFF,PWRT_ON
;*******************************************************************************
DEFINE OSC 4				; Oscilador Configurado a 4Mhz.
TRISA = $FE					; %11111110	7,E 6,E 5,E 4,E 3,E 2,E 1,E 0,S
TRISB = $80					; %10000000	7,E 6,S 5,S 4,S 3,S 2,S 1,S 0,S
;*******************************************************************************

;DEFINICION DE VARIABLES

Cnt VAR Byte 
Digit VAR Byte 
Pattern VAR Byte 
Digit1 VAR PORTA.0 
Pbutton VAR PORTB.7 
i VAR Byte 

Cnt = 0 

LOOP1:
BUTTON Pbutton, 0,255,0, i, 0, MUESTRA
Cnt = Cnt + 1

MUESTRA:
Digit = Cnt DIG 1
LOOKUP Digit, [$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Pattern
PORTB = Pattern
Digit1 = 1
Pause 10 

Digit = Cnt DIG 0
LOOKUP Digit, [$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Pattern
Digit1 = 0  
PORTB = Pattern
PAUSE 10 
CALL LOOP1
GOTO MUESTRA
END
```

cualquier cosa me avisan saludosss


----------



## D@rkbytes (Mar 13, 2012)

alejandrozama dijo:


> estube algo ocupado el fin de samana ya arme el circuito y fucniona a la perfeccion, por como pude ver eres vastante rapido programando, muchas gracias y creo me seguiran viendo por el foro, ya que aparte de mis practicas he tenido en mente varios proyectos personales, como que las pics son adictivas.
> 
> saludos



Saludos alejandrozama
Que bien que te funciono el código. Ya que en el simulador no funciona si se pone el TR PNP
Por ese motivo use el inversor.
Y si, si son adictivos los PIC. También el Proteus 



reyvilla dijo:


> Hola interesante código del contador, nunca había  utilizado la instrucción DIG ahora se su significado muy bueno el dato,  hice un pequeño cambio al código y me gustaría saber si esta correcto  ya que funciona igual solo que no uso interrupciones coloco el código  modificado:
> cualquier cosa me avisan saludosss


Saludos reyvilla
Ok. Si esta correcto el codigo sin usar interrupciones (Yo tampoco las creí necesarias)
Solo hay un detalle.  Hay que cambiar el CALL por un GOTO
Ya que se produce un Stack Overflow
Y suprimir el GOTO MUESTRA
De ahí en fuera todo funciona muy bien 
Me gustaria armar el circuito con los 2 TR's para ver como se ve en la realidad 
Pero solo tengo displays de 7 segmentos sueltos, y me da fiaca hacer las conexiones 

Adjunto el proyecto con los cambios y su simulación

Suerte y hasta luego.


----------



## ferdy575 (Mar 13, 2012)

Darkbytes dijo:


> Saludos.
> Revisa los cambios que realice a tu programa.
> Para la función de voltimetro si necesitas cambiar de PIC
> Suerte y hasta luego.


 
hola Darkbytes gracias por tu ayuda ahora ya no tiene problema el frecuencimetro pero no se como hacer para la función "contar" aquí necesito una función parecida a la que postearon los compañeros y tú del contador de 0 a 99 donde se cuentan las veces que se oprime el pulsador pues lo que busco es poder contar por ejemplo cuantos pulsos pasaron en un tren de pulsos en una determinada unidad de tiempo sin importar a que frecuencia entren.
Por favor ayudame me doy cuenta de que sabes muchisimo sobre este tema, y muchas gracias por tu tiempo, subo nuevamente el proyecto para que lo veas, ya esta compilada la reforma que le hiciste a mi código y le hice también algunas buscando que me funcione la función "contar" pero no lo he podido lograr.


----------



## D@rkbytes (Mar 13, 2012)

ferdy575 dijo:


> hola Darkbytes gracias por tu ayuda ahora ya no tiene problema el frecuencimetro pero no se como hacer para la función "contar" aquí necesito una función parecida a la que postearon los compañeros y tú del contador de 0 a 99 donde se cuentan las veces que se oprime el pulsador pues lo que busco es poder contar por ejemplo cuantos pulsos pasaron en un tren de pulsos en una determinada unidad de tiempo sin importar a que frecuencia entren.
> Por favor ayudame me doy cuenta de que sabes muchisimo sobre este tema, y muchas gracias por tu tiempo, subo nuevamente el proyecto para que lo veas, ya esta compilada la reforma que le hiciste a mi código y le hice también algunas buscando que me funcione la función "contar" pero no lo he podido lograr.


Ok. Saludos.
A mi punto de vista lo que quieres es lo mismo que la función de frecuencimetro.
Ya que la función COUNT es lo que hace, contar pulsos en un determinado periodo de tiempo. 
Lo único que cambiaria seria el periodo y la forma de representar la cuenta en el display.
Adjunto los cambios que realice para esto.
Suerte y hasta luego.


----------



## Dario (Mar 14, 2012)

hola amigos.
les cuento que todavia sigo luchando con el sensor itg3205 y he logrado mostrar la informacion del mismo en un display 7seg.X4 digitos y aqui subo el video. en el video puede verse claramente como marca la velocidad angular al ser movido hacia la izquierda. cambie la variable byte por una variable word y resulto que el numero que debia mostrar era mucho mayor al que yo calcule ya que al tener un convertidor analogico digital interno de 8 bits teoricamente el numero no debia pasar de 255, pero estaba equivocado, el numero era 65480 para el eje X_H jeje... en elprograma que escribi divido ese valor por 10 con lo que me da 6548 y asi lo puedo sacar en el display. en el video hago una prueba al eje Z_H, aqui lo dejo para que vean, saludosss. ah, aqui dejo el codigo tambien 


```
@ DEVICE MCLR_OFF,HS_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
DEFINE   OSC   20                     'Para trabajar con un cristal de 20MHz
DEFINE I2C_HOLD 1
define I2C_SLOW 0                    'Velocidad de I2C de 400KHz
cmcon=7
trisa=0                              'puertos como salidas
trisb=0
porta=0 
portb=0
SDA VAR PORTA.1                      'entrada y salida de datos
SCL VAR PORTA.2                      'reloj 
numero var word
unid var byte
dece var byte
cent var byte
mile var byte
 
i2cwrite sda,scl,%11010000,62,[$80]  'resetear el ITG a 0
pause 10
i2cwrite sda,scl,%11010000,21,[$09]  'configuro SAMPLE RATE
pause 10
i2cwrite sda,scl,%11010000,22,[$18]  'registro 22 full scale a ±2000°/sec                                     'Modificado según ReyVilla 
pause 10
i2cwrite sda,scl,%11010000,23,[$00]  'sin interrupcion
pause 10
numero=0
leer:
  I2CREAD sda,scl,%11010000,33,[numero]    'leer eje Xout-H y guardar en a1
  pause 5
  numero=numero/10
  gosub display
goto leer

display:
  unid=numero dig 0
  dece=numero dig 1
  cent=numero dig 2
  mile=numero dig 3
  portb=224+mile
  pause 4
  portb=208+cent
  pause 4
  portb=176+dece
  pause 4
  portb=112+unid
  pause 4
  return
```


----------



## alejandrozama (Mar 14, 2012)

hola que tal, pues yo nuevamente por aqui lo cuestion es que hay una practica donde devo de utilizar la interrupcion externa. 

la cuestion es que solo he visto 2 ejemplos en internet y no logro que el programa haga lo que quiero. como que hay algo que no entiendo

lo que el programa debe de realizar es lo siguiente, se devera estar ejecutando un programa principal (por ejemplo un corrimiento de luces en cualquier puerto pic16f877a) y cuando se presione un boton de b.0 entonces se encendera a.0 y este dato se rotara de a.0-a.3 por cada pulsacion del boton. 

como siempre creo que no me explique, bueno la cuestion es que solo necesito algo de ayuda para hacer uncionar algo parecido ya que ahora no logro que funcione nada

explicacion de la practica textual
"Armar el circuito y realizar el programa que utilice la interrupción externa (RB0/INT) del PIC. Cuando suceda la interrupción hacer rotar el dato 01H del puerto A y así por cada interrupción que suceda, hacer rotar el dato del puerto A.
La rotación a la izquierda contrólela para que sea del Bit 0 al Bit 3"


```
@ device xt_osc 
define osc 4

x var byte



trisb=%00000001

trisa=%000000
porta=%000000


INTCON=%10100000
on interrupt goto pulsador


inicio:
portb=%00000010
pause 200
portb=%00000100
pause 200
portb=%00001000
pause 200
portb=%00010000
pause 200
portb=%00100000
pause 200
portb=%01000000
pause 200
portb=%10000000
pause 200
goto inicio
end

disable 
pulsador:
if x=8 then x=1
x=1
porta=x
pause 200
if (portb.0=1) then x=x*2
resume
enable
```


no se burlen de mi codigo. dejo la imagen


----------



## J2C (Mar 14, 2012)

Dario

FELICITACIONES por el *GRAN AVANCE* (lindo dato encontre en la página del Cuadricoptero  , que me pasaste por MP).

Para completar lo que has avanzado, seria interesante ver que pasa cuando realizas los mismos movimientos que hiciste en tu video 




desde el eje central pero hacia la derecha para ver como es la variación hacia el otro sentido.

Al ver ese video desde Yotube vi algunas cosas mas que aqui te pongo para que veas como interpretan el movimiento hacia ambos lados, con numeros positivos y negativos:

A: Muestra de la plaqueta que probaran en "B".




 
B: Prueba de la plaqueta de "A"




 
Use para la busqueda en Youtube "ITG3205" y aparecen mas videos, me centre en esos dos que dan una idea a lo que buscabas.



Saludos, JuanKa.-


----------



## atricio (Mar 14, 2012)

eso esta de lujo una bestia para aplicaciones de movimiento


----------



## Dario (Mar 15, 2012)

amigo juanka gracias por tu comentario, te cuento que trate de hacer la prueba leyendo el eje Z_L pero no tube buenos resultados ya que el numero entregado no se queda fijo, es como si estuviese moviendose. estoy buscando la forma de leerlo sin que presente este inconveniente... el programa de calibracion o configuracion que esta en el video lo tengo pero no se bien como se usa ni como se conecta a la placa. por ahora sigo investigando, apenas tenga mas novedades las posteo. gracias a todos, saludosss


----------



## J2C (Mar 15, 2012)

D@rio



D@rio dijo:


> ..... el programa de calibracion o configuracion que esta en el video lo tengo pero no se bien como se usa ni como se conecta a la placa. .....


El link al programa de calibración lo puse solo para hacer notar los valores que toma el Gyro, en la imagen que adjunto a este post esta marcado como "*Zona1*". Y esos valores son totalmente distintos a lo que veo que tienes en tu video. Por eso te reitero el pedido de los valores girandolo hacia la derecha como indico a continuación.





D@rio dijo:


> ..... te cuento que trate de hacer la prueba leyendo el eje Z_L pero no tube buenos resultados ya que el numero entregado no se queda fijo, es como si estuviese moviendose. estoy buscando la forma de leerlo sin que presente este inconveniente .....


No me molesta que se mueva un poco más de lo que se mueve ahora como cuando lo tenes fijo o lo moves hacia la izquierda. Me interesa conocer entre que valores oscila con el movimiento como en el video que has hecho. 
No es necesario un video ya que si comentas para el equivalente del movimiento hacia la izquierda entre que valores varia cuando lo haces hacia la derecha a mi me da la información que ando buscando.




Personalmente para conocer el funcionamiento del Gyro no me molestan las oscilaciones de los valores como te comentado varias veces. Eso no quita que una vez que se sepa como funciona bien el Gyro y tu continues con el desarrollo de tu proyecto se les deba prestar mucha atención y hasta realizar promedios como en la página del Cuadricoptero.

En mi opinión nos cuesta (y me incluyo) conocer "con exactitud" (a ciencia cierta) que es esa info que nos entrega el Gyro, creo que sin eso no es posible avanzar en la programación de un µControlador para diseñar una aplicación determinada o proyecto que tu desees. 




Saludos, JuanKa.-


----------



## TiTaNB009 (Mar 15, 2012)

Que tal, yo de nuevo 

ya probe el codigo que me paso el compañero reyvilla .. y no no me funciona o por lo menos no hace lo que quiero.... mmm alguna otra sugerenciaa porfa.


----------



## Dario (Mar 16, 2012)

bueno, aca subo un video girando el itg hacia la derecha usando como eje mi nueva silla de computadora usada jeje...  tambien dejo el esquematico y el codigo que estoy utilizando para leer el eje Z_L que por cierto no me da el mismo resultado que la lectura del eje Z_H, solo da un numero muy confuzo. saludosss (ah, por cierto, el micro funciona con un cristal de 20MHZ)
esquematico:

codigo:

```
@ DEVICE MCLR_OFF,HS_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
DEFINE   OSC   20                     'Para trabajar con un cristal de 20MHz
DEFINE I2C_HOLD 1
define I2C_SLOW 0                    'Velocidad de I2C de 400KHz
cmcon=7
trisa=0                              'puertos como salidas
trisb=0
porta=0 
portb=0
SDA VAR PORTA.1                      'entrada y salida de datos
SCL VAR PORTA.2                      'reloj 
numero var word
numero2 var word
unid var byte
dece var byte
cent var byte
mile var byte
 
i2cwrite sda,scl,%11010000,62,[$80]  'resetear el ITG a 0
pause 10
i2cwrite sda,scl,%11010000,21,[$09]  'configuro SAMPLE RATE
pause 10
i2cwrite sda,scl,%11010000,22,[$1A]  'registro 22 full scale a ±2000°/sec 
pause 10
numero=0
leer:
  I2CREAD sda,scl,%11010000,33,[numero]    'leer eje Xout-H y guardar en a1
  pause 4
  I2CREAD sda,scl,%11010000,34,[numero2]    'leer eje Xout-H y guardar en a1
  pause 4
  numero2=numero2/10
  gosub display
goto leer

display:
  unid=numero2 dig 0
  dece=numero2 dig 1
  cent=numero2 dig 2
  mile=numero2 dig 3
  portb=224+mile
  pause 4
  portb=208+cent
  pause 4
  portb=176+dece
  pause 4
  portb=112+unid
  pause 4
  return
```

y video:


----------



## reyvilla (Mar 16, 2012)

Hola dario creo que habria que trabajar manteniendo el ultimo dato de velocidad estatico con una variacion aceptable del 1°, con esto deberías de tener cual fue la velocidad del un punto a otro sin variar al llegar al punto final, si la calibracion es de escaneo es de una muestra cada 8ms, sabiendo esto puedes colocar una condición que si el nuevo valor esta 1 por encima o 1 por debajo no cambiar el valor del eje a mostrar, recordando que ese valor es la velocidad angular, si se pudiera mantener una velocidad lineal el valor se mantendría, pero como eso es mas complicado lo mejor es mantener el ultimo valor leído con un rango de +/- para que no cambie a menos que sea halla movido.


----------



## 313FaKe (Mar 17, 2012)

PodriaN pasarme el diagrama del ciruito para poder probar el archivo de "Ejemplos USB 18F4550"
Para armarlo fisicamente ..apenas me estoy iniciando ..un saludo y que grandes son jeje


----------



## J2C (Mar 18, 2012)

D@rio

Aqui te adjunto el esquemático incluyendo el "*Led de Signo*" que nos permitira saber cuando lo giras hacia la derecha solo encendiendo el led pero significando el "*-*". Es importante que lo conectes en el pin *#2 = RA3* del µControlador.


Después de prepararlo y mientras editaba este post me di cuenta de dos cosas:

1) No conecte el pin *#4/MCLR.VPP* del µControlador a Vdd
2) También se podria haber usado los Puntos Decimales de los Display's, como no estaban en la imagen que subiste en el post *#1898* me olvide pero supongo que esta conectado como corresponde. 

Ahora me dedico a realizar los cambios en el programa del PBP para enviartelo y que controles que compila BIEN al menos, si no es lo esperado lo conversamos.



Saludos, JuanKa.-


----------



## Dario (Mar 18, 2012)

ok, el circuito asi de pasada se ve bien. amigo: muchas gracias por la ayuda, un cordial saludo.


----------



## Dario (Mar 18, 2012)

amigo J2C: acabo de probar el codigo que me enviaste y el resultado es este:




que opinas?


----------



## Dario (Mar 19, 2012)

bien, aqui la prueba en video del codigo modificado por el amigo juanka con resultados exelentes ya que va desde 0000 para arriva y desde 0000 para abajo con indicacion de - (menos). al fin estamos logrando domar a este giroscopio de... 






 tambien dejo el codigo que al final quedo asi:

```
@ DEVICE MCLR_OFF, HS_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF 
DEFINE   OSC   20                    'Para trabajar con un cristal de 20MHz
DEFINE I2C_HOLD 1 
define I2C_SLOW 0                    'Velocidad de I2C de 400KHz 
cmcon=7 
trisa=0                              'puertos como salidas 
trisb=0                              'puertos como salidas 
porta=0 
portb=0 
SDA VAR PORTA.1                      'entrada y salida de datos 
SCL VAR PORTA.2                      'reloj 
numero var word 
unid var byte 
dece var byte 
cent var byte 
mile var byte 
numero2 var word 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#   'agrego variable de bit para signo 
sign var PORTA.3                     'RA3 = Port.A.3 = pin2 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=# 
 
i2cwrite sda,scl,%11010000,62,[$80]  'resetear el ITG a 0 
pause 10 
i2cwrite sda,scl,%11010000,21,[$09]  'configuro SAMPLE RATE 
pause 10 
i2cwrite sda,scl,%11010000,22,[$1A]  'registro 22 full scale a ±2000°/sec 
                                     'Modificado según ReyVilla 
pause 10 
i2cwrite sda,scl,%11010000,23,[$00]  'sin interrupción 
pause 10 
numero=0 
numero2=0 
leer: 
  I2CREAD sda,scl,%11010000,33,[numero]    'leer eje Xout-H y guardar en numero 
  pause 5 
 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#   'primero detecto el signo 
gosub giro                               '+ ó - 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#   'luego acomodo a solo 4 digitos 
numero=numero/10                         '0 a 3276 ; porque ahora sera 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#   'entre +32768 , 0 , -32768 
 
  gosub display 
goto leer 
 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#         'enciendo el signo y acomodo el Comp. a 2 
giro: 
  sign=1                             'lo coloco apagado por defecto 
  if numero > 32768 then             'verifico si gira a Derecha ó Izquierda 
  sign=0                             'lo enciendo por que es giro a la Derecha 
'#=#=#=#=#=#=#=#=#=#=#=# Rutina en elaboracion #=#=#=#=#=#=#=#=#=#=#=#=#=#=# 
  numero = 65535 - numero    'Realizo el calculo y acomodo a los limites   # 
  pauseus 10                 'de las variables el "Complemento a 2"        #
  'numero = 32767 - numero    'con una pausa de 10uSeg.                     # 
'#=#=#=#=#=#=#=#=#=#=#=# Rutina en elaboracion #=#=#=#=#=#=#=#=#=#=#=#=#=#=# 
  else 
  sign=1                             'lo mantengo apagado por giro a Izquierda 
  endif 
  return 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#
 
display: 
  unid=numero dig 0 
  dece=numero dig 1 
  cent=numero dig 2 
  mile=numero dig 3 
  portb=224 + mile 
  pause 4 
  portb=208 + cent 
  pause 4 
  portb=176 + dece 
  pause 4 
  portb=112 + unid 
  pause 4 
  return
```


----------



## torres.electronico (Mar 23, 2012)

Buenas; Como les va a todos? Consulta; Por casualidad alguien trabajo con el protocolo x.25?
Hay CI especificos para codificar y decodificar con salida  y entrada serial, pero queria saber si alguien trabajo con este protocolo en PIC basic para ver si puedo realizar un enlace de mayor distancia implementado un par de handies y un hardware relativamente sencillo...

Saludos


----------



## peep387 (Mar 23, 2012)

el 7447 no dispone del sinvolo menos??


----------



## manikuy (Mar 26, 2012)

Heyy muchas gracias a mecatrodatos por este post etoy seguro que es de mucha utilidad para muchos......principalmente porque esta en lenguaje ipo microcode =) saludos


----------



## torres.electronico (Mar 28, 2012)

torres.electronico dijo:


> Buenas; Como les va a todos? Consulta; Por casualidad alguien trabajo con el protocolo x.25?
> Hay CI especificos para codificar y decodificar con salida  y entrada serial, pero queria saber si alguien trabajo con este protocolo en PIC basic para ver si puedo realizar un enlace de mayor distancia implementado un par de handies y un hardware relativamente sencillo...
> 
> Saludos



Correccion... en vez de X.25, queria decir AX.25; En definitiva, son muy similares; en fin.
Este protoclo lo que hace basicamente es codificar los datos e insertarlos en una protadora de RF (imagen de ejemplo extraidas de google). Mas info al respecto click aca




​
Para el caso de transmision VHF, la modulación AFSK en FM, contiene tonos Bell 202 (1200/200 Hz)con una velocidad de 1200 baudios; Suficientes para mandar solo unos pocos bytes.

En la pagina de PicBasic, hacen referencia a este ejemplo:

principal: 
  si serial_pin = 1, entonces 
  freqout 1,1,2200 
  más 
  freqout 1,1,1200 
  endif 
  Ir a principal

Pero no me basta para entender y o tomar como ejemplo. Osea, no se como encarar la transformacion del dato a frecuencia, y luego, en el otro microcontrolador, decodificarlo...
Podria armar una tabla y los micros y despues comparar; pero los handies, se corren de banda segun la intensidad de la transmision... osea, si alguien tiene un frecuencimetro, podra notar que al modular la voz humana a un nivel, notara que esta transmitiendo a determinada frecuncia... cuando grita, podran notar que hay un corrimiento, lo cual me lleva a pesar que tendria que dar un margen de frecuencias relativamente ancho y jugar con la ganancia del volumen en el receptor....
Los CI especificos en el caso de que no lo pueda hacer en pbp, son los xr2006... estoy modulan y demodulan dandote una salida serial directamente... Como no los consigo, quizas alguien me pueda orientar o dar una mano de como arrancarlos en basic; Saludos


----------



## J2C (Mar 28, 2012)

D@rio 

Mirando una traducción de la ayuda del PBP en http://www.todopic.com.ar/pbp_sp.html encontre una función de "Valor Absoluto" que es perfecta para el programa de lectura del Gyro, te adjunto la sección de la sub rutina *giro*:


```
'#=#=#=#=#=#=#=#=#=#=#=#=#=# 'enciendo el signo y acomodo el Comp. a 2 
giro: 
  sign=1                     'lo coloco apagado por defecto 
  if numero > 32768 then     'verifico si gira a Derecha ó Izquierda 
  sign=0                     'lo enciendo por que es giro a la Derecha 
'#=#=#=#=#=#=#=#=#=#=#=# Rutina en elaboracion #=#=#=#=#=#=#=#=#=#=#=#=#=#=# 
  [B][COLOR=red]numero = ABS numero[/COLOR][/B]        'Realizo el calculo y acomodo a los limites   # 
  pauseus 10                 'de las variables el "Complemento a 2"        # 
  'numero = 32767 - numero   'con una pausa de 10uSeg.                     # 
'#=#=#=#=#=#=#=#=#=#=#=# Rutina en elaboracion #=#=#=#=#=#=#=#=#=#=#=#=#=#=# 
  else 
  sign=1                     'lo mantengo apagado por giro a Izquierda 
  endif 
  return 
'#=#=#=#=#=#=#=#=#=#=#=#=#=#
```
 
No he quitado la resta _'numero = 32767 - numero_ dado que no se aun si altera algo por no haber podido probar la función ABS (Absoluto). La información en la página de MeLabs (http://melabs.com/resources/pbpmanual/4_0.htm#4174) pareciera indicarme ser lo que se necesitaba y puede ser que hasta se podrian quitar algunas líneas de código, sera cuestión de realizar pruebas. 



Saludos Serranos, JuanKa.-


----------



## ricbevi (Mar 28, 2012)

torres.electronico dijo:


> Correccion... en vez de X.25, queria decir AX.25; En definitiva, son muy similares; en fin.
> Este protoclo lo que hace basicamente es codificar los datos e insertarlos en una protadora de RF (imagen de ejemplo extraidas de google). Mas info al respecto click aca
> 
> 
> ...



Hola... con la los integrados tipo TCM3105 o MX614 puedes hacer un módem de 1200bps Bell 202. Busca informacion de MODEM Baycom en Google que esta plagado ya que es el utilizado por los radioaficionados para hacer Paket Radio.
También con el par XR2206 y XR2211 puedes hacer un modem pero me parece que ya nada de eso se consigue.
Básicamente tienes que emitir un tono de 1200 y otro de 2200Hz para la marca y el espacio respectivamente y decodificarlo del otro lado es lo mas complicado y no creo que en Basic te de la velocidad como para hacerlo sobre todo el RX.
Hace muchos años había unos módem  comerciales en base al PIC16F84A pero no estaba disponible el software.

Saludos.

Ric.


----------



## J2C (Mar 28, 2012)

Torres.Electronico


torres.electronico dijo:


> ..... Para el caso de transmision VHF, la modulación AFSK en FM, .....


La modulación AFSK es una variante de la FSK (Frequency Shift Keying) dentro del espectro de frecuencias de audio en las transmisiones de radio. Hace años (1975/1980) cuando para la transmisión a larga distancia se usaban medios analógicos (Multiplex FDM y RadioEnlaces Analógicos) era usada para establecer comunicaciones digitales a tráves de líneas teléfonicas. Consiste en definir una frecuencia para transmitir los 0's y otra para los 1's, en el caso de una velocidad de 1200 Baud's usa 1200 Hz para el 1 y 2200 Hz para el 0 (según http://en.wikipedia.org/wiki/Bell_202).






torres.electronico dijo:


> ..... pero los handies, se corren de banda segun la intensidad de la transmision... osea, si alguien tiene un frecuencimetro, podra notar que al modular la voz humana a un nivel, notara que esta transmitiendo a determinada frecuncia... cuando grita, podran notar que hay un corrimiento, lo cual me lleva a pesar que tendria que dar un margen de frecuencias relativamente ancho y jugar con la ganancia del volumen en el receptor .....


La transmisión en las bandas de VHF suele ser siempre en FM (Modulación de Frecuencia [FM] ó Modulación de Fase[PM]) y a potencia de emisión constante.
Y *NO varia la frecuencia* ante cambios de si se grita o no, es solo la impresión del oyente en el otro extremo o la variación del tono de voz en frecuencia de quien grita.
Hilando fino y si ambos equipos estan bien ajustados se puede decir que la frecuencia que emito es la que recibo, es el medio de transmisión por radio con mayor fidelidad y lamentablemente ocupa el mayor ancho de banda de todas las modulaciones (AM, BLU, FM).






torres.electronico dijo:


> ..... Los CI especificos en el caso de que no lo pueda hacer en pbp, son los xr2006... estoy modulan y demodulan dandote una salida serial directamente... Como no los consigo, quizas alguien me pueda orientar o dar una mano de como arrancarlos en basic; Saludos


Imagino que te refieres al los CI XR2206 ó XR2207 ó XR2209 de EXAR, que realmente cuesta bastante conseguirlos y son mas bien usados para realizar "Generadores de Funciones". 




Se puede hacer de dos maneras distintas con PIC's de gama media:
*a-)* Con un PIC que maneje las señales digitales y las entregue a un Oscilador de Audio que dependiendo de la señal 1 ó 0 entregue a su salida 1200 ó 2200 Hz respectivamente.

*b-)* Con un PIC que además de manejar las señales digitales genere las frecuencias de 1200 y/ó 2200 Hz según corresponda, pero creo que tendria el inconveniente de que dichas señales no serian senoidales y podrian generar algún inconveniente.



Sin dudas con alguno de los DSPIC se puede hacer todo con un solo integrado y con el agregado de dificultades en la programación del mismo si la versión del PBP no los soporta.



Saludos, JuanKa.-


----------



## manikuy (Mar 28, 2012)

Porsia acaso alguien no tiene el código en basic de una secuencia randomica con 8 leds y seguir la esa secuencia con 8 pulsantes todo hecho con el pic16f877a ??? se agradeceria mucho la ayuda


----------



## Dario (Mar 28, 2012)

J2C dijo:


> D@rio
> 
> Mirando una traducción de la ayuda del PBP en http://www.todopic.com.ar/pbp_sp.html encontre una función de "Valor Absoluto" que es perfecta para el programa de lectura del Gyro, te adjunto la sección de la sub rutina *giro*:
> 
> ...



hola juanka, te cuento que he estado bastante ocupado en mi taller estos dias y por eso he tenido que dejar un poco de lado el desarrollo del proyecto, espero desocuparme un poco este fin de semana y asi poder seguir experimentando. de todas formas, mañana me hago un tiempito para probar el codigo y te cuento que sucede. 
PD: (por el saludo que enviaste deduzco que ya andas por estos pagos y no precisamente por la ciudad jeje... 
saludos y que disfrutes tus dias en mi cordoba querida    )


----------



## torres.electronico (Mar 29, 2012)

Gracias muchachos por sus respuestas... En la uni vi comunicaciones y algo tengo presente vagamente dentro de la cabeza, pero digo vagamente ya que yo segui la orientacion de automatizacion y control y en lo que fue mi trabajo, fue casi muy poco lo que aplique de comunicaciones por lo tanto hay cosas que quedan en el camino...

En FSK, bit y baudios tienen directa relación (1200baudios - 1200 bps)
El Baudio es audio ... 
Un baudio = Un ciclo por segundo...
El bps es un bit por segundo; Con esto tenemos que para transmitir 4 bits, se requieren 4 segundos o mejor dicho, se requieren 4 ciclos...una eternidad
En PSK se pueden meter hasta 4 bits en un ciclo por segundo ya que variando cada 90 grados la fase de la señal manda sobre la portadora un bit; Osea, por segundo tendriamos 9600bps.
Tal como comentas, mas de 1200 baudios en FSK no se pueden obtener, pero tratandose de tan solo mostrar el estado logico de una barrera fotoelectrica, con dos bits me alcanza y sobra, osea que FSK es lo que quiero encarar.
Se me habia pasado por la cabeza de transmitir en decimal (0-255) y despues pasarlo a binario,pero esto es mas sencillo, ya que como comente anteriormente, solo necesito tan solo 1 bit para activar el hardware... Lo que podria hacer, en el caso de querer activar mas de una funcion y para decodificarlos sin confusiones, es emplear una tabla de frecuencias para cada equipo y listo...De ultima, si llegaria a necesitar mas bits, intentaria implementar NRZI, que es un metodo de codificacion similar, pero con la variante que en la codificación NRZI la información depende del cambio de estado de la señal, donde el bit 1 se representa por un no cambio del estado de la señal y el bit 0 se representa por un cambio en la señal, de esta manera varios bit 0 seguidos se representaría por una señal oscilante entre estado alto (1) y nivel bajo (0) con la frecuencia igual a la tasa de transferencia, es decir 1200 bps para AX.25, y varios bits 1 seguidos se representaría como una señal que no cambia su estado en el tiempo siendo continuamente alto (1) o bajo (0).



Partiendo de aca, ahi entonces la manera que tendria de decodificar esta señal con el micro podria estar ligada por una interrupcion por timer cuando detecte el tono; no se si llegaria a leer un byte, pero calculo que 4 bits si...
FSK, para los que estan interesados en el tema y reflotando lo que comento el amigo; Implementa los unos y los ceros con dos tonos de audio (un tono para los 1 y otro tono para los ceros).



Mientras que estos tonos esten dentro del espectro de frecuencias audibles por el handie que recepcione la transmision, el demodulador no va a tener problemas con  el reconocimiento de los 1 y 0.El ancho del canal no seria un problema, siempre y cuando la amplitud de audio transmitida por el equipo transmisor no se desvie mucho de la frecuencia inicial.
Es ahi donde parte mi planteo estupido anteriormente, "el de la regulacion de la ganancia del volumen", dado que no se en que luna estaba cuando escribi eso, ya que supuse (creo) en ese momento un concepto inexistente que no tiene nada que ver con lo que es la realidad...
Osea, supongo que lo que se me paso por la cabeza en ese momento y lo escribi directamente sin pensar, fue que si tomamos el ejemplo de hablar a los gritos por el mic y nosotros movemos para arriba o para abajo 5Khz, vamos a notar que tenemos señal plena; Totalmente distinto, a que si hablaramos en voz baja y notamos que al subir o bajar la transmision es mucho mas angosta...
Bueno, de toda esa bolufrase y deducciones sin sentido que se me pasaron en ese momento, no se por que se me paso por la cabeza que me hiba afectar el ancho de banda, jajaja, si en realidad la intensidad del volumen que tenemos en el modulador, es fija...EN sinteticas palabras, no tiene nada que ver el bodoque del descalibrador de brocula, ya que este tiene chagardel paso izquierdo....
Volviendo al tema central, en un canal de radio, la banda pasante de audio es muy limitada en cuanto al ancho del canal ya que estan creados solo transportar la voz humana. De seguro muchos de nosotros hemos probado crear sonidos con los comandos de PBP... o directamente con FREQOUT; Bueno, todos los sonidos que eran inaudibles,o que no estaban entre las frecuencias de 300Hz y 3200Hz, no pasarian ya que se atenuarian por no pertenecer a ese espectro. 
EN FSK, los tonos tienen una frecuencia de 1200 y 2200Hz; En realidad, se puede implementar cualquier frecuencia, pero estas tendrian que tener una separacion importante entre una y otra para que el demodulador no se confunda
Ahi les dejo algo que arme a modo experimental....


----------



## J2C (Mar 30, 2012)

Aclaraciones 



torres.electronico dijo:


> ….. El Baudio es audio .....





torres.electronico dijo:


> Un baudio = Un ciclo por segundo...
> El bps es un bit por segundo; Con esto tenemos que para transmitir 4 bits, se requieren 4 segundos o mejor dicho, se requieren 4 ciclos...una eternidad .....


*NO es audio*, digamos que era la unidad de medida usada en esa época (http://en.wikipedia.org/wiki/Baud) cuando no existían las transmisiones digitales actuales.






torres.electronico dijo:


> .... En PSK se pueden meter hasta 4 bits en un ciclo por segundo ya que variando cada 90 grados la fase de la señal manda sobre la portadora un bit; Osea, por segundo tendriamos 9600bps. .....


Las modulaciones como la PSK (base) y las derivadas QPSK y BPSK son variantes que la necesidad hizo buscar y descubrir para poder transmitir la mayor cantidad de símbolos (bit) usando el menor ancho de banda posible en los sistemas de comunicaciones a larga distancia realizados mediante Radio Enlaces de Alta Capacidad (PDH [1920 canales telefónicos]=140Mb/s; SDH [1890 canales telefónicos]=155Mb/s).
También esta la QAM (Modulación de Amplitud en Cuadratura [http://en.wikipedia.org/wiki/Quadrature_amplitude_modulation]), la gran mayoría de los Sistemas de Radio Enlaces PDH en nuestro país instalados a partir de 1992 trabajaban con modulación 16QAM en la banda centrada en 6,770 GHz. A partir de 1996 se comenzaron a instalar sistemas SDH en 32QAM (una variante de la 64QAM para reducir los errores) usando la misma banda de 6,770 GHz.
A estos tipos de modulaciones se las suele conocer como Modulaciones Vectoriales por que se realiza mejor la analogía de las mismas a un vector rotando sobre su eje y con variaciones de amplitud. 






torres.electronico dijo:


> ….. Se me habia pasado por la cabeza de transmitir en decimal (0-255) y despues pasarlo a binario,pero esto es mas sencillo, ya que como comente anteriormente, solo necesito tan solo 1 bit para activar el hardware... Lo que podria hacer, en el caso de querer activar mas de una funcion y para decodificarlos sin confusiones, es emplear una tabla de frecuencias para cada equipo y listo...De ultima, si llegaria a necesitar mas bits, intentaria implementar NRZI, que es un metodo de codificacion similar, pero con la variante que en la codificación NRZI la información depende del cambio de estado de la señal, donde el bit 1 se representa por un no cambio del estado de la señal y el bit 0 se representa por un cambio en la señal, de esta manera varios bit 0 seguidos se representaría por una señal oscilante entre estado alto (1) y nivel bajo (0) con la frecuencia igual a la tasa de transferencia, es decir 1200 bps para AX.25, y varios bits 1 seguidos se representaría como una señal que no cambia su estado en el tiempo siendo continuamente alto (1) o bajo (0). .....


La codificación NRZI es solo uno de los “Código de Línea” (http://en.wikipedia.org/wiki/Line_code) existentes, estos códigos han sido necesarios al incrementar las velocidades de las señales digitales a transmitir y sus dos funciones principales son “minimizar el contenido de errores” y “lograr que el valor medio en tensión sobre los cables coaxiales usados en la conexiones de las distintas etapas de los equipos sea prácticamente 0 Volt”.
En un Handy de VHF y con FM no podrás transmitir señales binarias, deberás traducir las mismas a Frecuencias de Audio dentro de la banda pasante de dicho Handy que suele ser entre 300 y 2600 Hz con una desviación de la portadora de FM de ±5 KHz, en cambio las líneas telefónicas tienen un ancho de banda de 300 a 3400 Hz con una banda pasante de ± 0.5 dB en la parte de 600 a 2000 Hz y +0.5 dB/-1.5 dB en ambos extremos de la banda pasante. 






torres.electronico dijo:


> ….. Tal como comentas, mas de 1200 baudios en FSK no se pueden obtener, pero tratandose de tan solo mostrar el estado logico de una barrera fotoelectrica, con dos bits me alcanza y sobra, osea que FSK es lo que quiero encarar. .....


En este caso básico y dependiendo de las Normas de Seguridad que necesites respetar me cae muy simpático usar el Módem de 1200 Bps (bit x seg.) por que una frecuencia seria igual al símbolo “0” y la otra al “1” logrando mejorar la seguridad.
La forma de implementarlo seria que cuando quieras transmitir un “1” le entregues una frecuencia al Handy y otra con el “0”; si generas las dos frecuencias con el mismo PIC y como la misma será una señal digital deberás usar algún filtro como los usados en las salidas de los reproductores de DVD de manera que la señal aparente ser mas senoidal que cuadrada, por otra parte deberás controlar ó atenuar la amplitud de la misma para no saturar ni sobremodular el Tx de FM.
En el Handy usado en la recepción puedes decodificar ambas señales usando sendos LM567 uno para cada frecuencia y elaborar alguna lógica que te los interprete como corresponde. En los antiguos Multiplex Telegraficos (años 1980 y anteriores) se usaba un “discriminador” realizado con componentes discretos (pasivos y activos) para detectar ambas frecuencias.







D@rio


D@rio dijo:


> hola juanka, te cuento que he estado bastante ocupado en mi taller estos dias y por eso he tenido que dejar un poco de lado el desarrollo del proyecto, espero desocuparme un poco este fin de semana y asi poder seguir experimentando. de todas formas, mañana me hago un tiempito para probar el codigo y te cuento que sucede. .....


Todo lo que sea trabajo Bienvenido Sea, antes que la otra frase prefiero decir que "El trabajo dignifica" y a personas como nosotros nos da el dinerillo para investigar   !!! 





D@rio dijo:


> ..... PD: (por el saludo que enviaste deduzco que ya andas por estos pagos y no precisamente por la ciudad jeje...





D@rio dijo:


> saludos y que disfrutes tus dias en mi cordoba querida )


Siempre fijo mi base en la Ciudad (Alta Cba), y con paseos (visitas de un día a familiares y amistades) para el laú de Unquillo, Charly Peace Village y hacia Alta Gracia este sábado 31 de Marzo. 



Saludos, JuanKa.-



P.D.: Primero me disculpo por la extensión de mi respuesta, luego también me disculpo por el Off Topic que de seguro he generado y si alguien quiere conversar mas al respecto me lo comenta y tratamos de abrir otro thread. Finalmente me disculpo por solo citar las páginas de Wikipedia en Ingles, pero las mismas páginas en castellano siempre omiten información relevante para la cabal comprensión de los temas.
Adoro nuestro idioma pero la experiencia me ha enseñado que siempre es mejor el idioma de origen de los equipos, etc.-


----------



## torres.electronico (Mar 31, 2012)

Hola Juanka, gracias por refreqar algunos conceptos... mas de los mismo digamos; Osea, la base esta, la tengo... lo que pasa es que ahora que me leo, veo que no supe explicarme bien que es lo que necesito... Ahi probe con dos kenwood el ejemplo que subi anteriormente... lo reforme un poco mas y le di forma para que me reconozca mejor los dos estados (I-0).
El tema esta en como puedo hacer para configurar el tmr0 y cada 600ms me guarde un bit cuando la señal esta en alto... Mi duda esta aca por que anteriormente en PBP no implemente nunca los TMR,por ende el ajuste del prescaler par que no tenga errores...
de 14 pruebas de comunicacion (le puse un pulsador), las 14 se recepcionaron y me funcionaron bien encendiendo un led.... Desde el vamos, eternamente agradecido por tus aportes y quizas, entre todos los trastos que tengo ahi tirados, quizas algo me sirva para futuro (tengo dos BLU-la mitad de un teletipo-FT411 a patadas, de todos quizas arme dos), ya que me puse a leer el enlce que me pasastes y se me desperto el bichito para hacer otras cosas mas.... lo que sigue despues de esto, es mandar imagenes; Lo habia arrancado para otro proposito, pero ahi Dario me desperto y me mostro unos modulos que ya vienen para este proposito sacandome de encima bastante tiempo en lo que seria el desarrollo...
Vos ya jugastes con paquet? has experimentado envio y recepcion de imagenes?
Saludos


----------



## J2C (Abr 1, 2012)

Torres.Electronico



torres.electronico dijo:


> Hola Juanka, gracias por refreqar algunos conceptos... mas de los mismo digamos; .....


Tu te has dedicado a Automatización y Control y yo he realizado toda mi experiencia en Radio y Telecomunicaciones. Solo lleva un poco más de tiempo cuando no es lo nuestro  . 





torres.electronico dijo:


> .... quizas algo me sirva para futuro (tengo dos BLU-la mitad de un teletipo-FT411 a patadas, de todos quizas arme dos), .....


En el caso de utilizar la comunicación por BLU deberás tener mayores cuidados debido que ese tipo de modulación suele tener muchos ruidos y es muchísimo más afectada por las interferencias. 





torres.electronico dijo:


> .... pero ahi Dario me desperto y me mostro unos modulos que ya vienen para este proposito sacandome de encima bastante tiempo en lo que seria el desarrollo .....


Se que en la Ciudad Autónoma de Bs. As. (la CapiFede), y supongo en el interior solo depende que cuan equipados se encuentren los comercios de electrónica (en Córdoba *Muy Bien*, doy FE), se consiguen *Modulos Tx y Rx Digitales* para sistemas de ese tipo en la frecuencia de 432MHz de potencia bastante baja, pero desconocia cual era tu proyecto y cual la distancia para tenerlo bajo control.





torres.electronico dijo:


> ..... El tema esta en como puedo hacer para configurar el tmr0 y cada 600ms me guarde un bit cuando la señal esta en alto... Mi duda esta aca por que anteriormente en PBP no implemente nunca los TMR,por ende el ajuste del prescaler par que no tenga errores .....


Ahi lamento no poder ayudarte, aún estoy aprendiendo (por eso sigo tanto este thread) como hacen para programar Uds.

Pero creo que tu mismo te deberías clarificar un poco más tu propio proyecto:
a-) Si lo usas como has dicho hasta ahora, deberás tener siempre transmitiendo un equipo!.
b-) Es tan necesaria la precisión en el tiempo de 600ms o se puede hacer con algún delay con el que también se obtiene buena precisión?.
c-) Que pasa si por algún ruido el µControlador detecta que debe cambiar de estado?, no seria conveniente realizar en el caso de cambios de estado un par de re-lecturas más rapidas interrumpiendo el proceso (programa) que confirmen la operación?.
d-) Puede afectar esa operación de cambio de estado algún riesgo a la vida humana?, ó a bienes materiales?.

Y algunos puntos más que seguro se me escapan en este momento.






torres.electronico dijo:


> ..... Vos ya jugastes con paquet? .....


No he jugado ni experimentado con Packet, solo soy un técnico que en sus tiempos libres lee mucho y a quien *la internet* le permite llegar a leer muchísimo más y con un costo ($$$) muy bajo.





torres.electronico dijo:


> ..... has experimentado envio y recepcion de imagenes?
> Saludos


Tampoco he experimentado con envio y recepción de señales de video (Televisión de Barrido Lento); pero hay páginas en la Web (extranjeras y de Argentina) que tratan con detalle este tema con equipos de Radio Aficionados. En este momento no lo recuerdo bien, pero creo que hay una página de alguien de la ciudad/localidad de San Nicolas (pcia. Bs As) con muchos detalles. Los modulos no creo que te sirvan para el tema de las imagenes debido a que son de muy baja velocidad.




Saludos, JuanKa.-


----------



## josephvalle (Abr 8, 2012)

Buenos días compañeros del foro electrónica soy nuevo y es mi primera inquietud sobre los pic programo en basic quisiera saber si las interrupciones en basic funcionan al 100% ya que he echo un código el cual no me respeta el tiempo que le doy con interrupción la idea es que el led se quede prendido por 10 segundos pero se me apaga antes del tiempo indicado o aveces llega hasta los 7 seg o a diferente tiempos quisiera saber si me podrían orientar acá les dejo el código 


```
@ Device   PIC16F628A
@ Device   HS_Osc
@ Device   Protect_Off
@ Device   WDT_Off
@ Device   Pwrt_Off
@ Device   MCLR_Off
@ DEvice   BOD_Off
@ Device   LVP_Off  
@ Device   CPD_On
cmcon=7
DEFINE OSC 10

P1          VAR PORTB.0
L1          VAR PORTA.0

I           var byte
Ticks       VAR byte                           
Minute      VAR byte                         
Second      VAR byte 

pause 500 
Minute =0 
Second =0 
Ticks  =0

OPTION_REG = $05               ;  prescaler = 64
ON INTERRUPT GOTO ISR          ; ir a rutina ISR 

if second => 10 then
    l1=0
    second=0
    elseif
if second <10 then
    l1=1
    endif
    endif

INICIO:
  if p1 then
  PAUSE 100
  IF p1 THEN  
  while p1:wend
  toggle l1
  TMR0 = 0 ;inicializa registro TRMO
  INTCON = $A0 ; habilita tiempo de interuupcion
  endif 
  endif
GOTO INICIO

DISABLE
ISR:
Ticks = Ticks + 1
IF Ticks < 61 THEN NoUpdate
Ticks = 0
Second = Second + 1
IF Second => 10 THEN
l1=0
second=0
ENDIF


NoUpdate:
INTCON.2 = 0 ;rehabilitainterrupciones del TRMO
Resume
ENABLE ; 
END
END ; Fin del programa
```
la idea de este código es que presione yo un button y se encienda o apague el led si en caso se quede encendido que se apague automáticamente después de los 10 seg claro que me gustaría darle mas tiempo pero no logro controlarlo con los 10 seg que le doy de prueba espero me puedan ayudar y si se puede mejorar pues les agradezco mucho



estoy tratando de subir el esquemático pero no logro espero me puedan ayudar


----------



## lubeck (Abr 8, 2012)

El amigo dario en unos cuantos mensajes atras hizo un timer... dale una buscada... y yo he probado _este_ seria cuestion de que lo adaptes a lo que necesites...


----------



## josephvalle (Abr 8, 2012)

vi el video que colgastes en el youtube es muy bueno cuando pruebo tu circuito con el codigo no hace lo mismo en el proteus solo prende y apaga el led rojo el verde nunca enciende en verdad el codigo que manejas es muy interesante con respecto al amigo dario que me indicas esta en el mismo tema o es en otro tema el ejemplo del timer


----------



## lubeck (Abr 8, 2012)

el codigo de dario esta en este mismo tema mas atras, y segun creo recordar solo incremento o decremento el prescaler para ajustar el tiempo, yo creo que lo mas exacto es con el cristal externo como el del video que puse, con respecto a la simulacion de proteus... SI... tiene un error el proteus al simular eso, y lo explico en el mismo mensaje... si gustas armalo te garantizo que funciona y muy bien...


----------



## josephvalle (Abr 8, 2012)

lo haces con un led rgb o con dos led bueno de echo voy armarloaunq conseguire un cristal de 32.768khz ya que no lo tengo y este codigo como lo podria modificar para la labor que quiero darle con respecto al tema de dario estoy buscandole



por que en el proteus le pones cristal de 32.768khz y en los fuses del pic le pones cristal interno de 4


----------



## lubeck (Abr 8, 2012)

> lo haces con un led rgb o con dos led


lo arme con un led bicolor (rojo y verde) no es RGB, pero es lo mismo que si pones dos leds independientes, ese led bicolor tiene 3 patitas... catodo comun y anodos independientes...



porque el codigo del micro utiliza el oscilador interno de 4Mhz para funcionar, el cristal de 32.768 es solo para la interrupcion del timer1... o sea que puedes poner tambien el cristal externo de 4Mhz en los pines correspondientes para el oscilador del micro...  y llevaria dos cristales...


----------



## josephvalle (Abr 8, 2012)

huau si que es interesantisimo y como podria modificar tu codigo para la labor que yo necesito

mi idea inicial es hacerlo con mas tiempo y unos 3 button cada uno con su propia salida pero aun no logro hacerlo el primero


----------



## lubeck (Abr 8, 2012)

pues .... tu codigo tiene una interrupcion no???

pon casi todo lo de tu codigo en el otro que tambien tiene una interrupcion... eso de las suma de segundos y todo, eso...  lo que no tienes que mover es lo de la configuracion del registro de interrupcion y del modulo del timer

yo tengo un cronometro con ese sistema y es muy exacto incluso hasta con varios minutos... nunca lo he checado con horas o dias...


----------



## josephvalle (Abr 8, 2012)

ya estoy variando tus modificaciones gracias por tu ayuda te comento al rato



esta parte  del button lo he modificado por el if y then para ver si trabaja y bueno en el proteus hace lo mismo de prender y apagar aunq no se si estara encendiendo el led verde ya que aun no lo he armado por el cristal 

Main:

 if but then
  PAUSE 100
  IF but THEN  
  while but:wend
 toggle T1COn.0 'Cambia el estado   
 low ledG     ' apaga el led verde
 ledr=!T1COn.0  'asigna el valor invertido del estado del timer1 al led rojo
endif
endif
Goto Main

en realidad ahi trabajas con dos led cada uno con salidas independientes pero yo quiero una salida independiente con diferente funcion como se lograria


----------



## josephvalle (Abr 8, 2012)

Aun no logro hacer nada como podria realizar esta labor



lubeck leendo en el foro veo que tienes mucha informacion.
te agradeceria si me podrias ayudar ahi mucho que se nos hace complicado el tema de las interruciones como en este ejemplo mio ojala me puedas orientar te agradeceria mucho por el momento seguire leendo


----------



## lubeck (Abr 8, 2012)

lo complicado de las interrupciones, es que todos los que empezamos en esto pensamos que todas son lo mismo, es decir, esperamos que sea como una receta, y no es asi, las interrupciones varian deacuerdo a cada modulo, o lo que es lo mismo la interrupcion del timer1 es diferente a la de la interrupcion de RBO, o la del USART, o la del USB o la puerto B, todas funciona de manera similar pero CADA UNA SE CONFIGURA DIFERENTE, te preguntaras ¿y como se configura? pues para algo mas certero tienes que aprender ingles basico o tecnico y leer los manuales(datashit) de cada microcontrolador porque aunque pudieran ser similares entre uno y otro pueden tener diferencias... me explique?


----------



## josephvalle (Abr 8, 2012)

correcto con lo que acabas de decirme es lo que hago trato de decrifar el datashit voy a seguir buscando y pues haber si alguien me podria echar una manito con mi codigo


----------



## josephvalle (Abr 9, 2012)

Lubeck aun no encuentro el tema de dario puedes ayudarme a resolver en que esta fallando mi codigo o que me puede faltar espero no incomodar al pedir una ayuda con mi tema gracias


----------



## lubeck (Abr 9, 2012)

_Aqui _ esta el codigo de D@rio...
no vayas a creer que lo hizo para lo que necesitas, tambien lo tienes que adaptar a lo que tu necesitas..

mira la herramienta enmarcada en el cuadro rojo....



le das click y pones en busqueda avanzada y es bastante poderosa


----------



## josephvalle (Abr 9, 2012)

Gracias enormes lubeck empezare por hacer pruebas con este codigo


----------



## juancaca (Abr 11, 2012)

Hola alguien podria ayudarme, quisiera saber como se utiliza el protocolo USB con PBP.
Cordial saludo.


----------



## lubeck (Abr 11, 2012)

_este_ ejemplo es para hacer un joystic, pero si no mueves a lo que se llama los descriptores, y solo generas el codigo con el EasyHID USB Wizard puedes hacer una interfaz en VB Delphi o C++... 

_aca_ mas informacion...


----------



## reyvilla (Abr 14, 2012)

Hola compañeros estoy de nuevo por acá con un proyecto de practica que estoy realizando, en este caso con unos de mis favoritos el pic12f675, estoy utilizando el ADC0 para la lectura de un sensor de temperatura LM35 y enviar la información por el puerto serial al PC, ya adelante bastante luche para que me enviara correctamente la información vía serial y eso fue por que le faltaba la linea de "DEFINE OSCCAL_1K 1", luego de allí ya tenia todo listo ya tenia el programa que había simulado en el proteus y funciona a la perfección bueno eso creo ya que me da buenas lecturas del sensor a nivel de la simulación, ahora el problema esta en la practica, una vez solucionado lo de la comunicación con el pc, empece a recibir los datos leídos del ADC que obtuvo del LM35 sengun su temperatura, pero resulta que me muestra siempre un valor de 15, ese valor es el que mas se mantiene, al ponerle una llama para incrementar la temperatura resulta que en vez de subir el valor lo que hace es bajar hasta 8 y 9, me resulta confuso ya que debería ser lo contrario, revise la hoja de datos y realice algunas modificaciones y sigue igual, busque en la red y encontré circuitos con la misma conexión así que descarto que este mal conectado. Les dejo el código y la simulación a ver si es que hay algo que no he tomado en cuenta y cualquier cosa me avisan muchas gracias de antemano


----------



## lubeck (Abr 14, 2012)

Prueba nada mas asi Rey....

```
@ DEVICE PIC12F675
@ DEVICE INTRC_OSC_NOCLKOUT
@ DEVICE WDT_OFF       
@ DEVICE PWRT_OFF
@ DEVICE MCLR_OFF
@ DEVICE BOD_OFF
@ DEVICE PROTECT_OFF
@ DEVICE CPD_OFF 
Include "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4  


Define  ADC_BITS        10   	
Define  ADC_CLOCK       3  
Define  ADC_SAMPLEUS    50 
ADCON0 = %0
ANSEL = %1        
CMCON = 7            
SYMBOL TX = GPIO.5
SYMBOL LED = GPIO.2
TRISIO =%00000000     
GPIO  = %00000000     
TEMP VAR WORD
ATEMP Var Word


PAUSE 500
SEROUT TX,N2400,["BIENVENIDO",10,13]  
PAUSE 500
SEROUT TX,N2400,["TERMOMETRO DIGITAL",10,13]
PAUSE 500
SEROUT TX,N2400,["VERSION 1.0",10,13]
PAUSE 500

INICIO:

LED = 0
GOSUB ADC0
LED = 1 
PAUSE 100
GOTO INICIO


ADC0:                          
ADCIN 0, TEMP 
if TEMP<>Atemp then              		
 SEROUT TX,N2400,["TEMPERATURA ACTUAL: ", #TEMP,10,13]
 Atemp=Temp
endif
PAUSE 100
RETURN 
END
```

por ahi tengo un 675 y un lm35... mañana lo armo  a ver que pasa, por curiosidad...


----------



## reyvilla (Abr 14, 2012)

Dale lubeck muchas gracias, acabo de programar tu codigo y hacer pruebas los resultados son los siguientes:

temperaruta normal:

BIENVENIDO
TERMOMETRO DIGITAL
VERSION 1.0

TEMPERATURA ACTUAL: 2048
TEMPERATURA ACTUAL: 2112
TEMPERATURA ACTUAL: 1920
TEMPERATURA ACTUAL: 2048
TEMPERATURA ACTUAL: 2112
TEMPERATURA ACTUAL: 1920
TEMPERATURA ACTUAL: 2048
TEMPERATURA ACTUAL: 1920
TEMPERATURA ACTUAL: 2112
TEMPERATURA ACTUAL: 1920
TEMPERATURA ACTUAL: 2048
TEMPERATURA ACTUAL: 2112
TEMPERATURA ACTUAL: 2048
TEMPERATURA ACTUAL: 2176
TEMPERATURA ACTUAL: 1920
TEMPERATURA ACTUAL: 2048
TEMPERATURA ACTUAL: 2112

Temperatura modificada con una llama de encendedor:

BIENVENIDO
TERMOMETRO DIGITAL
VERSION 1.0

TEMPERATURA ACTUAL: 1024
TEMPERATURA ACTUAL: 1600
TEMPERATURA ACTUAL: 1152
TEMPERATURA ACTUAL: 768
TEMPERATURA ACTUAL: 896
TEMPERATURA ACTUAL: 1536
TEMPERATURA ACTUAL: 768
TEMPERATURA ACTUAL: 1088
TEMPERATURA ACTUAL: 1024
TEMPERATURA ACTUAL: 1152
TEMPERATURA ACTUAL: 1216
TEMPERATURA ACTUAL: 1280

Empiezo a pensar que esta defectuoso el LM35 
bueno esperare haber si lo pruebas para confirmarlo, de momento, lo otro es que pretendia medirlo pero el multimetro se me a quedado en el maletín  y no lo tengo cerca, mañana lo busco para hacer mediciones, otra cosa hice pruebas colocando un potenciometro, con el primer código y me dio lecturas desde 1 hasta 480, con un POT de 50K. Osea si esta midiendo bien, ahora tengo la gran duda con el LM35,


----------



## lubeck (Abr 14, 2012)

Pues si con el pote y el codigo que te puse, el resultado es  lineal de 0 hasta 65535 de 0 a 5v, entonces esta mal el LM35

mmm no recuerdo si el maximo son 1024 o 65535 pero alguno de los dos...


----------



## reyvilla (Abr 14, 2012)

Una cosa que se me ocurre que vi es que el LM35 trabaja con 10mv entre °C, lo cual sugiere utilizar un Vref, para poder tener una mejor presicion, lo que he visto lo hacen con un regulador de voltaje o un divisor de tensión con dos resistencias de 10K, para lograr un voltaje de 2.5V aproximadamente, voy hacer una ultima prueba hoy y te aviso.


----------



## lubeck (Abr 14, 2012)

ok... estoy probando con el osciloscopio ahorita mi lm35 y te digo como se comporta este... (esta nuevo)


----------



## reyvilla (Abr 14, 2012)

Ok si va, yo ya probé con lo del divisor y el Vref y mejoro bastante la parte de precisión antes cambiaba mas el valor ahora se mantiene, pero sigue cayendo el valor al subir la temperatura


----------



## lubeck (Abr 14, 2012)

mi lm35...

me marca 214mV y la temperatura en mi multimetro es 22°C le pongo el dedo y sube a 280mV el lm35, le pongo el cautin y se dispara a 300, 301.... 320 y va subiendo.... osea que es los mV/10=°C....

y si es bastante lineal


----------



## reyvilla (Abr 14, 2012)

Si algo así imagine, ahora a esperar hasta mañana a ver, que es ,lo que le pasa a mi LM35 lo mas seguro es que este defectuoso, muchas gracias lubeck y si armas y pruebas el circuito me avisas un abrazo ya mañana te digo como me fue con las mediciones


----------



## lubeck (Abr 14, 2012)

Ok...

una cosa yo estoy probando con un lm35 encapsulado TO-92, y visto de frente pongo en izq 5v, centro la salida Vout y derecha Gnd...

y si mañana lo armo para probarlo con el 675, abrazos y buenas noches...


----------



## lubeck (Abr 15, 2012)

KingValley....

ya lo arme.... y creo que algo si anda mal con el acople del Lm35 

quizas necesite un filtro...

mira la respuesta....
 es todo lo que marca ponga lo que le ponga, frio o caliente...

y mira el oscilos en el pin 7....



sigo revizando a ver que pasa...

nada mas te lo comento para ver si se te ocurre algo...


----------



## reyvilla (Abr 15, 2012)

Hola lubeck es un gusto saber que al parecer no perdi la inversion......Dale muy bueno tus datos voy a echar andar las mediciones y a revisar el codigo y hojas de datos a ver que anda mal...Gracias por las pruebas  Apenas tenga algo te aviso...

Por cierto tengo el mismo LM35 y si revise muchas veces el pinaje para estar seguro que estaba bien conectado y ya tengo el multimetro...



jajajajaja.... No lo vas a creer al codigo solo le falta un 1 y listo funciona de maravilla...Increible la diferencia que puede hacer un simple 1 o 0 en el codigo, configura como entrada gpio.0 y listo prueba y veras como funciona


----------



## lubeck (Abr 15, 2012)

apenas te iba a escribir que tenia un ruido infernal en el puerto gpio.0, pero lo puse como dijiste en entrada y como magia... se limpio... 

definitivo era eso.... 

ahora yo creo que para una mejor resolucion estaria bien con  un operacional para que fuera mas exacto, y hacer las matematicas para el dato en °C...


----------



## reyvilla (Abr 15, 2012)

Si aunque todo depende de la aplicación, yo diría que con un regulador de tensión para ajustar el Vref, es mas que suficiente ya que el mismo PIC tiene su propio amplificador, he visto que le colocan amplificadores adicionales para la señal de salida pero hasta el mismo datasheet lo que mas usa es un lm317 como ajuste  de offset, la única que utiliza amplificador operacional es cuando vas a utilizar un ADC, de resto no haría falta, lo otro es que vallas a medir menos de medio grado, allí si diría que puede necesitar un amplificador, pero si vas a medir cambios de medio o un grado creo que lo mas que haria falta es un regulador para el ajuste del Vref.


----------



## lubeck (Abr 15, 2012)

> la única que utiliza amplificador operacional es cuando vas a utilizar un ADC,



por eso te lo menciono estamos utilizando un ADC con el 12f675... mmm.. no se como explicarlo pero el rango del ADC es de 0 a 5V... y con el LM35 tenemos un rango de digamos 0 a 1.5V ya exagerado estamos ocupando solo el 30% del rango... si esos 1.5 lo escalamos a lo 5v (100%) queda mas fino el resultado... pero como tu dices si no es necesario pues pa'que


----------



## reyvilla (Abr 15, 2012)

No se si te mencione pero coloque un divisor de tension con dos resistencias de 10K para el voltaje de referencia para el ADC, ya con eso tendrías el 100% como indicas ya que el adc no tomaria de 0V a 5V si no de 0V a 2.5V, aunque ahora que mensionas lo del voltaje se puede hacer una prueba llevando Vref a 1,5V y ver que pasa como el ADC, aunque lo que mas he visto es que lo llevan a 2.5V no se porque seria esto, si como dices tu que es totalmente cierto el rango de voltaje de salida del LM35 es de 0V a 1.5V

Nota: adcon0 quedo así: ADCON0 = %01000000
para que tome el voltaje de referencia a través del pin 6.

PD: aquí hay uno con amplificador para adaptar la señal como indicas lubeck.

https://www.forosdeelectronica.com/f23/dudas-operacinales-67698/#post593366


----------



## reyvilla (Abr 18, 2012)

Hola yo de nuevo por aca, estoy ahora probando un poco lo que es registro TMR0 y el Timer0, al principio tenia dudas con respecto a quien era quien, luego leyendo la hoja de datos en este caso uso el 16F877, encontré que el TMR0 es un registro que contiene los bit de Timer0, por lo tanto ya a partir de allí empece a investigar como usarlo y como calcular el tiempo, ahora debido a que se utiliza PBP y si fuera ASM seria mas o menos igual, al realizar una interrupcion por TMR0 por desbordamiento, yo realizo una operación para incrementar o decrementar un registro de propósito general, en este punto se debe tomar en consideración cuanto es el tiempo que se utilizo al realizar el incremento, ya que de lo contrario nos daría un desfase de tiempo. Luego de este pequeño analisis segun yo, suponiendo que saque mis cuentas bien y estoy en lo correcto pongamos que se cargo el prescaller con un valor de tal manera que me genere una interrupción en 1 mili segundo exacto y yo cargo un registro y al llegar a 1000 milisegundos tendría 1 segundo y a partir de allí incrementaría otro registro de propósito general para poder controlar un sistema de tiempo lo mas real posible, ahora por cada vez que exista un desbordamiento yo realizo de 2 a 3 o 4 consultas para cada uno de los registros y aparte de eso realizo un incremento constante de los registro según sea el caso si el primero llamado milisegundos = 1000 entonces reseteo el registro milisegundos, e incremento el de segundo 1, y a su vez decremento el tiempo que me llevo realizar toda la operación, incluyendo en tiempo del decremento claro esta, y por cada desbordamiento tengo que hacer lo mismo ya que al realizar cada consulta estoy usando tiempo. Ahora como casi me vuelvo loco  , con todo esto, eso es solo con la rutina de tiempo, falta el programa principal que también afecta el tiempo, yo optaría por usar una subrutina para ciertas sentencias y como en un goto seria 2 ciclos de maquina, mas lo que restaría por la operación anterior, no se si todo es cierto o no, pero si es cierto tengo una pregunta, yo recuerdo que en algun momento en la carrera de electrónica, en la materia de micros1, nos pusieron en un examen un código en ASM, para un pic, que trabajaba a xxmhz, y teníamos que calcular el tiempo en el el micro tardaba en ejecutar todo el programa era algo largo el proceso y algo tedioso pero interesante,  para este caso que explico tendría que hacer lo mismo para poder tener una buena precisión en el tiempo? Espero si alguien puede ayudarme con esas dudas se lo agradecería mucho


----------



## reyvilla (Abr 21, 2012)

Bueno aqui dejo un codigo base para un tiempo de 999.96 milisegundos, practicamente 1 segundo, con un error de 4us, creo puede mejorarse , en fin no es muy complicado pero si es necesario conocer mas a fondo los ciclos de maquina para mayor precisión, aparte de tener en cuenta el oscilador a utilizar y que rango del divisor prescaller usar,  en mi caso, no necesito tanta precisión pero quise llevarlo un poco mas allá, y logre hasta 999.96ms, para llegar aquí primero coloque al máximo el prescaller osea 256, osea cada 256 ciclos el cuenta 1, como cada ciclo de maquina es de 4 pulsos de reloj, en la formula que encontré del TMR0, es por eso la multiplicación por 4 luego de la división de 1/F, lo que da 1us por cada ciclo de maquina para los microcontroladores pic, eso utilizando un oscilador de 4MHZ, si es de 20MHZ da 0.2us, para poder lograr mas o menos 1 segundo con un margen de error mínimo con 20MHZ, lo que hice fue escoger un valor redondo en mi caso 12800us, utilizando un programa que encontré y anexo, 
esos 12800us me dan con un valor de 6 cargado en el registro TMR0, lo que quiere decir que a partir de alli es que empieza a contar, 
o lo que es lo mismo le resto a 256 - 6, entonces ahora no desborda al contar de 00 a 256, si no de 06 a 256, 
si sacamos cuenta, para ciclos 
con duración de 0.2us x 250 = 50us x 256 = 12800us = 12.8ms, 
ahora eso no es ni la mitad de un segundo, para llegar a 1 segundo, multiplique cuantas veces fue necesario para llegar lo mas cerca a 1 segundo, 
en mi caso elegí 78 que da 12.8ms x 78 = 998.4ms, 
elegí ese porque era el mas redondo de los que calcule, ahora tengo una diferencia de 1,6ms, para compensarlo coloque 20us de pausa por cada interrupción 
como son 78 entonces 20us x 78 = 1560us = 1.56ms
Y en total tenemos 998.4ms + 1.56 = 999.96ms por cada 78 interrupciones.
 Ahora esto es relativo, si sabemos que cada ciclo es de 0.2us, si después de la interrupción, hacemos un procedimiento ya sea de suma o condicional, eso consume ciclos de maquina lo cual debe restarse del tiempo calculado, 
digamos que un IF THEN, consume 2 ciclos de maquina, 
entonces tendríamos que multiplicar 0.2us x 2 x 78 y nos daría cuanto es el tiempo que tendríamos de diferencia para 1 segundo con esa instrucción y así para cada instrucción que se vaya a realizar en la subrutina de interrupción.

Bueno hasta aquí la pequeña explicación dejo el programa, el código y la simulación para que la prueben, el código esta comentado en ingles para los registros de interrupción y option lo coloque así por que se entiende mejor que al traducirlo.

El programa lo que hace es togglear un led cada segundo bueno cada  999.96ms aproximadamente...Cualquier cosa que me este equivocando me avisan...

PD: El pulsador no tiene ninguna función de momento era para las practicas, en el proteus tienen una opción que esta en la barra de herramientas debug que se llama "Excute For Specified Time", sirve para ejecutar la simulación en un tiempo especificado es milisegundos, para menor tiempo pueden poner 0.500 y es medio segundo.


----------



## reyvilla (Abr 21, 2012)

Por aca dejo un pequeño código muy interesante, puede controlar hasta 5 interruptores para el control de un led, funciona como los llamados 3 way, que usan dos interruptores para el apagado y encendido de un bombillo, ahora este tiene 5 y cualquiera de los 5 puede cambiar el estado del led, si esta prendido lo apaga y si esta apagado lo enciende, esta echo con un pic12F675 y el código realmente no es código, es mas configuración que código cuando lo vean se daran cuenta que únicamente tiene la instrucción GOTO inicio, y es solo ese loop lo que hace, lo interesante es que se trata de interrupciones por cambio de estado, al cambiar el estado de cualquiera de las entradas cambia el estado del led.


```
@ DEVICE PIC12F675
@ DEVICE INTRC_OSC_NOCLKOUT
@ DEVICE WDT_OFF       
@ DEVICE PWRT_OFF
@ DEVICE MCLR_OFF
@ DEVICE BOD_OFF
@ DEVICE PROTECT_OFF
@ DEVICE CPD_OFF 

DEFINE OSCCAL_1K 1
DEFINE OSC 4  

INTCON = %10001000 'INTERRUPCIONES ACTIVADAS
OPTION_REG = %00000000
WPU = %00110110 'TODOS LOS PINES CON PULL-UP MENOS GPIO.0 y GPIO.3
IOC = %00111110 'TODOS LOS PINES COMO INTERRUPCION MENOS GPIO.0 
ANSEL = %00000000 'ADC DESABILITADO 
CMCON = %00000111 'COMPARADOR DESABILITADO 
         
SYMBOL LED = GPIO.0

TRISIO =%00111110 'TODOS COMO ENTRADA MENOS GPIO.0    
GPIO  = %00000000 
    

ON INTERRUPT GOTO SWCHIT 
INTCON = %10001000 

INICIO:

GOTO INICIO

Disable
SWCHIT:
TOGGLE LED 
PAUSE 400
INTCON = %10001000 
Resume
Enabl
```

Cuando abran el archivo del código pbp, verán que esta full comentado para que vean cual es el truco del código, les dejo la simulación y el codigo...


----------



## guigo (Abr 22, 2012)

quiciera que me ayudaran con algo:

pretendo programar un micro para controlar la velocidad de motores con un radio control. la cosa es que quiciera hacer un programa de modo que cuando suba el ancho de pulso del receptor, el ancho de pulso que quiero generar en el micro me baje osea, que la funcion sea inversa.


----------



## Pull1988 (Abr 23, 2012)

Hola amigos, quisiera por favor alguien me ayudara intruyendome un poco sobre el siguiente tema que pongo a su consideracion:
Sucede que estoy por presentar mi proyecto de grado el cual consiste en automatizar mi departamento usando PICs; bueno basicamente lo que hace el PIC es recibir un SMS enviado desde cualquier movil y accionar diferentes cosas en base a reles, en otras palabras el PIC recibe un mensaje y este le manda una señal a un o varios reles y estos proceden abrise o cerrarse; el problema que se me ha presentado esque no puedo independizar los reles, osea si quiero activar el rele dos, primero debo activar el rele uno, porque en el codigo fuente esta primero la linea que contiene al rele uno, entonces quiero saber si hay la posiblidad de saltarme esas lineas de codigo para que no siga el orden logico o bien sea poner condicionantes para que si a determinada accion se active cualquier rele ya sea el uno el dos, el tres, etc.

Adjunto mi codigo fuente que este hecho en Basic, en microcode studio.

Cualquier ayuda m sería de gran utilidad.

Gracias


----------



## reyvilla (Abr 23, 2012)

guigo dijo:


> quiciera que me ayudaran con algo:
> 
> pretendo programar un micro para controlar la velocidad de motores con un radio control. la cosa es que quiciera hacer un programa de modo que cuando suba el ancho de pulso del receptor, el ancho de pulso que quiero generar en el micro me baje osea, que la funcion sea inversa.



Hola y que has hecho hasta el momento si tienes algo adelantado colócalo para poder ayudarte.





Pull1988 dijo:


> Hola amigos, quisiera por favor alguien me ayudara intruyendome un poco sobre el siguiente tema que pongo a su consideracion:
> Sucede que estoy por presentar mi proyecto de grado el cual consiste en automatizar mi departamento usando PICs; bueno basicamente lo que hace el PIC es recibir un SMS enviado desde cualquier movil y accionar diferentes cosas en base a reles, en otras palabras el PIC recibe un mensaje y este le manda una señal a un o varios reles y estos proceden abrise o cerrarse; el problema que se me ha presentado esque no puedo independizar los reles, osea si quiero activar el rele dos, primero debo activar el rele uno, porque en el codigo fuente esta primero la linea que contiene al rele uno, entonces quiero saber si hay la posiblidad de saltarme esas lineas de codigo para que no siga el orden logico o bien sea poner condicionantes para que si a determinada accion se active cualquier rele ya sea el uno el dos, el tres, etc.
> 
> Adjunto mi codigo fuente que este hecho en Basic, en microcode studio.
> ...



Hola vi tu código y según entiendo, el espera a que llegue 1 de 3 mensajes y según el que llegue primero es la acción a tomar, así que si primero llega "Activar R2", debería activar R2, bueno esa es mi primera teoría, ahora el "WAIT", es para indicarle que debe esperar hasta que llegue una secuencia exacta de caracteres y de ser así entonces se quedaría en la primera linea de serin2, hasta que llegue "Activar R1", ahora como no utilizas un gosub si no goto, las demás nunca van a llegar a funcionar ya que retorna directo a inicio y quedaría siempre en la primera linea.
Ahora para lograr lo que tu quieres una opcion es darle un timeout a la sentencia serin2, de tal manera que si no llega esa en un tiempo determinado la primera cadena de caracteres, siga a la siguiente con una subrutina.

Quedaría algo asi:


```
include "modedefs.bas"
define OSC 4
CMCON=7
REL1 VAR PORTA.0
REL2 VAR PORTA.1                   
RX VAR PORTB.0
TX VAR PORTB.1

INICIO:
GOTO RECIBIENDO1

RECIBIENDO1:
SERIN2 TX,16468,100,RECIBIENDO2,[WAIT("Activar R1")]  'espera 100ms y si no llega nada se va a RECIBIENDO2
HIGH REL1
pause 5000
goto ENVIAR
RECIBIENDO2:
SERIN2 TX,16468,100,RECIBIENDO3,[WAIT("Activar R2")] 'espera 100ms y si no llega nada se va a RECIBIENDO3
high rel2
PAUSE 5000
GOto ENVIAR1
RECIBIENDO3:
SERIN2 TX,16468,100,INICIO,[WAIT("Desactivar R1")] 'espera 100ms y si no llega nada se va a INICIO
high rel2
PAUSE 5000
GOto ENVIAR1

GOTO INICIO
end 


ENVIAR:
    PAUSE 10000
    serout2 Rx,16468,["AT+CMGF=1",13]
        PAUSE 50
    serout2 Rx,16468,["AT+CMGS=",34,"092661649",34,13]
        PAUSE 50
    SEROUT2 Rx,16468,["R1 activado",26]
        pause 50
    goto inicio

ENVIAR1:
    PAUSE 10000
    serout2 Rx,16468,["AT+CMGF=1",13]
       PAUSE 50
    serout2 Rx,16468,["AT+CMGS=",34,"092661649",34,13]
        PAUSE 50
    SEROUT2 Rx,16468,["R2 activado",26]
        pause 50
    goto inicio

DESCATIVAR:
    PAUSE 10000
    SEROUT2 RX,16468,["AT+CMGF=1",13]
        PAUSE 50
    serout2 Rx,16468,["AT+CMGS=",34,"092661649",34,13]
        PAUSE 50
    SEROUT2 Rx,16468,["R1 desactivado",26]
        pause 50
    goto inicio
```

Nota: No lo he probado, por lo que no se si funciona, si tienes un esquema en proteus para probar seria mejor y puede haber muchas otras maneras es solo una idea que se me ocurre ahora.


----------



## Pull1988 (Abr 23, 2012)

Hola amigo, primero antes de todo quiero darte mil gracias por el tiempo que has empleado en mi problema, en segundo lugar te doy las gracias por la ayuda que me has brindado en la programacion, se me han aclarado bastantes cosas partiendo de tu gran ayuda, tiene mucha logica lo que tu haces y procedere a probarlo ya en la practica y te comentaré como me fue.
Reitero mis agradecimientos para contigo


----------



## novatjc (Abr 23, 2012)

lubeck dijo:


> nop....
> 
> pero mira este manual ahi estan todos los comandos seriales...
> 
> ...



Disculpa una pregunta tu cres que con la cmucam 3 pueda tomar una foto y guardarla en una EEprom para verla via ethernet por un Pic conectado a Ethernet


----------



## lubeck (Abr 23, 2012)

> Disculpa una pregunta tu cres que con la cmucam 3 pueda tomar una foto y guardarla en una EEprom para verla via ethernet por un Pic conectado a Ethernet



En teoria yo diria que si...

si tienes una memoria lo suficientemente grande para que quepa la foto o si la envias por partes... y claro, si tienes un modulo usart-ethernet...


----------



## Pull1988 (Abr 23, 2012)

Amigo Reyvilla, acabo de probar el programa en el protoboard, ya esta solucionado en parte el problema, digo en parte porque ahora el problemita q se me esta presentando es que tengo q darle unos 3 a 6 enviar para que se active o desactive algun rele, puesto que como esta ese tiempo de 100 ms y salta a la siguinte subrutina se pone hacer eso en cada serin2 y ahi es donde hay ese retraso, le puse una velocidad de 50 ms y nada y ahora con 10 ms y nada, talves me puedes sugerir algo mas?


----------



## reyvilla (Abr 23, 2012)

Ok fíjate hay dos maneras, una la que ya te indique, otra que te trato por aqui: https://www.forosdeelectronica.com/f24/envio-sms-pbp-65929/index3.html
que es guardar el mensaje y luego hacer una comparación o condición según el mensaje, el tema que te coloque tiene tiempo sin movimiento, en fin es lo mismo que tu quieres lograr hacer. Tu código tiene como condición de recepción 3 alternativas,se utiliza como flag o bandera, si no se recibe esa bandera no recibe el dato siguiente,  el dato verdadero seria el que le sigue. Para Manejar el dato, debido a que los datos son de 8 bits cada uno necesitarías hacer una arreglo de variable para tu mensaje, si el mensaje es "Activar R1", serian 10 datos de 8bits incluyendo el espacio en blanco que también forma parte del mensaje, para un total de 80bits, la variable mas grande es de 16bits que es la word, así que la única manera es utilizando un arreglo de una variable tipo byte, como indica el amigo lubeck en el tema que te coloque, de todas formas voy a ir chequeando a ver si consigo algo aparte y te estoy avisando


----------



## Pull1988 (Abr 23, 2012)

Ok amigo reyvilla voy a seguir intentandolo si logro algo te aviso, muchas gracias


----------



## guigo (Abr 24, 2012)

reyvilla dijo:


> Hola y que has hecho hasta el momento si tienes algo adelantado colócalo para poder ayudarte.
> 
> 
> 
> ...



mira, creo que la idea es que el mensaje que llegue se direccione a pin estableciendo un valor y tenes que utilizar los condicionales " if - then para que el pic te hubique el pin al cual queres darle salida. asumiendo que ya conoces los comandos AT y la comunicacion serial con pic. cuando el comando llegue al pic debe haber un valor entonces lo que tenes que hacer es si ese valor existe entonces 1 en pin. podes guardar ese valor en una variable y cuando le oredenes al pic que si esa variable es igual al valor contenido en el comando entonces el te direcciona de una.



guigo dijo:


> quiciera que me ayudaran con algo:
> 
> pretendo programar un micro para controlar la velocidad de motores con un radio control. la cosa es que quiciera hacer un programa de modo que cuando suba el ancho de pulso del receptor, el ancho de pulso que quiero generar en el micro me baje osea, que la funcion sea inversa.





solucionado el problema, era el calculo que le habia planteado al pic muchas gracias por la respuesta.


----------



## Pull1988 (Abr 24, 2012)

Hola amigo, gracias por tu respuesta, sabes justamente eso pensé en un princio porner un IF THEN, es mas ya lo he puesto, pero sin resultados, lo mas seguro esque lo estoy ubicando mal por eso no consigo nada, talves me podrias ayudar partiendo de ese codigo que el amigo reyvilla lo puso a ubicar los IF y la variable?.
Si conozco los comandos AT y la comunicacion serial.

muchas gracias de antemano


----------



## lubeck (Abr 24, 2012)

amigo pull1988...

que telefono estas usando????(me refiero a marca y modelo) curiosidad mia....

y porque no subes la simulacion en proteus??? no tienes?


----------



## reyvilla (Abr 24, 2012)

Hola lubeck una pregunta, tu conoces los comandos DEBUG Y DEBUGIN del PBP?

Y los as usados?


----------



## lubeck (Abr 24, 2012)

reyvilla dijo:


> Hola lubeck una pregunta, tu conoces los comandos DEBUG Y DEBUGIN del PBP?
> 
> Y los as usados?



nop.. no los he usado y para serte honesto no sabia que existian o mas bien no les habia prestado atencion... pero me suena que se usan en conjunto con algun debugger...

deja leer la ayuda del microcode...


----------



## reyvilla (Abr 24, 2012)

Fijate de yo pense igual y resulta que son para comunicación serial, mira por aca: http://melabs.com/resources/pbpmanual/


----------



## lubeck (Abr 24, 2012)

parece que si es para algun debugger...
como estos...






por que mira lo que dice...


> DEBUG is one of several built-in asynchronous serial functions. It is the smallest of the software generated serial routines. It can be used to send debugging information (variables, program position markers, etc.) to a terminal program like Hyperterm. It can also be used anytime serial output is desired on a fixed pin at a fixed baud rate.


----------



## reyvilla (Abr 24, 2012)

Si eso vi también que puede ser usado como depurador de código, en el manual que yo tengo en español solo tiene el DEBUG y dice lo siguiente:

DEBUG es una de varias funciones seriales asincronicas pre-construidas .Es la más pequeña de las rutinas
seriales generadas por software .Puede ser usada para enviar información de depuración (variables
,posición de marcadores , etc).a un programa terminal como HyperTerm .También se puede usar cuando
se desee salida serial sobre un pin determinado y con un baud rate determinado .


----------



## lubeck (Abr 24, 2012)

pues le doy un 90% que solo sirve para eso y la verdad a mi no me agradan mucho los debuggers... soy mas de probar y programar, probar y programar... y pues con eso de las simulaciones en proteus que son bastante buenas no me llama  la atención buscarle por ese lado de los debuggers...

si me topo con algun dato adicional te echo un grito...


----------



## reyvilla (Abr 24, 2012)

Fijate este codigo:


```
@ device PIC16F72 , xt_osc, wdt_off, pwrt_on, protect_oN
Include "MODEDEFS.BAS"          ' Include Shiftin/out modes
DEFINE DEBUG_REG PORTC
DEFINE DEBUGIN_REG PORTC
DEFINE DEBUGIN_BIT 7
DEFINE DEBUG_BIT 6 
DEFINE DEBUG_MODE 0 		' 1 = Inverted (w/o max) , 0 = true (with max)
DEFINE DEBUGIN_MODE 0
DEFINE DEBUG_BAUD 9600
'-----------------------------------------------------------------
' HARDWARE DEFINES
'-----------------------------------------------------------------
' Define LCD pins
Define Lcd_dreg Porta
Define Lcd_dbit 0
Define Lcd_rsreg Porta
Define Lcd_rsbit 4
Define Lcd_ereg Porta
Define Lcd_ebit 5
'-----------------------------------------------------------------
Define Osc 4                   ' We're using a 4 MHz oscillator
'-----------------------------------------------------------------
    Adcon1 = 7                     ' Set PORTA DIGITAL
    OPTION_REG.7 = 0               ' DISABLE INTERNAL PULLUPS
    Trisa = %00000000              ' SETS ALL PORTA PINS TO OUTPUT
    Trisb = %00000000              ' ALL OUTPUT
    Trisc = %00001011              ' 6 Pins - LCD and 2 Pins RF Module
'-----------------------------------------------------------------    
RELAY1      VAR PORTB.0     ' RELAY 1
RELAY2      VAR PORTB.1     ' RELAY 2
RELAY3      VAR PORTB.2     ' RELAY 3
RELAY4      VAR PORTB.3     ' RELAY 4
RELAY5      VAR PORTB.4     ' RELAY 5
RELAY6      VAR PORTB.5     ' RELAY 6
RELAY7      VAR PORTB.6     ' RELAY 7
RELAY8      VAR PORTB.7     ' RELAY 8
LED         VAR PORTC.4     ' LED (SINK)
RELAY       VAR BYTE        ' RELAY NUMBER
MYDATA      VAR BYTE        ' GENERAL PURPOSE DATA VARIABLE
INDEX       VAR BYTE        ' SMS INDEX NUMBER
I           VAR BYTE        ' GENERAL VARIABLE
Pause 500                   ' Wait .5 second
'-----------------------------------------------------------------    
B2400   Con 16780           ' Inverted 2400 baud for SERIN2

    HIGH LED 
    PORTB = 0		    ' TURN OFF ALL RELAYS

    Lcdout $fe, 1,   "SMS CONTROL"  ' Send to LCD
    Lcdout $fe, $C0, "SMS TEST C5"  ' Second Line
    PAUSE 2000

    ' GOSUB OLD
LOOP:

    Lcdout $fe, 1,   "WAITING 4 SMS"  ' Send to LCD
    DEBUGIN [WAIT("+CMTI:"), SKIP 7 , DEC INDEX]
    Lcdout $fe, $C0, "SMS RX: " , DEC INDEX ' Second Line
    PAUSE 5000
    Lcdout $fe, 1,   "READ MSG "  ' Send to LCD
    DEBUG "AT+CMGR=", DEC INDEX, 13
    'DEBUGIN [WAIT("+CMGR:"), SKIP 51 , DEC MYDATA]
    DEBUGIN [WAIT("+CMGR:"), SKIP 53 , DEC MYDATA]
    Lcdout $fe, 1,   "MYDATA: " , DEC MYDATA   ' Send to LCD
    PAUSE 3000
    
    SELECT CASE MYDATA
    
    CASE 20
        Lcdout $fe, 1,   "RELAY 2"
        Lcdout $fe, $C0, "ON" 
        
    CASE 21
        Lcdout $fe, 1,   "RELAY 2"
        Lcdout $fe, $C0, "OFF" 
    
    CASE 10
        Lcdout $fe, 1,   "RELAY 1"
        Lcdout $fe, $C0, "ON" 
        
    CASE 11
        Lcdout $fe, 1,   "RELAY 1"
        Lcdout $fe, $C0, "OFF" 
        

    CASE 30
        Lcdout $fe, 1,   "RELAY 3"
        Lcdout $fe, $C0, "ON" 
        
    CASE 31
        Lcdout $fe, 1,   "RELAY 3"
        Lcdout $fe, $C0, "OFF" 

    CASE 40
        Lcdout $fe, 1,   "RELAY 4"
        Lcdout $fe, $C0, "ON" 
        
    CASE 41
        Lcdout $fe, 1,   "RELAY 4"
        Lcdout $fe, $C0, "OFF" 


    END SELECT
    
    PAUSE 3000
    Lcdout $fe, 1,   "DELETE SMS MSG"
    Lcdout $fe, $C0, "#:" , DEC INDEX
    DEBUG "AT+CMGD=", DEC INDEX, 13
    PAUSE 3000

GOTO LOOP

END
```

Lo saque de este Link: http://www.picbasic.co.uk/forum/showthread.php?t=3765
Según tengo entendido es para el control de relays a traves de un SMS, por eso mi duda al respecto con esos comandos DEBUG y DEBUGIN  
Quería ver si los ponía a prueba pero aun no se como ya que no tengo un sistema para la recepción de SMS, que modulo uso o que materiales aparte del pic necesito?


----------



## lubeck (Abr 24, 2012)

> Quería ver si los ponía a prueba pero aun no se como ya que no tengo un sistema para la recepción de SMS, que modulo uso o que materiales aparte del pic necesito?




 creo que ya voy entendiendo...

no solo es con los mensajes SMS es una comunicacion serial asincrona normalita y corriente...
la ventaja es que supuestamente utiliza menos codigo... pero suponiendo que utiliza menos codigo algo debe estar sacrificando no?, como algun cequeo de recepcion o envio.... intentare hacer una prueba.. o si gustas tu tambien hazla como si fuera el Serin y serout....

con respecto a como mandar mensajes por SMS, solo necesitas un telefono y tener los codigos AT del telefono, modem o modulo... y conectas como si conectaras pic a pic por usart...
lo dificil es encontrar un telefono que se conecte con el puerto serial porque ya la mayoria son por bluetooth y USB, yo lo hice con un Nokia 3100 y la PC el problema fue que nunca encontre los codigos del Nokia, me aburrio y lo deje.... ahora lo interesante es que venden modulos Bluetooth en 20usd aprox y puedes comunicar cualquier pic con cualquier telefono que tenga bluetooth..


----------



## Pull1988 (Abr 24, 2012)

Amigo ludbeck, estoy por utilizar un modulo gsm marca ZTE ME 3000, que ya viene con el puerto serial, esta por llegarme en los proximos dias de esta semana.

Con respecto a la simulacion en proteus, no la tengo pues yo soy mas de implementarlo directamente en el protoboard

Amigo ludbeck, estoy por utilizar un modulo gsm marca ZTE ME 3000, que ya viene con el puerto serial, esta por llegarme en los proximos dias de esta semana.

Con respecto a la simulacion en proteus, no la tengo pues yo soy mas de implementarlo directamente en el protoboard





reyvilla dijo:


> Fijate este codigo:
> 
> 
> ```
> ...



Amigo reyvilla tu sabes para que pone skip 53, osea yo se que skip es saltar un numero determinado de caracteres, pero porque? especificamente salta 53 en este ejemplo?


----------



## reyvilla (Abr 24, 2012)

Oye la verdad no se es primera vez al igual que lubeck que le presto atencion a estos comandos la verdad nunca los he usado, pero debe referirse a una cadena de caracteres que esta antes del mensaje, en ese caso para ese país y empresa de telefonica en aprticular  la verdad que no estoy seguro


----------



## lubeck (Abr 24, 2012)

> pero porque? especificamente salta 53 en este ejemplo?


DEBUGIN [WAIT("+CMGR:"), SKIP 53 , DEC MYDATA]

Porque el pic va a esperar a que  lleguen los caracteres +CMGR: y despues discrimina 53 caracteres, y despues recibe un byte y lo guarda en mydata que es lo que necesita el que lo programo...

Ejemplo:
el modem manda al pic.:
"+CMGR:Hola estoy mandando un dato para que prenda el Relay 1"

esto es el dato que espera para proceder..."+CMGR:"
estos son 53 caracteres que no sirven..."Hola estoy mandando un dato para que prenda el Relay "
esto es el relay que guarda en mydata..."1"

*Rey...* ya echaste a andar ese ejemplo???? yo no puedo 



YAAAAAAAAAAAAAA PUUUUDEEEEE 


esta bien fregon ese metodo para comunicacion serial... muy bueno... muy bueno...


----------



## reyvilla (Abr 24, 2012)

No aun no me he puesto de verdad, y lo hiciste con el código que te coloque con el mismo pic ?
De que se trata, yo no pude deducir las conexión ya que tiene unas definiciones que no entendí muy bien tienes un esquema para armarlo aquí y ver de que se trata? 
como funciona ?


----------



## lubeck (Abr 24, 2012)

mira lasimulacion, la puse con el 877A pero puede ser cualquiera porque es por software... y use el virtualterminal...
en el virtual pones "+CMTI:12345678" sin las comillas y enter despues pasa al siguiente paso...
si te fijas discrimina el 1234567 y pone el 8....


----------



## reyvilla (Abr 24, 2012)

Si ya vi esta bien bueno, eso facilita la cosa ya que no hay que inventar mucho ya con estoy tendrías lo que quieres, cambiando un poco el código claro esta, ahora voy hacer mas pruebas a ver que se me ocurre y a ver si aprendo mas de este comando. Por cierto lubeck si te fijaste en los DEFINE, a que se refiere cada uno o tienes alguna idea de que pueda ser?

Edit: Ya, que torpe, es igual a las definiciones de un ldc, la diferencia es que aqui defines cual es TX y RX, por otro lado, puedes tener dos modos uno de entrada y otro para salida, muy interesante esto ya que no tiene esas limitaciones como el serin y el serout


----------



## lubeck (Abr 24, 2012)

Estos?

si te refieres a esos es algo parecido a como se usa el LCD...

```
DEFINE DEBUG_REG PORTC 'Este y....
DEFINE DEBUG_BIT 6         ' este es para decir que la salida del Debug (Salida Serial) seria por el puerto RC6
DEFINE DEBUGIN_REG PORTC  'Este y....
DEFINE DEBUGIN_BIT 7     ' este es para decir que la entrada del DebugIn (entrada serial) seria por el puerto RC7
DEFINE DEBUG_MODE 0 		' 1 = Inverted (w/o max) , 0 = true (with max) 
DEFINE DEBUGIN_MODE 0  'estos son el modo invertido si no se usa el max232 y no invertido si  se usa
DEFINE DEBUG_BAUD 9600  'la velocidad en baudios
'-------------------------
```


----------



## reyvilla (Abr 24, 2012)

Exacto, ahora DEBUG es salida y DEBUGIN es la entrada, osea puedes tener dos modos diferentes con los mismo baud de velocidad, digamos entrada normal o verdadera, y salida invertida o falsa.


----------



## lubeck (Abr 24, 2012)

sip... es muy parecido al SEROUT (debug) y SERIN (DEBUGIN) la diferencia es que con el serin serout cada que los utilizas especificas el pin y la velocidad, y aca lo defines desde el principio del programa....

otra ventaja es eso del Wait, SKip,WaitSTR etc, que no se si recuerdas que mi amigo maxtorcampos solicitaba algo asi.... esto le hubiera servido de lujo... 

bueno... ni hablar... hasta ahora lo descubrimos...


----------



## Pull1988 (Abr 24, 2012)

Amigos, partiendo de la muy buena explicacion de ludbeck referente al comando SKIP, pongo a consideracion el siguiente codigo, el cual gracias espera (WAIT) a la palabra "Activar", salta (SKIP) 2 caracteres y despues de establecer la condicionante con el IF-THEN que si la variable tipo byte (B0) sea "1", active el rele, bueno pues el problema esque no activa el rele, pero lo curioso esque si pasa a la siguiente linea, que para el caso es el inicio de la subrutina ENVIAR:, que es simplemente la confirmacion de la activacion del rele mediante comandos AT. Esto lo probe con el terminal del microcode y evidencie lo antes explicado.

Entonces reitero el problema el cual es que el rele no se esta activando, por favor revisenle el codigo y digame cual es el error que estoy cometiendo y la posible solucion.

Muchas gracias


```
include "modedefs.bas"
define OSC 4
CMCON=7
REL1 VAR PORTA.0
RX VAR PORTB.0
TX VAR PORTB.1
B0 VAR BYTE

INICIO:
    SerIn2 TX,16468,[WAIT("Activar"),SKIP 2,DEC B0]
    IF B0="1" THEN
    HIGH REL1
    ENDIF
ENVIAR:
    PAUSE 10000
    serout2 Rx,16468,["AT+CMGF=1",13]
    PAUSE 50
    serout2 Rx,16468,["AT+CMGS=",34,"092661649",34,13]
    PAUSE 50
    SEROUT2 Rx,16468,["R1 activado",26]
    pause 50
GOTO INICIO
```


----------



## lubeck (Abr 24, 2012)

el serin2 y el serout2 es la combinacion del uso del Serin serout y del debug debugin... 

ya aprendi algo nuevo hoy....

amigo pull1988, te recomiendo muy ampliamente que utilices el proteus....  o que pongas el esquema... honestamente a mi me da flojera siquiera tratar de entender que rayos quieres que haga.. con la simulacion ya te estuviera intentando ayudar...


----------



## Pull1988 (Abr 24, 2012)

jajajajaja ok amigo ludbeck voy a poner un esquema enseguida lo hago y si el serin2 y el serout2 son muy completos y me han ayudado a resolver muchos problemas de comunicacion serial, sobretodo el WAIT


----------



## reyvilla (Abr 24, 2012)

Ya somos dos lubeck, concuerdo contigo hoy aprendimos algo nuevo, y conrespecto al esquema amigo Pull1988 te iba a decir algo similar, ya que no contamos con el circuito que tu tienes para hacer las pruebas y no hay mejor manera que un esquema en proteus para probarlo.


----------



## Pull1988 (Abr 24, 2012)

Bueno amigos ahi lo tienen el esquema en proteus, disculpen cualqueir error, puesto q yo no utilizo mucho el simulador, prefiero hacerlo en el protoboard directamente. Les explico brevemente los pines del PIC:
el puerto A.0 es la salida al rele mediante el transistor 2N2222.
los purtos B.0 y B.1 son RX y TX respectivamente, del cable serial.
los puertos A.6 y A.7 son para el Oscilador de 4MHz, no lo puse puesto q no lo encontré, pido disculpas por mi ignorancia para con el simulador.

Esos son los puertos q utilizo hasta el momento prentendo utilizar los puertos desde el A.0 hasta el A.5 para las salidas a los reles.

Cualquier inquietud estaré atento para esclarecerselas.

Muchas gracias


----------



## reyvilla (Abr 24, 2012)

Amigo Pull1988, unas recomendaciones si quieres tomarlas, si bien esta demostrado, hablo por mi propia experiencia, las simulaciones en proteus son yo diria un mas de un 70% confiables, eso quiere decir que si corre en el proteus tienes un 70% si no mas de probabilidades de que funcione en la practica real, aparte del ahorro de tiempo y coste, si conectas algo mal o configuras o programas mal en el proteus, fácil lo corriges de manera rápida y ya, en cambio en la practica real puede costarte mucho tiempo aparte de dinero, por otro lado, en la programación para garantizar un mejor funcionamiento, las configuraciones de los fuses y entradas y salidas del microcontrolador, ya que de no hacerlo puede causarte mas que un dolor de cabeza, lo digo por que me paso mucho. Ya terminando con esto, revise y verifique tu código, lo simule y corregí. Solo falta declaración de fuses y entradas y salidas, y en la parte de serin2, tu estas transformando en dato en decimal por lo tanto debes tratarlo como decimal y no como dato ascii o AT. Otra cosa desde hace un tiempo yo para estar seguro y diferencias que es variable y que es un pin, utilizo el comando symbol para renombrar los pines, esto es opcional. 
El codigo si funciona solo falta lo que te dije revisa y me avisas.


----------



## Pull1988 (Abr 24, 2012)

amigo reyvilla muchas gracias x tu respuesta, sabes q en lo personal no utilizo fuses, bueno de hecho asi me enseñaron en la universidad y me he acostumbrado a eso, pero tal ves tu me puedes decir q fuses me hacen falta para ponerlos; con respecto a la parte del seri2 en cual tu mencionas que lo utlizo como decimal, pues efectivamente tienes razon, pero en ese caso que podria poner?.

Muchas gracias por tus sugerencias y consejos, los tendré muy presentes, sino es mucha molestia me gustaria que pongas el codigo para ver cuales fueron mis errores y que me falta.


----------



## lubeck (Abr 24, 2012)

A mi no me funciona  
a que velocidad se supone que esta o lo quieres configurar?


----------



## Pull1988 (Abr 24, 2012)

la velocidad es 9600 baudios con logica invertida.
16468=9600


----------



## reyvilla (Abr 24, 2012)

Ok el codigo lo modifique para que trabaje a 2400 invertido, ya que no se calcular el que tu hicistes que es 16468, trate de calcularlo pero no pude...Dime como lo calculaste 


```
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_NOCLKOUT 
@ DEVICE WDT_OFF        
@ DEVICE PWRT_OFF       
@ DEVICE MCLR_OFF       
@ DEVICE BOD_OFF        
@ DEVICE LVP_OFF        
@ DEVICE CPD_OFF        
@ DEVICE PROTECT_OFF
 
include "modedefs.bas"
DEFINE OSC 4
CMCON=7
TRISA = %00000000 'todo el puerto a como salida
TRISB = %00000001 'todo el puerto b como salida menor portb.0 es entrada
SYMBOL REL1 = PORTA.0
SYMBOL RX = PORTB.0   'RX ENTRADA 
SYMBOL TX = PORTB.1   'TX SALIDA
B0 VAR BYTE


INICIO:
SerIn2 RX,16780,[WAIT("Activar"),SKIP 2,DEC B0]
IF B0 = 1 THEN
HIGH REL1
REL1 = 1
PAUSE 100
ENDIF
ENVIAR:
PAUSE 1000
serout2 Tx,16780,["AT+CMGF=1",13]
PAUSE 1000
serout2 Tx,16780,["AT+CMGS=",34,"092661649",34,13]
PAUSE 1000
SEROUT2 Tx,16780,["R1 activado ",#B0,26]
PAUSE 1000
GOTO INICIO
```


----------



## lubeck (Abr 24, 2012)

rey a mi me avienta basura... le hize igual que tu y no me manda nada...

definitavamente yo creo que el error esta en la configuracion de los baudios paridad polaridad etc..


----------



## reyvilla (Abr 24, 2012)

No fijate yo lo cambie a 16780 que es = 2400 baud , sin paridad , invertido
pero tienes que enviarle Activar, osea con la primera letra en mayuscula y con 2 espacios y luego enter y veras como si activa el rele 1, te dejo el esquema modificado.

Edit: por cierto si quieres cámbiale el tiempo 
ENVIAR:
PAUSE 10000
a 1000 para que sea mas rápida la respuesta


----------



## lubeck (Abr 24, 2012)

O si ya...


```
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_NOCLKOUT 
@ DEVICE WDT_OFF        
@ DEVICE PWRT_OFF       
@ DEVICE MCLR_OFF       
@ DEVICE BOD_OFF        
@ DEVICE LVP_OFF        
@ DEVICE CPD_OFF        
@ DEVICE PROTECT_OFF
 
include "modedefs.bas"
DEFINE OSC 4
CMCON=7
TRISA = %00000000 'todo el puerto a como salida
TRISB = %00000001 'todo el puerto b como salida menor portb.0 es entrada
SYMBOL REL1 = PORTA.0
SYMBOL RX = PORTB.0   'RX ENTRADA 
SYMBOL TX = PORTB.1   'TX SALIDA
B0 VAR BYTE
[COLOR="Red"]serout2 Tx,16780,[13] 'ponle esta linea tambien[/COLOR]

INICIO:
SerIn2 RX,16780,[WAIT("Activar"),SKIP 2,DEC B0]
IF B0 = 1 THEN
HIGH REL1
REL1 = 1
PAUSE 100
ENDIF
ENVIAR:
PAUSE 1000
serout2 Tx,16780,["AT+CMGF=1",13]
PAUSE 1000
serout2 Tx,16780,["AT+CMGS=",34,"092661649",34,13]
PAUSE 1000
SEROUT2 Tx,16780,["R1 activado ",#B0,26]
PAUSE 1000
GOTO INICIO
```

si ya vi porque me mandaba basura... fijate y el primer envio es basura...


----------



## Pull1988 (Abr 24, 2012)

a ya amigo reyvilla ahora te entendi lo de los fuses, te comento, yo no los utilizo porque yo quemo el PIC con el programa pickit 2 y utilizo el ICprog para activar o desactivar el Boden, MCRL, etc,etc, entonces ahi se genera una palabra de configuracion en hexadecimal, esa palabra la convierto en binario y ese codigo en binario lo introduzco en el pickit2, parece largo el proceso pero no lo es en realidad.

Ahora paso a indicarte como calculé los 9600 baudios con logica invertida:

la ecuacion para calcular los baudios con logica normal es: (1000000/9600)-20=84.1666...que cojiendo la parte entera es 84.
luego de eso se lo convierte a binario: 1010100 q para este caso es de 7 bits, despues se debe completar hasta el bit 13 con paridad nula y el bit 14 para debe ser 1 para q indique q es logica negada o invertida osea: 10000001010100 que corresponde al codigo decimal 16468.

Espero haberme explicado, sino culquier duda estaré presto a responderla.

Tu codigo ya activa el rele?





reyvilla dijo:


> No fijate yo lo cambie a 16780 que es = 2400 baud , sin paridad , invertido
> pero tienes que enviarle Activar, osea con la primera letra en mayuscula y con 2 espacios y luego enter y veras como si activa el rele 1, te dejo el esquema modificado.
> 
> Edit: por cierto si quieres cámbiale el tiempo
> ...



Amigo reyvilla solo se activa con la palabra "Activar" y dos espacios???, entonces si queiro activar un segundo rele tendría que poner otra palabra ya que solo con esa palabra y dos espacios se activaria cualquier rele.


----------



## reyvilla (Abr 24, 2012)

Lubeck a que se debe ese primer envio que es basura, ya que si lo vuelves activar si lo envía bien.

Amigo pull1988, ya me sospechaba algo asi mas me faltaba ese ultimo dato del arreglo de los últimos bit, gracias por el dato, y si activa el rele, pero a tu código ahora es que le falta para que sea una aplicación real, ya que si es un solo rele no habria problema pero si son mas, tendrías que enviar el dato del rele activado, como lo hice en la ultima linea, osea enviar lo que recibiste, o en tal caso verificar el pin del rele que este realmente activo, digamos que mandas activar el rele 1, en el receptor debes responder  cual fue el dato recibido y si es correcto activas el rele correspondiente y luego indicas que fue activado.


----------



## lubeck (Abr 24, 2012)

> Lubeck a que se debe ese primer envio que es basura, ya que si lo vuelves activar si lo envía bien.


se me ocurre que al hacer el primer envio cambia el puerto como salida o algo y el primer bit no lo manda bien... si me explico?...


----------



## Pull1988 (Abr 24, 2012)

reyvilla dijo:


> Lubeck a que se debe ese primer envio que es basura, ya que si lo vuelves activar si lo envía bien.
> 
> Amigo pull1988, ya me sospechaba algo asi mas me faltaba ese ultimo dato del arreglo de los últimos bit, gracias por el dato, y si activa el rele, pero a tu código ahora es que le falta para que sea una aplicación real, ya que si es un solo rele no habria problema pero si son mas, tendrías que enviar el dato del rele activado, como lo hice en la ultima linea, osea enviar lo que recibiste, o en tal caso verificar el pin del rele que este realmente activo, digamos que mandas activar el rele 1, en el receptor debes responder  cual fue el dato recibido y si es correcto activas el rele correspondiente y luego indicas que fue activado.



Amigo reyvilla sabes que a mi no se me activa le pongo Activar y 2 espacios tal como dijiste y nada sin resultados


----------



## lubeck (Abr 24, 2012)

es Activar + 2 espacios + 1 + ascii 13

Palabra "Activar" mas dos espacios mas un uno mas el retorno ascii 13


----------



## guigo (Abr 24, 2012)

Pull1988 dijo:


> Hola amigos, quisiera por favor alguien me ayudara intruyendome un poco sobre el siguiente tema que pongo a su consideracion:
> Sucede que estoy por presentar mi proyecto de grado el cual consiste en automatizar mi departamento usando PICs; bueno basicamente lo que hace el PIC es recibir un SMS enviado desde cualquier movil y accionar diferentes cosas en base a reles, en otras palabras el PIC recibe un mensaje y este le manda una señal a un o varios reles y estos proceden abrise o cerrarse; el problema que se me ha presentado esque no puedo independizar los reles, osea si quiero activar el rele dos, primero debo activar el rele uno, porque en el codigo fuente esta primero la linea que contiene al rele uno, entonces quiero saber si hay la posiblidad de saltarme esas lineas de codigo para que no siga el orden logico o bien sea poner condicionantes para que si a determinada accion se active cualquier rele ya sea el uno el dos, el tres, etc.
> 
> Adjunto mi codigo fuente que este hecho en Basic, en microcode studio.
> ...



parce yo creo que el problema esta en igualar las variables, es decir, que mensaje se envia para activar el rele. supongamos que en el mensaje vas a enviar un numero cualquiera entonces tenes que  guardar ese valor en una variable y luego decirle al programa si esa variable es igual al numero recibido entonces 1 a pin.


x var byte

if x = 24 then

porta.0 = 1

endif.

he leido algo de comandos AT, la verdad es que no le he puesto mucha atencion el serin guarda el valor entrante en una variable, esa es la variable a la que tenes que condicionar.

pillate este ejemplo a ver si te sirve:

INCLUDE "modedefs.bas" ;incluyen los modos de comunicación
@ device XT_OSC ;cambia a oscilador XT en el IC-Prog
led VAR portb.7 ;nombre led al puerto b.7
dat VAR BYTE ;variable de almacenamiento de 255
num VAR BYTE ;variable para almacenar el contador
num=0 ;contenido inicial para la variable num
GOSUB ledr ;ir a leds para saber si ya arrancó el PIC
Inicio:
SERIN portb.0,T2400,dat ;esperar el dato y guardarlo en dat
IF dat = "C" THEN contar ;si dat es una C empiece a contar
GOSUB ledr
GOTO inicio ;ir a esperar el siguiente caracter
contar:
HIGH led ;led sólo encendido indica enviando datos
SEROUT portb.1,T2400,[#num,"-"] ;enviar el contenido decimal de la variable num
;seguido de un signo menos
num=num+1 ;incrementar la variable 1 x 1
PAUSE 1000 ;esperar 1 s
GOTO contar ;ir a subrutina contar
ledr: ;subrutina ledr
HIGH led
PAUSE 200
LOW led
RETURN
END


----------



## Pull1988 (Abr 24, 2012)

Bueno antes que nada confirmado ya se me activo el rele tuve que cambiarle el al seri2 le corresponde el Tx, que es el puertob.1 y serout2 RX que es el puerto b.0 tu le tienes al reves amigo reyvilla, gracias por ese codigo mañana lo reviso para ya continuar haciendolo con mas reles pero por el momento se me ocurre lo siguiente. 
Para el rele uno es Activar  1 y un enter si estamos a traves de un hyperterminal, tal cual esta escrito ahi, por lo tanto para el rele dos deberia ser Activar  2 diciendole que si B0=2 active el rele 2


----------



## reyvilla (Abr 24, 2012)

Si de echo por eso te dije que hay que estar pendiente recuerda que serout es una salida por lo tanto correponde a tx y de igual forma para rx aqui un video de el codigo y como funciona este activa hasta 5 rele:


----------



## Pull1988 (Abr 24, 2012)

Bueno lo importante esque poco a poco vamos depurando esta situacion, ahora lo malo esq con cualquier numero tu puedes activar el mismo rele, si pensamos en un caso real, estaria mal q mandemos un SMS con la palabra Activar  2 por ejm. y se active unicamente el rele 1, era por esa razon que yo al principio le puse B0="1"para que solo me reconociera el 1 y asi hacer una difrenciacion de los reles, osea si quieria el rele tres por ejm B0 tendria q ser igual a "3" para que cuando ponga Activar  3 solo se active el rele 3, eso deberiamos depurarle amigos, el día de mañana continuaré trabajando en eso puesto que para mi ha sido el final en este día, ha sido muy sacrificado pero muy productivo este día, les agradezco por su interes, una buena noche


----------



## reyvilla (Abr 24, 2012)

Si te fijas bien en el video activo dependiendo del mensaje una salida del puerto A, si es 1 activa el pin 0 del puerto A, si el mensaje es 2 activa el pin 1 del puerto A y asi sucesivamente chequea bien y veras

El codigo es este:

```
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_NOCLKOUT 
@ DEVICE WDT_OFF        
@ DEVICE PWRT_OFF       
@ DEVICE MCLR_ON       
@ DEVICE BOD_OFF        
@ DEVICE LVP_OFF        
@ DEVICE CPD_OFF        
@ DEVICE PROTECT_OFF
 
include "modedefs.bas"
DEFINE OSC 4
CMCON=7
TRISA = %00000000 'todo el puerto a como salida
TRISB = %00000001 'todo el puerto b como salida menor portb.0 es entrada
SYMBOL REL1 = PORTA.0
SYMBOL REL2 = PORTA.1
SYMBOL REL3 = PORTA.2
SYMBOL REL4 = PORTA.3
SYMBOL REL5 = PORTA.4
SYMBOL REL6 = PORTA.5

SYMBOL RX = PORTB.0   'RX ENTRADA 
SYMBOL TX = PORTB.1   'TX SALIDA
B0 VAR BYTE
TX = 1
'serout2 Tx,16780,[13] 'ponle esta linea tambien

INICIO:
SerIn2 RX,16780,[WAIT("ACTIVAR"),SKIP 2,DEC B0]

SELECT CASE B0

CASE 0
serout2 Tx,16780,["ERROR DE COMANDO"]
GOTO INICIO
CASE 1
HIGH REL1
PAUSE 1000
GOTO ENVIA2
GOTO INICIO

CASE 2
HIGH REL2
PAUSE 1000
GOTO ENVIA2
GOTO INICIO
CASE 3

HIGH REL3
PAUSE 1000
GOTO ENVIA2
GOTO INICIO
CASE 4

HIGH REL4
PAUSE 1000
GOTO ENVIA2
GOTO INICIO
CASE 5

HIGH REL5
PAUSE 1000
GOTO ENVIA2
GOTO INICIO
end select

GOTO INICIO
ENVIA2:
serout2 Tx,16780,["AT+CMGF = ",#B0,13]
PAUSE 1000
serout2 Tx,16780,["AT+CMGS=",34,"092661649",34,13]
PAUSE 1000
SEROUT2 Tx,16780,["R1 activado ",#B0,26]
GOTO INICIO
```


----------



## Pull1988 (Abr 24, 2012)

a ok no me fije en eso, pero le modificaste el programa? pusiste algo para hacer ese reconocimiento??


----------



## reyvilla (Abr 24, 2012)

No fue mucho casi todo es copiar y pegar y colocar un select case y listo, claro esta ese seria la base del programa como tal, ya que falta la parte de desactivar y la parte de verificación, para saber si esta activo o no el rele


----------



## Pull1988 (Abr 24, 2012)

si tienes razon pero una pregunta para que sirve esa linea de "ERROR DE COMANDO"?
Por cierto muy util ese select, se me ocurre que para desactivar solo se coloque en la rutina INICIO un serin2 con la palabra desactivar y hacer otro select para desactivar los 5 reles


----------



## reyvilla (Abr 24, 2012)

Es una opción que se me ocurrió, en caso de recibir un comando no deseado o que no este dentro de los comandos normales, en fin puedes quitarlo, y bueno eso seria una idea para empezar ya lo demas esta de parte de cada quien ahora espero tu gran aporte cuando lo termines


----------



## Pull1988 (Abr 24, 2012)

por supuesto amigo reyvilla, ya mañana todo lo que yo vaya avanzando lo iré compartiendo con Uds.


----------



## lubeck (Abr 24, 2012)

Prueben este....

```
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_NOCLKOUT 
@ DEVICE WDT_OFF        
@ DEVICE PWRT_OFF       
@ DEVICE MCLR_ON       
@ DEVICE BOD_OFF        
@ DEVICE LVP_OFF        
@ DEVICE CPD_OFF        
@ DEVICE PROTECT_OFF
 
DEFINE OSC 4
CMCON=7
TRISA = %00000000 'todo el puerto a como salida
TRISB = %00000001 'todo el puerto b como salida menor portb.0 es entrada

SYMBOL RX = PORTB.0   'RX ENTRADA 
SYMBOL TX = PORTB.1   'TX SALIDA
B0 VAR BYTE
TX = 1
serout2 Tx,16780,[13] 'ponle esta linea tambien

INICIO:
SerIn2 RX,16780,[WAIT("ACTIVAR"),SKIP 2,DEC B0]

PortA=PortA+DCD B0

serout2 Tx,16780,["AT+CMGF = ",#B0,13]
PAUSE 1000
serout2 Tx,16780,["AT+CMGS=",34,"092661649",34,13]
PAUSE 1000
SEROUT2 Tx,16780,["R1 activado ",#B0,26]
GOTO INICIO
```

empieza en rele 0 osea "activar  0"


----------



## Pull1988 (Abr 24, 2012)

amigo ludbeck me imagino que ese DCD=DEC verdad?


----------



## lubeck (Abr 24, 2012)

> amigo ludbeck me imagino que ese DCD=DEC verdad?



no... DCD mete un 1 segun la posicion que indiques digamos DCD 2 pone 00000100

en este caso metemos DCD B0 donde B0 es el valor del rele y lo agregamos al valor del puerto A, y se reduce un buen el codigo


----------



## reyvilla (Abr 24, 2012)

Muy bueno ese también, Aunque si el dato que llega a B0 es otro activa otra cosa seria lo unico, aunque esta genial porque como indicas reduce bastante el código buena esa


----------



## Pull1988 (Abr 24, 2012)

muy ingenioso ludbeck, muy buen aporte, la pregunta es la siguiente, para mi caso como utlizo el 628A los puertos A.6 y A.7 son para el oscilador, no le afectará a este que esos puesrtos cambien de estado? porque por lo que veo se va a utlizar todo el puerto A.

tambien habria que probarle poniendo no en orden logico osea no partiendo de ACTIVAR 0  sino de cualquier rele osea un ACTIVAR 4 para que se active solo el 4 y no los demas, osea en desorden si permite eso?


----------



## lubeck (Abr 24, 2012)

Rey....
 no, si no llega de 0 a 7 no creo que haga nada con los reles... no lo he probado... pero no puede ser, ademas de que el RA5 no funcionaria porque ese es solo de entrada.. 

por otro lado se pude poner un limitador como:
If B0>7 then Goto inicio 

despues de la linea de recepcion... pero bueno es otra de tantas maneras de hacerlo...


----------



## Pull1988 (Abr 24, 2012)

tienes toda la razon ludbeck hay miles de caminos para el mismo fin


----------



## reyvilla (Abr 24, 2012)

Si y tienes razon solo funciona del 0 al 5 pero como 0 no forma parte seria
 If B0=0 and B0>7 then Goto inicio


----------



## Pull1988 (Abr 24, 2012)

pero hay otra cosa q estamos olvidando que si yo activo el rele 4 por ejm debe llegarme un SMS que el rele 4 esta activado o desactivado segun sea el caso, por para el ejm de ludbeck solo salta a la siguiente linea que corresponde al SMS de "R1 activado"por lo tant tendiamos que direccionar con un goto o gosub a cualquier subrutina que contenga los mensajes de confirmacion


----------



## lubeck (Abr 24, 2012)

bueno es que ahi ya tendrias que pensar que y que va a hacer el micro... como Activar o Desactivar, y pues ya no seria lo mismo... osea la idea en general si pero con modificaciones como mas parametros para decir si es para activar o desactivar, consulta de estado, etc...

bueno tienes un largo camino por recorrer... y yo ya me voy a la camita...

buenas noches... a ambos....


----------



## Pull1988 (Abr 24, 2012)

listo amigo ludbeck lo importante esq la idea base ya esta lo demas viene por añadidura, buena noche


----------



## reyvilla (Abr 25, 2012)

Mañana continuo por aca mucho éxito amigos buenas noches


----------



## Pull1988 (Abr 25, 2012)

buenas noches amigo


----------



## biker2k3 (Abr 25, 2012)

Alguien me puede ayudar es con un programa en PROTON que es muy similar a PBP

El tema es asi es un control remoto, quiero que este en modo sleep hasta que aprete un boton, tengo 3 botones en GP1, GP4 y GP5




> Device 12F683
> Config INTRC_OSC_NOCLKOUT,WDT_OFF,MCLRE_OFF,CP_Off,PWRTE_ON
> All_Digital=True   ' Coloca todo los pines como digitales (PBP alldigital)
> 
> ...



El programa anda perfecto si borro la instruccion "sleep" pero si la dejo no se despierta nuncaaa


----------



## lubeck (Abr 25, 2012)

mmm primero... para que quieres que se "duerma"???? si es para bajar el consumo, date cuenta que un micro consume algo asi como 20mA, digamos en stanby... lo de dos LEds... es mmuy poco...


----------



## biker2k3 (Abr 25, 2012)

lubeck dijo:


> mmm primero... para que quieres que se "duerma"???? si es para bajar el consumo, date cuenta que un micro consume algo asi como 20mA, digamos en stanby... lo de dos LEds... es mmuy poco...



Es un control remoto con una pilita CR2032 (d eunos 230mAh), por eso tiene que consumir muy poco en reposo tiene que durar mucho tiempo


----------



## lubeck (Abr 25, 2012)

ya probaste poner Sleep 10

donde 10 es la duracion que esta dormido...

o la funcion NAP


----------



## J2C (Abr 25, 2012)

Biker2k3



biker2k3 dijo:


> ..... El programa anda perfecto si borro la instruccion "sleep" pero si la dejo no se despierta nuncaaa


En PROTON+ Compiler Development Suite debes utilizar la sentencia:


```
SLEEP [[I][COLOR=royalblue]tiempo[/COLOR][/I]]
```
Que encontraras en la página 371 de 405 del archivo *Proton Users Guide*. 
donde _tiempo_ es un número de 1 a 65535 y donde cada unidad representa 1 seg. Esta función en PROTON+ usa el WatchDogTimer que tu has deshabilitado.


También puedes utilizar la función Sleep directamente en ASM colocada dentro de tu programa en PROTON de la siguiente manera:


```
ASM
[[I]label[/I]] SLEEP
ENDASM
```
Para lo cual deberas leer en la *Datasheet del Pic12F683* la página N° 110 de 176. 

El Proton+ no soporta la función *NAP* que posee el *PicBasicPro* que además solo coloca al Pic en Sleep por un maximo de 2,304 Segundos (menos de 2 seg. y medio). 



Saludos, JuanKa.-


----------



## Pull1988 (Abr 25, 2012)

reyvilla dijo:


> Mañana continuo por aca mucho éxito amigos buenas noches



Hola amigo Reyvilla retomando lo de ayer he avanzado en el codigo, bueno el problemita que tengo esque tengo que poner algunos enter para que se active o desactive el rele, puesto que como esta en la línea del SERIN2 pongo un pause de 100ms y luego de eso que vaya al otro SERIN2, por lo tanto como esta en ese bucle, si el rele esta desactivado yo pongo "Activar R1" y si no cae justo en la linea que contiene esa palabra toca volver a enviar osea teclear enter.

Por otro lado vi que ya no es necesario poner la instruccion SKIP, puesto que con el WAIT es mas q suficiente.

Si puedes revisale y simulale por favor y me comentas que paso.


```
include "modedefs.bas"
DEFINE OSC 4
CMCON=7
TRISA = %00000000 'todo el puerto a como salida
TRISB = %00000001 'todo el puerto b como salida menor portb.0 es entrada
SYMBOL REL1 = PORTA.0
SYMBOL REL2 = PORTA.1
SYMBOL REL3 = PORTA.2
SYMBOL REL4 = PORTA.3
SYMBOL REL5 = PORTA.4
SYMBOL REL6 = PORTA.5

SYMBOL RX = PORTB.0   'RX ENTRADA 
SYMBOL TX = PORTB.1   'TX SALIDA
B0 VAR BYTE
B1 VAR BYTE
;TX = 1
'serout2 Tx,16780,[13] 'ponle esta linea tambien

INICIO:
    GOTO ACTIVAR

ACTIVAR:
    SerIn2 tX,16468,100,DESACTIVAR,[WAIT("Activar R"),DEC B0]
    
    SELECT CASE B0

        CASE 0
            serout2 RX,16468,["ERROR DE COMANDO"]
            GOTO INICIO

        CASE 1
            HIGH REL1
            PAUSE 1000
            GOTO ENVIAR1
            GOTO INICIO

        CASE 2
            HIGH REL2
            PAUSE 1000
            GOTO ENVIAR2
            GOTO INICIO

        CASE 3
            HIGH REL3
            PAUSE 1000
            GOTO ENVIAR3
            GOTO INICIO
    end select
    GOTO INICIO
    
DESACTIVAR:
    SerIn2 tX,16468,100,INICIO,[WAIT("Desactivar R"),DEC B1]  
    
    SELECT CASE B1

        CASE 0
            serout2 RX,16468,["ERROR DE COMANDO"]
            GOTO INICIO

        CASE 1
            LOW REL1
            PAUSE 1000
            GOTO DESACTIVAR1
            GOTO INICIO

        CASE 2
            LOW REL2
            PAUSE 1000
            GOTO DESACTIVAR2
            GOTO INICIO

        CASE 3
            LOW REL3
            PAUSE 1000
            GOTO DESACTIVAR3
            GOTO INICIO
    end select
    GOTO INICIO

ENVIAR1:
    serout2 RX,16468,["AT+CMGF = ",#B0,13]
    PAUSE 1000
    serout2 RX,16468,["AT+CMGS=",34,"092661649",34,13]
    PAUSE 1000
    SEROUT2 RX,16468,["R1 activado ",#B0,26]
    GOTO INICIO
    
ENVIAR2:
    serout2 RX,16468,["AT+CMGF = ",#B0,13]
    PAUSE 1000
    serout2 RX,16468,["AT+CMGS=",34,"092661649",34,13]
    PAUSE 1000
    SEROUT2 RX,16468,["R2 activado ",#B0,26]
    GOTO INICIO
    
ENVIAR3:
    serout2 RX,16468,["AT+CMGF = ",#B0,13]
    PAUSE 1000
    serout2 RX,16468,["AT+CMGS=",34,"092661649",34,13]
    PAUSE 1000
    SEROUT2 RX,16468,["R3 activado ",#B0,26]
    GOTO INICIO
    
DESACTIVAR1:
    serout2 RX,16468,["AT+CMGF = ",#B0,13]
    PAUSE 1000
    serout2 RX,16468,["AT+CMGS=",34,"092661649",34,13]
    PAUSE 1000
    SEROUT2 RX,16468,["R1 desactivado ",#B0,26]
    GOTO INICIO
    
DESACTIVAR2:
    serout2 RX,16468,["AT+CMGF = ",#B0,13]
    PAUSE 1000
    serout2 RX,16468,["AT+CMGS=",34,"092661649",34,13]
    PAUSE 1000
    SEROUT2 RX,16468,["R2 desactivado ",#B0,26]
    GOTO INICIO
    
DESACTIVAR3:
    serout2 RX,16468,["AT+CMGF = ",#B0,13]
    PAUSE 1000
    serout2 RX,16468,["AT+CMGS=",34,"092661649",34,13]
    PAUSE 1000
    SEROUT2 RX,16468,["R3 desactivado ",#B0,26]
    GOTO INICIO
```

Amigo ludbeck si puedes revisale este codigo.

gracias


----------



## lubeck (Abr 25, 2012)

> El Proton+ no soporta la función NAP que posee el PicBasicPro que además solo coloca al Pic en Sleep por un maximo de 2,304 Segundos (menos de 2 seg. y medio).



oki.... no sabia eso... casi proton no lo he usado...  estaba adivinando, como dicen "quien quite es chicle y pega" 

Gracias por la aclaracion JuanKa....

*Pull*

mmmm... como que no me agrada mucho ese codigo... donde entra al bucle "desactivar"????


----------



## Pull1988 (Abr 25, 2012)

Si amigo creeme que a mi tampoco me agrada mucho q digamos, sucede que esta en un bucle entre el primero serin2 y el segundo serin2 puesto que: SERIN2 RX,16468,100,DESACTIVAR,[WAIT("Activar R"),DEC B0], osea si no ve la palabra "Activar R", pasa a DESACTIVAR en la cual esta contenido el: SerIn2 tX,16468,100,INICIO,[WAIT("Desactivar R"),DEC B1], SI no recibe la palabra "Desactivar R" vuelve a inicio, y asi se mantiene hasta que vea una de esas dos palabras


----------



## lubeck (Abr 25, 2012)

mmm.. no me refiero a que como lo tienes se mantiene dentro del bucle "Activar" si llega algo se va a los bucles enviar1 enviar 2 etc y de ahi se va de nuevo a el bucle "Activar y ahi se mantiene...

la pregunta que te debes hacer es cuando va a pasar por el bucle "Desactivar", si no se me pasa por alto algo nunca va a pasar por ahi asi como lo tienes... 

a mi se me ocurre que desde el Modem debes de mandar algo asi como "AccionA" o "AccionD" y de ahi se va a un bucle que espere a que se reciba "Activar 1" o "Desactivar 2"... segun sea el caso


----------



## Pull1988 (Abr 25, 2012)

ok voy a seguir haciendo pruebas, gracias por tus recomendaciones


----------



## biker2k3 (Abr 25, 2012)

J2C dijo:


> Biker2k3
> 
> 
> En PROTON+ Compiler Development Suite debes utilizar la sentencia:
> ...




Hola gracia spor la respuesta. Yo mire el manual del proton que tengo yo y dice que poniendo solo "sleep" el pic queda dormido hasta que ocurra una interrupcion. Tambien dice que hay que activar las pull-up pero mi programa y placa ya esta armado con pull-dowm. Y no se porque dice que hay que poner en cero las interrupciones globales, osea INTCON.7

Ahora me esta consumiendo 4.27mA osea que con la CR2032 me duraria 56horas con suerte y sin usarlo.

Igual yo en la protoboard lo tengo alimentado con una bateria de celular, y ahi no me consume nada, porque el positivo del pic esta desconectado, entra por el pulsador cuando lo apreto. Pero si le pongo la CR2032 es como que no le da la potencia y prende muy poco el infrarrojo y no anda.

Probe poner una pilita de 12v con un 78L05 pero el regulador me comio la pila en una noche


----------



## dabopeyton (Abr 26, 2012)

buenos dias amigos, necesito ayuda o consejos con respecto a que estoy realizando una caminadora con control de pulsación cardíaca, necesito saber que comando puedo utilizar para ir variando la velocidad del motor dependiendo a las pulsaciones que tenga a la entrada. un ejemplo: si en la entrada tengo 120 pulsaciones por min necesito que el motor baje su velocidad.
y necesito hacer por lo menos 4 velocidades. si tienen algun ejemplo mejor. espero su ayuda.


----------



## Deca (Abr 26, 2012)

Hola!
Recientemente estoy aprendiendo a programar en PICBASIC y me gustaría que me ayudaran a aclarar unas dudas que tengo.

Ahí va la primera:

Si deseo mostrar un mensaje en una Pantalla LCD es algo fácil y sin misterio pero mi pregunta es, es posible mostrar variables sin alargar mucho el código. me explico

Queremos mostrar en una pantalla 20x4 en la ultima fila la variable VOLUME:

Definimos VOLUME = 31.5 − [0.5 • (255 − N)]

N en este caso es una variable de longitud de BYTE (8) que es mandada a través del comando SHIFTOUT.

mi interés en este caso seria que cuando cambiara N se calculara en la ecuación y se mostrara en pantalla. También pensé en definir cada numero N y corresponderlo con un mensaje diferente pero me gustaría saber si esto es posible.

Ahí va la siguente:

Si queremos definir un pulsador  que al ser pulsado encienda un PIN usamos la siguiente sintaxis

SI el puerto A.0 = 1 entonces Puerto B.0 =1

esta sintaxis entiendo que es un pulsador como tal que solo muestra estado lógico en el Pin B.0 alto cuando el pin A.0 es Alto también.

mi pregunta es, como podría hacer para definir un interruptor, es decir, si pulso una vez mantiene el estado alto y si vuelvo a pulsarle mas tarde vuelva a el bajo

Espero que me ayuden, muchas gracias desde ya.


----------



## reyvilla (Abr 26, 2012)

dabopeyton dijo:


> buenos dias amigos, necesito ayuda o consejos con respecto a que estoy realizando una caminadora con control de pulsación cardíaca, necesito saber que comando puedo utilizar para ir variando la velocidad del motor dependiendo a las pulsaciones que tenga a la entrada. un ejemplo: si en la entrada tengo 120 pulsaciones por min necesito que el motor baje su velocidad.
> y necesito hacer por lo menos 4 velocidades. si tienen algun ejemplo mejor. espero su ayuda.



Hola mejor seria que tu colocaras un ejemplo y a partir de allí ir ayudándote, por lo menos la parte de las pulsaciones, ya que si ni siquiera eso puedes hacerlo no podrás hacer el resto del código.





Deca dijo:


> Hola!
> Recientemente estoy aprendiendo a programar en PICBASIC y me gustaría que me ayudaran a aclarar unas dudas que tengo.
> 
> Ahí va la primera:
> ...



Hola para la primera pregunta no estoy seguro si puedes efectuar la operación con decimales, pero de poderlo hacer, para lo que comentas puedes realizar igual una condicional con otra varibale digamos que se llame N1  y la variable N, vas a ir guardando el valor de N en N1 luego preguntas si N es distinto <> de N1 entonces muestras en la LCD y luego N1 = N 

La otra pregunta hay una manera facil con el comando toggle, cambias el estado del pin, y seria asi:

SI el puerto A.0 = 1 entonces toggle Puerto B.0 

Si colocas una simulación y un código base de lo que pretendes hacer es mas fácil la ayuda


----------



## reyvilla (Abr 27, 2012)

Amigo pull1988, no me funciono tu codigo aun no logro conectarlo bien con la configuración del virtual terminal del proteus, mas sin embargo como te indico lubeck pienso igual la única manera es hacer una especie de enlace y luego un menu, para poder saber en donde estas parado, me explico, tu sistema esta a miles de kilometros y lo vas a comandar por mensajes, digamos que quieres activar uno de los reles, como sabes el estatus actual del rele? esta activado o esta desactivado el rele que quieres usar?, entonces para eso seria el menú, aparte de tener una selección para activar y otra para desactivar. Entonces lo primero seria establecer una cabecera para tener acceso al sistema.
Cuando te indique que activar en el comando serout2 era una bandera, es porque de eso se trata, para poder diferenciar entre todo lo que vaya llegando utilizas la bandera, en el primer código la utilizas para activar, y en el segundo codigo hiciste lo mismo, la diferencia es que colocaste un tiempo de espera para esa bandera y si no llegaba esperas la otra bendera por x tiempo, de esa forma lo que haces es distraer al sistema en ves de que este atento a los comandos, para evitar eso, haces la cabecera de enlace o conexión, que sirve para mantener al sistema atento a un solo comando, luego de que le llegue ese comando entonces en funcion a lo que viene junto a ese comando el espera la siguiente bandera y así sucesivamente.
Entonces digamos que la cabecera es CONECTAR, el sistema no va hacer nada hasta que llegue ese comando, cuando llegue ese comando el siguiente le va indicar que va hacer, digamos que tienes 3 opciones, si es 1 se va a una subrutina a esperar el comando activar, si es 2 a otra subrutina a esperar el comando desactivar y todos los que se necesiten, luego de eso en cada una de las subrutinas se queda esperando pues el comando correspondiente mas el dato, y según el dato hace una cosa o otra. Hice un video de ejemplo para que te inspires en el me llevo 30min y es parte del mismo que hicimos la diferencia es que copie y pegue varias subrutinas y cambie los comandos.






Nota: El tamaño del codigo es de casi 2k (1980), por lo que sugiero utilizar uno de mas capacidad o unas rutinas mas simples para lograr lo mismo o algo similar...saludosss


----------



## biker2k3 (Abr 29, 2012)

J2C dijo:


> Biker2k3
> 
> 
> En PROTON+ Compiler Development Suite debes utilizar la sentencia:
> ...





En ese mismo manual dice que se puede usar solo la funcion sleep y tene que reactivarse al detectar una interrupcion en alguna entrada, hay un ejemplo en la pagina 372.

Otra opcion seria bajar la velocidad del pic pero tampoco pude hacerlo. Tiene que seguir funcionando el serin y serout.



Asi estan conectadas las entradas y salidas

GP5  (Boton A)
GP4  (Boton B)
GP1  (Boton C)
GP2   +LED IR
GP0   -LED IR


----------



## inspector gadget (Abr 30, 2012)

amigos del foro, saludo cordial. Mi pregunta tiene que ver con una matriz de leds 7x32 con pic 16f628,publicada en este foro, pero que como su programa esta hecho en picbasic y como su autor no responde los mensajes, me atrevo a solicitarles a ustedes que manejan este lenguaje, por medio de este hilo, nos ayuden a entender el porque SOLO funciona en la simulacion, el hex que el autor coloca para dicha simulacion, siendo que supuestamente su autor nos brinda el programa (sin egoismos como el mismo lo dice)para que hagamos modificaciones, pero si lo tomamos el supuesto programa original y lo compilamos, no muestra ningun error en este proceso y mas aun en la simulacion en proteus comienza a correr el codigo sin mostrar errores pero tampoco muestra el mensaje en la matriz 7x32. Repito que no le he hecho modificaciones al programa original, pero si corro el hex del archivo, simula los mensajes sin nigun problema, claro que se ven al reves pero imagino que ¿ sera cuestion de ordenar datos? . Ayudennos a entender por que no muestra los mensajes la matriz y asi comprender donde esta el problema de este programa, no le he podido encontrar el detalle... muchas gracias.


----------



## reyvilla (Abr 30, 2012)

que sera lo que no te funciona  

PD: Por cierto creo que estas confundido de foro, el código dice foros UCONTROL.


----------



## Dario (Abr 30, 2012)

hola gente tanto tiempo jeje...
amigo reyvilla: este ejemplo de matriz esta posteada en el foro pero en este momento no me acuerdo donde jeje... es verdad lo que dice el amigo inspector gadgets, yo ya la habia bajado y probado y ami tampoco me funciono ¿como hiciste para que te funcionara? ¿no es que simplemente habia que cambiar el texto 'crsto viene pronto...'? porque yo hice exactamente eso y no me funciono. saludosss


----------



## reyvilla (Abr 30, 2012)

Allí esta lo interesante del caso, a mi no me tomo mucho tiempo verlo, debe ser por que me gusta saber como funcionan las cosas, es difícil, no estoy diciendo que no me costo pero me resulto fácil conseguirle el problema, primero como ejemplo esta bien para simularlo, pero como practica real le faltan varias cosas, como configuración de fuses, etc...

El detalle esta en la configuración de los pines de los registros de desplazamiento.

Una cosa recordar que si no se declara el microcontrolador a utilizar el microcode puede tomar otro, estar pendiente de elegir el mismo que esta en la simulación a la hora de compilar.


----------



## inspector gadget (Abr 30, 2012)

Amigo reyvilla, un saludo cordial de un hermano Colombiano, me has dejado boquiabierto ya que he pasado todo el dia intentando entender por que no me funciona la simulacion cuando le hago cambios en el mensaje y luego compilo sin problemas, solo simula si cargo el hex del archivo. Por otro lado hace 5 minutos que revise donde saque el archivo y se encuentra en este foro, en el hilo:*matriz de led 7x32 con pic 16f628a *y su autor es:*fey116*. Creeme que ya estaba resignado, pero como decimos por aca ¡llegaste a salvar la patria! no solo a mi me sucedio esto ya que otros foreros tenian el mismo problema con esta matriz, pero no buscaron la respuesta. Dime por favor porque no me funciona, lo que hago es tomar el programa tal y como esta, hasta ahi todo bien, lo compilo y OK, cargo el hex que me genera y no obsrvo caracteres en la matriz, vuelvo y cargo el hex ya compilado osea el que se encuentra en el archivo y zas funciona pero con el mensaje del autor. no se que estoy haciendo mal, orientame y Feliz dia del trabajo!!! aunque me toca trasnochar por una solucion jajaja..


----------



## reyvilla (Abr 30, 2012)

Hola como dije arriba el problema esta en la configuracion de los pines de los registros de desplazamiento, el de dato y el  del clock 
Aparte de eso, si quieres que se vea mejor coloca el oscilador a 20MHZ, tanto en la simulación como en el código.


----------



## inspector gadget (Abr 30, 2012)

Otra vez aqui, gracias por la observacion reyvilla, detecto que los pines data y clock que salen del micro, estan invertidos respecto al programa..mmm aparte de la declaracion de los fuses no veo mas..a seguir buscando, voy a compilar....


----------



## reyvilla (Abr 30, 2012)

Dale cualquier cosa avisas.


----------



## Dario (Abr 30, 2012)

jajaja... ni me habia fijado en la coneccion de los pines y no habia tenido en cuenta el tema de los fuses... amigo rey, gracias por la aclaracion. te cuento que a la matriz que hice yo y que postie el link mas atras, la hice porque no le encontraba la vuelta a esta jajaja... aveces el arbol no nos deja ver el bosque jaja... saludosss
por cierto, acomodando eso de los pines y los fuses el programa funciona perfecto.


----------



## reyvilla (Abr 30, 2012)

Si eso pasa amenudo incluso haciendo mis propios códigos aveces me enredo que queda para el que realizo otro, solo hay que estar pendiente de todo y de los detalles.


----------



## inspector gadget (May 1, 2012)

inspector gadget dijo:
			
		

> hola estoy en busca de otro detalle, ya que el mensaje cambia a mi gusto, pero es como si lo sobreescribiera sobre el anterior porque cuando mi mensaje termina, continua parte del que estaba antes. No se poque no puedo borrar el mensaje anterior, Deduzco que tenga que ver con que ademas de los caracteres tambien tenga quee cambiar  datos o algo asi... mil gracias por tu aporte reyvilla valiosisimo para el aprendizaje y la observacion detallada, ojala puedas seguirnos colaborando  y Dario un saludo y a ver que avances logramos a partir de que la matriz ya despego (efectos,memoria externa,ojala teclado ps2 y demas..), gracias muchachos.



Se puede tener por compañera la fantasía, pero se debe tener como guía a la razón.
 Samuel Johnson (1709-1784) Escritor inglés


----------



## inspector gadget (May 1, 2012)

hola, cual es la diferencia entre un xtal con cubierta metalica y uno con cubierta ceramica? funcionan igual? mil gracias muchachos.


----------



## reyvilla (May 1, 2012)

Muy buenos días amigo que deseas escribir en la matriz?


----------



## lubeck (May 1, 2012)

> cual es la diferencia entre un xtal con cubierta metalica y uno con cubierta ceramica?



lo que yo se es que  los cristales los hay de muchos hz como de 20Mhz etc... y los resonadores (ceramica) creo que son de pocos hz...

los cristales son mas precisos, y los resonadores son mas estables...


----------



## reyvilla (May 1, 2012)

inspector gadget dijo:


> hola, cual es la diferencia entre un xtal con cubierta metalica y uno con cubierta ceramica? funcionan igual? mil gracias muchachos.



El de cubierta metálica es el cristal solo, el otro se llama resonador, y tengo entendido que es un cristal con dos condensadores internos, osea se conecta directo sin los condensadores externos.

Lubeck yo utilizo resonadores de 4MHZ Y 20MHZ

Como estos:


----------



## inspector gadget (May 1, 2012)

Buenos dias reyvilla, cordial saludo, "HIJO CRISTHIAN FELIPE TE QUIERO MUCHO" seria mi mensaje y tengo otros que quisiera  poder cambiarlos a voluntad. mil gracias amigo.



un saludo a lubeck, gracias por la aclaracion.


----------



## lubeck (May 1, 2012)

> Lubeck yo utilizo resonadores de 4MHZ Y 20MHZ



bueno a lo que me refiero es que los cristales los hay mas "veloces" y precisos que los resonadores.. 

imagino que entre mayores velocidades de los resonadores se hacen menos precisos... eso de la precision lo lei en algun lado de la informacion que da microchip...


----------



## inspector gadget (May 1, 2012)

a pesar de declarar los fuses y xtal @ DEVICE PIC16F628,WDT_OFF,PWRT_OFF,MCLR_OFF,BOD_OFF,CPD_OFF,PROTECT_OFF

DEFINE OSC 20 sigue sobreescribiendose el actual mensaje sobre el anterior..mmm que estoy haciendo mal? gracias


----------



## reyvilla (May 1, 2012)

No, por eso te pregunte que quieres escribir en la matriz, ese tiene un máximo caracteres según lo que leí, ahora cual es el máximo no se


----------



## inspector gadget (May 1, 2012)

tal vez no he explicado bien, al decir que se sobreescribe el texto que quiero que aparezca sobre el anterior, el anterior es el texto del original del autor: "CRISTO VIENE PRONTO PREPARATE....." entonces si solo escribo "HIJO", en DATA @0,"HIJO", en la simulacion aparece "HIJOTO VIENE PRONTO PREPARATE...." osea no se borra el anterior


----------



## reyvilla (May 1, 2012)

Eso se debe a que el proteus mantiene los datos de la eeprom a pesar de tu compilar de nuevo, para evitar eso debes borrar todos los datos persistentes en la simulación, y eso lo haces a través del menú debug le das a reset persitent model data  y pruebas y me avisas


----------



## lubeck (May 1, 2012)

no he revizado el programa de la matriz pero yo creo que debe tener un contador del largo del texto, y seria cuestion de que le baje el numero no?

es decir si el largo del texto es 27 ese del "Cristo bla bla bla" , y si pone "hijo" debe poner en el contador 4


----------



## reyvilla (May 1, 2012)

Al igual que tu lubeck pienso que debe tener un maximo de caracteres según el contador, ahora aparte de eso me paso lo que les menciones los datos de la eeprom del pic se quedan almacenados y si no se le indica al proteus que los borre a pesar de cambiar el código por otro siguen estando los datos en la eeprom y lo que hace el proteus es sobre-escribir los datos ya existentes.

Acá otro vídeo para que veas mejor de que hablo:


----------



## inspector gadget (May 1, 2012)

Si reyvilla ese era el punto, en verdad gracias, todos los dias se aprende con colegas como tu que sin egoismos,orientan a los inexpertos pero con muchas ganas de aprender, pero que algun dia esperamos salir avantes para construir una mejor sociedad y tambien compartir nuestra experiencia con los que empiezan. Ahora bien estoy deseoso de pasar la matriz a la parte fisica, uds creen qu deebo atacar las columnas con resistencias y las filas con transistores pnp? el MCLR debe ir medante una R a vcc o gnd? que otro detalle me aconsejan tener en cuenta respecto al diagrama asquematico? la verdad quiero pasarlo a la parte fisica para ir haciendo avances sobre efectos y esas cosas por que como me quedo claro la simulacion se aproxima a la realidad pero en lo que tiene que ver con los parpadeos , no hay nada mejor que observar la matriz terminada en la realidad para ver que correcciones se van haciendo, e ire aportando los avances, por ahora a perforar muchos agujeros para los leds. gracias muchachos, esto si es una verdadera COMUNIDAD.


----------



## reyvilla (May 1, 2012)

Que bueno, mira para llevarlo a la parte física debes configurar los fuses y especificar que tipo de oscilador vas a usar, hay un circuito similar en la pagina de ucontrol con el cual te puedes guiar para las conexiones, por otro lado creo que podrías cambiar la 74ls04 por un ULN2803 y para el master clear una resistencia de 10k a vcc, al pic recuerda colocale una base para que puedas programarlo luego, bueno de momento es lo que veo, espero tus aportes y avances...mucho éxito en el proyecto


----------



## inspector gadget (May 1, 2012)

gracias a ti  y a esta marvillosa comunidad!!!!!!!!


----------



## tlaloc (May 1, 2012)

disculpen pero soy nuevo en esto de programar y mas con pbp .
pero tengo problemas cuandoo quiero compilar un programa desde el mas sencillo al mas complejo...
disculpen pero pues necesito su ayuda........


----------



## reyvilla (May 1, 2012)

tlaloc dijo:


> disculpen pero soy nuevo en esto de programar y mas con pbp .
> pero tengo problemas cuandoo quiero compilar un programa desde el mas sencillo al mas complejo...
> disculpen pero pues necesito su ayuda........



Hola como estas, si puedes ser algo mas preciso para poder ayudarte, no te compila, te compila pero te da errores, en si cual es el problema que tienes


----------



## tlaloc (May 1, 2012)

a ver mira pongo este condigo y me aparecen todos estos errores...
si fuera mucha molestia de decirme bien como corregir esto..
he leido un buen de libros y nada sigo con los mismo errores....
 y si le quitos sintaxis como @ device y define y eso me lo compila pero cuando lo queiro probar con el pic el pic no me genera nada.......



mira
error.png


----------



## reyvilla (May 1, 2012)

El problema que tienes parece ser de configuración del microcode con el compilador . Tienes que hacer que el microcode ubique la capeta del compilador, para eso en el menú VIEW le das a la opción (compile and program option), alli tienes en la primera pestaña la ubicaron del compilador, lo que se recomienda es colocar la carpeta del compilador en la raiz si es PICBASIC PRO quedaria algo asi c:/PBP, Y luego la configuras en el microcode buscándolo manualmente y listo.


----------



## tlaloc (May 1, 2012)

si,,
es loq ue tngo pero pues me sigue dando lo mismo
hasta he instaldo otras versiones de pbp y me siguen dando lo mismo..
he probado con proton tambein y me aparece casi los mismo errores,,,

mira es lo qeu tu me mecncionas y me sale lo mismo


----------



## lubeck (May 1, 2012)

Por favor  tlaloc postea tu duda en un solo lugar...

no creas que esta el foro para ti solo...


----------



## tlaloc (May 1, 2012)

disculpen,,,,,,,,,,

pero la verdad necesito su ayuda y se me hixo facil...


----------



## D@rkbytes (May 1, 2012)

tlaloc dijo:


> disculpen,,,,,,,,,,
> 
> pero la verdad necesito su ayuda y se me hixo facil...


Saludos.
Sube en un zip tu código o pegalo aquí, seleccionalo y envuelvelo con el botón que tiene un #
Para determinar si es error de código, software, o sistema operativo.


----------



## tlaloc (May 1, 2012)

mira aqui esta el archivo



la verdad no ntndi eso de nvolverlo


----------



## D@rkbytes (May 2, 2012)

tlaloc dijo:


> mira aqui esta el archivo
> 
> 
> 
> la verdad no ntndi eso de nvolverlo


Envolver el código, es pegarlo donde escribes, lo seleccionas y presionas el botón que tiene un #
Con eso se vera como esto.

```
@ device xt_osc  ; oscilador externo XT
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
x var byte       ; crea la variable x y asigna un espacio de memoria
                 ; de o a 255
LED1 var portb.0   ; asigna el nombre de led1 a RB0 del pic 16f877A
LED2 VAR portb.1   ; asigna el nombre de led2 a RB1

programa:          ; inicio de la linea de programa 

high led1:low led2   ;enciende led1 y apaga led 2
pause 700           ; esperar 0.7 seg
low led1:high led2  ;apaga led1 y enciende led2 
pause 700          ; espera 0.7 seg
goto programa       ; ir a programa
end                ; fin del programa
```
Ese es tu código envuelto con la etiqueta 
	
	



```
OK. Con tan solo compilar tu código sin modificar ni mover nada, se compila sin errores.
Ahora, ¿que PIC estas usando? por ahora con el código que tienes no es importante
para compilarlo porque no estas usando registros especiales de un PIC determinado.
En los graficos que adjuntaste se ve que tienes seleccionado un PIC16F628A
Y en el código se comenta que se usara un PIC16F877A.
Es importante que siempre selecciones que tipo de microcontrolador usaras.
Adjunto tu código compilado, con los fuses requeridos para el 16F877A
más la configuración del puerto B
Solo que yo use MicroCode Studio Plus v3.0 y PBP 2.60
Ahora estoy usando ya el MicroCode Studio v5.0 y PBP3 y hay muchas mejoras.

Suerte y hasta luego.
```


----------



## tlaloc (May 2, 2012)

graxias primero pruebo y te afirmo cual es mi problema



gracias tu programa si me logro funcionar pero cuando yo los programo en microcode no me funcionan ,creen qeu sea el software.....



gracias por todo ......................


----------



## ferdy575 (May 2, 2012)

reyvilla dijo:


> Que bueno, mira para llevarlo a la parte física debes configurar los fuses y especificar que tipo de oscilador vas a usar, hay un circuito similar en la pagina de ucontrol con el cual te puedes guiar para las conexiones, por otro lado creo que podrías cambiar la 74ls04 por un ULN2803 y para el master clear una resistencia de 10k a vcc, al pic recuerda colocale una base para que puedas programarlo luego, bueno de momento es lo que veo, espero tus aportes y avances...mucho éxito en el proyecto


 

hola Reyvilla.
he estado siguiendo este hilo desde que el inspector gadget empezó y me pareció excelente esta matriz, a mi me funciona todo bien incluso le agregue las minúsculas pero no he podido corregirle la titiladera al momento de simularlo, sera que al probarlo físicamente seguirá titilando? adicionalmente quiero hacerle funcionar la octava fila para poder colocar por ejemplo texto subrayado pero no he podido pues lo que hace es que me pasa la información de la 1ª fila a la 8ª y sube todo el texto cortando las letras en la parte superior tú que harías para solucionar este pequeño error.
Gracias por estar pendiente de nuestras dudas


----------



## reyvilla (May 2, 2012)

ferdy575 dijo:


> hola Reyvilla.
> he estado siguiendo este hilo desde que el inspector gadget empezo y me parecio excelente esta matriz, a mi me funciona todo bien incluso le agregue las minusculas pero no he podido corregirle la titiladera al momento de simularlo, sera que al probarlo fisicamente seguira titilando?



No sabría decirte con certeza pero estaría un 70% seguro de que si, pero con pequeñas modificaciones en el código puede corregirse y por otra parte hay otro gran aporte esta vez de parte del compañero "tecniloco80" el cual se encuentra aquí: 
 _ https://www.forosdeelectronica.com/posts/636711/ _

Y esta bien bueno, no titila y puedes cambiar el mensaje como quieras a través de una interface serial.


----------



## megatecpower (May 2, 2012)

hola gracias quiero comunicar un pic 16f876a con un celular Nokia1100 que segun lei tiene formato FBUS y que esta bien explicado en estos links: 

Programa generador las tramas FBUS

http://www.embedtronics.com/nokia/fbus.html

http://www.carlosvolt.com.ar/

Todo esto es bárbaro pero quiero hacerlo en pic basic pro o lenguaje basic , el mismo tiene el serout pero no alcanza los bits/s requeridos ? ¿como mando estas tramas en basic?



hola gracias quiero comunicar un pic 16f876a con un celular Nokia1100 que segun lei tiene formato FBUS y que esta bien explicado en estos links: 

https://www.forosdeelectronica.com/f18/programa-generador-tramas-fbus-978/index4.html

http://www.embedtronics.com/nokia/fbus.html

http://www.carlosvolt.com.ar/

Todo esto es bárbaro pero quiero hacerlo en pic basic pro o lenguaje basic , el mismo tiene el serout pero no alcanza los bits/s requeridos ? ¿como mando estas tramas en basic?


----------



## lubeck (May 2, 2012)

a mi el primer y ultimo link me aparecen rotos, ademas de que esa pregunta ya la habia visto en otro lado.... 

y una pregunta ¿como conseguiste esa reliquia (nokia 1100)?
y una mas...   porque no pones algun avance de codigo y una simulacion en proteus, para que muestres algo de interes por tu proyecto, digo ademas de solo poner unos links...


----------



## megatecpower (May 2, 2012)

Solo intente con esto pero no paso nada  

me parece que la comunicacion fbus es mas rapida , como configuro los bits/seg


----------



## inspector gadget (May 2, 2012)

reyvilla dijo:


> No sabría decirte con certeza pero estaría un 70% seguro de que si, pero con pequeñas modificaciones en el código puede corregirse y por otra parte hay otro gran aporte esta vez de parte del compañero "tecniloco80" el cual se encuentra aquí:
> _ https://www.forosdeelectronica.com/posts/636711/ _
> 
> Y esta bien bueno, no titila y puedes cambiar el mensaje como quieras a través de una interface serial.



Gracias por el dato reyvilla, exelente aporte de tecniloco80, pero no veo que se haya profundizado en el tema. Creen que se puede llevar a la realidad asi como esta? o solo es una aplicacion para analizar la comunicacion serial. gracias muchachos


----------



## lubeck (May 2, 2012)

Megatecpower...

en lugar de 

serout portc.7,N9600,["1E 00 0C 01 00 07 00 01 00 08 60 01 63 00 11 0E" ]

podrias poner....

serout portc.7,N9600,[$1E,$00,$0C,$01,$00,$07,$00,$01,$00,$08,$60,$01,$63,$00,$11,$0E ]

asi se manda la trama a la que te refieres...


----------



## reyvilla (May 2, 2012)

inspector gadget dijo:


> Gracias por el dato reyvilla, exelente aporte de tecniloco80, pero no veo que se haya profundizado en el tema. Creen que se puede llevar a la realidad asi como esta? o solo es una aplicacion para analizar la comunicacion serial. gracias muchachos



No lo he revisado, pero puedes preguntarle al amigo tecniloco80, ya que el es el creador y lo realizo en fisico, a ver si le falta algo o si se puede armar como esta en el esquema.


----------



## inspector gadget (May 2, 2012)

gracias reyvilla, pero analizando la simulacion se vee que el barrido lo hace en una forma diferente...mm  al parecer no lo hace por filas, complicada esta parte para llevarla a la realidad con optimo resultado... por lo pronto sigo armando la matriz de mi interes, ya termine el armado del panel de leds y toca seguir con la placa de control.


----------



## holanda (May 3, 2012)

hola que tal

no se si me podrían ayudar, estoy haciendo un programa sencillo de un ejemplo de un libro que solo recibe un voltaje de 0 a 5 V a través de conversor A/D del pic desde un potenciometro con un pic16f877a, pero cuando hago la conversión de los 255 segmentos a 5 volts a través de la variable p2 me aparecen solo enteros y no no me aparecen con punto decimal, quisiera ver 2.9 V o 4.5 V osea ocupar una variable de punto flotante pero por lo que he investigado picbasic no maneja punto flotante, no se si me podría ayudar diciendome que tengo que implementar en el codigo para poder visualizar puntos decimales, dejo el código del conversor A/D, gracias saludos.

DEFINE OSC 4                ; especifica que es de 4MHz

DEFINE LCD_DREG PORTB ;bit de datos del LCD empezando
DEFINE LCD_DBIT 0 ;por B.0, B.1, B.2 y B.3
DEFINE LCD_RSREG PORTB ;bit de registro del LCD conectar
DEFINE LCD_RSBIT 5 ;en el puerto B.5
DEFINE LCD_EREG PORTB ;bit de Enable conectar en el
DEFINE LCD_EBIT 4 ;puerto B.4
p1 VAR BYTE ;variable para almacenar potenciómetro 1
p2 VAR BYTE

ADCON1 =%100 ;configura PortA 0,1, 3 en conversores A/D

Inicio:

PAUSE 300

ADCON0 =%1000001 ;activar canal 0 a Fosc/8
GOSUB medir
p1= ADRESH

p2=(p1*5)/255

lcdout $fe,$80,"Voltaje:" ;limpiar LCD y sacar texto
LCDOUT $fe,$c1,#p2 

GOTO inicio

medir: ;subrutina para leer el conversor A/D
PAUSEUS 50 ;pausa para setear el canal
ADCON0.2 = 1 ;iniciar conversión
PAUSEUS 50 ;pausa para la conversión

RETURN


----------



## lubeck (May 3, 2012)

> estoy haciendo un programa sencillo de *un ejemplo de un libro* que solo recibe un voltaje de 0 a 5 V a través de conversor A/D del pic desde un potenciometro



Te recomiendo que le saques provecho a ese libro y lo utilices como papel sanitario... 

prueba este codigo es a dos digitos.... y modifica los puertos que corresponda a tu LCD puesto que yo los  cambie para simularlo....


```
DEFINE OSC 4 ; especifica que es de 4MHz

DEFINE LCD_DREG PORTB 'LCD data port 
DEFINE LCD_DBIT 0 'LCD data starting bit 0 or 4 
DEFINE LCD_RSREG PORTB 'LCD register select port 
DEFINE LCD_RSBIT 4 'LCD register select bit 
DEFINE LCD_EREG PORTB 'LCD enable port 
DEFINE LCD_EBIT 5 'LCD enable bit 
DEFINE LCD_RWREG PORTB 'LCD read/write port 
DEFINE LCD_RWBIT 6 'LCD read/write bit 
DEFINE LCD_BITS 4 'LCD bus size 4 or 8 
DEFINE LCD_LINES 2 'Number lines on LCD 
DEFINE LCD_COMMANDUS 2000 'Command delay time in us 
DEFINE LCD_DATAUS 50 'Data delay time in us 


p1 VAR word ;variable para almacenar potenciómetro 1
p2 var word
p3 var word
ADCON1 =%100 ;configura PortA 0,1, 3 en conversores A/D

Inicio:

ADCIn 0,p1 'se captura valor en conversor
p2=(p1*5)/255 ' se hace regla de 3
p3=(((p1*5)//255) *100)/255 ' se utiliza el residuo y se multiplica por 100 y se vuelve a dividir entre 255

lcdout $fe,$80,"Voltaje:" ;limpiar LCD y sacar texto
LCDOUT $fe,$c1,# p2, "." , # p3," " 

GOTO inicio
```


----------



## holanda (May 3, 2012)

hola lubeck gracias por la ayuda, ya probe el codigo que me pasaste y ya me muestra el valor con punto decimal, no se si me puedas explicar esta parte del código

p1=20
p2=(p1*5)/255
p3=(((p1*5)//255) *100)/255

es que apenas empiezo a programar en pic, entiendo lo de los 255 segmentos pero no se porque se le da a p1 el valor de 20 y luego porque se multiplica p1 por 5, luego veo que pones doble "//", no se si me puedas explicar estas lineas del codigo que pusiste, perdona la molestia, gracias saludos y nuevamente gracias.


----------



## lubeck (May 3, 2012)

> es que apenas empiezo a programar en pic, entiendo lo de los 255 segmentos pero no se porque se le da a p1 el valor de 20 y luego porque se multiplica p1 por 5, luego veo que pones doble "//", no se si me puedas explicar estas lineas del codigo que pusiste, perdona la molestia, gracias saludos y nuevamente gracias.



con respecto al p1=20, no sirve para nada... lo utilice para hacer la simulacion... despues edite mi mensaje y lo borre.... pero al parecer lo alcanzaste a ver..

el // es una instruccion de residuo tambien llamado mod o modulus... y su resultado es lo que no se puede dividir...

ejemplo 250 mod 255  =250 porque esos 250 no pudieron ser divididos entre 255
o digamos 256 mod 255 =1 porque de los 256 nada mas 1 no pudo ser divido , busa informcion del wiki...

entonces si digamos que el conversor da un p1=20

multiplicas 20*5 y lo divides entre 255 y en p2 pones el entero  que es 0

ahora del resultado anterior ves con el modulus que no pudo ser dividido...

20*5//255 y fueron 100 esos 100 lo multiplicas por otros 100 para que puedan ser divididos entre 255 y lo divides y lo colocas en p3 y te da 39 que son los decimales...


----------



## holanda (May 3, 2012)

hola lubeck

gracias por la explicación ya me quedo mas claro el codigo y gracias por la ayuda, saludos.


----------



## lubeck (May 3, 2012)

holanda dijo:


> hola lubeck
> 
> gracias por la explicación ya me quedo mas claro el codigo y gracias por la ayuda, saludos.



oki...



> luego porque se multiplica p1 por 5



nada mas me falto aclarar lo del 5 creo...

es una regla de tres, si 255(que es un byte) es a 5v entonces x es a?

se multiplica (x*5v)/255  te da "el voltaje en un rango de 0 a 255"

Saludos y suerte

pd. lo de la regla de tres tambien buscalo en el wiki o matematicas basicas...


----------



## reyvilla (May 3, 2012)

lubeck, tengo en mente hacer un simon say para ver si logro sacarle provecho al comando ramdon de PBP, el problema que veo de momento es que para ese comando la variable debe ser word, y el valor que almacena va desde 0 hasta 65535, lo cual es mucho, intente utilizando algo así:

RANDOM, VARIABLE/4 'Ya que solo necesito un numero aleatorio del 1 al 4

Pero no me funciono, como se podría hacer para lograr trabajar el random con una cantidad de números
especificos?
Tendrás alguna idea?


----------



## lubeck (May 3, 2012)

tienes alguna simulacion ya preparada....

yo creo que si lo quieres divir a cuatro digitos seria mas o menos asi..

RD var word
B   Var byte
Random Rd
b.0=RD.0
b.1=RD.1


jajaja es una jalada pero a ver si funciona... ejejje


----------



## reyvilla (May 3, 2012)

Gracias buena esa dame unos minutos ya la estoy haciendo, crei haberla hecho pero como que se borro, apenas la termine la subo


----------



## lubeck (May 3, 2012)

Si funciono  , lo simule asi para un numero de 1 a 4...


```
p1 VAR word 
p2 var word

Inicio:

random p1
P2=0
p2.0=p1.0
p2.1=p1.1
p2=p2+1
lcdout $fe,1,#p2
pause 1000
GOTO inicio
```


----------



## reyvilla (May 3, 2012)

Dale yo ya casi termino la parte de la simulación y el código completo, con niveles, etc...



Ya la acabo de terminar aun no he colocado la parte de tu código la hice con el primer ejemplo.
Como funciona: El primero te enciende un led de un color y luego tu tienes que precionar el boton correspondiente a ese color si es correcto te muestra el siguiente color, si no suena una alarma 3 veces, de momento voy solo por el primer nivel
Revisalo y me avisas

Ok ya logre avanzar aunque el código es un desastre funciona genial es solo la base del juego claro esta, aunque tiene para unos 127 niveles mas o menos según la capacidad de la eeprom, aquí el nuevo código, la simulación no la habia colocado  disculpa no me di de cuenta pero ya la coloque, espero ahora si puedas ver como funciona...

Esta todo en el archivo SIMON SAY 16F628A2.RAR

Actualice de nuevo el código ahora tiene un sistema antirebote una mejora para poder jugar sin echarle la culpa al pulsador, al presionar el espera hasta que se suelte el botón para mostrar el nuevo color o para continuar con el siguiente pulsador.

Y como simpre un video demostrativo:






y otro de un juego interesante que pudiera hacer mas adelante  :


----------



## torres.electronico (May 7, 2012)

Les dejo un ejemplo de como leer una sonda lambda (0.1mV-1.1mV)para saber si la mezcla de combustible en nuestros vehiculos es rica o pobre...
En paralelo al voltimetro creado, implemente un software de Lubeck para jgar con un pequeño grafico alojado en la CGRAM del lcd...
Este mismo ejemplo, se puede aprovechar para medir la intensidad de señal recibida en nuestros prpoyectos de RF. Por ejemplo el modulo RLP434A, tiene una patilla denominada RSSI. Este pin, es una salida analogica que nos da una tension proporcional a la intensidad de la señal recibida... Por lo que lei, no todos los modulos receptores tienen esta funcion, y ademas, no todos funcionana de la misma manera... 



```
[B];**************
 EJEM_VOLT:
   LCDOUT $FE, 1 
   lcdout " EJEMPLO BASICO "
   LCDOUT $fe,$C0,"VOLTIMETRO LAMBDA"
   pause 1500
 LCDOut $fe, $48, $00, $00, $00, $00, $00, $00, $1F, $1F   'Figura 1.
 LCDOut $fe, $50, $00, $00, $00, $00, $1F, $1F, $1F, $1F    'Figura 2.
 LCDOut $fe, $58, $00, $00, $1F, $1F, $1F, $1F, $1F, $1F     'Figura 3.
 LCDOut $fe, $60, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F      'Figura 4.
 EJEM_VOLT1:
   if botonMODO = 0 then PUBLI
   ADCIN 1, Res1
 Volts3 = Res1 * Conv1 
 Volts4 = Res1 * Conv2 
 Volts4 = Volts4 / 100
 Volts3 = Volts3 + Volts4 
 if volts3 > 800 then nivel5E
 if volts3 > 600 then nivel4E
 if volts3 > 400 then nivel3E
 if volts3 > 200 then nivel2E
 if volts3 < 200 then nivel1E
 goto EJEM_VOLT1
 
 nivel1E:
 pause 100
 LCDOUT $FE, 1
 LCDOUT $fe, $C0,"VE= ",DEC4 Volts3 , "mV"
 LCDOut $fe,2,"Mezcla muy POBRE" 
 LCDOut $fe,$CB, 1
 goto EJEM_VOLT1
 
 nivel2E:
 pause 100
 LCDOUT $FE, 1
 LCDOUT $fe, $C0,"VE= ",DEC4 Volts3 , "mV"
 LCDOut $fe,2,"Mezcla POBRE"
 LCDOut $fe,$CB, 1 
 LCDOut $fe,$CC, 2
 goto EJEM_VOLT1
 
 nivel3E:
 pause 100
 LCDOUT $FE, 1
 LCDOUT $fe, $C0,"VE= ",DEC4 Volts3 , "mV"
 LCDOut $fe,2,"Mezcla BUENA"
 LCDOut $fe,$CB, 1 
 LCDOut $fe,$CC, 2
 LCDOut $fe,$CD, 3
 goto EJEM_VOLT1
 
 nivel4E:
 pause 100
 LCDOUT $FE, 1
 LCDOUT $fe, $C0,"VE= ",DEC4 Volts3 , "mV"
 LCDOut $fe,2,"Mezcla RICA"
 LCDOut $fe,$CB, 1 
 LCDOut $fe,$CC, 2
 LCDOut $fe,$CD, 3
 LCDOut $fe,$CE, 4
 goto EJEM_VOLT1
 
 nivel5E:
 pause 100
 LCDOUT $FE, 1
 LCDOUT $fe, $C0,"VE= ",DEC4 Volts3 , "mV"
 LCDOut $fe,2,"Mezcla muy RICA"
 LCDOut $fe,$CB, 1 
 LCDOut $fe,$CC, 2
 LCDOut $fe,$CD, 3
 LCDOut $fe,$CE, 4
 LCDOut $fe,$CF, 4
 goto EJEM_VOLT1
 ;*****************[/B]
```






Media desprolija mi entrenadora  , pero es lo que hay por el momento ​


----------



## Dario (May 7, 2012)

hola torres, como va todo? se ve muy bueno tu proyecto, creo que en estos dias me van a traer una de esas sondas para agregarle a un tacometro que me encargaron ¿algun videito por ahi? saludosss


----------



## J2C (May 7, 2012)

D@rio

Tiempo sin leerte, espero que estes bien y no te haya ganado el Gyroscopo de la Consola.

Justo ayer webeando otras cosas en nuestro país me salio una página con un Gyro Analógico *LPR550AL* de ST que aunque discontinuado de fabricación me parece que tiene un buen precio *$106* (u$s23.83).

Te iba a mandar la info por MP pero viendo que ingresaste al foro lo hago por aquí.



Saludos, JuanKa.-


----------



## torres.electronico (May 7, 2012)

D@rio dijo:


> hola torres, como va todo? se ve muy bueno tu proyecto, creo que en estos dias me van a traer una de esas sondas para agregarle a un tacometro que me encargaron ¿algun videito por ahi? saludosss


Dale, te armo algo y subo... Hay dos tipos de sensores lambda y la señal de ambas son totalmente distintas... Para el caso, con la velocidad de muestreo en display y refrezco de datos en la lectura del adc, vas a poder leer cualquiera de las dos sondas... En mi opinion, si queres colocarle un hall meters en un tacometro, yo me inclinaria por el diseño con el CI especifico que convierte frecuencia en tension (no me acuerdo si era el LM3914 o el LM3907)... hay uno de marca comercial, que viene justamente con este CI, y es diminuto el circuito...
Ahora, si te interesaria meterle dentro del tacomentro, el emulador de sonda lambda que subi hace un tiempo atras en el foro, se pone mas interesante 
basicamente lo que hice, fue leer el valor real de la sonda lambda y verificarlo en el display... en paralelo, lo que hice, fue crear una salida analogica con un pwm (un filtro con un capacitor y una resistencia), y este valor espejo con el valor de entrada, podia ser modificado incrementando o decrementando el valor en %.... Con esto lo que logramos es engordar un poco mas la mezcla a gusto nuestro (creo que vistes las fotos en mi facebook...¿no?). Quiero aclarar un punto que mucos desconocen... No es cuestion de solo darle mas y mas combustible para tener un poco mas de potencia... tambien hay que darle aire 
Tenia otra version beta donde jugaba con otros sensores mas a la vez (map y NTC) y con eso si lograba tener una mayor performance en cuanto rendimiento se trataba... con el MAP y la NTC, jugaba un poco con el avance del motor y con el corrector de Sonda Lambda, lo engordaba de combustible un poco mas.... lamentablemente, se me ponia lento los valores espejos en las salidas y no lograba tener algo estable (seguro que era muy mala la programacion) y eso no me dejo seguir con la idea de mi proyecto (sumarle un cuerpo motorizado para darle mas aire a la admision)... 
En fin, 1uizas se pueda tratar en este topico si a alguien le interesa y con eso sacar adelante una manera mas de tunear nuestro auto, sin tener que modificar parametros en la ECU como ya lo hice en mi suzuki fun...
Por ejemplo, si se pudiera crear el control porcentual de los valores obtenidos por los sensores MAP, lambda y NTC; se podria llegar a crear mapas fijos para distintos tipos de dias (es terrible lo que influye el factor climatico en sistemas de inyeccion electronica con chip tunning)...
Que te interesaria que te filme? como va conectado? como funciona? chiflame

edito: aca te dejo algunas imagenes de la version 1.0 (corrector de sonda lambda)
Ver el archivo adjunto 57778


este es otro proyecto antiguo (tacometro, limitador RPM, controlador de largada y shift light con un micro picaxe que despues lo hice con PBP)






Ver el archivo adjunto 43044


----------



## Dario (May 7, 2012)

> Que te interesaria que te filme? como va conectado? como funciona?


jeje... ya que lo decis, me gustaria ver como funciona todo eso conectado. estaria bueno verlo funcionando, alomejor alguno se entuciasma y encara el proyecto aqui en el foro. saludosss


----------



## tlaloc (May 7, 2012)

Disculpa  ,,pero necesito de nuevo su ayuda ,,

estas vez para hacer un contador del 0 al 9999 ascendente y descendente con 2 puch boton...........


----------



## tlaloc (May 7, 2012)

necesito ayuda para hacer un contador
estoy viendo como usar este como base


```
cont VAR WORD
i    VAR BYTE
unid VAR BYTE
dece VAR BYTE
cent VAR BYTE
mile VAR BYTE

TRISB = 0
TRISA = 0
cont=0

Inicio:

    For i=0 TO 49
       
        unid = cont DIG 0   
        PORTB = unid 
        PORTA=8
        Pause 5
        dece = cont DIG 1
        PORTB = dece 
        PORTA=4
        Pause 5
        cent = cont DIG 2
        PORTB = cent 
        PORTA=2
        Pause 5
        mile = cont DIG 3
        PORTB = mile 
        PORTA=1
        Pause 5
        
    Next i 
      
    cont = cont + 1 
    
    IF cont > 9999 Then cont=0
    
GoTo Inicio
end
```

si alguien q*ue* me pueda explicar como funciona o como hacerlo......
por favor


----------



## D@rkbytes (May 8, 2012)

tlaloc dijo:


> necesito ayuda para hacer un contador
> si alguien que me pueda explicar como funciona o como hacerlo......
> porfas


  Saludos tlaloc.
Hace un tiempo tratamos en este foro sobre un contador de dos dígitos.
En la Pagina 94, post 1877 empezó el show. Lo inicio el amigo alejandrozama.
Basándome en ese, diseñe este otro para 4 dígitos. 0-9999
Aquel no lo probé físicamente, ni este tampoco. 
Pero realice el código y la simulación, y todo parece indicar que realmente funciona.
En la simulación se ve como los dígitos se desplazan, pero en la realidad no lo creo.
Así que si te animas a probarlo, pues nos cuentas como te fue con la idea.

Adjunto el código PBP para un 16F628A, la simulación y el esquemático con 4 displays CC.

Suerte y hasta luego.


----------



## MARCELINO74 (May 8, 2012)

Que padre prollecto Torres.Electronico,aqui donde trabajo usamos bio-diessel, no todas las veces biene bien, y ocaciona problemas en el arranque de las calderas. Voy a invertir en este prollecto, para aprender y ponerlo en practica.


----------



## torres.electronico (May 8, 2012)

MARCELINO74 dijo:


> Que padre prollecto Torres.Electronico,aqui donde trabajo usamos bio-diessel, no todas las veces biene bien, y ocaciona problemas en el arranque de las calderas. Voy a invertir en este prollecto, para aprender y ponerlo en practica.



No tengo mucha idea sobre comon rail, pero tengo info que me podria llegar a servir...voy a leer un poco sobre motores diesel, ya que como ya te dije, no tengo mucha idea sobre el proceso de motores diesel...Creo que en un motor diesel, las fases son distintas... tendria que fijarme bien, pero me parece que no es viable en motores diesel


----------



## tlaloc (May 8, 2012)

DARKBYTES.............
graxias por tu disenio pero necesito uno donde use un anodo comun y donde el conteo sea antomatico......

los puch de ascenso y descenso deben ser ..
ascensos ...cuante desde 0 asta 9999 automaticamente
descenso cuente desde 9999 asta 0 auto.........
es lo que quiero hacer,,,,,,,,
pero taratre de usar el programa q me proporcionastes , como base y tratare ,pero neceictaare muxa ayuda..


----------



## torres.electronico (May 8, 2012)

dario, date una vuelta por aca_ https://www.forosdeelectronica.com/posts/509343/ _despues te digo que hayq ue corregir


----------



## Dario (May 8, 2012)

esta buenisimo ese pryecto, estaria bueno si subis una simu en proteus. saludosss


----------



## JonNArevalo (May 15, 2012)

mecatrodatos dijo:


> el proyecto que sigue a continuacion es que por medio del LDC de muestren carateres en esta ocacion un mensaje utilizando las dos lineas del mismo.
> 
> por ultimo sirve como guia de simulacion el esquematico con el que se ha venido trabajando los proyectos de LCD anteriores.
> 
> ...



Este programa no existira para el PIC16F877? es que lo necesito para que en el LCD aparezca un mensaje como Hola o mi nombre, es que soy nuevo en esto de programar pic y no se mucho. Disculpen la molestia

Saludos


----------



## D@rkbytes (May 15, 2012)

JonNArevalo dijo:


> Este programa no existira para el PIC16F877? es que lo necesito para que en el LCD aparezca un mensaje como Hola o mi nombre, es que soy nuevo en esto de programar pic y no se mucho. Disculpen la molestia
> 
> Saludos


Saludos.
 Ese ejemplo es genérico, lo puedes utilizar en cualquier PIC16.
Solo selecciona el tipo de PIC que utilizaras, y compilas el ejemplo.

Suerte.


----------



## JonNArevalo (May 15, 2012)

Darkbytes dijo:


> Saludos.
> Ese ejemplo es genérico, lo puedes utilizar en cualquier PIC16.
> Solo selecciona el tipo de PIC que utilizaras, y compilas el ejemplo.
> 
> Suerte.



Ok muchas gracias por sacarme de esta pequeña duda  otra cosita al momento de compilarlo que programas me recomiendas? ademas cuando me dices seleccionar el tipo de pic seria al momento de compilarlo o editar el archivo y colocar el pic que utilizare.

Tal vez parezcan preguntas estupidas pero no se mucho sobre esto


----------



## D@rkbytes (May 15, 2012)

JonNArevalo dijo:


> Ok muchas gracias por sacarme de esta pequeña duda  otra cosita al momento de compilarlo que programas me recomiendas? ademas cuando me dices seleccionar el tipo de pic seria al momento de compilarlo o editar el archivo y colocar el pic que utilizare.
> 
> Tal vez parezcan preguntas estupidas pero no se mucho sobre esto


OK. A lo largo de este curso hemos venido usando el programa editor MicroCode Studio.
Y como compilador usamos PICBASIC PRO los cuales trabajan conjuntamente.
Cuando copies el programa del ejemplo al editor, es cuando seleccionas el tipo de PIC en el programa MCS.

Ahora, para aclarar más tus dudas, te recomiendo que te leas el curso desde el principio.


----------



## JonNArevalo (May 15, 2012)

Muchas gracias de antemano. Saludos empezare en esto, cualquier duda contare con su asesoria para salirme de ellas. Gracias nuevamente y Saludos


----------



## Deca (May 16, 2012)

hola, 

en primer lugar gracias por la contestacion anterior hacia mi post ya que pude solventar sin problemas lo que me ocurria.

ahora me surge la opcion de manejar mi PGA2310 a traves de SPI pero tengo unas dudas.

aqui os dejo el data sheet

http://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CFwQFjAB&url=http%3A%2F%2Fwww.ti.com%2Flit%2Fds%2Fsymlink%2Fpga2310.pdf&ei=rDK0T5H7HbCW0QXwwOwK&usg=AFQjCNHUbdBiujAZ-rNqB8k3zfgxP3v1wQ

un poco largo...XD

el problema que tengo es que no entiendo muy bien el sistema de enviar bits. en principio si fuera un canal seria del 0 al 255 pero en este caso como enviar los dos canales iguales?

habria que escribir dos lineas SHIFTOUT una con cada canal o desde la misma linea?

espero que sepan a que me refiero. y si pueden darme alguna linea de codigo como ejemplo no saben como lo agradeceria. este componente me saca de mis casillas...

un saludo a todos


----------



## J2C (May 16, 2012)

Deca

En la página 8 (/18) de la datasheet que colocaste esta explicado con el texto y la Fig. 2, debes mandar 8 bit's para cada canal uno a continuación del otro mientras mantenes la línea CS a 0.

Los primeros 8 bit's corresponden al canal Derecho (Right) y los siguientes 8 al canal Izquierdo (Left)

Por otra parte en cada secuencia de 8 bit's tenes como *primer bit* enviado el *MAS significativo* y como *octavo bit* el *MENOS Significativo*. 



Saludos, JuanKa.-


----------



## Deca (May 17, 2012)

hola!

gracias por contestar. 

El tema de la teoría lo entiendo pero el problema es la sintaxis en PicBasic que no lo he hecho nunca y no se como hacerlo y enviarlo a través del comando shiftout.

Si quisiera enviar digamos el número 75 a los dos canales como sería? separados por una coma o de que forma?

gracias y perdonar la pregunta tonta pero esto me vuelve loco


----------



## lubeck (May 17, 2012)

Prueba esto...


```
DEFINE SHIFT_PAUSEUS 1
TrisB=%1000
CS   Var PortB.0
SDO Var PortB.1
SClk Var PortB.2
SDI  Var PortB.3

R var Byte
L Var Byte
High CS

Main:
 R=75 'Definir variables a enviar 
 L=75
 Gosub Send    'llamar rutina cuando quieras enviar
 Gosub Receive 'llamar rutina cuando quieras recibir
 LCDOut R,L 'Procesar variables recibidas
Goto MAin

Send:
 Low CS:Pauseus 1
 shiftout SDO,SClK,5,R,L
 pauseus 1
 High CS
Return

Receive:
 Low CS:Pauseus 1
 shiftIn SDI,SClK,0,[R,L]
 pauseus 1
 High CS
Return
```

no lo compile, lo hice aqui mismo asi que si tiene errores de sintaxis o no funciona los corriges , o me preguntas que quise poner


----------



## Deca (May 18, 2012)

ok, no sabes cuanto te agradezco tu aporte.

este fin de semana pondre a funcionar el codigo. ya te comento.

un saludo


----------



## inspector gadget (May 20, 2012)

Saludos cordiales a todos, pongo a continuacion el siguiente codigo cuya funcion es encender un led conectado al puerto B0, mediante un pulsador que ataca el puerto A0. El objetivo es si presiono y suelto
P1, el led enciende de forma permanente, pero si vuelvo a presionar y soltar P1, el led se apaga.  En otras palabras es sencillamente un ON OFF digital, hasta aqui no tengo problema, la cuestion es que quiero gobernar el puertoA con 8 pulsadores y que se enciendan 8 leds conectados en el puerto B, pero de forma independiente , tal y como haria si conectara 8 suiches analogicos en el que cada uno  prende o apaga su respectivo led. Al ser principiante No he podido ordenar de manera eficiente el codigo para cumplir dicha funcion y es por eso que pido su generosa ayuda para que me orienten como cumplir este proposito, desde luego solo necesito me orienten con el codigo para los dos primeros pulsadores y los dos primeros leds, supongo que de ahi en adelante sera cuestion de configurar los bits restantes. Mil gracias por sus aportes.

@ DEVICE PIC16F628A,WDT_OFF,PWRT_OFF,MCLR_OFF,BOD_OFF,CPD_OFF,PROTECT_OFF

cmcon=7
trisA = 1   'todos como entrada
trisB = 0      'todos como salida

;configuracion de pines 
led1 var portb.0               ;ubicacion del primer LED en RB0 del pic 16F628A 
led2 var portb.1              
;led3 var portb.2                
;led4 var portb.3                
;led5 var portb.4               
;led6 var portb.5                
;led7 var portb.6                
;led8 var portb.7               

p1 var porta.0                  ;"""""""del primer pulsador RA0 """"""""""""
p2 var porta.1                
;p3 var porta.2                  
;p4 var porta.3                  
;p5 var porta.4                  
;p6 var porta.5                  
;p7 var porta.6                  
;p8 var porta.7                  

Cont var BYTE

CONT=0

inicio:
    IF p1 = 0 THEN
        while p1=0
        wend
        cont=cont+1
        if cont > 1 then
            cont=0
        endif
    endif
    select case cont
        case 0
            low led1
        case 1
            HIGH led1

     end select       

    goto inicio
end


----------



## lubeck (May 20, 2012)

```
@ DEVICE PIC16F628A,WDT_OFF,PWRT_OFF,MCLR_OFF,BOD_OFF,CPD_O FF,PROTECT_OFF

cmcon=7
trisA = 255 'todos como entrada
trisB = 0 'todos como salida

;configuracion de pines 
led1 var portb.0  
led2 var portb.1 
led3 var portb.2 
led4 var portb.3 
led5 var portb.4 
led6 var portb.5 
led7 var portb.6 
led8 var portb.7 

p1 var porta.0 
p2 var porta.1 
p3 var porta.2 
p4 var porta.3 
p5 var porta.4 
p6 var porta.5 
p7 var porta.6 
p8 var porta.7 


inicio:
 if P1 then toggle Led1:pause 500
 if P2 then toggle Led2:pause 500
 if P3 then toggle Led3:pause 500
 if P4 then toggle Led4:pause 500
 if P5 then toggle Led5:pause 500
 if P6 then toggle Led6:pause 500
 if P7 then toggle Led7:pause 500
 if P8 then toggle Led8:pause 500
Goto inicio
```

try this...



 no habia visto el esquema pero te recomiendo que pongas resistencias pull-Down en portA... y resistencias limitadoras a los leds


----------



## inspector gadget (May 20, 2012)

Hola lubeck, mil gracias por tu respuesta, pero lo que pretendo es prender y apagar un conjunto de 8 leds dispuestos en el puertoB con 8 pulsadores dispuestos en el puerto A, pero independientemente. osea con un pulso en A0 se debe ENCENDER el led en B0 y se debe mantener n ese estado hasta que con otro pulso en A0 se debe APAGAR el led en B0. con un pulso en A1 se debe ENCENDER el led en B1 y mantener ese estado hasta que, con otro pulso en A1 se debe APAGAR el led en B1 y asi consecutivamente para poder controlar 8 leds con 8 pulsadores pero independientemente el encendido y apagado. Eso es exactamente lo que hace el codigo que posteo, pero solo he logrado que me funcione con una sola pareja pulsador_led y esa misma funcion quiero 8 veces repetirla y no se como hacerlo a partir de la ultima linea, o como puedo trabajar sobre otro codigo para lograr ese objetivo. mil gracias por su tiempo muchachos


----------



## lubeck (May 20, 2012)

y.... ya probaste el codigo que puse y no funciono... o estas suponiendo que no funciona?...

p.d. por cierto lo edite en la ultima linea ...


----------



## inspector gadget (May 20, 2012)

Si ya lo probe, y lo que hace es que con un pulso en A0 enciendeB0 pero si vuelvo a presionar el mismo pulsador, el led no se apaga, solo se apaga A0 si presiono el pulso en A1 . la funcion debe ser identica a la que se simula con el codigo que posteo y no se como repetirlo 8 veces, a proposito no se porque al comenzar la simulacion de mi codigo aparecen encendidos leds que no tienen por que estar encendidos solo se apagan si presiono el pulso en A0 y de ahi en adelante el circuito sigue funcionando perfectamente. sera problema de configuracion de fuses ya que estoy usando el 16F628A?


----------



## lubeck (May 20, 2012)

si funciona tienes mal algo en el esquema... creo que el nombre es muy largo...

Recuerda excepto en el sexo las cosas pequeñas son mejores


----------



## D@rkbytes (May 21, 2012)

inspector gadget dijo:


> Si ya lo probe, y lo que hace es que con un pulso en A0 enciendeB0 pero si vuelvo a presionar el mismo pulsador, el led no se apaga, solo se apaga A0 si presiono el pulso en A1 . la funcion debe ser identica a la que se simula con el codigo que posteo y no se como repetirlo 8 veces, a proposito no se porque al comenzar la simulacion de mi codigo aparecen encendidos leds que no tienen por que estar encendidos solo se apagan si presiono el pulso en A0 y de ahi en adelante el circuito sigue funcionando perfectamente. sera problema de configuracion de fuses ya que estoy usando el 16F628A?


Saludos inspector gadget, saludos lubeck.

Aquí les dejo un ejemplo de como lo haría yo.
Espero te sirva inspector, para lo que deseas hacer. 

Suerte.


----------



## lubeck (May 21, 2012)

Hola Dark....

aprovechando que me acorde del PBP 5.0... 

Oye... has compilado ejercicios con el 18F4550?, yo no he podido, me sale esto...


----------



## D@rkbytes (May 21, 2012)

lubeck dijo:


> Hola Dark....
> 
> aprovechando que me acorde del PBP 5.0...
> 
> Oye... has compilado ejercicios con el 18F4550?, yo no he podido, me sale esto...


Saludos lubeck.
Me parece que si he realizado algún ejemplo USB con ese PIC
Dejame buscarlo entre mi desorden y lo posteo, no recuerdo bien si era para el 18F4550
pero creo que si logre solucionar ese detalle que mencionas.

Ahh! y es PBP3 y MCS5


----------



## lubeck (May 21, 2012)

pss:



> Ahh! y es PBP3 y MCS5



cierto!... 


oki... con lo del 4550, te lo agradeceria porque yo lo he intentado pero no he tenido exito...


----------



## inspector gadget (May 21, 2012)

Buenos dias, estoy muy agradecido por el aporte que lubeck anoche mismo me sugirio y que fue la solucion, pense que obviando las R pull-Down y las limitadoras para los leds aunque fuera solo para la simulacion, no me crearia problemas, pero eso era lo que no me permitia que el circuito trabajara como sugirio lubeck, y aunque el efecto que presentaba era interesante, no era lo que estaba necesitando por el momento. Un saludo cordial a Dark, que tambien se ocupo de echarme una mano en la solucion y su codigo tambien funciona a la perfeccion. Lo que me apasiona de la programacion es precisamente que se puede obtener el mismo resultado por diferentes caminos, y ya entendi la aplicacion practica de toggle y voy a seguirla utilizando mas a menudo sin tantas complicaciones, Leccion aprendida, ojala y algun dia llegue a ser tan bueno como ustedes y pueda aportarle a alguien que lo necesite. mil y mil gracias a los dos.
Tenias razon lubeck.. no porque algo sea pequeño, significa que no sea importante...jajaja


----------



## lubeck (May 21, 2012)

> no era lo que estaba necesitando por el momento



 y entonces cual es???




> Lo que me apasiona de la programacion es precisamente que se puede obtener el mismo resultado por diferentes caminos



en realidad no se obtiene lo mismo, en el codigo que te puse usa el *pause* lo que yo *para nada* recomiendo usar, ni los ciclos determinados o trampas como el *while:wend*,la mejor funcion a utilizar es el *button* porque esa no pausa el micro... pero yo no te la sugeri porque no es muy facil de entender y quizas te complicaria mas y para esa aplicacion pues no es imperativo el tiempo....


----------



## inspector gadget (May 21, 2012)

Al decir que no era lo que buscaba me referia al raro efecto que me produjo la simulacion por no tener conctadas las Resistencias. pero tu codigo es lo que buscaba, hace lo que tiene que hacer con el esquema adecuado y a mi me sirve y como este foro es para muchos de nosotros una de las tantas formas de aprender, agradezco tu colaboracion. Gracias lubeck


----------



## lubeck (May 21, 2012)

> Al decir que no era lo que buscaba me referia al raro efecto


Aaa.. Oki... malinterprete la oracion... sorry...




> pense que obviando las R pull-Down y las limitadoras para los leds aunque fuera solo para la simulacion,



hay cosas que se pueden obviar y cosas que no, y se van aprendiendo poco a poco, como un ejemplo te puedo decir que los cristales se pudiera no poner puesto que dentro de las propiedades del micro se pone la velocidad de oscilacion... y por ende no toma en cuenta lo que conectes en Osc1 y Osc2... en caso de que lo pongas externo... y hay muchos otros casos similares que no recuerdo... pero si sabes que lo lleva lo mejor es ponerlo...


----------



## ferdy575 (May 21, 2012)

Hola a todos quisiera sabera sí alguien sabe bien como funciona el freepcb pues según lo que he leido puede generar pcbs hasta de 60 pulgadas por 60 pulgadas y con 16 capas lo que seria un super impreso les agradezco su ayuda, ya lo consegui y lo instale en mi pc pero no logro iniciar ningún proyecto no se que me puede estar faltando


----------



## lubeck (May 21, 2012)

> 60 pulgadas por 60 pulgadas y con 16 capas



a que se refiere con 16 capas???

que en el interior de la PCB tiene mas capas???
si batallo con una, dos muy dificil, treesss imposible, 16 inimaginable...

porque no usas el Ares de proteus... esta bueno... y si simulas en el ya no batallas en andar pasando de aqui para alla... digo como sugerencia... y no yo no he usado el freePCB


----------



## Deca (May 21, 2012)

hola

al igual que inspector tengo un problema con la sentencia TOGGLE que me esta sacando de quicio un poco

yo tengo este codigo


```
TRISB = %11111110

TRISD = %00000001

PORTB = 0

PORTD = 1

INICIO

IF PORTD.1 = 1 THEN TOGGLE PORTB.1
PAUSE 500

GOTO INICIO 

END
```

cuando presiono el boton se enciende el led pero a volver a pulsarlo ya no cambia. 

imagino que la sentencia le falta algo pero para practicar lo queria hacer asi sin definir variables ni nada, un puerto y otro.

alguna sugerencia ?

gracias y lubeck, pronto me pondre con la parte  SHIFTOUT. gracias por tu colaboracion pero necesito pulir cosas antes de llegar a complicarme. a la par de una fuente simetrica jaja


----------



## lubeck (May 21, 2012)

sube tambien la simulacion en proteus pero a ojo de buen cubero quita eso de portD=1 porque no tiene sentido que lo definas como entrada y luego lo haces de salida.... 



aaahhh y pon esto...


IF PORTD.1 = 1 THEN 
TOGGLE PORTB.1
PAUSE 500
endif

en lugar de esto...
IF PORTD.1 = 1 THEN TOGGLE PORTB.1
PAUSE 500


----------



## D@rkbytes (May 21, 2012)

Saludos lubeck
Ya encontre los cambios ha realizar para PBP3.
Debes modificar los siguientes archivos...
C:\PBP3\PBPUS18L.LIB 
Modificalo donde dice include "\PBP\PBPPI18L.LIB" por include "\PBP3\PBPPI18L.LIB"
Ese es un error de meLabs 
Luego, el archivo C:\PBP3\PBPUSB14.LIB modifica la ruta hacia PBP3 como lo de arriba.
Y por último en el archivo C:\PBP3\PBPUSB18.LIB también haz lo mismo.
Trata de compilar el archivo C:\PBP3\USB18\hid_desc.bas
El problema me parece que esta al cambiar a versiones superiores a MPLAB 8.20
Creo que hay que modificar más librerías para que trabajen bien los programas que genera el EasyHID.
El ejemplo que alguna vez probe, y funcionaba bien, lo sigo buscando 
En este link meLabs Forum hay algunos comentarios al respecto.

Suerte.


----------



## Deca (May 21, 2012)

gracias lubeck en cuanto llegue lo pruebo y te comento. de todas formas el puerto d lo defino como entrada puesto que ahi esta el pulsador.

otra cosa a partir de then te lo llevas todo a la siguiente linea ? eso es relevante?

ah , podrias explicarme brevemente el endif?

un saludo grande, gracias por todo


----------



## lubeck (May 21, 2012)

En este....

IF PORTD.1 = 1 THEN 
 TOGGLE PORTB.1
 PAUSE 500
endif

si pulsas en el portD.1 se mete dentro de lo que este entre *Then* y *Endif,* osea que hace el toggle y el pause.... ojo los dos toggle y pause porque estan dentro...


aca...

IF PORTD.1 = 1 THEN TOGGLE PORTB.1
PAUSE 500

si presionas D.1 va a hacer solo el toggle, pero como el pause no esta dentro del then... entonces siempre estara pausando 500mS cada que de una vuelta dentro del ciclo Inicio y Goto Inicio....

por el lado de la definicion del PortD.1

tu le dices con TrisD=%1 que es de entrada, por lo que solo aceptara entradas, pero si tu le dices que portD=1 esta diciendo que D1 sea 1, forzando a que cambie el sentido de entrada a salida...
(en esto no estoy muy seguro... pero si te esta fallando es por algo y es lo que me parece mas sospechoso y honestamente no tengo ganas de comprobarlo y estoy viendo lo del PBP3)





Darkbytes dijo:


> Saludos lubeck
> Ya encontre los cambios ha realizar para PBP3.
> Debes modificar los siguientes archivos...
> C:\PBP3\PBPUS18L.LIB
> ...



Oki ya hice los cambios y si me compila el hid_des.bas...
tambien me compila programas sencillos del 18f4550...  pero persiste el error con el uso de los comandos de USB... (USBInit,USBService,USBIn,USBOut)  deja ver si me encuentro algo en el foro del link que pusiste...


----------



## Deca (May 21, 2012)

hola

acabo de probar tu codigo y no me funciona tal y como creia. cuando defino el puerto como 0 al acabar la sentencia se para. imagino que sera por el endif.

vamos que si uso esto

```
TRISB = %11111110

TRISD = %00000001

PORTB = 0

PORTD = 1
 

INICIO
IF PORTD.0 = 1 THEN
TOGGLE PORTB.0
PAUSE 500
ENDIF

GOTO INICIO 

END
```

se enciende el pin cuando pulso y si vuelvo a pulsar no se apaga pero si pongo esto

```
TRISB = %11111110

TRISD = %00000001

PORTB = 0

PORTD = 0
 

INICIO
IF PORTD.0 = 1 THEN
TOGGLE PORTB.0
PAUSE 500
ENDIF

GOTO INICIO 

END
```

al pulsar mantiene el led encendido 500ms y se para

que puede pasar.

perdonad que no ponga simulaciones pero  es que no las uso y aparte no tengo el programa.

lo hago todo con veroboard...xd


----------



## lubeck (May 21, 2012)

yo decia que lo quitaras.... 
prueba asi...

```
TRISB = %11111110
TRISD = %1
PORTB = 0
INICIO
 IF PORTD.0 = 1 THEN
  TOGGLE PORTB.0
  PAUSE 500
 ENDIF
GOTO INICIO 

END
```


----------



## Deca (May 21, 2012)

lo he probado tal y como lo describes e incluso cambiando el TRISD pero una  vez que pulso ya no cambia a apagado.

que ocurrira? 

que cosas tan raras xd

gracias por todo


----------



## lubeck (May 21, 2012)

Deca dijo:


> lo he probado tal y como lo describes e incluso cambiando el TRISD pero una  vez que pulso ya no cambia a apagado.
> 
> que ocurrira?
> 
> ...


creo que eso es buena señal... acerca el dedo (si tu dedo) a donde esta el puerto RD.0 si cambia quiere decir que esta mal armado, si no cambia sube con algun dibujo tu esquema... y procura utilizar algun diseñador de esquemas..



.. y di que micro estas usando , que oscilador usas (interno, externo, o etc), el codigo deberia funcionar


----------



## Deca (May 21, 2012)

mmmm no cambia. en fin manana intentare subir algun dibujo pero es raro porque todas las practicas que
ido haciendo me han salido bien.... si algo ayuda dire que el esquema que uso es resistencia de 10k a 0v conectada al pulsador.. y la otra parte del pulsador a 5v y al PORTD.0.

espero que sirva... de todas formas me pondre a ello

ah 16f887 y oscilador externo de 10. no tenia de 4... aunque esta definido como 

define osc 10


----------



## D@rkbytes (May 21, 2012)

lubeck dijo:


> .. y di que micro estas usando , que oscilador usas (interno, externo, o etc), el codigo deberia funcionar


Eso es algo que desde que vi que algo andaba mal, me estaba preguntando.





Deca dijo:


> ah 16f887 y oscilador externo de 10. no tenia de 4... aunque esta definido como
> define osc 10


Entonces te falta declarar que usaras los puertos como digitales...
Escribe esto antes del código de tu programa.

ANSEL   = 0     ; Puerto A como digital
ANSELH  = 0    ; Puerto B como digital

Con eso te debe funcionar el programa.

Suerte.


----------



## D@rkbytes (May 22, 2012)

lubeck ya tengo la solución al problema con los descriptores USB para PBP3
OK. Se trata de hacer lo siguiente...

1.- Descomprimir el archivo USBDEMOdesc.bas que adjunto en este post en C:\PBP3\USB18
2.- Generar un programa PBP con EasyHID (Yo seleccione el PIC18F4550)
3.- Copiar el archivo *.pbp generado por EasyHID dentro de la carpeta C:\PBP3\USB18
(Puede ser uno propio, pero yo use el EasyHID) 
4.- Dentro del programa *.pbp hacer esta referencia al archivo de los descriptores.
include "USBDEMOdesc.bas"
5.- Compilar

Con esos pasos me compilo sin los errores que comentas...

Symbol not previously defined (USBDeviceInit) y etc. 

;***************************************************
Estube viendo que archivos son los necesarios para crear proyectos con carpetas independientes.
Estos son los archivos que se tienen que agregar dentro de la carpeta de un proyecto...

usb_dev.asm
usb_hid.asm
usb_mem.asm
usb_dev.inc
usb_hid.inc
y por supuesto USBDEMOdesc.bas

Adjunto también el ejemplo con simulación y proyecto VB6

PD. También lo pude compilar con MCS Plus 3 y PBP 2.60

Suerte.


----------



## Deca (May 22, 2012)

Darkbytes dijo:


> Eso es algo que desde que vi que algo andaba mal, me estaba preguntando.
> 
> 
> 
> ...




Chicos, simplemente gracias. ese era el problema, definir como todo digital... en fin, seguiré con más asuntos.

Un saludo y gracias por todo!!!


----------



## lubeck (May 22, 2012)

*Deca*
En todos los pic que he visto que tienen entradas analogas, al encenderse siempre se inician como analogos y si se ocupan como digitales hay que configurarlos... generalmente es el registro como CmCon, Ansel, ADCOn...

*Dark*

Ahora siii...  ya funciono... 

Es hora de jubilar al PBP2.5 y el MCS3.0... la patria les estará muy agradecida...


Gracias Dark....

PD. Lo que no entiendo es como los de Melabs pasaron por alto ese error tan garrafal...:enfadado:


----------



## D@rkbytes (May 23, 2012)

lubeck dijo:


> PD. Lo que no entiendo es como los de Melabs pasaron por alto ese error tan garrafal...:enfadado:


Pues ya salio PBP 3.0.5 y siguen sin modificar los archivos 
Por si quieren descargar la nueva versión, este es el enlace oficial.

*PICBASIC PRO™ Compiler 3.0 Downloads*

Saludos.


----------



## Nano24 (May 23, 2012)

Buenas amigos del foro, tengo tiempo sin pasar por aca y he tenido una nueva idea, bueno no es nueva porque ya de seguro existe pero si la quería compartir con ustedes y no se si les parece interesante, se trata sobre un control de domotica via Internet. La idea que tuve es si se podia llegar a crear un servidor en VB6 y colgarlo en la red para transmitir datos a un PIC via Internet desde el servidor y poder enceder y apagar las luces de una casa a distancia, yo lo imagine con mi tablet que me compre y se veria mas comodo, algo asi es lo que planteo.


----------



## lubeck (May 23, 2012)

Hola Nano...

Efectivamente no es nuevo, y si es posible... a grandes rasgos hay dos maneras... con visualnet puedes hacer una especie de pagina que cuelgas en algun servidor y puedes acceder desde cualquier computadora, y la otra es hacer con vb6 un cliente y servidor con el winsock... 

la conexion del pic con un router puedes utilizar una pc y comunicacion serial (usart o usb) o venden modulos para conectarte directamente...

por ahi hay varios proyectos echos... busca el blog del compañero meta....


----------



## Nano24 (May 24, 2012)

Hola lubeck, justo pensaba en poder hacerlo así en VB6 que es el que mas conozco para programar, para la parte del envió de datos al pic pues pensaba en la transmisión que se usa SEROUT es mas fácil desde mi punto de vista, el dilema esta en que desconozco en como poder crear el servidor/cliente, seria bueno uno tener un sistema el cual tengas acceso desde cualquier parte a través del Internet.

Si tienes la dirección del amigo meta por favor publicarla para chequear, me gustaría poder realizar este proyecto y aparte contribuir con ideas acá en el foro. Gracias lubeck.


----------



## lubeck (May 24, 2012)

Si mal no recuerdo meta se dedico ha hacer su trabajo por el lado de visualbasic Net... y se puede como comento acceder desde cualquier punto en la red, como proteccion se podria implementar algun metodo de autenticacion de usuario y listo... (cuando lo hizo lo estuvo publicando en todos los temas asi que no se te hara dificil encontrarlo)

yo hice solo un ejemplo de como se hace en vb6.0 y con winsock.. es mas seguro pero tienes el inconveniente que tienes que portar el programa del cliente al equipo que pretendes utilizar...


----------



## Deca (May 24, 2012)

hola de nuevo,

recientemente ando con mis prácticas y ya he llegado a los sistemas LCD y he de decir que ha sido bastante facil. La cosa se complica con el siguiente problema.

He diseñado un circuito en un pic 16f887 con dos pulsadores en el puerto C ( 0 y 1) y un LCD 20 x 4 en el puerto D.

La cosa esta en que definiendo una variable Byte (entre 0 y 255) con nombre Dato cuyo valor es 100 con los dos pulsadores puedo incrementar y decrementar dicho valor y reflejarlo en la pantalla.

EN principio todo bien, el LCD muestra todo correctamente y los Pulsadores estén bien conectados al puerto C y demás pero al pulsarlos no funciona!

Aqui os dejo el código. No se si habré vuelto a dejar escapar algún detalle de los puertos pero para evitar equivocaciones con las salidas analógicas he usado el puerto C.


```
DEFINE LCD_DREG PORTD
DEFINE LCD_BITS 4
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 3
DEFINE OSC 10

TRISD = 0
TRISC = 1

DATO VAR BYTE
DATO = 100

pause 500
 
LCDOUT $fe,1

INICIO

LCDOUT $fe,2

LCDOUT "LCDVOLUME MONITORING"

LCDOUT $FE, $C0, "LEFT - RIGHT + "

LCDOUT $FE, $94, "VOLUME"

LCDOUT $FE, $D4,"VOL:", #DATO, "    " 

IF PORTC.0 = 1 AND DATO < 255 THEN SUMA

IF PORTC.1 = 1 and DATO > 0 THEN RESTA

GOTO INICIO

SUMA:
DATO = DATO + 1
PAUSE 350

RETURN

RESTA:
DATO = DATO - 1
PAUSE 350

RETURN

END
```

alguna idea?

Como siempre y desde ya, gracias a todos por vuestra colaboración

UN saludo

Deca



ya me contesto yo.... faltaba el CALL en suma y resta

gracias a todos de todas formas!


----------



## lubeck (May 24, 2012)

bueno ya te contestaste...


----------



## diodito (May 24, 2012)

mecatrodatos dijo:


> proyecto 3
> 
> 
> ```
> ...



 amigo me gustaría que me mostrara las letras en un solo display


----------



## D@rkbytes (May 25, 2012)

diodito dijo:


> amigo me gustaría que me mostrara las letras en un solo display


 Intenta hacerlo tu mismo, mostrar las letras en un solo display es mas fácil.
El código seria algo como esto...


trisb=0

MainLoop:
    portb=%XXXXXXXX ' Bits que formaran la letra o número
    pause 1000 ' Esperar un segundo
    portb=%XXXXXXXX ' Se repite para la otra letra etc.
    pause 1000 ' Esperar un segundo
    goto MainLoop       ' Repetir el ciclo
    end

Repites el código en verde las veces que letras quieras mostrar.

Con este programa se te hará mas fácil obtener los bits para el display de 7 segmentos.

*Generador de código para displays de 7 segmentos*

Suerte.


----------



## diodito (May 26, 2012)

mmm gracias amigo


----------



## Nano24 (May 27, 2012)

lubeck dijo:


> bueno ya te contestaste...



No pude encontrar el block que me mencionaste, mis dudas son como puedo subir el programa hecho en VB6 en un servidor en internet? Estaba buscando informacion porque mi intencion es que el PIC funcione conectado directamente al Internet sin necesidad de la PC y vi por ahi al SitePlayer.

http://www.superrobotica.com/S310255.htm

No se si hay otra manera de conectar el PIC directo sin necesidad del SitePlayer.


----------



## lubeck (May 27, 2012)

yo no mencione ningun block, si dices el blog de meta reviza su firma... si no lo encuetras ahi es que ya lo quito, o no lo buscaste bien... yo lo baje pero no se donde quedo... 
o usa el buscador y pon las palabras interfaz viual basic....
ojo que el programo el pic en ASM o C no recuerdo.... 



> mis dudas son como puedo subir el programa hecho en VB6 en un servidor en internet?


que yo sepa no se puede o no esta muy facil... por eso te digo que uses visual basic net... ahi si se puede pero yo no lo he hecho....  no se que tan claro te quede esto....



> Estaba buscando informacion porque mi intencion es que el PIC funcione conectado directamente al Internet sin necesidad de la PC y vi por ahi al SitePlayer.


ese es otro metodo que yo desconocia hasta que lo pusiste....

los modulos que yo te mencionaba son estos...
http://es.aliexpress.com/product-fm...ce-module-SPI-network-module-wholesalers.html
en cuanto a su funcionamiento lo desconozco... pero se que no necesitas un PC...

consejo....

haz el proyecto que se te haga mas facil... o que puedas entender y realizar, si piensas en sacar el mejor proyecto con respecto a eso, olvidalo ya existen proyectos con pantallas tactiles, conexion a internet via smartphone y no se cuantas cosas mas (en cuanto a domotizacion)...


----------



## ferdy575 (May 27, 2012)

lubeck dijo:


> a que se refiere con 16 capas???
> 
> que en el interior de la PCB tiene mas capas???
> si batallo con una, dos muy difícil, treesss imposible, 16 inimaginable...
> ...


 
hola lubeck, si en los pcb de alta tecnologia puedes encontrar hasta 16 capas de circuito impreso por eso sí te fijas el pcb de un celular por ejemplo nunca es traslucido siempre es completamente opaco, yo he hecho algunos pcb hasta de 4 capas artesanalmente pero quiero hacer mis pcb de manera profesional por eso quisiera saber como funciona el FREEPCB, gracias por haberme respondido


----------



## lubeck (May 27, 2012)

> yo he hecho algunos pcb hasta de 4 capas artesanalmente



para serte muy honesto, no me imagino como lo haces... podrias pasarme un dato de como buscar ese metodo? (o algun link)


----------



## megatecpower (May 28, 2012)

hola  alguien sabe como puedo regular velocidad de motor universal con pic;



intente con un moc3041 que activa a su vez un dimmer o variac electro. esto se podria aplicar a un lavarropas con este tipo de motor en los cuales llevan una placa con un tda no se cuanto que es un integrado especial para regular la corriente del motor pero se podra con un pic de alguna forma?:enfadado:


----------



## lubeck (May 28, 2012)

a que te refieres con motor universal???

quizas a un motor de corriente directa???  si la respuesta es si... con PWM.. ya sea por software o hardware segun sea el requerimiento..


----------



## megatecpower (May 28, 2012)

el motor universal es de un lavarropas que funciona con la CA


----------



## lubeck (May 28, 2012)

ya vi que es un motor universal 

un motor monofasico de alterna 

con un dimmer con pic (asi buscalo)... 







puede no llevar el sensor de velocidad y de corriente...


----------



## megatecpower (May 28, 2012)

ok bien pero como mando en basic  al gate del triac porque probe con un moc 3041 y un triac bt y lo que hace no es muy buenohno: arranca de golpe muy fuerte sus revoluciones , esto debe empezar despacio para lavado  y luego pasar a centrifugado no se si viste un lavarropas a que velocidad gira


----------



## lubeck (May 28, 2012)

Lee esto a ver si te sirve... https://www.forosdeelectronica.com/f27/triac-bt134-gatilla-correctamente-75334/

se puede con o sin el uso de interrupcion externa.... segun como lo necesites..


----------



## megatecpower (May 28, 2012)

bien lubeck en pocas palabras manos a la obra, voy a tener que hacer variar los tiempos de la gate o pero siempre con con un opto me da cosa ponerlo asi nomas a linea despues comento como mefue graias


----------



## lubeck (May 29, 2012)

Oki... tu decides, con opto tiene que ser uno sin cruce por cero como el moc3011 y un triac unipolar o bipolar, sin opto tiene que ser un triac unipolar y gate sensible y si funciona , en ese experimento a mi se me quemo el micro quizas por tratar de utilizar un bipolar....




> me da cosa ponerlo asi nomas a linea


no se pone asi nomas, se le pone una resistencia limitadora de 5M, o mas yo creo, digo en tu caso que usas 220v, le tienen que llegar algo asi como 35uA al puerto..

y la deteccion de cruce por cero la tienes que hacer si o si con el pic en ambos casos con opto o sin opto...

suerte..


----------



## J2C (May 29, 2012)

lubeck dijo:


> ..... un *triac unipolar o bipolar*, .....


 
Es un semiconductor nuevo ????.




Saludos, JuanKa.-


----------



## lubeck (May 29, 2012)

> Es un semiconductor nuevo ????.



ni idea.. si sea nuevo o no... pero yo acabo de descubrirlo...  y no se si asi se llamen...

pero hay triacs que se disparan segun su cuadrante con positivos o negativo... si gustas dale una leida al link que puse,a mi me dijeron yo no lo invente... 

o pon triac unipolar en el google y te sale...


----------



## J2C (May 29, 2012)

Lubeck

Escribi esa preguntonta a proposito, dado que tu respuesta lleva a confusiones.


*Tiristor:* solo usado en Corriente Continua. Hace muchos años con un tiristor y un puente rectificador de 4 diodos realizaban la misma función que realiza un solo triac.

*Triac:* (llamado a veces Tiristor Bipolar) cumple la misma función que el Tiristor pero funciona en Corriente Alterna (y continua también). Se puede disparar en ambos semiciclos sin problemas. Solo debe tenerse en cuenta la falta de sensibilidad de disparo en algún cuadrante.




lubeck dijo:


> ..... pero hay triacs que se disparan segun su cuadrante con positivos o negativo .....


 
*Fundamental*: los Triac's se disparan siempre en cualquiera de los cuatro cuadrantes, lo único que cambia es la distinta sensibilidad de disparo en alguno de los cuadrantes.





lubeck dijo:


> ..... si gustas dale una leida al link que puse,a mi me dijeron yo no lo invente...  .....


Me los enseñaron hace nada más que 38 años cuando estudiaba, ahora solo leo el detalle de la Datasheet cuando necesito hacer algo con alguno en particular para no tener problemas a posteriori. Me meti con mi comentario del post #2172 para frenar la confusión que generara en los visitantes del thread. 



Saludos, JuanKa.-


----------



## torres.electronico (May 29, 2012)

para poder emplear el circuito del dimmer que esta arriba, se necesita los datos del motor, ya que hay que hacer una modificacion al diagrama y anexar una autoinduccion en serie con la carga...Ahi te anexo un diagrama a modo de ejemplo (como LiveWire no tiene triac, implemente dos tiristores...lo mismo para el diac, implemente dos diodos)...Tambien, te anexe el diseño del pcb de un control que arme para un ventilador con motor universal...solo te pongo la parte de la placa de potencia...la etapa de control es mas que sencilla...pic + pulsodres + display 
Saludos


----------



## lubeck (May 29, 2012)

> Me meti con mi comentario del post #2172 para frenar la confusión que generara en los visitantes del thread.


oki... se agradece....

pero a mi ya me quedo mas confuso ...  despues si gustas lo aclaro en otro tema que no estoy muy metido en eso...

porque lo que te entiendo es que no existen los unipolares o los bipolares no entendi bien cual es el que dices que no existe.... y eso no lo creo...


sacado del link que puse tambien antes...

pd... no vayas a pensar que estoy discutiendo por discutir, me gustaria que me quedara claro eh...


----------



## torres.electronico (May 29, 2012)

Creo que mas o menos entendí por donde arranco el cruce de conceptos y la confusión...
Creo que se mezclan las definiciones de control de fase de un triac, con las de un motor universal, con motor bipolar, monopolar y otras yerbas que hay en el mercado actual...
osea, creo que si no mal interprete a J2C, el comentaba que no existe un triac unipolar o un triac bipolar. Siendo esto cierto, solo hay uno (en sus versiones Opto y en su versión de encapsulados de potencia) y la hoja de datos, lo que comenta, es algo similar a lo comentado anteriormente.... El triac, puede ser controlado en cualquiera de sus cuadrantes, por intermedio de una corriente de dopado que entra por el gate... segun la intensidad de esta corriente, nosotros podemos definir en que momento se excita el triac y comienza a conducir... Ahora, hay que tener en cuenta que si esta la señal de disparo presente al pasar por cero, automaticamente deja de funcionar por que se pone en corto... Por eso, cuando trabajamos en la fabricación de un dimmer, es importante tener como referencia cuando se produce el cruce por cero, para calcular matematicamente con un tmr cuando dispararlo y asi acortar la onda senoidal... Existen en el mercado triac con detector por cruce de cero, esto los hace util para aplicaciones donde no querramos detectar el cruce por cero y tan solo activarlo con una señal en el gate; lo unico que no nos permitiria, es la aplicación para controles de velocidad, dado que tiene problemas de temperatura y su velocidad no es relativamente buena ya que carece de sincronismo...
Volviendo a lo que subi en el otro post, ya que estamos en el baile, perdon por hacer esto bastante extenso, pero creo que serviría para los demas cuando quieran hacer proyectos de control de motores AC o cargas relativamente importantes....
La implementacion de una autoinduccion, es a modo de protección del mismo semiconductor..  osea, asi como ya hablamos alguna vez de la red snnuber para los mosfet, en el caso del triac, para pequeñas cargas un capacitor y una resistencia esta mas que bien, pero en el caso de cargas altamente inductivas o alta mente resistivas, es necesario implementar algo qeu compense la gran corriente de arranque... 
Osea, esta bobina, genera un fenomeno llamado fuerza electromotriz, que seria cuando por un circuito circula una corriente eléctrica, alrededor se crea un campo magnético (esto ya o subi y explique en wiki, pueden verlo desde ahi para tenrlo mas detallado). Si varía la corriente, dicho campo también varía y en el circuito se produce una fuerza electromotriz o voltaje inducido que ayuda a compensar la graqn energia que se necesita en el momento de arranque...hoy, me leo lineas arriba y me mareo, pero sirve? se entiende? aclaro, que nunca estan demas estas inductancias sea para el proyecto que sea, ya que esta fuerza electromotriz, es proporcional a la energia requerida por la carga en el momento de arranque (en el momento de mayor consumo)...
Saludos


----------



## lubeck (May 29, 2012)

Oki... creo que ya me queda claro... lo que pasa es que cuando buscaba un triac vi eso de triac unipolar y bipolar.... (de echo como comento si buscan en la red se encuantran como tales, odio los tecnisismos)

entonces me vuelve a quedar claro el concepto del triac, y cambio mis palabras cuando dije unipolar....

Para no batallar recomiendo usar para un dimmer con pic un triac que se dispare con pulsos solo positivo o negativos, es mas facil...

este esquema con el L4008L6 (que algunos malamente llaman unipolares)







con la salvedad de potencias del motor, inducciones, emis eniss teties y retis, que pudieran afectar segun yo podria funcionar para algo no profesional... (no se que mas se me pueda escapar)


----------



## J2C (May 29, 2012)

Normalmente las confusiones se producen en la traducción del texto de las datasheet's cuando utilizamos traductores de la web, que me disculpe *San Google Traductor*.


_Texto Original:_
They can be controlled by digital circuitry where positive-only or negative-only pulses must control AC current in both directions through the device.


_Texto Traducido con San Google:_
Ellos pueden ser controlados por la circuitería digital donde impulsos positivo o negativo de sólo-sólo debe controlar corriente alterna en ambas direcciones a través del dispositivo.


_Texto Coloquial:_
Ellos pueden ser controlados por los circuitos digitales donde existan "sólo impulsos positivos" ó "solo impulsos negativos" del Gate con respecto al Terminal Principal 1 (MT1)/Anodo1.



La solución es controlarlo como el esquema de Torres.Electronico en el post *#2175* ó (si usamos µControladores) con un opto-acoplador con ó sin cruce por cero según sea nuestra necesidad; por que el problema que existe siempre es cuando se esta en el 4° Cuadrante (QIV) la excitación debe ser practicamente el doble que la existente en los demás cuadrantes, lo puedes observar en la página 2 del archivo de LittelFuse que indicaste en tu post #2171 cuando muestra para cada corriente el segundo grupo.
El esquema del dimmer que muestra Torres.Electronico en su post funciona siempre en los "*Cuadrantes QI ó QIII*" donde no existen problemas de sensibilidad de disparo de los triac's.

Ver el archivo adjunto 73502​ 
En cambio, cuando los disparamos directamente desde un µControlador como el esquema de tu post *#2178* funcionará siempre en los Cuadrantes QI ó QIV y es en este último donde necesitamos duplicar la corriente para disparo del mismo.
En ese esquema y descontando la suma de la caída de tensión del 1N4148 y la tensión máxima de disparo de los Gate, proveera apenas 6,3 mA que es demasiado poco para excitarlos en la totalidad de los cuadrantes.


La solución también es asegurarse que la corriente mínima de disparo (Igt) que provee nuestro circuito sea levementa mayor que la necesaria para el 4° Cuadrante (QIV) del triac que utilizemos, *cuidado* con los reemplazos debido al que podramos comprar donde vivimos !!!! por que siempre estará disponible el que no necesitamos :enfadado:.
Nunca he conseguido el que necesite reemplazar en las plaquetas que he reparado de los lavarropas automáticos así que no me ha quedado otra que modificar la resistencia teniendo en cuenta la máxima corriente que entrega el µControlador de dichas plaquetas.

Adjunto dos datasheet de los Triac más usuales que utilizan dichas plaquetas de lavarropas automáticos a modo de información.



Saludos, JuanKa.-

P.D.:
1- Disculpen la extensión de mi post.
2- Disculpen el "*Off-Topic*" del Curso de *Programación Pic Basic Pro*.
3- Creo que el presente debería ser colocado/movido al thread *Triac BT134 no gatilla correctamente*.


----------



## lubeck (May 29, 2012)

Bueno y ya aprovechando el offtopic...

en pocas palabras... y creo que ya caigo donde estuvo la confusión.... 

creo que tu lo vez la bipolaridad o unipolaridad con respecto a la carga... y es logico pensar que no existen unipolares... no?

pero si le nombran unipolar o bipolar con respecto al gatillado, es decir, cuando gatillas un bipolar necesitas pulsos negativos y positivos, pero si solo necesitas pulsos negativos *o* positivos tal cual es la traduccion coloquial ¿no seria correcto  llamarlo unipolar?...
si me explico? o mejor asi lo dejo y no lo vuelvo a llamar unipolar ya que mas o menos entiendo el funcionameiento y  da igual como le llamen...


----------



## J2C (May 29, 2012)

Lubeck

No es ni unipolar ni bipolar, *es único*!!, triac es TRIAC. Fijate que la unica datasheet que lo nombra de esa forma es la de LittelFuse (inicialmente fabricaba fusibles), pero la de *Nxp* (ex *Philips*) ni la de *ST* (ex *SGS*) dicen algo al respecto de polaridad del triac y estos dos últimas son *tremendos fabricantes* de Semiconductores de todo tipo y de muchísimos años; solo aclaran la polaridad del Gate respecto del MT1 en las Especificaciones Técnicas (como corresponde).



Solo depende de tu esquema de utilización el que lo dispares/gatilles con pulsos positivos, negativos ó de ambas polaridades.


En los comentarios que te realizo creo que DosMetros en el thread del BT134 y el ejemplo de las placas de los lavarropas automáticos; los fabricantes de dichas plaquetas se han asegurado de dispararlo siempre en el cuadrante II ó III al colocar el positivo de +5V del µControlador con el mismo potencial de MT1 (Anodo1) de los triac's.

Esas son las *picardias* de los diseñadores y por lo que depende del diseñor de tu esquema.




Saludos, JuanKa.-


----------



## Alever89 (May 29, 2012)

quiero hacer este problema q esta en el libro de carlos a reyes, pero lo e intentado varias veces pero no me sale alguien me puede ayudar el problema es el siguiente: un sistema de clave similar al de CHEVISTAR, esto es utilizando 3 pulsadores, un
led rojo y un relé de 12 voltios, si la clave 1223 es presionada correctamente activa el
relé, caso contrario se enciende el led rojo por 2 segundos indicando que falló la clave,
después de 3 intentos fallidos, el sistema debe bloquearse por 1 minuto, transcurrido ese tiempo puede volver a activarse.


----------



## lubeck (May 29, 2012)

*Juanka*

Oki.... ya claro como el agua y quedo convencido... 

Gracias...


----------



## torres.electronico (May 30, 2012)

Alever89 dijo:


> quiero hacer este problema q esta en el libro de carlos a reyes, pero lo e intentado varias veces pero no me sale alguien me puede ayudar el problema es el siguiente: un sistema de clave similar al de CHEVISTAR, esto es utilizando 3 pulsadores, un
> led rojo y un relé de 12 voltios, si la clave 1223 es presionada correctamente activa el
> relé, caso contrario se enciende el led rojo por 2 segundos indicando que falló la clave,
> después de 3 intentos fallidos, el sistema debe bloquearse por 1 minuto, transcurrido ese tiempo puede volver a activarse.



 No entendi que necesitas... si tienes el ejemplo, cual seria tu problema? modificarlo?


----------



## diodito (May 30, 2012)

mejor muestra el programa y así te podemos ayudar


----------



## Alever89 (May 31, 2012)

no esta resuelto, es un problema propuesto lo que pasa es q noc como hacer para q el pic entienda que tengo q presionar los pulsadores de esa manera
aparte creo q tengo q emplear una bandera para antirebotes ayudenme porfavor


----------



## D@rkbytes (May 31, 2012)

Alever89 dijo:


> no esta resuelto, es un problema propuesto lo que pasa es que no se como hacer para que el pic entienda que tengo que presionar los pulsadores de esa manera
> aparte creo que tengo que emplear una bandera para antirebotes ayudenme por favor





Alever89 dijo:


> alguien me puede ayudar el problema es el siguiente: un sistema de clave  similar al de CHEVISTAR, esto es utilizando 3 pulsadores, un
> led rojo y un relé de 12 voltios, si la clave 1223 es presionada correctamente activa el
> relé, caso contrario se enciende el led rojo por 2 segundos indicando que falló la clave,
> después de 3 intentos fallidos, el sistema debe bloquearse por 1 minuto, transcurrido ese tiempo puede volver a activarse.


Saludos.
 Lo que intentas hacer es muy sencillo, pero es necesario que seas tu quien lo realice.
Ya te mencionaron que subas tu programa para poder ayudarte.
Si lo que requieres es un método antirebotes, te recomiendo que uses la instrucción BUTTON.
Sin embargo como solo tu sabes que es lo que quieres hacer, por eso es que necesitamos tu código.
Con ese sencillo detalle es como te podremos ayudar.

Suerte.


----------



## lubeck (May 31, 2012)

Escribe de manera correcta... son normas del foro... y sube lo que lleves echo... ya te lo piedieron dos veces...

ooppps tres veces...


----------



## torres.electronico (Jun 1, 2012)

si esto fuera facebook, pondria en el estado "_*rompiendome la cabeza con el TMRO de un 16f877*_" 
Una pregunta por que no doy dedo con tecla sobre el tema... suponiendo que tengo un 16f877a, cristal de 20Mhz... Como hago para configurar el TMR0 para que se interrumpa cada 245ms?
mi idea era ver la posibilidad de mejorar un proyecto para compartir con todos...en realidad, es para darle una mano al amigo Dario, pero se me esta complicando un poco.
La idea, es implementar count o pulsin en un puerto determinado, y configurarlo para que lea pulsos en un tiempo de 240ms; Ese dato lo guardamos en una variable determinada, y cuando la interrupcion por temporizador salta, ese mismo dato almacenado anteriormente se imprimiria en un display LCD...
Creo que de esta  manera, se tendria un programa mucho mas rapido del que presente anteriormente...
Para el caso del shiftLight (este es un aviso luminico de los tacometros), estoy viendo com hacer la comparacion de las RPM en segundo plano, asi se agiliza este `paso tambien... Dario, sumate a la rueda que esto es para vos


----------



## D@rkbytes (Jun 1, 2012)

torres.electronico dijo:


> Una pregunta por que no doy dedo con tecla sobre el tema... suponiendo que tengo un 16f877a, cristal de 20Mhz... Como hago para configurar el TMR0 para que se interrumpa cada 245ms?


Saludos torres.electronico

Quizás este programa que adjunto te sirva para realizar los cálculos que requieres.
Es un programa que genera el código de cabecera para PIC en ensamblador.
Pero tiene varias utilidades, como el cálculo de los timers.

Nota: El programa de la carpeta Setup es para instalarlo.
Y el de la carpeta bin se puede ejecutar directamente. (Ese uso yo)

 Espero te sirva.

Suerte.


----------



## Dario (Jun 1, 2012)

> Dario, sumate a la rueda que esto es para vos


 gracias por preocuparte por mi proyecto torres, estoy en eso. saludosss y gracias che!!!


----------



## torres.electronico (Jun 2, 2012)

D@rio dijo:


> gracias por preocuparte por mi proyecto torres, estoy en eso. saludosss y gracias che!!!


Te gusto la idea nueva? lo ves mas viable Dario?
Darkbyes, joya, descargando, mirando y te comento... Gracias por el aporte
yo tome como ejemplo un par de ejercicios que estaban en el foro, pero los edite y pase al protoboard y no me funciono...estoy convencido que es problemas de fuses y mala config de la interrupcion....
Voy a ver el archivo que me pasas y comento como adelanto en la nueva version del tacometro 
Saludos


----------



## torres.electronico (Jun 4, 2012)

No pude implementar el software de SUKY... Dejo lo que tengo hasta ahora...tengo que modificar el prescaler para que en ves de trabajar cada 16.384 milisegundos, trabaje cada 240ms...
Una pregunta lubeck, Reimy o quien entienda....En ves de count, se podria hacer con la captura del CCP1? Por que si se puede llegr hacer, la captura y o conteo queda en segundo plano y se hace mucho mas agil el programa cuando quiera anexar la comparacion de las rpm obtenidas, con el valor previo fijado apra que me indique que llego a esas RPM...Acá dejo la idea de la implementacion del TMR0 para el tacometro...



```
@ device HS_OSC  
DEFINE OSC 20 
DEFINE ADC_BITS 8 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50 
DEFINE LCD_DREG PORTD 
DEFINE LCD_BITS 4 
DEFINE LCD_DBIT 4 
DEFINE LCD_RSREG PORTD 
DEFINE LCD_RSBIT 2 
DEFINE LCD_EREG PORTD 
DEFINE LCD_EBIT 3 
DEFINE LCD_LINES 2 

revo var byte
ADCON1 = 7      ' PORTA y PORTE digital
Pause 100       
; Set TMR0 to interrupt every 16.384 milliseconds
OPTION_REG = $55        ' Set TMR0 configuration and enable PORTB pullups
INTCON = $a0            ' Enable TMR0 interrupts
On Interrupt Goto tickint

;*********** PROGRAMA ***********************
contador:
     count portc.0, 125, revo
       revo= (revo / 4)/2 * 240 
     GOTO contador 

Disable            ' Disable interrupts during interrupt handler

tickint:
  LCDOUT $FE,1,"RPM=",dec revo
   
tiexit: 
   INTCON.2 = 0    ' Reset timer interrupt flag
   Resume

   End
```


----------



## andresjavierl (Jun 4, 2012)

Hola gente, estoy programando un timer  en display 7 seg. de cuenta regresiva de tres digitos en segundos con PBP y micro code , lo tengo funcionando pero no logro darle precision, he modificado valores hasta  agregue pauseus, pero no doy con la tecla, tambien extrage el fragmento de la interrupcion y junto con la parte para mostrar en el display lo compile y lo simule con Pic simulador ide para ver el tiempo que tomaba en hacer el ciclo y si, se estiran los tiempos  anteriormente lo realice en asembler y recuerdo que quedo muy exacto, les adjunto el basic a ver si me pueden dar una mano. 

Otra cosa por que cuando quiero configurar los fuses como por ej.
@ DEVICE PIC16F877A
@ DEVICE HS_OSC,PROTECT_OFF,WDT_OFF,PWRT_ON,BOD_OFF,LVP_OFF,CPD_OFF
 me da error ilegal opcode


----------



## diodito (Jun 4, 2012)

mecatrodatos dijo:


> proyecto 3
> 
> 
> ```
> ...



 Me podrían decir que significa esto y con respecto a la capacidad
, x var byte                   ;variable con capacidad de 255


----------



## lubeck (Jun 4, 2012)

> Una pregunta lubeck, Reimy o quien entienda....En ves de count, se podria hacer con la captura del CCP1?



yo no tengo idea... nunca he echo algo con el capture... ahora mismo estoy intentando ver como funciona... si le entiendo te intento ayudar...


----------



## torres.electronico (Jun 4, 2012)

lubeck dijo:


> yo no tengo idea... nunca he echo algo con el capture... ahora mismo estoy intentando ver como funciona... si le entiendo te intento ayudar...



Yo me estoy guiando por el ejemplo de melabs... aca te la adjunto


----------



## lubeck (Jun 4, 2012)

creo que ya le entendi.... demasiado tarde con el ejemplo

lo que hace esa cosa del capture es que el tmr1 tiene un contador word(16bits), y cada que sucede una caida o subida del RB3, se graba el dato en el registro word del capture.... y se efectua la interrupcion...

entonces que pex... crees que te sirve ... tu ciclo maximo sera de 240ms???


----------



## reyvilla (Jun 4, 2012)

hola de nuevo por acá, les comento estuve leyendo en una revista y revisando otros archivos, los módulos capture y compare, según entiendo el capture pues como indica el amigo lubeck escanea una frecuencia y con el compare, pues compara otra frecuencia de referencia. Ahora lo noto complicado e incluso mas difícil que por una simple interrupción externa, yo para asegurar incluso usaría un pic eneano solo para el conteo y otro pic para tomar el tiempo del conteo ya que en uno solo me resulta difícil, no digo que no sea posible la cuestión esta en que tan preciso puede llegar hacer y que otras cosas puede hacer el pic aparte de medir las rpm, poniendo que se interrumpe por cada pulso de entrada y por cada desbordamiento del tmr0, los pulsos de entrada son los del motor y seria para el contador, el tmr0 lo utilizaría como temporizador osea cuanto duro cada pulso,  tendría que calcular cada pulso en función a eso llevarlo a rpm, algo así mas o menos, tengo una idea pero aun no muy clara, voy a seguir investigando a ver que mas encuentro por alli saludos...


----------



## torres.electronico (Jun 5, 2012)

lubeck dijo:


> _*lo que hace esa cosa del capture es que el tmr1 tiene un contador  word(16bits), y cada que sucede una caida o subida del RB3, se graba el  dato en el registro word del capture.... y se efectua la interrupcion...
> entonces que pex... crees que te sirve ... tu ciclo maximo sera de 240ms???*_



Excelente, entonces cae como anillo al dedo, ya que al tener en segundo plano el conteo, ya ganamos tiempo de ejecucion de la rutina principal...



reyvilla dijo:


> _*...les comento estuve leyendo en una revista y revisando otros archivos, los módulos capture y compare, según entiendo el capture pues como indica el amigo lubeck escanea una frecuencia y con el compare, pues compara otra frecuencia de referencia....*_



Con este dato, se me esta cerrando la idea mucho mejor formada que la que tenia desde un principio... El tema es ahora sentarme y pesarla bien como armar  ... 
Miren, y comenten si me entienden y es viable lo que se me pasa por la sabiola (cabeza)...
implementamos el modulo capture para contar los pulsos, seteamos el prescaler del tmr0 en 1/4 de segundo, salta la interrupcion del TMR0 y en la rutina de la interrupcion, tomamos el numero de pulsos que conto el modulo capture, lo dividimos por 4 y ahí tenemos una vuelta del motor en lo que fue 1/4 de segundo.... a ese resultado, lo multiplicamos para sacar un minuto, y ahi obtendriamos las RPM finales...
No entendi muy bien lo del modulo comparador...osea, como trabajarlo... esta seria la herramienta indicada para programar un numero de RPM determinadas, en las cuales nosotros despues querramos encender un LED para avisarnos que llego o paso esas RPM programadas (a esto comunmente se lo llama Shift Light)...
Les comento un detalle extra que es para entender como es el ciclo de las RPM en un motor de 4 tiempos...
cada ciclo finalizado del motor, el distribuidor o en otros casos, el sensor de leva y cigueñal, envia un pulso al tacometro que despues de una cuenta matematica calcula las RPM; Al tratarse de un motor de 4 tiempos, son 4 los pulsos que obtenemos al dar una vuelta completa el cigueñal (osea, al pasar por todos los pasos)









Si bien, gran parte del proyecto se basa en programacion, no hayque dejar de lado el diseño del hardware, ya que si no protegemos la entrada del microcontrolador, esta se podria quemar; Pero el otro gran detalle, es que si aplicamos un supresor cualquiera, corremos el riesgo de que se deformen y o pierdan pulsos a determinadas frecuencias... Entre hoy y mañana, les subo el diagrama del circuito asi ya lo vamos teniendo todo completito 
Gracias amigo por la voluntad y la ayuda ​​


----------



## Dario (Jun 5, 2012)

hola torres, te cuento que estoy un poco mareado con esto del tmr0 y demas  siempre me lleve mal con las interrupciones...   me voy a poner a repasar el funcionamiento de las interrupciones y eso del modulo capture y compare. saludosss


----------



## Nano24 (Jun 6, 2012)

Hola amigos, la verdad que quiero actualizarme un poco y empezar a hacer las conexiones del PIC a la PC por medio del USB 

La cosa es que he estado buscando información por Internet y encontré que el Easy HID genera el código en PBP y VB para empezar a hacer nuestros proyectos, ok hasta ahí todo va bien, la cosa es que no entiendo que mas tengo que hacer con el código generado, hay que compilarlo con PicBasic? Porque hay esta mi duda, cuando le doy compilar me genera un montón de errores y no es exactamente por el MPASM porque eso ya lo resolví.

Vean este es un ejemplo, generando código en Pibasic con MPASM para PIC18F4550 para que vean que no genera error ahi, pero vean la otra imagen que es del codigo Easy HID y me da esos errores para ver que respuesta me pueden dar de como solucionar ese problema.

El codigo generado por Easy HID:

DEFINE OSC 48          
DEFINE LOADER_USED 1

USBBufferSizeMax   con 8  ' maximum buffer size
USBBufferSizeTX    con 8  ' input 
USBBufferSizeRX    con 8  ' output

' the USB buffer...
USBBuffer        Var Byte[USBBufferSizeMax] 
USBBufferCount   Var Byte 

' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBService every couple  *
' * of milliseconds or so...                                 *
' ************************************************************
usbinit ' initialise USB...
ProgramStart: 
   gosub DoUSBIn
   gosub DoUSBOut
   goto ProgramStart  

' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
   USBBufferCount = USBBufferSizeRX              ' RX buffer size
   USBService                                    ' keep connection alive
   USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   ' read data, if available
   return

' ************************************************************
' * wait for USB interface to attach                         *
' ************************************************************
DoUSBOut:
   USBBufferCount = USBBufferSizeTX              ' TX buffer size
   USBService                                    ' keep connection alive
   USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
   return

No entiendo cual es el error al compilar


----------



## D@rkbytes (Jun 6, 2012)

Nano24 dijo:


> Hola amigos, la verdad que quiero actualizarme un poco y empezar a hacer las conexiones del PIC a la PC por medio del USB
> 
> La cosa es que he estado buscando información por Internet y encontré que el Easy HID genera el código en PBP y VB para empezar a hacer nuestros proyectos, ok hasta ahí todo va bien, la cosa es que no entiendo que mas tengo que hacer con el código generado, hay que compilarlo con PicBasic? Porque hay esta mi duda, cuando le doy compilar me genera un montón de errores y no es exactamente por el MPASM porque eso ya lo resolví.
> 
> ...



Saludos Nano24
_Por acá resolvimos ese problema hace poco._

Suerte.


----------



## Nano24 (Jun 6, 2012)

mil gracias amigo, sin dudas me funciono pudo generar el archivo hex, pero aun soy novato en esto y quisiera saber que hacer cuando genero el archivo hex como puedo empezar desde algo sencillo como encender un LED por USB desde la pc?


----------



## megatecpower (Jun 6, 2012)

hola al mandar 5V el triac se dispara y enciende la carga pero cuando se pone en 0V el triac sige conduciendo ¿alguien puede darme una idea de como lo hago funcionar como interruptor?


----------



## torres.electronico (Jun 6, 2012)

megatecpower dijo:


> hola al mandar 5V el triac se dispara y enciende la carga pero cuando se pone en 0V el triac sige conduciendo ¿alguien puede darme una idea de como lo hago funcionar como interruptor?



 Para arrancar, eso no es un triac, eso es un scr 
Pero suponiendo que lo estas haciendo en un PCb con un verdadero TRIAC, seria bueno ver cual estas implementando, ya que hay dos tipos de triac y si bien son similares, algunas cosas cmabian  ... Saludos


----------



## megatecpower (Jun 6, 2012)

hola lo hize en protoboard pero con una lampara tal como se muestra en el esquema con un bt139  pero como puedo hacer que funcione como interruptor


----------



## D@rkbytes (Jun 6, 2012)

Nano24 dijo:


> mil gracias amigo, sin dudas me funciono pudo generar el archivo hex, pero aun soy novato en esto y quisiera saber que hacer cuando genero el archivo hex como puedo empezar desde algo sencillo como encender un LED por USB desde la pc?


En el ejemplo USB_Test.rar que adjunte viene como hacer eso.
El programa que se adjunta en VB6 es la interfaz, y el diseño de prueba es el *.DSN de PROTEUS.

Suerte.


----------



## J2C (Jun 6, 2012)

torres.electronico dijo:


> .... Pero suponiendo que lo estas haciendo en un PCb con un verdadero TRIAC, seria bueno ver cual estas implementando, ya que *hay dos tipos de triac y si bien son similares, algunas cosas cmabian*  ... Saludos


 
Interesante, observare para informarme.



Saludos, JuanKa.-


----------



## torres.electronico (Jun 6, 2012)

J2C dijo:


> Interesante, observare para informarme.
> Saludos, JuanKa.-



 tenes el triac que hace un par de topic atras distes catedra... y Tenes con deteccion por cruce de cero automatico, que si miras la hoja de datos, te das cuenta que tenemos algunas caracteristicas nuevas ideales para estos proyectos...
Los bugs que vi en el diseño del hardware son que no tienes una R limitadora de corriente para ingresar en el puerto del pic que sera el encargado de saber cuando se produce el pasaje por cero, sintetizando, directamente no estas haciendo eso por que no se ve en el diagrama que subiste... El otro error, es que no esta desacoplado correctamente el pic, de la seccion de control de potencia... Posibles soluciones... sencillo, para no tener que requerir del sensado por pasaje por cero, podes implementar en la salida un triac activo (no pasivo como el BT139) y solo con una señal puedes controlarlo... la otra, es la implementacion de un opto triac (con modulo deteccion por pasaje de cero) como auxiliar de disparo en tu BT139... con esta ultima, desacoplas micro con etapa de potencia y te olvidas de dolores de cabezas...


----------



## megatecpower (Jun 6, 2012)

perdon pero lo que busco es que desde el pic active el triac sin ningun opto,  pense que con ponerlo en alto se encenderia el foco y en cero se apagaria eso  es lo que busco, pero tengo dudas sobre como puedo detectar el cruce por cero mediante el pic, ademas es cierto cuando apagaba el foco por un interruptor separado, se reinicia el pic; la cuestion es que como podria hacer que prenda y apague una carga sin opto y que no me reinicie el pic

por cierto como es eso de triac activo


----------



## Nano24 (Jun 6, 2012)

Darkbytes dijo:


> En el ejemplo USB_Test.rar que adjunte viene como hacer eso.
> El programa que se adjunta en VB6 es la interfaz, y el diseño de prueba es el *.DSN de PROTEUS.
> 
> Suerte.



Muchas gracias Darkbytes, tendré que ojear muy bien el proyecto de prueba que adjuntaste porque la verdad para ser el inicio lo hiciste muy complejo, no lo entiendo nada pero bueno te agradezco mucho el aporte porque por fin pude solucionar el problema para compilar.


----------



## torres.electronico (Jun 6, 2012)

megatecpower dijo:


> ...por cierto como es eso de triac activo


El triac tiene una arquitectura interna por la cual se lo puede diferenciar en dos tipos; Se lo llama activo a todo aquel que tenga internamente el detector por cruce por cero, y pasivo, al que estas implementando justo en este momento... Date una vuelta por el buscador del foro, hay un par de temas que explican detalladamente como es el funcionamiento del triac, y como controlarlo tambien  
Te doy un consejo? cuidado por que estas jugando con tensiones peligrosas para tu salud... no valla a seer cosa que por no leer primero, mañana no me puedas responder este mensaje 

PD: Si no desacoplas bien el triac del pic, vas a seguir presentando problemas de reinicio o peor aun... quizas te qeudes sin pic ...


----------



## J2C (Jun 6, 2012)

Torres.electronico

Tendrias alguna Datasheet de ejemplo de esos triac's activos, así no quedan dudas para nadie. Por que puede suceder que no los consigamos comercialmente!. 

Por que en definitiva son todas variantes del Triac como por ejemplo los que son SnubberLess (según ST) y los Alternistores (según Littelfuse) que son exactamente iguales.



Saludos, JuanKa.-

P.D.: Creo/noto que de esta manera estamos confundiendo más a quienes no tienen los conocimientos que nosotros llegamos a adquirir con estudio o experiencia.


----------



## megatecpower (Jun 6, 2012)

ok aunque llego tarde el consejo porque ya me dio una sacudida y casi quedo pegado jaja...  pero podrias mencionar algun tipo de triac activo para buscarlo?


----------



## torres.electronico (Jun 7, 2012)

megatecpower dijo:


> ok aunque llego tarde el consejo porque ya me dio una sacudida y casi quedo pegado jaja...  pero podrias mencionar algun tipo de triac activo para buscarlo?


jajaja, tene cuidado que esto no perdona... a ver... vamos nuevamente... tenemos dos tipos de triacs... uno es el que requiere el disparo para conducir, y el otro, tansolo requiere de una señal presente para que funcione... Al primero se los denomina pasivos y al segundo activo... aca te dejo un archivo del foro donde ejemplifican como elaborar un relay de estado solido... basicamente, es lo que tenes que implementar vos en tu circuito para no tener que jugar en tu programa del pic, la deteccion del pasaje por cero... 

Ver el archivo adjunto 30346



J2C dijo:


> ...P.D.: Creo/noto que de esta manera estamos confundiendo más a quienes no tienen los conocimientos que nosotros llegamos a adquirir con estudio o experiencia.


:enfadado: *No, yo creo o noto que estas tratando de confundir vos a las personas...* :enfadado:
 Por que no implementas google o simplemente, buscas libros sobre semiconductores? Yo realmente no tengo ganas de dar catedra ni de salirme de tema para que despues sean borrado los comentarios...
Yo hasta ahora, no te vi aportar nada en el topico referente al tema, solo note un grado de interes en generar mas offtopic, que otra cosa... Quizas sea mejor que te remitas a leer, aprender y no se... poner quizas la pava en el fuego asi tomamos unos mates? No se, hablamos por el msn, por MP, o por telefono si queres, pero tatemos de no irnos del tema original...
Saludos


----------



## megatecpower (Jun 7, 2012)

excelente el rele de estado solido pero me gustaria disminuir la cantidad de componentes,  , ¿como podria detectar con el pic el cruce por cero para que no siga conduciendo la carga?


----------



## Nano24 (Jun 7, 2012)

Alguien tiene algún ejemplo de como enviar datos de VB a PIC por USB? Es extraño que en Internet no hay ni un ejemplo que le diga a uno como iniciar así sea encendiendo un solo LED, ya tengo todos los programas listo y me compilan y todo, pero no entiendo nada que hacer con esto:


```
INCLUDE "USBDEMOdesc.bas"
DEFINE OSC 20          
DEFINE LOADER_USED 1

USBBufferSizeMax   con 8  ' maximum buffer size
USBBufferSizeTX    con 8  ' input 
USBBufferSizeRX    con 8  ' output

' the USB buffer...
USBBuffer        Var Byte[USBBufferSizeMax] 
USBBufferCount   Var Byte 

' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBService every couple  *
' * of milliseconds or so...                                 *
' ************************************************************
usbinit ' initialise USB...
ProgramStart: 
   GOSUB DoUSBIn
   gosub DoUSBOut
   goto ProgramStart  

' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
   USBBufferCount = USBBufferSizeRX              ' RX buffer size
   USBService                                    ' keep connection alive
   USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   ' read data, if available
   return
   
' ************************************************************
' * wait for USB interface to attach                         *
' ************************************************************
DoUSBOut:
   USBBufferCount = USBBufferSizeTX              ' TX buffer size
   USBService                                    ' keep connection alive
   USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
   return
```


Por lo menos donde le digo que si recibe un dato "x" desde VB el PIC lo verifique en un bloque IF, THEN, ENDIF ?

Y como autorizo desde VB por ejemplo cree un TextBox y le diga que al ser Tetx1.Text = "x" envie el dato por el USB?

Solo con eso me seria una gran ayuda.


----------



## chapin (Jun 7, 2012)

esto te puede ayudar http://www.neoteo.com/conecta-tus-proyectos-al-puerto-usb


----------



## GoX F4yCk3r DB (Jun 8, 2012)

Hola que tal, ando usando el convertidos analogico digital del pic, ya elabore un programita, lo que quiero es leer el estado de un potenciometro haciendo un divisor de voltaje con el mismo, y mi resultado visualizarlo a tráves de todo el puerto b con leds. por cierto el pic es el 16f877A


Este es mi programa

Define ADC_BITS 8                 ;Numero bits del resultado=10
Define ADC_CLOCK 3             ;fuente  del Reloj 3 (3=rc)
Define ADC_SAMPLEUS 50    ;tiempo de muestreo del ADC en useg
Resultado var word                  ;Historia de la conversion
TRISA = %11111111              ; PORTA configurado como entradas
ADCON1 = %10000010         ; PORTA analog y justificacion del resultado

;Programa Principal
inicio: 
ADCIN 0, Resultado            ;lee Ra0 y guarda en  resultado
Portb=Resultado
goto inicio 
end


Pero tengo el gran problema de que no me funciona, alguna sugerencia???
Algun tutorial?? aun no entiendo al 100% como funciona este comando.
salu2


----------



## reyvilla (Jun 8, 2012)

GoX F4yCk3r DB dijo:


> Hola que tal, ando usando el convertidos analogico digital del pic, ya elabore un programita, lo que quiero es leer el estado de un potenciometro haciendo un divisor de voltaje con el mismo, y mi resultado visualizarlo a tráves de todo el puerto b con leds. por cierto el pic es el 16f877A
> 
> 
> Este es mi programa
> ...



Una sugerencia , si, puedes sube una diagrama para simularlo y ver porque no funciona, de momento todo lo veo bien, ahora, lo unico seria declarar los fuses, y definir la variable como byte, pero asi como esta deberia de funcionar, pero como te digo si tienes una simulacion mucho mejor...


----------



## GoX F4yCk3r DB (Jun 8, 2012)

Hola que tal gracias por responder, lo tengo simulado en proteus, solo que este es una versión muy vieja  muy muy vieja.
bueno dejo adjunto el archivo de proteus y mi archivo en Microcode asi como el Hex.


----------



## Nano24 (Jun 8, 2012)

chapin dijo:


> esto te puede ayudar http://www.neoteo.com/conecta-tus-proyectos-al-puerto-usb



 De verdad que me rindo, me canso eso de tratar de hacer conexiones por USB, son un total fastidio, lleva mucho proceso y es complicadisimo para hacer la comunicacion del PIC con el PC o viceversa, me quedo con el puerto serie, mas rapido y menos complicado.


----------



## GoX F4yCk3r DB (Jun 8, 2012)

Yo ya he logrado hacer comunicacion en serie con labview via usb...
Si gustas te puedo ayudar.
No es mucho lo que he hecho pero si lo basico y de ahi parte todo


----------



## reyvilla (Jun 8, 2012)

GoX F4yCk3r DB dijo:


> Hola que tal gracias por responder, lo tengo simulado en proteus, solo que este es una versión muy vieja  muy muy vieja.
> bueno dejo adjunto el archivo de proteus y mi archivo en Microcode asi como el Hex.



Mira la cosa esta en el adc del pic, la resolución es de 10bit para el 16f877A, por lo cual no podras trabajarlo a 8bits directamente, tendrías que leer los 10bits y luego llevarlo a ocho pero no tendria mucho sentido, en fin, por otro lado te recomiendo leer sobre configuraciones de fuses  y tener en cuenta que debe declararse todos los puertos así no se utilicen, esto para garantizar que todo esta bien configurado, aparte igual ocurre para el oscilador debe indicarse a que frecuencia se va a trabajar, eso aplica tanto para el código como para la simulación. entonces si no configurar como salida el puerto b por ejemplo no te va a funcionar de manera correcta, acá te dejo el código arreglado...


```
@ DEVICE PIC16F877A   ;Seleccion del Microcontrolador PIC16F877A
@ DEVICE XT_OSC       ;Seleccion del Tipo de oscilador XT de Cristal
@ DEVICE WDT_Off      ;Seleccion del Watchdog Timer Apagado
@ DEVICE PWRT_OFF     ;Seleccion del Power-on Reset Apagado
@ DEVICE BOD_Off      ;Seleccion del Brown-out Reset Apagado
@ DEVICE LVP_OFF      ;Seleccion del Low-Voltage Programming Apagado
@ DEVICE WRT_OFF      ;Seleccion del Flash Program Memory Write Apagado
@ DEVICE DEBUG_OFF    ;Seleccion del In-Circuit Debugger Apagado
@ DEVICE CPD_OFF      ;Seleccion del Data EEPROM Memory Code Protection Apagado
@ DEVICE PROTECT_Off  ;Seleccion del Flash Program Memory Code Protection Apagado

Define OSC 4  'Definicion de oscilador a 4MHZ



CMCON=0  'Desabilita los comparadores

Define ADC_BITS 10                 ;Numero bits del resultado=10
Define ADC_CLOCK 3             ;fuente  del Reloj 3 (3=rc)
Define ADC_SAMPLEUS 50    ;tiempo de muestreo del ADC en useg
Resultado var byte                  ;Historia de la conversion
'******************************DECLARACIONES DE I/O*****************************
TRISA = %11111111


ADCON1 = %10000010         ; PORTA analog y justificacion del resultado

;Programa Principal
inicio: 
ADCIN 0, Resultado            ;lee Ra0 y guarda en  resultado
Portb=Resultado
goto inicio 
end
```


----------



## D@rkbytes (Jun 8, 2012)

reyvilla dijo:


> acá te dejo el código arreglado...
> 
> ```
> @ DEVICE PIC16F877A   ;Seleccion del Microcontrolador PIC16F877A
> ...


Saludos reyvilla.
La instrucción CMCON = 0 en este caso debería ser CMCON = 7 ; CM2,CM1,CM0 = b'111'
Pero no es necesario ponerla, ya que por default en el PIC16F877A los comparadores se inician en OFF

Suerte.


----------



## reyvilla (Jun 8, 2012)

Darkbytes dijo:


> Saludos reyvilla.
> La instrucción CMCON = 0 en este caso debería ser CMCON = 7 ; CM2,CM1,CM0 = b'111'
> Pero no es necesario ponerla, ya que por default en el PIC16F877A los comparadores se inician en OFF
> 
> Suerte.



Cierto amigo, muchas gracias por la observacion, se me paso ya que fue un copi pega de otro codigo que tenia guardado y son esos pequeños detalles que pueden causar dolor de cabeza si no se toman en cuenta...


----------



## ferdy575 (Jun 10, 2012)

megatecpower dijo:


> ok aunque llego tarde el consejo porque ya me dio una sacudida y casi quedo pegado jaja... pero podrias mencionar algun tipo de triac activo para buscarlo?


 
hola, te cuento la mejor forma de manejar un triac con un pic es usando un optotriac usa esta configuración y veras


----------



## reyvilla (Jun 10, 2012)

yo opino igual de echo llegue a realizar un secuenciador de luces de 100W con un pic12F675, 5 bombillos, y con red snubber, para los bombillos ahorradores o blancos sin la red snubber ya que tiende a titilar, parpadear, ahora, creo que dependiendo del optotriac puedes dimmear o no los bombillos.


----------



## ferdy575 (Jun 10, 2012)

Hola a todos les cuento que ando tratando de hacer un temporizador pero no logro hacer cuenta regresiva en el reloj alguien sabe como hacer esto?
este es el código que tengo pero no funciona como debería:


```
'@ DEVICE pic16F84A, WDT_ON 
@ device xt_osc 
define osc 4 
Define LCD_DREG PORTB
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5
Symbol Horas = PORTA.0 ; AJUSTE HORA
Symbol Minutos = PORTA.1 ; AJUSTE MINUTOS
Symbol Segundos = PORTA.2 ; AJUSTE SEGUNDOS
symbol Out = PORTB.7 ; SALIDA CONTROL 
Pulsos VAR byte 
Hrs VAR byte 
Mts VAR byte 
Sds VAR byte 
Disp VAR byte 
Delay VAR byte 
 
TRISB = %00000000 
TRISA = %00001111 
PAUSE 500 
 
Hrs = 0
Mts = 0
Sds = 0
pulsos = 0
OPTION_REG = %00000101 ; prescaler = 64
ON INTERRUPT GOTO ISR ; IR A RUTINA ISR 
INTCON = %10100000 
LCDOUT $FE, 1 ;LIMPIA LCD
;INCIO DEL PROGRAMA 
LOOP:
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON HORAS CUANDO ES ACCIONADO
IF Horas = 0 THEN
hrs = hrs + 1
IF hrs = 24 THEN hrs = 0
Gosub Debounce
ENDIF
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTOS CUANDO ES ACCIONADO
IF Minutos = 0 THEN
Mts = Mts +1
IF Mts = 60 THEN Mts = 0
Gosub Debounce
ENDIF
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON SEGUNDOS CUANDO ES ACCIONADO
if Sds = 0 then
Sds = Sds + 1
endif
IF Sds = 60 then Sds = 0
Gosub Debounce
'ENDIF
;RUTINA PARA DETECCIÓN DE CERO
IF hrs = 0 AND Mts = 0 AND Sds = 0 THEN
out = 1
else 
out = 0
endif
;RUTINA PARA MOSTRAR VLORES EN EL lcd DE H:M:S
IF Disp = 1 THEN
LCDOUT $FE, 2
Lcdout " Tiempo espera " 
LCDOUT $FE,$C4, DEC2 hrs, ":",DEC2 Mts, ":",DEC2 Sds
Disp = 0
ENDIF
GOTO LOOP
; RUTINA DE RETARDO PARA LEER BOTONES 
Debounce:
FOR Delay = 1 To 200
Pause 1 
NEXT Delay 
Disp = 1 
RETURN
; RUTINA PARA EJECUCION DE UN SEGUNDO
DISABLE
ISR:
pulsos = pulsos + 1
IF pulsos < 61 THEN NoUpdate
;RUTINA DE TIEMPO 
Retro:
pulsos = 0
Sds = Sds - 1 
IF Sds = 60 THEN
Sds = 0
Mts = Mts - 1 
IF Mts = 60 THEN
Mts = 0
hrs = hrs - 1 
IF hrs = 24 THEN
hrs = 0
ENDIF
ENDIF
ENDIF
Disp = 1 
return
; RUTINA DE LA CULMINACION DEL TIEMPO DE ACTIVACION
NoUpdate:
INTCON.2 = 0 
Resume
ENABLE 
END
END
```
 
y aqui pongo la simulación a ver sí alguno me puede ayudar
les agradezco de antemano


----------



## torres.electronico (Jun 10, 2012)

Se que para muchos moderadores, este mensaje lo pueden llegar a interpretar como off-topic, pero no queria dejar pasar la oportunidad para madarle todas mis fuerzas a una de las tantas personas grosas que aporto mucho en este topic y que justamente no esta pasando por buenos momentos...
Reimy, vamos viejo...aca desde Argentina, tenes un amigo que te apoya en lo que pueda; un abrazo y fuerza para seguir adelante... La vida, continua 

Vamos amigos, mandemos un me gusta para acompañar al amigo que no esta pasando por un buen momento


----------



## reyvilla (Jun 11, 2012)

Muchas gracias amigo torres.

Hola ferdy575, te recomiendo empezar de cero el código ya que a mi parecer te estas complicando mucho al utilizar la interrupción de esa manera, me explico, para que utilizar interrupción para descrementar 3 variables en el loop de interrupción si puedes con una sola hacer lo mismo en el loop principal, por otro lado debes tener en cuenta que de 0 a 59 hay 60 números por lo cual no se toma en cuenta el valor 60 si no a partir de 59, si estas decrementando y estas en 0 el siguiente numero es 59. Si estas incrementando y llegas a 59 el siguiente numero es 0. Ahora para que puedas programar una base de tiempo debes darle un algoritmo de tal manera que empiece a decrementar solo y solo si por lo menos existe 1 segundo en el reloj. De lo contrario para que vas a decrementar si todo es 00:00:00, no tiene sentido. Ademas debes colocar o te recomiendo una entrada que sea como un start por lo mismo de la programación, solo si necesitas que sea preciso, ya que ir programando el tiempo mientras este se va decremnetando tampoco le veo mucha lógica. Aca tu codigo con unas pequeñas modificaciones.


```
@ DEVICE pic16F84A  
@ device xt_osc  
define osc 4 

Define	LCD_DREG	PORTB
Define	LCD_DBIT	0
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	4
Define	LCD_EREG	PORTB
Define	LCD_EBIT	5

Symbol Horas = PORTA.0      ; AJUSTE  HORA
Symbol Minutos = PORTA.1    ; AJUSTE MINUTOS
Symbol Segundos = PORTA.2   ; AJUSTE SEGUNDOS
symbol Out = PORTB.7        ; SALIDA CONTROL 

Pulsos VAR byte 
Hrs VAR byte 
Mts VAR byte 
Sds VAR byte 
Disp VAR byte 
Delay VAR byte 
CLEAR
 
TRISB = %00000000 
TRISA = %00001111 

PAUSE 500 


Hrs = 0
Mts = 0
Sds = 0
pulsos = 0


OPTION_REG = %00000101 ; prescaler = 64
ON INTERRUPT GOTO ISR ; IR A RUTINA ISR 
INTCON = %10100000 
LCDOUT $FE, 1 ;LIMPIA LCD

;INCIO DEL PROGRAMA 

LOOP:

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON HORAS CUANDO ES ACCIONADO

IF Horas = 0 THEN
hrs = hrs + 1
ENDIF
IF hrs = 24 THEN 
hrs = 0
Gosub Debounce
ENDIF

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTOS CUANDO ES ACCIONADO
IF Minutos = 0 THEN
Mts = Mts + 1
ENDIF
IF Mts = 59 THEN 
Mts = 0
Gosub Debounce
ENDIF

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON SEGUNDOS CUANDO ES ACCIONADO
if Segundos = 0 then
Sds = Sds + 1
endif
IF Sds = 59 then 
Sds = 0
Gosub Debounce
ENDIF

;RUTINA PARA DETECCIÓN DE CERO
IF hrs = 0 AND Mts = 0 AND Sds = 0 THEN
out = 1
else 
out = 0
endif

;RUTINA PARA MOSTRAR VLORES EN EL lcd DE H:M:S

IF Disp = 1 THEN
LCDOUT $FE, 2
Lcdout "Tiempo de espera "  
LCDOUT $FE,$C4, DEC2 hrs, ":",DEC2 Mts, ":",DEC2 Sds
Disp = 0
ENDIF
GOTO LOOP

; RUTINA DE RETARDO PARA LEER BOTONES 

Debounce:
FOR Delay = 1 To 200
Pause 1 
NEXT Delay 
Disp = 1 
RETURN
; RUTINA PARA EJECUCION DE UN SEGUNDO

DISABLE
ISR:
;RUTINA PARA DETECCIÓN DE CERO
IF hrs > 0 OR Mts > 0 OR Sds > 0 THEN
pulsos = pulsos + 1
IF pulsos < 59 THEN NoUpdate

;RUTINA DE TIEMPO 

Retro:
pulsos = 0
Sds = Sds - 1
IF Sds = 0 AND Mts => 0 then
Sds = 59
Mts = Mts - 1
endif 
IF Mts = 0 AND hRS > 0 THEN
Mts = 59
hrs = hrs - 1 
ENDIF
ENDIF

Disp = 1 
return

; RUTINA DE LA CULMINACION DEL TIEMPO DE ACTIVACION

NoUpdate:
INTCON.2 = 0 
Resume
ENABLE 
END
END
```


----------



## ferdy575 (Jun 11, 2012)

Reyvilla dijo:
Hola ferdy575, te recomiendo empezar de cero el código ya que a mi parecer te estas complicando mucho al utilizar la interrupción de esa manera, me explico, para que utilizar interrupción para descrementar 3 variables en el loop de interrupción si puedes con una sola hacer lo mismo en el loop principal.

Hola Reyvilla gracias por responder, a ver te cuento compile el código como tú lo reformaste pero igual no me funciona, no se por que al pulsar el botón segundos no me avanza y sí de pronto lo hace cuando llega a cero sigue titilando entre cero y uno como sí quisiera volver a avanzar, quisiera que al llegar a cero simplemente quede detenido, ó algunas veces retrocede los segundos empezando desde 99, tampoco he podido encontrar la forma de usar un botón de arranque de conteo o START, en resumidas cuentas un caos total:enfadado: por fa ayudame. Lo que etoy tratando de hacer es un temporizador para el horno de la estufa de mi esposa que es aficionada a hacer tortas así podria programar el tiempo de horneado y que el horno se apague cumplido el tiempo
Gracias


----------



## reyvilla (Jun 11, 2012)

ok una forma sencillas es si revisas que cambie y que cambio hay, no te hice todo, mejore el código, mas aun le falta, si notaste ya decrementa de 59 a 0. Dame un chance y en la tarde revisó
 de nuevo...Saludos


----------



## GoX F4yCk3r DB (Jun 11, 2012)

Hola que tal, gracias por su ayuda, he hecho unas pequeñas correcciones al código y ya quedo al 100%. Aquí les dejo el código.

DEFINE ADC_BITS 8       ' Set number of bits in result
DEFINE ADC_CLOCK 3     ' Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds 
R VAR BYTE
trisb=0
Portb=0
'Trisa=1
Trisa= 255 ' Set PORTA to all input
ADCON1 = 2  ' PORTA is analog

inicio:

ADCIN 0, R' Read channel 0 to B0
Portb=R
GOTO inicio

END


salu2


----------



## ferdy575 (Jun 11, 2012)

reyvilla dijo:


> ok una forma sencilla es si revisas que cambie y que cambio hay, no te hice todo, mejore el código, mas aun le falta, si notaste ya decrementa de 59 a 0. Dame un chance y en la tarde revisó
> de nuevo...Saludos


 
Bien hice lo que dices y ya logre hacer el start el stop y un clear pero sigo sin lograr el correcto conteo regresivo sigo sin poder encontrar donde estará el error:enfadado: 
aquí subo el archivo con todas las modificaciones que he hecho a ver como me puedes ayudar.


----------



## D@rkbytes (Jun 11, 2012)

Saludos ferdy575
Hace unos meses hice un timer descendente programable hasta 60 minutos.
No usa interrupciones y según recuerdo no es muy exacto.
Pero para conteos donde no se requiere mucha precisión, este timer funciona bien.
Tiene la opción de guardar el conteo deseado en la eeprom del pic,
para no estarlo estableciendo cada vez que se use el timer.

Lo adjunto, quizas te puede servir.

Edit:
No había visto que existe un bug en el programa en la parte donde se escribe en la memoria.
Esta es la corrección que hay que hacer...

```
BUTTON pb_EE,0,255,0,B0,0,Here
WRITE 0,Total
LCDOUT $FE,$C0,DEC2 Total,"MIN. EN EEPROM"
PAUSE 2000
LCDOUT $FE,1," TIMER INACTIVO" ; <--- Agregar este código
LCDOUT $FE,$C3,DEC2 Total," MINUTOS"
```
Suerte.


----------



## ferdy575 (Jun 12, 2012)

Darkbytes dijo:


> Saludos ferdy575
> Hace unos meses hice un timer descendente programable hasta 60 minutos.
> No usa interrupciones y según recuerdo no es muy exacto.
> Pero para conteos donde no se requiere mucha precisión, este timer funciona bien.
> ...


 
gracias esta super tu temporizador pero no le puedo programar segundos no entiendo muy bien como funciona tu programa


----------



## D@rkbytes (Jun 12, 2012)

ferdy575 dijo:


> gracias esta super tu temporizador pero no le puedo programar segundos no entiendo muy bien como funciona tu programa


De nada ferdy. 
Bien, pues ese timer lo hice para probar una rutina de retardos que hice hace para otro programa.
Se me hace que lo complique mucho 
Después de ese empecé a programar otro de manera diferente y ya no lo termine.
Déjame ver si lo puedo terminar pronto y lo posteo.

Suerte.


----------



## Deca (Jun 14, 2012)

hola!

recientemente me he topado con un problema que creo poder solucionar aunque me gustaria contar con 
vuestra ayuda.

Estoy haciendo prácticas con las interrupciones y tal ( algo liosas XD) y me ha surgido un pequeño problema porque tengo un circuito al que quiero añadir un encoder incremental para hacer las veces de un 
pulsador.

La cosa está en que creía que la conexión y el software sería parecido al de un pulsador normal pero me estoy dando cuenta que no. 
Alguien me habló de usar las interrupciones y tal...

Podrían darme algún consejo, ayuda o fragmento de programa?

Gracias de antemano!!!


----------



## arturouc (Jun 15, 2012)

Deca dijo:


> hola!
> 
> recientemente me he topado con un problema que creo poder solucionar aunque me gustaria contar con
> vuestra ayuda.
> ...



Yo he utilizado el timer como contador, el modulo de captura CCP para contar los pulsos de un encoder incremental

mira este post _ https://www.forosdeelectronica.com/posts/486259/ _

espero hoy o mañana postear la versión mas actualizada con PID ya casi listo
donde utilizo un PIC con un modulo QEI (modulo para encoder incrementales)
es el 18f4431

Autotronico si andas por ahí espero mires el siguiente proyecto con el 18f4431


----------



## ferdy575 (Jun 15, 2012)

Hola a todos, bueno les cuento que ya logre el correcto conteo regresivo, ya me funcionan correctamente los botones clear, stop y el start y ya puedo programar independientemente las horas minutos y segundos, "Pero" tengo un pequeño error que no logro descifrar:enfadado: quizá uds. me puedan ayudar. resulta que el contador al llegar a 15:01:59 independientemente de la hora que puede ser inferior o superior se resetea y empieza nuevamente en 23:59:59 adicionalmente no logro que llegue a las 00:00:00 horas para que se dispare la alarma, aquí les subo los archivos a ver sí logran descifrar mi error y les agradezco su colaboración


----------



## reyvilla (Jun 15, 2012)

Hola ferdy575, estoy de nuevo por aca, debido a un problema personal no habia vuelto a participar, te comento, revise tu circuito y codigo, el problema esta en que le indicaste que si llega a 00 entonces el valor de minutos es igual a 59, no existe la condicion si minutos es menor a 0 ese es un detalle importante, por otro lado, yo realice un temporizador programable esta aqui _ https://www.forosdeelectronica.com/posts/344467/ _revisalo y me avisas


----------



## ferdy575 (Jun 17, 2012)

reyvilla dijo:


> Hola ferdy575, estoy de nuevo por acá, debido a un problema personal no había vuelto a participar, te comento, revise tu circuito y código, el problema esta en que le indicaste que si llega a 00 entonces el valor de minutos es igual a 59, no existe la condición si minutos es menor a 0 ese es un detalle importante, por otro lado, yo realice un temporizador programable esta aquí _ https://www.forosdeelectronica.com/posts/344467/ _revisalo y me avisas


 
hola, gracias por revisar mi circuito bueno te cuento reforme la rutina de "TIEMPO" y quedo así: 

;TIEMPO
Retro:
pulsos = 0
*if* hrs < 00 *then*
hrs = 23
*endif*
*IF* Mts < 00 *AND* hRS => 00 *THEN*
hrs = hrs - 1 
Mts = 59
*ENDIF*
*IF* Sds < 00 *AND* Mts => 00 *then*
Mts = Mts - 1
Sds = 59
*endif*
*if* sds < 00 *then* 
sds = 59
*endif*
Sds = Sds - 1
Disp = 1 
*RETURN* 

pero no obtuve resultados favorables por el contrario se vuelve loco el conteo y no se porque lo segundos me estan empezando en 99 y al llegar a 00 no descuentan el minuto, y los minutos al llegar a 00 resetean el conteo, no descuentan la hora y no llega nunca al 00:00:00 para que se dispare la alarma y se detenga el conteo al mismo tiempo; no se que sera lo que tiene mal hecho mi codigo a ver sí me puedes ayudar, lo que quiero es hacer un temporizador donde pueda programar tiepos exactos incluyendo programar hasta lo segudos para que sea un temporizador multiusos, aqui subo de nuevo el temporizador y gracias de antemano


----------



## Deca (Jun 18, 2012)

arturouc dijo:


> Yo he utilizado el timer como contador, el modulo de captura CCP para contar los pulsos de un encoder incremental
> 
> mira este post _ https://www.forosdeelectronica.com/posts/486259/ _
> 
> ...



No entiendo demasiado lo que quiere decir.

Podrian concretar un poco en el apartado del encoder?

Gracias


----------



## ferdy575 (Jun 20, 2012)

hola a todos, de nuevo por este lado y con el mismo trabajo, no logro descifrar que tengo mal en mi código, a ver sí alguien logra dar con este error y me ayuda para ver cual es el problema, aquí subo nuevamente el archivo para que lo puedan ver y verificar le he hecho miles de reformas linea por linea y no logro que funcione como debe ser, les agradezco su colaboración


----------



## Dario (Jun 20, 2012)

hola gente, yo por aqui de nuevo. bueno, hace tiempo no le daba bolilla pero, de repente se me dio la idea de crear una consola midi para controlar el virtual dj desde afuera programando un pic con pic basic. aqui en el foro, hay una que hizo el amigo fernandoae pero sinceramente no entiendo nada  . bueno, la idea es crear una interface para coectar en el puerto serial por ahora, ya que tengo experiencia en conectar un pic al puerto y leerlo en la pc, pero de lo que no tengo idea es, como hacer para vincular el vdj con el pic mediante el puerto serie. ¿alguno de uds me tira una idea como para ir probando? aunque sea unas cuantas liniesitas que me den una idea, o un diagrama de bloques... ¿me ayudan? saludosss


----------



## harrito89 (Jun 21, 2012)

Hola amigos!

Estoy elaborando un proyecto que se trata de un reloj calendario con el 16f84a, una lcd y el ds1307, estuve mirando el post #84 que publico cesar_8k en este mismo tema, en el cual me base para adaptarlo al 16f84a y q solo muestre la hora. Pero tengo dos problemas el primero es que se me cuelga el conteo en un momento determinado y el otro es que no logro hacer funcionar los botones para modificar la hora, revise el codigo una y otra vez pero no he dado con los errores.

les pido una ayuda para ver que no estoy tomando encuenta. 

les agradezco su colaboracion!


les adjunto el codigo en basic y la simulacion en proteus


----------



## reyvilla (Jun 21, 2012)

ferdy575 dijo:


> hola a todos, de nuevo por este lado y con el mismo trabajo, no logro descifrar que tengo mal en mi código, a ver sí alguien logra dar con este error y me ayuda para ver cual es el problema, aquí subo nuevamente el archivo para que lo puedan ver y verificar le he hecho miles de reformas linea por linea y no logro que funcione como debe ser, les agradezco su colaboración



Hola de nuevo veo que sigues sin avanzar mucho, te diria que utilizaras una rutina mas faltible, me explico no "EXISTE" osea no creo que eso exista ni lo entienda el compilador, un "NUMERO", menor a "0", osea no puede hacer esto:


```
IF hrs < 0 or Mts < 0 or Sds > 0 THEN   'Ojo sí cambiamos esta función no funciona el conteo
pulsos = pulsos + 1
IF pulsos < 61 THEN NoUpdate
endif
```

No manejas números negativos para un temporizador, osea como puedes descontar el tiempo, osea que llega a 0 minutos y continua a -1 minutos, no lo creo, no lo veo lógico,  por eso te comentaba que tienes lo de menor que 00,  Si no funciona en conteo sin esa función es por que tiene que ser 00, no menor a 00. Ahora te subo un ejemplo de como puedes decontar un numero con el incremento del temporizador de tiempo real del microcontrolador...Saludosss :estudiando:





harrito89 dijo:


> Hola amigos!
> 
> Estoy elaborando un proyecto que se trata de un reloj calendario con el 16f84a, una lcd y el ds1307, estuve mirando el post #84 que publico cesar_8k en este mismo tema, en el cual me base para adaptarlo al 16f84a y q solo muestre la hora. Pero tengo dos problemas el primero es que se me cuelga el conteo en un momento determinado y el otro es que no logro hacer funcionar los botones para modificar la hora, revise el codigo una y otra vez pero no he dado con los errores.
> 
> ...



Hola amigo, vi tu código y tu circuito, el problema lo tienes en la configuración de los puertos del microcontrolador, si en el esquema vas a utilizar por ejemplo el pin 1 del puerto b como entrada para el botón up, en el código debes conservar la misma configuración, ya que de lo contrario no te va a funcionar...saludosss


----------



## ferdy575 (Jun 22, 2012)

reyvilla dijo:


> Hola de nuevo veo que sigues sin avanzar mucho, te diria que utilizaras una rutina mas faltible, me explico no "EXISTE" osea no creo que eso exista ni lo entienda el compilador, un "NUMERO", menor a "0", osea no puede hacer esto:
> 
> 
> ```
> ...


----------



## torres.electronico (Jun 24, 2012)

Buenas... consulta... alguie vio en "este topico" algun ejemplo de como crear algun GAMEPAD? Me parecio ver algo pero no lo encuentro... Basicamente estoy buscando un ejemplo de como realizarlo un GAMEPAD de 3 ejes analogicos y 6 u 12 pulsadores (en PBP)... Dario, se me ocurrio que esta es la manera mas sencilla de crear la consola pàra el virtual Dj... vistes que hay ejemplo de como crear una consola implementando un GAMEPAD comercial y un software para re definir las funciones de cada pulsador? Bueno, se me ocurre que con esto lo hacemos mucho mas personalizado, ya que contariamos con 3 ejes analogicos para el volumen de cada canal y el fader.... los pulsadores serian para "play-stop-cue" y el resto a definir (efectos-sampler-etc)... Que te parece la idea?


----------



## Dario (Jun 24, 2012)

me parece buena tu idea, la cosa seria conseguir algunas lineas de codigo que nos puedan dar una idea de como hacerlo, porque la verdad, ami no se me ocurre nada todavia...  el otro dia en una busqueda que hice encontre estos joystcks caseros. tengo que experimentarlos todavia








saludosss


----------



## torres.electronico (Jun 24, 2012)

mmmmm, por puerto serial o paralelo me parece que vamos al horno che... Por lo que lei, el gamepad, cuando es conectado a la PC y lo reconoce win, se abre un software y desde ese software se configura las funciones de cada pulsador del gamepad, incluido los dos ejes.... Si vos lo haces por puerto serial, como saben los dos software que hay en el sistema conectado el circuito que mostras? Ademas, me resulta raro que conecten dos potes sin antes acondicionar la señal con un ADC....parece mas fake que otra cosa ese circuito jajaja
Tengo que ver algunos topicos sobre el tema que aparecen en google y te comento si serviria lo que tengo en mente... La idea es hacerlo en PBP; Ya que hay muchos proyectos en C


----------



## LaElectronicaMeOdia (Jun 24, 2012)

torres.electronico dijo:


> mmmmm, por puerto serial o paralelo me parece que vamos al horno che... Por lo que lei, el gamepad, cuando es conectado a la PC y lo reconoce win, se abre un software y desde ese software se configura las funciones de cada pulsador del gamepad, incluido los dos ejes.... Si vos lo haces por puerto serial, como saben los dos software que hay en el sistema conectado el circuito que mostras? Ademas, me resulta raro que conecten dos potes sin antes acondicionar la señal con un ADC....parece mas fake que otra cosa ese circuito jajaja
> Tengo que ver algunos topicos sobre el tema que aparecen en google y te comento si serviria lo que tengo en mente... La idea es hacerlo en PBP; Ya que hay muchos proyectos en C



el puerto al que se refiere Dario no es el serial es el puerto de Juegos, el programa al que te refieres para configurar las funciones puede ser el xPadder bascandolo en la web seguro lo encontraras, el puerto de juegos es analogo y digital por eso no se necesita acondicionar la señal con un adc, y el circuito es factible.

para hacer un gamepad con pic necesitas un pic con modulo USB (18f2550/4550 etc)y generar los archivos correspondientes con el HID y despues solo cambiar el archivo de los descriptores. en realidad es muy sencillo y si hay un proyecto de PBP en la web.

para modificar los descriptores busca el descriptor tool.


----------



## torres.electronico (Jun 24, 2012)

LaElectronicaMeOdia dijo:


> ...el puerto al que se refiere Dario no es el serial es el puerto de Juegos...


 disculpame por mi ignorancia pero  ... no sabia que en mi PC tenia un puerto de juegos; Yo solo pense que tenia un puerto serial y un puerto paralelo... Vos decis que el yo empleo para programar con el JDM, es un puerto de juegos? 
Me suena nuevo lo que decis, la verdad, desconocia esto ultimo y me suena raro... Como puedo verificar esto que me decis?





			
				torres.electronico dijo:
			
		

> disculpame por mi ignorancia pero  ... no sabia que en mi PC tenia un puerto de juegos; Yo solo pense que tenia un puerto serial y un puerto paralelo... Vos decis que el yo empleo para programar con el JDM, es un puerto de juegos?
> Me suena nuevo lo que decis, la verdad, desconocia esto ultimo y me suena raro... Como puedo verificar esto que me decis?


  aaaaaaa, noooo, ya entendi, ya entendi  que burro de mi parte 
San Google me acaba de iluminar http://es.wikipedia.org/wiki/Puerto_de_juegos
Yo entendia que la PC ya venia con un puerto de juegos jajaja, ahora si, ya entendi lo que me comentas....
Igualmente, me parece que lo mas economico seria la implementacion del pic 18FXXXX ya que este se podria amoldar a los gustos de uno... Recordas el link al topico que trata del tema en PBP? Muchas gracias por tu aporte


----------



## LaElectronicaMeOdia (Jun 24, 2012)

sip. el puerto de juegos ya no es tan comun, lo tenian en el mother los pc como los 286,386 486,Lentium etc. o las tarjetas pci de puerto paralelo o de video. en fin ya son antiguos.

el ejemplo me parece que es este. no estoy seguro.

http://www.picbasic.co.uk/forum/showthread.php?t=11950

dale una mirada.


----------



## harrito89 (Jun 25, 2012)

hola reyvilla!

 gracias por tu respuesta, ya lo arregle y me funcionan los botones, pero el reloj llega a un tiempo determinado y se bloquea, ya le he mirado el código una y otra vez, pero no he encontrado el error... q sugerencia me das?? 

exitos!


----------



## reyvilla (Jun 25, 2012)

harrito89 dijo:


> hola reyvilla!
> 
> gracias por tu respuesta, ya lo arregle y me funcionan los botones, pero el reloj llega a un tiempo determinado y se bloquea, ya le he mirado el código una y otra vez, pero no he encontrado el error... q sugerencia me das??
> 
> exitos!



Hola, en que momento, en el seteo, o cuando ya esta en marcha el reloj?
A mi me funciono, seteandolo no tuve problema, recuerda que es un reloj 24 horas, por lo tanto llega hasta 23 y de allí salta a 00, y los minutos van de 00 a 59.


----------



## harrito89 (Jun 26, 2012)

hola, es cuando el reloj esta en marcha lo dejo funcionando x ahi 5 o 10 min o ahi veces q desde el inicio de la simulacion  ocurre el error, muestra en la lcd muchos ceros y no se deja configurar para volverlo a la normalidad, y en el proteus sale el siguiente error "[HD44780] Controller received data whilst busy ; source LCD2"

anexo imagen en proteus con una mejora que le estoy realizando para transmitir los datos (RS232) a otro pic para q se visualice en una LCD 4*20.


gracias!!


----------



## reyvilla (Jun 26, 2012)

Ok ese error me ha dado en varias ocaciones con el proteus, lo he resuelto con estas lineas de comando y datos del lcd:


```
DEFINE LCD_COMANDUS 2000 
DEFINE LCD_DATAUS 150
```

Donde el retardo lo incremente hasta 150 microsegundos y me funciono perfecto, tanto en la simulación como en la practica no tuve ningún tipo de problema, prueba y me avisas.

PD: Me fije de algo importante también, te recomendaría conectar el lcd en el puerto b, ya que el puerto a en pin 4 es colector abierto y eso puede causarte problemas también...saludosss


----------



## torres.electronico (Jun 27, 2012)

La verdad es que no sabia ese tip´s... ahi lo corrobore en dos proyectos y se resolvio...es mas, parece estar mas agil proteus en esta babosa (especie de caracol sin caparazon) que tengo como maquina ...


----------



## harrito89 (Jun 27, 2012)

Hola reyvilla gracias por tus sugerencias, ya cambie la LCD al puerto y coloco las dos lineas q*ue* me sugeriste, pero me to*c*o aumentarle el retardo de microsegundos ya que con 150 salia el mismo error enton*ce*s lo subi hasta 600 y me salen letras en donde debe indicar las horas.

anexo imagen

saludos!!


----------



## reyvilla (Jun 27, 2012)

harrito89 dijo:


> Hola reyvilla gracias por tus sugerencias, ya cambie la LCD al puerto y coloco las dos lineas q me sugeriste, pero me toko aumentarle el retardo de microsegundos ya que con 150 salia el mismo error entons lo subi hasta 600 y me salen letras en donde debe indicar las horas.
> 
> anexo imagen
> 
> saludos!!



coloca el nuevo codigo pero esta vez no lo adjuntes, solo encierralo en las etiquetas [ code ]  tu codigo[ code ] y listo para ver que mas puede tener...saludosss


----------



## harrito89 (Jun 28, 2012)

SALUDOS!!
Ok, te dejo el codigo...

gracias 


```
;Programa para escribir y leer un RTC DS1307
include "modedefs.bas"        

;OPTION_REG.7=1  

Define LCD_DREG PORTB     ;usamos puertoB como salida de datos
Define LCD_DBIT 4           
Define LCD_RSREG PORTB   ;RS va conectado a puertoB
Define LCD_RSBIT 2               ; RS a Rb5
Define LCD_EREG PORTB     ; E va conectado a puertoB
Define LCD_EBIT   3
DEFINE LCD_COMANDUS 2000 
DEFINE LCD_DATAUS 600


CPIN  Var PortA.3                 ;pin señal de reloj I2C
DPIN  Var PortA.4                 ;pin de datos I2C
UP    VAR PORTA.0
DOWN_MODE  VAR PORTA.1
SET   VAR PORTA.2
TX VAR PORTB.1
POS   VAR BYTE

X VAR BYTE
FLAG VAR BIT
TIMEX VAR BYTE

LIMIT VAR BYTE

segu    var byte   ;definir tamaño de variable segundos 1 a 255
minu    var byte                    ;variable para los minutos
hora    var byte                    ;variable para las horas
diaS    var byte                    ;variable día de la semana 
diaF    var byte                    ;variable día fecha del mes
mes     var byte                    ;variable mes 
anio    var byte                    ;variable año de 2 dígitos
XTEMP VAR BYTE
TEMP1 VAR BYTE

dato    VAR BYTE                 ;variable para almacenar dato leído
actualizado VAR BIT              ;variable para almacenar un 1 o 0

EEPROM 0,[0]        ;memoria 0 con el valor inicial 0 , sirve para
                        ;indicar que nunca ha corrido este programa
READ 0,actualizado    ;carga el valor de la memoria EEPROM dirección 0

IF actualizado =0 THEN grabarRTC   ;si es la 1ra vez que corre ir a grabar RTC
                                   ;caso contrario solo leer el RTC
INICIO:   
    I2CREAD DPIN,CPIN,%11010000,0,[segu]   ;leer los datos de mem. 0,            
    I2CREAD DPIN,CPIN,%11010000,1,[minu]   ;1,2,..y guardarlos en sus
    I2CREAD DPIN,CPIN,%11010000,2,[hora]   ;respectivas variables
    I2CREAD DPIN,CPIN,%11010000,3,[diaS] 
    I2CREAD DPIN,CPIN,%11010000,4,[diaF]             
    ;hora=((hora DIG 1)*16)+(hora DIG 0)
    ;minu=((minu DIG 1)*16)+(minu DIG 0)

   ;lcdout $fe,1,DEC2 hora,":",DEC2 minu,":",hex2 segu       
    lcdout $fe,1,HEX2 hora,":",HEX2 minu,":",HEX2 segu;, " ",DEC2 TEMP1   ;mostrar la
                          ;hora minuto y segundos en 2 dígitos (HEX2)
 
PAUSE 300                            ;esperar 0,3 segundo
    
GOSUB TECLAS    
goto inicio                         ;volver a leer los datos

; ************************ subrutina grabar *********************
grabarRTC:
      
    I2CWRITE DPIN,CPIN,%11010000,0,[$00]   ;setear 00 segundos
        Pause 10                     ;retardo para finalizar grabación
    I2CWRITE DPIN,CPIN,%11010000,1,[$39]   ;setear 39 minutos
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,2,[$23]    ;setear las 23 horas
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,3,[$5]    ;setear día lunes ,D=1,L=2
        Pause 10                              ;M=3 , M=4, J=5, V=6, S=7
    I2CWRITE DPIN,CPIN,%11010000,4,[$06]    ;setear día 27 del mes
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,5,[$8]    ;setear mes agosto
        Pause 50  
    I2CWRITE DPIN,CPIN,%11010000,7,[$10]   ;control %00010000 para
        Pause 10                           ;encender el led cada 1 seg.
    
    
    WRITE 0,1       ;escribe en la memoria 0 el valor de 1 para que no    
                    ;se vuelva a grabar otra vez estos datos en el RTC
    
    goto inicio                 ;ir a presentar los datos en el LCD
end

'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ANTIRREBOTE%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TECLAS:
    FLAG=0
    FOR X = 1 TO 200
    if DOWN_MODE == 1 THEN CNFG_ALARM
    if SET == 1 then      
         PAUSE 200
         IF SET == 1 THEN GOTO SET_TIME
    ENDIF
    FLAG=1                     ;bandera de tecla; evita que cuente + de 1 vez
    NEXT
RETURN
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

SET_TIME: 

    POS=$80
    LIMIT=36
    TIMEX=HORA
    GOSUB CHD
    I2CWRITE DPIN,CPIN,%11010000,2,[TIMEX]
       PAUSE 10
    
    POS=$83
    TIMEX=MINU
    LIMIT=90
    GOSUB CHD
    I2CWRITE DPIN,CPIN,%11010000,1,[TIMEX]
       PAUSE 10
       
    POS=$C0
    TIMEX=diaS
    LIMIT=8
    GOSUB CHD
    I2CWRITE DPIN,CPIN,%11010000,3,[TIMEX]
       PAUSE 10
    
    POS=$C4
    TIMEX=diaf
    LIMIT=50
    GOSUB CHD
    I2CWRITE DPIN,CPIN,%11010000,4,[TIMEX]
       PAUSE 10
    
    POS=$Ce
    TIMEX=anio
    LIMIT=50
    GOSUB CHD
    I2CWRITE DPIN,CPIN,%11010000,6,[TIMEX]
       PAUSE 10
         
IF SET == 1 THEN GOTO INICIO
    
CHD:

    REPEAT
        TEMP1=TIMEX
        IF UP == 1 THEN
           if (TEMP1 == $39) OR (TEMP1 == $49) or (TEMP1 == $9) THEN
              TIMEX=TIMEX+7
           ELSE
               TIMEX=TIMEX+1
           ENDIF       
           if (TEMP1 == $19) OR (TEMP1 == $29) THEN TIMEX=TIMEX+7 
        ENDIF
        
        IF TIMEX == LIMIT THEN TIMEX = 0
           
        IF DOWN_MODE == 1 THEN
           if (TEMP1 == $30) OR (TEMP1 == $40) THEN
                     TIMEX=TIMEX-7
              ELSE
                    if TEMP1>0 then TIMEX=TIMEX-1
           ENDIF
          
           if (TEMP1 == $10) OR (TEMP1 == $20) THEN TIMEX=TIMEX-7 
        ENDIF
        
 
        lcdout $fe,POS, "__ "
        PAUSE 200
        lcdout $fe,POS, HEX2 TIMEX;," "
        PAUSE 200
    UNTIL SET == 1
    
    PAUSE 100
RETURN

CNFG_ALARM:
           if FLAG = 0 then return      ;bandera de tecla
           FLAG = 0                     ;bandera de tecla, cuando ya ha sido pulsada
           lcdout $fe,1,"ALARMA"
           PAUSE 3000
           RETURN
```


----------



## reyvilla (Jun 28, 2012)

Estoy sorprendido que la cosa aun este tan asi , pero, vamos de nuevo por parte, las definiciones de lcd normalmente se refieren a direcciones de memorias y funciones a esas direcciones a las cuales cargamos un dato y luego según el comando lcdout envía el carácter alfanumérico, todo eso lo hace en segundo plano el PBP. Por lo cual no lo percibimos, ahora, debemos tomar en cuenta que esos comando no configuran los puertos ni los pines, como entrada o salida, por regla general ya sea en pbp, asm, etc... Hay que configurar los pines. Entonces, eso se realiza con los registros TRISA, TRISB, TRISX, dependiendo de la cantidad de puertos que tenga el microcontrolador. Si vamos a configurar solo un pin, digamos el pin 0 "cero" del puerto A seria:
Cualquiera hace lo mismo.

```
TRISA.0 = %0 'En binario
TRISA.0 = $0  'En exadecimal
TRISA.0 = 0    'En decimal
```

Por costumbre, siempre se utiliza en binario o hexadecimal

Ahora si queremos ahorrar lineas de código podemos configurar todos lo pines de una sola vez. Digamos del puerto A, los pines del 7 al 4 son entradas y del 3 al 0 son salidas, entonces quedaria asi:



```
TRISA = %11110000 'Uno se refiere a entrada en ingles "In" y cero a salida en ingles "out"
```


Luego de configurar los pines como entradas y salidas, entonces ya podemos cargar un dato y sabemos que al pasarlo de las direcciones de propósito general donde se guarda la información que va a ser transmitida a la lcd, se cargue en el pin, el pín va a reflejarlo.

Otro dato importante, los fuses aunque no son todos obligatorios, hay unos que pueden afectarnos según sea su función. Ejemplo: el fuse del MCLR, si no se va utilizar debe indicarse de lo contrario hay que colocar un sistema que permita la puesta en marcha y el reset del microcontrolador. Pongamos que no indicamos nada para el fuse del MCLR, y programamos el microcontrolador y ese pin lo utilizamos como otro pin mas de entrada de proposito general, que va a suceder, el pic se va a estar reset siemprehno: o en determinados momentos no va a funcionar adecuadamente, por eso es importante definirlos de una vez ya que para luego es tarde.

Una manera efectiva de hacerlo es con la hoja de datos ya que en ella aparecen todos bien detallados, y para ayudarnos, contamos con el archivo .INC, el cual se encuentra en la carpeta del PBP, alli hay una carpeta llamada INC, la abrimos con microcode o bloc de notas, y vamos a ver todo lo relacionado al microcontrolador, fuses, registros especiales, etc... Entonces copiamos los fuses y los pegamos en el codigo que estamos haciendo y alli ya esta, empezamos a configurar y definir los fuses. Para el caso del 16F84A seria:

localizamos el archivo INC, para el 16F84A, es "M16F8X.INC", se llama asi por que no solo se trata del 16F84A, y también el 16F84 Y 16F83.

Esto es lo que copias del archivo INC, y lo modificas.


```
PIC16F83        equ     50010400h       ; 14-Bit, 512 Code, 64 EE, ID = 0
PIC16F84        equ     50020401h       ; 14-Bit,  1K Code, 64 EE, ID = 1
PIC16F84A       equ     50020401h       ; 14-Bit,  1K Code, 64 EE, ID = 1

					; *** DEVICE Fuses Definitions
RC_OSC          equ     3FFC0003h       ; XX XXXX XXXX XX11
HS_OSC          equ     3FFC0002h       ; XX XXXX XXXX XX10
XT_OSC          equ     3FFC0001h       ; XX XXXX XXXX XX01
LP_OSC          equ     3FFC0000h       ; XX XXXX XXXX XX00
WDT_ON          equ     3FFB0004h       ; XX XXXX XXXX X1XX
WDT_OFF         equ     3FFB0000h       ; XX XXXX XXXX X0XX
PWRT_OFF        equ     3FF70008h       ; XX XXXX XXXX 1XXX
PWRT_ON         equ     3FF70000h       ; XX XXXX XXXX 0XXX
PROTECT_OFF    equ     000FFFF0h       ; 11 1111 1111 XXXX
PROTECT_ON      equ     000F0000h       ; 00 0000 0000 XXXX
```

Y quedaría algo así según sea cada caso se modifica.


```
@ DEVICE PIC16F84A    	       
@ DEVICE XT_OSC                  
@ DEVICE WDT_OFF        
@ DEVICE PWRT_OFF       
@ DEVICE PROTECT_OFF
```

Unas ves configurados los fuses, lo que sigue es la definicion de frecuencia del OSC, hay que tomar en cuenta que segun manual, debe escribirse "OSC" todo en mayuscula y no "Osc" o derivados ya que puede que el PBP no lo tome.

quedaria asi:


```
DEFINE OSC 4
```

Aparte de eso que otra cosa puede afectarnos el funcionamiento del microcontrolador, bueno hay ciertas caracteristicas y registros especiales que trae cada microcontrolador, según sea el caso siempre es mejor leer la datasheet para estar seguro de lo que estamos haciendo. Los mas criticos son los ADC y comparadores ADC, lo que sucede es que hay y repito no se aplica en todos, ciertos microcontroladores a los cuales hay que desactivarle los ADC y/o los comparadaores ADC, estoy se hace con los comandos definidos para cada registro y como saber que nombre tiene el regstro en el PBP, pues en el mismo archivo INC, encontramos los renombres para cada registro.

Para el 16F84/16F84A/16F83 estan dispuesto asi:


```
INDF            equ     00h             ; Indirect Data
TMR0            equ     01h             ; Real Time Clock/Counter
PCL             equ     02h             ; Program Counter (LSB)
STATUS          equ     03h             ; Status Flags
FSR             equ     04h             ; File Select Register
PORTA           equ     05h             ; Port A Data
RA              equ     05h
PORTB           equ     06h             ; Port B Data
RB              equ     06h
EEDATA          equ     08h             ; EEPROM Data
EEADR           equ     09h             ; EEPROM Address
PCLATH          equ     0Ah             ; Program Counter (MSB)
INTCON          equ     0Bh             ; Interrupt Control
OPTION_REG      equ     81h             ; OPTION Register
TRISA           equ     85h             ; Port A Tristate Control
TRISB           equ     86h             ; Port B Tristate Control
EECON1          equ     88h             ; EEPROM Control 1
EECON2          equ     89h             ; EEPROM Control 2

					; *** STATUS Bits
C               equ     0               ; Carry
DC              equ     1               ; Digit (Half) Carry
Z               equ     2               ; Zero
PD              equ     3               ; Power Down
TO              equ     4               ; Time Out
RP0             equ     5               ; Direct Data Page Select 0
RP1             equ     6               ; Direct Data Page Select 1
IRP             equ     7               ; Indirect Data Page Select

					; *** INTCON Bits
RBIF            equ     0               ; PORTB[4..7] Change Interrupt Flag
INTF            equ     1               ; RB0/INT Interrupt Flag
T0IF            equ     2               ; Timer0 Overflow Interrupt Flag
RBIE            equ     3               ; PORTB[4..7] Change Interrupt Enable
INTE            equ     4               ; RB0/INT Interrupt Enable
T0IE            equ     5               ; Timer0 Overflow Interrupt Enable
EEIE            equ     6               ; EEPROM Interrupt Enable
GIE             equ     7               ; Global Interrupt Enable

					; *** OPTION_REG Bits
PS0             equ     0               ; Prescaler Divisor Select (3 Bits)
PS1             equ     1
PS2             equ     2
PSA             equ     3               ; Prescaler Assignment
T0SE            equ     4               ; Timer0 Source Edge Select
T0CS            equ     5               ; Timer0 Clock Source Select
INTEDG          equ     6               ; RB0/INT Edge Select
RBPU            equ     7               ; Port B Weak Pull-Up Enable

					; *** EECON1 Bits
RD              equ     0               ; EEPROM Read Control
WR              equ     1               ; EEPROM Write Control
WREN            equ     2               ; EEPROM Write Enable
WRERR           equ     3               ; EEPROM Write Error Flag
EEIF            equ     4               ; EEPROM Interrupt Flag
```

Este archivo es muy útil y siempre lo busco para estar seguro, fijjence como fue renombrado el registro de la dirección 06h, que pertenece al PORTB, tiene dos reenombres que cualquiera puede ser usado, uno es el PORTB y el otro es RB. Como prefiero estar seguro pues siempre busco este archivo y comparo con la datasheet y hasta ahora siempre tiene coincidencia.

Como se observa no tiene ni comparador ni modulo ADC, eso se ve mejor en el datasheet, lo que si tiene que vi tratates de configurar, son resistencias para la colocación de 1 lógico, o PULL UP, están resistencias se configuran en este caso del 16F84A, solo para el puerto B, y se hace a través del registro especial llamado OPTION_REG, el bit 7, si esta en 1 desabilita y si esta en 0 habilitas las pull up.

Para ir terminando un poco, las definiciones de la LCD, dejo las características de cada uno:


```
Define LCD_DREG PORTB	 ' LCD data pin port, Se elige por que puerto del pic van a salir los datos del registro de datos de la LCD.
Define LCD_DBIT 0	         ' LCD data pin bit ' Se elige a partir de que pin empieza (0 - 4)
se refiere a que si vamos a trabajar la lcd cpn 4 lineas de datos y que esos datos 
van a salir por el puerto B, a partir de que pin empiezan los pines del registro de datos
como lo mínimo de pines de datos son 4, entonces lo máximo puede ser a partir del pin 4 del puerto.
Y quedaría pin 4 del pic con el PIN 4 de datos de la lcd, y luego el 5 del pic con el  5 de datos de la lcd y asi sucesivamente. Y si fuese a apartir del pin0 del pic, seria pin 0 del pic pin 4 del lcd.
Define LCD_RSREG PORTB  ' LCD register select pin port ' Se elige por que puerto del pic va a salir los datos del registro reset de la LCD. 
Define LCD_RSBIT 4           ' LCD register select pin bit, se elige el pin del puerto, para el reset de la lcd.
Define LCD_EREG PORTB	 ' LCD enable pin port, Se elige por que puerto del pic va a salir los datos del registro enable de la LCD.
Define LCD_EBIT 5	         ' LCD enable pin bit, se elige el pin del puerto, para el enable de la lcd.
Define LCD_BITS 4	         ' LCD number of data bits, se elige el modo de control de la lcd, 4 o 8 bits.
Define LCD_LINES 2           ' LCD number of lines, se elige de cuantas lineas va hacer la lcd.
```

Hasta aquí por ahora

Bueno cualquier duda, me avisan ...saludoss


----------



## quevon24 (Jul 7, 2012)

Hola amigos del foro, vengo con una duda del microcode y el 18f4550, espero me puedan ayudar.

Estoy trabajando con el control de un ultrasonico, si si se esta a 15 o menos se enciende un led, pero si es mas de 15 cm, se enciende otro led, este programa lo he hecho correr a la perfeccion en un 16f628a, pero al momento de modificarlo para el 18f4550 no funciona en el protoboard, el led se pone a parpadear como loco y no detecta (ya cheque con el multimetro todo lo posible) , este es todo mi codigo:


```
define osc 12

cmcon = 7

wDist VAR Word         'Almacenar medida
SALIDA VAR porta.0
LEER VAR porta.1

main:
GOSUB sr_sonar
PAUSE 200
GOTO main

sr_sonar:
pause 10 
salida = 0
PULSOUT SALIDA,5 ' pulso de inicio de10us   trigger
PULSIN LEER,1,wDist ' mide echo
wDist=wDist/6 ' a cm      entre 6
PAUSE 10

IF wDist<15 then
high portb.7
low portb.6
else
low portb.7
high portb.6
endif

RETURN

END
```

y otro problema es que cuando lo compilo y cargo el hex al pickit me aparece en amarillo: "Warning: Some configuration words not in hex file", aun asi lo graba a la perfeccion en el pic

Me gustaria saber si me pueden ayudar a resolver este problema que llevo un buen rato intentandole y no funciona, y el programa es similar al del 16f628a


----------



## LaElectronicaMeOdia (Jul 8, 2012)

> "Warning: Some configuration words not in hex file"



Esa advertencia es porque no defines los Fuses y eso puede ser factor para que no funcione.


----------



## quevon24 (Jul 8, 2012)

LaElectronicaMeOdia dijo:


> Esa advertencia es porque no defines los Fuses y eso puede ser factor para que no funcione.



Que no se supone que para eso esta el microcode y el pbp?? los fuses vienen configurados por defecto  en el pbp en el 18f4550.inc o hay que volver a configurarlos desde el microcode??

Si pudieran ayudarme con este procedimiento o dandome ideas sobre cual podria ser el problema se los agradecer mucho


----------



## LaElectronicaMeOdia (Jul 8, 2012)

> Que no se supone que para eso esta el microcode y el pbp??


Falso, el microcode es una interfaz (editor de Texto), El PBP es un compilador que genera a partir de un codigo basic a uno en ensamblador, y despues  de ensambador a lenguaje nativo de PICs (hex) por eso el basic se llama lenguaje de Alto nivel.



> los fuses vienen configurados por defecto en el pbp en el 18f4550.inc o hay que volver a configurarlos desde el microcode??


Falso, en el archivo 18f4550.inc estan ligadas las direcciones de los registros del pic a palabras clave. y como dije no lo utiliza el microcode lo utiliza el PBP



> Si pudieran ayudarme con este procedimiento o dandome ideas sobre cual podria ser el problema se los agradecer mucho



Para recibir ayuda debes hacer preguntas concretas de otra manera es imposible o muy dificil, o esperar que alguien te pida que subas el proyecto y lo haga por ti.


----------



## quevon24 (Jul 8, 2012)

> Para recibir ayuda debes hacer preguntas concretas de otra manera es imposible o muy dificil, o esperar que alguien te pida que subas el proyecto y lo haga por ti.



A lo que me referia es que como se hace para configurar los fuses desde microcode studio o como puedo saber la configuracion de bits para hacerlo directo desde el pickit.

Y he probado un programa sencillo para hacer parpadear unos leds para ver si funciona el pic, para leer el dato de un sensor qrd1114 , y por lo menos eso si puede hacer.


----------



## LaElectronicaMeOdia (Jul 8, 2012)

Para hacerlo desde el software se pone algo parecido a esto:


```
@ DEVICE PIC16F84A    	       
@ DEVICE XT_OSC                  
@ DEVICE WDT_OFF        
@ DEVICE PWRT_OFF       
@ DEVICE PROTECT_OFF
```

pero los propios para el pic18f4550 que son unos cuantos mas. yo no tengo el pickit y desconozco si esos  fuses se pueden configurar desde su interfaz.


----------



## D@rkbytes (Jul 8, 2012)

quevon24 dijo:


> A lo que me referia es que como se hace para configurar los fuses desde microcode studio


Saludos quevon24
Para determinar exactamente que bits de configuración se requieren para cada proyecto,
debes empezar a leer desde la página 288 de la hoja de datos del 18F4550.
Ahora, como lo que quieres es saber como se hace esto desde MCS, aquí adjunto un ejemplo.
Las instrucciones están comentadas dentro del código.

Suerte.


----------



## christus (Jul 17, 2012)

Estimados Amigos;

Como están por favor quisiera saber si se puede programar en Pic Basic en un PIC12F675:

Gracias de antemano por su ayuda.


----------



## D@rkbytes (Jul 17, 2012)

christus dijo:


> Estimados Amigos;
> 
> Como están por favor quisiera saber si se puede programar en Pic Basic en un PIC12F675:
> 
> Gracias de antemano por su ayuda.


Saludos.
Claro que se puede.
Desde un PIC10F202 y con la más reciente versión de PICBasic Pro que es la 3.0.6
Se puede programar hasta un PIC18LF66K80

Suerte.


----------



## christus (Jul 18, 2012)

Gracias por la respuesta amigo d@rkbytes pero en  el caso de este pic tengo entendido que hay que hacer una configuracion especial en el programa para que use su clock interno y en PBP mas o menos como seria y en el caso de los puertos normalmente trabajamos siempre asi digamos  "PORTA.0 = variable" pero en este pic sus pines no estan nombrados asi.

Te agradezco nuevamente por tu ayuda.


----------



## D@rkbytes (Jul 18, 2012)

christus dijo:


> Gracias por la respuesta amigo d@rkbytes pero en  el caso de este pic tengo entendido que hay que hacer una configuracion especial en el programa para que use su clock interno y en PBP mas o menos como seria y en el caso de los puertos normalmente trabajamos siempre asi digamos  "PORTA.0 = variable" pero en este pic sus pines no estan nombrados asi.
> 
> Te agradezco nuevamente por tu ayuda.


Saludos nuevamente christus.
Así es. En este tipo de PIC pequeños, cambian algunas cosas.
Por ejemplo, para la calibración del oscilador interno se usa esta definición en la cabecera del programa.
*DEFINE* OSCCAL_1K 1
El nombre del puerto cambia de PORTX a GPIO
Por ejemplo para poner un 1 en el bit 0 del puerto, sería...
GPIO.0 = 1 o HIGH GPIO.0
Como mencionaste anteriormente que necesitabas programar un 12F675,
quizás también requieras saber como hacer para que sus pines GP,0,1,2,4 trabajen de forma digital.
Ya qué en este PIC se pueden usar algunos pines como conversores ADC o en modo comparador.
Esto se consigue configurando el registro ANSEL en 0 y el registro CMCON en 7 por ejemplo...
ANSEL = 0
CMCON = 7
Y si requieres que un pin o más sean análogos ya tienes que ver la hoja de datos del PIC,
para seleccionar los pines y configurar correctamente los parámetros del ADC.

Nota: Al programar en PICBasic existe la posibilidad de ahorrarse algunas configuraciones.
Pero siempre es recomendable que conozcas bien como funcionan los registros de los PIC.

Espero que estos comentarios te sirvan de ayuda para programarlo en PICBasic.

Suerte.


----------



## christus (Jul 20, 2012)

hola D@rkbytes gracias nuevamente por tu apoyo, queria comentarte he hecho un programa de prueba y lo estoy simulando en proteus pero no hace nada, el programa es el siguiente :

DEFINE OSCCAL_1K 1

ANSEL =  %00000000
CMCON = 7

Inicio:

GPIO.0  = 1

pause 500

GPIO.0  = 0
pause 500

goto inicio

end

No se si estoy cometiendo algún error, gracias por la atencion prestada


----------



## D@rkbytes (Jul 20, 2012)

christus dijo:


> hola D@rkbytes gracias nuevamente por tu apoyo, queria comentarte he hecho un programa de prueba y lo estoy simulando en proteus pero no hace nada, el programa es el siguiente :
> 
> DEFINE OSCCAL_1K 1
> 
> ...


El programa esta bien.
Lo que le hace falta es establecer que pines serán usados como entradas y salidas.
También es recomendable definir la palabra de configuración.
Cuando no se establece ninguna, el compilador utiliza la configuración del archivo 12F675.INC
​Y a veces no es la configuración que nuestro programa requiere. 
Por eso es importante declararla o establecerla con el programa que graba el PIC.

Adjunto tu programa con las configuraciones correspondientes.
Para que tengas una idea de como se hace esto para un PIC12F675.
Sigue :estudiando: el curso para que puedas comprender muchas cosas más.

Suerte.


----------



## christus (Jul 23, 2012)

Muchas gracias amigo d@rkbytes por la ayuda y funciona muy bien gracias de nuevo.

saludos y exitos.


----------



## cesarim (Jul 26, 2012)

buenas tardes amigos del foro me gusta bastante esta pagina ya que estoy aprendiendo mucho he encontrado un tutuorial sobre el manejo de temporizadores y contadores que  el amigo mecatrodatos dejo en la pagina 21 es muy bueno y explicativo quisiera poder pedir alguien que me oriente yo soy nuevo en esto de los pic estoy programando en basic y uso el proteus que aca en el foro recomiendan con la version 7.7 con toda franqueza gracias a todo por el tiempo que le dedican en ayudar a quien piden auxilio mi duda es esta.
en el tutorial que nuestro amigo mecatrodatos explica es muy bueno deja entender de como se genera una  interrupcion sin afectar lo que el pic este haciendo como tarea
este es el programa que el amigo mecatrodo puso como ejemplo donde habilita el prescaler a 64 con un cristal de 4 mhz lo que hace es contar y cada que llega a 61 habilita el led3 por un segundo y lo deshabilita x otro segundo y asi rutinariamente es muy bueno en el archivo rar que mando quise modificar un poco el programa pero no logro entender como podria hacer para incrementar el tiempo de 1 segundo.
le aumente a 2 segundo el tiempo del led3 y funciona osea se prende por 2 segundos y se apaga por otro 2 segundo y hasta 4 seg funciona modificando los valores que en el programa escribo y detallo pero si quiero aumentarle a 5 segundo nunca prende el led3 pero los otros led1 y led2 si oscilan el tiempo que se indica quise probar poniendole registros osea que la cuenta se almacene es una variable cuenta por decir y que cada 61 veces aumente y 1 en cuenta y asi hasta que llegue a un total de cuenta <10 then cuenta=0 y recien prende el led3 pero no me sale y quisiera saber si ustedes me podrian ayudar talvez diciendome como hacerlo o con otro tutorial buenazo como el del amigo mecatrodo gracias aquellas personas que puedan ayudarme


```
clear

define osc 4
OPTION_REG=%10000101
;BIT 7=1 DESHABILITA PULL-UPS DE P.B
;BIT 5=0 SELECCIONA EL MODO DE TEMPORIZADOR
;BIT 2=1}
;BIT 1=0}   TIMER0 CONJUNTO PREESCALADOR PARA 64
;BIT 0=1}

INTCON=%10100000
;BIT 7=1 PERMITE TODAS LAS INTERRUPCIONES
;BIT 5=1 PERMITE LA INTERRUPCION POR TIMER0
;BIT 2=0 SE ESTABLECE SOBRE LA INTERRUPCION TOIF O ITCON2

Alpha       var word  ;variable en el codigo de pausa
Beta        var byte  ;esta vaiable contabiliza 61 en interrupcion
TrisD=%11110100
portD=%00000000
Led0        var Portd.0
Led1        var portd.1
Led3        var Portd.3
beta=0

on interrupt goto SaltoRutina

MainLoop:
if led1=0 then
led1=1
led0=0
else
led1=0
led0=1
endif
for alpha=1 to 300
pauseus 100
next alpha
goto mainloop

disable  ;deshabilita y habilita el soporte de la rutina a interrumpir
;256*64=16384//16384/1SEG=16.384 ===61
;256*64=16384//16384/2SEG=8.192  ====122  3SEG===183   4SEG===244
saltorutina:
beta=beta+1
if beta < 61 then endinterrupt 
beta=0
if led3=1 then
led3=0
else 
led3=1
endif

endinterrupt:
INTCON.2=0
RESUME
ENABLE
END
```



este es el codigo que trato de modificar pero no logro crear un registro que me permita almacenar un conteo para mas tiempo se podria cambiar los tiempo de encendido del led prendido como apagado o siempre el tiempo que prenda ese mismo tiempo apagara 


```
clear

define osc 4
OPTION_REG=%10000101    ;----aca el prescaler es para 64----
;BIT 7=1 DESHABILITA PULL-UPS DE P.B
;BIT 5=0 SELECCIONA EL MODO DE TEMPORIZADOR
;BIT 2=1}
;BIT 1=0}   TIMER0 CONJUNTO PREESCALADOR PARA 64-----
;BIT 0=1}

INTCON=%10100000
;BIT 7=1 PERMITE TODAS LAS INTERRUPCIONES
;BIT 5=1 PERMITE LA INTERRUPCION POR TIMER0
;BIT 2=0 SE ESTABLECE SOBRE LA INTERRUPCION TOIF O ITCON2

Alpha       var word  ;variable en el codigo de pausa
Beta        var byte  ;esta vaiable contabiliza 61 en interrupcion
Cuenta      var word
TrisD=%11110100
portD=%00000000
Led0        var Portd.0
Led1        var portd.1
Led3        var Portd.3
beta=0

on interrupt goto SaltoRutina

MainLoop:
if led1=0 then
led1=1
led0=0
else
led1=0
led0=1
endif
for alpha=1 to 300
pauseus 100
next alpha
goto mainloop

disable  ;deshabilita y habilita el soporte de la rutina a interrumpir
saltorutina:
beta=beta+1
if beta < 61 then ;endinterrupt 
cuenta=0
beta=0
if beta=0 then
cuenta=cuenta+1
if cuenta  <= 10 then endinterrupt
cuenta=0
if led3=1 then
led3=0
else 
led3=1
endif
endif
endif

endinterrupt:
INTCON.2=0
RESUME
ENABLE
END
```

estoy leyendo las paginas siguientes pero no logran hablar de este mismo tema creo que ustedes estan en un nivel super avanzado


----------



## cesarim (Jul 27, 2012)

hola amigo mecatrodo me podrias dar un camino o alguien de ustedes brindar una idea con ejemplos de como empezar hacer este codigo me imagino que devo de crear registro para almacenar un conteo y si quisiera usar tiempo difernete en encendido y apagado deberia de usar dos registro pero desconozco de como hacerlo si ustedes me ayudaran les agradeceria coordilmente


----------



## reyvilla (Jul 27, 2012)

cesarim dijo:


> hola amigo mecatrodo me podrias dar un camino o alguien de ustedes brindar una idea con ejemplos de como empezar hacer este codigo me imagino que devo de crear registro para almacenar un conteo y si quisiera usar tiempo difernete en encendido y apagado deberia de usar dos registro pero desconozco de como hacerlo si ustedes me ayudaran les agradeceria coordilmente



Hola cesarim, exactamente cual es tu duda, si sabes usar interrupciones y sabes calcular el prescaler, lo demás es mas sencillo, lo que quiere decir que no deberías tener ningún problema. Deberías de plantear un código nuevo echo a partir del ejemplo del amigo mecatrodatos y no escribir encima de el. Fíjate los ejemplos propuestos aquí yo particularmente los vería como ejemplo y para la practica, ya que solo para eso sirven, puede que alguno lo logres adaptar a tus necesidades, pero también creo que es mas difícil que hacer uno desde cero...Si es de tu interés podríamos empezar con un código bien sencillo y que debido a que lo vas hacer tu podrás adaptarlo o modificarlo a tu antojo y así no tener que deducir el código de otro, cada cabeza es un mundo y cada uno tiene su manera de generar su código en un orden o desorden especifico, aparte de aprender como funciona cada cosa... Avísame saludoss


----------



## cesarim (Jul 28, 2012)

hola gracias por respnderme bueno con el tutorial que mencione de nuestro amigo mecatrodo me estoy iniciando es por ello que quisiera que me puedan orientar muy agradecido por haberme respondido pense que no obtendria respuestas


----------



## reyvilla (Jul 28, 2012)

Bueno empieza organizando un poco las ideas, y para eso te recomiendo hacer un código de puras configuraciones, osea donde coloques las configuraciones de los fuses, el oscilador, el tmr0, etc... Menos el código en si, esto para ir corrigiendo por partes en caso de que haya algo mal en el código...Y unas vez que hayamos depurado esa parte entonces es que vamos a ver como hacer las temporizaciones mas largas y funcionales.


----------



## cesarim (Jul 30, 2012)

vale entoncs lo hago y x la noche lo pongo aca en el foro gracias por tu alientos de querer enseñarme


----------



## cesarim (Jul 31, 2012)

@ DEVICE PIC16F628A  
@ DEVICE Intrc_OSC
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE LVP_OFF 
@ DEVICE WRT_OFF
@ DEVICE CPD_OFF 
@ DEVICE PROTECT_OFF                     
cmcon=7 ;digitaliza el puertoA


define osc 4
OPTION_REG=%10000101    ;----aca el prescaler es para 64----
INTCON=%10100000
; aca defino de acuerdo al prescaler y el cristal ya sea interno o externo
; 1/fosc*4  ====> 1/4=0.25us*4=1us
; esta formula lo logro entender y haber si me ayudas y me corriges mi duda
;256* prescaler configurado=====>(256*64)=16384
;ahora 16384/1000 ===>este valor(1000)de donde vendria a salir del tiempo 1 seg
;que quedaria 16.384 y por ultimo dividiria 1us /16.384 ====61.035===>61
ConLed           var word  ;variable en el codigo de pausa
Incremento       var byte  ;esta variable seria las veces que contara? 61 antes de producirse la interrupcion
Registro1        var word  ;aca guardaria el conteo de encendido
Registro2        var word  ;aca guardaria el conteo de apagado
;====>la variable incremento cuenta las 61 veces y se genera o se p`roduce la interrupcion,cuando la interrupcion 
;se haya generado se visualizara en el led0 y luego se va gusrandando en el 
;registro1 ¿x veces? luego que llego al valor dado ¿x veces?  enciende led1
;sigue ahora el conteo del registro1 donde va contando ¿n veces? lo que el led1 estara prendido
;almacenando ese tiempo ahora en el registro2 ¿l veces? cuando llego al tiempo dado se apaga el led1
TrisD=%11110100
portD=%00000000
Led0        var Portd.0
Led1        var portd.1

;este es el 1º paso del codigo que me pediste amigo te agradesco tu tiempo y ojala lo podamos trabajar.


----------



## reyvilla (Ago 2, 2012)

Hola disculpa la demora, te recomiendo colocar los codigos entre los comandos [ CODE ][ /CODE ] , para que se puedan leer mejor y ocupen menos espacio. Quedaria algo asi:


```
@ DEVICE PIC16F628A  
@ DEVICE Intrc_OSC
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE LVP_OFF 
@ DEVICE WRT_OFF
@ DEVICE CPD_OFF 
@ DEVICE PROTECT_OFF                     
cmcon=7 ;digitaliza el puertoA


define osc 4
OPTION_REG=%10000101    ;----aca el prescaler es para 64----
INTCON=%10100000
; aca defino de acuerdo al prescaler y el cristal ya sea interno o externo
; 1/fosc*4  ====> 1/4=0.25us*4=1us
; esta formula lo logro entender y haber si me ayudas y me corriges mi duda
;256* prescaler configurado=====>(256*64)=16384
;ahora 16384/1000 ===>este valor(1000)de donde vendria a salir del tiempo 1 seg
;que quedaria 16.384 y por ultimo dividiria 1us /16.384 ====61.035===>61
ConLed           var word  ;variable en el codigo de pausa
Incremento       var byte  ;esta variable seria las veces que contara? 61 antes de producirse la interrupcion
Registro1        var word  ;aca guardaria el conteo de encendido
Registro2        var word  ;aca guardaria el conteo de apagado
;====>la variable incremento cuenta las 61 veces y se genera o se p`roduce la interrupcion,cuando la interrupcion 
;se haya generado se visualizara en el led0 y luego se va gusrandando en el 
;registro1 ¿x veces? luego que llego al valor dado ¿x veces?  enciende led1
;sigue ahora el conteo del registro1 donde va contando ¿n veces? lo que el led1 estara prendido
;almacenando ese tiempo ahora en el registro2 ¿l veces? cuando llego al tiempo dado se apaga el led1
TrisD=%11110100
portD=%00000000
Led0        var Portd.0
Led1        var portd.1
```

No se si trataste de compilarlo pero yo al hacerlo me arroja 3 errores, de los cuales uno tiene que ver con la configuracion de fuses, los otros dos con el puerto d.

Si te fijas en el porque de estos errores, puede que no sepas que el 16F628A, no posee un puerto d y tampoco WRT, por lo cual no puedes configurar algo que no existe para ese pic, eso no es necesario saberlo de memoria aunque muchos no los aprendemos, pero existen muchos pic, con diferentes puertos y fuses, por lo cual para nosotros es de mucha ayuda estos errores ya que nos indica donde nos estamos equivocando o que estamos haciendo mal, permitiéndonos corregir el error antes de programar el pic.

Ahora ya corrigiendo eso nos permite compilar, asi mismo continuo revisando el codigo y voy indicando a detalle que es lo que ocurre en cada linea.


```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 02/08/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE PIC16F628A   ;Declaramos el pic a utilizar
@ DEVICE Intrc_OSC    ;Declaramos el tipo de oscilador a usar, interno, externo XT, RC, ETC...
@ DEVICE WDT_OFF      ;Declaramos si(ON) Ó no(OFF)se va usar el WDT(Watchdog Timer), temporizador perro guardian
@ DEVICE PWRT_OFF     ;Declaramos si(ON) Ó no(OFF)se va usar el PWRT(Power-up Timer ), tiempo de encendido
@ DEVICE LVP_OFF      ;Declaramos si(ON) Ó no(OFF)se va usar el LVP(LOW VOLTAGE PROGRAMMING), programacion de bajo voltaje  
;@ DEVICE WRT_OFF     ;Declaramos si(ON) Ó no(OFF)se va usar el WRT(FLASH Program Memory Write) 
@ DEVICE CPD_OFF      ;Declaramos si(ON) Ó no(OFF)se va usar el (Data EE Memory Code Protect)
@ DEVICE PROTECT_OFF  ;Declaramos si(ON) Ó no(OFF)se va usar el (FLASH Program Memory Code Protection)


cmcon=7  ;Configuracion del modulo comparador (CMCON), de 7 Bit's se 
;describen a continuacion.

;bit 7 C2OUT: Comparator 2 Output

;When C2INV = 0:
;1 = C2 VIN+ > C2 VIN-
;0 = C2 VIN+ < C2 VIN

;When C2INV = 1: 
;1 = C2 VIN+ < C2 VIN-
;0 = C2 VIN+ > C2 VIN

;bit 6 C1OUT: Comparator 1 Output

;When C1INV = 0:
;1 = C1 VIN+ > C1 VIN-
;0 = C1 VIN+ < C1 VIN

;When C1INV = 1:
;1 = C1 VIN+ < C1 VIN-
;0 = C1 VIN+ > C1 VIN

;bit 5 C2INV: Comparator 2 Output Inversion

;1 = C2 Output inverted
;0 = C2 Output not inverted

;bit 4 C1INV: Comparator 1 Output Inversion

;1 = C1 Output inverted
;0 = C1 Output not inverted

;bit 3 CIS: Comparator Input Switch

;When CM2:CM0: = 001
;Then:
;1 = C1 VIN- connects to RA3
;0 = C1 VIN- connects to RA0

;When CM2:CM0 = 010
;Then:
;1 = C1 VIN- connects to RA3
;    C2 VIN- connects to RA2
; =  C1 VIN- connects to RA0
;    C2 VIN- connects to RA1

;bit 2-0 CM2:CM0: Comparator Mode
;Figure 10-1 shows the Comparator modes and CM2:CM0 bit settings

;Ahora que significa cmcon = 7
;Significa que los primeros 3 bit's del cmon valen 1 y el resto vale 0
;Osea es igual que cmcon = %00000111
;Donde los bit's CM0, CM1 Y CM2 quedan en 1
;Si vemos la hoja de datos nos daremos cuentas y una mejor idea con la grafica.
;Comparators Off
;CM2:CM0 = 111

define osc 4 ;Definimos la frecuencia de oscilacion 4, 20, etc...

OPTION_REG=%10000101 ;Registro especial option
;se describe a continuacion.

;bit 7 RBPU: PORTB Pull-up Enable bit
;1 = PORTB pull-ups are disabled
;0 = PORTB pull-ups are enabled by individual port latch values

;bit 6 INTEDG: Interrupt Edge Select bit
;1 = Interrupt on rising edge of RB0/INT pin
;0 = Interrupt on falling edge of RB0/INT pin

;bit 5 T0CS: TMR0 Clock Source Select bit
;1 = Transition on RA4/T0CKI pin
;0 = Internal instruction cycle clock (CLKOUT)

;bit 4 T0SE: TMR0 Source Edge Select bit
;1 = Increment on high-to-low transition on RA4/T0CKI pin
;0 = Increment on low-to-high transition on RA4/T0CKI pin

;bit 3 PSA: Prescaler Assignment bit
;1 = Prescaler is assigned to the WDT
;0 = Prescaler is assigned to the Timer0 module

;bit 2-0 PS2:PS0: Prescaler Rate Select bits
'BIT.2 PS2
'BIT.1 PS1 
'BIT.0 PS0 


'Bit Value   - TMR0 Rate  -  WDT Rate
'PS0,PS1,PS2 -
' 0   0   0  -  1 : 2     -   1 : 1
' 0   0   1  -  1 : 4     -   1 : 2
' 0   1   0  -  1 : 8     -   1 : 4
' 0   1   1  -  1 : 16    -   1 : 8
' 1   0   0  -  1 : 32    -   1 : 16
' 1   0   1  -  1 : 64    -   1 : 32
' 1   1   0  -  1 : 128   -   1 : 64
' 1   1   1  -  1 : 256   -   1 : 128


;Donde quedo asi: OPTION_REG=%10000101 
;Prescaler a 64 y con pulls-up activas

INTCON=%10100000  ;Registro especial INTCON
;se describe a continuacion.

;bit 7 GIE: Global Interrupt Enable bit
;1 = Enables all un-masked interrupts
;0 = Disables all interrupts

;bit 6 PEIE: Peripheral Interrupt Enable bit
;1 = Enables all un-masked peripheral interrupts
;0 = Disables all peripheral interrupts

;bit 5 T0IE: TMR0 Overflow Interrupt Enable bit
;1 = Enables the TMR0 interrupt
;0 = Disables the TMR0 interrupt

;bit 4 INTE: RB0/INT External Interrupt Enable bit
;1 = Enables the RB0/INT external interrupt
;0 = Disables the RB0/INT external interrupt

;bit 3 RBIE: RB Port Change Interrupt Enable bit
;1 = Enables the RB port change interrupt
;0 = Disables the RB port change interrupt

;bit 2 T0IF: TMR0 Overflow Interrupt Flag bit
;1 = TMR0 register has overflowed (must be cleared in software)
;0 = TMR0 register did not overflow

;bit 1 INTF: RB0/INT External Interrupt Flag bit
;1 = The RB0/INT external interrupt occurred (must be cleared in software)
;0 = The RB0/INT external interrupt did not occur

;bit 0 RBIF: RB Port Change Interrupt Flag bit
;1 = When at least one of the RB7:RB4 pins changed state (must be cleared in software)
;0 = None of the RB7:RB4 pins have changed state

;Donde quedo asi: INTCON=%10100000
;Se activaron las interrupciones globales, y unicamente se uso la interrupcion
;por desbordamiento del TMR0  

;Hasta aqui bastante bien... 
;Aun faltan cosas antes de empezar a usar variables y son las declaraciones
;de los puertos y los pines de los puertos cuales con entradas y cuales 
;son salidas, aparte de la instrupcion de interrupcion y la subrutina
;de salto en caso de interrupcion.


ConLed var word ;variable en el codigo de pausa
Incremento var byte ;esta variable seria las veces que contara? 61 antes de producirse la interrupcion
Registro1 var word ;aca guardaria el conteo de encendido
Registro2 var word ;aca guardaria el conteo de apagado



;TrisD=%11110100  N/A, osea, NO EXISTE ó NO APLICA
;portD=%00000000  N/A, osea, NO EXISTE ó NO APLICA
;Led0 var Portd.0 N/A, osea, NO EXISTE ó NO APLICA
;Led1 var portd.1 N/A, osea, NO EXISTE ó NO APLICA
```

Bueno cualquier cosa me avisas saludoss


----------



## cesarim (Ago 3, 2012)

amigo si tienes razon muy buena tu explicacion sobre el cmcon


```
@ DEVICE PIC16F628A   
@ DEVICE Intrc_OSC    
@ DEVICE WDT_OFF      
@ DEVICE PWRT_OFF     
@ DEVICE LVP_OFF        
@ DEVICE CPD_OFF    
@ DEVICE PROTECT_OFF  

cmcon=7  
define osc 4 

OPTION_REG=%10000101 
INTCON=%10100000  

ConLed var word ;variable en el codigo de pausa
Incremento var byte ;esta variable seria las veces que contara? 61 antes al producirse la interrupcion salta a registro1
Registro1 var word ;guarda el conteo de encendido por 5 min luego salta al registro2
Registro2 var word ;guarda el conteo de apagado   por 1 min luego vuelve a la misma rutina si no se creo ningun codigo mas

Led0        var PortB.0 ;avisó´que se produjo la interrupcion de echo me imagino que ni se vera pero en un osciloscopio me gustaria ver
Led1        var PortB.6 ;cuando registro1 se activo se prende por 5 min luego se apaga
Led2        var PortB.7 ;cuando registro2 se cativa se prende por 1 min espero;;;;;espero poder estar haciendo algo correcto
                        ;de verdad gracias por corregirme si me equivoco    
Push1       var PortA.6 ;si se quisiera trabajar  con pulsador1
Push2       var PortA.7  ;o pulsador2

Trisb=%00111110 ;$3E
PortB=0   
TrisA=%11000000 ;$C0
PortA=0
```
aca dejo este codigo


----------



## reyvilla (Ago 3, 2012)

que bueno, mira para que no te confundas tanto, en el icono de abajo de Más Opciones..., te da una barra de herramientas donde tienes un icono con el símbolo #, para poder usarlo seleccionas el texto que deseas que quede dentro del recuadro y luego de tener seleccionado el texto le das al icono # y listo el lo coloca, para poder ver como va a quedar le das a vista previa y eso te permite corregir antes de publicar tu comentario, trata de corregirlo para poder entender mejor tu código...saludosss


----------



## cesarim (Ago 4, 2012)

ok te agradesco es que recien empizo a usar las opciones del foro


```
@ DEVICE PIC16F628A
@ DEVICE Intrc_OSC
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE LVP_OFF
@ DEVICE CPD_OFF
@ DEVICE PROTECT_OFF

cmcon=7
define osc 4

OPTION_REG=%10000101
INTCON=%10100000

ConLed var word ;variable en el codigo de pausa
Incremento var byte ;esta variable seria las veces que contara? 61 antes al producirse la interrupcion salta a registro1
Registro1 var word ;guarda el conteo de encendido por 5 min luego salta al registro2
Registro2 var word ;guarda el conteo de apagado por 1 min luego vuelve a la misma rutina si no se creo ningun codigo mas

Led0 var PortB.0 ;avisó´que se produjo la interrupcion de echo me imagino que ni se vera pero en un osciloscopio me gustaria ver
Led1 var PortB.6 ;cuando registro1 se activo se prende por 5 min luego se apaga
Led2 var PortB.7 ;cuando registro2 se cativa se prende por 1 min espero;;;;;espero poder estar haciendo algo correcto
;de verdad gracias por corregirme si me equivoco
Push1 var PortA.6 ;si se quisiera trabajar con pulsador1
Push2 var PortA.7 ;o pulsador2

Trisb=%00111110 ;$3E
PortB=0
TrisA=%11000000 ;$C0
PortA=0
```

ahi quedo bien  perdon tanta molestia espero podamos continuar


----------



## reyvilla (Ago 4, 2012)

Como el prescaler es de 64 osea  estamos dividiendo cada ciclo de maquina 64 veces lo que quiere decir que si el osc es de 4mhz y el tmr0 es de 256, T para 4mhz es de 0.25us x 4 = 1us lo que tarda cada ciclo de maquina entonces 256 que es tmr0 x 64 que es el prescaler x 1us ciclo de maquina tenemos un retardo de tiempo de 16384us lo que es igual a 16.384 milisegundos, ahora viene lo interesante existen varias maneras de optener mas tiempo la primera es variar el prescaler al maximo osea 256
con eso conseguimos mas tiempo de retardo quedaria a 256 x 256 x 1us =  65536us igual a 65.536 milisegundos aun es muy poco, claro se puede llegar a mas con un registro de proposito general puedes llegar a mas en la sub-rutina sumamos cuantas veces sea necesario ese registro para llegar al valor deseado ese registro va hacer una variable
la voy a llamar mas_tiempo a ella la voy a ir sumando en cada interrupcion del tmr0 osea cada 65.536us voy a sumarle 1 hasta llegar lo mas serca a 1 segundo y asi tener una base de tiempo mas manejable seria 65.536 milisegundos x  15 igual a 983.04 milisegundos osea casi 1 segundo, probando con el prescaler a 64 seria 16.684 x 61 igual a  999.424 milisegundos mucho mas serca, y puede despreciarcie un poco ese tiempo ya que la diferencia seria de  576us entonces mi codigo quedaria así:



```
@ DEVICE PIC16F628A          ;Declaramos el pic a utilizar
@ DEVICE INTRC_OSC_CLKOUT    ;Declaramos el tipo de oscilador a usar, interno, externo XT, RC, ETC...
@ DEVICE WDT_OFF             ;Declaramos si(ON) Ó no(OFF)se va usar el WDT(Watchdog Timer), temporizador perro guardian
@ DEVICE PWRT_OFF            ;Declaramos si(ON) Ó no(OFF)se va usar el PWRT(Power-up Timer ), tiempo de encendido
@ DEVICE LVP_OFF             ;Declaramos si(ON) Ó no(OFF)se va usar el LVP(LOW VOLTAGE PROGRAMMING), programacion de bajo voltaje  
@ DEVICE CPD_OFF             ;Declaramos si(ON) Ó no(OFF)se va usar el (Data EE Memory Code Protect)
@ DEVICE PROTECT_OFF         ;Declaramos si(ON) Ó no(OFF)se va usar el (FLASH Program Memory Code Protection)

DEFINE OSC 4 ;Definimos la frecuencia de oscilacion 4, 20, etc... 

CMCON = 7  ;Configuracion del modulo comparador (CMCON), de 7 Bit's 
OPTION_REG = %10000101 ;Registro especial option

MAS_TIEMPO VAR BYTE
SYMBOL LED_1 = PORTB.0
TRISB = %00111110 ;$3E
TRISA = %11000000 ;$C0
PORTA = %00000000
PORTB = %00000000 

ON INTERRUPT GOTO MI_INTERRUPCION 'SETENCIA DE SALTO A SUB-RUTINA EN CASO DE INTERRUPCION
INTCON = %10100000

INICIO:
IF MAS_TIEMPO = 61 THEN
MAS_TIEMPO = 0
TOGGLE LED_1
ENDIF
GOTO INICIO

DISABLE            ;DESHABILITAMOS LA INTERRUPCION
MI_INTERRUPCION: 
MAS_TIEMPO = MAS_TIEMPO + 1
INTCON = %10100000 ;RESTABLECEMOS LA INTERRUPCION
Resume
Enable
```

Te dejo una simulación con el código para que lo compiles y pruebes, lo que hace es que el led se prende 1 segundo y se apaga otro segundo.

Nota:Hay varios detalles que se me pasaron por alto, el primero es tratar de escribir todo en mayúsculas ya que según vi en un manual de PBP, algunas cosas si no las escribes en mayúsculas no las toma el PBP, otra todo debe llevar un orden primero fuses después definiciones de osc y después configuraciones y por ultimo el código.

Bueno cualquier por aquí estamos saludoss


----------



## cesarim (Ago 5, 2012)

muchas gracias por ir orientandome ya poco a poco voy entendiendo logre aumentar el tiempo por 10 segundos puedo aumentar a 1 min aca dejo el codigo a 10 seg


```
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_CLKOUT   
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF           
@ DEVICE LVP_OFF            
@ DEVICE CPD_OFF            
@ DEVICE PROTECT_OFF        
DEFINE OSC 4
CMCON = 7  
OPTION_REG = %10000101 

MAS_SEGUNDO  Var Byte     ; Definir variable second
MAS_TIEMPO    VAR BYTE
TIME1              VAR WORD 

LED_1      var PORTB.0  
LED_2      VAR PORTB.1 
TRISB = %00111110
TRISA = %11000000
PORTA = %00000000
PORTB = %00000000 

ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

DISABLE         
MI_INTERRUPCION:
mas_tiempo=mas_tiempo+1
if mas_tiempo < 61 then endinterrupt 
mas_tiempo=0
toggle led_1
MAS_SEGUNDO=MAS_SEGUNDO+1
IF MAS_SEGUNDO>=10 THEN
SEGUNDO=0
TOGGLE LED_2
ENDIF
```

hola reyvilla mira pude aumentar el tiempo de encendido por 10 seg luego se apaga por 10 seg y se repite el bucle como podria hacer el codigo para que enciende led_2 x 10 seg y se apaga por 5 seg y asi se repita el bucle voy entendiendo muchas gracias espero puedas seguir ayudandome



amigo mira probando y probando hago este codigo pero no se si estara bien creo que me estoy enredando cada vez mas y no quiero si practico y pruebo es para aprender pero quisiera saber en que fallo
este codigo lo que le indico es cuente x 10 seg cuando llegue a 10 seg prenda LED_2 por 5 seg luego se apague a los 15 seg osea:
0--10seg-->apagado led_2
10-15seg-->prendido led_2
15-25seg-->apagado led_2
25-30seg-->prendido led_2
pero no me hace eso, solo respeta los 10 seg al empezar el codigo, osea se prende LED_2 a los 10 seg luego se apaga a los 15 seg
0--10seg-->apagado led_2
10-15seg-->prendido led_2
15-20seg-->apagado led_2
20-25seg-->prendido led_2
como hacer para que me respete los 10 seg de apagado siempre
aca dejo el codigo que estoy haciendo en verdad agradesco su ayuda


```
@ DEVICE PIC16F628A          
@ DEVICE INTRC_OSC_CLKOUT    
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF            
@ DEVICE LVP_OFF               
@ DEVICE CPD_OFF             
@ DEVICE PROTECT_OFF        

DEFINE OSC 4 

CMCON = 7   
OPTION_REG = %10000101 

Hour   Var Byte    
Minuto Var Byte     
Segundo Var Byte     
MAS_TIEMPO VAR BYTE
TIME1   VAR WORD 

LED_1      var PORTB.0  
LED_2      VAR PORTB.1 
TRISB = %00111110 
TRISA = %11000000 
PORTA = %00000000
PORTB = %00000000 

ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

INICIO:
    IF led_2=1 THEN
     for TIME1=1 to 1000
      pause 5
     next TIME1
      low led_2
    ENDIF
GOTO INICIO

DISABLE         
MI_INTERRUPCION:
mas_tiempo=mas_tiempo+1
if mas_tiempo < 61 then endinterrupt 
mas_tiempo=0
toggle led_1
SEgundo=Segundo+1
IF SEgundo>=10 THEN
SEgundo=0
high LED_2
ENDIF
 
endinterrupt:
INTCON.2=0
RESUME
ENABLE
END
```


----------



## ferdy575 (Ago 5, 2012)

hola a todos, por favor alguien sabe sí con un 16f84a ó un 16f628a puedo usar programación in circuit? y sí es así como lo hago? 
ya lo he hecho con otros pics como por ejemplo el 16f877a y me funciona pero con estos no que sera lo que estoy haciendo mal, les agradezco su ayuda...


----------



## reyvilla (Ago 5, 2012)

ferdy575 dijo:


> hola a todos, por favor alguien sabe sí con un 16f84a ó un 16f628a puedo usar programación in circuit? y sí es así como lo hago?
> ya lo he hecho con otros pics como por ejemplo el 16f877a y me funciona pero con estos no que sera lo que estoy haciendo mal, les agradezco su ayuda...



Hola si se puede, si es ICSP a lo que te refieres programación serial en el circuito, en la hoja de dato de todos los pic te indica cuales son los pines de programación, buscas en el PDF del pic para el caso del 16F84A, indica que debes buscar una guía.

For complete details of serial programming, please
refer to the In-Circuit Serial Programming (ICSP™)
Guide, (DS30277).

Pero en realidad los pines son igual para el 16F628A como para el 16F84A y son los siguientes:

PGC     13
PGD     12
MCLR   4
VDD     14
VSS      5





cesarim dijo:


> muchas gracias por ir orientandome ya poco a poco voy entendiendo logre aumentar el tiempo por 10 segundos puedo aumentar a 1 min aca dejo el codigo a 10 seg
> 
> 
> ```
> ...



Hola recuerda comentar todo ya que se hace mas facil entender lo que pretendes hacer, y por otro lado para implementar tiempos distintos y a traves de algo externo para iniciar la temporizacion yo particularmente utilizo una base de tiempo que me permite incrementar otros contadores individuales...Otra cosa si no necesitas presicion los tiempos los puedes manejar sin interrupcion avisa en si que es lo que quieres hacer.


----------



## guigo (Ago 5, 2012)

Hola....
ps yo quiciera introducirme en la comunicacion USB y ethernet con basic. alguien me puede enviar ejemplos sencillos y si a alguno le ha pasado que al compilar el codigo generado por easyHid no compila, me puede explicar que debo tener en cuenta? muchas gracias.


----------



## cesarim (Ago 5, 2012)

quisiera que empiece por respetar el tiempo que quiero darle que sea 10 seg  exactos  que este apagado  y 5 seg exactos que este prendido de verdad muchas gracias por tu apoyo


----------



## reyvilla (Ago 6, 2012)

cesarim dijo:


> quisiera que empiece por respetar el tiempo que quiero darle que sea 10 seg  exactos  que este apagado  y 5 seg exactos que este prendido de verdad muchas gracias por tu apoyo



Hola amigo cesar con otro compañero me puse a realizar un proyecto similar y quedo bastante bien a mi parecer revisalo y me avisas saludoss


----------



## GoX F4yCk3r DB (Ago 8, 2012)

Hola que tal, alguien podria hecharme una manita con las interrupciones en la comunicacion en serie...
He estado leyendo acerca del tema y ando un poco confundido...
esto es lo que he logrado hasta ahorita

```
DEFINE HSER_RCSTA 90h 'Set  receive register to receiver enabled
DEFINE HSER_TXSTA 26h ' Set transmit register to transmitter enable
DEFINE HSER_BAUD 9600 ' Set baud rate

x   var byte
y   var byte
 

trisb=$00

x=2

INTCON=%11000000  'Habilita interrupciones de registro PEIE
on interrupt goto lee_serie
PIE1.5 = 1 
  
ciclo:  
  portb=x
  goto ciclo
  
   Disable 
 lee_serie     
    hserin [x]
    hserout [x]
resume
enable
```

La comunicacion la estoy haciendo virtualmente por el momento con el VSPD, proteus y el hiperterminal de microcode.
La idea es sencilla, mando un caracter a tráves de microcode y el pic lo recibe y este mismo me lo regresa, el caracter enviado se muestra en el puerto B a tráves de leds, el problema es que no importa cual caracter envie la visualizacion en los leds no cambia, es decir si mando un 6 o un 9, permanecen encendidos los mismos leds sin cambio alguno.
Yo se que no es necesario usar las interrupciones para este programita tan sencillo y que sin interrupciones se puede lograr lo que quiero, pero necesito aprender a usar las interrupciones ya que lo implementare en un programa un poco mas complejo.
salu2


----------



## arturouc (Ago 8, 2012)

GoX F4yCk3r DB dijo:


> Hola que tal, alguien podria hecharme una manita con las interrupciones en la comunicacion en serie...
> He estado leyendo acerca del tema y ando un poco confundido...
> esto es lo que he logrado hasta ahorita
> 
> ...



Aqui hay un ejemplo de lubeck click aqui con este ejemplo yo lo pude simular
_mi ejemplo_

estamos en contacto...


----------



## cesarim (Ago 13, 2012)

Amigo Reyvilla agradesco tu paciencia en haberme ayudado ya entendi muy el codigo que me enviastes y me ayudo  mucho

otra cosa amigo que ahora me esta saturando un poco  si quisiera esos led trabajarlos cada uno con pulsadores se puede lograr me refiero a que el led1 prenda cuando prsiona el pulsador y se apague con el  tiempo dado por el codigo


----------



## reyvilla (Ago 13, 2012)

cesarim dijo:


> Amigo Reyvilla agradesco tu paciencia en haberme ayudado ya entendi muy el codigo que me enviastes y me ayudo  mucho
> 
> otra cosa amigo que ahora me esta saturando un poco  si quisiera esos led trabajarlos cada uno con pulsadores se puede lograr me refiero a que el led1 prenda cuando prsiona el pulsador y se apague con el  tiempo dado por el codigo



Hola que bueno que hayas aprendido eso es lo importante ya que para eso es el foro, no solo aprendes tu yo también, con respecto a lo que mencionas de los led's con pulsadores, yo diría que casi todo es posible con los pic y de seguro que si se puede, la cuestión es sacarle el mayor provecho al pic, claro esta sin suturarlo. Ahora lo que se me ocurre es que si le damos prioridad al tiempo al presionar el pulsador este va seguir Incrementando solo que va a cambiar el estado del led hasta que termine su tiempo y vuelva  a cambiar de estado por desbordamiento del registro asignado para ese led...Si te fijaste en el código anterior las salidas del puerto A al presionar el botón cambian y eso sin afectar los tiempo de los leds.

Un dato importante que no se si notaste es que a pesar de manejar tiempos bien precisos a través del reloj de tiempo real interno del pic, es que si dentro de nuestro loop  de interrupción hacemos muchas otras sentencias el tiempo se ve afectado para largos periodos, un ejemplo seria una hora, si dentro del loop interrupción tenemos muchas sentencias eso genera un retardo y mas en pbp, eso sucede porque consumimos el tiempo y eso pasa porque al entrar al loop se deshabilita la interrupción y el reloj deja de funcionar hasta que se vuelva habilitar la interrupción,  si en ese proceso utilizamos muchas sentencias las cuales generan el uso de muchos ciclos de maquina, con lo cual empezamos a degradar la precisión de los tiempos de los leds. Es por eso que solo se uso una sola sentencia en la interrupción para que sea lo mas preciso posible. 

Cualquier cosa me avisas saludosss


----------



## cesarim (Ago 15, 2012)

Si entendi eso muy bien y gracias por la aclaracion  ya que comence hacer pruebas  pàra ir aprendiendo y en algun momento afecto como tu me indicas eso si lo logre manejar lo que ahora mi inquietud es agregar pulsador a cada led y por decir
boton1(activa) led_1
boton2(activa) led_2
cuando se pulse el boton1 el led_1 encienda hacerle un bucle de 5 min para probar y luego que se apgue solo y funcione hasta que lo vuelvas a preesionar y tambien  que tenga la opcion de si presionastes  y prendio el led si no se cumple los 5 min y vuelves a presionar el boton1 que este tenga la opcion tambien de apgarlo asi no se haya cumplido los 5 min estoy intentandole pero no logro y en realidad ni idea de como hacerlo si he echo prender y apagar leds con botones pero de esta manera con interrucion jamas y ahora quisiera intentarlo pero no logro nada si podria darme una idea te estare agradecido ya que me estas ayudando mucho


----------



## reyvilla (Ago 15, 2012)

Algo a tomar en cuenta es el tiempo de los registros ya que se manejan los led's con el comando toggle, y eso quiere decir que puedes cómodamente colocarle prioridad a un pulsador a pesar de no haber completado el tiempo el registro, ahora que va a pasar con ese registro se va a resetear al momento de pulsar el pulsador o va a seguir contando el tiempo restante hasta los 5min.? Alli es donde esta el problema, ya que no se si seria solo para cuando apagues el led's que se resetee el registro y para cuando se encienda no? Depende de eso se hace mas o menos complejo el asunto. Planteate bien eso y me avisas saludoss


----------



## cesarim (Ago 16, 2012)

Reyvilla mira aun no me sale el codigo que te mencione pero intentandole logre ya que al menos me respondiera este puylsador Boton que al presionarse se encienda el led lo logra hacer lo que no me respeta aun es el tiempo quisiera saber en que estoy fallando quisiera que el led de encendido sea exacto 10 seg o 20 seg o min si le pusiera pero ahora solo cuenta por contar como te digo no es el ejemplo que postee q tengo en mente realizar pero al menos ya he podido dar con el pulsador que haga prender este led espero tu respuesta y gracias por la ayuda

```
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_CLKOUT    
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF            
@ DEVICE LVP_OFF               
@ DEVICE CPD_OFF             
@ DEVICE PROTECT_OFF        

DEFINE OSC 4 

CMCON = 7   

TRISB = %00000000 
TRISA = %11111000 
PORTA = %00000000
PORTB = %00000000

TLED1       VAR word  
MinutO      var byte   
Segundo     Var Byte     
MAS_TIEMPO  VAR BYTE
INITIO      VAR BYTE
FLAG0      VAR BIT
Juego       VAR WORD

LED_1       var PORTB.0  
LED_2       VAR PORTB.1 
IntE        VAR PORTB.7
                           
BLuz1       VAR PortA.0
BLuz2       VAR PortA.1
BLuz3       VAR PortA.2
BOTON       VAR PortA.7 

OPTION_REG = %10000101
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

FLAG0=0
INICIO: 

    IF BOTON THEN
    toggle led_2;=1
    flag0=1
    ENDIF
    while BOTON = 1
    wend
    
GOTO INICIO

DISABLE            
MI_INTERRUPCION: 
INITIO  = INITIO  + 1
MAS_TIEMPO = MAS_TIEMPO + 1
IF INITIO = 3 THEN
INITIO = 0
TOGGLE INTE
ENDIF

IF MAS_TIEMPO => 61 THEN
MAS_TIEMPO = 0
TOGGLE LED_1 
FLAG0=1
TLED1 = TLED1 + 1

IF LED_2 = 1 AND flag0=1 and TLED1 = 10 THEN
LED_2 = 0 
TLED1 = 0
flag0=0
ENDIF
endif

INTCON = %10100000 
Resume
Enable
```




```
IF LED_2 = 1 or flag0=1 and TLED1 = 10 THEN
LED_2 = 0 
TLED1 = 0
flag0=0
ENDIF
endif

INTCON = %10100000 
Resume
Enable
```
aca me respeta el toggle prende y apaga pero si lo dejo prendido aun no me respeta el tiempo asignado



aca mejoro un poco mas pero el boton no es preciso espero lo puedas compilar y  me sigas ayudando por favor

```
IF MAS_TIEMPO => 61 THEN
MAS_TIEMPO = 0
TOGGLE LED_1 
if FLAG0=1 and led_2=1 then
TLED1 = TLED1 + 1

IF LED_2 = 1 or flag0=1 and TLED1 = 10 THEN
LED_2 = 0 
TLED1 = 0
flag0=0
ENDIF
endif
endif
```


----------



## reyvilla (Ago 16, 2012)

hola aun no logro entender que es lo que quieres que haga con exactitud, quieres que al presionar el botón el led cambie de estado, osea si esta apagado cuando presionas el botón encienda y si esta encendido cuando presiones el botón se apague, por otro lado el tiempo va a empezar después de ser presionado el botón o va a seguir con el tiempo que ya llevaba.


----------



## cesarim (Ago 17, 2012)

saludos amigo reyvilla mira si presiona el pulsador el led cambia de estado como tu mencionas es correcto presionas pulsador prende el led y empieza el conteo si le pusimos 10 min y no se volvio a presionar el pulsador se apaga el led cumplido los 10 min pero si se presiono el pulsador antes de los 10 min por decir a los 2min o 5 min entoncs el led se apaga y el conteo vuelve a cero espero puedas ayudarme saludos


----------



## reyvilla (Ago 17, 2012)

ok siendo así es mucho mas sencillo el código, claro esta no va a contar solo si no hasta que se presione el botón, y digamos que tenemos 4 pulsadores y 4 led's, del LED1 A LED4 Y del PULSADOR1 A PULSADOR 4, los cuales se corresponden, PULSADOR1  activa el LED1, siendo así tendrías una variable por cada led y como son individuales no afectaría el tiempo de ninguna, y con una condicional colocas el botón que si se presiona y esta el led encendido lo apague y resetee la variable y listo ya tendrías solucionado el problema.


----------



## cesarim (Ago 19, 2012)

es lo que intento podrias echarme una manito con el codigo que posteee es que no me respèta los tiempo espero no incomodar


----------



## cesarim (Ago 20, 2012)

Saludos reyvilla quisiera nuevamente  pedirte que me ayudes mira no logro aun mejorar mi programa si pudieras ayudarme ya que me estoy enredando y no logro encontrar solucion te dejo el codigo con la simulacion haber si lo puedas revisar y decirme en que estoy fallando cuando presiono el pulsador no es  preciso, quiero decir que no siempre funciona a la primera pulsacion 
Le agrege pulsador2 para que trabaje con otro led2 con el mismo proposito del pulsador1 o boton. La idea es que cualquiera de los dos pulsadores BOTON0  o BOTON1 active o desactive su correspondiente leds sea LED0 o LED1 si este esta prendido y no se volvio a presionar el pulsador que se apague despues del tiempo dado en este caso 10 seg y si se presiona antes del tiempo de los 10 seg que apage el led y resetee el conteo si logras chequear el codigo el conteo solo lo logra hacer para uno de ellos, el otro no cuenta solo funciona como un toggle espero puedas ayudarme y poder saber que me falta Saludos
ahi te dejo todo el codigo 

```
@ DEVICE PIC16F628         
@ DEVICE INTRC_OSC_CLKOUT    
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF            
@ DEVICE LVP_OFF               
@ DEVICE CPD_OFF             
@ DEVICE PROTECT_OFF        

DEFINE OSC 4 

CMCON = 7   

TRISB = %00000000 
TRISA = %11111000 
PORTA = %00000000
PORTB = %00000000

TLED1       VAR word  
TLED2       VAR word
MinutO      var byte   
Segundo     Var Byte     
MAS_TIEMPO  VAR BYTE
INITIO      VAR BYTE
FLAG0       VAR BIT
FLAG1       VAR BIT
Juego       VAR WORD

LED_1       var PORTB.0  
LED_2       VAR PORTB.1 
LED_3       VAR PORTB.2
IntE        VAR PORTB.7
                           
BLuz1       VAR PortA.0
BLuz2       VAR PortA.1
BLuz3       VAR PortA.2
BOTON       VAR PortA.7 
BOTON1      VAR PortA.6

OPTION_REG = %10000101
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

FLAG0=0
FLAG1=0

INICIO: 

    IF BOTON  THEN Salto1
    IF BOTON1 THEN Salto2
        
    salto1:
    if BOTON THEN
    toggle led_2
    TOGGLE FLAG0
    ENDIF
    while BOTON = 1 :Wend
    
    salto2:
    if BOTON1 THEN
    toggle led_3
    TOGGLE FLAG1
    ENDIF
    while BOTON1 = 1 :Wend
     
GOTO INICIO

DISABLE            
MI_INTERRUPCION: 
MAS_TIEMPO = MAS_TIEMPO + 1
IF MAS_TIEMPO => 61 THEN
MAS_TIEMPO = 0
TOGGLE LED_1 
if FLAG0=1 and led_2=1 then
TLED1 = TLED1 + 1

IF LED_2 = 1 or flag0=1 and TLED1 = 10 THEN
LED_2=0 
if led_2=0 then
flag0=0
TLED1=0

IF LED_3 = 1 or flag1=1 and TLED2 = 10 THEN
LED_3=0 
if led_3=0 then
flag1=0
TLED2=0
endif 
endif
endif
endif
endif
endif

INTCON = %10100000 
Resume
Enable
```


----------



## D@rkbytes (Ago 21, 2012)

Saludos cesarim
Me parece que con los cambios que realice a tu programa, ya hace lo que requieres.
Ya el amigo reyvilla te enseño algunos conceptos, y con estas modificaciones que realice,
creo que podrás continuar con tu proyecto.

Compara tu programa con el que adjunto para que puedas ver en donde se realizaron los cambios.

Suerte.


----------



## cesarim (Ago 21, 2012)

te agradesco mucho les agradesco mucho a ambos por que  entiendo ya mejor como es trabajar con pic y en verdad las dudas me atormentaban que nio dormir podia practicando de una y otra forma y ahora ya esta la cuarta parte de mi codigo gracias a su apoyo seguire y pues solo gracias y mas gracias


----------



## diodito (Ago 27, 2012)

mecatrodatos dijo:


> Amigos vamos con un proyecto interesante control de acceso son clave utilizando un teclado matrixal de 4x4,pic 16f84a y testigos de operatividad, al ingresar los cuatro digitos correctamente se energiza un rele durante tres segundos  ubicado en el pin door del pic ,si la clave es incorrecta se emite tres activaciones en  bip y led ubicados en el puerto  A0 y A1 respectivamente, la activacion de cada tecla va acompañado de la visualizacion del led ubicado en pin 18 del pic 16f84a.
> 
> codigo fuente en pic basic pro
> 
> ...


Me gustaría colocarle un teclado matricial de 3*4 y si la programación la tengo que modificar


----------



## christus (Ago 28, 2012)

Hola amigos hace poco les comente que recien empezaba con el pic 12f675. Ahora por les pediria me ayuden para hacer un timer con este pic los que he visto en el foro son con el 16f84 no se si necesita otra configuracion por el tema del prescaler y las interrupciones.

Agradezco de antemano por su ayuda


----------



## torres.electronico (Ago 28, 2012)

diodito dijo:


> me  gustaria colocarle un teclado matricail de 3*4 y si la programacion la tengo que modificar



 no te entiendo... que necesitas concretamente? Por que ese ejemplo esta completo... no es muy dificil tranformarlo a 3x4... Intentaste tratar de entender como hace la lectura del teclado o solo te interesa copiar, pegar, grabar y energizar?


----------



## ferdy575 (Ago 29, 2012)

hola a todos, de nuevo yo por aquí molestando a ver sí alguien me puede ayudar, ya hace algún tiempo estoy haciendo un temporizador con un 16f84a, bueno ya lo termine pero ahora quiero hacer una versión en el programa donde me de un mensaje al terminar el conteo pero al escribir el nuevo basic solo obtengo errores aquí subo los archivos a ver sí por favor me ayudar, sí ven en los archivos el basic tempo3 funciona normal pero el basic tempo4 funciona super mal, a ver sí me pueden ayudar y muchas gracias de antemano


----------



## torres.electronico (Ago 31, 2012)

*Hola ferdy... lo de la visualizacion del DISPLAY ya te lo corregi... estabas reiniciando la pantalla cada vez que entraba en la subrutina de imprimir.... fijate como te lo modifique:*


```
;CONFIGURACIÓN PIC
 @ DEVICE pic16F84A
 @ DEVICE WDT_ON              
 @ DEVICE PWRT_ON                   
 @ DEVICE PROTECT_OFF      
 @ DEVICE xt_osc  
define osc 4 
;REGISTROS LCD
Define    LCD_DREG    PORTB
Define    LCD_DBIT    0
Define    LCD_RSREG    PORTB
Define    LCD_RSBIT    4
Define    LCD_EREG    PORTB
Define    LCD_EBIT    5

Symbol Minutos = PORTA.1    ; AJUSTE MINUTOS
Symbol Segundos = PORTA.2   ; AJUSTE SEGUNDOS
symbol Out = PORTB.7        ; SALIDA CONTROL 
symbol START = PORTA.3      ; INICIO CONTEO
SYMBOL STOP_ = PORTB.6      ; DETIENE CONTEO

;VARIABLES
Pulsos VAR byte 
Mts VAR byte 
Sds VAR byte 
Delay VAR byte
CLEAR
 
TRISB = %01000000 
TRISA = %00011111 

PAUSE 500 

Mts = 03
Sds = 00
pulsos = 0

OPTION_REG = %00000101 ; prescaler = 64
On INTERRUPT GOTO ISR ; IR A RUTINA ISR 
INTCON = %10100000 


;INCIO DEL PROGRAMA
LOOP:
;BOTÓN START
IF START = 0 THEN ; si el boton start es presionado ejecuta lo siguiente
TMR0 = 0 ;Inicializa refgistro TMR0 
INTCON = $A0 ;habilita el  timer interrupt
gosub Retardo
LCDOUT $FE, 1           ; ESTA ES LA MODIFICACION... LA INSTRUCCION "$FE, 1" LO PUSE ACÁ
ENDIF 

;BOTÓN STOP
IF STOP_ = 0 THEN ; si el boton stop es presionado ejecuta lo siguiente
INTCON = 0 ;desabilita el  timer 
gosub Retardo
ENDIF 

;BOTÓN PROGRAMAR LOS MINUTOS
IF Minutos = 0 THEN
Mts = Mts - 1
gosub retardo
ENDIF

;BOTÓN PROGRAMAR LOS SEGUNDOS
if Segundos = 0 then
Sds = Sds - 1
gosub retardo
ENDIF

'*****************************
IF Mts = 60 AND Sds = 60 THEN' 
out = 1                      '
gosub mensaje_fin             '
else                         '
out = 0                      '
gosub retro
gosub MENSAJE1                '
ENDIF                        '
'*****************************
              
GOTO LOOP

;ANTIRREBOTE
Retardo:
FOR Delay = 1 To 200
Pause 1 
NEXT Delay 
RETURN

;EJECUCION DE UN SEGUNDO
DISABLE
ISR:
IF Mts < 0 OR Sds > 0 THEN 'OJO sí se cambia esta función no funciona el conteo
pulsos = pulsos + 1
IF pulsos < 61 THEN NoUpdate
endif

;TIEMPO
Retro:
pulsos = 0

IF Sds = 0 AND Mts => 0 then
Mts = Mts - 1
Sds = 61
endif
if mts > 60 then mts = 60       
if mts = 0 then mts = 0

'ALARMA
IF Mts = 60 AND Sds = 60 THEN
pulsos = pulsos
INTCON = 0 ;desabilita el  timer 
else
TMR0 = 0 ;Inicializa registro TMR0 
INTCON = $A0 ;habilita el  timer interrupt
Sds = Sds - 1
endif                                              
return

mensaje1:
; LA INSTRUCCION LCDOUT $FE, 1  TE LA SAQUE DE ACÁ
LCDOUT $FE, 2
Lcdout "Tiempo de espera "  
LCDOUT $FE,$C4,DEC2 Mts, ":",DEC2 Sds
LcdOut $fe,$C16, 0
LCDOUT $fe,$40,$00,$0A,$0A,$00,$04,$11,$0E,$00 'aqui tenemos la carita feliz :)
return

mensaje_fin:
; LA INSTRUCCION LCDOUT $FE, 1  TE LA SAQUE DE ACÁ
LCDOUT $FE, 2
Lcdout " <<FINALIZADO>> "  
LCDOUT $FE,$C1,"  PULSE CLEAR"
return

NoUpdate:
INTCON.2 = 0 
Resume                                                                              
ENABLE 
END
END
```
*
Despues si me hago de un tiempo, le presto un poco mas de atencion y veo que hace que no pare el contador...saludos*


----------



## torres.electronico (Sep 2, 2012)

Hola...consulta; Lubeck, Reimy, Mecadatros o algun otro groso puede ser que publicaron un ejemplo de control de tarjeta de memoria SD con un 16F877 en este mismo topico? lo busque en casi las 116 paginas y no vi nada... no se por que tengo dentro de la cabeza que algunbo de ellos subio algo... Si me pueden dar una mano y refernciarme el link que me parecio ver, se los agradezco...


----------



## ferdy575 (Sep 2, 2012)

</SPAN>





torres.electronico dijo:


> *Hola ferdy... lo de la visualizacion del DISPLAY ya te lo corregi... estabas reiniciando la pantalla cada vez que entraba en la subrutina de imprimir.... fijate como te lo modifique:*
> 
> 
> ```
> ...


 
hola gracias por tu ayuda, tenias razón con el reseteo del LCD ya funcionan bien los mensajes pero no se por que ahora el tiempo se ha vuelto loco los 3 minutos de programacion los pasa como en 10 segundos y no logro encontrar el error en el tiempo te agradezco sí me puedes ayudar gracias


----------



## guigo (Sep 2, 2012)

christus dijo:


> Hola amigos hace poco les comente que recien empezaba con el pic 12f675. Ahora por les pediria me ayuden para hacer un timer con este pic los que he visto en el foro son con el 16f84 no se si necesita otra configuracion por el tema del prescaler y las interrupciones.
> 
> Agradezco de antemano por su ayuda



yo no creo....el microcontrolador difiere porque solo cuenta con seis pines i/o y su configuracion es GPIO en vez de port....de resto es lo mismo...si necesitas algun registro interno del micro miras el datasheet pero para lo que pedis lo unico que tenes que tener en cuenta es eso...


----------



## Alever89 (Sep 3, 2012)

una consulta soy nuevo en el tema de pic basic pro, esta revisando un libro y halle un ejemplo donde se utiliza una bandera, queria saber para que sirve eso


----------



## christus (Sep 5, 2012)

guigo dijo:


> yo no creo....el microcontrolador difiere porque  solo cuenta con seis pines i/o y su configuracion es GPIO en vez de  port....de resto es lo mismo...si necesitas algun registro interno del  micro miras el datasheet pero para lo que pedis lo unico que tenes que  tener en cuenta es eso...



hola amigo gracias por tu ayuda tienes razon no hay ningun problema; entonces adjunto el programa ya probado en este caso mantengo apagado un led por 30min y luego enciende 1 min. Ya luego esta salida se puede usar como mejor nos parezca. espero les sea de ayuda. 


```
;*******************************************************************************
; Notas:
; Enceder y apagar un LED por GP0 
;*******************************************************************************
@ DEVICE PIC12F675
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,WDT_OFF,MCLR_ON,PWRT_ON,BOD_OFF
;*******************************************************************************

DEFINE OSCCAL_1K 1      ; Calibración del oscilador interno
DEFINE OSC 4            ; Definir el oscilador a 4MHz (Para cálculos del compilador)    

ANSEL = 0               ; Modo digital I/O (Cuando todos los bits son 0
                        ; No tiene caso poner %00000000) =)
CMCON = 7               ; Comparadores análogicos desactivados
TRISIO = %111110        ; GPIO = 'e,e,e,e,e,s' (62) Solo GP0 como salida
                        ; GP3/MCLR/Vpp Solo puede ser usado como entrada
                        ; Si se declara el fuse MCLR_XX en OFF



Ticks       VAR byte                           
Minute      VAR byte                         
Second      VAR byte 
a           var byte
ap          var byte
en          var byte
Minute = 0 'inicializa los valores del timer 
Second = 0 
Ticks = 0 
a = 0  
GPIO.0 = 0



inicio:

OPTION_REG = $05               ;  prescaler = 64
ON INTERRUPT GoTo ISR          ; ir a rutina ISR 

 IF a = 0 Then
 
   TMR0 = 0 ;inicializa registro TRMO
   INTCON = $A0 ; habilita tiempo de interuupcion
   a = 1
    
 ENDIF   
     

goto inicio

DISABLE
 ISR:
 Ticks = Ticks + 1
 IF Ticks < 61 Then NoUpdate
 Ticks = 0
 Second = Second + 1
 IF Second = 60 Then
 Second = 0
 Minute = Minute + 1

 ENDIF
 
 
 IF Minute = 30 Then   ' control de la recirculacion
 
 GPIO.0 = 1
 
 endif
 
 IF minute = 31 Then
 
 GPIO.0 = 0
 minute = 0
 
 endif
 
 NoUpdate:
 INTCON.2 = 0 ;rehabilitainterrupciones del TRMO
 Resume
 ENABLE ; 
 End
 End ; Fin del programa
```


----------



## LaElectronicaMeOdia (Sep 5, 2012)

como antecedente, estoy realizando una conexion USB con un micro 18f4550 y picbasic+VB6.0, simulado en proteus. (anexo codigos y diagrama)

el problema que tengo que ya me esta dando dolor de cabeza es que pongo el el siguiente codigo como bucle principal y no me funciona


```
ProgramStart: 
 gosub DoUSBIn
 Select case usbbuffer[0]
  Case "A"
   toggle PortB.0
  Case "B" 
   toggle PortB.1
   usbbuffer[0]="C"
   gosub DoUSBOut
 End Select

 button  PortC.0,0,0,0,BVarD,0,ExitB
  toggle PortB.1
  usbbuffer[0]="C"
  gosub DoUSBOut   
 ExitB:
goto  ProgramStart
```

pero si yo comento la parte correspondiente a la entrada de datos, la rutina button funciona bien,  mas o menos asi:

```
ProgramStart: 
 'gosub DoUSBIn
' Select case usbbuffer[0]
'  Case "A"
'   toggle PortB.0
'  Case "B" 
'   toggle PortB.1
'   usbbuffer[0]="C"
'   gosub DoUSBOut
' End Select

 button  PortC.0,0,0,0,BVarD,0,ExitB
  toggle PortB.1
  usbbuffer[0]="C"
  gosub DoUSBOut   
 ExitB:
goto  ProgramStart
```

y si yo comento la parte de la rutina button, la parte de entrada de datos funciona bien, mas o menos asi:

```
ProgramStart: 
 gosub DoUSBIn
 Select case usbbuffer[0]
  Case "A"
   toggle PortB.0
  Case "B" 
   toggle PortB.1
   usbbuffer[0]="C"
   gosub DoUSBOut
 End Select

 ' button  PortC.0,0,0,0,BVarD,0,ExitB
 '  toggle PortB.1
 '  usbbuffer[0]="C"
 '  gosub DoUSBOut   
 ' ExitB:
goto  ProgramStart
```

alguien ha tenido algun problema similar con estas instrucciones?

sera un Bug del PBP?


----------



## LaElectronicaMeOdia (Sep 5, 2012)

Por si alguien esta interesado hice esta variante al algoritmo del button y tampoco funciona! 

```
BVarD            var bit

ProgramStart: 

 gosub DoUSBIn
 Select case usbbuffer[0]
  Case "A"
   toggle PortB.0
  Case "B" 
   Gosub Pulse
 End Select

 if PortC.0 = 0 then
  bvarD=1
 else
  if BVard=1 then BVarD=0: Gosub Pulse
 endif

goto ProgramStart  

Pulse:
 toggle PortB.1
 usbbuffer[0]="C"
 gosub DoUSBOut
Return
```

por lo que me hace suponer que el usbin esta bloqueando de alguna manera al puerto.C
cualquier sugerencia es bien recibida y considerada.

*Nota en el codigo que anexe me falto actualizar y no puse el TrisC.1 como entrada, pero aun asi no funciona.


----------



## torres.electronico (Sep 7, 2012)

Hola amigo "@laelectronicameodia", recuerda que select case en todos los tipos de micros de 16 bits para abajo, se queda esperando el valor de la variable para funcionar y saltar donde corresponde... Si no hay dato, espera por el... Similar al comando infrain de los picaxe...Quizas este pasando eso, no estoy el 100% seguro... Yo, te recomendaria sumar un CASE mas que este preparado para cuando el valor sea "0" (o "1" osea la inversa de loq ue estas haciewndo ahora)y directamente salte a lo que tenes abajo u haga otra funcion... De ultima, si ves que el empleo de los pulsadores son importantes, implementa interrupciones por hardware y este donde este, sin importar lo que este haciendo, saltara al programa de interrupcion donde tenes las ordenes para el boton...
saludos


----------



## LaElectronicaMeOdia (Sep 7, 2012)

Hola Torres, me sirvio mucho tu consejo para cambiar la forma de como estaba viendo el flujo del USBIN, y efectivamente se queda "esperando" el valor.

pongo el diagrama de flujo por si a alguien le sirve.



lo que hice fue poner un timer en VB6 que este enviando el Valor cada 1ms y asi "destrabar" la espera y como mencionas otra posibilidad es el uso de interrupciones en lugar del button, pero se me hizo mas facil de esa manera 

Muchas gracias por tu ayuda!.

ademas anexo el ejemplo de comunicacion bidireccional con usb para quien le pueda servir.
esta probado en  PBP 2.5, MCS 3.0,  MPASM 5.2 y Proteus 7.8

SAludos y de nuevo gracias.


----------



## torres.electronico (Sep 7, 2012)

Excelente aporte "LaElectronicaMeOdia"  Gracias por tu generocidad


----------



## Chico3001 (Sep 8, 2012)

Alever89 dijo:


> una consulta soy nuevo en el tema de pic basic pro, esta revisando un libro y halle un ejemplo donde se utiliza una bandera, queria saber para que sirve eso



Una bandera es simplemente un bit que se usa para indicar que una accion ya se ha ejecutado... por ejemplo que el micro termino una rutina matematica y tiene datos listos para enviar, o el ADC ya termino una conversion

Posteriormente otra rutina revisara si esa bandera se encuentra activada y en base a esto ejecutara otra accion


----------



## volthor (Sep 9, 2012)

reyvilla dijo:


> Muchas gracias amigos, aqui lo prometido la puesta en marcha del brazo, cabe destacar que aun le falta bastante para hacer lo cometido grabar una secuencia, hice unas pruebas pero al parecer el pic se resetea y no hace la secuencia de manera apropiada el brazo se vuelve loco y empieza a dar golpes por todos lados pareciera que tuviera vida propia jejeje ...Pero espero poder lograrlo, creo que es cuestión de velocidad esta muy rápido y lo otro lo de la fuente.
> Bueno espero sus criticas y sugerencias...saludosss
> 
> http://www.youtube.com/watch?v=6Ui3kS5R2AY



Muy buen proyecto, encuentro que comentas que se resetea el pic, te comento que eso mismo me paso, y depues de investigar tanto y realizar los circuitos encontre que primero se debe colocar varios condensadores de 0,1 mf a las salidas y entradas de los puertos del pic, 
segundo que algunas ocaciones colocas mas palabras inadecuadas en la escritura de tu programa, tercero debes aislar muy bien los circuitos. he leido casi todos los comentarios de este tema del foro y casi nadie veo que habla de que han realizado las pruevas en circuitos fisicos, si no en simuladores y la verdad no es lo mismo.
he realizado varias automatizaciones, como procesos de entrada de un producto en un circuito de produccion hasta la salida del producto, automatizacion de una maquina sopladora, automatizacion de una inyectora de plastico vertical, etc y en todos he realizado los circuitos con su proceso de generacion del programa, verificacion y ejecucion del mismo. Al principio cuando realice el primer proyecto, siempre se me reseteava el pic o generava ordenes que no habia introducido o se activava solo, me toco aprender como estabilizar el pic y quitar lo que llaman interferencias electromagneticas y que camello hasta que lo logre y me di cuenta de los herrores cometidos, esto no se lo enseñan a uno en ningun libro, ni en ninguna parte.

asi pues que si quieren publico todo lo que he realizado con circitos y programacion

gracias te felicito por tu proyecto


----------



## kiyero (Sep 9, 2012)

amigos, solicito su ayuda en el siguiente tema con pulsadores, soy neófito en el tema y estoy estudiándolo, soy de la escuela que piensa que en el tema de la electrónica es mejor ir leyendo y practicando, así que paso a lo que quiero hacer y para lo cual solicito su ayuda:

estoy haciendo una ruleta de leds con el pic 16f628a, y lo que quiero es cada vez que presiono el botón en el porta.0 se ejecute un efecto diferente (si presiona la primera vez, se ejecuta el efecto 1, si presiono nuevamente se ejecuta el efecto 2 y así sucesivamente), los diferentes efectos ya los tengo hechos, pero estoy confundido en cómo hacer la rutina de programación del pulsador

gracias por su ayuda


----------



## guigo (Sep 10, 2012)

amigo como esta.....

quiciera que me colaboraras en algo
quiero hacer una pausa con un numero que ingreso por comunicacion serial pero no he podido lograrlo....tambien...como hago para enviar numeros mayores de 9....sucede que cuando quiero ingresar un numero por ejemplo el 60, en donde hay un condicional donde ese numero es clave para que la funcion se cumpla, al ingresarlo no lo reconoce...al parecer solo ingresa el 6....que sucede....y lo anterior es que quiero almacenar ese valor para dar un pause con cualquier valor ingresado por serial....

ejemplo

serin portb.0, T2400, variable

si esa variable es igual a cualquier numero supengamos que quiero prender un led i apagarlo despues de una pausa igual al valor ingresado en variable....amigo le pido porfavor una manito es un trabajo de maestria urgente muchas gracias....





reyvilla dijo:


> Hola que bueno que hayas aprendido eso es lo importante ya que para eso es el foro, no solo aprendes tu yo también, con respecto a lo que mencionas de los led's con pulsadores, yo diría que casi todo es posible con los pic y de seguro que si se puede, la cuestión es sacarle el mayor provecho al pic, claro esta sin suturarlo. Ahora lo que se me ocurre es que si le damos prioridad al tiempo al presionar el pulsador este va seguir Incrementando solo que va a cambiar el estado del led hasta que termine su tiempo y vuelva  a cambiar de estado por desbordamiento del registro asignado para ese led...Si te fijaste en el código anterior las salidas del puerto A al presionar el botón cambian y eso sin afectar los tiempo de los leds.
> 
> Un dato importante que no se si notaste es que a pesar de manejar tiempos bien precisos a través del reloj de tiempo real interno del pic, es que si dentro de nuestro loop  de interrupción hacemos muchas otras sentencias el tiempo se ve afectado para largos periodos, un ejemplo seria una hora, si dentro del loop interrupción tenemos muchas sentencias eso genera un retardo y mas en pbp, eso sucede porque consumimos el tiempo y eso pasa porque al entrar al loop se deshabilita la interrupción y el reloj deja de funcionar hasta que se vuelva habilitar la interrupción,  si en ese proceso utilizamos muchas sentencias las cuales generan el uso de muchos ciclos de maquina, con lo cual empezamos a degradar la precisión de los tiempos de los leds. Es por eso que solo se uso una sola sentencia en la interrupción para que sea lo mas preciso posible.
> 
> Cualquier cosa me avisas saludosss





haaa se me olvidaba....estoy simulando en el terminal de proteus...
saludos


----------



## volthor (Sep 10, 2012)

kiyero dijo:


> amigos, solicito su ayuda en el siguiente tema con pulsadores, soy neófito en el tema y estoy estudiándolo, soy de la escuela que piensa que en el tema de la electrónica es mejor ir leyendo y practicando, así que paso a lo que quiero hacer y para lo cual solicito su ayuda:
> 
> estoy haciendo una ruleta de leds con el pic 16f628a, y lo que quiero es cada vez que presiono el botón en el porta.0 se ejecute un efecto diferente (si presiona la primera vez, se ejecuta el efecto 1, si presiono nuevamente se ejecuta el efecto 2 y así sucesivamente), los diferentes efectos ya los tengo hechos, pero estoy confundido en cómo hacer la rutina de programación del pulsador
> 
> gracias por su ayuda



SALUDOS:Lo mejor que puedes hacer es realizar un diagrama de flujo para poder comprender los pasos a seguir en cada proceso, en  realidad siempre que vas ha desarrollar unproyecto siempre debes empezar por realizar un diagrama de flujo.
si quieres te puedo ayudar con el diagrama de flujo


----------



## kiyero (Sep 10, 2012)

volthor dijo:


> SALUDOS:Lo mejor que puedes hacer es realizar un diagrama de flujo para poder comprender los pasos a seguir en cada proceso, en  realidad siempre que vas ha desarrollar unproyecto siempre debes empezar por realizar un diagrama de flujo.
> si quieres te puedo ayudar con el diagrama de flujo



Volthor, muchísimas gracias, apreciaría mucho tu ayuda en este tema, ya que quiero dejar completamente terminado el tema de interruptores para seguir estudiando lo demás, gracias


----------



## megatecpower (Sep 10, 2012)

hola alguien puede decirme como puedo hacer variar la velocidad de un motor de lavarropas con carbones o escobillas tipo universal con un pic , un opto , y un triac bt139 800V. Ya intente enviando a traves del opto moc3011 sin cruce por cero un pwm pero lo que hace esta mal no arranca suave, y lei tambien que se puede detectando el cruce por cero para disparar correctamente pero nose como puede detectar el pic el cruce por cero ?


----------



## volthor (Sep 10, 2012)

kiyero dijo:


> Volthor, muchísimas gracias, apreciaría mucho tu ayuda en este tema, ya que quiero dejar completamente terminado el tema de interruptores para seguir estudiando lo demás, gracias



saludos hola, cuantos efectos son los que desea proyectar, envieme un correo electronico y le envio el diagrama de flujo

adios


----------



## kiyero (Sep 10, 2012)

volthor dijo:


> saludos hola, cuantos efectos son los que desea proyectar, envieme un correo electronico y le envio el diagrama de flujo
> 
> adios



Hola Volthor, adjunto el archivo de lo que quiero hacer, saludos y gracias


----------



## reyvilla (Sep 10, 2012)

gracias amigo @volthor por las observaciones, lo de las palabras inadecuades me gustaria saber a cuales te refieres para corregirlo ya que me interesa mejorar todo lo relacionado a la programacion, he a vanzado de a paso por mi cuenta y con mucha ayuda de los amigos de foro, a lo mejor no he prestado mucha atencion a lo que me indicas...saludosss

PD: Aprovenchando un poco, me encuentro esta semana en Mexico DF por el centro comercial perisur, si alguien pudiera ayudarme a encontrar alguna tienda de electronica si hay alguna sercana ya que me gustaria aprovehar el viaje...Muchas Gracias


----------



## volthor (Sep 10, 2012)

kiyero dijo:


> Hola Volthor, adjunto el archivo de lo que quiero hacer, saludos y gracias



hola Kiyero:
listo realizado el archivo lo ejecute en mi simulador fisico de pic y funciona perfecto, si tiene alguna duda por favor digamela.
corra el archivo en pic basic pro y montelo en su simulador fisico.
en la parte del pulsador se repite para evitar que si se mantiene oprimido el boton no pase al siguiente.

de paso sirve como parte del tema en el foro


```
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado1: 
         if boton1 = 0 then
          pause 200
          goto sensado1
         endif
```


```
'****************************************************************
'*  Name File: secuenciador.BAS                                     
'*  Author  : Kiyero                                            *
'*  Notice  : Copyright (c) 2012                                *
'*          : All Rights Reserved                               *
'*  Date    : 14/03/2012                                        *
'*  Version : 1.0  con pic 16f628A                              *
'*  Notes   : proyecto secuenciador en pic basic pro                                             
'*          :                                                   *
'****************************************************************

Define LOADER_USED 1
define osc4
define WDT_on
cmcon=7   
   TRISB = %00000000   
   TRISA = %111111
   
symbol boton1 = porta.0
inicio:
porta = %000000
portb = %00000000

menu:
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado1: 
         if boton1 = 0 then
          pause 200
          goto sensado1
         endif
     goto efecto1
endif
goto menu
efecto1:
portb=%10000000
pause 1000
portb=%01000000
pause 1000
portb=%00100000
pause 1000
portb=%00010000
pause 1000
portb=%00001000
pause 1000
portb=%00000100
pause 1000
portb=%00000010
pause 1000
portb=%00000001
pause 1000
portb=%00000010
pause 1000 
portb=%00000100
pause 1000
portb=%00001000
pause 1000
portb=%00010000
pause 1000
portb=%00100000
pause 1000
portb=%01000000
pause 1000
portb=%10000000
pause 1000 
portb=%00000000

boton2: 
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado2: 
         if boton1 = 0 then
          pause 200
          goto sensado2
         endif
     goto efecto2
endif
goto boton2 
efecto2:
portb=%10000001
pause 2000
portb=%01000010
pause 2000
portb=%00100100
pause 2000
portb=%00011000
pause 2000
portb=%00100100
pause 2000
portb=%01000010
pause 2000
portb=%10000001

boton3:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado3: 
         if boton1 = 0 then
          pause 200
          goto sensado3
         endif
     goto efecto3
endif
goto boton3
efecto3:
portb=%11111111
pause 3000
portb=%00000000
pause 3000
boton4:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado4: 
         if boton1 = 0 then
          pause 200
          goto sensado4
         endif
     goto efecto4
endif
goto boton4
efecto4:
portb=%10101010
pause 3000
portb=%01010101
pause 3000
boton5:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado5: 
         if boton1 = 0 then
          pause 200
          goto sensado5
         endif
     goto efecto5
endif
goto boton5
efecto5:
portb=%00011000
pause 3000
portb=%01000010
pause 3000
portb=%10000001
pause 3000
portb=%00100100
pause 3000
boton6:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado6: 
         if boton1 = 0 then
          pause 200
          goto sensado6
         endif
     goto efecto6
endif
goto boton6
efecto6:
portb=%10000000
pause 1000
portb=%00100000
pause 1000
portb=%00001000
pause 1000
portb=%00000010
pause 1000
portb=%00000001
pause 1000
portb=%00000100
pause 1000
portb=%00010000
pause 1000
portb=%01000000
pause 1000
goto menu
end
```


----------



## torres.electronico (Sep 12, 2012)

Hola amigo, si es un motor a _*escobillas*_, con un pequeño arreglo al dimmer que esta en este mismo tema, podras controlarlo sin problema alguno. 
No recuerdo si fue "completamente" sensurado  un aporte mio sobre como modificar el dimmer; Pero basicamente lo que tenes que hacer, como comente en su momento, es agregar una autoinduccion para proteger el triac y que este funcione bien.
Busca informacion de como se calcula la autoinduccion segun carga ... Si implementas SanGoogle, sumale el tag "prof.martintorres" y de seguro te va a llevar al video y el circuito que arme controlando un motor de 1/4 HP...
Salu2

PD: Reimy, no te olvides de volver con un regalo para este amigo


----------



## Dario (Sep 12, 2012)

hola amigos, les cuento que me ha entrado la curiosidad por saber como cargo un valor, por ejemplo 255 a una variable, utilizando un teclado matricial de 3x4. he estado revisando un poco el thread asi superficialmente, y no encontre... ¿alguien me da una idea de como hacerlo? la lectura del teclado ya la tengo y se como cargar el numero de tecla presionado en una variable, osea 1 digito pero no se como hacer lo anterior, osea 3 digitos o mas... saludosss


----------



## kiyero (Sep 12, 2012)

volthor dijo:


> hola Kiyero:
> listo realizado el archivo lo ejecute en mi simulador fisico de pic y funciona perfecto, si tiene alguna duda por favor digamela.
> corra el archivo en pic basic pro y montelo en su simulador fisico.
> en la parte del pulsador se repite para evitar que si se mantiene oprimido el boton no pase al siguiente.
> ...



Hola Volthor, probé el que me enviaste, pero al compilarlo me dá un error, (igual genera el archivo hex), lo simulo en proteus y se queda en el primer efecto, aún cuando vuelvo a presionar el pulsador, adjunto el .pbp y el .dsn, para que por favor lo observes (no sé si tal vez mi simulador está mal configurado), gracias, seguimos en contacto


----------



## volthor (Sep 13, 2012)

kiyero dijo:


> Hola Volthor, probé el que me enviaste, pero al compilarlo me dá un error, (igual genera el archivo hex), lo simulo en proteus y se queda en el primer efecto, aún cuando vuelvo a presionar el pulsador, adjunto el .pbp y el .dsn, para que por favor lo observes (no sé si tal vez mi simulador está mal configurado), gracias, seguimos en contacto



saludos muy Buenos dias:
hola  te comento que lo ejecute en mi simulador proteus y funciona perfecto, revisa la configuracion de tu simulador.
chao cualquier cosa comentelo


----------



## kiyero (Sep 13, 2012)

volthor dijo:


> saludos muy Buenos dias:
> hola  te comento que lo ejecute en mi simulador proteus y funciona perfecto, revisa la configuracion de tu simulador.
> chao cualquier cosa comentelo



Saludos Volthor, no veo el error, tal vez sea la versión? (estoy usando la 7.9 SP1 build11535), tal vez venga el error por ahí???


----------



## matias_2008 (Sep 13, 2012)

Hola alguien me propria ayudar, necesito saber como general un 3 pwm por software los cual en  momentos van a funcionar al mismo tiempo, es para hacer una controladora rgb, ya se que de esto se hablo en varios temas pero como yo programo en PBP (pic basic pro) me gustaria poder hacerlo en ese lenguaje para después poder modificar y hacer los efectos que yo quiera


----------



## torres.electronico (Sep 13, 2012)

matias_2008 dijo:


> Hola alguien me propria ayudar, necesito saber como general un 3 pwm por software los cual en  momentos van a funcionar al mismo tiempo, es para hacer una controladora rgb, ya se que de esto se hablo en varios temas pero como yo programo en PBP (pic basic pro) me gustaria poder hacerlo en ese lenguaje para después poder modificar y hacer los efectos que yo quiera


Me parece, bien no lo recuerdo, en este msimo tema hay uno o odos ejemplos... tendrias que pegarle una mirada... despues cuando llegue a casa, de ultimas, veo si lo encuentro yo o directamente subo el que encontre "yo" acá en el foro


----------



## torres.electronico (Sep 15, 2012)

torres.electronico dijo:


> ...... despues cuando llegue a casa, de ultimas, veo si lo encuentro yo o directamente subo el que encontre "yo" acá en el foro


no encontre el que vi aca en el foro, pero te paso unpar de ejemplos que tenia dando vuelta:


```
DEFINE OSC 4
TRISB = %00000000     
TRISC = 0               
mode            var     byte
counterVar      var     word   
colorGoal       var     byte[3] 
currentColor    var     byte[3] 
colorCheck      var     byte 
x               var     byte    

maxCount        con     1
clear
high portc.0
pause 2000
low portc.0

main:
if countervar > maxcount then 
    countervar = 0              
    colorcheck = 0             
    for x = 0 to 3
        if currentcolor[x] = colorgoal[x] then 
            colorcheck = colorcheck + 1      
        endif                               
    next
    if colorcheck = 3 then 
        mode = mode + 1       
    else                   
        for x = 0 to 3   
            if currentcolor[x] < colorgoal[x] then
                currentcolor[x] = currentcolor[x] + 1
            else
                currentcolor[x] = currentcolor[x] - 1
            endif    
        next
    endif
else
    counterVar = countervar + 1
endif

select case mode//3 
    case 0          
        colorgoal[0] = 25
        colorgoal[1] = 200
        colorgoal[2] = 0
    case 1
        colorgoal[0] = 0
        colorgoal[1] = 250
        colorgoal[2] = 77
    case 2
        colorgoal[0] = 250
        colorgoal[1] = 0
        colorgoal[2] = 100
end select

pwm portc.0, currentcolor[0], 1     
pwm portc.1, currentcolor[1], 1
pwm portc.2, currentcolor[2], 1

goto main
```

Voy a seguir revolviendo en la PC de escritorio  tengo un bolonqui  ya por lo menos se que en la notebook no esta


----------



## reyvilla (Sep 15, 2012)

Saludos amigos, por softwaret no hay manera de generar 3 PWM simultaneos, la unica manera es por hardware, hay dispositivos como el TLC5940 DRIVER PWM, tiene 16 canales PWM idependientes y se controla de forma serial.

Caracteristicas: 
El TLC5940 es un controlador de PWM de 16 unidades con 12 bit de control del ciclo de trabajo (0 - 4095), 6 bits de control de límite de corriente (0 - 63), y una interfaz serial de conexión en cadena. Es muy útil para ampliar el número de salidas PWM disponibles.

Y por lo que vi no es costoso, seria bueno si se animan a realizar un codigo para este intetegrado me pongo a la orden para prestar mi apoyo en el codigo saludos


----------



## matias_2008 (Sep 15, 2012)

Hola gracias por la ayuda, pero estuve hablando con mi profe de micros en la faculta y salio esto un pwm echo con ciclos FOR el cual se puede hacer que acute sobre varia salidas a las ves este es el ejemplo:


```
CMCON=7
TRISB=0
ledr var portb.1  
ledg var portb.2
ledb var portb.3
portb=0
B VAR BYTE :I VAR BYTE  
B=0 


RGB:
 IF B=255 THEN             
  PAUSE 40      
  WHILE B<>0      
  pause 40
   B=B-1          
   FOR I=1 TO B   
    LEDR=1
    ledg=1
    ledb=1
    pauseus 150
   NEXT I
   
   FOR I=1 TO (255-B)
    LEDR=0
    ledg=0
    ledb=0
    pauseus 150 
   NEXT I
  WEND
   B=0   
 ELSE
 pause 40
   B=B+1
   FOR I=1 TO B
    LEDR=1
    ledg=1
    ledb=1
    pauseus 150
   NEXT I
   
   FOR I=1 TO (255-B)
    LEDR=0
    ledg=0
    ledb=0
    pauseus 150
   NEXT I
 ENDIF 
goto rgb
```

nota: esta echo para el 16f628a y hay que usar un oscilador externos de 20Mhz y cuando termine toda la controladora voy a subir con las simulaciones y algún video


----------



## Dario (Sep 17, 2012)

bueno, no se si alguien habria leido mi pregunta anterior pero aqui les dejo la solucion que consegui. el montaje tiene un lcd 16x2 y un teclado matricial 4x3 con el que se igresa un valor a una variable. saludosss

```
@ DEVICE MCLR_On, INTRC_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
DEFINE OSC 4 
cmcon=7 ;cambiar a modo digital todo el puerto A
TRISA = 0 ;todo el puerto A es configurado como salidas


A VAR PORTB.0 ;nombres para los pines de las filas
B VAR PORTB.1
C VAR PORTB.2
D VAR PORTB.3


UNO VAR PORTB.4 ;nombres para los pines de las columnas
DOS VAR PORTB.5
TRES VAR PORTB.6
CUATRO VAR PORTB.7


BARRIDO:
LOW A ;hacer bajo la 1era fila
IF UNO = 0 THEN PORTA = 1 ;si la 1ra tecla es presionada sacar 1
IF DOS = 0 THEN PORTA = 2 ;si la 2da tecla es presionada sacar 2
IF TRES = 0 THEN PORTA = 3 ;si la 3ra tecla es presionada sacar 3
IF CUATRO = 0 THEN PORTA = 10 ;si la 4ta tecla es presionada sacar 10

HIGH A ;poner en alto la 1era fila
LOW B ;hacer bajo la 2da fila

IF UNO = 0 THEN PORTA = 4 ;si la 1ra tecla es presionada sacar 4
IF DOS = 0 THEN PORTA = 5 ; y así sucesivamente
IF TRES = 0 THEN PORTA = 6
IF CUATRO = 0 THEN PORTA = 11

HIGH B ;poner en alto la 2da fila
LOW C ;hacer bajo la 3ra fila

IF UNO = 0 THEN PORTA = 7
IF DOS = 0 THEN PORTA = 8
IF TRES = 0 THEN PORTA = 9
IF CUATRO = 0 THEN PORTA = 12

HIGH C ;poner en alto la 3ra fila
LOW D ;hacer bajo la 4ta fila

IF UNO = 0 THEN PORTA = 14
IF DOS = 0 THEN PORTA = 0
IF TRES = 0 THEN PORTA = 15
IF CUATRO = 0 THEN PORTA = 13

HIGH D ;poner en alto la 4ta fila
PAUSE 10 ;pausa de 10 milisegundos

GOTO BARRIDO ;continuar con el barrido de teclas
END
```


----------



## guigo (Sep 24, 2012)

quien me puede ayudar....

resulta que necesito enviar un numero via serial para hacer un contador segun el dato entrante pero me veo con la situacion de que serin solo recibe un dato por ejemplo si envio 234 solo recibe el 2, me encontre con que la instruccion serin2 recibe mas datos pero no logro que me funcione ahora, es necesario escribir ese dato en memoria o a variable me almacena ese dato hasta que entre otro porfa ayuda....


----------



## torres.electronico (Sep 25, 2012)

guigo dijo:


> quien me puede ayudar...


Busca un ejemplo aca mismo de envio de cadenas de texto... osea, el ejemplo esta realizado para mandar comandos AT con un modem gsm, pero en la misma cadena del mensaje, muestra como se extrae el bits que solo a vos te interesa...saludos


----------



## Jenry M (Sep 29, 2012)

Apreciados colegas estoy tratando de contar eventos y he utilizado el comando BUTTON de PICBasic 2.60  para detectar un evento en el pin RB7, de la siguiente forma:

LOOP:
BUTTON , PULSO , 1 , 255 , 20 , i , 0 , LOOP       

pero cuando compilo me da el error      (BAD EXPRESION)

Tambien con el comando LOOKUP me da BAD EXPRESION
ej
Lookup Digit,[$3F,$06$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron

EL programa es el siguiente:

```
cont Var Byte                   'Cont es una variable cuenta eventos
Cont1 Var Byte                  'Cont1 es una variable cuenta hasta 125
Cont2 Var Byte                  'Cont2 es una variable cuenta hasta 5
Digit Var Byte                    'Digit es una variable tipo Byte
Patron Var Byte                 'Patron es una variable tipo Byte
Digit1 Var Byte                  'Digit1 Variable tipo Byte
Digit2 Var Byte                  'Digit2 Variable tipo Byte
PULSO Var PORTB.7            'Pulso de entrada cuenta de productos
i var byte                          'Variable tipo Byte
LedRojo Var PORTA.2           'Led Rojo Freno 
Rele1 var PORTA.4               'Rele1 es Puerto de Salida freno
'
'
'Rutina Principal

CMCON = 7                        'RA0 - RA3 son E/S Digitales           
TRISA = 0                          'Puerto A como salida
TRISB = $80                       'Puerto B como Salida  excepto bit 7
i = 0
'Habilitar interrupcion del TMRO
 '
INTCON = %00100000              'Habilitar Interrupcion de TMRO                    
OPTION_REG = %00000111        'Inicializa el Prescaler                  
TMR0 = 217                            'Cargar el registro TMRO  
on interrupt GOTO PROCESO      'salta a rutina de proceso
INTCON = %10100000              'Habilitar interrupciones          
CONT1 = 0                             'CONT1 = 0
Cont2 = 0                               'Cont2 = 0
'
'Revisar el puertoB.7 si llego pulso y esta alto
Loop:
    BUTTON , PULSO , 1 , 255 , 20 , i , 0 , loop 'Se chequea por un pulso de entr
    CONT1 = cont1 + 1             'Incrementa cont1 de 1 a 125
    Cont2 = Cont2 + 1              'Incrementa Cont de 1 hasta 5
    if Cont1 = 125  then freno1   'Chequea cuenta por 125
    if Cont2 = 5 then freno2       'Chequea por cuenta de 5
    goto Loop                          'Continua esperando un evento externo
    disable                              ' Se deshabilitan las otra interrupciones
'    
Freno1:                                 'Rutina de freno1 cuenta de 5
    Cont1 = 0                           'Limpia el contador 1
    high LedRojo                        ' 
    Rele1                                  'Prende Led Rojo indica freno act.
    if Pulso = 0  Then Freno1        'Retardo 5 Mseg
    Goto loop                             'Regresa a Loop 
'
Freno2:                                    'Rutina de Freno 2
    Cont2 = 0                             'Limpia el contador 2
    high LedRojo                   '
    Rele1                                   'Prende Led Rojo indica freno act.
    if Pulso = 0 then Freno2           'Retardo 5 Mseg
    Goto loop
'        
'Rutina de servicio de la interrupcion
                        
'        
PROCESO:                            'EL PROCESO A REALIZAR
'
    TMR0 = 217                      '
    Digit = Cont Dig 1              '
    Lookup Digit,[$3F,$06$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
    Patron = Patron ^ $FF           'Invertir bits de la variable Patron
    PORTB = Patron                    'Mostrar 10 digitos
    Digit2 = 0                             'Desactivar el digito 2
    Digit1 = 1                             'Activar el dijito 1
    Pause 5                               'Retardo 5 mseg
'
    Digit = Cont dig 0              '
    Lookup Digit,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
    Patron = Patron ^ $FF           'Invertir bits de la variable Patron
    Digit2 = 0                             'Desactivar el Digito 1
    PORTB = Patron                     'Mostrar el digito
    Digit2 = 1                             'Activar Digito 2
    Pausa 1                               'Esperar un mseg
'
    Intcon.2 = 0                         'Re-Habilitar la interrupcion del TMRO
    Resume                                'Regresar al programa principal
    Enable                                 'Habilitar Interrupciones
'
    End
```


----------



## ricbevi (Sep 30, 2012)

Hola...deberías hacerle caso al compilador en cuanto a las faltas de sintaxis que cometes...por otro lado no dices que PIC usas, ni pusiste los fusibles de programación ni definiste la velocidad del oscilador del mismo. 
Así corregido te compilara sin error pero dudo que si no haces lo que te dije anteriormente funcione como corresponde.


```
cont Var Byte 'Cont es una variable cuenta eventos
Cont1 Var Byte 'Cont1 es una variable cuenta hasta 125
Cont2 Var Byte 'Cont2 es una variable cuenta hasta 5
Digit Var Byte 'Digit es una variable tipo Byte
Patron Var Byte 'Patron es una variable tipo Byte
Digit1 Var Byte 'Digit1 Variable tipo Byte
Digit2 Var Byte 'Digit2 Variable tipo Byte
PULSO Var PORTB.7 'Pulso de entrada cuenta de productos
i var byte 'Variable tipo Byte
LedRojo Var PORTA.2 'Led Rojo Freno
Rele1 var PORTA.4 'Rele1 es Puerto de Salida freno
'
'
'Rutina Principal

CMCON = 7 'RA0 - RA3 son E/S Digitales
TRISA = 0 'Puerto A como salida
TRISB = $80 'Puerto B como Salida excepto bit 7
i = 0
'Habilitar interrupcion del TMRO
'
INTCON = %00100000 'Habilitar Interrupcion de TMRO
OPTION_REG = %00000111 'Inicializa el Prescaler
TMR0 = 217 'Cargar el registro TMRO
on interrupt GOTO PROCESO 'salta a rutina de proceso
INTCON = %10100000 'Habilitar interrupciones
CONT1 = 0 'CONT1 = 0
Cont2 = 0 'Cont2 = 0
'
'Revisar el puertoB.7 si llego pulso y esta alto
Loop:
BUTTON  PULSO , 1 , 255 , 20 , i , 0 , loop 'Se chequea por un pulso de entr
CONT1 = cont1 + 1 'Incrementa cont1 de 1 a 125
Cont2 = Cont2 + 1 'Incrementa Cont de 1 hasta 5
if Cont1 = 125 then freno1 'Chequea cuenta por 125
if Cont2 = 5 then freno2 'Chequea por cuenta de 5
goto Loop 'Continua esperando un evento externo
disable ' Se deshabilitan las otra interrupciones
'
Freno1: 'Rutina de freno1 cuenta de 5
Cont1 = 0 'Limpia el contador 1
high LedRojo '
Rele1 = 1'Prende Led Rojo indica freno act.
if Pulso = 0 Then Freno1 'Retardo 5 Mseg
Goto loop 'Regresa a Loop
'
Freno2: 'Rutina de Freno 2
Cont2 = 0 'Limpia el contador 2
high LedRojo '
Rele1 = 1 'Prende Led Rojo indica freno act.
if Pulso = 0 then Freno2 'Retardo 5 Mseg
Goto loop
'
'Rutina de servicio de la interrupcion

'
PROCESO: 'EL PROCESO A REALIZAR
'
TMR0 = 217 '
Digit = Cont Dig 1 '
Lookup Digit,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Patron = Patron ^ $FF 'Invertir bits de la variable Patron
PORTB = Patron 'Mostrar 10 digitos
Digit2 = 0 'Desactivar el digito 2
Digit1 = 1 'Activar el dijito 1
Pause 5 'Retardo 5 mseg
'
Digit = Cont dig 0 '
Lookup Digit,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Patron = Patron ^ $FF 'Invertir bits de la variable Patron
Digit2 = 0 'Desactivar el Digito 1
PORTB = Patron 'Mostrar el digito
Digit2 = 1 'Activar Digito 2
Pause 1 'Esperar un mseg
'
Intcon.2 = 0 'Re-Habilitar la interrupcion del TMRO
Resume 'Regresar al programa principal
Enable 'Habilitar Interrupciones
'
End
```

Saludos.

Ric.


----------



## D@rkbytes (Oct 1, 2012)

Jenry M dijo:


> Apreciados colegas estoy tratando de contar eventos y he utilizado el comando BUTTON de PICBasic 2.60  para detectar un evento en el pin RB7, de la siguiente forma:
> 
> LOOP:
> BUTTON , PULSO , 1 , 255 , 20 , i , 0 , LOOP
> ...


Saludos.
Al parecer estas usando un PIC16F628A
En PICBasic Pro 2.60 *LOOP* no puede ser usado como etiqueta, ya que es una instrucción.
En esta parte: Lookup Digit,[$3F,$06$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Te hace falta separar $06$5B con una coma.  --> *$06,$5B
*En Freno1: y Freno2: No determinas que hacer con Rele1

Como te menciona el amigo ricbevi, ya corrigio algunas partes de tu programa.
Pero cambia la etiqueta *LOOP:* como por ejemplo *MainLoop:*

Si compilas sin establecer los fuses, tendrás esta configuración por default...
Oscilador a cristal, Watch Dog Timer activado, Brown-Out Reset activado, Master Clear activado.
Y si no estableces la velocidad del reloj, PBP por default determinará 4MHz.

Esta sería una configuración de fuses para el PIC16F628A/48A en PBP 2.60

```
@ DEVICE PIC16F628A    ; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,WDT_OFF,MCLR_ON,PWRT_ON,BOD_OFF,LVP_OFF
```
Y para establecer la frecuencia del reloj usas...
*DEFINE OSC 10 *               ; Definir que se trabajará con 10MHz.
Para usar un cristal de croma de T.V. NTSC = (3.579545MHz)
*DEFINE OSC 3*

Suerte.


----------



## torres.electronico (Oct 5, 2012)

Un apregunta, el tema anterior me desperto la curiosidad para saber como podria modificarlo para poder reconocer un patron de señal dado...Por ejemplo miren esta señal:

Mi camioneta tiene un sistema de codigos por pulsos para dar a conocer al usuario donde hay un problema determinado; El tema esta en que se me paso por la cabeza hacer bucles FOR-NEXT con retardos pequeños e implementar la interrupcion por hardware para reconocer los estados altos... el tema o mejor dicho consulta seria...como podria hacer para reconocer el tiempo de los estados altos cuando este dentro de la interrupcion?
Agradezco cualquier orientacion ... Saludos


----------



## reyvilla (Oct 6, 2012)

Hola amigo torres devuelta yo por acá, viendo tu consulta, se me ocurre ahora que pudieras medir cuanto dura el estado en alto con dos interrupciones continuas las dos como mencionas por hardware y con ayuda del TMR0, al momento de haber un cambio de bajo a alto se activa la interrupción por flanco de subida e inmediatamente activa la el TMR0 como contador y nuevamente la interrupción de hardware pero esta vez por flanco de bajada y al momento de cambiar de alto a bajo paras el TMR0 y verificas su valor y allí ya tendrías el tiempo que duro en alto el pulso, bueno es lo que se me ocurre ahora pero por allí esta la idea, cualquier cosa me avisas...saludoss


----------



## torres.electronico (Oct 7, 2012)

reyvilla dijo:


> Hola amigo torres devuelta yo por acá, viendo tu consulta, se me ocurre ahora que pudieras medir cuanto dura el estado en alto con dos interrupciones continuas las dos como mencionas por hardware y con ayuda del TMR0, al momento de haber un cambio de bajo a alto se activa la interrupción por flanco de subida e inmediatamente activa la el TMR0 como contador y nuevamente la interrupción de hardware pero esta vez por flanco de bajada y al momento de cambiar de alto a bajo paras el TMR0 y verificas su valor y allí ya tendrías el tiempo que duro en alto el pulso, bueno es lo que se me ocurre ahora pero por allí esta la idea, cualquier cosa me avisas...saludoss


Me ayudas con los bytes de configuracion para hacer esto? Como seteo la interrupcion por hardware para que detecte flanco de subida y flanco de bajada en PBP... Si no te mal interpreto el mensaje, cuando sale de la instruccion dentro del programa que es de la interrupcion por hardware, tendria que desactivar el tmr0 ¿verdad? Estoy pensando que alterminar la interrupcion, este volveria a la linea de donde salto y no me dejaria guardar un valor en una varible (este valor seria el tiempo)... Me parece que no te entendi  
Mirá, quizas sea lo mismo, pero realizado de otra manera... Mi idea era que cuando detecte la interrupcion por hardware, salte a la rutina / sub programa de la interrupcion y que ahi dentro tenga un bucle con pequeños retardos y una funcion para incrementar una variable... Al volver a estado bajo el puerto de la interrupcion, vuelve al punto desde donde partio y sigue con el resto... luego, cuando nuevamente salte la interrupcion, como la primer variable ya no es cero, guardaria este dato en una segunda variable y asi mismo, cuando salte por 3era vez... Luego, tengo que pensar en como armar la tabla para comparar y sacar mensajes por el display... Muy lejos estoy de la idea inicial ¿no?


----------



## reyvilla (Oct 7, 2012)

No vas tan mal, pero algo importante que debes tomar siempre en cuenta son los retardos por ciclos de maquina que consume el pic para cada instrucción, el asunto es necesitas mucha precisión para medir el estado del pulso en alto, y para eso si utilizas un bucle necesitarías restar el ciclo de maquina que no es mas que el tiempo que requirió el pic, mientras atiente la interrupción ya consumes tiempo y si aparte debes de saltar una sub-rutina le sumas mas tiempo y aun ni piensas en medir el pulso en alto y si lo hicieras de esa manera el programa seria mas tedioso ya que tendrías que sacar cuentas de cuanto tiempo has consumido antes de empezar a medir el pulso para luego restarlo, estamos hablando de micro-segundos pero que sumados valen bastante. Ahora lo que yo te comento es algo mas sencillo, tan sencillo que casi todo el código no es mas que configuraciones entre interrupciones y TMR0, de momento te dejo un ejemplo que subi hace ya un tiempo, no mide nada, y la única ejecucion que tiene aparte de las configuraciones del pic es un toggle, y ya con eso puedes detectar de forma instantánea cada una de los pines configurados como interrupción por hardware y con eso cambiar el estado de un led. Te dejo la simulación y el código ya mañana me pongo a practicar con uno mas completo para lo que tu requieres y así aprendo a medir flancos de subida.

Aquí el código comentado:


```
'''''''''''''''''''''''''''''''''''''''''''''''''''''''CONFIGURACION DE FUSES
@ DEVICE PIC12F675   
@ DEVICE INTRC_OSC_NOCLKOUT
@ DEVICE WDT_OFF       
@ DEVICE PWRT_OFF
@ DEVICE MCLR_OFF
@ DEVICE BOD_OFF
@ DEVICE PROTECT_OFF
@ DEVICE CPD_OFF 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''DEFINICIÓN DE OSCILADOR Y CALIBRACIÓN DE OSCILADOR 
DEFINE OSCCAL_1K 1
DEFINE OSC 4  

INTCON = %10001000 'INTERRUPCIONES ACTIVADAS
OPTION_REG = %00000000
WPU = %00110110 'TODOS LOS PINES CON PULL-UP MENOS GPIO.0 y GPIO.3
IOC = %00111110 'TODOS LOS PINES COMO INTERRUPCION MENOS GPIO.0 
ANSEL = %00000000 'ADC DESABILITADO 
CMCON = %00000111 'COMPARADOR DESABILITADO 
         
SYMBOL LED = GPIO.0 

TRISIO =%00111110 'TODOS COMO ENTRADA MENOS GPIO.0    
GPIO  = %00000000 
    

ON INTERRUPT GOTO SWCHIT 
INTCON = %10001000 

INICIO:

GOTO INICIO

Disable
SWCHIT:
TOGGLE LED 
PAUSE 400
INTCON = %10001000 'EN ESTE PUNTO SI FUERA UN SOLO PIN DE HARIA UN TOGGLE PERO
Resume                     'SOLO DEL BIT DE INTERRUPCION POR CAMBIO DE ESTADO
Enable                      'DE PASARIA DE INTERRUNCION POR FLANCO DE BAJADA A 
                               'INTERRUNCION POR FLANCO DE SUBIDA
```

Los archivos estan aqui

Ver el archivo adjunto 71533



Si te fijas no existe un código después del inicio solo tiene un goto inicio, luego viene la parte de interrupción la cual solo se activa si cambia uno de los pines...Luego me pongo con mas...saludosss


----------



## torres.electronico (Oct 7, 2012)

Excelente Reymi... Yá me estoy poniendo con este tema por que ya veo que por fuerza mayor, no puedo hacer nada (ando con un pie en el laboratorio y otro en la camioneta por que me parece que hoy voy a ser papa por 1era vez)Ahora me pongo un toque con este tema y te subo lo que salga 
Ya volvistes de gringolandia?


----------



## inspector gadget (Oct 7, 2012)

Saludos cordiales a todos los miembros del foro.
Solicito de manera respetuosa su colaboración frente al siguiente proyecto:
Estoy tratando de hacer que 8 leds conectados al puerto B me enciendan SOLAMENTE si se cumplen las siguientes condiciones en 4 bits de entrada en el puerto A identificados como p1, p2, p3 y p4:
 P1=1               enciende led 1
P2, P3, P4 =1 enciende led  2
P2, P3 =1        enciende led 3
P2, P4 =1        enciende led 4
P2=1                enciende led 5
P3, P4=1         enciende led6
P3 =1              eenciende led7
P4=1                enciende led 8

como habrán visto, se trata de realizar un lector binario, pero no he conseguido un ejemplo que me pueda orientar sobre esto, y dado que tengo poca experiencia, pero quiero aprender, solicito su valiosa colaboración, pienso que habremos muchos novatos que pasamos por la dificultad de no poder decodificar este sistema, y si bien lo he logrado hacer con un integrado CD4028, es hora de trabajar con microcontroladores.
Para mejor comprensión, estos datos de la tabla anterior, son los que aparecen en una de esas tarjetitas receptoras de un sistema de control remoto, entonces al pulsar un botón en el transmisor remoto, supongamos el 2, aparecen las salidas P2,P3 y P4 en nivel alto en el receptor y duran en ese estado mientras tenga pulsado el botón y con esos datos intento que mantenga encendido un led por PERMANENTEMENTE, así yo suelte el botón, , pero cuando lo vuelva a oprimir, el led se apague, no se si usando la declaración TOOGLE sea conveniente realizar este propósito, y como esos datos duran solo el tiempo que mantenga presionado el pulsador, esto me permitiría que el pic lea esos datos, los decodifique y encienda el respectivo led, lo mismo debe suceder con cada uno de los 8 leds, así yo puedo tener encendido uno o varios al mismo tiempo y solo se apagaran al aparecer en el puerto A, los mismos datos que lo hicieron encender, osea al presionar nuevamente el pulsador correspondiente.
Agrego un avance d lo que me propongo hacer, pero la verdad, se que no estoy encarando el programa de la manera adecuada ya que como les comento, no encontré ningún ejemplo de como decodificar en binario con 4 bits d entrada, ademas una simulación, pero no se como configurar la entrada del pic, pero no creo que sea lo mas conveniente con pulsadores como yo lo hice, solamente quería simular las entradas con un pulso momentáneo en alto, pero la dificultad esta en cuando aparecen en alto 2 o mas entradas simultáneamente.
Nuevamente mis agradecimientos a quienes me puedan colaborar en este aprendizaje que nunca termina.


```
@ DEVICE PIC16F628A,WDT_OFF,PWRT_OFF,MCLR_OFF,BOD_OFF,CPD_OFF,PROTECT_OFF

CMCON = 7
TrisA = 255 'todos como entrada
TrisB = 0 'todos como salida

;configuracion de pines 
led1 var portb.0  
led2 var portb.1 
led3 var portb.2 
led4 var portb.3 
led5 var portb.4 
led6 var portb.5 
led7 var portb.6 
led8 var portb.7 

p1 var porta.0 
p2 var porta.1 
p3 var porta.2 
p4 var porta.3 

 PortB=0
inicio:
 if (P1=1) then led1=1
 if (P2=1) and (p3=1) and (p4=1) then led2=1
 if (P2=1) and (p3=1)  then led3=1
 if (P2=1) and (p4=1)  then led4=1
 if (P2=1) then led5=1
 if (P3=1) and (p4=1)  then led6=1
 if (P3=1) then led7=1
 if (P4=1) then led8=1
 
Goto inicio
```


----------



## reyvilla (Oct 7, 2012)

Hola amigo inspector gadget te recomiendo este enlace donde explico a detalle lo que comentas de como hacer la configuración de las entradas y salidas, por otro lado te dejo un trazo del manual del PBP, para que tengas otra explicación, el manual de pbp, esta en español y esta en la red, buscas en google manual de pbp en español y creo que si es es el primero el segundo enlace. 



> *Cuando arranca un microPIC , todos los pins son colocados en entrada .Para usar un pin como salida , el
> pin o port debe ser colocado como salida o se debe usar un comando que automaticamente coloque al pin
> como salida.
> Para colocar un pin o port como salida (ó entrada) debe dar valores al registro TRIS . Colocando el bit de
> ...



Enlace:_ https://www.forosdeelectronica.com/posts/676386/ _
Por otro lado para leer un puerto completo no es muy dificil, lo que tienes que saber es que el puerto siempre se maneja como una variable en cierta forma de 8 bits, osea del bit 0 al bit 7, entonces en ves de (If (P1=1) then led1=1) preguntarias (IF PORTB = %00000001 THEN LED1 =1), y asi te evitas las declaraciones de todo el puerto b...Revisa de nuevo y cualquier cosa avisas 

PD: Amigo lubeck si ya volví de texas y de mexico, vuelvo a viajar el 14 a mexico, avísame como vas con tu código yo me pongo en un rato a ver si subo un ejemplo completo.


----------



## vimato (Oct 7, 2012)

he trabajado anteriormente con otros modelos de pic (16f870) y no he tenido problemas pero ahora quiero trabajar con el 16f877a, realice un programa sencillo, lo simulo en proteus y procedo a quemarlo con el ic-prog, me dice que la programación esta ok, pero cuando lo monto en el protoboard no corre, para verificar monto ese mismo programa en el 16f870 y lo monto en el  protoboard y corre a la perfección, quisiera que me dieran ideas de donde puede estar el problema; ayúdenme por favor.
Aquí adjunto el programa esta en pic basic pro


```
DEFINE OSC 4
cont VAR BYTE

inicio:
trisb = 0
trisc = 1
cont = 0
pul VAR portc.0
inicio2:

parada:
IF pul = 1 THEN
cont = 0
portb = 0
GOTO parada
ENDIF

portb = cont
cont = cont + 1
PAUSE 250
IF cont = 16 THEN
GOTO inicio
ELSE
GOTO inicio2
ENDIF

END
```


----------



## inspector gadget (Oct 8, 2012)

gracias por responder reyvilla, voy a estudir tu informacion. gracias


----------



## torres.electronico (Oct 8, 2012)

reyvilla dijo:


> ...avísame como vas con tu código yo me pongo en un rato a ver si subo un ejemplo completo.



*Mirá como estoy con mi codigo:*



*Vos que ya sos papá me entendes jajaja... no sabes como ando* ​


----------



## blackpic (Oct 8, 2012)

@torres-electronico, Felicidades por el pequeño


----------



## GoX F4yCk3r DB (Oct 8, 2012)

Hola que tal, ando con un problema que me esta dando dolores de cabeza.
Es acerca de la Multiplexacion de displays de 7-seg. Catodo común.
Entiendo lo basico de la multiplexacion que es encender un display a la ves, solo que se hace tan rapido que el ojo humano no percibe el parpadeo de los mismos.
Bien pues quiero realizar un contador de 0-9999.
Tengo un programa en donde uso un LOOP pero no lleva multiplexacion es decir, las unidades las muestro por el portb y las decenas por el portd D.
Esto no presenta nigun problema ya que no lleva multiplexacion.
Mi problema viene cuando intento multiplexar, tengo la idea basica pero no logro hacer ya que tengo muchas dudas al momento de realizarlo.
Necesito una mano de vdd, es la primera ves que hago multiplexacion y no se como empezar.

```
TRISB=0
PORTB=0
TRISD=0
PORTD=0
VEC1 VAR BYTE
VEC2 VAR BYTE
I VAR BYTE
UNIDADES VAR BYTE
DECENAS VAR BYTE

INICIO:
WHILE 1=1
FOR i=0 TO 99
VEC1=I//10
VEC2=(I/10)//10
LOOKUP VEC1,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],UNIDADES
LOOKUP VEC2,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],DECENAS
PORTB=UNIDADES
PORTD=DECENAS
PAUSE 50
vec1=vec1+1
NEXT I
WEND
END
```
Ese es un contador de 0-99 como pueden apreciar no uso la multiplexacion.
Intente trasladar ese codigo con la idea que tengo de ir prendiendo los displays uno por uno, pero por ejemplo una ves que termino de contar las unidades como mostrar el numero de las decenas y que este se quede fijo hasta que las unidades hallan contado hasta 9 de nuevo???


----------



## reyvilla (Oct 8, 2012)

Que alegría mi gran amigo felicitaciones y muchas bendiciones a torres Junior


----------



## Dario (Oct 8, 2012)

felicitaciones torres, mis saludos a toda tu flia


----------



## BeToR (Oct 10, 2012)

Buenas tardes. Disculpen la ignorancia pero cuando el fabricante menciona en la hoja de datos 1,000,000 ciclos de borrado/escritura en el caso de la memoria 24LC256, a que se refiere exactamente? es por cada direccion o por borrar completamente la memoria? 

Por ejemplo si tengo unicamente 12 datos en la memoria, dejando la direccion 0 en blanco y empezando en la 1 hasta la 12. Si borro cada una de las direcciones que tengo ocupadas para reescribirle otro valor eso cuenta como 12 borrados/escritura dentro del millon de ciclos que dice poder hacer? o solo cuenta como 1 ciclo de borrado/escritura? o cada que agrego un dato extra para guardar en otra direccion limpia cuenta tambien ?

De antemano gracias por la ayuda. Saludos


----------



## GoX F4yCk3r DB (Oct 12, 2012)

Hola que tal, ya pude realizar mi contador ascendente, ya entendi lo de la Multiplexacion.
Adunto mi codigo

```
cmcon=7; ACTIVA TODO EL PUERTO A EN DIGITAL
TRISB=0; TODO EL PUERTO EN SALIDA
PORTB=0; TODO EL PUERTO EN 0
VEC1 VAR BYTE
VEC2 VAR BYTE
VEC3 VAR BYTE
VEC4 VAR BYTE
I VAR BYTE
UNIDADES VAR BYTE
DECENAS VAR BYTE 
CENTENAS VAR BYTE
MILLARES VAR BYTE
TRISA=0
X VAR BYTE

INICIO:
WHILE 1=1
FOR i=0 TO 9999
VEC1=I//10
VEC2=(I/10)//10
VEC3=(i/100)//10
VEC4=(I/1000)//10
LOOKUP VEC1,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],UNIDADES
LOOKUP VEC2,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],DECENAS
LOOKUP VEC3,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],CENTENAS
LOOKUP VEC4,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],MILLARES


VEC1=VEC1+1

FOR X=0 TO 50
PORTA=%00001000:PORTB=UNIDADES
PAUSE 5
PORTA=%00000100:PORTB=DECENAS
PAUSE 5
PORTA=%00000010:PORTB=CENTENAS
PAUSE 5
PORTA=%00000001:PORTB=MILLARES
PAUSE 5
NEXT x



NEXT i 
WEND
END
```


Alguien me podria hechar la mano con el uso de las banderas.
Lo que tengo que hacer es lo siguiente, cuando conecto el uC al la corriente despliega el numero 7 y cuando pulso un boton muestra el numero 4, si lo vuelvo a pulsar muestra el numero 7 de nuevo y si lo vuelvo a pulsar muestra el numero 4 de nuevo.
Es como un set y un reset. Se que tengo que usar banderas pero aun no logro entender bien como usarlas. Adjunto lo que llevo de codigo. De inicio en proteus me muestra el 7 y cuando pulso el boton me muestra el 4 pero al pulsar de nuevo el boton ya no hace nada =(, alguien que me heche una manita, de antemano gracias.

```
trisb=0         
numero VAR BYTE      ;crea la variable número con valor 255 
bot VAR portc.0  ;nombre para el puerto C.4 
flag VAR BIT    ;creamos la variable flag de un bit 
flag1 var bit


display: 
      IF bot=0 THEN nueve r      
 pAUSE 80          ; pause para estabilizar el rebote de la tecla 
      if bot=1 then seis
 pause 80
Flag=0     ;cargar la variable con cero 
flag1=0
    GOTO display                  ;ir a display 


nueve: 
   IF  flag= 1 THEN GOTO display ;pregunta si la variable es uno 
      flag = 1     ;cargar la variable con uno 
      flag1=0
  portb=$66
   GOTO display                   ;ir a display 
   
seis:
if flag1=0 then goto display
flag=0
flag1=1
portb=$07
goto display



END
```

salu2


----------



## Nano24 (Oct 15, 2012)

Que tal amigos del foro, por acá les traigo un vídeo donde se ve un PIC generando tonos musicales, alguien sabe como sacar las notas exactas para sacar la música?

Se que usando el Sound o el Freqout, pero la verdad esta bastante difícil, sino vean el vídeo.

http://www.youtube.com/watch?feature=player_embedded&v=L8GnCE3suKI


----------



## cesarim (Oct 17, 2012)

Buenos dias amigos aca dejo un pequeño aporte se que no es un proyecto grande pero estoy empezando a practicar programas en basic para hacer funcionar motores y este es un circuito con motor inversor de giro espero les agrade la idea final es ponerlo en mi casa para mover las cortinas jejeje y empiezo probando con motor dc
este es el codigo por favor si podria mejorarse espero puedan aportar y ayudarme a mejorar este proyecto 
el pulsador necesita un retardo de 500 ms por tema de ruido 

```
cmcon=7
DEFINE OSC 4			
TRISB = $F0
TRISA = $FF
        
OPEN    VAR PORTA.0
CLOSE   VAR PORTA.1

GIR1    VAR PORTB.0 
GIR2    VAR PORTB.1
SEN1    VAR PORTB.7
SEN2    VAR PORTB.6

low GIR1
low portb.1
low portb.2
LOW SEN1;=0

      Main:
        IF OPEN THEN GOSUB ABRIR
        IF CLOSE THEN GOSUB CERRAR     
 
   ABRIR: 
     pause 500
      IF OPEN THEN 
       HIGH gir1
        LOW GIR2
      ENDIF
       
      CERRAR: 
       PAUSE 500
        if close then
         low gir1
          high gir2
        endif
  GOTO MAIN

END
```

aca adjunto el diseño en proteus y el archivo hex el codigo del programa lo dejo aca mismo


----------



## ricbevi (Oct 17, 2012)

cesarim dijo:


> Buenos dias amigos aca dejo un pequeño aporte se que no es un proyecto grande pero estoy empezando a practicar programas en basic para hacer funcionar motores y este es un circuito con motor inversor de giro espero les agrade la idea final es ponerlo en mi casa para mover las cortinas jejeje y empiezo probando con motor dc
> este es el codigo por favor si podria mejorarse espero puedan aportar y ayudarme a mejorar este proyecto
> el pulsador necesita un retardo de 500 ms por tema de ruido
> 
> ...



Hola...tal vez algo como el adjunto es una de las tantas formas que se puede hacer .
Saludos.

```
@ DEVICE pic16f628A, INTRC_OSC_NOCLKOUT 'Reloj interno solo.-
@ DEVICE pic16f628A, WDT_OFF ' Watchdog Timer desconectado.-
@ DEVICE pic16f628A, PWRT_ON ' Power-On Timer conectado.-
@ DEVICE pic16f628A, BOD_ON ' Brown-Out Detect conectado.-
@ DEVICE pic16f628A, MCLR_ON ' Master Clear Externo conectado;desconectado.-
@ DEVICE pic16f628A, LVP_OFF ' Low-Voltage Programming desconectado.-
@ DEVICE pic16f628A, CPD_OFF ' Data Memory Code Protect desconectado.-
;@ DEVICE HS_OSC ; Oscilador a cristal

cmcon=7
DEFINE OSC 4            
TRISB = $F0
TRISA = $FF

i var byte        
OPEN    VAR PORTA.0
CLOSE   VAR PORTA.1

GIR1    VAR PORTB.0 
GIR2    VAR PORTB.1
SEN1    VAR PORTB.7
SEN2    VAR PORTB.6

low GIR1
low portb.1
low portb.2
LOW SEN1;=0
' Programa Principal
Main:
        IF OPEN THEN ' Si presiono OPEN
            for i = 1 to 10
             pause 50  ' espero 50 ms
            if open = 0 then goto main ' si se suelta antes de 10 X Pause50ms voy al inicio
            next i
         GOSUB ABRIR ' Voy a abrir
        endif
        IF CLOSE THEN 
            for i = 1 to 10
             pause 50
            if close = 0 then goto main
            next i 
        GOSUB CERRAR
        endif
          pause 50 ' espero 50ms si no se cumple ninguna de las dos condiciones 
        GOTO MAIN  ' retorno a la rutina principal 
' Abre Cortina 
ABRIR: 
     HIGH gir1 ' Encender Gir1
     LOW GIR2  ' Aseguramen que Gir2 este apagado
     repeat  ' Repetir 
       pause 50  ' Esperar 50ms
     until  open = 0 ' hasta que "OPEN" sea soltado
     low gir1 ' Apagar Gir1
     return  'Volver a la llamada
' Cierra Cortina     
CERRAR: 
        low gir1
        high gir2
        repeat
           pause 50
        until close = 0 
        low gir2  
        return 

END
```
Ric.


----------



## cesarim (Oct 18, 2012)

Amigo que version usas del basic  yo uso el microcode pic basic pro y me sale error cuando compilo tu programa justo en el UNTIL y el REPEAT podrias ponerlo como adjunto por favor para poder descargar tu version que usas el tema es que yo de mi pc no puedo descargar programas si no es con permiso del servidor que me da internet muchas gracias



mi version es un demo creo por que aveces cuando hago mucho codigo me sale en ingles que devo comprar la version  original por ser este un demo


----------



## ricbevi (Oct 18, 2012)

cesarim dijo:


> Amigo que version usas del basic  yo uso el microcode pic basic pro y me sale error cuando compilo tu programa justo en el UNTIL y el REPEAT podrias ponerlo como adjunto por favor para poder descargar tu version que usas el tema es que yo de mi pc no puedo descargar programas si no es con permiso del servidor que me da internet muchas gracias
> 
> 
> 
> mi version es un demo creo por que aveces cuando hago mucho codigo me sale en ingles que devo comprar la version  original por ser este un demo



La versión que uso es la 4 del MicroCode Studio y el compilador es el PicBasicPro 2.6...no se a que te refieres con adjuntar si ya lo que adjuntado en el archivo Motor prueba2.zip...te puedo pegar el hex compilado por aquí

```
:100000002828A301A200FF30A207031CA307031C9A
:1000100023280330A100DF300F200328A101E83E90
:10002000A000A109FC30031C1828A00703181528FC
:10003000A0076400A10F152820181E28A01C222844
:1000400000002228080083130313831264000800B1
:1000500007309F008316F0308600FF308500831242
:1000600006108316061083128610831686108312DC
:1000700006118316061183128613831686138312C4
:100080006400051C53280130B80064000B303802AE
:1000900003185228323001206400051850284028E7
:1000A000B80F452869206400851C66280130B80017
:1000B00064000B30380203186528323001206400D8
:1000C000851863284028B80F58287B20323001203B
:1000D0004028061483160610831286108316861095
:1000E000831232300120640005187128061083162F
:1000F0000610831208000610831606108312861459
:1001000083168610831232300120640085188328FC
:0E0110008610831686108312080063008D2867
:02400E00703F01
:00000001FF
```

Lo mio solo fue una ejemplo de la forma que se puede hacer...toma la idea y lo resuelve  con las instrucciones que soporte la versión del compilador que tengas de eso se trata al aprender.

Ric.


----------



## cesarim (Oct 18, 2012)

no amigo si lo he probado tu circuito y funciona bien pero si yo quiero modificar tu programa para hacer otras pruebas me bota error en las variable UNTIL y REPEAT y me sale que tengo que comprar la version original del pic basic pro. eso siempre me sale ya que el que logre descargar es un demo
yo casi no puedo descargar programas de aca mi maquina ya que el internet lo tengo bloqueados algunos programas por eso te pedia si tienes el instalador del microcode que usas para yo poder instalarlo claro si se podria por favor



no amigo si lo he probado tu circuito y funciona bien pero si yo quiero modificar tu programa para hacer otras pruebas me bota error en las variable UNTIL y REPEAT y me sale que tengo que comprar la version original del pic basic pro. eso siempre me sale ya que el que logre descargar es un demo
yo casi no puedo descargar programas de aca mi maquina ya que el internet lo tengo bloqueados algunos programas por eso te pedia si tienes el instalador del microcode que usas para yo poder instalarlo claro si se podria por favor



Amigos podrian decirme en que estoy fallando en este codigo por favor les rogaria me den una manito se que para algunos es talvez ya demasiado facil ,pero yo aun batallo con  los codigos. quiero activar foco0 con boton0 y desactivarlo con boton1 les agradesco su apoyo aca les dejo el codigo

```
@ DEVICE PIC16F628
@ DEVICE MCLR_On
@ DEVICE INTRC_OSC 
@ DEVICE WDT_OFF 
@ DEVICE LVP_OFF 
@ DEVICE BOD_OFF 
@ DEVICE PWRT_OFF
@ DEVICE CPD_ON 
@ DEVICE PROTECT_ON 
DEFINE OSC 4 

CMCON=7

TRISA = $FF
TRISB = $FC
PORTB = $0

Boton0      VAR PORTA.0
Boton1      var PORTA.1
Foco0       VAR PORTB.0
Foco1       VAR PORTB.1

low foco0
low foco1
boton0=0
boton1=0

 Main:
    if boton0 then Time0
 goto main   
  
  Time0:
   if boton0 then
      pauseus 1
     high foco0
     if foco0 then gosub Salto   ;no se si es necesario esta llamada pero si elimino esta linea
                                         ; igual no me funciona   
    endif 
   while BOTON0 :wend
   
   Salto:
   if boton1 then
    pauseus 1
     low foco0
   ;endif
   endif
    while boton1 : wend  
 while BOTON0 :wend 
  goto main 

end
```


----------



## kiyero (Oct 18, 2012)

Hola amigos, he estado algo ocupado y había dejado de lado el estudio de programación de pics en picbasic pro, tengo una duda y es la siguiente:

Debido a la temporada navideña que se avecina, me he propuesto hacer un secuenciador de luces con múltiples efectos, pero la traba o dificultad del asunto es que en lo poco que he estudiado no sé como hacer una rutina para que con un solo botón vaya cambiando los efectos, es decir, presiono el interruptor en RA0 y se genera el primer efecto, vuelvo a presionar RA0 y pasa al segundo efecto y así sucesivamente, ya tengo la rutina de los efectos (he hecho como 12), tan pronto aclare la duda con su ayuda y haya terminado el programa, los subiré para aquellos que quieran hacerlo lo puedan implementar

El pic a utilizar es un 16F877A

Gracias por su ayuda


----------



## Alever89 (Oct 18, 2012)

Una consulta quiero realizar lo sgte:
tengo 2 pulsadores uno A y otro B, si A lo presione 1 vez y después B se debe prender una vez un led
Si presione A 5 veces y después B se enciende el led 5 veces
Y así sucesivamente
A es el numero de veces q*ue* debe prender mi led y B es como mi enable o mi habilitador
me pueden dar la idea no el programa, de como se puede hacer eso mas o menos


----------



## cesarim (Oct 18, 2012)

amigo mira en los primeros ejemplos nuestros amigo dejaron este codigo que te pueda orientar mucho ahi te lo pongo

```
;Proyecto con 2 pulsadores y 3 leds ; cuando es accionado P1(primer pulsador) se 
;enciende un led ubicado en RB2 durante un segundo,lo mismo pasa si se acciona 
;P2 con otro led ubicado en RB3 , pero si son accionados al mismo tiempo un 
;tercer led (RB4)parpadeara 5 veces duante 300mls se uitliza pic 16F877A.

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

;configuracion de pines 

led1 var portb.2               ;ubicacion del primer LED en RB2 del pic 16F877A 
led2 var portb.3               ;""""                        RB3
led3 var portb.4                ;""""""""""""""""""""       RB4
p1 var portb.0                  ;"""""""del primer pulsador RB0 """"""""""""
p2 var portb.1                  ;"""""""segundo pulsador   RB1
x var byte                      ;variable x con capacidad de 255


; lectura de pulsadores
inicio
if p1=0 then encender   ; pregunta si se acciono el pulsador 1 ir a encender
PAUSE 200
if p2=0 then encender1  ;  """ pulsadodor2 ir a encender 1
PAUSE 200
if (p1=0) AND (p2=0) then encender2  ; """"pulsador1 y pulsador2 ir a encender2
PAUSE 200
goto inicio                   ; crea un bucle cerrado


encender:                    ;rutina encender
high led1                 ; enciende led 
pause 1000                   ;espera 1seg
toggle led1                ; apaga led
pause 1000
goto inicio                   ;ir a inicio

encender1:
high led2                 ; enciende led 
pause 1000                   ;espera 1seg
toggle led2                ; apaga led
pause 1000
goto inicio 

encender2:
for x=0 TO 4           ; repite cinco veces 
high led3                ; enciende led 
pause 300                   ;espera 300mls
low led3                ; apaga led utilice comando low que cumple la misma 
                         ;funcion que toggle que cambia la configuracion
                         ;de un bit es decir si esta en ALTO LO PASA A BAJO
                         ;y viceversa
pause 300
NEXT                   ; SIGUIENTE HASTA QUE SE REPITE 5 VECES
goto inicio 
end                            ;fin del programa
```


----------



## D@rkbytes (Oct 18, 2012)

Alever89 dijo:


> Una consulta quiero realizar lo sgte:
> tengo 2 pulsadores uno A y otro B, si A lo presione 1 vez y después B se debe prender una vez un led
> Si presione A 5 veces y después B se enciende el led 5 veces
> Y así sucesivamente
> ...


Como este es un curso de PICBasic Pro, no esta por demás adjuntar un ejemplo de como se puede lograr.
Veras que usando PBP se puede hacer lo que quieres muy fácil.

Suerte.


----------



## cesarim (Oct 18, 2012)

amigos diganme por favor cual es mi error le he puesto que encienda un led para ver si entra a la rutina salto y logra pendrer el led pero no me obedece el boton1 les dejo el codigo para ver si me pueden orientar por favor
	
	



```
CMCON=7

TRISA = $FF
TRISB = $F0
PORTB = $0

Boton0      VAR PORTA.0
Boton1      var PORTA.1
Foco0       VAR PORTB.0
Foco1       VAR PORTB.1
Foco2       VAR PORTB.2
Foco3       VAR PORTB.3

Flag0       var bit

high foco2
low  foco1
low  foco0

 Main:
    if boton0 then Time0
 goto main   
  
  Time0:
   if boton0 then
      pauseus 1
      low foco1
       high foco0
        if foco0 then
       gosub salto
        else
       RETURN
     endif
    endif 
   while BOTON0 :wend
   ;return
   
 Salto:
  if foco0 then
  pause 1000
   high foco3
   if boton1 then
    ;if PORTA.2 then
    pause 1200
    low foco3
     toggle foco2
    endif
   endif
   while BOTON0 :wend
 ;goto main

end
```



como poder saber si es mi programa o es el programador donde estoy compilando mis codigos


----------



## ricbevi (Oct 18, 2012)

cesarim dijo:


> no amigo si lo he probado tu circuito y funciona bien pero si yo quiero modificar tu programa para hacer otras pruebas me bota error en las variable UNTIL y REPEAT y me sale que tengo que comprar la version original del pic basic pro. eso siempre me sale ya que el que logre descargar es un demo
> yo casi no puedo descargar programas de aca mi maquina ya que el internet lo tengo bloqueados algunos programas por eso te pedia si tienes el instalador del microcode que usas para yo poder instalarlo claro si se podria por favor
> 
> 
> ...



A la primera parte de tu pregunta no puedo por que violaría el reglamento del foro y por que no funciona el código es porque con algo así lo resuelves

```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 18/10/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16f628A, INTRC_OSC_NOCLKOUT 'Reloj interno solo.-
@ DEVICE pic16f628A, WDT_OFF ' Watchdog Timer desconectado.-
@ DEVICE pic16f628A, PWRT_ON ' Power-On Timer conectado.-
@ DEVICE pic16f628A, BOD_ON ' Brown-Out Detect conectado.-
@ DEVICE pic16f628A, MCLR_ON ' Master Clear Externo conectado;desconectado.-
@ DEVICE pic16f628A, LVP_OFF ' Low-Voltage Programming desconectado.-
@ DEVICE pic16f628A, CPD_OFF ' Data Memory Code Protect desconectado.-

DEFINE OSC 4 

CMCON=7

TRISA = $FF
TRISB = $FC
PORTB = $0

Boton0      VAR PORTA.0
Boton1      var PORTA.1
Foco0       VAR PORTB.0

low foco0
boton0=0
boton1=0

Main:
    if boton0 then high foco0
    if boton1 then low foco0
goto Main   

end
```

Ric.


----------



## cesarim (Oct 18, 2012)

te agradesco mucho amigo por tu ayuda en serio es algo sencillo que no se me habia ocurrido y hasta le puso las famosas banderas para ver si mejorba pero nada gracias amigo seguire practicando espero puedan seguir despejando mis dudas y poder yo mejorar en mis programas y pues haber si en algun momento logro ayudar a alguien jeje

por el momento ya me estoy metiendo con otro codigo que me empieza a doler la cabeza jejeje pero seguire hasta lograrlo gracias muchas gracias



amigo derrepente estoy tratando de hacer algo que no se puede o corringanme para poder aprender ya llevo buen rato con este nuevo codigo que a diferencia del anterior cuando dejas de pulsar recien activa el led se me ocurrio hacerlo trabajar con tiempo diferente y he aqui el problema

```
@ DEVICE PIC16F628
@ DEVICE MCLR_On
@ DEVICE INTRC_OSC 
@ DEVICE WDT_OFF 
@ DEVICE LVP_OFF 
@ DEVICE BOD_OFF 
@ DEVICE PWRT_OFF
@ DEVICE CPD_ON 
@ DEVICE PROTECT_ON 
DEFINE OSC 4 

CMCON=7

TRISA = $FF
TRISB = $FE
PORTB = $0

Boton0      VAR PORTA.0
Foco0       VAR PORTB.0

I           var byte

low foco0
boton0=0

 Main:                                  ;boton0
    if boton0 then gosub Time1 ;si detecta un 1 logico supuestamente con un retardo de 
    pause 1000                      ;de 1 seg entonces ire a la rutina Time1

    if boton0 then gosub Time0 ;si este mismo boton detecta 1 logico pero con un retardo de
    pause 100                        ;de 100 ms entonces salto a otra rutina diferente en este caso
                                          ;Time0 
 goto main 
  
  Time0:
   if boton0 then
    ;pause 20
   if not boton0 then
   pauseus 1
    toggle foco0
   endif 
   endif
   goto main
   
  Time1:
   if boton0 then
    ;pause 20
   if not boton0 then
   pauseus 1
   for i = 1 to 6 
    high foco0
    pause 50
    low  foco0
    pause 50
   next  
   endif 
   endif
   
 goto main
end
```

La idea es que cuando un mismo pulsador detecte un 1 logico pero con tiempo de activacion diferente en estos casos tiempo de 1 seg y el otro tiempo de 100ms salte a las rutinas que le indico y me realize eltrabajo adecuado pero no logro hacerlo 
el detalle es que solo lo hace en mi mente por que aca no lo logro hacer solo hace una  nada mas de las dos rutinas y eso es modificandolo a cada rato el codigo ojala me puedan ayudar y espero no causar tantas molestias de verdad muchas gracias


----------



## ricbevi (Oct 19, 2012)

@cesarim" Una forma seria esta:

```
'****************************************************************
'*  Name    : BotonTiempo.BAS                                   *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 19/10/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16f628A, INTRC_OSC_NOCLKOUT 'Reloj interno solo.-
@ DEVICE pic16f628A, WDT_OFF ' Watchdog Timer desconectado.-
@ DEVICE pic16f628A, PWRT_ON ' Power-On Timer conectado.-
@ DEVICE pic16f628A, BOD_ON ' Brown-Out Detect conectado.-
@ DEVICE pic16f628A, MCLR_ON ' Master Clear Externo conectado;desconectado.-
@ DEVICE pic16f628A, LVP_OFF ' Low-Voltage Programming desconectado.-
@ DEVICE pic16f628A, CPD_OFF ' Data Memory Code Protect desconectado.-
cmcon=7
DEFINE OSC 4            
TRISB = $FC
TRISA = $FF
PORTB = 0
PORTA = 0
I var byte

Foco0 var PORTB.0
Boton0 var PORTA.0

Main:
    if boton0 then
         repeat
         pause 10
         i = i + 1
         until boton0 = 0
         if i =< 20 then
         goto Time1
         else
         goto Time0
         endif
    endif
    pause 10
    
goto Main
'---------------------
Time0:
      i = 0
      toggle foco0
      pause 10
goto main
'----------------------
Time1:
     
      for i = 1 to 6
      high foco0
      pause 50
      low foco0
      pause 50
      next i
      i = 0
goto main
END
```

Analiza la lógica de lo que tratas de hacer desde el punto de vista de un procesador o computadora y comenta las lineas de lo que escribes de tal forma que te ayuden en la tarea al re-leer lo hecho(ahora y en el futuro ya que no siempre razonamos igual) y tomate tu tiempo para analizarlo desde distintos puntos de vista...siempre ve de menor a mayor escribiendo códigos cortos y probando su funcionamiento y/o comportamiento son algunas de las recomendaciones que te hago.
Saludos.

Ric.


----------



## cesarim (Oct 19, 2012)

ok amigo te agradesco mucho tu ayuda empezado por el manejo simple de pùlsadores y he logrado algunos programas sencillos pero cada vez  este tema se vuelve mas grande y mas grande y es muy bonito e interesante te agradesco mucho por tu ayuda y tu tiempo en verdad muchas gracias por apoyarme


----------



## cesarim (Oct 19, 2012)

Amigo disculpame que siga incomodando por que es que me vota error en los comandos UNTIL y REPEAT yo uso el microcode studio pic basic pro sera este compilador el que me genera para poder descargarme otro pbp podria recomendarme algun pbp bueno el cual me permita trabajar hasta con usb y todo eso les agradesco su  apoyo



como podria reemplazar estos dos comandos para poder compilarlo ya que no puedo ver su funcionamiento del codigo que me enviastes amigo


----------



## Alever89 (Oct 19, 2012)

gracias D@rkbytes era justo lo que estaba necesitando


----------



## Nano24 (Oct 19, 2012)

Hola amigos, por aca les traigo un código en picbasic, se trata de calcular distancias por ultrasonidos, es la primera vez que me compro un sensor de este tipo, el HC-SR04, tengo un PIC16F877A que uso para el caso de la medición, bueno la cosa es que ya tengo el programa pero no entiendo, cuando el PIC inicia el programa me envía al LCD 44 cm sin estar apuntando a algún objeto cercano, el sensor tiene un alcance de hasta 450 cm, veo que muestra un error cuando empieza a detectar algún objeto, le acerco la mano a unos 30cm de distancia y me da lecturas de 4cm, como puedo corregir el error? Le he tratado de modificar la ecuación que dice "MEDIDA = MEDIDA / 54"  MEDIDA es una variable de peso WORD. Denme una mano para ver como puedo corregir el error.


```
define OSC 4
TRISB = 0
TRISC = %00000010
DISPARO VAR PORTC.0         'PIN USADO PARA EL PULSO DE DISPARO
ECO VAR PORTC.1             'PIN USADO PARA EL ECO
MEDIDA VAR Word             'VARIABLE de 16 bits PARA ALMACENAR LA MEDIDA
Define   LCD_DREG   PORTB  'bit de datos del LCD empezando
Define   LCD_DBIT   4      'por B.4 ,B.5, B.6 y B.7
Define   LCD_RSREG  PORTB  'bit de registro del LCD conectar
Define   LCD_RSBIT  3      'en el puerto B.3
Define   LCD_EREG   PORTB  'bit de Enable conectar en el
Define   LCD_EBIT   2      '"puerto B.2 
PAUSE 500
LCDOUT $FE,1
;*******************************************************************************
PROCESO:
pause 10
disparo = 0          'Inicializa el valor de DISPARO
PulsOut DISPARO,5    'Manda un pùlso de disparo para empezar a medir
GoSub LEER_ECO       'Llamada a funcion para leer el ancho del eco recibido
GoTo proceso         'Vuelve e iniciar cuando se ha leido el eco
;*******************************************************************************
LEER_ECO:  
   Select Case eco                 'si hay eco no manda pulso de disparo
            Case 1                      'Si no nay eco
                  GoTo proceso          'Vuelve a iniciar el proceso 
                  Case 0                      'Si hay eco                 'Funcion de leer el eco
PulsIn ECO,1,MEDIDA          'Lee el acho del pulso de eco y lo guarda en medida
medida = MEDIDA/54                           'para convertir en cm
Lcdout $fe, 1, "DISTANCIA:", #medida, " cm" 'Muestra el valor medido en el LCD
If medida <10 Then 
lcdout $FE, $C0                                              
Lcdout "Cuidado"                            'Aviso
EndIf
GoTo proceso            'Vuelve a lanzar el proceso                              'Vuelve a lanzar el proceso
 End Select
End
```


----------



## LaElectronicaMeOdia (Oct 20, 2012)

Nano24 dijo:


> Hola amigos, por aca les traigo un codigo en picbasic, se trata de calcular distancias por ultrasonidos, es la primera vez que me compro un sensor de este tipo, el HC-SR04, tengo un PIC16F877A que uso para el caso de la medicion, bueno la cosa es que ya tengo el programa pero no entiendo, cuando el PIC inicia el programa me envia a la LCD 44 cm sin estar apuntando a algun objeto cercano, el sensor tiene un alcance de hasta 450 cm, veo que muestra un error cuando empieza a detectar algun objeto, *le acerco la mano a unos 30cm de distancia y me da lecturas de 4cm, como puedo corregir el error?* Le he tratado de modificar la ecuacion que dice "MEDIDA = MEDIDA / 54"  MEDIDA es una variable de peso WORD. Denme una mano para ver como puedo corregir el error.



Estaba pasando por estos lugares y me llamo la atencion tu pregunta, yo nunca he manejado ese modulo de ultrasonido pero compre un "metrometro ultrasonico" y como el tuyo no mide menos de 30cm Aprox, estaba buscando la ficha tecnica de mi metrometro y no la encontre pero mira esta Tambien dice que mide de 30cm a 9mts asi que no creo que sea un error tuyo


----------



## ricbevi (Oct 20, 2012)

Nano24 dijo:


> Hola amigos, por aca les traigo un codigo en picbasic, se trata de calcular distancias por ultrasonidos, es la primera vez que me compro un sensor de este tipo, el HC-SR04, tengo un PIC16F877A que uso para el caso de la medicion, bueno la cosa es que ya tengo el programa pero no entiendo, cuando el PIC inicia el programa me envia a la LCD 44 cm sin estar apuntando a algun objeto cercano, el sensor tiene un alcance de hasta 450 cm, veo que muestra un error cuando empieza a detectar algun objeto, le acerco la mano a unos 30cm de distancia y me da lecturas de 4cm, como puedo corregir el error? Le he tratado de modificar la ecuacion que dice "MEDIDA = MEDIDA / 54"  MEDIDA es una variable de peso WORD. Denme una mano para ver como puedo corregir el error.
> 
> define OSC 4
> TRISB = 0
> ...



Hola...Te sugiero que leas la documentación del modulo que estas usando...si no lo tienes esta aquí  http://www.micropik.com/PDF/HCSR04.pdf y adaptes el programa a los tiempos sugeridos por el fabricante. Aunque no tengo experiencia con esos módulos me parece que la cuestión pasa por allí y no por la formula que también esta incluida en la documentación.
Saludos.

Ric.


----------



## Nano24 (Oct 20, 2012)

ricbevi dijo:


> Hola...Te sugiero que leas la documentación del modulo que estas usando...si no lo tienes esta aquí  http://www.micropik.com/PDF/HCSR04.pdf y adaptes el programa a los tiempos sugeridos por el fabricante. Aunque no tengo experiencia con esos módulos me parece que la cuestión pasa por allí y no por la formula que también esta incluida en la documentación.
> Saludos.
> 
> Ric.



Gracias por la respuesta, voy a chequear el documento para ver que le puedo mejorar, aunque me puse a inventar con la formula y la deje MEDIDA = MEDIDA/4 de 34 la reduje a 4 y tiene mas precisión que antes.


----------



## cesarim (Oct 20, 2012)

Amigo ricbevi te agrdesco mucho tu ayuda me descargue otro microcode studio y me funciona de maravillas tu codigo ya no me bota error en esos dos comandos muchas gracias estoy estudiando tu codigo para poder entender su losgica como tu me dices gracias por corregirme y enseñarme



amigo ya logre modificarlo a tres pulsaciones con tiempos diferentes funciona genial muchas gracias amigo te agradesco mucho por tu ayuda uno por que pude cambiarme de microcode y este si funciona genial si tienes algun link de un programador que pueda hacer codigo con usb y todo eso te agradeceria me ayudaras para poder descargarlo y otro por tu apoyo incondicional por tus conocimientos a todos los que nos apoyan voy a tratar de hacer tiempos diferentes  y luego lo subo gracias


----------



## ricbevi (Oct 20, 2012)

cesarim dijo:


> Amigo ricbevi te agrdesco mucho tu ayuda me descargue otro microcode studio y me funciona de maravillas tu codigo ya no me bota error en esos dos comandos muchas gracias estoy estudiando tu codigo para poder entender su losgica como tu me dices gracias por corregirme y enseñarme



Si el problema era el Repeat...Until( aunque este esta soportado desde hace rato) acá te paso sin el pero haciendo exactamente lo mismo...los comando mas complejos solo se resuelven con comando mas "básicos" y algunas lineas de código mas.


```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 19/10/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16f628A, INTRC_OSC_NOCLKOUT 'Reloj interno solo.-
@ DEVICE pic16f628A, WDT_OFF ' Watchdog Timer desconectado.-
@ DEVICE pic16f628A, PWRT_ON ' Power-On Timer conectado.-
@ DEVICE pic16f628A, BOD_ON ' Brown-Out Detect conectado.-
@ DEVICE pic16f628A, MCLR_ON ' Master Clear Externo conectado;desconectado.-
@ DEVICE pic16f628A, LVP_OFF ' Low-Voltage Programming desconectado.-
@ DEVICE pic16f628A, CPD_OFF ' Data Memory Code Protect desconectado.-
cmcon=7
DEFINE OSC 4            
TRISB = $FC
TRISA = $FF
PORTB = 0
PORTA = 0
I var byte

Foco0 var PORTB.0
Boton0 var PORTA.0

Main:    ' Principal
         if boton0 then
Espera:  ' Anti-revote  sin repeat ... until 
            i = i + 1
            pause 10
            if i  = 255 then i = 254 ' limito por si tiende a desbordarse el acumulador i
            if boton0 then goto Espera ' si sigue apretado boton0 voy a Espera
            if i =< 20 then  ' 200ms 
            goto Time1
            else
            goto Time0
            endif
        endif
        pause 10
  
goto Main

'---------------------
Time0:
      i = 0
      toggle foco0
      pause 10
goto main
'----------------------
Time1:
     
      for i = 1 to 6
      high foco0
      pause 50
      low foco0
      pause 50
      next i
      i = 0
goto main
END
```
Ric.


----------



## Nano24 (Oct 22, 2012)

La verdad tengo una duda tambien e empezado a programar PIC para el control de servos y no entiendo por que no me funciona, gira a un lado el servo y no regresa, se queda pegado, y eso que me guio con el ejemplo que aparece en este video:




El microservo que tengo es:http://www.todomodel.es/img/p/413-1437-large.jpg

Según leí en una información dice que tiene un angulo de rotación de 180 grados, pero no comprendo pues al usar un ciclo FOR le digo:

```
DEFINE OSC 4
TRISC = 0
PORTC = 0
X VAR BYTE

INICIO:
FOR X = 50 TO 150 STEP 1
PULSOUT PORTC.0,X
PAUSE 10
NEXT

FOR X = 150 TO 50 STEP -1
PULSOUT PORTC.0,X
PAUSE 10
NEXT
GOTO INICIO
END
```
Con esto el servo debería de girar de lado y lado, pero no lo hace.



Ya solucione el problema, lo he modificado en donde dice: medida = ((medida*10)/58) con esa formula quedo mas preciso a cortas distancias.

```
define OSC 4
TRISB = 0
TRISC = %00000010
DISPARO VAR PORTC.0         'PIN USADO PARA EL PULSO DE DISPARO
ECO VAR PORTC.1             'PIN USADO PARA EL ECO
MEDIDA VAR Word             'VARIABLE de 16 bits PARA ALMACENAR LA MEDIDA
Define   LCD_DREG   PORTB  'bit de datos del LCD empezando
Define   LCD_DBIT   4      'por B.0 ,B.1, B.2 y B.3
Define   LCD_RSREG  PORTB  'bit de registro del LCD conectar
Define   LCD_RSBIT  3      'en el puerto B.5
Define   LCD_EREG   PORTB  'bit de Enable conectar en el
Define   LCD_EBIT   2      '"puerto B.4 
PAUSE 500
LCDOUT $FE,1
;*******************************************************************************
PROCESO:
pause 40
disparo = 0          'Inicializa el valor de DISPARO
PulsOut DISPARO,10    'Manda un pùlso de disparo para empezar a medir
GoSub LEER_ECO       'Llamada a funcion para leer el ancho del eco recibido
GoTo proceso         'Vuelve e iniciar cuando se ha leido el eco
;*******************************************************************************
LEER_ECO:  
Select Case eco                 'si hay eco no manda pulso de disparo
;******************************************************************************
Case 1                      'Si no nay eco
GoTo LEER_ECO          'Vuelve a iniciar el proceso 
;******************************************************************************
Case 0                      'Si hay eco                 'Funcion de leer el eco
PulsIn ECO,1,MEDIDA          'Lee el acho del pulso de eco y lo guarda en medida
medida = ((medida*10)/58)                           'para convertir en cm
Lcdout $fe, 1, "DISTANCIA:", #medida, " cm" 'Muestra el valor medido en el LCD
;******************************************************************************
If medida <10 Then 
lcdout $FE, $C0                                              
Lcdout "Cuidado"                            'Aviso
EndIf
;******************************************************************************
GoTo proceso            'Vuelve a lanzar el proceso
 End Select
End
```


----------



## ricbevi (Oct 22, 2012)

@nano24...si quieres hacer un programa para controlar algo( y no que ese algo te controle ) primero debes informarte acerca del funcionamiento de dicho dispositivo y después con todo los datos hacer el programa para controlarlo.
Ese programa esta echo para ese servo pero como imaginaras cada uno de los fabricantes utiliza distintos parámetros según le convenga.
Los servos no trabajan con la misma frecuencia de PWM y no tienen todos el mismo ancho de pulso mínimo/máximo así que empieza por averiguar todo los datos del servo que tienes y después trata de hacer el programa una vez que comprendas como funcionan.
Saludos.

Ric.


----------



## Nano24 (Oct 22, 2012)

ricbevi dijo:


> @nano24...si quieres hacer un programa para controlar algo( y no que ese algo te controle ) primero debes informarte acerca del funcionamiento de dicho dispositivo y después con todo los datos hacer el programa para controlarlo.
> Ese programa esta echo para ese servo pero como imaginaras cada uno de los fabricantes utiliza distintos parámetros según le convenga.
> Los servos no trabajan con la misma frecuencia de PWM y no tienen todos el mismo ancho de pulso mínimo/máximo así que empieza por averiguar todo los datos del servo que tienes y después trata de hacer el programa una vez que comprendas como funcionan.
> Saludos.
> ...



Muchas gracias por tu respuesta y por tu consejo, he estado tratando de buscar datos referentes a este servo pero solo consigo cosas basicas como el voltaje maximo y minimo que trabaja, el torque y angulo de rotacion pero no me dicen mas nada, solo  dice aungulo de 180 grados:

Towerpro SG90 9G Micro Servo

Features: Coreless Motor, All Nylon Gears, Connector Wire Length 150mm, Universal plug for just about ALL radio systems! 

SG90 Specs:

* Dimensions: 22 X 11.5 X 22mm
* Operating Speed (4.8V no load): 0.12sec/60 degrees
* Stall Torque (4.8V): 17.5oz/in (1 kg/cm)
* Temperature Range: -30 to +60
* Degree CDead Band Width: 7usec
* Operating Voltage: 3.0-7.2 Volts
* Each servo comes with 3 different servo horns and fittings as seen.


Please Note: 6 volts really does mean 6 volts not 7+ as is likely with 5 fully charged 2nd generation NMH cells


----------



## Alever89 (Oct 23, 2012)

D@rkbytes una pregunta en la funcion button la penultima variable que se coloca es ACTION, esta variable para que funciona cuando esa variable se pone a uno y cuando esa variable se pone a cero


----------



## D@rkbytes (Oct 23, 2012)

Alever89 dijo:


> D@rkbytes una pregunta en la funcion button la penultima variable que se coloca es ACTION, esta variable para que funciona cuando esa variable se pone a uno y cuando esa variable se pone a cero


Esta es la descripción de la instrucción BUTTON

*BUTTON* , Pin , Down , Delay , Rate , Bvar , Action , Label

Lee Pin y opcionalmente ejecuta anti rebote y auto repetición.
Pin automáticamente se toma como entrada.
Pin debe ser una constante, 0 - 15, ó una variable que contenga un número 0 - 15 (P.Ej. *B0*)
ó un número de pin (P.Ej. *PORTA.0*) 

*Down*
Estado del pin cuando se oprime el pulsador (0-1)  
*Delay*
Contador de ciclos antes de que comience la auto-repetición (0...255).
Si  es 0, no se efectúa anti rebote ni auto repetición.
Si es 255 se  eliminan rebotes, pero no auto repetición.
*Rate*
Valor de auto repetición (0...255)  
*Bvar*
Variable con tamaño de byte usada internamente para conteo de demoras y repeticiones.
Debe ser inicializada a 0 antes de ser usada, y no ser usada en cualquier lugar del programa.  
*Action*
Estado del pulsador al ser actuado.  
*Label*
La ejecución comienza en esta etiqueta si es cierto *Action*

Notas:
Esta documentación se encuentra en el manual de PICBasic Pro en español.
Y también se obtiene presionando la tecla F1 cuando se pone el cursor sobre alguna instrucción.

Saludos.


----------



## Alever89 (Oct 23, 2012)

el action se debe poner a cero, si es q*ue* mi circuito va a realizar una acción cuando mi pulsador lo mando a cero
Y debe ponerse uno, si es q*ue* mi circuito va a realizar una acción cuando mi pulsador lo mando a 5v
¿así es como debo poner el action o estoy equivocado?


----------



## fer1100rt (Oct 24, 2012)

Hola a todos, es mi primera pregunta en este foro que sigo hace algún tiempo y me parece fenomenal por los aportes que hacen ustedes, desde ya muchas gracias, mi pregunta es la siguiente, como o que tengo que hacer pera que el siguiente proyecto que es muy básico después de hacer su su salto a la correspondiente función y mediante una pulsación en gpio.3 mas larga se apague el led.

Nota: soy muy novato    

```
define osc 4
 @ DEVICE  PIC12F629,INTRC_OSC_NOCLKOUT'' si usas el oscilador interno.
 @ DEVICE pwrt_off,bod_on,protect_off,cpd_off,mclr_off

 cmcon = 7

 trisio = %00001000  'gpio.3 entrada,0,1,2,4,5 son salidas
 gpio = %00000000
 cnt var byte
 boton var gpio.3  ;pulsador pin 4 gpio.3
 led var gpio.0    ;led pin 7 gpio.0
 cnt =0
 
chequeo: if boton = 0 then tick          
         goto chequeo 
                  
                        
tick:    pause 100 

         cnt = cnt + 1                                             
         if cnt =1 then luz1       
         if cnt =2 then luz2       
         if cnt =3 then luz3
         if cnt =4 then led_on         
         if cnt =>5 then led_off
        
luz1:    pwm led,25,100                                                                      
         if boton =0 then tick                                 
         goto luz1

Aqui por ejemplo: si presiono el pulsador por mas tiempo digamos (x) que se apague el led y si hago solamente un toke que siga saltando a su rutina. Y asi con las demas funciones.  
                                                    
luz2:    pwm led,50,100                                                            
         if boton =0 then tick                           
         goto luz2 
                                             
luz3:    pwm led,75,100                                         
         if boton =0 then tick                           
         goto luz3
         
led_on:  HIGH LED
         pause 200               
         if boton =0 then tick  
         goto led_on         
                           
led_off:  low led                              
          pause 250                   
          cnt =0               
          goto chequeo                    
          end
```
Muchas gracias


----------



## Alever89 (Oct 24, 2012)

Una consulta D@rkbytes. Lo único q*ue* no entiendo de la función button es la parte de action, no*-*se cuando action se le debe poner uno o cuando a action se le debe poner cero.
Agradecería mucho tu respuesta.


----------



## DEPREDADORX1 (Oct 25, 2012)

Saludos a todos,

Estoy diseñando una interface para una cnc casera versión Esteca55 pero utilizando un pic16f628 para evitar recalentamientos de los motores, el caso es que no he podido hacer funcionar la interrupción básica por el puerto b (b4-b7), francamente no sé cuál es el detalle, yo les agradecería mucho si pudieran echarme una mano con dicha interrupción. 

Sé que hay que configurar el Intcon.3 y borrar la bandera Intcon.0 pero no sé que mas hacer.

```
' Programa en Pic Basic Pro
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
TRISA = %00000000 ' Configura el puerto A como salida.
TRISB = %11110000 ' Configura los 4 bits más significativos como
' entrada.
I VAR Byte ' Declaración de la variable "I" tipo Byte
Symbol LED1 = PORTA.0 ' Alias para el pin RA0
Symbol LED2 = PORTA.1 ' Alias para el pin RA1
On Interrupt GoTo Interrup ' Define el vector de interrupción
INTCON = %10001000 ' habilita la interrupción RB4-RB7
Inicio:
LED1 = 1 ' Enciende el Led 1
Pause 1000 ' Pausa de 1 segundo
LED1 = 0 ' Apaga el Led 1
Pause 1000 ' Pausa de 1 segundo
GoTo Inicio ' Salta a la etiqueta "Inicio"
Interrup:
Disable
For I = 1 To 6
LED2 = 1 ' Enciende el Led 2
Pause 1000 ' Pausa de 1 segundo
LED2 = 0 ' Apaga el Led 2
Pause 1000 ' Pausa de 1 segundo
Next I
INTCON = %10001000 ' habilita las interrupciones (GIE=1)
' habilita la interrupción RB4-RB7 (RBIE=1)
' Inicializa la interrupción (RBIF=0)
Resume
Enable
End
```


----------



## ricbevi (Oct 25, 2012)

DEPREDADORX1 dijo:


> Saludos a todos,
> 
> Estoy diseñando una interface para una cnc casera versión Esteca55 pero utilizando un pic16f628 para evitar recalentamientos de los motores, el caso es que no he podido hacer funcionar la interrupción básica por el puerto b (b4-b7), francamente no sé cuál es el detalle, yo les agradecería mucho si pudieran echarme una mano con dicha interrupción.
> 
> ...



Hola...Prueba así a ver si te funciona bien como a mi solo tuve que achicar los tiempos de encendido/apagado de el led2 y colocar las definiciones en la cabecera.

```
' Programa en Pic Basic Pro
            Device = 16F628A   ' micro usado
        All_Digital= true  ' todas las entradas son digitales
    Config INTRC_OSC_NOCLKOUT, WDT_ON, LVP_OFF, BODEN_OFF, CP_ON, CPD_OFF, PWRTE_OFF, MCLRE_OFF
     Declare Xtal = 4  ' Define el Oscilador para un Cristal de 4 Mhz.
TRISA = %00000000 ' Configura el puerto A como salida.
TRISB = %11110000 ' Configura los 4 bits más significativos como
' entrada.
I VAR Byte ' Declaración de la variable "I" tipo Byte
Symbol LED1 = PORTA.0 ' Alias para el pin RA0
Symbol LED2 = PORTA.1 ' Alias para el pin RA1
PORTB=0 ' limpio puerto B
On Interrupt GoTo Interrup ' Define el vector de interrupción
INTCON = %10001000 ' habilita la interrupción RB4-RB7
Inicio:
LED1 = 1 ' Enciende el Led 1
DelayMS 1000 ' Pausa de 1 segundo
LED1 = 0 ' Apaga el Led 1
DelayMS 1000 ' Pausa de 1 segundo
GoTo Inicio ' Salta a la etiqueta "Inicio"
Interrup:
Disable
For I = 1 To 6
LED2 = 1 ' Enciende el Led 2
DelayMS 100'0 ' Pausa de 100 Mili segundo
LED2 = 0 ' Apaga el Led 2
DelayMS 100 '0 Pausa de 100 Mili segundo
Next I

INTCON = %10001000 ' habilita las interrupciones (GIE=1)
' habilita la interrupción RB4-RB7 (RBIE=1)
' Inicializa la interrupción (RBIF=0)
Resume
Enable
End
```
Saludos.

Ric.


----------



## D@rkbytes (Oct 25, 2012)

Alever89 dijo:


> Una consulta D@rkbytes. Lo único q*ue* no entiendo de la función button es la parte de action, no*-*se cuando action se le debe poner uno o cuando a action se le debe poner cero.
> Agradecería mucho tu respuesta.


Saludos.
*Action* toma el siguiente valor cuando es presionado el pulsador...
0 si no se presiona, 1 cuando se presiona.
Así que todo depende de que valor quieres que tome el pulsador cuando es presionado.
Por lo regular Action conviene ponerlo en 0, ya que 0 es considerado como OFF en los Push Buttons N/A

Para que tengas más conocimiento de como actúa Action al presionar el pulsador,
crea algún proyecto sencillo con un LED y juega con el valor de Action para que veas el resultado.

Suerte.


----------



## DEPREDADORX1 (Oct 25, 2012)

Hola ricbevi,

Gracias por responder, pues realmente no sé que pueda estar pasándome, compilo y sigo teniendo problemas, parpadea el led para el ciclo normal y el de la interrupción igual una vez se ha activado. Adjunto la simulación pues este pequeño detalle me tiene dudando de mi lucidez mental je,je,je... a ver si, en definitiva, logro encausar mi proyecto. Lo probé con Proton y también presenta el error...


----------



## D@rkbytes (Oct 25, 2012)

ricbevi dijo:


> solo tuve que achicar los tiempos de encendido/apagado de el led2 y colocar las definiciones en la cabecera.


Hola ricbevi.
Solo como comentario...
La palabra de configuración que colocaste en el código es para Proton, no para PICBasic Pro.
Y si el amigo DEPREDADORX1 compila con MicroCode Studio le va a producir errores.
Hay que cambiar la palabra de configuración con la sintaxis para MCS.
Algo así como esto...

```
@ DEVICE PIC16F628A    ; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,WDT_OFF,MCLR_ON,PWRT_ON,BOD_OFF,LVP_OFF
```
Y tener en consideración si se requiere tener activo el WDT que en tu configuración esta activo.

Saludos.


----------



## DEPREDADORX1 (Oct 25, 2012)

Gracias tambien a D@rkbytes por la aclaración, igual lo probé en Proton y funciona mal, espero de verdad encontrarle cuál es la falla, es muy curioso porque el código es estraído fielmente de algunos textos. Hasta ahora, buscando y buscando, no he podido encontrar un ejemplo funcional, ni siquiera el foro de Proton o pic basic, quizás algo relacionado con los teclados keypad,  pero son ejemplos extensos que solo me han confundido más. Agradezco cuaquier otro comentario al que puedan hacer al respecto.


----------



## ricbevi (Oct 25, 2012)

D@rkbytes dijo:


> Hola ricbevi.
> Solo como comentario...
> La palabra de configuración que colocaste en el código es para Proton, no para PICBasic Pro.
> Y si el amigo DEPREDADORX1 compila con MicroCode Studio le va a producir errores.
> ...



Si efectivamente esta en el formato del Proton las disculpas del caso y también entendido al WDT activado que posiblemente por eso parecía que funcionaba ....se me chispotio  Saludos.
Ric.


----------



## DEPREDADORX1 (Oct 26, 2012)

Hola foreros,

Al parecer no siempre las cosas son como parecen, uno se guía por un texto porque cree que está bien y sucede que no.  Checando el foro de los amigos de todopic encontré una posible respuesta al error de la interrupción por el puerto b, aquí lo que encontré:

primero: leer o escribir el puertoB;
Hacer PORTB = PORTB puede servir.

Luego, limpiar el flag correspondiente.

al salir y reactivar INTCON,GIE deberias poder salir de la interr, excepto los valores de las entradas en RB4-RB7 hayan vuelto a cambiar durante ese período de tiempo.

Al parecer le funcionó esto:
dim button_pressed as byte
dim tempbyte as byte

sub procedure interrupt

         'Lo que quieras poner para que se ejecute la interrupcion  ej: IF portb.7 = 1 then......
        tempbyte = PORTB  ' Lee el PORTB en una variable de bytes para eliminar condición desajuste
        INTCON.RBIE = 0  ' Desavilita otras interrupciones
        INTCON.RBIF = 0  ' Apaga la bandera de interrupción "Turn off the interrupt flag"
        button_pressed = true
  end sub

main
SetBit(INTCON,GIE)              ' habilita interrupciones globales.
"tu programa"
INTCON.RBIE = 1


----------



## Alever89 (Oct 26, 2012)

gracias  D@rkbytes ya lo probe y al fin pude entenderlo


----------



## moringos (Oct 26, 2012)

hola como declaras que pic vas a usar, lo pongo como esta en los tutoriales y da error



este programa me anda en la simulacion(en proteus 7.9)  pero en la practica no me funciona



```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 24/10/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

DEFINE OSC 4 
portb=0
n var byte
p1 var porta.0
p2 var porta.1
ldr var porta.4
ldr1 var porta.4
led var portb.4
led1 var portb.5
buzzer var portb.6
servo var portb.0


inicio:
if p1=1 then encender
PAUSE 200
if p2=1 then apagar
PAUSE 200
if ldr=1 then encender2
pause 200
if ldr1=0 then apagar2
goto inicio

encender:
for n=1 to 10 step 1
pulsout portb.0,175
pause 10
low portb.5
high portb.4
high portb.6
next
if p2=1 then apagar
goto encender

apagar:
for n=1 to 10 step 1
pulsout portb.0,150
pause 10
next
low portb.4
high portb.5
low portb.6
goto inicio

encender2:
for n=1 to 10 step 1
pulsout portb.0,175
pause 10
next
low portb.5
high portb.4
high portb.6
goto inicio

apagar2:
for n=1 to 10 step 1
pulsout portb.0,150
pause 10
low portb.4
high portb.5
low portb.6
next

goto inicio



end
```



ricbevi dijo:


> Si efectivamente esta en el formato del Proton las disculpas del caso y también entendido al WDT activado que posiblemente por eso parecía que funcionaba ....se me chispotio  Saludos.
> Ric.



no me funciona declarar el pic utilizado como lo pusiste


----------



## lisani (Oct 28, 2012)

Vangeluz dijo:


> *Disculpen a ver si alguien me podria ayudar ya que soy nuevo en lo que es PICs.
> Encontré un código asm PIC 16f84A de un contador simple ascendente con un 7 segmentos y un pulsador, lo unico es que modifiqué es que tenga otro pulsador para conteo descendente, PERO !!!! cuando desciende a 0 se bloquéa a ver si alguien me puede decir que hice mal.*
> *Físicamente configuré (RB0 a RB6 a,b,c,d,e,f,g  Respectivamente del 7 Segmentos Cátodo común)  RB7 1K a 0v y Pulsador a 5v *
> *Luego agregué RA2 con el otro pulsador igual para descender y como les contaba, llega a 0 y se bloquéa, ( al ascender anda super pasa el 0 y vuelve a contar ) solo es al descender el problema, *Desde yá muchas gracias .... ATTE. Victor Angel


Hola amigo lo que tu propones es mas sencillo hacerlo en pic basic.
Tengo lo que necesitas, te envió los archivos del programa y la simulación.

Amigo en el archivo esta lo que deseas espero que te sirva de ayuda.


----------



## lisani (Oct 28, 2012)

Claro  simple polarización, otra alternativa mosfet irfz44n


GoX F4yCk3r DB dijo:


> Hola que tal, ya pude realizar mi contador ascendente, ya entendi lo de la Multiplexacion.
> 
> Alguien me podria hechar la mano con el uso de las banderas.
> Lo que tengo que hacer es lo siguiente, cuando conecto el uC al la  corriente despliega el numero 7 y cuando pulso un boton muestra el  numero 4, si lo vuelvo a pulsar muestra el numero 7 de nuevo y si lo  vuelvo a pulsar muestra el numero 4 de nuevo.
> ...



He compilado tu código con un pic16F628A y esta correcto, no genera ningún error.


----------



## lisani (Oct 28, 2012)

reyvilla dijo:


> hola, hblando del l297 que lo he reutilizado bastantte con motores paso a paso,. me di cuenta que es mucho mas costoso ese par "l297 y L298" que un pic y nos transistores por lo menos aqui en mi pais saldria mas factible un pic que el driver, me gustaria hacer un L297 con un Pic. No creo que la programacion sea gran cosa, bueno quien quiera intentarlo me avisa y nos ponemos con eso saludos...
> 
> http://pdf1.alldatasheet.com/datasheet-pdf/view/22436/STMICROELECTRONICS/L297.html



No lo creo, el driver es para manejar mayor corriente al motor, lo puedes hacer con transistor y diodos  .


----------



## GoX F4yCk3r DB (Oct 29, 2012)

lisani dijo:


> Claro  simple polarización, otra alternativa mosfet irfz44n
> 
> 
> He compilado tu código con un pic16F628A y esta correcto, no genera ningún error.



Hola lisani!!!
Agradesco tu tiempo y tu ayuda, pero debo ser sincero contigo, algunas instrucciones del programa no las etiendo 
Yo stoy realizando un  contador ascendente y descendente, se muestra a tráves de displays 7seg. catodo comun y estan  multiplexados, tengo que usar banderas para que con un solo pulsador lo hagas pero solo un pulso, es decir al conectar el pic a vcc empieza a contar en  forma ascendente, cuando presiono el pulsador cuenta descendente y si vuelvo a presionar el pulsador cuenta ascendente y asi sucesivamente.
Disculpa las molestias y gracias por tu tiempo y ayuda


----------



## guigo (Nov 1, 2012)

fer1100rt dijo:


> Hola a todos, es mi primera pregunta en este foro que sigo hace algún tiempo y me parece fenomenal por los aportes que hacen ustedes, desde ya muchas gracias, mi pregunta es la siguiente, como o que tengo que hacer pera que el siguiente proyecto que es muy básico después de hacer su su salto a la correspondiente función y mediante una pulsación en gpio.3 mas larga se apague el led.
> 
> Nota: soy muy novato
> 
> ...





es posible que con la funcion button te funcione si no estoy mal esa funcion te permite dar un lapso de tiempo para pasar a una etiqueta es una funcion para antirebotes, pienso tambien en hacer un contador con respecto a pin de entrada si pin es 1 despues de tanto tiempo brinque a una etiqueta, en esa etiqueta colocar otro condicional de modo que si el pin aun es 1 entonces esperar a que sea 0 para seguir....creo que la solucion puede estar en la instruccion button leete el manual y buscate esa funcion.....pensa depronto con los condicionales y un contador para determinar si en un tiempo detrminado el boton no se a soltado que brinque....acordate de mayor que menor que.....puede ser contador de 0 a 255 con una pausita de 100...calcule el tiempo que mas o menos necesitas por ejemplo un segundo, si es a 100 milisegundos entonces el contador llega a diez cuando a pasado un segundo y si el contador llega a once te brinca de una...creo que por ahi vaaa jajaja saludos


----------



## fer1100rt (Nov 1, 2012)

Gracias  guigo, ya lo intente con button, pero me hace intermitencias se apaga y no se enciende......en fin ,seguro que no acierto con "down"   "action", o con "bvar" tengo que decir que todo esto lo intente despues de leerme todo y mirar por si encontraba algo que pudiese modificar y adaptarlo, en fin como se trata de aprender seguiremos intentandolo ,depues de 58 años me da por esto que le vamos a hacer 

Un saludo

PD: esto seria para hacer una linterna con varios modos y tal como lo tengo funciona bastante bien, pero me gustaria hacerlo de esa manera por experimentar y seguir con este pic que me gusta, no se porque


----------



## guigo (Nov 1, 2012)

fer1100rt dijo:


> Gracias  guido, ya lo intente con button, pero me hace intermitencias se apaga y no se enciende......en fin ,seguro que no acierto con "down"   "action", o con "bvar" tengo que decir que todo esto lo intente despues de leerme todo y mirar por si encontraba algo que pudiese modificar y adaptarlo, en fin como se trata de aprender seguiremos intentandolo ,depues de 58 años me da por esto que le vamos a hacer
> 
> Un saludo
> 
> PD: esto seria para hacer una linterna con varios modos y tal como lo tengo funciona bastante bien, pero me gustaria hacerlo de esa manera por experimentar y seguir con este pic que me gusta, no se porque




haaaaa num una de las cosas que sucede con los pic 12fxxx o puerto GPIO es que el pin se apaga apenas pasa a otra linea donde no este involucrado por ejemplo si vos cojes y prendes un pin le das una pausa para luego pasar a otra linea que prenda otro pin, el primer pin que prendiste se te va a apagar sin necesidad de darle a pin ñow o una instruccion que lo apague como sucede con otras familias como las 16fxxx....eso es una fallita de los pic de gama baja...

parcero....le toco hechar logica... iguale variables o utilice operaciones digitales..

saludos.



			
				guigo dijo:
			
		

> haaaaa num una de las cosas que sucede con los pic 12fxxx o puerto GPIO es que el pin se apaga apenas pasa a otra linea donde no este involucrado por ejemplo si vos cojes y prendes un pin le das una pausa para luego pasar a otra linea que prenda otro pin, el primer pin que prendiste se te va a apagar sin necesidad de darle a pin ñow o una instruccion que lo apague como sucede con otras familias como las 16fxxx....eso es una fallita de los pic de gama baja...
> 
> parcero....le toco hechar logica... iguale variables o utilice operaciones digitales..
> 
> saludos.



haaa y como las ppoliticas del foro no permite solucionarte el problema completo....no te puedo decir como hacerlo simplemete te puedo guiar con ideas y de hecho con lo que te he dicho es posible hacerlo...


----------



## fer1100rt (Nov 2, 2012)

Gracias, Guigo,   lo entiendo y lo comprendo, no buscaba "la solucion" , si no "una idea para la solucion"   Un saludo

Ricbevi, gracias tambien , ya lo habia mirado, y probado,tiene soluciones geniales como on/off y commutacion   . Seguiremos intentandolo 

SALUDOS


----------



## megatecpower (Nov 3, 2012)

ayuda solucion para que no se reinicie el pic 16f876a sin carga funciona bien pero cuando conecto un motor o un foco se reinicia cuando quiere , puede funcionar bien durante 5 segundos y despues puede reiniciarse en cualquier momento, lo que lo separa es un triac con moc 3011 y y esta alimentado de un transformador le sigue un capacitor y un regulador tiene varios capacitores uno lo tiene bien serca de el pic de 100 nF, tambien ya desactive el watchdogtimer y lo mismo tambien medi con el tester me da como 40VAC en el pic se prende la luz con el buscapolo aunque no hay nada que este unido a fase  pero sigue lo mismo se reinicia me vuelvo chango, alguna sugerencia , un filtro de linea? tal vez sera la solucion o algo en programacion?


----------



## LaElectronicaMeOdia (Nov 6, 2012)

megatecpower dijo:


> ayuda solucion para que no se reinicie el pic 16f876a sin carga funciona bien pero cuando conecto un motor o un foco se reinicia cuando quiere , puede funcionar bien durante 5 segundos y despues puede reiniciarse en cualquier momento, lo que lo separa es un triac con moc 3011 y y esta alimentado de un transformador le sigue un capacitor y un regulador tiene varios capacitores uno lo tiene bien serca de el pic de 100 nF, tambien ya desactive el watchdogtimer y lo mismo tambien medi con el tester me da como 40VAC en el pic se prende la luz con el buscapolo aunque no hay nada que este unido a fase  pero sigue lo mismo se reinicia me vuelvo chango, alguna sugerencia , un filtro de linea? tal vez sera la solucion o algo en programacion?



Con el motor me parece que es normal que se reinicie (causas del fenomeno EMI), y me parece que deberias poner un filtro para red, y quizas una jaula de faraday, con el foco me parece bastante raro que te pase, algo debes estar haciendo mal pero sin esquema y codigo seria dificil darte una opinion.


----------



## Jey1124 (Nov 12, 2012)

Buenas, les escribo a ver si alguien me ayuda con un problemita que tengo. La verdad no logro encontrar como solucionarlo, he hecho una cantidad de cosas y nada. Espero me puedan ayudar.

Estoy intentando a traves del PIC generar tonos dtmf, con la funcion DTMFOUT, y paralelamente mostrar en un 7 segmentos el numero presionado en un teclado 4x3.

El problema consiste en que cuando coloco las rutinas del DTMFOUT me salen errores en la simulacion con PROTEUS y comienzan a sonar y mostrarse todos los numeros de primerazo y solo despues es que me permite presionar el teclado y de ahi en adelante si funciona bien.

Les adjunto la simulacion, el codigo que estoy utilizando es el siguiente:


```
DEFINE OSC 4 ; Defíne oscilador externo de 4 MHZ.
cmcon = 7    ; Cambiar a modo digital todo el puerto A
TRISA = 0    ; Todo el puerto A es configurado como salidas
TRISB = %11110000 ; Configuracion del Puerto B [Teclado]

'****************************************************************
'*                    DEFINICION DE VARIABLES
'****************************************************************

' Nombres para los pines de las filas del teclado
A VAR PORTB.0 
B VAR PORTB.1
C VAR PORTB.2
D VAR PORTB.3
' Nombres para los pines de las columnas del teclado
UNO VAR PORTB.4
DOS VAR PORTB.5
TRES VAR PORTB.6
SPEAKER VAR PORTB.7
                 
PORTB = %11111111
PORTA = 15

'****************************************************************
'                       BARRIDO DEL TECLADO
'****************************************************************

BARRIDO:
LOW A ' Poner en bajo la 1ra fila
    IF UNO = 0 THEN PORTA = 1 : DTMFOUT SPEAKER,[1] 
    IF DOS = 0 THEN PORTA = 2 : DTMFOUT SPEAKER,[2]
    IF TRES = 0 THEN PORTA = 3 : DTMFOUT SPEAKER,[3]
HIGH A ' Poner en alto la 1ra fila

LOW B ' Poner en bajo la 2da fila
    IF UNO = 0 THEN PORTA = 4 : DTMFOUT SPEAKER,[4]
    IF DOS = 0 THEN PORTA = 5 : DTMFOUT SPEAKER,[5]
    IF TRES = 0 THEN PORTA = 6 : DTMFOUT SPEAKER,[6]
HIGH B ' Poner en alto la 2da fila

LOW C ' Poner en bajo la 3ra fila
    IF UNO = 0 THEN PORTA = 7 : DTMFOUT SPEAKER,[7]
    IF DOS = 0 THEN PORTA = 8 : DTMFOUT SPEAKER,[8]
    IF TRES = 0 THEN PORTA = 9 : DTMFOUT SPEAKER,[9]
HIGH C ' Poner en alto la 3ra fila

LOW D ' Poner en bajo la 4ta fila
    IF UNO = 0 THEN PORTA = 15 : DTMFOUT SPEAKER,[10]
    IF DOS = 0 THEN PORTA = 0 : DTMFOUT SPEAKER,[0]
    IF TRES = 0 THEN PORTA = 15 : DTMFOUT SPEAKER,[11]
HIGH D ; Poner en alto la 4ta fila

PAUSE 10 ; Pausa de 10 milisegundos
GOTO BARRIDO ' Continuar con el barrido de teclas
END
```

Gracias de antemano a todo aquel que me pueda ayudar.
Saludos desde Cartagena-Colombia


----------



## ricbevi (Nov 13, 2012)

Jey1124 dijo:


> Buenas, les escribo a ver si alguien me ayuda con un problemita que tengo. La verdad no logro encontrar como solucionarlo, he hecho una cantidad de cosas y nada. Espero me puedan ayudar.
> 
> Estoy intentando a traves del PIC generar tonos dtmf, con la funcion DTMFOUT, y paralelamente mostrar en un 7 segmentos el numero presionado en un teclado 4x3.
> 
> ...



Hola...activa la opción del Pull-Up del puerto B como lo resalto en en color azul:

```
DEFINE OSC 4 ; Defíne oscilador externo de 4 MHZ.
@cmcon = 7    ; Cambiar a modo digital todo el puerto A
[COLOR=Blue]OPTION_REG = 0 ; Pull-UP puerto B activado[/COLOR]
TRISA = 0    ; Todo el puerto A es configurado como salidas
TRISB = %11110000 ; Configuracion del Puerto B [Teclado]
```

La otra opción es colocar en las cuatro entradas del puerto B las resistencias de pull-up a +B individualmente.
Saludos.

Ric.


----------



## inspector gadget (Nov 13, 2012)

Saludos, solicito humildemente una orientacion si es que existe un operador en pic basic que me permita realizar un programa para realizar un decodificador de BCD (binario) a decimal, poseo 4 datos en binario y quisiera representar la sgte tabla de datos, en el encendido de 8 leds, sin necesidad de usar decodificadores como el 4028, sino realizarlo con pic 16F628 para practicar la conversion de binario a decimal, ya que no encuentro orientacion sobre este tema por ningun lado en este lenguaje que es en el que intento aprender con practicas e imagino que este es uno de los primeras practicas que todo aprendiz deberia realizar y dominar, mil gracias por su tiempo y si s posible algun ejemplo de como afrontar esta practica y organizar dichos datos dentro del programa. (utilizando el PTO A como entrada y el PTO B como salida)

D C B A
0 0 0 1     ENCIENDE LED 1
0 0 1 0                                  2
0 0 1 1                                  3
0 1 0 0                                  4
0 1 0 1                                  5
0 1 1 0                                  6
0 1 1 1                                  7
1 0 0 0                                  8


Como veran, esta disposicion corresponde a la tabla de verdad del decodificador 4028 y simplemente tome al azar este deco, pudiendo usar la tabla de cualquier otro, simplemente lo que deseo es aprender como organizar estos datos dentro de un programa y que efectue el mismo trabajo que realiza este deco, ya que imagino que dominando esto, podria alcanzar las 15 posibilidades que me brinda codificar con 4 bits de entrada y como no conozco de ningun decodificador que tenga estas 16 posibilidades Los que conozco son decimales), pues creo que seria muy util para muchos colegas en sus proyectos . Agracezco mucho cualquier informacion y ayuda que me puedan brindar.


----------



## MrCarlos (Nov 13, 2012)

Hola inspector gadget

Asomate por acá:
https://www.forosdeelectronica.com/f26/decodificador-bcd-pic16f84a-72483/#post634274
creo que Darzeck Realizó un proyecto parecido al tuyo.

Espero te ayude a realizar el tuyo.
Tendrás que analizar el contenido allá para modificarlo y concluir tu proyecto. 

saludos
a sus ordenes


----------



## Jey1124 (Nov 13, 2012)

inspector gadget dijo:


> Saludos, solicito humildemente una orientacion si es que existe un operador en pic basic que me permita realizar un programa para realizar un decodificador de BCD (binario) a decimal, poseo 4 datos en binario y quisiera representar la sgte tabla de datos, en el encendido de 8 leds, sin necesidad de usar decodificadores como el 4028, sino realizarlo con pic 16F628 para practicar la conversion de binario a decimal, ya que no encuentro orientacion sobre este tema por ningun lado en este lenguaje que es en el que intento aprender con practicas e imagino que este es uno de los primeras practicas que todo aprendiz deberia realizar y dominar, mil gracias por su tiempo y si s posible algun ejemplo de como afrontar esta practica y organizar dichos datos dentro del programa. (utilizando el PTO A como entrada y el PTO B como salida)
> 
> D C B A
> 0 0 0 1     ENCIENDE LED 1
> ...



Hola inspector gadget, creo que esto te puede ayudar...


```
CMCON = 7                       ; TODOS LOS PINES COMO DIGITALES
TRISA = %00001111               ; RA0 a RA3 COMO ENTRADAS
TRISB = %00000000               ; PUERTO B COMO SALIDA

SYMBOL A = PORTA.0
SYMBOL B = PORTA.1
SYMBOL C = PORTA.2
SYMBOL D = PORTA.3

PORTB = %11111111               ; APAGA TODOS LOS LEDS ANTES DE EMPEZAR

Main:                           ; PROGRAMA PRINCIPAL

'COMBINACIONES SEGUN LA TABLA DE VERDAD QUE PUSISTE
IF D = 0 AND C = 0 AND B = 0 AND A = 0 THEN PORTB = %11111111 'APAGA TODOS
IF D = 0 AND C = 0 AND B = 0 AND A = 1 THEN PORTB = %11111110 'LED1
IF D = 0 AND C = 0 AND B = 1 AND A = 0 THEN PORTB = %11111101 'LED2
IF D = 0 AND C = 0 AND B = 1 AND A = 1 THEN PORTB = %11111011 'LED3
IF D = 0 AND C = 1 AND B = 0 AND A = 0 THEN PORTB = %11110111 'LED4
IF D = 0 AND C = 1 AND B = 0 AND A = 1 THEN PORTB = %11101111 'LED5
IF D = 0 AND C = 1 AND B = 1 AND A = 0 THEN PORTB = %11011111 'LED6
IF D = 0 AND C = 1 AND B = 1 AND A = 1 THEN PORTB = %10111111 'LED7
IF D = 1 AND C = 0 AND B = 0 AND A = 0 THEN PORTB = %01111111 'LED8
Goto MAIN                       ; BUCLE INFINITO
END
```

Existiran varias formas de hacerlo, esta está hecha a mi manera 
Te adjunto un .ZIP con la simulación y el código anterior. Espero que te sirva

Saludos!


----------



## inspector gadget (Nov 14, 2012)

buenos días, saludos a todos los foreros. Gracias a MrCarlos por el dato, lastimosamente no tengo idea de assembler que es el lenguaje de ese proyecto.
Muchísimas gracias Jey1124 por tomarte el tiempo de asesorarme, crear la simulación y hacerme caer en cuenta de varias cosas que tenia mal en el programa que quería realizar y aunque no lo postee, aquí esta como empece y si bien es cierto que hay varias posibilidades de encarar el programa, pues con la forma que lo hiciste, aclare varios conceptos y funciona muy bien. Aquí esta como lo intente realizar:


```
cmcon=7
TrisA = 255 'todos como entrada
TrisB = 0 'todos como salida

;configuracion de pines 
led1 var portb.0  
led2 var portb.1 
led3 var portb.2 
led4 var portb.3 
led5 var portb.4 
led6 var portb.5 
led7 var portb.6 
led8 var portb.7 

p1 var porta.0 
p2 var porta.1 
p3 var porta.2 
p4 var porta.3 

 PortB=0
inicio:
 if (P1=1) then led1=1
 if (P2=1) and (p3=1) and (p4=1) then led2=1
 if (P2=1) and (p3=1)  then led3=1
 if (P2=1) and (p4=1)  then led4=1
 if (P2=1) then led5=1
 if (P3=1) and (p4=1)  then led6=1
 if (P3=1) then led7=1
 if (P4=1) then led8=1
 
Goto inicio
```

Bien, aunque el programa anterior no esta configurado correctamente, el que creó Jey, me deja bastantes cosas en claro.
Ahora lo que pretendo es mantener el estado de la salida, enclavado, aunque desaparezcan los datos de entrada, y luego cuando aparezcan nuevamente LOS MISMOS datos de entrada que lo hicieron encender, el led se vuelve a apagar.
Me explico: tomo como ejemplo los datos de entrada del encendido del primer led

IF D = 0 AND C = 0 AND B = 0 AND A = 0 THEN PORTB = %11111111 'APAGA TODOS
IF D = 0 AND C = 0 AND B = 0 AND A = 1 THEN PORTB = %11111110 ; enciende led 1
 TOGGLE PORTB = %11111110 
el led debe permanecer encendido, aunque los datos de entrada del PTO A desaparezcan y cuando vuelvan a aparecer los mismos datos, el led debe apagarse,
opte por usar la instrucción toggle para invertir l estado de la salida, pero parece no ser lo adecuado, en verdad no se como seguir adelante y pido su opinión como debería quedar, para así emplearla en todos los led, algo así como funciona un control ON-OFF digital pero con cuatro datos de entrada, Agradezco a quienes me puedan colaborar en como realizarlo, ya que para algunos de nosotros que nos ha tocado aprender preguntando en los foros y descargando información, ustedes son nuestra única opción de educación en este sentido, muchas gracias nuevamente.


----------



## Jey1124 (Nov 16, 2012)

inspector gadget dijo:


> buenos dias, saludos a todos los foreros. Gracias a MrCarlos por el dato, lastimosamente no tengo idea d assembler que es el lenguaje de ese proyecto.
> Muchisimas gracias Jey1124 por tomarte el tiempo de asesorarme, crear la simulacion y hacerme caer en cuenta de varias cosas que tenia mal en eel programa que queria realizar y aunque no lo postee, aqui esta como empece y si bien es cierto que hay varias posibilidades de encarar el programa, pues con la forma que lo hiciste, aclare varios conceptos y funciona muy bien. Aqui esta como lo intente ralizar:
> 
> cmcon=7
> ...



Buenas noches, intentando colaborarte un poco, diseñe lo siguiente (Creo que cumple con lo que quieres, debes hacer las pruebas, aunque ya yo probé y funciona 100% pero no se si es lo que buscas)


```
CMCON = 7                       ; TODOS LOS PINES COMO DIGITALES
TRISA = %00001111               ; RA0 a RA3 COMO ENTRADAS
TRISB = %00000000               ; PUERTO B COMO SALIDA

SYMBOL A = PORTA.0
SYMBOL B = PORTA.1
SYMBOL C = PORTA.2
SYMBOL D = PORTA.3
TMP1 VAR BIT
TMP2 VAR BIT
TMP3 VAR BIT
TMP4 VAR BIT
TMP5 VAR BIT
TMP6 VAR BIT
TMP7 VAR BIT
TMP8 VAR BIT

PORTB = %11111111               ; APAGA TODOS LOS LEDS ANTES DE EMPEZAR

Main:                           ; PROGRAMA PRINCIPAL

'COMBINACIONES SEGUN LA TABLA DE VERDAD QUE PUSISTE
IF D = 0 AND C = 0 AND B = 0 AND A = 0 THEN 
    TMP1 = 0 : TMP2 = 0 : TMP3 = 0 : TMP4 = 0 : TMP5 = 0 : TMP6 = 0 : TMP7 = 0 : TMP8 = 0
ENDIF
IF D = 0 AND C = 0 AND B = 0 AND A = 1 THEN 
    IF TMP1 = 0 THEN
        PORTB.0 = not PORTB.0 'LED1
        TMP1 = 1 : TMP2 = 0 : TMP3 = 0 : TMP4 = 0 : TMP5 = 0 : TMP6 = 0 : TMP7 = 0 : TMP8 = 0
    ELSE
        PORTB.0 = PORTB.0
    ENDIF
ENDIF
IF D = 0 AND C = 0 AND B = 1 AND A = 0 THEN 
    IF TMP2 = 0 THEN
        PORTB.1 = not PORTB.1 'LED2
        TMP1 = 0 : TMP2 = 1 : TMP3 = 0 : TMP4 = 0 : TMP5 = 0 : TMP6 = 0 : TMP7 = 0 : TMP8 = 0
    ELSE
        PORTB.1 = PORTB.1
    ENDIF
ENDIF
IF D = 0 AND C = 0 AND B = 1 AND A = 1 THEN 
    IF TMP3 = 0 THEN
        PORTB.2 = not PORTB.2 'LED3
        TMP1 = 0 : TMP2 = 0 : TMP3 = 1 : TMP4 = 0 : TMP5 = 0 : TMP6 = 0 : TMP7 = 0 : TMP8 = 0
    ELSE
        PORTB.2 = PORTB.2
    ENDIF
ENDIF
IF D = 0 AND C = 1 AND B = 0 AND A = 0 THEN 
    IF TMP4 = 0 THEN
        PORTB.3 = not PORTB.3 'LED4
        TMP1 = 0 : TMP2 = 0 : TMP3 = 0 : TMP4 = 1 : TMP5 = 0 : TMP6 = 0 : TMP7 = 0 : TMP8 = 0
    ELSE
        PORTB.3 = PORTB.3
    ENDIF
ENDIF
IF D = 0 AND C = 1 AND B = 0 AND A = 1 THEN 
    IF TMP5 = 0 THEN
        PORTB.4 = not PORTB.4 'LED5
        TMP1 = 0 : TMP2 = 0 : TMP3 = 0 : TMP4 = 0 : TMP5 = 1 : TMP6 = 0 : TMP7 = 0 : TMP8 = 0
    ELSE
        PORTB.4 = PORTB.4
    ENDIF    
ENDIF
IF D = 0 AND C = 1 AND B = 1 AND A = 0 THEN 
    IF TMP6 = 0 THEN
        PORTB.5 = not PORTB.5 'LED6
        TMP1 = 0 : TMP2 = 0 : TMP3 = 0 : TMP4 = 0 : TMP5 = 0 : TMP6 = 1 : TMP7 = 0 : TMP8 = 0
    ELSE
        PORTB.5 = PORTB.5
    ENDIF    
ENDIF
IF D = 0 AND C = 1 AND B = 1 AND A = 1 THEN 
    IF TMP7 = 0 THEN
        PORTB.6 = not PORTB.6 'LED7
        TMP1 = 0 : TMP2 = 0 : TMP3 = 0 : TMP4 = 0 : TMP5 = 0 : TMP6 = 0 : TMP7 = 1 : TMP8 = 0
    ELSE
        PORTB.6 = PORTB.6
    ENDIF    
ENDIF
IF D = 1 AND C = 0 AND B = 0 AND A = 0 THEN 
    IF TMP8 = 0 THEN
        PORTB.7 = not PORTB.7 'LED8
        TMP1 = 0 : TMP2 = 0 : TMP3 = 0 : TMP4 = 0 : TMP5 = 0 : TMP6 = 0 : TMP7 = 0 : TMP8 = 1
    ELSE
        PORTB.7 = PORTB.7
    ENDIF    
ENDIF
Goto MAIN                       ; BUCLE INFINITO
End
```

No soy el mas experto en programación, y no se que tan viable sea el código anterior, pero si soy recursivo y todavia esa recursividad me funciona jaja. Espero que te sirva a ti y a cualquier otra persona que llegue a necesitarlo. 

Puedes utilizar la misma simulacion que te pase antes para probarlo, los cambios solo son de codigo. Analizalo 

PD: Te adjunto el un .ZIP con los archivos necesarios (.PBP, .DSN, .HEX)


----------



## inspector gadget (Nov 20, 2012)

Excelente aporte jey1124 muchisimas gracias por sacar tiempo para colaborar con los que le estamos siguiendo el hilo a la programacion. El programa funciona bien y me sirve mucho para mis practicas, esta bastante claro y salvo unos bits que yo habia puesto mal, solo fue cuestion de analizarlo y acomodarlo a mi necesidad, ahora que ya lo probe voy a agregarle  una pantalla lcd para visualisar la  activacion de la salida correspondiente en lugar de los led, simplemente es para continuar las practicas, ya que se han visto elementos de entrada ahora voy con las salidas con lcd para que quede completo, como no se mucho de lcd voy a hacer algunas pruebas, ojala y me puedas seguir colaborando si se presentan dudas en el camino, muchas gracias Jey y toda la comunidad de los foros.


----------



## arturouc (Nov 27, 2012)

Hola a todos
aquí les dejo estos vídeos archivos del driver para servomotores de CD con encoder en cuadratura (OJO NO SON SERVOMOTORES DE AEROMODELISMO SON SERVOMOTORES INDUSTRIALES) 

video corto de robot moviéndose en el plano





gracias a este foro y el aporte de muchos de ustedes como autotronico, mecatrodatos, lubeck, darkbyte, reyvilla, meta, chico3001, etc

codigo en proton

```
Declare Warnings = OFF
Device 18F4431
Xtal = 20
'include "modedefs.bas"

'All_Digital = True 
    Float_Display_Type = Fast	' Use the fast floating point display library
	Optimiser_Level = 2			' Optimise the code
	
Config_Start
   OSC = HS ; HS oscillator
   PWRTEN = OFF ; PWRT disabled
   BOREN = OFF ; Brown-out Reset disabled in hardware and software
   WDTEN = OFF ; WDT disabled (control is placed on the SWDTEN bit)
   MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
   LVP = OFF ; Disabled
   Debug = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End
 
Declare Hserial_Baud  = 9600                 ' Set baud rate for USART 1
Declare Hserial_RCSTA = %10010000           ' Enable serial port and continuous receive
Declare Hserial_TXSTA = %00100100           ' Enable transmit and asynchronous mode
Declare Hserial_Clear = On
'
Symbol GIE = INTCON.7
Symbol CambioCW = PIR3.3
Symbol Desbordamiento = PIR3.2
Symbol Sentido = QEICON.5

INTCON = %11000000 ' activamos las interrupciones y las de periféricos

On_Interrupt GoTo serie
PIE1.5 = 1 ' activamos la interrupción de recepción de la USART

Sentido=0
Desbordamiento=0

TRISD = %00000000

Declare LCD_Type 0          ' Type of LCD Used is Alpha
Declare LCD_DTPin PORTD.4   ' The control bits B4,B5,B6,B7
Declare LCD_RSPin PORTE.0  ' RS pin on B2
Declare LCD_ENPin PORTE.1   ' E pin on B3
Declare LCD_Interface 4     ' Interface method is 4 bit

Declare CCP1_Pin PORTC.2
Declare CCP2_Pin PORTC.1
'------------Variables-------------
 Dim DATO[9]   As   Byte
 Dim NUM[9]    As   Byte
 Dim I As Byte
 Dim INDICE    As   Byte
 Dim DATOE     As    Byte
 'Dim DATOACUM1 As Word
 Dim DATOACUM As Dword
 Dim DATOS As Word
 Dim   mot_pwr  As    Dword  
 Dim   recu_pos As    Dword
 Dim   Upos     As    Word
 Dim   vel      As    Word      
 Dim   pot_val  As    Byte        
 Dim   Posicion As    Word  
 Dim   Posicion2 As   Word
 Dim   posH     As    Byte
 Dim   posL     As    Byte
 Dim   posHtem  As    Byte   
 Dim   FreMot  As     Word
 Dim   a       As     Float
 Dim   b       As     Float
 Dim   c       As     Float
 Dim   rt      As     Float
 Dim   eT      As     Float
 Dim   iT      As     Float
 Dim   dT2     As     Float
 Dim   yT      As     Dword
 Dim   uT      As     Float
 Dim   iT0     As     Float
 Dim   eT0     As     Float
 Dim   vmax    As     Byte
 Dim   vmin    As     Byte   
 Dim   Pantalla As    Byte   
 Dim   sentido2 As    Byte	 
 Dim   Activo   As    Byte
'--------------------
    ANSEL0 = %00000001          
    ANSEL1 = %00000000            
    TRISA = %00011111          
    LATA  = %00000000           
    TRISB = %00000000           
    TRISC = %10010000      
    TRISD = %00000000    
    QEICON = %10011000          
    PORTC.0 = 0 '1                 
    PORTC.1 = 0 
    PORTD.0 =1                 
Print Cls
Print At 1,1," CARGANDO"
Print At 2,1," PARAMETROS"

DelayMS 10
PORTD.0=0
    
    FreMot = 16000                  'frecuencia para el hpwm
    PORTC.0 = 0                 
    PORTC.3 = 0                           
    Upos=1                                                         
    Posicion= 0                 'variable posicion real       
    Posicion2=0
    POSCNTH = 156                 'para tener un 2000 en posicion
    POSCNTL = 64         
    vmin= 75                   'pwm minimo para el motor
    vmax= 180                   'pwm maximo para el motor
    iT0= 0                      'variable para calulo de termino derivarivo
    eT0= 0                      'variable para calculo del error
    a = 0.50                        'parametro proporcional
    b = 0.0009                       'parametro integral
    c = 0.050                        'parametro derivativo
INDICE=0
DATOE=0
DATOACUM=0
mot_pwr = 40000 
recu_pos=40000
                'se le asigna una posicion de inicio.
Pantalla = 1
sentido2= 0
Activo=0
'*********************************************************************
'********************PROGRAMA PRINCIPAL********************************
'*********************************************************************             
lop:                                                                                           
    GoSub CalPos                'ir a calcular la posicion actual
    
    GoSub calvel               'calcular PWM para el motor
   
    If mot_pwr = yT Then  'se borra el acumulado del error
        iT0=0
        eT0=0
        sentido2 =0
        HPWM 1, 0, FreMot     'no sale PWM por CCP1
        HPWM 2, 0, FreMot       'por CCP2 no sale nada
    EndIf  
   
    If mot_pwr > yT Then  'si set point es mayor que posicion actual                         
        HPWM 1, vel, FreMot     'sale PWM por CCP1
        HPWM 2, 0, FreMot       'por CCP2 no sale nada
    ElseIf mot_pwr < yT Then 'en caso contrario posicion actual > set point
        HPWM 2, vel, FreMot     'no sale nada por CCP1  
        HPWM 1, 0, FreMot       'sale pwm por CCP2
    EndIf                             
   
   ' GoSub lcd                   'muestra informacion en LCD

    GoTo lop                      
 
 End  
' ***********************************************************************************
'*****************FIN PROGRAMA PRINCIPAL*********************************************
'************************************************************************************    
lcd:                            'sub que muestra en lcd
If Pantalla = 1 Then
    Print At 1,1, "p=",Dec5 mot_pwr," v=", Dec3 vel'Dec3 vel  
    Print At 2,1, "R=",Dec5 Posicion ," e=", Dec1 eT
    'HSerOut["pos=", dec yt, "*",13]
    'delayms 10
ElseIf Pantalla = 2 Then
    Print At 1,1, "P",Dec4 a," I", Dec4 b         'Dec3 vel  
    Print At 2,1, "D",Dec4 c ," e=", Dec1 eT
ElseIf Pantalla = 3 Then
    Print At 1,1, "p=",Dec5 mot_pwr," P", Dec3 a'Dec3 vel  
    Print At 2,1, "R=",Dec5 Posicion ," I", Dec4 b
EndIf                                                                                             
Return   
'********************************************************************************** 
CalPos:                        'sub para calcular posicion
    posH = POSCNTH
    posL = POSCNTL
    posHtem = POSCNTH
    If posH - posHtem = 0 Then GoTo Listo
    posH = POSCNTH
    posL = POSCNTL    
Listo:    
    Posicion = 256*posH + posL 'se convierte en 16 bit la pos
    If Desbordamiento = 1  Then
        Desbordamiento= 0
        
        If sentido2 = 1 Then
            Posicion2 =Posicion2 + 1
            'sentido2 =0
        ElseIf sentido2 =2 Then       
            Posicion2 =Posicion2 - 1
            'sentido2 =0
        EndIf
    EndIf
    yT= 65536 * Posicion2 + Posicion
    Return  
'*************************************************************************************    
'****************************************************************************************        
calvel:                  'CALCULO DEL PWM CON PID
    eT = Abs(mot_pwr - yT)  'calculo del error
    eT = eT * (360/1200)   'ESCALAMOS: 360 grados es a 2000 pulsos del encoder
    iT = b*eT + iT0      'calculo de valor integral (magnitud del error)
    dT2 = c * (eT - eT0)  'calculo del valor derivativo (tiempo de respuesta)
    uT = iT + a * eT 
    uT = uT + dT2 'valor del PID
    
    If uT> vmax Then      'si la salida del PID es mayor que el valor de PWM
        uT = vmax          'que puedo mandar asignale el valor 255
    Else
        If uT< vmin Then uT=vmin  'PWM minimo que quiero enviar
    EndIf
    vel=uT                'velocidad del motor en PWM
    iT0=iT 
    eT0=eT   
    Return      
    
    
'*********************interrupcion PUERTO SERIE ********************************    
serie:
Context Save
HSerIn [DATOE] ' recibo el caracter de la pc por el rs232
RCSTA.4=0
RCSTA.4=1


 
If DATOE=="y" Then
   'Activo = 1
   INDICE=0
    'HSerOut[activo]
    DelayMS 1
ElseIf DATOE=="x" Or DATOE=="z"  Then  
    'Activo = 0
    INDICE=0     
    recu_pos = mot_pwr
EndIf    

 DATO[INDICE]=DATOE
 INDICE=INDICE+1

If DATOE== "*"  Then  ' cuando del PC llaga un "*" interpreto el numero que recibi

  If DATO[0]=="y" Then
     INDICE=0
     For I=2 To 7
        Select Case DATO[I] 'dato que recibi
            Case 48                 ' es un cero?
                NUM[I]=0           
            Case 49                 ' es un uno?
                NUM[I]=1
            Case 50                 ' es un dos?
                NUM[I]=2
            Case 51                 'creo que ya entendieron....
                NUM[I]=3
            Case 52
                NUM[I]=4
            Case 53
                NUM[I]=5
            Case 54
                NUM[I]=6
            Case 55
                NUM[I]=7
            Case 56
                NUM[I]=8
            Case 57                   ' es un nueve?
                NUM[I]=9
            Case Else    'CUALQUIER OTRO CARACTER LO TOMA COMO CERO "O"
                NUM[I]=0
        End Select 
     Next I
     'aqui determino que numero me enviaron por el PC
     'DATOACUM1=NUM[7] + NUM[6]*10 + NUM[5]*100 + NUM[4]*1000 + NUM[3]*10000 
     DATOACUM = NUM[7] + NUM[6]*10 
     DATOACUM=DATOACUM + NUM[5]*100 
     DATOACUM =DATOACUM + NUM[4]*1000
     DATOACUM=DATOACUM  + NUM[3]*10000 
     DATOACUM=DATOACUM + NUM[2]*100000
    Select Case DATO[1]
        Case "p"
            mot_pwr=DATOACUM
            If mot_pwr > yT Then
                sentido2 = 1
            Else
                sentido2 = 2
            EndIf
        Case "V"
            If DATOACUM > vmin Then
                If DATOACUM > 255 Then
                    vmax = 255
                Else
                    vmax = DATOACUM
                End If 
            EndIf    
         Case "v"
            If DATOACUM < vmax Then
                If DATOACUM < 20 Then
                    vmin = 20
                ElseIf DATOACUM > 200 Then
                    vmin =200
                Else
                    vmin = DATOACUM
                End If  
            EndIf      
         Case "P"
            a = DATOACUM / 10000
         Case "I"
            b = DATOACUM / 10000
         Case "D"  
            c = DATOACUM / 10000
         Case "q"
            If DATO[2]="1" Then
                Pantalla=1
            ElseIf DATO[2]="2" Then
                Pantalla=2
            ElseIf DATO[2]="3" Then
                Pantalla=3
            EndIf
         Case "x"
             HSerOut[Dec6 yT]
             DelayMS 10
    End Select    
    
    'HSerOut[DATOE]                    'envio lo que recibo....nomas...
     'Activo = 0
    EndIf       
    
    If DATO[0]=="x" Then
         RCSTA.4=0
        RCSTA.4=1
        INDICE=0
        mot_pwr=recu_pos
    EndIf
EndIf

If DATO[0]=="y" Then
  HSerOut[DATOE]             'envio lo que recibo....nomas...
'Else
'    RCSTA.4=0
'    RCSTA.4=1  
EndIf

INTCON = %11000000
Context Restore
```

el codigo en pic basic esta en un post anterior


----------



## arturouc (Nov 30, 2012)

robot sigue al simulador






el lunes les pongo el codigo todo comentado
si les interesa....


----------



## Dario (Dic 1, 2012)

arturouc dijo:


> robot sigue al simulador
> 
> http://youtu.be/S5LkXVagbE8
> 
> ...


¿que si nos interesa?  mas vale que nos interesa... sabes el tiempo que hace que quiero saber como se hace eso de hacer cinematica inversa?  ponelo, pero explicalo lo mas simple que se pueda, asi puedo entender  ... es que soy muy burro jajaja   tambien me gustaria saber que programa usaste para hacer la simulacion y como se hace para combinar la programacion del pic con la computadora... saludos y desde ya que estoy esperando ese proyecto, no te olvides de postear un ejemplito de la simu


----------



## arturouc (Dic 1, 2012)

D@rio dijo:


> ¿que si nos interesa?  mas vale que nos interesa... sabes el tiempo que hace que quiero saber como se hace eso de hacer cinematica inversa?  ponelo, pero explicalo lo mas simple que se pueda, asi puedo entender  ... es que soy muy burro jajaja   tambien me gustaria saber que programa usaste para hacer la simulacion y como se hace para combinar la programacion del pic con la computadora... saludos y desde ya que estoy esperando ese proyecto, no te olvides de postear un ejemplito de la simu



Que tal Dario
en este video explico la simulacion del driver





el martes te explico lo de la cinematica inversa


----------



## Dario (Dic 1, 2012)

muy bueno el video amigo arturo... veo que tenes experiencia con el sistema P.I.D, eso es algo que me cuesta entender todavia  justo en estos dias anduve pensando en hacer una practica con un motor DC y un encoder hecho apartir de un muse de pc de esos de bolita para ver si de una ves por todas puedo entenderlo... hice el intento varias veces de hacer un servo apartir de un motor dc con reduccion y un potenciometro pero nunca me salio ya que no estaba implementando el sistema P.I.D por no entender como funciona... saludosss


----------



## DEPREDADORX1 (Dic 3, 2012)

Excelente proyecto... quedamos a la espera de más información, felicitaciones!
Quisiera aprovechar este espacio para preguntar.... como siempre... si alguien puede orientarme... han llegado a mis manos 2 displeys nokia 1100 y me ha picado la curiosidad que cómo activarlos, lo curioso es que todo lo que he buscado está hecho en C o CCS, no entiendo bien el lenguaje, además son códigos extensos que no logro descifrar con claridad, en fin, me gustaría poder simular en proteus un mensaje básico y creo que el documento adjunto es un buen punto de partida, pueden ayudarme?


----------



## arturouc (Dic 3, 2012)

D@rio dijo:


> muy bueno el video amigo arturo... veo que tenes experiencia con el sistema P.I.D, eso es algo que me cuesta entender todavia  justo en estos dias anduve pensando en hacer una practica con un motor DC y un encoder hecho apartir de un muse de pc de esos de bolita para ver si de una ves por todas puedo entenderlo... hice el intento varias veces de hacer un servo apartir de un motor dc con reduccion y un potenciometro pero nunca me salio ya que no estaba implementando el sistema P.I.D por no entender como funciona... saludosss



Dario
me equivoque de vídeo este esta mas completo





este es el código comentado

```
Declare Warnings = OFF
Device 18F4431
Xtal = 20
'All_Digital = True 
    Float_Display_Type = Fast	' Use the fast floating point display library
	Optimiser_Level = 3			' Optimise the code
	
Config_Start
   OSC = HS ; HS oscillator
   PWRTEN = OFF ; PWRT disabled
   BOREN = OFF ; Brown-out Reset disabled in hardware and software
   WDTEN = OFF ; WDT disabled (control is placed on the SWDTEN bit)
   MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
   LVP = OFF ; Disabled
   Debug = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End
 
Declare Hserial_Baud  = 9600                 ' Set baud rate for USART 1
Declare Hserial_RCSTA = %10010000           ' Enable serial port and continuous receive
Declare Hserial_TXSTA = %00100100           ' Enable transmit and asynchronous mode
Declare Hserial_Clear = On
'
Symbol GIE = INTCON.7
Symbol CambioCW = PIR3.3
Symbol Desbordamiento = PIR3.2
Symbol Sentido = QEICON.5

INTCON = %11000000 ' activamos las interrupciones y las de periféricos

On_Interrupt GoTo serie
PIE1.5 = 1 ' activamos la interrupción de recepción de la USART

Sentido=0
Desbordamiento=0

TRISD = %00000000

Declare LCD_Type 0          ' Type of LCD Used is Alpha
Declare LCD_DTPin PORTD.4   ' The control bits B4,B5,B6,B7
Declare LCD_RSPin PORTE.0  ' RS pin on B2
Declare LCD_ENPin PORTE.1   ' E pin on B3
Declare LCD_Interface 4     ' Interface method is 4 bit

Declare CCP1_Pin PORTC.2
Declare CCP2_Pin PORTC.1
'------------Variables-------------
 Dim DATO[9]   As   Byte         'arreglo para recibir caracteres del puerto serie
 Dim NUM[9]    As   Byte         'arreglo para interpretar numeros del RS232
 Dim I As Byte
 Dim INDICE    As   Byte         'variable para el index de posicion de datos
 Dim DATOE     As    Byte        'variable para caracter recibido en rs232
 Dim DATOACUM As Dword           'V_ para numero recibido por el RS232
 Dim DATOS As Word
 Dim   mot_pwr  As    Dword      ' set point de posicion
 Dim   recu_pos As    Dword      'para recuperar posicion
 Dim   Upos     As    Word       ' ultima posicion
 Dim   vel      As    Word       'velocidad del motor en pwm
 Dim   pot_val  As    Byte        
 Dim   Posicion As    Word       'posicion real en 16 bits
 Dim   Posicion2 As   Word       'posicion real en 32 bits
 Dim   posH     As    Byte
 Dim   posL     As    Byte
 Dim   posHtem  As    Byte   
 Dim   FreMot  As     Word       'frecuencia para el pwm "motor"
 Dim   a       As     Float      'parametro proporcional del PID
 Dim   b       As     Float      'parametro integral del PID
 Dim   c       As     Float      'parametro derivativo del PID
 Dim   rt      As     Float
 Dim   eT      As     Float
 Dim   iT      As     Float
 Dim   dT2     As     Float
 Dim   yT      As     Dword
 Dim   uT      As     Float      'salida del PID en PWM
 Dim   iT0     As     Float
 Dim   eT0     As     Float
 Dim   vmax    As     Byte       'velocidad maxima del motor en PWM
 Dim   vmin    As     Byte       'velocidad minima del motor en PWM
 Dim   Pantalla As    Byte   
 Dim   sentido2 As    Byte	 
 Dim   Activo   As    Byte
'--------------------
    ANSEL0 = %00000001       'configuracion de E/S analogicas
    ANSEL1 = %00000000            
    TRISA = %00011111        'configuracion de entradas digitales para el encoder
    LATA  = %00000000           
    TRISB = %00000000           
    TRISC = %10010000      
    TRISD = %00000000    
    QEICON = %10011000       'conteo X4, se resetea en 65535 (desborda), sin INDEX     
    PORTC.0 = 0 '1                 
    PORTC.1 = 0 
    PORTD.0 =1                 
Print Cls
Print At 1,1," CARGANDO"
Print At 2,1," PARAMETROS"

DelayMS 10
PORTD.0=0
    
    FreMot = 16000                  'frecuencia para el hpwm
    PORTC.0 = 0                 
    PORTC.3 = 0                           
    Upos=1                                                         
    Posicion= 0                 'variable posicion real       
    Posicion2=0
    POSCNTH = 156                 'para tener un 40000 en posicion
    POSCNTL = 64         
    vmin= 75                   'pwm minimo para el motor
    vmax= 180                   'pwm maximo para el motor
    iT0= 0                     'variable para calulo de termino derivarivo
    eT0= 0                      'variable para calculo del error
    a = 0.50                        'parametro proporcional
    b = 0.0009                       'parametro integral
    c = 0.050                        'parametro derivativo
INDICE=0
DATOE=0
DATOACUM=0
mot_pwr = 40000     'se le asigna una posicion de inicio.
recu_pos=40000
Pantalla = 1        'pantalla de inicio de LCD
sentido2= 0
Activo=0
'*********************************************************************
'********************PROGRAMA PRINCIPAL********************************
'*********************************************************************             
lop:                                                                                           
    GoSub CalPos                'ir a calcular la posicion actual
    
    GoSub calvel               'calcular PWM para el motor
   
    If mot_pwr = yT Then  'se borra el acumulado del error
        iT0=0
        eT0=0
        sentido2 =0
        HPWM 1, 0, FreMot     'no sale PWM por CCP1
        HPWM 2, 0, FreMot       'por CCP2 no sale nada
    EndIf  
   
    If mot_pwr > yT Then  'si set point es mayor que posicion actual                         
        HPWM 1, vel, FreMot     'sale PWM por CCP1
        HPWM 2, 0, FreMot       'por CCP2 no sale nada
    ElseIf mot_pwr < yT Then 'en caso contrario posicion actual > set point
        HPWM 2, vel, FreMot     'no sale nada por CCP1  
        HPWM 1, 0, FreMot       'sale pwm por CCP2
    EndIf                             
   
   ' GoSub lcd                   'muestra informacion en LCD

    GoTo lop                      
 
 End  
' ***********************************************************************************
'*****************FIN PROGRAMA PRINCIPAL*********************************************
'************************************************************************************    
lcd:                            'sub que muestra en lcd
If Pantalla = 1 Then
    Print At 1,1, "p=",Dec5 mot_pwr," v=", Dec3 vel'Dec3 vel  
    Print At 2,1, "R=",Dec5 Posicion ," e=", Dec1 eT
    'HSerOut["pos=", dec yt, "*",13]
    'delayms 10
ElseIf Pantalla = 2 Then
    Print At 1,1, "P",Dec4 a," I", Dec4 b         'Dec3 vel  
    Print At 2,1, "D",Dec4 c ," e=", Dec1 eT
ElseIf Pantalla = 3 Then
    Print At 1,1, "p=",Dec5 mot_pwr," P", Dec3 a'Dec3 vel  
    Print At 2,1, "R=",Dec5 Posicion ," I", Dec4 b
EndIf                                                                                             
Return   
'********************************************************************************** 
CalPos:                        'sub para calcular posicion
    posH = POSCNTH             'registros de posicion del modulo
    posL = POSCNTL             'QEI del micro 
    posHtem = POSCNTH
    If posH - posHtem = 0 Then GoTo Listo
    posH = POSCNTH
    posL = POSCNTL    
Listo:    
    Posicion = 256*posH + posL 'se convierte en 16 bit la pos
    If Desbordamiento = 1  Then
        Desbordamiento= 0
        
        If sentido2 = 1 Then
            Posicion2 =Posicion2 + 1  'SE CONVIERTE EN 32 BITS
            'sentido2 =0
        ElseIf sentido2 =2 Then       
            Posicion2 =Posicion2 - 1
            'sentido2 =0
        EndIf
    EndIf
    yT= 65536 * Posicion2 + Posicion
    Return  
'*******************************************************************************    
'****************************P*I*D**********************************************        
calvel:                  'CALCULO DEL PWM CON PID
    eT = Abs(mot_pwr - yT)'calculo del error
    eT = eT * (360/2000)  'ESCALAMOS: 360 grados es a 2000 pulsos del encoder
    iT = b*eT + iT0       'calculo de valor integral (magnitud del error)
    dT2 = c * (eT - eT0)  'calculo del valor derivativo (tiempo de respuesta)
    uT = iT + a * eT 
    uT = uT + dT2         'valor del PID
    
    If uT> vmax Then      'si la salida del PID es mayor que el valor de PWM
        uT = vmax         'que puedo mandar asignale el valor 255
    Else
        If uT< vmin Then uT=vmin  'PWM minimo que quiero enviar
    EndIf
    vel=uT                'velocidad del motor en PWM
    iT0=iT 
    eT0=eT   
    Return      
    
    
'*********************interrupcion PUERTO SERIE ********************************    
serie:
Context Save
HSerIn [DATOE] ' recibo el caracter de la pc por el rs232
RCSTA.4=0
RCSTA.4=1
 
If DATOE=="y" Then   ' lo que llega por el RS232 es para este micro
   INDICE=0          'EN UN MICRO AQUI LE PONGO "X" Y EN OTRO LE PONGO "Y"
   DelayMS 1
ElseIf DATOE=="x" Or DATOE=="z"  Then 'lo que llega por el RS232 no es
    INDICE=0                           'para este micro
    recu_pos = mot_pwr                 'almaceno la posicion actual
EndIf    

 DATO[INDICE]=DATOE       'se almacena el dato en el arreglo
 INDICE=INDICE+1          'para el siguiente dato incremento el indice

If DATOE== "*"  Then  ' cuando del PC llaga un "*" interpreto el numero que recibi

  If DATO[0]=="y" Then    'TRABAJA ESTE MICRO y no otros en la red
     INDICE=0
     For I=2 To 7      ' guardo los datos en un arreglo
        Select Case DATO[I] 'dato que recibi
            Case 48                 ' es un cero?
                NUM[I]=0           
            Case 49                 ' es un uno?
                NUM[I]=1
            Case 50                 ' es un dos?
                NUM[I]=2
            Case 51                 'creo que ya entendieron....
                NUM[I]=3
            Case 52
                NUM[I]=4
            Case 53
                NUM[I]=5
            Case 54
                NUM[I]=6
            Case 55
                NUM[I]=7
            Case 56
                NUM[I]=8
            Case 57                   ' es un nueve?
                NUM[I]=9
            Case Else    'CUALQUIER OTRO CARACTER LO TOMA COMO CERO "O"
                NUM[I]=0
        End Select 
     Next I
     'aqui determino que numero me enviaron por el PC
     'DATOACUM1=NUM[7] + NUM[6]*10 + NUM[5]*100 + NUM[4]*1000 + NUM[3]*10000 
     DATOACUM = NUM[7]  + NUM[6]*10 
     DATOACUM=DATOACUM  + NUM[5]*100 
     DATOACUM =DATOACUM + NUM[4]*1000
     DATOACUM=DATOACUM  + NUM[3]*10000 
     DATOACUM=DATOACUM  + NUM[2]*100000
    Select Case DATO[1]
        Case "p"                 ' recibio un cambio de posicion
            mot_pwr=DATOACUM
            If mot_pwr > yT Then
                sentido2 = 1
            Else
                sentido2 = 2
            EndIf
        Case "V"                  'recibio un cambio de velocidad maxima
            If DATOACUM > vmin Then
                If DATOACUM > 255 Then
                    vmax = 255
                Else
                    vmax = DATOACUM
                End If 
            EndIf    
         Case "v"                  'recibio un cambio de velocidad minima
            If DATOACUM < vmax Then
                If DATOACUM < 20 Then
                    vmin = 20
                ElseIf DATOACUM > 200 Then
                    vmin =200
                Else
                    vmin = DATOACUM
                End If  
            EndIf                'recibio un cambio de parametro proporcional
         Case "P"
            a = DATOACUM / 10000
         Case "I"                'recibio un cambio de parametro integral
            b = DATOACUM / 10000
         Case "D"                'recibio un cambio de parametro derivativo
            c = DATOACUM / 10000
         Case "q"                'recibio un cambio de pantalla a mostrar en LCD
            If DATO[2]="1" Then
                Pantalla=1
            ElseIf DATO[2]="2" Then
                Pantalla=2
            ElseIf DATO[2]="3" Then
                Pantalla=3
            EndIf
         Case "x"               'envia la posicion actual por rs232
             HSerOut[Dec6 yT]
             DelayMS 10
    End Select    
    
    EndIf       
    
    If DATO[0]=="x" Then      'NO TRABAJA ESTE MICRO EN LA RED 
         RCSTA.4=0
        RCSTA.4=1
        INDICE=0
        mot_pwr=recu_pos     ' para que mantenga la posicion
    EndIf
EndIf

If DATO[0]=="y" Then
  HSerOut[DATOE]             'envio lo que recibo....nomas...
EndIf

INTCON = %11000000
Context Restore
```

mañana les explico lo de cinemática inversa...


----------



## LaElectronicaMeOdia (Dic 3, 2012)

DEPREDADORX1 dijo:


> Excelente proyecto... quedamos a la espera de más información, felicitaciones!
> Quisiera aprovechar este espacio para preguntar.... como siempre... si alguien puede orientarme... han llegado a mis manos 2 displeys nokia 1100 y me ha picado la curiosidad que cómo activarlos, lo curioso es que todo lo que he buscado está hecho en C o CCS, no entiendo bien el lenguaje, además son códigos extensos que no logro descifrar con claridad, en fin, me gustaría poder simular en proteus un mensaje básico y creo que el documento adjunto es un buen punto de partida, pueden ayudarme?



Yo haria la traduccion asi:

```
Trisb=0
Sclk var portb.4
sda  var Portb.5
cs   var portb.6
rst  var portb.7
i    var word
cd   var bit
C    Var Byte

Gosub Lcd_init

Main:
 cd=0:c=$40:gosub Lcd_write    'Y=0
 cd=0:c=$B0:gosub Lcd_write

 cd=0:c=$10:gosub Lcd_write    'X=0
 cd=0:c=$00:gosub Lcd_write
Goto Main

Lcd_Init:
 cs = 0
 rst = 0
 pause 30
 rst = 1
 cd=0:c=$20:gosub Lcd_write
 cd=0:c=$90:gosub Lcd_write
 cd=0:c=$A4:gosub Lcd_write
 cd=0:c=$2F:gosub Lcd_write
 cd=0:c=$40:gosub Lcd_write
 cd=0:c=$B0:gosub Lcd_write
 cd=0:c=$10:gosub Lcd_write
 cd=0:c=$00:gosub Lcd_write
 cd=0:c=$C8:gosub Lcd_write
 cd=0:c=$A1:gosub Lcd_write
 cd=0:c=$AC:gosub Lcd_write
 cd=0:c=$07:gosub Lcd_write
 cd=0:c=$F9:gosub Lcd_write
 cd=0:c=$AF:gosub Lcd_write
 gosub Lcd_Clear
return
 

Lcd_Write:
 sclk = 0
 sda = cd
 sclk = 1
 for i=0 to 7
  sclk = 0
  if c.7 then
   sda = 1
  else
   sda = 0
  endif 
  sclk = 1 
  c=c << 1
 Next
REturn  

Lcd_Clear:
 cd=0:c=$10:gosub Lcd_write
 cd=0:c=$00:gosub Lcd_write
 cd=0:c=$B0:gosub Lcd_write
 For I=0 to 863
  cd=1:c=$00:gosub Lcd_write
 next  
REturn
```



Quizas tenga un error por ahi pero como no tengo un lcd nokia para probarlo
comentanos si no te funciona.

obviamente le faltan los fuses y todos los demas menesteres.


----------



## DEPREDADORX1 (Dic 4, 2012)

Hola  "LaElectronicaMeOdia",

Primero quiero darte las gracias por tu ayuda, manejo muy poco de lenguaje C y nunca hubiera podido descifrar ese código, ahora la simulación parece funcionar en lo que corresponde al arranque y limpieza de la pantalla. Adjunto la simulación con las librerías que San Google me dió y que me permiten la simulación de la pantalla para que, a quien pueda interesarle, de rienda suelta a su creatividad, yo ahora voy a tratar de sacar lo básico, el "Hola mundo".


----------



## arturouc (Dic 4, 2012)

Cinemática inversa
aquí les dejo este pequeño manualito que les acabo de hacer
donde les explico la cinemática inversa del robot que les
mostré en los vídeos anteriores
denme tiempo y les pongo un vídeo utilizando este manual
y la parte de simulación en VB6
también les dejo un simulador hecho en VB6 (.exe) donde
se utiliza esta cinemática para calcular los ángulos
solo le dan un punto en el plano y mover


----------



## LaElectronicaMeOdia (Dic 4, 2012)

> yo ahora voy a tratar de sacar lo básico, el "Hola mundo".



en el documento que pones no lo explica pero supongo que se posiciona y se prende un pixel asi:



> ```
> Main:
> cd=0:c=$40:gosub Lcd_write    'Y=0
> cd=0:c=$B0:gosub Lcd_write
> ...


----------



## DEPREDADORX1 (Dic 4, 2012)

Hola nuevamente,

Si, esa es la idea aunque por lo que he visto en la librería del displey 3310 resulta más práctico con Data, aunque se necesita un código un tanto más complejo para que funcione, voy a continuar apenas pueda y también leer un poco lo que el amigo arturouc nos ha dejado, aunque si me da lata encender una pantallita pues el enconder me sacara canas. Aquí una librería muy completa que pienso seguir de ejemplo. Gracias por la ayuda!


----------



## juanc11 (Dic 10, 2012)

yo tenia ese mismo error pero ya lo estoy solucionando con lo que dicen aquí amigo https://www.forosdeelectronica.com/f24/puede-compliar-picbasic-pro-windows-64-bits-54847/ suerte.


----------



## Dario (Dic 11, 2012)

arturouc dijo:


> Dario
> me equivoque de vídeo este esta mas completo
> http://youtu.be/We4lSWEN0n0
> 
> ...


amigo arturo, gracias por el aporte, apenas me desocupe un poco, me voy a poner a practicar con esto.  muy buen proyecto amigo  saludosss


----------



## reyvilla (Dic 28, 2012)

Hola feliz navidad y felices fiestas a todos, tiempo sin estar por acá, el trabajo me tuvo algo ocupado, en esta ocasión traigo algo que a mi parecer es muy interesante, ademas de útil, una herramienta que me pareció genial desde que empece a utilizarla pensé que no se podía pero lo he logrado. Se trata de realizar una verificación del código en tiempo real con el proteus isis, y con el código en PBP, encontre esta pagina:

http://arectron.com/microchip/micro-code-studio-ile-proteus-isisde-debug-yapma.html#more-297 

donde la persona explica a detalle todo lo necesario para hacerlo les dejo el vídeo y cualquier cosa me avisan saludos.


----------



## DEPREDADORX1 (Dic 29, 2012)

Hola reyvilla,

Que idioma es el del autor?, no tengo idea, parece un buen material de estudio y verificación, si está a tu alcance podrías aclarar los pasos básicos en castellano para los seguidores del foro, me parece excelente poder seguir un programa de esa forma para dar con los errores facilmente.

Suerte!


----------



## reyvilla (Dic 29, 2012)

Hola esta en turco y necesitas el microcode studio versión 3, una versión de pbp que es la 2.6a o superior aparte de MPASMWIN el proteus isis yo tengo la versión 7.8 sp2. Lo primero es tener todo instalado.
Lo demás son configuraciones, la primera en el microcode studio, en el menú ver compiler and program options, allí te vas a la pestaña de assembler y le das a use mpasm y lo localizas en la raíz C:/. Luego de eso en el mismo microcode en el menú VER seleccionas option editor y selecciones la casilla "Use .PBP or .PBC as default extensión on file save" debe estar seleccionada. Después de allí te vas y sigues las imágenes de la pagina que te enseña como configurar el proteus con el PBP. Y cualquier cosa me avisas Saludos

PD: Voy hacer un vídeo pero de la ultima parte y lo subo.


----------



## ferdy575 (Ene 3, 2013)

Hola a todos les deseo un feliz prospero año 2013.
les agradezco sí me pudieran ayudar ando haciendo un circuito sencillo se trata de verificar el estado de 4 interruptores y dar aviso en 3  leds, pero al probar en el proteus funciona bien pero en el protoboard no da señales de salida del ptoB y arrastra partes de un mensaje y los monta sobre el otro les dejo los archivos para que los vean  a ver si me pueden ayudar


----------



## D@rkbytes (Ene 3, 2013)

ferdy575 dijo:


> Hola a todos les deseo un feliz prospero año 2013.
> les agradezco sí me pudieran ayudar ando haciendo un circuito sencillo se trata de verificar el estado de 4 interruptores y dar aviso en 3  leds, pero al probar en el proteus funciona bien pero en el protoboard no da señales de salida del ptoB y arrastra partes de un mensaje y los monta sobre el otro les dejo los archivos para que los vean  a ver si me pueden ayudar


Saludos.
Revise tu código y encontré algunos detalles.
Pruebalo con los cambios realizados y nos comentas si te funciona.
Los cambios los comente en el código.

Feliz y Prospero Año 2013 para todos.


----------



## ferdy575 (Ene 3, 2013)

D@rkbytes dijo:


> Saludos.
> Revise tu código y encontré algunos detalles.
> Pruebalo con los cambios realizados y nos comentas si te funciona.
> Los cambios los comente en el código.
> ...



Excelente gracias Darkbytes funciona de maravilla te agradezco mucho, te deseo un feliz 2013


----------



## ferdy575 (Ene 7, 2013)

hola saludos para todos 
por fa' alguien sabe exactamente que hace la instrucción "Define	LOADER_USED 1" quisiera saber que hace y no encuentro información al respecto, les agradezco su ayuda


----------



## LaElectronicaMeOdia (Ene 7, 2013)

ferdy575 dijo:


> hola saludos para todos
> por fa' alguien sabe exactamente que hace la instrucción "Define	LOADER_USED 1" quisiera saber que hace y no encuentro información al respecto, les agradezco su ayuda



sirve para decirle al compilador que se va a utilizar el boot loader, el boot loader en pocas palabras sirve para que puedas regrabar tu pic sin necesidad de un programador o grabador de pics.


----------



## ferdy575 (Ene 7, 2013)

muy bien y dime como grabarías un pic sin usar el programador como se le cargaría un nuevo código?


----------



## LaElectronicaMeOdia (Ene 7, 2013)

ferdy575 dijo:


> muy bien y dime como grabarías un pic sin usar el programador como se le cargaría un nuevo código?



hay varias formas, puedes diseñar tu propio protocolo, pero lo mas comun es que grabes por ejemplo con el PBP directamente por puerto serial, primero le grabas  un archivo hex que es el que se encarga de autograbarse. 

en este mismo tema se ha comentado al respecto mira:https://www.forosdeelectronica.com/posts/494200/

https://www.forosdeelectronica.com/posts/494352/


----------



## goyete (Ene 12, 2013)

hola buenas,saludos a todos y gracias de antemano.

 estoy intentando hacer el codigo de un montacargas, o ascensor de 2 velocidades
de 4 paradas, y no se que hago mal, cuando hago una llamada, arranca subida y rapida, pero no pasa a lenta, y en bajada arranca en bajada pero no en rapida.

en fin llevo una semana y no hay manera, lo dicho gracias de antemano.

adjunto codigo/y proteus

saludos


----------



## ricbevi (Ene 12, 2013)

goyete dijo:


> hola buenas,saludos a todos y gracias de antemano.
> 
> estoy intentando hacer el codigo de un montacargas, o ascensor de 2 velocidades
> de 4 paradas, y no se que hago mal, cuando hago una llamada, arranca subida y rapida, pero no pasa a lenta, y en bajada arranca en bajada pero no en rapida.
> ...



Hola...Revise un poco el programa y esquema que adjuntaste pero deberías explicarte con detalles cual es el funcionamiento "norma" para tí o sea que quieres que el diseño haga... en cuanto al programa solo para empezar en la rutina INICIO preguntas por el estado de dos pines del puerto b que lo tienes declarado como salida(no como entrada) y están con una resistencia y led a GND así que su estado sera indefectiblemente siempre "0"(¿para que preguntar entonces?). No tomas ningún recaudo para prevenir las señales espurras producto de la conmutación de los pulsadores respectivos y ya después me perdí en lo que quieres hacer cuando pasa algo con los pulsadores.
Amplia lo mas posible la información(tanto en los esquemas, programas, etc) para así facilitarle la tarea a los que queremos ayudarte.

Saludos.

Ric.


----------



## goyete (Ene 13, 2013)

Hola,ricbevi, lo primero gracias por contestar.

Te comento, haber si me se explicar, es un ascensor con 4 pulsadores,(conectados al puerto a, p0,p1,p2,p3) cuando recibe una llamada,depende del pulsador, cargo unos datos en DATP(dato de parada),DATS(datos de pasar a velocidad lenta, cuando sube), DATB(datos de pasar a velocidad lenta cuando baja), con esos datos cargados comparo DATP, que es donde se encuentra el ascen. con el destino(llamada) y asi le digo si tiene que subir o bajar, imajinemos que sube, cundo se encuentre con el dato DATS tiene que caer veloc.rapida y entrar lenta  y con el siguiente pulso que sera DATP, parar, por supuesto cuando esta en marcha no tiene que hacer caso a ninguna llamada.
Bueno eso es lo que intento, te dejo lo que e podido adelanar, a los pulsadores estan como entradas (trisa=%11111),a tambien cuando sube o baja tiene que parpadear el led correspondiente, que en proteus lo tengo como F_sube o F_baja, pero aun no lo he metido en programa.

gracias por molestarte

Saludos


----------



## ricbevi (Ene 13, 2013)

goyete dijo:


> ....
> Bueno eso es lo que intento, te dejo lo que e podido adelanar, a los pulsadores estan como entradas (trisa=%11111)...



En este lazo de tu programa al comienzo donde esta la rutina INICIO

```
trisa=%11111
trisb=%00001100


symbol p0=porta.0
symbol p1=porta.1
symbol p2=porta.2
symbol p3=porta.3
symbol paro=porta.4
symbol fles=portb.0
symbol fleb=portb.1
symbol pulsS=portb.2
symbol pulsB=portb.3
symbol motora=portb.4
symbol motorb=portb.5
symbol motorr=portb.6
symbol motorl=portb.7
...


INICIO:
   if p0=0 and motorb=0 or motora=0 then dato0              
   if p1=0 and motorb=0 or motora=0 then dato1            
   if p2=0 and motorb=0 or motora=0 then dato2              
   if p3=0 and motorb=0 or motora=0 then dato3                
   goto inicio
```
Preguntas por el estado de  "motorb=0" y "motora=0" para tomar una desicion pero estos se encuentran en el puerto B que lo tienes declarados como "trisb=%00001100" como salida....si el compilador entendiera lo que quieres hacer y los pasara a entrada los mismos en el circuito están con un led y resistencia a GND así que te reitero siempre su estado seria "Bajo" o "0" lógico como quieras llamarlo ya que no reciben alimentación alguna.
Si quieres saber el estado de los motores crea una bandera o "Flag" y ponla cuando enciendas los mismos a cero si están parados o a uno si están en marcha y en base a  eso actuás en consecuencia.

Ric.


----------



## goyete (Ene 14, 2013)

Deacuerdo, voy a hacerlo como dices, ya te comentare.

gracias y un saludo.


----------



## goyete (Ene 17, 2013)

Buenas, necesito de una entrada, detectar el flanco ascendente, como seria la manera de programarlo, si alguien seria tan amable de poner algun ejemplo, lo agradeceria.

Gracias


----------



## alejo278 (Feb 2, 2013)

que necesitas hacer con el detector de flancos ascendentes?


----------



## isaiasjea (Feb 19, 2013)

Hola buenas tardes
Primero que nada una gran felicitación a todos los compañeros del foro, por compartir y ayudar a mantener este gran foro.
quiero hacer un contador de 2 Display 7 segmentos con la posibilidad de añadir hasta otros 2 mas pero con 2 ahorita seria bueno para un modo de aprendizaje.
el asunto es que no lo quiero hacer el Pic16F628A directo al display 7 segmentos






Tampoco con un decodificador 7447





la Forma que me gustaría hacerlo es con un Conversor Serial Paralelo 74HC164





de esa manera solo necesitamos usar 2 pines del Microcontrolador.
Por Favor si alguien me pudiera orienta o ayudar se lo agradeceria de todo corazon
Mientras yo sigo investigando mas a fondo
Gracias y seguimos en contacto


----------



## ferdy575 (Feb 19, 2013)

hola a todos, ando realizando pruebas para trabajar con servos pues me quiero hacer un brazo y empece con este programita pero no se que me que me quedo mal, al probarlo en el proteus funciona de maravilla pero al probarlo en el protoboard el servo solo hace ruidos y no avanza, alguien que me le de una miradita a ver que está mal por favor...
este es el código:

```
'****************************************************************
'*  Name    : control servo                                                                               *
'*  Notes   : con 16f628a                                                                                 *
'*  Mode    : con pulsadores                                                                             *
'****************************************************************

@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 
@ DEVICE pic16F628A, WDT_ON 

 
 centro VAR BYTE
 derecha var porta.0
 izquierda var porta.1
 centrar var porta.2
 salida var portb.1
 
 
trisb=0
PORTB=0

centro=150 'inicio variable en 150 
inicio:
pulsout salida,centro  
gosub pulsadores    
goto inicio

pulsadores:
if  centrar=0 then gosub centrado
if derecha=0 then gosub DER
if izquierda=0 then gosub IZQ
return

centrado:
pause 100
centro=150 
return

DER:
pause 100
centro=centro+1
return

IZQ:
pause 100
centro=centro-1
return
end
```


----------



## alejo278 (Feb 19, 2013)

Hola isaiasjes...
Si no te quieres complicar con mas integrados fuera del PIC, puedes utilizar el PUERTOB para manejar los siete segmentos de los display y el pin restante lo utilizas como entrada de pulsos y lo haces multiplexado (un display por cada pin del PUERTOA) con lo que puedes manejar 5 display en forma normal u ocho con el oscilador interno


----------



## isaiasjea (Feb 19, 2013)

Hola alejo278!!
muchas gracias por tu recomendación!!
el punto es que me gustaria hacerlo de la forma que te comento anteriormente mas que nada para ampliar los conocimientos y tener diversas opciones.
la forma del Conversor Serial Paralelo 74HC164 se me hace un buen reto para lograr


----------



## D@rkbytes (Feb 19, 2013)

isaiasjea dijo:


> la forma del Conversor Serial Paralelo 74HC164 se me hace un buen reto para lograr


No es nada complicado, yo lo hice en ensamblador y no es difícil.
Y con las funciones predeterminadas de PBP es aún más fácil de hacerlo.
Las palabras clave para lograrlo en PICBasic, son:
*DIG, **LookUp* y *ShiftOut*

Con *DIG* obtienes las unidades, decenas, centenas etc.
Con *LookUp* conviertes el resultado de *DIG* a código de 7 segmentos.
Y con *ShiftOut* envías los datos hacia los registros de desplazamiento.

Inténtalo no tiene complicaciones. 

Suerte.


----------



## isaiasjea (Feb 19, 2013)

> No es nada complicado, yo lo hice en ensamblador y no es difícil.
> Y con las funciones predeterminadas de PBP es aún más fácil de hacerlo.
> Las palabras clave para lograrlo en PICBasic, son:
> DIG, LookUp y ShiftOut
> ...



Excelente D@rkbytes!!!
es lo que pretendo hacer lo mismo pero en picbasicpro!!
con los tips que me proporcionaste voy a hacer un Código haber que tal me va!!!
los avances los voy ir Posteando 
Gracias y seguimos en contacto.


----------



## isaiasjea (Feb 19, 2013)

Buenas noches!!
Aquí las primeras pruebas que hice para aprender y conocer la Función (*shiftout*)

```
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device  pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                               'Comparadores Apagados
TRISB = 0                               'Puerto B Como Salidas
PORTB = 0                               'Limpiamos el Puerto B
'*******************************************************************************
CLOCK VAR PORTB.0                       'PORTB.0 con el nombre CLOCK
DATO_0 VAR PORTB.1                      'PORTB.1 con el nombre DATA_0
'*******************************************************************************
CLOCK=1                                 'Valor 1 para inicio del display
'*******************************************************************************
INICIO:                                 'Etiqueta de inicio
shiftout DATO_0,CLOCK,0,[252]           'Enviando el Numero 0
PAUSE 500                               'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[96]            'Enviando el Numero 1
PAUSE 500                               'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[218]           'Enviando el Numero 2
PAUSE 500                               'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[242]           'Enviando el Numero 3
PAUSE 500                               'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[102]           'Enviando el Numero 4
PAUSE 500                               'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[182]           'Enviando el Numero 5
PAUSE 500                               'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[190]           'Enviando el Numero 6
PAUSE 500                               'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[224]           'Enviando el Numero 7
PAUSE 500                               'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[254]           'Enviando el Numero 8
PAUSE 500                               'Espera de 500 milisegundos
shiftout DATO_0,CLOCK,0,[246]           'Enviando el Numero 9
PAUSE 500                               'Espera de 500 milisegundos
GOTO INICIO                             'Regresar a la etiqueta inicio
END                                     'Fin del Programa
```

ahora el segundo paso es añadir 2 0 3 display más para agregar los botones , y usar la funciones *DIG, LookUp*
les dejo la Simulación funcionando.
Gracias y Seguimos en contacto.

Segundo Ejemplo Usando *LookUp* Código:

```
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device  pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                          'Comparadores Apagados
TRISB = 0                          'Puerto B Como Salidas
PORTB = 0                          'Limpiamos el Puerto B
'*******************************************************************************
CLOCK VAR PORTB.0                  'PORTB.0 con el nombre CLOCK
DATO_0 VAR PORTB.1                 'PORTB.1 con el nombre DATA_0
dir var byte
dato var byte
'*******************************************************************************
CLOCK=1                            'Valor 1 para inicio del display
'*******************************************************************************
prog:
FOR dir=0 TO 9                     'para repeticiones de 0 a 9
LOOKUP dir,[252,96,218,242,102,182,190,224,254,246],dato 'toma uno por uno cada
                   'valor de la tabla constante y lo guarda en la variable dato
shiftout DATO_0,CLOCK,0,[dato]     'Enviando el Numero Segun el valor del conteo 
pause 500                          'Espera de 500 milisegundos
next dir                           'Seguir con el conteo de la variable
goto prog                          'Regresar a la etiqueta inicio
end                                'Fin del Programa
```

como verán el Código se redujo bastante y también la memoria así que recomiendo el segundo.
Seguimos trabajando ahora para hacerlo con 3 a 4 dígitos ya cada  ves mas Cerca del objetivo. 
Saludos y seguimos en contacto.
dejo la Simulación y 2 Archivos para que lo puedan probar y editar.


----------



## isaiasjea (Feb 20, 2013)

> hola a todos, ando realizando pruebas para trabajar con servos pues me quiero hacer un brazo y empece con este programita pero no se que me que me quedo mal, al probarlo en el proteus funciona de maravilla pero al probarlo en el protoboard el servo solo hace ruidos y no avanza, alguien que me le de una miradita a ver que está mal por favor...
> este es el código:
> 
> ```
> ...



Buenas Noches ferdy575!!

ya cheque tu Código y tenias algunas cosas que te faltaron como asignar los RA0,RA1,RA2 entradas
ya modifique el Código para que pruebes en el simulador y posteriormente grabando en el PIC16F628A:

```
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device  pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                               'Comparadores Apagados
TRISA = %00000111                       'Puerto RA0,RA1,RA2 Entradas Digitales
TRISB = 0                               'Puerto B Como Salidas
PORTA = 0                               'Limpiamos el Puerto A
PORTB = 0                               'Limpiamos el Puerto B
'*******************************************************************************
derecha var porta.0
izquierda var porta.1
centrar var porta.2
salida var portb.1
centro var byte 
'*******************************************************************************
centro=150 'inicio variable en 150 
'*******************************************************************************
inicio:
pulsout salida,centro  
gosub pulsadores    
goto inicio

pulsadores:
if  centrar=0 then gosub centrado
if derecha=0 then gosub DER
if izquierda=0 then gosub IZQ
return

centrado:
pause 100
centro=150 
return

DER:
pause 100
centro=centro+1
return

IZQ:
pause 100
centro=centro-1
return
end
```

Saludos y seguimos en contacto.


----------



## ferdy575 (Feb 20, 2013)

isaiasjea dijo:


> Buenas Noches ferdy575!!
> 
> ya cheque tu Código y tenias algunas cosas que te faltaron como asignar los RA0,RA1,RA2 entradas
> ya modifique el Código para que pruebes en el simulador y posteriormente grabando en el PIC16F628A:
> ...



Excelente gracias por tu ayuda


----------



## isaiasjea (Feb 20, 2013)

Buenas tardes!!
Finalmente termine el contador de 3 display 7 segmentos controlados por 1 PIC16F628A y 3 74LS164 o 74hc164 y 2 botones uno Incremental y el otro decremental.

```
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device  pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                             'Comparadores Apagados
TRISA = %00000011                     'Puerto RA0 RA1 Como Salidas                       
TRISB = 0                             'Puerto B Como Salidas
PORTA = 0                             'Limpiamos el Puerto A
PORTB = 0                             'Limpiamos el Puerto B
'*******************************************************************************
CLOCK VAR PORTB.0                     'PORTB.0 con el nombre CLOCK
DATO_0 VAR PORTB.1                    'PORTB.1 con el nombre DATA_0
BANDERA VAR BIT                       'Variable Bandera
CONTEO VAR word                       'Variable Conteo
UNIDAD var byte                       'Variable Unidad
DECENA var byte                       'Variable Decena
CENTENA var byte                      'Variable Centena
'*******************************************************************************
CONTEO = 0                            'Limpiamos la variable   
unidad = 0                            'Limpiamos la variable
decena = 0                            'Limpiamos la variable
centena = 0                           'Limpiamos la variable
shiftout DATO_0,CLOCK,0,[252,252,252] 'Enceramos los Display
'*******************************************************************************
INICIO:                               'Etiqueta de inicio
if PORTA.1 = 0 THEN SUMAR             'Si apretamos el boton incrementar 
if PORTA.0 = 0 THEN Restar            'Si apretamos el boton decrementar 
BANDERA = 0                           'Enceramos la variable Bandera
GOTO INICIO                           'regresamos a la etiqueta inicio
'*******************************************************************************
SUMAR:                                'Etiqueta Sumar
IF BANDERA = 1 THEN GOTO INICIO       'Si la variable Bandera tiene un valor 1
BANDERA = 1                           'le cargamos la variable Bandera valor 1
CONTEO = CONTEO+1                     'El valor de la variable conteo + 1
if conteo > 999 then conteo = 0       'Si Conteo es mayora a 999 conteo sera 0 
unidad = conteo dig 0                 'unidad tomara el primer digito de conteo
decena = conteo dig 1                 'decena tomara el segundo digito de conteo
centena= conteo dig 2                 'centena tomara el tercer digito de conteo
goto ENVIAR                           'ir a la etiqueta enviar
'*******************************************************************************
RESTAR:                               'Etiqueta Restar
IF BANDERA = 1 THEN GOTO INICIO       'Si la variable Bandera tiene un valor 1
BANDERA = 1                           'le cargamos la variable Bandera valor 1
if conteo = 0 then conteo = 1000      'si conteo es igual a 0 conteo sera 1000
CONTEO = CONTEO-1                     'El valor de la variable conteo - 1
unidad = conteo dig 0                 'unidad tomara el primer digito de conteo
decena = conteo dig 1                 'decena tomara el segundo digito de conteo
centena= conteo dig 2                 'centena tomara el tercer digito de conteo
goto enviar                           'ir a la etiqueta enviar
'*******************************************************************************
ENVIAR:                               'Etiqueta Enviar
if unidad = 0 then unidad = 252       'Si unidad es 0 unidad sera 252
if unidad = 1 then unidad = 96        'Si unidad es 1 unidad sera 96
if unidad = 2 then unidad = 218       'Si unidad es 2 unidad sera 218
if unidad = 3 then unidad = 242       'Si unidad es 3 unidad sera 242
if unidad = 4 then unidad = 102       'Si unidad es 4 unidad sera 102
if unidad = 5 then unidad = 182       'Si unidad es 5 unidad sera 182
if unidad = 6 then unidad = 190       'Si unidad es 6 unidad sera 190
if unidad = 7 then unidad = 224       'Si unidad es 7 unidad sera 224
if unidad = 8 then unidad = 254       'Si unidad es 8 unidad sera 254
if unidad = 9 then unidad = 246       'Si unidad es 9 unidad sera 246
'*******************************************************************************
if decena = 0 then decena = 252       'Si decena es 0 decena sera 252
if decena = 1 then decena = 96        'Si decena es 1 decena sera 96
if decena = 2 then decena = 218       'Si decena es 2 decena sera 218
if decena = 3 then decena = 242       'Si decena es 3 decena sera 242
if decena = 4 then decena = 102       'Si decena es 4 decena sera 102
if decena = 5 then decena = 182       'Si decena es 5 decena sera 182
if decena = 6 then decena = 190       'Si decena es 6 decena sera 190
if decena = 7 then decena = 224       'Si decena es 7 decena sera 224
if decena = 8 then decena = 254       'Si decena es 8 decena sera 254
if decena = 9 then decena = 246       'Si decena es 9 decena sera 246
'*******************************************************************************
if centena = 0 then centena = 252     'Si centena es 0 centena sera 252
if centena = 1 then centena = 96      'Si centena es 1 centena sera 96
if centena = 2 then centena = 218     'Si centena es 2 centena sera 218
if centena = 3 then centena = 242     'Si centena es 3 centena sera 242
if centena = 4 then centena = 102     'Si centena es 4 centena sera 102
if centena = 5 then centena = 182     'Si centena es 5 centena sera 182
if centena = 6 then centena = 190     'Si centena es 6 centena sera 190
if centena = 7 then centena = 224     'Si centena es 7 centena sera 224
if centena = 8 then centena = 254     'Si centena es 8 centena sera 254
if centena = 9 then centena = 246     'Si centena es 9 centena sera 246
shiftout DATO_0,CLOCK,0,[unidad,decena,centena] 'Enviando Numero de la variables 
goto inicio                           'ir a la etiqueta inicio
END                                   'Fin
```





aqui ´les dejo la simulacion y los archivos para que lo puedan modificar
Gracias y seguimos en contacto


----------



## D@rkbytes (Feb 20, 2013)

isaiasjea dijo:


> Finalmente termine el contador de 3 display 7  segmentos controlados por 1 PIC16F628A y 3 74LS164 o 74hc164 y 2 botones  uno Incremental y el otro decremental.


Felicidades!!, desde que vi tus primeras pruebas supe que lo lograrías. 
Bien, como ya lo pudiste hacer, entonces ahora puedo subir mi programa.
Notarás que la programación es diferente y más simplificada para llegar al mismo objetivo.

Suerte.


----------



## isaiasjea (Feb 20, 2013)

> Notarás que la programación es diferente y más simplificada para llegar al mismo objetivo.


Excelente D@rkbytes!!!
Gracias por darme una manita y excelente tu Código usando Tablas.
Saludos y seguimos en contacto.


----------



## ferdy575 (Feb 20, 2013)

isaiasjea dijo:


> Buenas Noches ferdy575!!
> 
> ya cheque tu Código y tenias algunas cosas que te faltaron como asignar los RA0,RA1,RA2 entradas
> ya modifique el Código para que pruebes en el simulador y posteriormente grabando en el PIC16F628A:
> ...



hola isaiasjea hoy tuve la oportunidad de probar el código que me revisaste pero igualmente siguen sin funcionarme los servos hasta creí que estaban malos pero los probé con un 555 y funcionan perfectamente no logro encontrar por que me estará fallando este código por fa ayúdame
ó si puedes sugiereme otro código que haga lo mismo...gracias...


----------



## elaveriguador (Feb 20, 2013)

mecatrodatos dijo:


> Que tal amigos uno de los lenguajes mas facil para programar micros es el basic pro sin despreciar el C por lo que abierto este hilo para empezar a ejecutar programas sencillos hasta llegar a los mas complejos.
> 
> miren lo facil que es prender un led con un pic 16f84A :
> 
> ...





buenas noches hermano
hermano ya que le veo cierto entuciasmo me podria usted decier o esplicarme como tomo el voltaje de referencia del pic para un conversol analogico digital adc para suministrarlo al sensor en cuestion ya que no entiendo muy bien lo que presenta la hoja de datos del pic para construir el diseño en proteus de la pcb me refiero a la medicion de temperaturas


----------



## isaiasjea (Feb 21, 2013)

> estará fallando este código por fa ayúdame



Buenas Dias ferdy575
lo que pasa es que te esta faltando el tren de pulsos para que lo puedas posicionar.







```
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device  pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                               'Comparadores Apagados
TRISB = %00000110
PORTB = 0
'*******************************************************************************
Control var portb.0
incrementar var portb.1
disminuir var portb.2
x var byte
r var byte
x = 150

inicio:
pulsout control,x
gosub timer
goto inicio

timer: 
if incrementar = 0 then gosub mas
if disminuir = 0 then gosub menos
return

mas:
pause 10
x=x+1
if x > 250 then x = 250
return

menos:
pause 10
x=x-1
if x < 50 then x = 50
return
end
```
te dejo la simulacion y los archivos para que los pruebes
este codigo esta probado en un PIC16F628A real y trabaja sin problemas.
Saludos y seguimos en contacto.


----------



## ferdy575 (Feb 21, 2013)

isaiasjea dijo:


> Buenas Dias ferdy575
> lo que pasa es que te esta faltando el tren de pulsos para que lo puedas posicionar.
> http://s5.postimage.org/8n87mq7gn/Motor_Servo_posiciones.gif
> 
> ...



excelente funciona perfectamente y agradezco mucho tu colaboración


----------



## isaiasjea (Feb 22, 2013)

> excelente funciona perfectamente y agradezco mucho tu colaboración


Un placer poderte ayudar!!
Saludos y seguimos en contacto


----------



## DEPREDADORX1 (Feb 22, 2013)

Hola a todos,

agregando al contador de isaiasjea la interrupción externa b0 y desborde por timer1, junto a un pequeña modificación en la simulación en proteus,  es posible convertir el contador en una especie de velocímetro o cuentavueltas segun se necesite, en la simulación parece funcionar pero publico la modificación a ver que opinan ustedes.


```
;*******************************************************************************
; Programa: Contador.pbp
; Versión: 1.0
; VELOCIMETRO en base a  Contador de 3 digitos y displays de 7 segmentos (0-999)
; controlando 3 74XS164 de D@rkbytes
;*******************************************************************************
@ DEVICE PIC16F628a	; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,WDT_OFF,PWRT_ON,BOD_OFF,LVP_OFF
;*******************************************************************************
DEFINE OSC 4				; Definir que se trabajará con 4MHz.
Include "MODEDEFS.BAS"      ; Incluir definiciones del modo serial

CMCON = 7					; Comparadores analógicos OFF
TRISA = %11111100
PORTA = TRISA

TRISB = %00000001
PORTB = 0

; Nombres para los pines
Symbol SCL_Pin  = PORTA.0
Symbol SDA_Pin  = PORTA.1
Symbol T1CKPS1   = T1CON.5      'Preescaler para timer1
Symbol T1CKPS0   = T1CON.4      'Preescaler para timer1
Symbol T1OSCEN   = T1CON.3      'Bit de habilitación del Oscilador 
Symbol TMR1CS    = T1CON.1      'Bit selección clock de trabajo (1=clock externo por portc.0, 0=clock interno)
Symbol TMR1ON    = T1CON.0      'Bit de habilitación para el timer1 (1=On, 0=Off)
Symbol TMR1IE    = PIE1.0       'interrupción por timer1
Symbol TMR1IF    = PIR1.0       'bandera desborde tmr1
Symbol GIE       = INTCON.7
Symbol PEIE      = INTCON.6
Symbol INTE      = INTCON.4
Symbol INTF      = INTCON.1
Symbol INTEDG    = OPTION_REG.6
Symbol LED3      = PORTB.3
;----

; Declaración de variables
KILOMETRAJE VAR WORD
Counter VAR Word
Dsp1    VAR Byte
Dsp2    VAR Byte
Dsp3    VAR Byte
Index   VAR Byte
;{{{{{
 ; Declaración de variables
 T  VAR Byte
 X  VAR Byte
TIMER1 VAR Word
PRECARGA  VAR Word
INTB0   VAR Byte
;}}}}

 PRECARGA=40536             ' Valor obtenido con la calculadora RRPicTimerCalculator  para que salte el timer1 cada 100ms
 TMR1H=PRECARGA.HighByte    ' Precargamos el timer1 inicialmente 
 TMR1L=PRECARGA.LowByte

 
 On Interrupt GoTo interrupcion '  En caso de interrupción ir a subrutina interrupción
 INTCON=%10010000               '  el bit 7 habilita las interrupciones en general
                                '  El bit 4 habilita la  interrupción B.0 
  T1CON=%00001101               '  Timer1 on, incremento por Osc interno  
  

Clear       ; Inicializar variables a 0 (Limpiar RAM)
; Mandar ceros en formato 7 segmentos a los registros de desplazamiento.
ShiftOut SDA_Pin,SCL_Pin,LSBFIRST,[$FC,$FC,$FC]

MainProgram:

    Gosub   Tabla                       ; Ir a las tablas de conversión
    
    GoTo MainProgram
   
   interrupcion: 
                 
  If INTF=1 Then    INTB0=INTB0+1   ' Contamos los giros que da la rueda
  INTE=1                            ' Habilitar la interrupción nuevamente
  INTF=0                            'Borrar la bandera de int B.0
  
  Resume                     ' Retorna al programa donde ocurrió la interrupción 
  Enable                     ' Habilita las interrupciones después del handler 
  END
Tabla:
; Subrutina de conversión para código de 7 segmentos cátodo común.
    Index = Counter DIG 0   ; Tomamos las unidades
    LookUp Index,[$FC,$60,$DA,$F2,$66,$B6,$BE,$E0,$FE,$F6],Dsp1

    Index = Counter DIG 1   ; Tomamos las decenas
    LookUp Index,[$FC,$60,$DA,$F2,$66,$B6,$BE,$E0,$FE,$F6],Dsp2

    Index = Counter DIG 2   ; Tomamos la centenas
    LookUp Index,[$FC,$60,$DA,$F2,$66,$B6,$BE,$E0,$FE,$F6],Dsp3
; Mandamos los datos hacia los registros de desplazamiento.   
    ShiftOut SDA_Pin,SCL_Pin,LSBFIRST,[Dsp1,Dsp2,Dsp3]
    Return
```


----------



## speliur (Feb 24, 2013)

hola buenos dias, espero puedan solucionar mi duda, a todos los integrantes del foro les pido ayuda respecto al funcionamiento de un sensor IR sharp 2Y0A21 analogico para poderlo manipular por medio de un microcontrolador 16f877A programado en picbasic pro, y tambien como configurar este pic para utilizar el oscilador interno, es para un proyecto de robotica de competencia, muchas gracias...


----------



## ferdy575 (Feb 25, 2013)

speliur dijo:


> hola buenos dias, espero puedan solucionar mi duda, a todos los integrantes del foro les pido ayuda respecto al funcionamiento de un sensor IR sharp 2Y0A21 analogico para poderlo manipular por medio de un microcontrolador 16f877A programado en picbasic pro, y tambien como configurar este pic para utilizar el oscilador interno, es para un proyecto de robotica de competencia, muchas gracias...



Hola mira el datasheet de este pic no tiene oscilador interno.


----------



## torres.electronico (Mar 1, 2013)

DEPREDADORX1 dijo:


> Hola a todos,
> 
> agregando al contador de isaiasjea la interrupción externa b0 y desborde por timer1, junto a un pequeña modificación en la simulación en proteus,  es posible convertir el contador en una especie de velocímetro o cuentavueltas segun se necesite, en la simulación parece funcionar pero publico la modificación a ver que opinan ustedes.
> 
> ...



No te quiero pinchar el globo, pero el problema de los velocimetros o cuenta vueltas de "vehiculos" que implementan display 7 segmentos, es malisima la visualizacion de los valores... mas aun cuando hay una histeresis, producto del ciclo o loop del programa... se entiende? no esta mal la idea de implementar la interrupcion por hardware mas un timer...fijate que ya lo mencione anteriormente aca, en un tema similar al tuyo....


----------



## DEPREDADORX1 (Mar 1, 2013)

Hola torres.electrico,

Pues es una lástima que no funcione bien, yo nunca lo he implementado y ahora menos lo haré, sinembargo me parece haber visto uno hecho en assembler que funcionaba y tenía un video en youtube, al menos eso parece.  En fin, si surge una idea para ese proyecto publicala pues sería fabuloso hacerlo.

Suerte y gracias por el comentario.


----------



## torres.electronico (Mar 1, 2013)

DEPREDADORX1 dijo:


> Hola torres.electrico,
> 
> Pues es una lástima que no funcione bien, yo nunca lo he implementado y ahora menos lo haré, sinembargo me parece haber visto uno hecho en assembler que funcionaba y tenía un video en youtube, al menos eso parece.  En fin, si surge una idea para ese proyecto publicala pues sería fabuloso hacerlo.
> 
> Suerte y gracias por el comentario.



Hola, ya esta planteado con un display 16x2 y hasta la funcion de corte RPM... el problema de los display 7 segmentos, es la visualizacion por ejemplo en una aclerada brusca... si estas contando las RPM, el ojo en vista panoramica no alcanza a distinguir bien los numeros y se leen inconcientemente mas ochos que otra cosa... distinto a mirarlo fijo, ahi se ve una pequeña oscilacion final, pero se puede ajustar con programacion...
Ojo, en elm display LCD no cambia mucho el tema de la oscilacion... pero se ve un poco mas claro


----------



## DEPREDADORX1 (Mar 2, 2013)

Saludos,

Siguiendo entonces con el tema, para un velocímetro lo mejor es no hacerlo con pic?
Entonces no tenemos precisión de tiempo aunque utilicemos una fuente de clock externa, que se puede hacer ante este problema...

Yo tenía planeado construirme tanto el velocímetro como un pirómetro, al menos por acá se le conoce con ese nombre, utilizado para los hornos de vitrofusión para controlar las curvas de temperatura. Si no existe la manera de tener un tiempo preciso que opciones usar.

Suerte a todos.


----------



## xdarkhawk (Mar 3, 2013)

Tengo que realizar un proyecto con Pic 12f509, pero realizando unas pruebas, con proteus y todo esto.

Al momento de ver los nombres de los pines en proteus, sus "ports" se llaman GP, pero al momento de colocar portgp.0, portgp.1 no funciona. He intentado con porta y portb pero nada ademas en el proteus sale como 12c509 espero tu respuesta


----------



## D@rkbytes (Mar 3, 2013)

xdarkhawk dijo:


> Al momento de ver los nombres de los pines en proteus, sus "ports" se llaman GP, pero al momento de colocar portgp.0, portgp.1 no funciona. He intentado con porta y portb pero nada ademas en el proteus sale como 12c509 espero tu respuesta


El nombre del puerto en los PIC12 se llama GPIO
GPIO.0
GPIO.1
GPIO.2
Etc.
Ó GPIO = Valor ; (%Binario, Decimal y $Hexadecimal)
Para la configuración de entradas y salidas, es TRISIO
TRISIO.0
TRISIO.1
TRISIO.2
Etc.
Ó TRISIO = Valor ; (%Binario, Decimal y $Hexadecimal)

En Proteus te sirve igual el 12C509A, la letra F (Flash) significa que el PIC es reprogramable.
Los PIC con letra C, son PIC's OTP (One Time Programmable) solo los puedes grabar una vez.

Suerte.


----------



## yitzensk (Mar 4, 2013)

'¿que instruccion en pic basic puedo usar para contar 5 minutos y me mantenga en high un puerto' se los agradeceria mucho


----------



## torres.electronico (Mar 5, 2013)

DEPREDADORX1 dijo:


> Saludos,Siguiendo entonces con el tema, para un velocímetro lo mejor es no hacerlo con pic?



No no no no  Yo no dije en ningun momento que no es mejpor hacerlo con un micropic... Yo lo que mencione, es que implementar un display 7 segmentos para un velocimetro de "automovil", no es lo recomendado por la visualizacion...



DEPREDADORX1 dijo:


> Yo tenía planeado construirme tanto el velocímetro como un pirómetro, al menos por acá se le conoce con ese nombre, utilizado para los hornos de vitrofusión para controlar las curvas de temperatura. Si no existe la manera de tener un tiempo preciso que opciones usar.



El pirometro si es factible realizarlo con un display 7 segmentos, ya que la curva de temperatura, no es brusca... Es el proyecto mas sencillo que hay con display 7 segmentos... Estoy navegando desde el telefono celular por que no estoy en mi casa hasta el 19 de marzo, asi que acá te dejo un ejemplo y ma adelante cuando llegue, lo subo acá como corresponde:

*C*uando nos vemos en la necesidad de hacer una conversion de Binario a Decimal, *picbasic pro* inclye un operador que puede ser empleado para este proposito... El operador *DIG* (mal llamado comando); El operador *DIG*   devuelve el valor de un dígito decimal . Simplemente se le indica el   número de dígito a conocer ( 0 - 4 , siendo 0 el primero de la derecha) y   ya está. 
Dicho de otra manera, para deglosar el valor binario y extraer el valor   deseado, hay que especificar con el numero de digito siguiente de la   variable a la que vas a extraer el digito... Suponiendo que solo quieres   que extraiga el segundo valor, tienes que poner el bit 1 logicamente, y   te funcionara, si quieres el tercer valor tienes que poner el bit2 y   asi sucesvamente. 
Acordate que el operador funciona de la siguiente forma : 

*Variable = DIG Value , Digit number* 

__donde variable es es la variable donde guardara el valor extraido 
_DIG es el comando 
_Value es el valor o la variable de donde vas a extraer el digito 
_y numero digito es el BIT que quieres extraer de Value_ 

Un ejemplo sencillo: 

*B0 = 123* _;setea B0 en 123_ 
*B1 = B0 DIG 1* _;setea B1 en 2 (dígito 1 de 123)_ 

Veamos un ejemplo practico, en el cual transformamos el valor  binario a decimal empleando el operador DIG. 
Los  fuses tendrian que modificarlos a sus gusto y aplcacion; A esto  sumale que necesitaras un 7447 para decodificar  la salida del pic y  obtener la multiplexacion a los display 7  segmentos....  

*Rutina Sensor Temperatura Display 7Segmentos:
* 
DEFINE ADC_BITS 8         
 DEFINE ADC_CLOCK 3     
 DEFINE ADC_SAMPLEUS 50 

 Adc VAR BYTE 
 Temp VAR WORD 
 unid VAR BYTE 
 dece VAR BYTE 
 cent VAR BYTE 

 TRISA = 11111  
 TRISB = 000000           ;configuramos todo el puerto B como salida 

ADCON1 = 001000 ; Chequea esta configuracion por que varia segun micro 

Inicio: 
   ADCIN 0,Adc 
   Temp = Adc*150/77 
   unid = Temp DIG 0  
   PORTB = unid + 224 
   Pause 5 
   dece = Temp DIG 1 
   PORTB = dece + 208 
   Pause 5 
   cent = Temp DIG 2 
   PORTB = cent + 176 
   Pause 5 
 GoTo Inicio 





Video: 




(extraido de http://www.picbasic.co.uk/forum/con...8Binary-to-Decimal-conversion%29-en-Espa%F1ol  ahi podes descargar el hex y archivo proteus)

PD: Estimadisimo amigo moderador.... quiero pensar que no lo vas a tomar como spam el tema...¿verdad? saludos


----------



## DEPREDADORX1 (Mar 5, 2013)

Hola torres,

Ah.... gracias por la aclaración, ya había utilizado el Dig pero con proton, sinembargo ahora recuerdo haber armado algo básico en protoboard y haber tenido problemas en la visualización así como comentas uhm... lo que si me inquieta es como ajustar con más precisión los tiempos pues me parece muy crítico que uno se dé al trabajo de armar algo y si es, quizás en un futuro, para comercializar, salga con fallas o inprecisiones se lleva al traste el esfuerzo, tomemos por ejemplo el código que expuse anteriormente, basado también en ejemplos de aquí y otros espacios como éste, me tomó varios días cuadrarle, digamos que eliminamos en problema de visualización que no es tan grave, entonces que hago si resulta que los datos arrojados son inexactos, a mi forma de ver es un gran dilema. 

Bueno, mil gracias por atender estas inquietudes.


----------



## torres.electronico (Mar 5, 2013)

DEPREDADORX1 dijo:


> Hola torres,
> 
> Ah.... gracias por la aclaración, ya había utilizado el Dig pero con proton, sinembargo ahora recuerdo haber armado algo básico en protoboard y haber tenido problemas en la visualización así como comentas uhm... lo que si me inquieta es como ajustar con más precisión los tiempos pues me parece muy crítico que uno se dé al trabajo de armar algo y si es, quizás en un futuro, para comercializar, salga con fallas o inprecisiones se lleva al traste el esfuerzo, tomemos por ejemplo el código que expuse anteriormente, basado también en ejemplos de aquí y otros espacios como éste, me tomó varios días cuadrarle, digamos que eliminamos en problema de visualización que no es tan grave, entonces que hago si resulta que los datos arrojados son inexactos, a mi forma de ver es un gran dilema.
> 
> Bueno, mil gracias por atender estas inquietudes.



Cuando hablamos de led respectivamente en estos tipos de proyectos, a modo de tips te comento, que para que se visualice bien un display 7 segmentos, no podemos refrezcar la informacion a imprimir en elm display en un tiempo menor a 50ms, ya que es ahi donde arranca el problema de que se ven todos "8" o algunos numeros no se ven bien definidos... al refrezcar en un tiempo menor a los 50ms, lo que obtenemos es un efecto de "persistencia de la visión" y eso es recomendable para otro tipos de proyectos (matrices seriales). 
Como la curva de temperatura y o velocidad no es tan brusca y no hay grandes cambios en 50 / 60 ms, no afectaria el valor de la lectura verdadera; O sea, si leemos la temperatura, la convertimos en digital, la procesamos con calculos matematicos lineales y luego la imprimimos, tenemos mas o menos (segun cristal) un trabajo no mayor a los 100ms.. a esto le sumamos una breve pausa cuando esta en estado alto en los puertos, y ya tenemos el delay que neesitamos... obviamente, siempre estamos hablando de tiempos inferiores al segundo.
Si requeris de algo certificado, tienes que tener en cuenta que los comandos / lineas, segun cristal, tienen un tiempo dado de trabajo... eso hay  que tenerlo en cuenta cuando uno quiere hacer un cronometro, u cosas que trabajan con tiempos... Igualmente, puedes emplear para estos casos especiales ASM.
exitos


----------



## D@rkbytes (Mar 5, 2013)

yitzensk dijo:


> '¿que instrucción en pic basic puedo usar para contar 5 minutos y me mantenga en high un puerto' se los agradecería mucho


Instrucción para retardos de 5 minutos no existe.
Puedes usar Pause para retardos en mili segundos y PauseUs para retardos en micro segundos.

Lo que se puede hacer es una rutina para ese propósito.
Aquí adjunto dos ejemplos para generar retardos largos de tiempo.
El primer ejemplo es simplemente para un uso básico, y el segundo es más complejo.
En el segundo utilice activación por interrupción externa del pin RB0 y retardos en ensamblador.
Éste segundo ejemplo es para mostrar como crear subrutinas en código ensamblador con PBP.

Suerte.


----------



## ferdy575 (Mar 8, 2013)

D@rkbytes dijo:


> Instrucción para retardos de 5 minutos no existe.
> Puedes usar Pause para retardos en mili segundos y PauseUs para retardos en micro segundos.
> 
> Lo que se puede hacer es una rutina para ese propósito.
> ...



hola D@rkbytes me parece excelente tu programa pero quisiera que me digas que función realiza la palabra "REM" cuando escribes esta parte:

Disable                     ; Deshabilita interrupciones en el controlador
Rem Controlador de la interrupción por RB0
Contar:
    INTCON.1 = 0            ; Limpiar flag INTF (Interrupción externa por RB0)
    t1 = 1                  ; Cargar esta variable con el valor 1
    LED_Red =  1            ; Encender el LED rojo
Rem Procedimiento para Retardos de tiempo (By: D@rkbytes)
Loop1:                      ; Etiqueta para realizar un bucle               
    t1 = t1 + 1
Rem Dos retardos de 500Ms = 1 segundo
Rem Se puede eliminar el encendido y apagado del LED,
Rem y hacer dos retardos de 500Ms

lo leí muy bien pero no entiendo esta función agradecería que me expliques y perdona la ignorancia


----------



## D@rkbytes (Mar 8, 2013)

ferdy575 dijo:


> hola D@rkbytes me parece excelente tu programa pero quisiera que me digas que función realiza la palabra "REM" cuando escribes esta parte:
> 
> Disable                     ; Deshabilita interrupciones en el controlador
> Rem Controlador de la interrupción por RB0


*Rem* = Remark (Observación, comentario, nota)
Es como hacer *'* Comentario ó *;* Comentario.
Solo que al estar en *negrita*, hace más notorio el comentario.
El compilador omite lo que hay después de *Rem*
Sirve solamente para hacer comentarios importantes dentro del programa.

Saludos.


----------



## Yuliang2911 (Mar 8, 2013)

Hola amigos primero que todo quiero decirles que ya e intentado resolverlo por mi cuenta pero realmente no se como hacerlo lo que quiero saber es como puedo en un pic16f628a con un pulsador ejecutar barias tareas por ejemplo cuando lo pulso una ves ejecuta una tarea cuando lo pulso de nuevo ejecuta otra asi yo estube intentando con el comando on interupt pero no me funciono ojala que puedan ayudarme gracias de ante mano.


----------



## D@rkbytes (Mar 8, 2013)

Yuliang2911 dijo:


> Hola amigos primero que todo quiero decirles que ya e intentado resolverlo por mi cuenta pero realmente no se como hacerlo lo que quiero saber es como puedo en un pic16f628a con un pulsador ejecutar barias tareas por ejemplo cuando lo pulso una ves ejecuta una tarea cuando lo pulso de nuevo ejecuta otra asi yo estube intentando con el comando on interupt pero no me funciono ojala que puedan ayudarme gracias de ante mano.


Puedes incrementar el valor de una variable y luego usar *Select Case

*Por ejemplo para 5 programas...

```
Programa VAR Byte

Inicio:
    If PORTA.0 = 0 Then
    Pause 250
    If Programa >4 Then Programa = 0
    Programa = Programa +1
    GoSub Programas
    EndIf
    GoTo Inicio

Programas:
    Select Case Programa
    Case 1
    ; Programa 1
    Case 2
    ; Programa 2
    Case 3
    ; Programa 3
    Case 4
    ; Programa 4
    Case 5
    ; Programa 5
    End Select
    Return
```
Suerte.


----------



## Yuliang2911 (Mar 8, 2013)

hermano te agradesco la ayuda pero lo que yo quiero hacer es mas o menos lo siguinte, yo quiero hacer una lampara que funciona con 3 led y lo que quiero es que cada ves que yo precione un boton yo pueda programar tareas como encender 1 y apagar otro o y cuendo precione de nuevo realizar otra tarea y asi no se si me entiendes mira a ver que puedes hacer por mi gracias


----------



## D@rkbytes (Mar 8, 2013)

Así como te mencione anteriormente funciona para lo que quieres hacer.
Pero sube el código que tengas hecho, junto con algún diagrama, para entenderte mejor.


----------



## eoth (Mar 9, 2013)

Saludos a todos!

Ya hace algun tiempo me compré un programador (el K150) me ha salido bien y todo, la tragedia fue a la hora de programar jaja.

Estoy jugando con PicBasic y el pic 12F629, simplemente me dije "bueno, con algo pequeño está bien" no necesito tantos puertos para los proyectitos que tengo en mente asi que me viene de perlas.

El problema es este: quiero hacer un contador de eventos usando siempre el 12F629, configuré todos los puertos como salidas (excepto el GP3/patita4, que sólo funciona como entrada o MCLR) y con oscilador interno, estoy usando este programa que saqué de un libro:

Trisio=0                             ;hace todos los pines del puerto B como salidas
boton VAR gpio.3              ;asigna el nombre de botón al puerto A.1
num VAR BYTE                ;crea la variable num con un tamaño de 255
num= 0                              ;carga el valor inicial de 0 a la variable num

pulsar:

gpio=num                                ;indica sacar el valor de num a través del puerto B
IF boton=0 THEN contar        ;pregunta si el botón ha sido presionado
GOTO pulsar                          ;ir a pulsar, mantiene encerrado

contar:
IF boton=0 THEN contar      ;espera a que suelte el botón para continuar
PAUSE 200                          ; espera de 200 mls para estabilizar el botón
num=num + 1                        ;suma 1 a la variable num y el nuevo valor le guarda en num
GOTO pulsar                        ; volver al principio del programa

END                         ; fin de la programación

Como habran notado en los comentarios (que no modifiqué) el programa fue diseñado para un pic mas grande, lo que yo quiero y no se como hacer está en la sexta linea, donde asigna a gpio=num (originalmente era PORTB=num) dado que el 12F629 solo maneja 6 puertos, el conteo lo hace como si fueran 6 salidas (lo que no es asi).

Ya en concreto mi duda es: puedo asignarle a la variable "num" solo un rango de puertos y no en general? solo gp0, gp1 y gp2 (patitas 7, 6 y 5 respectivamente) 

Gracias!


----------



## D@rkbytes (Mar 9, 2013)

eoth dijo:


> en concreto mi duda es: puedo asignarle a la variable "num" solo un rango de puertos y no en general? solo gp0, gp1 y gp2 (patitas 7, 6 y 5 respectivamente)


Una manera sencilla de hacerlo sería usando la instrucción LookUp
Adjunto un ejemplo para que te des una idea de como se haría.

Suerte.


----------



## ricbevi (Mar 9, 2013)

eoth dijo:


> Saludos a todos!
> 
> Ya hace algun tiempo me compré un programador (el K150) me ha salido bien y todo, la tragedia fue a la hora de programar jaja.
> 
> ...



Hola...define los fusibles , oscilador y frecuencia del mismo, así como si vas a usar Gpio.3 como entrada y 0,1,2 como salidas al hacer Trisio debes darle el valor = %1000 o sea en decimal 8(GP.3 como entrada y GP.2,GP.1,GP.0 como salida) limita después de incrementar la variable el valor a representar a decimal 7(%111) que es el máximo valor a representar ya que no dispones mas que de 3 pines. Puede ser mediante una comparación

```
IF num = 8 then num = 0
```
Saludos

Ric.


----------



## inspector gadget (Mar 9, 2013)

Saludo cordial a todos los foreros, hoy solicito amablemente su colaboracion y es que se me presento el siguiente inconveniente con el temporizador de mi horno de secado UV, simplemente dejo de trabajar, cuando lo destape, era uno de esos temporizadores cuyo micro es de tipo gota, como quien dice...murio su sistema de temporizacion, por lo que me puse en la tarea de reemplazarlo y como no domino muy bien la programacion en pbp, use el buscador del foro y encontre que reyvilla y darkbytes, ya habian tratado el tema, incluso postearon unos programas con simulacion y todo y aunque no pude entender su programa,  andan muy bien en proteus y seguramente tambien lo haran en fisico, especialmente el temporizador regresivo de darkbytes, esta bien completo y valga la oportunidad de agradecerles ya que personas como ellos me han dado su valiosa colaboracion en otras oportunidades y me han sacado de multiples dudas. 
 La cuestion es que quisiera realizar algo similar a los temporizadores regresivos de estos expertos, pero en lugar de emplear un lcd para indicar el tiempo que falta para  terminar la temporizacion, habia pensado en emplear dos display de 7 segmentos de catodo comun, ya que proveen buna visualizacion en cualquier ambiente de luz y seguro que entendere como generar un algoritmo o una base de tiempo para lograr que el programa realize el conteo regresivo, que para mi caso me gustaria que comienze en 15 minutos y finalice en cero minutos, no es necesario que indique segundos, solo que vaya descendiendo minuto a minuto, tampoco sera necesario ningun ajuste, tan solo el boton de reset y el de start, este ultimo no deberia funcionar hasta tanto el contador llegue al final,esto con el proposito de no incrementar o desajustar el conteo accidentalmente. 

Podria ser que el conteo quede almacenado en la eeprom del pic, por si el fluido de energia llegara a fallar y retorne instantes despues, aunque no es imprescindible, si me gustaria entender como se almacena dicho dato, porque no lo tengo claro.

En resumen lo que me propongo es: al presionar START (RA4) comienza la cuenta regresiva de los 15 minutos, el puerto b gestionaria el encendido de los display de catodo comun, (escogi estos para mayor comprension del programa, ya que se activan con high),  RB7 se encarga de avisar cuando el tiempo de conteo ha llegado al final enviando puede ser un tono intermitente durante unos 3 segundos a un buzer, RA0 y RA1 polarizan un par de transistores para crear el efecto de la vision persistente (multiplexado), RA3 maneja un led de forma intermitente mientras el conteo se este efectuando, cuando llega a cero, este se apaga, RA2 maneja otro led que se mantiene encendido de manera fija mientras el conteo se efectua cuando llega a cero, se apaga (aqui debo colocar la etapa de potencia), por ultimo, el RESET me permite setear el programa a cero en cualquier momento del conteo
Al terminar el conteo debe permanecer el display en 00 hasta que la cuenta inicie con START y de ser posible guardar el conteo si se interrumpe el flujo de energia. START no debera funcionar de ningun modo mientras se realiza el conteo.
Como ven muchas de las prestaciones del hardware son tomadas del m,odelo de darkbytes.

No se como comenzar a realizar el programa en PBP, salvo la declaracion de algunas variable que sospecho no esten completas, mucho menos crear un algoritmo que me permita crear una base de tiempo para que funcione, no he realizado ningun ejercicio en el que involucre bases de tiempo que se vean reflejadas en 7 segmentos, tan solo algunos contadores que funcionan a base de pulsos de entrada, lo basico. Espero puedan darme luz sobre este ejercicio/proyecto que me propongo desarrollar para llegar a buen termino, mi intencion es entender y aprender ya que si solo quisiera reparar mi maquina, me habria bastado con montar el temporizador de reylilla o darkbytes o cualquier otro, que al ser de LCD se ven mucho mejor presentados y con mayores prestaciones y hacen la funcion que se necesita, pero quiero algo que pueda analizar y entender, no he encontardo este proyecto con 7 segmentos por ningun lado, seguro que mas de uno tiene interes en como se encara este programa.
Adjunto una simulacion de como deberian gestionarse los puertos. mil gracias por su tiempo


----------



## inspector gadget (Mar 10, 2013)

Saludos amigos foreros, en mi busqueda sobre un temporizador regresivo de minutos que me muestre el tiempo en dos displays de 7 segmentos, me tope con el siguiente programa en basicpro para el pic 16f872 y entre las ventajas que plantea, esta la posibilidad de temporizar horas o minutos o segundos, con la simple combinacion de 2 jumper. El programa esta escrito en basicpro por lo que me fue comprensible y por lo que pude deducir que falta la inclusion de dos subrutinas para tene exito en la compilacion. pero me falta conocimientos para completar lo faltanteLo posteo para mirar la posibilidad de que alguien de ustedes me colabore, y mirar la forma de completar estas dos subrutinas faltantes ( visualiza display/ejecuta delay) , Como la explicacion del programa esta realizada en bloques en un archivo pdf y escrita en basic, me tome la libertad de organizarla segun mi poca experiencia en este lenguaje y almenos le veo logica en el ordenamiento que le di. Dejo a disposicion el programa y el esquematico ya que al no haber hecho la compilacion exitosa, no he diseñado la simulacion, pero eso no sera problema. Espero sus sugerencias...gracias muchachos


----------



## Dario (Mar 10, 2013)

inspector gadget dijo:


> Lo posteo para mirar la posibilidad de que alguien de ustedes me colabore, y mirar la forma de completar estas dos subrutinas faltantes ( visualiza display/ejecuta delay)...  Espero sus sugerencias...gracias muchachos...



hola amigo inspector gadget, te cuento que hace un tiempo, yo hice un cronometro con un pic16f628A y 4 display de 7 segmentos utilizando la interrupcion por tmr0 y hasta el dia de hoy esta funcionando perfectamente... talvez te pueda servir la rutina de display que contiene mi codigo, podes verla aqui._ https://www.forosdeelectronica.com/posts/573756/ _saludos y espero te sea de utilidad


----------



## Yuliang2911 (Mar 11, 2013)

hola hermano D@rkbytes te cuento que el programa que me diste me funciono.


```
Programa VAR Byte
led0 VAR portb.0
led1 VAR portb.1
led2 VAR portb.2
led3 VAR portb.3
led4 VAR portb.4

Inicio:
    If PORTA.0 = 0 Then
    Pause 250
    If Programa >4 Then Programa = 0
    Programa = Programa +1
    GoSub Programas
    EndIf
    GoTo Inicio

Programas:
    Select Case Programa
    Case 1
          HIGH led0
          pause 400
          low led0
          pause  400                                              ; Programa 1
    Case 2
         HIGH led1
          pause 400
          low led1
          pause  400                                                                 ; Programa 2
    Case 3
       HIGH led2
          pause 400
          low led2
          pause  400                                                        ; Programa 3
    Case 4
       HIGH led3
          pause 400
          low led3
          pause  400                                                                           ; Programa 4
    Case 5
         HIGH led4
          pause 400
          low led4
          pause  400                                                       ; Programa 5
    End Select
    Return
```

Pero ahora yo quiero que cada case se repita indefinidamente hasta que le de la nueva orden y cambie hacia el otro porque el problema es que cuando le pongo GOTO INICIO no me repite mas el case nada hermano dime si puedes ayudarme


----------



## inspector gadget (Mar 11, 2013)

Sigo buascando como encarar el proyecto del temporizador regresivo de minutos con display de 7 segmentos. mil gracias por responder amigo Dario, mira, simule tu programa, pero tengo problemas ya que al cargar el hex, los displays encienden aleatoriamente y no puedo ingresar datos, no se a que se deba, ojala y puedas hecharle una revision y mirar que estoy haciendo mal, en verdad agradezco tu aporte.


----------



## D@rkbytes (Mar 11, 2013)

Yuliang2911 dijo:


> hola hermano D@rkbytes te cuento que el programa que me diste me funciono.
> 
> Pero ahora yo quiero que cada case se repita indefinidamente hasta que le de la nueva orden y cambie hacia el otro porque el problema es que cuando le pongo GOTO INICIO no me repite mas el case nada hermano dime si puedes ayudarme


Mira si con este programa que adjunto consigues lo que quieres hacer.
Utilice interrupción por RB0 para hacer el conteo de selección del programa.

Suerte.


----------



## Dario (Mar 11, 2013)

inspector gadget dijo:


> Sigo buascando como encarar el proyecto del temporizador regresivo de minutos con display de 7 segmentos. mil gracias por responder amigo Dario, mira, simule tu programa, pero tengo problemas ya que al cargar el hex, los displays encienden aleatoriamente y no puedo ingresar datos, no se a que se deba, ojala y puedas hecharle una revision y mirar que estoy haciendo mal, en verdad agradezco tu aporte.



hola amigo, lo que pasa es que en proteus no te va a funcionar... tenes que pasar directamente al diseño real. ami me hacia lo mismo en proteus, pero en la realidad funciona bien. a la rutina de visualizacion, la he utilizado en otros proyectos como el proyecto de visualizacion de los datos de un wii motion en el que me ayudo el amigo j2c juanka en este mismo thread un poco mas atras. aqui un video de ese proyecto... saludosss PD: (la variacion que ves en el ultimo digito de la derecha, es por la sensibilidad del giroscopo.)


----------



## inspector gadget (Mar 12, 2013)

Voy a montar tu cronometro inmediatamente Dario, ya te comentare como me fue y si tengo alguna duda sobre algun ajuste, espero puedas ayudarme para adaptarlo a mi necesidad personal, ya que tienes bastante experiencia con este lenguaje....mil gracias hombre!


----------



## manolo5 (Mar 12, 2013)

hola amigos, verán estoy desarrollando un programa en pic basic y es para un pic16f877a para manejar un motor de paso a paso bipolar con pulsadores, (es para una maqueta de puerta de garaje) pero todo lo que logre hacer es uno automático y es este:



```
trisa=11111
trisb=0

izquierda:
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 100
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 100
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 100
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 5000
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 100
   portb=%0100
  pause 100
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 100
   portb=%0100
  pause 100
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 100
   portb=%0100
  pause 100
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 5000
 
goto izquierda:

end
```
este es automático y gira 4 vueltas hacia arriba y 4 vueltas hacia abajo, pero ahora me piden que le agregue pulsadores, uno de arranque y otro de regreso y uno de pause según en caso de error y otro de arranque para que vuelva a funcionar como . eso es todo lo que necesito para que maqueta de puerta de garaje funcione. 

por favor espero puedan ayudarme.


----------



## Abbathronik (Mar 14, 2013)

Buen día. Quiero saber si álguien me puede ayudar con un problema que tengo con la instrucción WRITE y READ en Pic Basic Pro.
Primeramente cargo valores en las direcciones de la EEPROM del del PIC 16F877A como sigue:

WRITE 00,"1"
WRITE 01,"2"
WRITE 02,"3"
WRITE 03,"4"

Posteriormente las cargo, en un arreglo de la variable X

READ 00,X[0]
READ 01,X[1]
READ 02,X[2]
READ 03,X[3]

Para por último, mostrarlas en un LCD 2x16

FOR CONTADOR=0 TO 3
LCDOUT X[CONTADOR]
NEXT CONTADOR

El problema es que me muestra los primeros tres valores correctamente (1,2,3), pero el cuarto digito (que debería ser un 4), me mustra un 3.

He tratado de muchas maneras por días y no obtengo nada. No se si a álguien le ha pasado algo similar.

Espero me puedan ayudar o direccionar a algún apartado del foro. Muchas gracias


----------



## D@rkbytes (Mar 14, 2013)

Escribe este programa y ve los resultados...

```
Posc    VAR Byte
B0      VAR Byte
Datos   VAR Byte[3]

MainProgram:
    For B0 = 1 To 4
    Posc = B0-1
    Write Posc,B0
    Pause 10
    Next B0
    
    For B0 = 0 To 3
    Posc = B0
    Read Posc,Datos[B0]
    Pause 10
    Next B0
    
    LCDOut $FE,1," Lectura EEPROM"
    LCDOut $FE,$C0,#Datos[0],#Datos[1],#Datos[2],#Datos[3]
```
Saludos.


----------



## Abbathronik (Mar 14, 2013)

Muchas gracias D@rkbytes
El código que me muestras funciona perfecto. Ahora analizaré, qué es lo que pasa con mi código, tal vez el problema radique en la pausa que das despues de cada write/read.
Lo singular del problema que comento, es que en algunas ocasiones el programa funciona como lo mostré, y en otras no.
Compararé para estudiar que es lo que pasa.
Mil gracias.


----------



## inspector gadget (Mar 14, 2013)

saludos amigos, agradezco la colaboracion de Dario, he sacado muchas conclusiones sobre como realizar mi proyecto sobre un temporizador regresivo de 15 minutos a cero, junto con los post de otros foreros ya voy entendiendo muchisimo, si bien para muchos en este foro este proyecto seria facil,para uno como aprendiz cada que obtiene un resultado positivo, es motivo de satisfaccion, vamos dando un paso a la vez.  Cualquier duda que se me presente espero me puedan colaborar, a proposito me podrian comentar sobre un libro que mecatrodatos pensaba publicar sobre pbp? Esto lo lei muchisimas paginas atras, quisiera que me pudieran informar, muchas gracias de nuevo.


----------



## xdarkhawk (Mar 14, 2013)

D@rkbytes dijo:


> El nombre del puerto en los PIC12 se llama GPIO
> GPIO.0
> GPIO.1
> GPIO.2
> ...



Y siquiera realizar un proyecto cual me recomendarias?


----------



## D@rkbytes (Mar 14, 2013)

xdarkhawk dijo:


> Y si quisiera realizar un proyecto cual me recomendarías?


Si quieres hacer un proyecto con el 12F508/9, tiene que ser algo muy sencillo.
Ese PIC tiene poca RAM, pocos pines, no tiene ADC y no cuenta con EEPROM.
Podrías hacer PWM sobre un LED, algún estrobo, un circuito musical, generar DTM, ó comunicación serial.

No sé, proyectos que no requieran el uso de varios pines y que usen poca RAM.
Tu creatividad e imaginación son las que te guiaran. 

Suerte.


----------



## ferdy575 (Mar 15, 2013)

inspector gadget dijo:


> saludos amigos, agradezco la colaboración de D@rio, he sacado muchas conclusiones sobre como realizar mi proyecto sobre un temporizador regresivo de 15 minutos a cero, junto con los post de otros foreros ya voy entendiendo muchísimo, si bien para muchos en este foro este proyecto seria fácil,para uno como aprendiz cada que obtiene un resultado positivo, es motivo de satisfacción, vamos dando un paso a la vez.  Cualquier duda que se me presente espero me puedan colaborar, a propósito me podrían comentar sobre un libro que mecatrodatos pensaba publicar sobre pbp? Esto lo leí muchísimas paginas atrás, quisiera que me pudieran informar, muchas gracias de nuevo.



hola. 
aquí te pongo un ejemplo de un temporizador que hice hace algún tiempo con la ayuda de todos en este foro y funciono muy bien, este es el código:


```
;********************************** 
;teporizador en minutos y segundos             
;con pic 16f84a                                       
;**********************************
;CONFIGURACIÓN PIC
@ DEVICE pic16F84A
@ DEVICE WDT_ON              
@ DEVICE PWRT_ON                   
@ DEVICE PROTECT_OFF      
@ DEVICE xt_osc  
define osc 4 
;REGISTROS LCD
Define    LCD_DREG    PORTB
Define    LCD_DBIT    0
Define    LCD_RSREG    PORTB
Define    LCD_RSBIT    4
Define    LCD_EREG    PORTB
Define    LCD_EBIT    5

Symbol Minutos = PORTA.1    ; AJUSTE MINUTOS
Symbol Segundos = PORTA.2   ; AJUSTE SEGUNDOS
symbol Out = PORTB.7        ; SALIDA CONTROL 
symbol START = PORTA.3      ; INICIO CONTEO
SYMBOL STOP_ = PORTB.6      ; DETIENE CONTEO

;VARIABLES
Pulsos VAR byte 
Mts VAR byte 
Sds VAR byte 
Disp VAR byte 
Delay VAR byte
CLEAR
 
TRISB = %01000000 
TRISA = %00011111 

PAUSE 500 

Mts = 03 'aquí cuadramos el tiempo en que iniciara
Sds = 00
pulsos = 0

OPTION_REG = %00000101 ; prescaler = 64
On INTERRUPT GOTO ISR ; IR A RUTINA ISR 
INTCON = %10100000 
LCDOUT $FE, 1 ;LIMPIA LCD

;INCIO DEL PROGRAMA
LOOP:
;BOTÓN START
IF START = 0 THEN ; si el boton start es presionado ejecuta lo siguiente
TMR0 = 0 ;Inicializa registro TMR0 
INTCON = $A0 ;habilita el  timer interrupt
Disp = 1 ; habilita  display
Gosub Retardo
ENDIF 

;BOTÓN STOP
IF STOP_ = 0 THEN ; si el boton stop es presionado ejecuta lo siguiente
INTCON = 0 ;desabilita el  timer 
Disp = 1 ; habilita  display
Gosub Retardo
ENDIF 

;BOTÓN PROGRAMAR LOS MINUTOS
IF Minutos = 0 THEN
Mts = Mts - 1
Gosub retardo
ENDIF

;BOTÓN PROGRAMAR LOS SEGUNDOS
if Segundos = 0 then
Sds = Sds - 1
Gosub retardo
ENDIF

'******************************
IF Mts = 60 AND Sds = 60 THEN'* 
out = 1                      '*
gosub MENSAJE_FIN            '*
else                         '*
out = 0                      '*
ENDIF                        '*
'******************************
IF Disp = 1 THEN
LCDOUT $FE, 1
LCDOUT $FE, 2
Lcdout "Tiempo de espera "  
LCDOUT $FE,$C4,DEC2 Mts, ":",DEC2 Sds
LcdOut $fe,$C16, 0
LCDOUT $fe,$40,$00,$0A,$0A,$00,$04,$11,$0E,$00 'aqui tenemos la carita feliz :)
Disp = 0
ENDIF 
                         
GOTO LOOP

;ANTIRREBOTE
Retardo:
FOR Delay = 1 To 200
Pause 1 
NEXT Delay 
Disp = 1 
RETURN

;EJECUCION DE UN SEGUNDO
DISABLE
ISR:
IF Mts < 0 OR Sds > 0 THEN 'OJO sí se cambia esta función no funciona el conteo
pulsos = pulsos + 1
IF pulsos < 61 THEN NoUpdate
endif

;TIEMPO
Retro:
pulsos = 0

IF Sds = 0 AND Mts => 0 then
Mts = Mts - 1
Sds = 61
endif
if mts > 60 then mts = 60       
if mts = 0 then mts = 0


'ALARMA
IF Mts = 60 AND Sds = 60 THEN
pulsos = pulsos
INTCON = 0 ;desabilita el  timer 
else
TMR0 = 0 ;Inicializa registro TMR0 
INTCON = $A0 ;habilita el  timer interrupt
Disp = 1 ; habilita  display 
Sds = Sds - 1
endif                                                
return

mensaje_fin:
LCDOUT $FE, 2
Lcdout        " <<FINALIZADO>> "  
LCDOUT $FE,$C1," PULSE  CLEAR"
return

NoUpdate:
INTCON.2 = 0 
Resume                                                                              
ENABLE 
END
```
espero te sirva, sí observas el inicio esta cuadrado para iniciar en 3 minutos puedes cuadrarlo como quieras y sí pulsas varias veces el botón de minutos puedes programar hasta una hora, suerte con tu proyecto
posdata me gustan más los LCD que los display de led ahí me disculpas...


----------



## Manrique (Mar 15, 2013)

Hola amigos una consulta puedo hacer un juego de luces con el pic 16f628A, utilizando sus 2 puertos A y B osea todos sus pines (16), lo he hecho con el puerto B, pero al utilizar los 2 puertos me da problemas en la simulacion en proteus, estoy apagando el boden, el oscilador, el reset etc....
Saludos


----------



## D@rkbytes (Mar 15, 2013)

Manrique dijo:


> Hola amigos una consulta puedo hacer un juego de luces con el pic 16f628A, utilizando sus 2 puertos A y B osea todos sus pines (16), lo he hecho con el puerto B, pero al utilizar los 2 puertos me da problemas en la simulación en proteus, estoy apagando el boden, el oscilador, el reset etc....
> Saludos


Tienes que leer la hoja de datos para que te dés cuenta porqué no te funciona bien cuando usas el puerto A.
El BODEN (Ahora BOREN ó Brown-Out Reset) solo es para generar un reset por bajo voltaje de alimentación.
Si no utilizas el oscilador interno, pierdes los pines RA6 y RA7.
El pin RA4 es Open Drain (Drenador abierto).
Y el pin RA5 (MCLR/Vpp) solo funciona como entrada. ¿Ahora comprendes por qué no te funciona?

Saludos.


----------



## Manrique (Mar 15, 2013)

D@rkbytes dijo:


> Tienes que leer la hoja de datos para que te dés cuenta porqué no te funciona bien cuando usas el puerto A.
> El BODEN (Ahora BOREN ó Brown-Out Reset) solo es para generar un reset por bajo voltaje de alimentación.
> Si no utilizas el oscilador interno, pierdes los pines RA6 y RA7.
> El pin RA4 es Open Drain (Drenador abierto).
> ...



Gracias por responder, ok a lo que te entendi solo puedo usar 15 de los 16 pines para salida, pq el RA5 es solo entrada, estoy utilizando el oscilador interno por lo que los pines RA6 y RA7, deberian funcionar sin embargo no lo hacen, (El pin RA4 le coloque una R pull up para que funcione).
como le hago???


----------



## D@rkbytes (Mar 15, 2013)

Manrique dijo:


> estoy utilizando el oscilador interno por lo que los pines RA6 y RA7, deberían funcionar sin embargo no lo hacen, (El pin RA4 le coloque una R pull up para que funcione).
> como le hago???


Sube tu código para ver por qué no esta funcionando tu programa.


----------



## D@rkbytes (Mar 15, 2013)

manolo5 dijo:


> hola amigos, verán estoy desarrollando un programa en pic basic y es para un pic16f877a para manejar un motor de paso a paso bipolar con pulsadores, (es para una maqueta de puerta de garaje) pero todo lo que logre hacer es uno automático.
> gira 4 vueltas hacia arriba y 4 vueltas hacia abajo, pero ahora me piden que le agregue pulsadores, uno de arranque y otro de regreso y uno de pause según en caso de error y otro de arranque para que vuelva a funcionar como . eso es todo lo que necesito para que maqueta de puerta de garaje funcione.
> 
> por favor espero puedan ayudarme.


¿Y por qué no haces las rutinas para las funciones que requieres?
¿Ó cual es el problema?


----------



## inspector gadget (Mar 16, 2013)

mil gracias ferdy 575 he leido, te agradezco el aporte, voy a revisar las paginas anteriores para montarlo y seguir experimentando y concluyendo, quisiera por favor que me remitan a un proyecto que trate como ingresar  datos en la eeprom del pic 16f628a, cuando desconecte la energia, la ultima cuenta permenezca hasta que nuevamente encienda, me parece muy util ahora que estoy aprendiendo sobre contadores. gracias por su ayuda amigos.


----------



## inspector gadget (Mar 17, 2013)

hola amigos, alguien tiene un ejemplo de como generar tonos por un pin del 16f628a en pbp?
he usado FREQOUT portb.0 2000,7200 con un buzzer pasivo, y funciona pero todo el problema es que el volumen es demasiado bajo, a pesar de combinar distintas frecuencias, como hacer para aumentar su volumen , algo parecido al pitido que genera mi pc al encender? lo necesito para implementarlo al temporizador y lo que pretendo es que suene duro sin importar el lugar que me encuentre, y he visto aparatos que con estos buzzer pasivos suenan bastante duro en estados de alarma, no quiero usar chicharras, su sonido no es agradable...espero puedan colaborarme


----------



## torres.electronico (Mar 18, 2013)

hay miles de maneras de hacerlo... con un amplificador operacional, con un transistor, etc etc... hay que ver aq qeu llamas buzzer pasivo... yo conozco solo un tipo de buzer... que impedancia tiene? para que tension es? son muchas las cuestiones y sin muchos datos / imagenes / diagramas, no se por done arrancar para orientarte


----------



## isaiasjea (Mar 18, 2013)

Buenas tardes hermanos del maravilloso mundo de los microcontroladores
acabo de adquirir un modulo bluetooth (JY-MCU V1.05).





trabaja por comunicación serial tipo serial-UART.
ya lo tengo funcionando con un Arduino UNO R3.
y funciona muy bien , el programa es sencillo cuando mando un "1" serial prende un led y cuando mando "2" se apaga el led.
ya sea comandado por la pc o por android.

el problema es cuando quiero usarlo con un PIC16F628A
cuando hago la comunicación de PIC a PIC el codigo funciona tanto en simulacion en proteus como fisicamente, pero cuando lo hago por medio del bluetooth ya no funciona.
el modulo funciona Default Baud Rate: 9600,8,1,n.
les agradesco, si me pudieran echar una manita gracias el Código es el siguiente:


```
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device  pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                     
TRISA = %00000000
TRISB = %00000010
'*******************************************************************************
DEFINE HSER_BAUD 9600
DEFINE Hserial_RCSTA %10010000
DEFINE Hserial_TXSTA %00100100
DEFINE Hserial_Clear On
dato var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'*******************************************************************************
inicio:
HSERIN 50,inicio,[Dato]

if dato = 1 then
PORTA.0 = 1
pause 500
goto inicio
endif
if dato = 2 then
PORTA.0 = 0
pause 500
goto inicio
endif
END
```

Adjunto simulacion Funcionando en proteus PIC a PIC.

Gracias y seguimos en contacto.


----------



## D@rkbytes (Mar 19, 2013)

isaiasjea dijo:


> acabo de adquirir un modulo bluetooth (JY-MCU V1.05).
> trabaja por comunicación serial tipo serial-UART.
> ya lo tengo funcionando con un Arduino UNO R3.
> y funciona muy bien , el programa es sencillo cuando mando un "1" serial prende un led y cuando mando "2" se apaga el led.
> ...


Al parecer esos módulos se comunican por medio de comandos AT.
Lee esta información, quizás te pueda servir: *Setup JY-MCU BT BOARD v1.2*

Suerte.


----------



## isaiasjea (Mar 20, 2013)

Buenas noches!!



> Al parecer esos módulos se comunican por medio de comandos AT.
> Lee esta información, quizás te pueda servir: Setup JY-MCU BT BOARD v1.2
> 
> Suerte.



Gracias D@rkbytes por la información.
no tengo problemas en la conexión ni en la configuración, como comento anteriormente lo estoy usando con un Arduino UNO R3 y Funciona de 10.
la conexión se establece ya sea por medio de un celular Android de bluetooth a bluetooth, o si lo quiero comandar de PC se conecta por el bluetooth de la PC.




Con arduino funciona muy bien.




pero con el pic nop =(

Saludos y seguimos en contacto


----------



## inspector gadget (Mar 21, 2013)

torres.electronico dijo:


> hay miles de maneras de hacerlo... con un amplificador operacional, con un transistor, etc etc... hay que ver aq qeu llamas buzzer pasivo... yo conozco solo un tipo de buzer... que impedancia tiene? para que tension es? son muchas las cuestiones y sin muchos datos / imagenes / diagramas, no se por done arrancar para orientarte



gracias por responder amigo torres electronico, ya lo solucione y simplemente era que en el sitio donde lo compre me habian vendido un buzzer de mayor voltaje al que requería, lo cambie y listo. Me podrian orientar como es la configuracion de los fuses para un pic 16f877a en pic basic? quiero migrar el codigo de un temporizador  que realice con un 16f628a este chip, mejor dicho quiero relizar el programa para 4 temporizadores de minutos en un solo chip pero con funciones totalmente independientes uno del otro, osea serian 8 displays de 7 segmentos, mas reset para cada temporizador y ortos aditamentos, y por el numero de puertos que requiero, he mirado este chip para usarlo. he visto contadores de 4 digitos usando un solo 7447 para manejar los 4 display y 4 transistores para la multiplexacion, quiere decir esto que puedo usar 4 pines de un puerto para manejar las entradas de un solo 7447 y otro puerto con 8 pines para los 8 transistores de la multiplexacion y crear los 4 temporizadores que necesito, usando en total para los 8 display solo 12 pines? ojala me puedan colaborar con estas respuestas y remitirme a algunos ejemplos sobre manejo de 16f877 y multiplexacion para displays ya que el tema no lo entiendo mucho. espero su colaboracion y ya posteare mis inicios para que me colaboren con la adaptacion del codigo al nuevo chip. mil gracias por su tiempo muchachos.


----------



## isaiasjea (Mar 22, 2013)

Saludos hermanos del maravillosa mundo de los microcontroladores!!



> Gracias D@rkbytes por la información.
> no tengo problemas en la conexión ni en la configuración, como comento anteriormente lo estoy usando con un Arduino UNO R3 y Funciona de 10.
> la conexión se establece ya sea por medio de un celular Android de bluetooth a bluetooth, o si lo quiero comandar de PC se conecta por el bluetooth de la PC.



Final mente de hacer pruebas y consultando manuales de Pic Basic Pro, Dí con el problema de la comunicación del modulo bluetooth y el PIC16F628A. 
El problema era que yo estaba guiado de un manual para programación en Proton IDE y no todas las funciones de Proton IDE son compatibles para Pic basic pro.
en el Código que publique anterior en la parte de :

```
'*******************************************************************************
DEFINE HSER_BAUD 9600
DEFINE Hserial_RCSTA %10010000
DEFINE Hserial_TXSTA %00100100
DEFINE Hserial_Clear On
```
Resulta que esas declaraciones son mas que nada para Proton IDE y en vez de usar DEFINE se usa Declare.
pero en pic basic pro se usan :

```
'*******************************************************************************
' INICIALIZANDO USART
SPBRG = 25
RCSTA = %10010000
TXSTA = %00100100
'*******************************************************************************
```
el cual configura el pin de TX y RX y los 9600 Baudios asignado. Comunicación Uart
otra cosa que modifique fue en la recepción de datos en la parte :

```
if dato = 1 then
PORTA.0 = 1
pause 500
goto inicio
endif
if dato = 2 then
PORTA.0 = 0
pause 500
goto inicio
endif
```
en los if  cuando definimos  el valor para el primer caso que es 1 debe de usar comillas para que detecte como caracter y gual en el caso 2 en el numero 2 debe usar comillas y se sustituyo por :

```
if dato = "1" then
PORTA.0 = 1
pause 500
goto inicio
endif
if dato = "2" then
PORTA.0 = 0
pause 500
goto inicio
endif
```

Finalmente ya estoy trabajando con el modulo Bluetooth  Funcionando.
Gracias a todos ustedes.
Adjunto archivo funcionando.

Saludos y seguimos en contacto.


----------



## ferdy575 (Mar 25, 2013)

hola a todos.
les cuento que revisando el sistema de los mouse ópticos encontré que el componente que va en la rueda hace dos pulsos en secuencia así: 0-0, 1-0, 1-1, 0-1, 0-0, en un sentido y en el otro sentido la secuencia es contraria así: 0-0, 0-1, 1-1, 1-0, 0-0 y pensé sera que no se podrá controlar un servo con este sistema en lugar de un potenciometro? y escribí este código pero no funciona obviamente a primera vista se ve que tiene errores de sintaxis sera que alguien entiende lo que quiero hacer y puede ayudarme a ver como se corrigen estos errores?
Este es el código: 

```
'**********************************************************************
' control servo con pulsador rotativo
@ device pic16F628A,intrc_osc,pwrt_on,wdt_off,mclr_off,lvp_off,protect_off
DEFINE OSC 4
'**********************************************************************
CMCON = 7                              
TRISB = 0
PORTB = 0
'**********************************************************************
pulso1 var porta.0
pulso2 var porta.1
servo1 var portb.0
x var byte

x = 150

inicio:
pulsout servo1,x
gosub timer
goto inicio

timer: 
if            ; aquí sería sí primero pulso1 y luego pulso2 entonces ir a "mas"
pulso1 = 0 
pause 10 
pulso2 = 0 
pause 10 
then gosub mas 
endif
return

if            ; aquí sería sí primero pulso2 y luego pulso1 entonces ir a "menos"
pulso2 = 0 
pause 10
pulso2
pause 10
then gosub menos
endif
return

mas:
pause 10
x=x+1
if x > 250 then x = 250
return

menos:
pause 10
x=x-1
if x < 50 then x = 50
return
end
```
agradezco su colaboración


----------



## torres.electronico (Mar 25, 2013)

ferdy575 dijo:


> hola a todos.
> les cuento que revisando el sistema de los mouse ópticos encontré que el componente que va en la rueda hace dos pulsos en secuencia así: 0-0, 1-0, 1-1, 0-1, 0-0, en un sentido y en el otro sentido la secuencia es contraria así: 0-0, 0-1, 1-1, 1-0, 0-0 y pensé sera que no se podrá controlar un servo con este sistema en lugar de un potenciometro? y escribí este código pero no funciona obviamente a primera vista se ve que tiene errores de sintaxis sera que alguien entiende lo que quiero hacer y puede ayudarme a ver como se corrigen estos errores?
> Este es el código............



Hola ferdy...  eso es un encoder y obviamente se podria implementar para tu proposito (yo diria que es lo ideal  )... 

Fijate que vos describis justamente los pulsos :
​ Solo tienes que tener en cuenta que el registro donde va a estar la variable para que sepa cual es la posicion (ida o venida), tiene que ser un espacio de memoria que no se borre o vea afectado por nada, ya que ahi esta el corazon del proyecto... 
Buscate la hoja de datos de ese enconder por que los hay de distintos tipos, asi te doy una mano


----------



## ferdy575 (Mar 26, 2013)

torres.electronico dijo:


> Hola ferdy...  eso es un encoder y obviamente se podria implementar para tu proposito (yo diria que es lo ideal  )...
> 
> Fijate que vos describis justamente los pulsos :
> Ver el archivo adjunto 89727​ Solo tienes que tener en cuenta que el registro donde va a estar la variable para que sepa cual es la posicion (ida o venida), tiene que ser un espacio de memoria que no se borre o vea afectado por nada, ya que ahi esta el corazon del proyecto...
> Buscate la hoja de datos de ese encoder por que los hay de distintos tipos, asi te doy una mano



hola Torres, gracias por responderme te cuento que estuve dando muchas vueltas en Internet y el componente encoder rotativo más parecido que halle fue este: el 288 Rotary encoder aquí te pongo la hoja de datos aunque físicamente es un poco diferente electricamente se comporta igual solo que siempre va hacia adelante, agradezco tu colaboración


----------



## inspector gadget (Mar 26, 2013)

hola expertos, solicito su ayuda referente a como debo enlazar 2 contadores iguales en su estructura, pero ubicados en diferentes puertos del pic 16f877a, el uno cuenta de 0 a 9 ubicado en portb y el otro cuenta de 9 a cero y esta en portd y no logro que funcionen al mismo tiempo, quisiera que con el mismo programa me indiquen que hace falta para poder entender como se hace este enlace, asi tambien no encuentro la configuracion de fuses para este chip. muchas gracias y ojala me puedan ayudar


----------



## D@rkbytes (Mar 26, 2013)

inspector gadget dijo:


> hola expertos, solicito su ayuda referente a como debo enlazar 2 contadores iguales en su estructura, pero ubicados en diferentes puertos del pic 16f877a, el uno cuenta de 0 a 9 ubicado en portb y el otro cuenta de 9 a cero y esta en portd y no logro que funcionen al mismo tiempo, quisiera que con el mismo programa me indiquen que hace falta para poder entender como se hace este enlace, así también no encuentro la configuración de fuses para este chip. muchas gracias y ojala me puedan ayudar


Así como tienes el programa no funcionará el contador del puerto D.
Y recuerda que los programas son secuenciales, primero verás el conteo de 0 a 9 en el puerto B,
y luego comenzara el conteo de 9 a 0 en el puerto D, y se repite el ciclo.
Para que funcione el contador del puerto D, solo tenías que hacerlo así...

```
inicio:
       for i = 0 to 9
       portb = i
       pause 100
       next i
              
       for i2 = 9 to 0 [B]step - 1[/B]
       portd = i2
       pause 100
       next i2
       goto inicio
```
La palabra de configuración que utilicé fue ésta:
*@ DEVICE HS_OSC, PWRT_ON, WDT_OFF, BOD_OFF*

Para que te ahorres los dos decodificadores y trabajes los displays directamente, adjunto un ejemplo.

Suerte.


----------



## isaiasjea (Mar 26, 2013)

> hola expertos, solicito su ayuda referente a como debo enlazar 2 contadores iguales en su estructura, pero ubicados en diferentes puertos del pic 16f877a, el uno cuenta de 0 a 9 ubicado en portb y el otro cuenta de 9 a cero y esta en portd y no logro que funcionen al mismo tiempo, quisiera que con el mismo programa me indiquen que hace falta para poder entender como se hace este enlace, asi tambien no encuentro la configuracion de fuses para este chip. muchas gracias y ojala me puedan ayudar



Aquí otro ejemplo de tu contador cambiando al mismo tiempo. 

Saludos y seguimos en contacto.


----------



## inspector gadget (Mar 26, 2013)

amigo Darkbytes, gracias por responder, ya voy entendiendo y  ya habia leido que los programas en los microcontroladores se ejecutan de manera secuencial, quieres decir que si por ejemplo necesito realizar 3 contadores  0 a 99 de manera independiente y al mismo tiempo, debo usar 3 micros por separado? necesito elaborar un proyecto en el cual cada contador haga su correspondiente tarea como contar cuando lo accione, parar y seleccionar el tiempo de tope hasta donde debe llegar el contador y este programa ya lo realic con pic 16f628a con decodificadores 7447 para qu alcancen los pines y funciona bien, pero por costos pense que los podia incluir en un chip con mas puertos y que me funcionaran independientemente y por eso mire que el 16f877a tenia 33 puertos E/S que me hubieran servido para los tres contadores pero veo que no se adaptaria a lo que requiero , no existe ninguna tecnica para lograr este proposito en un solo chip?
 Por otra parte queria solicitar el grande favor si tienen un ejemplo de un contador automatico que vaya de 0 a 99 pero multiplexado, tengo un ejemplo de este contador pero no usa esa tecnica porque usa un 7447 para las unidades, y otro para las decenas,no ntiendo muy bien la tecnica con el 16f628 y quisiera saber mas para realizar mi contador de esa forma ya que solo usaria 4 puertos para el 7447 , 2 para los transistores y 7 mas para funciones con pulsadores, como les digo no es tanto migrarba otro chip con mas puertos, sino entender la multiplexacion para encarar proyectos con esa tecnica, espero su valiosa ayuda para en estas vacaciones sentarme a practicar gracias por el ejemplo y tu tiempo.



isaiasjea dijo:


> Aquí otro ejemplo de tu contador cambiando al mismo tiempo.
> 
> Saludos y seguimos en contacto.





gracias por responder isaiasjea, bien interesante la presentacion que se hace en los display de diferente conteo al mismo tiempo, pero lo que pretendia es darle a esos conteos, control independiente de cada uno de ellos como que inicien cada conteo con un pulsador diferente, o que pueda darles diferentes tiempos de conteo, en sintesis que funcionen independiente en sus controles, pero dentro de un mismo programa y dentro del mismo chip, pero ya me explicaba Dark que esto no es posible por la estructura de los programas en forma secuencial.
Igual agradeceria muchisimo si no tienes un contador de 0 a 99 que trabaje con la tecnica del multiplexado pero que haga el conteo en forma automatica, no entiendo muy bien como multiplexar, tengo un programa que hace la cuenta de unidades y decenas a traves de un solo 7447 y dos tgransistores para multiplexar, me gusta mucho por el ahorro de pins, pero hace la cuenta con un pulsador y no he podido que me realice este conteo de forma automatica, agradezco tu voluntad de ayudarme.


----------



## torres.electronico (Mar 27, 2013)

ferdy575 dijo:


> hola Torres, gracias por responderme te cuento  que estuve dando muchas vueltas en Internet y el componente encoder  rotativo más parecido que halle fue este: el 288 Rotary encoder aquí te  pongo la hoja de datos aunque físicamente es un poco diferente  electricamente se comporta igual solo que siempre va hacia adelante,  agradezco tu colaboración



Hola Ferdy... el encoder  rotativo que citas en el pdf, tiene la particularidad de poder tabajar  en ambos modos... Osea, es sabido que tenemos varios tipos de encoder,  de los cuales los mas destacables son los absolutos (los que te dicen el  angulo donde esta con una mayor resolucion) y los incrementales (los  que envian pulsos segun avance, pero si es de un solo canal, no tenemos  manera de saber donde esta el eje... si tiene dos canales, solo de esta  manera podriamos saber para que lado gira el encoder incremental, pero  nunca sabriamos perfectamente donde esta: Ahi ya tendriamos que jugar  con un par de lineas de mas para sumar y restar pulsos y mas o menos  saber donde tendria que estar cituado el eje). 
En el pdf, menciona  que en funcion encoder absoluto, tenes una sañal de 2Bits (4-6-8-10-12  pulsos en 360º), y en modo encoder absoluto, tenes una señal de 4 bits  (16 combinaciones en 360º)... 
Supongamos dado tu ejemplo anterior  que tenes en mano un encoder incremental de dos canales, la lectura para  saber para que lado gira, es sencilla... observemos nuevamente el  siguiente grafico:

Ver el archivo adjunto 89727
Despreciando el 3er canal llamado canal de indexacion, vamos a centrarnos en los pulsos del canal A y canal B...
Lo  que vos tenes que hacer, es contar los pulsos de subida y bajada en  ambos canales...osea, los cambios de uno a cero en ambos canales, y  luego los comparas entre los dos.. Por ejemplo, si miramos la primer  iamgen (count down), vemos que el canal A se encuentra con el flanco en  bajada y el flanco del canal B, se encuentra en subida... Esto se  interpretaria de la siguiente manera 0-1
En la segunda imagen, vemos  que es al reves... el canal A se encuentra en flanco de subida y el  canal B en flanco de bajada... esto se interpretaria de la siguiente  manera 1-0 ... ahora... Parece sencillo, pero no lo es tanto saber  cuanto se mueve el eje... jajajaja...como saber cuanto avanza el eje?
Sencillo... vamos a tratar de hacerlo un poco mas basico para que no sea engorroso...
Vamos  a tomar el canal A para contar la cantidad de pulsos de cada  transicion... Para esto, tenemos que usar una interrupcion por hardware,  o bien, hacer una especie de interrupcion por software (bucle o salto a  un subprograma) cada vez que detecte pulso.... teniendo las  caracterisitcas del encoder (osea, cuantos pulsos son 360ª), mas o menos  podemos saber cuanto se movio o cuanto avanza...
Para saber en que direccion se movio, vamos a leer el estado del pulso del canal B y reflotando las lineas anteriores, aca viene el dilema...

*Por ejemplo...Si tenemos flanco subida en A:*
-_y el flanco del canalB es =0 se esta desplazando un paso para la derecha_ (1-0)
-_y el flanco del canalB es=1 se esta desplazando un paso para la IZQUIERDA_ (1-1)

*Si tenemos flanco bajada en A:*
-_y el flanco del canalB=1 se esta desplazando un paso para la DERECHA_ (0-1)
-_y el flanco del canalB=0 se esta desplazando un paso para la IZQUIERDA_ (0-0)

*Si tenemos flanco subida en B*:
-y el flanco del canalA=1 _se esta desplazando un paso para la_ _DERECHA  _(1-1)
-y el flanco del canalA=0 _se esta desplazando un paso para la_ _IZQUIERDA (1-0)_

*Si tenemos flanco bajada en B:*
-_y el flanco del canalA=0_ _se esta desplazando un paso para la_ _DERECHA_ (0-0)
-_y el flanco del canalA=1_ _se esta desplazando un paso para la_ _IZQUIERDA (0-1) _

_*Fijate  que con este ejemplo citado, tenemos el giro del encoder de un extremo  al otro y luego, retorna a la posicion original....*_
 Para hacerlo mas grafico, mira tu ejemplo citado de tus propias lecturas 
​


> 0-0,  1-0, 1-1, 0-1, 0-0, en un sentido y en el otro sentido la secuencia es  contraria así: 0-0, 0-1, 1-1, 1-0, 0-0



Ahora... como podemos armar el programa de lectura?
Bueno,  podemos encararlode varias maneras, pero hay que tener en cuenta que  tiene que ser lo mas rapido posible, ya que podemos perder pulsos en el  movimiento...
Suponiendo que tomamos la interrupcion por B.0, cada  vez que salta a la interrupcion, tenemos que verificar con un while en  que estado se encuentra el otro puerto para saber si sumar o sustraer al  dato conteo... 
Osea. si ponemos el canal A al puerto B0, y el canal  B al puerto B1, si salta primero la interrupcion por un pulso detectado  del canal A, hay qeu verificar el estado del otro puerto para saber  cuanto avanza; Ahora, Si salta primero el puerto B1 por un pulso  detectado del canal B, hay que ver el estado del canal A para saber  cuanto avanza... osea... el que se dispare 1ero, nos indica para que  lado va....Con esto mas o menos podriamos derterminar cuanto se mueve y  para que lado...
Ojo que ese mismo While que usamos, ademas de  servirnos para decirnos para que lado se mueve tambien, puede traernos  problemas en el caso de que se corte la energia y arranque desde  cualquier posicion, pero eso con un poco de maña, se puede mejorar...che, son las 3 de la mañana... te dejo un abrazo


----------



## D@rkbytes (Mar 27, 2013)

Saludos.
Les traigo dos ejemplos de contadores 0-99 automáticos (Sin pulsador), usando el sistema multiplex.
En el primero utilice la conexión directa de los displays por el puerto B y dos displays de cátodo común.
En el segundo utilice un CI 7447 para la conexión de los displays y usando displays con ánodo común.
El ejemplo con el IC 7447 es más sencillo que el de conexión directa, ya que no requiere tabla de conversión.
Los ejemplos están comentados para su comprensión, y también adjunto los vídeos durante la simulación.

Espero les gusten.

Nota:
Los vídeos solo los realice hasta un conteo de 50.

Suerte.


----------



## ferdy575 (Mar 27, 2013)

torres.electronico dijo:


> Hola Ferdy... el encoder  rotativo que citas en el pdf, tiene la particularidad de poder tabajar  en ambos modos... Osea, es sabido que tenemos varios tipos de encoder,  de los cuales los mas destacables son los absolutos (los que te dicen el  angulo donde esta con una mayor resolucion) y los incrementales (los  que envian pulsos segun avance, pero si es de un solo canal, no tenemos  manera de saber donde esta el eje... si tiene dos canales, solo de esta  manera podriamos saber para que lado gira el encoder incremental, pero  nunca sabriamos perfectamente donde esta: Ahi ya tendriamos que jugar  con un par de lineas de mas para sumar y restar pulsos y mas o menos  saber donde tendria que estar cituado el eje).
> En el pdf, menciona  que en funcion encoder absoluto, tenes una sañal de 2Bits (4-6-8-10-12  pulsos en 360º), y en modo encoder absoluto, tenes una señal de 4 bits  (16 combinaciones en 360º)...
> Supongamos dado tu ejemplo anterior  que tenes en mano un encoder incremental de dos canales, la lectura para  saber para que lado gira, es sencilla... observemos nuevamente el  siguiente grafico:
> 
> ...



UUUffff Hermano sos un "MONSTRUO"  con esta vaina te felicito y gracias por tu ayuda voy a ver como escribo el programa siguiendo tu consejo y me perdonas por tu trasnochada muchas gracias está super tu analisis


----------



## inspector gadget (Mar 27, 2013)

D@rkbytes dijo:


> Saludos.
> Les traigo dos ejemplos de contadores 0-99 automáticos (Sin pulsador), usando el sistema multiplex.
> En el primero utilice la conexión directa de los displays por el puerto B y dos displays de cátodo común.
> En el segundo utilice un CI 7447 para la conexión de los displays y usando displays con ánodo común.
> ...



  Como siempre amigo Dark muy completos tus aportes, es un buen material para los que nos gusta practicar con contadores sobre dysplays de 7 segmentos.

Esta pregunta va enfocada a cuales son los fuses de programación para un pic 16f84a, lo que sucede es que he venido usando el 16f628a y me he familiarizado con su manejo, pero me ofrecieron venderme varios f84 a buen precio y los compre, y migre un ejemplo de un contador de 0 a 9 que me funciona con f628 y con el f 84 tengo problemas porque hace cosas extrañas en la simulación y que creo sean generadas por una mala configuración y como quiero emplearlos en varios proyectos y aunque se que debe incorporarse cristal y que 13 de sus puertos son E/S como en el f 628, desconozco que fuses tiene,  ojala puedan remitirme a algún ejemplo donde pueda ver esta configuración, aclaro que he buscado en este hilo, pero los programas que he visto, parten desde definir el oscilador pero los fuses no se cuales san para definirlos y eso es basico para montar los proyectos en fisico.  mil gracias por su tiempo.


----------



## D@rkbytes (Mar 27, 2013)

inspector gadget dijo:


> Como siempre amigo Dark muy completos tus aportes, es un buen material para los que nos gusta practicar con contadores sobre dysplays de 7 segmentos.


Gracias. 


inspector gadget dijo:


> Esta pregunta va enfocada a cuales son los fuses de programación para un  pic 16f84a, lo que sucede es que he venido usando el 16f628a y me he  familiarizado con su manejo, pero me ofrecieron venderme varios f84 a  buen precio y los compre, y migre un ejemplo de un contador de 0 a 9 que  me funciona con f628 y con el f 84 tengo problemas porque hace cosas  extrañas en la simulación y que creo sean generadas por una mala  configuración y como quiero emplearlos en varios proyectos y aunque se  que debe incorporarse cristal y que 13 de sus puertos son E/S como en el  f 628, desconozco que fuses tiene,  ojala puedan remitirme a algún  ejemplo donde pueda ver esta configuración, aclaro que he buscado en  este hilo, pero los programas que he visto, parten desde definir el  oscilador pero los fuses no se cuales san para definirlos y eso es  basico para montar los proyectos en fisico.  mil gracias por su  tiempo.


Para saber que fuses usa cierto PIC siempre recurro a los templates (plantillas) de Microchip.
Obviamente están escritos para usar lenguaje ensamblador, pero me dan una idea.
Las plantillas se encuentran en la carpeta de instalación de MPLAB, por default dentro de la carpeta:
C:\Archivos de programa\Microchip\MPASM Suite\Template\Code
Ahí se busca el archivo *.asm correspondiente al PIC, y viene la palabra de configuración.

Para saber con que fuses se compila el *.hex de nuestro programa, se puede compilar sin ellos,
y luego leerlos como por ejemplo con el programa WinPic800.
Otra opción, es ver los que usará el compilador por default.
Y se encuentran en la carpeta de instalación del compilador PBP, por default: C:\PBP.
Ahí se busca el archivo *.inc correspondiente al PIC que vamos a usar.

Si queremos saber mas acerca de cierto PIC, abrimos el archivo *.inc del PIC, y veremos una referencia.
Por ejemplo para el PIC16F84A veremos esta línea: include 'M16F8x.INC'    ; PM header
Ahora vamos a la carpeta INC y buscamos el archivo M16F8x.INC y lo abrimos para ver que hay dentro.
En ese archivo veremos todos los registros del PIC en cuestión, y obviamente los fuses disponibles.

Espero les sirva esta información.

Como dato adicional, en este documento viene información detallada sobre los PIC de medio rango.
*PICmicro Mid-Range MCU Family Reference Manual - Microchip*

 Suerte.


----------



## inspector gadget (Mar 27, 2013)

D@rkbytes dijo:


> Gracias.
> 
> Para saber que fuses usa cierto PIC siempre recurro a los templates (plantillas) de Microchip.
> Obviamente están escritos para usar lenguaje ensamblador, pero me dan una idea.
> ...



claro que la informacion me sirve, muchisimas gracias


----------



## Mushito (Mar 27, 2013)

Hola:Estoy empezando a desarrollar un programa para juegos con PIC, en la que al insertar una moneda, empiece el tiempo de juego. Mi primer programa lo hice con el pic16F628A y su correspondiente simulación y todo funciona bien, pero al migrar al pic 16F877A (por necesidad de mas puertos) el programa se salta al INICIO, sin necesidad de pulsar el botón (moneda). No entiendo en que me equivoqué, alguien tiene idea? O es una deficiencia de PROTEUS
Descarguen los archivos y prueben la simulación para ambos casos.


----------



## torres.electronico (Mar 27, 2013)

ferdy575 dijo:


> UUUffff Hermano sos un "MONSTRUO"  con esta vaina te felicito y gracias por tu ayuda voy a ver como escribo el programa siguiendo tu consejo y me perdonas por tu trasnochada muchas gracias está super tu analisis


Tengo un ejemplo de marito saco por si te interesa... Lo unico que tiene, es que esta en PICBASIC (se entiende perfectamente y es sencillo como hay que hacer los cambios)...
aca lo cito:


```
'****************************************************************
'*  Name    : ENCODER.BAS                                      *
'*  Author  : Mario G. Sacco                                    *
'*  Notice  : Copyright (c) 2011  - NeoTeo                      *
'*          : All Rights Reserved                               *
'*  Date    : 07/07/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

    'SELECCIONO PIC, CLOCK E INICIALIZACIÓN
    DEVICE = 18F2550        'SELECCIONO PIC Y CLOCK                    
    XTAL = 48                                
    
    'UTILIZO BOOTLOADER
    DECLARE PROTON_START_ADDRESS = $1000 ' INICIO EN DIRECCIÓN  $1000 
    
    CMCON = 7               'APAGO LOS COMPARADORES
    ALL_DIGITAL = True      'Y ANULO LAS ENTRADAS ADC (TODO DIGITAL)
    
    'DECLARO EL LCD
    LCD_DTPIN = PORTB.4        'SETEO EL LCD 16X2 PARA 4 CABLES
    LCD_RSPIN = PORTB.2
    LCD_ENPIN = PORTB.3
    LCD_INTERFACE = 4    
    LCD_LINES = 2
    LCD_TYPE = 0
    
    'REGISTROS DE LA INTERRUEPCIÓN
    SYMBOL BIERB0 = INTCON.1  'BANDERA DE INTERRUPCIÓN EXTERNA POR RB0 
    SYMBOL HEI    = INTCON.4  'HABILITACIÓN EXTERNA DE LA INTERRUPCIÓN POR RB0
    SYMBOL GIE    = INTCON.7  'HABILITACIÓN GLOBAL DE INTERRUPCIONES
    SYMBOL FLANCO = INTCON2.6 'FLAG=0>>>INTERRUPCIÓN POR FLANCO DE BAJADA
                              'FLAG=1>>>INTERRUPCIÓN POR FLANCO DE SUBIDA
    'DECLARO LA INTERRUPCIÓN
    ON_INTERRUPT GOTO SALTO   'SALTO A LA INTERRUPCIÓN

    'PARÁMETROS DE INICIO DE ALGUNOS REGISTROS
    GIE = 1                   'ACTIVO INTERRUPCIONES
    HEI = 1                   'ACTIVO INTERRUPCIÓN EXTERNA POR RB0
    FLANCO = 1                'AL INICIAR ACTIVO LA INTERRUPCIÓN


    DIM NUMERO AS WORD        'VARIABLE DE 0 A 65535         
    
    CLS                       'LIMPIO DISPLAY AL INICIAR
    
    NUMERO=127                'COLOCO LA VARIABLE AL CENTRO AL INICIAR             

'INICIO EL PROGRAMA PRINCIPAL  
INICIO:                       
     
     PRINT AT 1,1,"Encoder 18F2550 "
     PRINT AT 2,2,"      ",DEC NUMERO,"    "    'ESCRIBO EN PANTALLA 
     IF NUMERO <= 0 THEN NUMERO = 0     'TOPE MÍNIMO EN 0
     IF NUMERO >= 255 THEN NUMERO = 255 'TOPE MÁXIMO EN 255
     
     
GOTO INICIO                   'REINICIO EL CICLO 
'FIN DEL PROGRAMA PRINCIPAL             


'INTERRUPCIÓN                                
SALTO:                        'LEO EL ENCODER
       
 CONTEXT SAVE                 'GUARDA EL CONTEXTO DE LOS REGISTROS ANTES 
                              'DE EMPEZAR A TRABAJAR CON LA INTERRUPCIÓN
    IF PORTB.0 = 1    THEN    'SI RB0 ESTÁ EN 1
       FLANCO  = 0            'ACTIVO INTERRUPCIÓN POR FLANCO DE BAJADA
       IF PORTB.1 = 1 THEN    'CUANDO RB1 LLEGA A 1
          INC NUMERO          'INCREMENTO EL CONTADOR
       ENDIF
    ELSE                      'SI RB0 ESTÁ A 0  
       FLANCO  = 1            'ACTIVO INTERRUPCIÓN POR FLANCO DE SUBIDA
       IF PORTB.1 = 1 THEN    'CUANDO RB1 LLEGA A 1
          DEC NUMERO          'DECREMENTO EL CONTADOR
       ENDIF
    ENDIF
     
  BIERB0 = 0                  'BORRO LA BANDERA PARA HABILITAR NUEVAMENTE  
                              'LA INTERRUPCIÓN
 CONTEXT RESTORE              'REESTABLECE EL CONTEXTO DE LOS REGISTROS COMO  
                              'ESTABAN ANTES DE UTILIZAR LA INTERRUPCIÓN
```

Voy a ver si me siento esta noche con mas tiempo y lo pasamos a PICBASIC PRO, Yo tenia un ejemplo mio de un encoder, pero no tengo ni la mas remota idea en que disco y en que carpeta esta  
Lo use para hacer la version pbp de la fuente de baldeborre  pero con un 18F2550 (use el mismo hardware por que es compatible pin a pin)....
Nos vemos Ferdy





D@rkbytes dijo:


> Saludos.
> Les traigo dos ejemplos de contadores 0-99 automáticos (Sin pulsador), usando el sistema multiplex.
> En el primero utilice la conexión directa de los displays por el puerto B y dos displays de cátodo común.
> En el segundo utilice un CI 7447 para la conexión de los displays y usando displays con ánodo común.
> ...



Muy buenos ejemplos... Otra de las maneras de realizar un contador de 0-99 o de 0-999 con tan solo dos pines, es implementando el CD4026 (Decade Counter / Decoder and Driver)...  este trabaja por pulsos, lo cual, requiere un puerto para el clock y otro para el reset...
En la teoria, la hokja de datos comenta que se pueden controlar hasta 6  decoder, pero en la practica, yo personalmente en un cronometro, pude hacer funcionar a la perfeccion solo 5.
la conexion es mas que sencilla y para conectarlos en serie, tan solo hay que poner en carry los clock de los demas decoder... el MR (master reset) de cada integrado, van ligados todos juntos ...
Prometo subir algun diagrama y parte de la programacion.... saludos


----------



## isaiasjea (Mar 27, 2013)

> Hola:
> Estoy empezando a desarrollar un programa para juegos con PIC, en la que al insertar una moneda, empiece el tiempo de juego. Mi primer programa lo hice con el pic16F628A y su correspondiente simulación y todo funciona bien, pero al migrar al pic 16F877A (por necesidad de mas puertos) el programa se salta al INICIO, sin necesidad de pulsar el botón (moneda). No entiendo en que me equivoqué, alguien tiene idea? O es una deficiencia de PROTEUS
> Descarguen los archivos y prueben la simulación para ambos casos.



Saludos Mushito
tu codigo esta bien!!
lo unico que te faltaria es deshabilitar las salidas analogicas para que queden los puertos como digitales!
añadele esto a tu codigo y pruebalo.
ADCON1=7

Saludos y seguimos en contacto


----------



## Mushito (Mar 27, 2013)

Gracias isaiasjea, ese era el pequeño gran detalle.


----------



## Mushito (Mar 27, 2013)

Continuando con el proyecto aquí los adjuntos, pero necesito ideas para que con un evento externo (como una palanca mecánica y un switch, por ejemplo) se extienda el tiempo de juego, cargando el tiempo de juego nuevamente a 20 seg.
Aquí las simulaciones y el programa, pero no logro mi cometido.


----------



## inspector gadget (Mar 27, 2013)

D@rkbytes dijo:


> Así como tienes el programa no funcionará el contador del puerto D.
> Y recuerda que los programas son secuenciales, primero verás el conteo de 0 a 9 en el puerto B,
> y luego comenzara el conteo de 9 a 0 en el puerto D, y se repite el ciclo.
> Para que funcione el contador del puerto D, solo tenías que hacerlo así...
> ...



hola amigos, en estas vacaciones de semana santa ademas de orar, tambien le seguimos el ciclo al aprendizaje, y es por esto que me gustaria oir opinion de expertos sobre como es la estructura de un programa en la que tienen que leerse varias variables ya que como dijo Dark, el programa primero termina una tarea para despues encargarse de otra, y es por eso que no seria factible realizar un programa con 2 o 3 contadores al mismo tiempo y que cada uno lleve sus propios controles como inicio, reset etc, pero entonces como funcionan aquellos dispositivos que leen simultaneamete por ejemplo 5 temperaturas diferntes y la info la despliegan en una sola pantalla lcd, acaso son programas con otra estructura u otro lenguaje, no se podria realizar algo parecido para que cuenten 5 tiempos diferentes en un solo chip? talvez esto le este dando vueltas en la cabeza a muchos......agradezco mucho el aporte de varios foreros sobre los contadores, hay bastante para practicar y aprender.





torres.electronico dijo:


> Tengo un ejemplo de marito saco por si te interesa... Lo unico que tiene, es que esta en PICBASIC (se entiende perfectamente y es sencillo como hay que hacer los cambios)...
> aca lo cito:
> 
> 
> ...



Torres, esperamos ansiosamente tu aporte sobre contadores con 4026, mientras a chequear los datasheet de este cmos.


----------



## D@rkbytes (Mar 27, 2013)

Mushito dijo:


> Continuando con el proyecto aquí los adjuntos, pero necesito ideas para que con un evento externo (como una palanca mecánica y un switch, por ejemplo) se extienda el tiempo de juego, cargando el tiempo de juego nuevamente a 20 seg.
> Aquí las simulaciones y el programa, pero no logro mi cometido.


Tu código contiene varios errores, sobre todo en el control de la interrupción por cambio de estado RB4-RB7
Ya los corregí, y ahora al presionar el botón de tiempo extra, se reinicia el conteo a 29.

Suerte.



inspector gadget dijo:


> ¿como funcionan aquellos dispositivos que  leen simultaneamete por ejemplo 5 temperaturas diferentes y la info la  despliegan en una sola pantalla lcd,?
> ¿acaso son programas con otra estructura u otro lenguaje, no se podría  realizar algo parecido para que cuenten 5 tiempos diferentes en un solo  chip?


Leer información de varios sensores y luego mostrar la información en pantalla, no es difícil.
Tan solo se leen los sensores consecutivamente, se guarda la información en variables, se procesa y se muestra.
En el caso de sensores análogos como el LM35, realizar la tarea de leer varios y luego mostrar, es sencillo.
Cuando el proceso de lectura y conversión es semi complicado como el caso de un DS18B20,
entonces si puede demorar un poco la visualización  si se usan varios sensores.
Aún así, para ambos casos no se requiere del uso de microcontroladores potentes.

Quizás este ejemplo que adjunto, te parecerá muy interesante, es sobre Pseudo Multitasking con PIC.
Hace ya algún tiempo que lo descubrí, y ahora los enlaces están rotos.
Pero por suerte logré descargar los archivos, y aquí se los dejo.
En el archivo viene la explicación de como funciona, y algunas librerías. "Está en inglés"

Nota:
El proyecto original usaba un PIC16F887A, yo lo adapte a un PIC16F88.
Como quiera dejé el archivo *.bas original sin realizar modificaciones.

Saludos.


----------



## torres.electronico (Mar 28, 2013)

inspector gadget dijo:


> Torres, esperamos ansiosamente tu aporte sobre contadores con 4026, mientras a chequear los datasheet de este cmos.



Bueno, aca te subo el circuito basico que lo saque del manual que escribi para micros picaxe... basicamente es lo mismo... Como ejemplo, un programa para un picaxe 18X (pic16F88)



*Un ejemplo sencillo de como se trabaja el CD4026:*


```
;*****************************************************************
;*Proyecto: *
;*Timmer 60 segundos para calentamientos de ruedas en pruebas de 1/4 MILLA *
;*Desarrollado por: *
;*Ing. Martin A. Torres Fortelli *
;*****************************************************************
main:
if pin2 = 1 then main2         
goto main
main2:
let b2 = 60
gosub clock
goto main2
clock:
if b3 = b2 then endclk
for b3 = 1 to 60
pulsout 0,200          ;Pone en alto el pin del Clock
pause 1000
next b3
endclk:
pulsout 1,200            ; Pone en alto el pin del Reset
end
;*****************************************
;*************** Fin del programa ********
;*****************************************
```

  Como veras, es re sencillo el programa y pasarlo a PBP, es copiuar y pegar nada mas...
acá el circuito del programa de ejemplo:


----------



## Mushito (Mar 28, 2013)

Gracias Sr. Moderador 
D@rkbytes

Su ayuda me permite avanzar en mi pequeño proyecto


----------



## inspector gadget (Mar 28, 2013)

torres.electronico dijo:


> Bueno, aca te subo el circuito basico que lo saque del manual que escribi para micros picaxe... basicamente es lo mismo... Como ejemplo, un programa para un picaxe 18X (pic16F88)
> 
> Ver el archivo adjunto 89844
> 
> ...



uyyyy profe que buen documento, muchas gracias, se lo va aseguir molestando para que nos colabore con documentos similares, a proposito, nos vendria bien a muchos, el conseguir su libro....pero donde....mil gracias





D@rkbytes dijo:


> Tu código contiene varios errores, sobre todo en el control de la interrupción por cambio de estado RB4-RB7
> Ya los corregí, y ahora al presionar el botón de tiempo extra, se reinicia el conteo a 29.
> 
> Suerte.
> ...



en verdad interesante...esto va a ser productivo....gracias Darkbytes.


----------



## torres.electronico (Mar 28, 2013)

inspector gadget dijo:


> uyyyy profe que buen documento, muchas gracias, se lo va aseguir molestando para que nos colabore con documentos similares, a proposito, nos vendria bien a muchos, el conseguir su libro....pero donde....mil gracias



subi el link de descarga gratuita en el grupo picaxe que figura en mi firma... igualmente.... es un libro sobre programacion de micros con sistema picaxe...si bien es un basic similar a PBP, no es lo mismo...


----------



## inspector gadget (Mar 28, 2013)

torres.electronico dijo:


> subi el link de descarga gratuita en el grupo picaxe que figura en mi firma... igualmente.... es un libro sobre programacion de micros con sistema picaxe...si bien es un basic similar a PBP, no es lo mismo...



ahh bueno, lastima que en mi ciudad es bien dificil que traigan los picaxe, en cambio pics es como ir a comprar pan...hay de todas las referencias y el precio tiende a bajar, a proposito porque sera que no hay tanto comercio de los picaxe? he visto programas sencillisimos y faciles de entender, ojala se popularicen con rapidez, al menos donde no han llegado...algun buen libro PBP que nos recomiendenpara los que comenzamos...gracias


----------



## torres.electronico (Mar 28, 2013)

inspector gadget dijo:


> ahh bueno, lastima que en mi ciudad es bien dificil que traigan los picaxe, en cambio pics es como ir a comprar pan...hay de todas las referencias y el precio tiende a bajar, a proposito porque sera que no hay tanto comercio de los picaxe? he visto programas sencillisimos y faciles de entender, ojala se popularicen con rapidez, al menos donde no han llegado...algun buen libro PBP que nos recomiendenpara los que comenzamos...gracias



Por eso mismo deje de escribir sobre estos micros... son costosos... no se consiguen en todos lados y practicamente, ya estan quedando medios obsoletos para proyectos mas avanzados....
En Argentina, ahora se esta tratando de incluir en el sistema educativo, ASM + CSS.... asi que me propuse arrancar a escribir un nuevo libro justamente de PicBasic Pro, pero con la alternancia de que los estoy  enfocando a un nivel un poco mas avanzado de lo que ya hay dando vuelta por internet, ya que enseño como mejorar  nuestros proyectos insertando rutinas, interrupciones, entre otras cosas  mas en ASM... 
Saludos y gracias por tu comentario


----------



## inspector gadget (Mar 29, 2013)

torres.electronico dijo:


> Por eso mismo deje de escribir sobre estos micros... son costosos... no se consiguen en todos lados y practicamente, ya estan quedando medios obsoletos para proyectos mas avanzados....
> En Argentina, ahora se esta tratando de incluir en el sistema educativo, ASM + CSS.... asi que me propuse arrancar a escribir un nuevo libro justamente de PicBasic Pro, pero con la alternancia de que los estoy  enfocando a un nivel un poco mas avanzado de lo que ya hay dando vuelta por internet, ya que enseño como mejorar  nuestros proyectos insertando rutinas, interrupciones, entre otras cosas  mas en ASM...
> Saludos y gracias por tu comentario



Esperamos tu libro, grcias profe, exitos en tu actividad.


----------



## ferdy575 (Mar 29, 2013)

por fa alguien que me ayude con este basic no se que tiene que el proteus me da error; al simularlo sale un error que dice: SIMULATION IS NOT RUNNING IN REAL TIME DUE TO EXCESSIVE CPU LOAD
este es el código:

```
'****************************************************************
'           control serie para servo con 16f628a                *
'                         emisor                                *
'****************************************************************
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, WDT_ON          
@ device xt_osc
define osc 4
   
include "modedefs.bas"

trisb=0
portb=0
posi var word
		
serieout var portb.1 
          
inicio: 
Pot porta.0,127,posi
posi = posi / 2 + 100
serout serieout,T2400,[6,6,"ok",#posi]        
Goto inicio
		
End
```
a ver si alguien me puede ayudar a ver que tiene mal les agradezco de antemano


----------



## inspector gadget (Mar 29, 2013)

igual error me da algunas veces cuando quiero simular un programa con displays de 7 segmentos y en mi caso los causa la multiplexacion, es como si se sobrecargara de datos el simulador y no responde, pero al montarlos en protoboard me trabajan, y la verdad no se como configurar el proteus para evitar esto.....necesitamos una opinion de los expertos.


----------



## manolo5 (Abr 1, 2013)

Hola, soy nuevo en este foro y verán e desarrollando un programa para el manejo de una puerta de garaje con el pic16f77a en pic basic con microcode, pero verán aquí me surgen dos dudas 

1. como alimentar el pic con un 7805, por que como verán este pic tiene 2 puertos de alimentación y pues tengo solo un regulador de voltaje y la cuestión es. si necesito un regulador de voltaje para cada puerto de alimentación o solo con uno basta.


2. verán la programación que hice es automática, pero no me sale para que funcione con pulsador uno para subir y otro para que baje.

ésta es la programación automática, una vez que arranque la simulación sube y baja automáticamente

```
trisb=0

izquierda:
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 100
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 100
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 100
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 5000
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 100
   portb=%0100
  pause 100
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 100
   portb=%0100
  pause 100
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 100
   portb=%0100
  pause 100
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 5000
 
goto izquierda:

end
```


Les agradezco mucho por la ayuda.


----------



## torres.electronico (Abr 2, 2013)

manolo5 dijo:


> .... como alimentar el pic con un 7805, por que como verán este pic tiene 2 puertos de alimentación y pues tengo solo un regulador de voltaje y la cuestión es. si necesito un regulador de voltaje para cada puerto de alimentación o solo con uno basta.



Se alimentan los dos a la vez con el mismo regulador... Si observas detenidamente todo este topico  Veras que muchas personas subieron diagramas, diseñosde pcb, etc... el que busca encuentra... Otra cosa... con que o como vas a controlar a nivel hardware el PAP? con que desacoplas ambos dos?
Tene en cuenta que un transformador chino como fuente es mala idea y sumale, a que vas a tener que  implementar filtros ya que las intererencias te van a jugar en contra..saludos


----------



## Edo0707 (Abr 5, 2013)

Hola necesito su ayuda con los retardos para pic16f84a, bueno les cuento, ocupo que una funcion X que dure 3 segundos y luego salte, con un ejemplo seria asi: tengo una tabla de la verdad de X entradas , y se cumple una salida Y ,  la salida es 1100 necesito que se mantenga por 3 segundos y luego goto inicio... espero que me puedan ayudar


----------



## D@rkbytes (Abr 7, 2013)

Edo0707 dijo:


> Hola necesito su ayuda con los retardos para pic16f84a, bueno les cuento, ocupo que una funcion X que dure 3 segundos y luego salte, con un ejemplo seria asi: tengo una tabla de la verdad de X entradas , y se cumple una salida Y ,  la salida es 1100 necesito que se mantenga por 3 segundos y luego goto inicio... espero que me puedan ayudar


¿ Y por qué no haces una pausa de 3 segundos y continuas?

Por ejemplo...

PORTB = %1100
Pause 3000
GoTo Inicio


----------



## Edo0707 (Abr 8, 2013)

D@rkbytes dijo:


> ¿ Y por qué no haces una pausa de 3 segundos y continuas?
> 
> Por ejemplo...
> 
> ...



si, esa me sirve, gracias pero lo necesito para ensamblador creo que se llama asi, lo copilo en mplab, eso que me pusiste más bien no estará en c...


----------



## D@rkbytes (Abr 8, 2013)

*OFF-TOPIC = ON*



Edo0707 dijo:


> si, esa me sirve, gracias pero lo necesito para ensamblador creo que se llama asi, lo copilo en mplab


Eso lo hubieras aclarado antes. 


Edo0707 dijo:


> eso que me pusiste más bien no estará en c...


Nop. Es lenguaje PICBasic, de lo que se trata este tema.

Usa esto...

```
; Retardo = 3 segundos
; Frecuencia de reloj = 4 MHz.

; Retardo actual = 3 segundos = 3000000 ciclos
; Error = 0 %

    cblock
    cnt1
    cnt2
    cnt3
    endc

Retardo3Segundos
; 2999995 ciclos
    movlw    0x1A
    movwf    cnt1
    movlw    0x8B
    movwf    cnt2
    movlw    0x07
    movwf    cnt3
Bucle3Segundos
    decfsz    cnt1,F
    goto    $+2
    decfsz    cnt2,F
    goto    $+2
    decfsz    cnt3,F
    goto    Bucle3Segundos
; 1 ciclo
    nop
; 4 ciclos (incluyendo call)
    return
```
Suerte.

*OFF-TOPIC = OFF*


----------



## Edo0707 (Abr 8, 2013)

D@rkbytes dijo:


> *OFF-TOPIC = ON*
> 
> 
> Suerte.
> ...


listo, gracias era lo que ocupaba.


----------



## inspector gadget (Abr 8, 2013)

saludos, una consulta: tengo un pequeño programa en 12c508a, ¿puedo migrar mi codigo a 12f508 sin ningun inconveniente? , es que no lo puedo correr en proteus ya que no trae esta referencia de pic, otra cosa, el nuevo proteus se deb pagar para instalarlo en mi pc y si lo instalo, me abre todas las simulaciones qu estan n eel foro? lo pregunto porque veo que ya los compañeros del foro estan comenzando a emplearlo y si no lo tengo, es imposible simular los aportes hechos n la nuva version, yo tengo el 7.5, debo eliminarlo para instalar la nuva version? qu m aconsejan...gracias.


----------



## D@rkbytes (Abr 8, 2013)

inspector gadget dijo:


> saludos, una consulta: tengo un pequeño programa en 12c508a, ¿puedo migrar mi codigo a 12f508 sin ningun inconveniente? , es que no lo puedo correr en proteus ya que no trae esta referencia de pic, otra cosa, el nuevo proteus se deb pagar para instalarlo en mi pc y si lo instalo, me abre todas las simulaciones qu estan n eel foro? lo pregunto porque veo que ya los compañeros del foro estan comenzando a emplearlo y si no lo tengo, es imposible simular los aportes hechos n la nuva version, yo tengo el 7.5, debo eliminarlo para instalar la nuva version? qu m aconsejan...gracias.


Si, si puedes usar el 12F508, la F (Flash) significa que el dispositivo es reprogramable.
El 12C508 es OTP (One Time Programmable) Y se usa para distribución final.

El nuevo Proteus disponible oficialmente es un demo, ya tiene tiempo que salio la nueva versión 8,
y ya he estado incluyendo las simulaciones en algunos ejemplos, pero junto con la conversión a v7.
Se utiliza de forma diferente a las anteriores, pues ahora la ventana inicial es un entorno de desarrollo integrado.
Ahora tienes la opción de seleccionar los programas que utilizaras desde la ventana principal.
Aparte contiene un navegador web que se inicia al ejecutar el programa.

No debes eliminar la versión anterior de Proteus que ya tengas instalada.
El nuevo Proteus 8 se instala en una carpeta diferente, y no interfiere con los accesos directos del 7.X.
Ahora cambian los iconos de acceso directo y los archivos del proyecto.
Como siempre, puedes abrir proyectos de versiones anteriores con esta nueva versión.

Saudos.


----------



## inspector gadget (Abr 8, 2013)

Gracias Dark, como siempre muy prolijo en tus aportes que benefician a todos.


----------



## Mushito (Abr 8, 2013)

Como temporizar 2 horas?, aunque no sea exacto.
Ayuda please.


----------



## D@rkbytes (Abr 8, 2013)

Mushito dijo:


> Como temporizar 2 horas?, aunque no sea exacto.
> Ayuda please.


Mira _este proyecto_ y para 2 horas cargas la variable de tiempo t2 con 7200

Suerte.


----------



## Milesatra (Abr 9, 2013)

Hola comunidad.. e estado leyendo tutoriales y manuales un poco tontos de como programar microcontroladores para aumentar mis conocimientos pero no e encontrado uno bueno... hasta ahora.. este esta increible.. esxplican muy bien los felicito.. ;D no he terminado de leer todos.. pero tengo una duda.. en los priemros ejemplos.. se usa solo un editor de texto para hacerlos o es algun programa especial como visual studio.. o algo asi? Espero su respuesta..  mientras tanto seguire con el resto de los ejemplos


----------



## D@rkbytes (Abr 9, 2013)

Milesatra dijo:


> en los priemros ejemplos.. se usa solo un editor de texto para hacerlos o es algun programa especial como visual studio.. o algo asi?


Como te habrás dado cuenta se trata de lenguaje PICBasic y existen varios programas que puedes usar.
Puedes escribir tu programa en un editor de texto como notepad, pero luego necesitas compilarlo.
A lo largo del tema se ha usado como editor MicroCode Studio, y como compilador PICBasic Pro.
Así desde el mismo entorno tienes varias herramientas disponibles, y desde ahí puedes programar el PIC.
Ahora ya existe la versión 3 de PBP, pero la mas utilizada por la mayoría es sin duda PBP 2.60.

Continua leyendo el tutorial para que tengas mas conocimientos acerca de este lenguaje.

Suerte.


----------



## inspector gadget (Abr 9, 2013)

Saludos, a proposito de repasos, lo estoy haciendo poco a poco en este foro, para no volver a preguntar lo que posiblemente ya esta resuelto, y comenze por leer sobre como controlar lcd con 16f877a, ya que se complementan bien a mi modo de ver, este chip tiene innumerables posibilidades, asi que saberlo dominar junto con lcd esta de lujo, pero me he topado con el inconveniente de que hay varios ejercicios muy buenos que aunque se dice que esta incluida la simulacion, esta no aparece, en otros casos solo esta el hex sin que aparezca el codigo, mi pregunta es si estaban asi desd el principio o fueron deshabilitados posteriormente, estare posteando mis dudas sobre este tema si no encuentro alguna respuesta que me ayude  a despejar mis dudas, gracias por su valioso tiempo





D@rkbytes dijo:


> Mira _este proyecto_ y para 2 horas cargas la variable de conteo t2 con 7200
> 
> Suerte.



Darkbytes saludos, habría algún problema en realizar temporizaciones para varios minutos empleando simplemente repeticiones como base de tiempo? en simulación funciona bien y en físico, me refiero a si a largo plazo, el empleo de esta técnica dentro del programa puede comenzar a presentar alguna falla en montaje físico?


----------



## Milesatra (Abr 9, 2013)

Gracias por la ayuda.. ya descarge microcode studio y pic basic pro.... pero cuando le doy compile sale una ventanda que dice:
"serching for MPSAM folder pleace wait"... pero.. no tengo nada de MPSAM... y no lo puede compilar..


----------



## D@rkbytes (Abr 10, 2013)

inspector gadget dijo:


> Darkbytes saludos, habría algún problema en realizar temporizaciones para varios minutos empleando simplemente repeticiones como base de tiempo? en simulación funciona bien y en físico, me refiero a si a largo plazo, el empleo de esta técnica dentro del programa puede comenzar a presentar alguna falla en montaje físico?


¿Retardos con repeticiones, te refieres a usar un bucle For?
Si es así, debe servir, el problema es usar la instrucción Pause, ya que congela el micro durante su ejecución.

A continuación adjunto dos ejemplos de temporizadores precisos usando el Timer 1 del PIC.
Se usa un cristal externo de 32768 Hz. para la sincronización del TMR1 (De los que usan los relojes digitales)
Se genera 1 segundo de temporización por desborde del Timer 1 que puede ser usada para el diseño de un reloj.
Ó como en estos ejemplos para realizar un temporizador con períodos precisos de conteo.

La ventaja de usar este método, es que no existe congelamiento del PIC durante la temporización,
y así se pueden ejecutar otras tareas mientras el conteo deseado sigue avanzando.
La desventaja es que se pierden dos pines, los destinados al oscilador del cristal (T1OSO y T1OSI)
Que en el caso de estos ejemplos, donde use un 16F628A, son los pines RB6 y RB7.


Milesatra dijo:


> Gracias por la ayuda.. ya descarge microcode  studio y pic basic pro.... pero cuando le doy compile sale una ventanda  que dice:
> "serching for MPSAM folder pleace wait"... pero.. no tengo nada de MPSAM... y no lo puede compilar..


Me supongo te refieres a MPASM.
Eso es normal cuando MicroCode Studio no ha encontrado la carpeta del compilador MPASMWIN.
Debes instalar MPLAB si deseas compilar con ese compilador. Descárgalo desde la pagina oficial de Microchip.
 Pero no descargues el MPLABX, sino el MPLAB IDE, que por ahora va en la versión 8.90.
Después de la instalación de MPLAB, realiza una búsqueda manual de la carpeta del compilador,
y estableces la carpeta: C:\Archivos de programa\Microchip\MPASM Suite
Dependiendo el sistema, podría ser también C:\Program files\Microchip\MPASM Suite, u otra ruta.
La idea es encontrar la carpeta MPASM Suite, que es donde se encuentra el compilador MPASMWIN.

Saludos y suerte.


----------



## inspector gadget (Abr 10, 2013)

Gracias dark, podrian decirme que pasa con los archivos de los primeros ejercicios con lcd, Mecatrodatos tiene muy buenos ejercicios pero es imposible ejecutarlos en proteus, ni tampoco quiere abrir los programas en PBP a pesar d haberlos descomprimido, ojala l puedan hachar una miradita haber que sucede con estos archivos...gracias por su tiempo.


----------



## MrCarlos (Abr 10, 2013)

Hola inspector gadget Por qué dices que: es imposible ejecutarlos en proteus ??.Lo Hice y funcionan bien. Qué error te marca el ISIS de Proteus ??Por qué dices que no puedes abrir los PBP??Marca algún error??... Cuál es ?? Desde el mensaje #22 al #26 de este tema, mecatrodatos desarrolla varios circuitos y programas para el manejo del LCD. Cuál en particular no te funciona ?? saludosa sus ordenes


----------



## inspector gadget (Abr 10, 2013)

MrCarlos dijo:


> Hola inspector gadget
> 
> Por qué dices que: es imposible ejecutarlos en proteus ??.
> Lo Hice y funcionan bien. Qué error te marca el ISIS de Proteus ??
> ...


Saludos y gracias por responder pronto. la verdad no se que hacer, ya que llevo mucho tiempo simulando varios ejercicios sin problema, pero ahora que intento un repaso general me doy cuenta que en las primeras paginas de este curso tengo problemas a la hora de ejecutar los ejercicios para no ir muy lejos comienzo con el primer ejercicio de mecatrodatos en la pagina 1 creo que es el mensaje 9, lo descomprimo con winzip, también lo hice con winrar, aparece la carpeta descomprimida y sus respectivos archivos como son simulación, hex ,pbp, entre otros pero estos son los que nos interesan, luego abro el microcode y el archivo llamado proyecto1 led (que es el ejercicio citado) no aparece para abrirlo, intento con el proteus y tampoco se encuentra el archivo y supuse que posiblemente este en una versión posterior a la que manejo que el la 7.5, pero para corroborar eso abro mi programador y tampoco aparece el archivo hex,  a pesar de que en la descompresión aparecen los iconos de dichos archivos, proteus, hex, pbp....intento con otras herramientas y me dice que son archivos de solo lectura, o con proteus sale un mensaje que dice: Archivo no es una aplicacion win 32 valida,  lo mismo pasa con varios de los ejercicios no solo de meca, hay varios,muy raro no? teniendo en cuenta que esta acción la repito continuamente para repasar y no había sucedido antes, claro con ejemplos posteriores de otros mensajes, por ejemplo si voy hasta el mensaje 192 de la pagina 10 donde Dario postea unos archivos de un ejercicio llamado proporcional, ahí no tengo ningún problema, así sucede con muchísimos mas adelante donde no tengo problema....que puede estar pasando, ayúdenme a buscar una solución, muchísimas gracias por su tiempo.





D@rkbytes dijo:


> ¿Retardos con repeticiones, te refieres a usar un bucle For?
> Si es así, debe servir, el problema es usar la instrucción Pause, ya que congela el micro durante su ejecución.
> 
> A continuación adjunto dos ejemplos de temporizadores precisos usando el Timer 1 del PIC.
> ...



Saludos dark, ojala me puedas colaborar con el problema que se me presento en la descarga de los archivos de los primeros ejercicios de este curso y que relate mas arriba, por otro lado quisiera por favor claridad a que hace referencia el concepto de que un pic se quede congelado por el uso de los pauses en las repeticiones y que el chip pudiera realizar otras tareas mientras se ejecuta la temporización? tareas como cuales podrían ser por ejemplo? y no entiendo es por el hecho que en mensajes anteriores, solicitaba la guía para realizar dentro de un mismo chip, varios contadores independientes en sus funciones pero dentro del mismo chip, osea activar un contador, o varios si es necesario, o pausar el que yo quiera, con el fin de no emplear un chip por cada uno, dado que la finalidad de usar un micro es prescindir de varios circuitos integrados digitales y usar un micro  que tenga muchos pines como el 16f877 u otros, para emplear sus puertos justamente en el desarrollo de varias tareas,  y me comentabas que esto no es posible ya que los programas son secuenciales y primero se realiza una tarea, para después seguir con otra, entonces no me queda claro leyendo ahora que se podrían realizar otras tareas mientras se ejecuta una, querría decir lo anterior que lo que pretendo si es posible y la limitación es la forma de realizar el programa? gracias por tu colaboración y sugerencias.


----------



## MrCarlos (Abr 10, 2013)

Hola inspector gadget

Probablemente al descomprimir esos archivos con tus WINZIP o WINRAR les gregue o no les cambie e atributo llamado Read only.

Al descomprimirlo dale un click con el botón secundario(Derecho) del mouse y selecciona propiedades. Podrás ver que atributos tiene ese archivo.
Por ejemplo puede tener el de solo lectura u oculto. Esos 2 atributos son los importantes. Tienes que desmarcarlos.

Por lo pronto te adjunto el proyecto que viene en el mensaje #9 el cual, entre muchos LED’s, enciende  y apaga uno solo.

saludos
a sus ordenes

Vaya, modificaste tu mensaje antes de responderte.


----------



## inspector gadget (Abr 10, 2013)

MrCarlos dijo:


> Hola inspector gadget
> 
> Probablemente al descomprimir esos archivos con tus WINZIP o WINRAR les gregue o no les cambie e atributo llamado Read only.
> 
> ...


MrCarlos , gracias por ayudarme, dichas casillas están desmarcadas, no entiendo porque a pesar de descomprimirse no aparecen desde proteus, ni en PBP o desde mi programador, el archivo que incluyes en tu ultimo mensaje descomprime igual que los otros, pero a este si lo puedo llamar desde proteus y los demás programas, no se que pasa, o que versiones debo usar para poder llamarlos, que versiones tienes tu, ya que a ti si te funcionan? gracias por tu interés.


----------



## MrCarlos (Abr 10, 2013)

Hola inspector gadget

La versión que tengo es la 7.8 SP2.

No podríamos decir que tu versión sea anterior a la de mecatrodatos pues entonces no podrías abrir los que te he enviado.
No sé a que se deba ese problema, sin embargo si nesesitas algún otro diseño lo puedo “acomodar” como el anterior que subí para que lo puedas manejar.
Ahorra mensajes mencionando en qué # está y de que trata.

saludos
a sus ordenes


----------



## inspector gadget (Abr 11, 2013)

MrCarlos, otra vez te agradezco, mira si puedes hacerme el favor, los archivos que necesito son: No.23,24,25,26 y 40 que tratan d ejercicios que involucran LCD. Necesito investigar y usar como base estos archivos y ver si despejan mis dudas, de todas maneras ya posteare  lo que pretendo, no sin antes realizar los avances para solicitar la valiosa ayuda de este foro, gracias por tu tiempo.


----------



## diodito (Abr 11, 2013)

hola, me podrían explicar  como le hago una rutina de comprobar errores  el siguiente programa tengo una secuencia de led que se enciendes al conectar un cableado utp par entrenando ,lo que quiero es saber como hacer que me muestre cuando hay error y cuando este bueno



saludes


----------



## MrCarlos (Abr 11, 2013)

Hola inspector gadget

Espero no haber omitido nada y que no tengas problemas con estos archivos.

saludos
a sus ordenes


----------



## Milesatra (Abr 11, 2013)

Saliendome un poquito del tema que llevan ahora en este hilo.. pero creo que es algo que aca puedo preguntar.. jeje.. alguien me podria decir si hay alguna forma de programar un pic en micro code studio y despues incorporarlo a la biblioteca de livewire para simularlo en un circuito?


----------



## MrCarlos (Abr 11, 2013)

Hola Milesatra

Creo que no hay forma de modificar las bibliotecas de LiveWire.
Sin embargo este simulador trae un dispositivo llamado Word Generator.
Este generador lo puedes incorporar en tu diseño, en LiveWire, 
Luego editar sus propiedades para programarle unos o ceros en sus 16 salidas.
Eso que le programes lo puedes guardar como un archivo yyy.DAT para posteriormente re-utilizarlo.

saludos
a sus ordenes


----------



## inspector gadget (Abr 12, 2013)

MrCarlos dijo:


> Hola inspector gadget
> 
> Espero no haber omitido nada y que no tengas problemas con estos archivos.
> 
> ...



gracias amigo, voy a ejercitar.


----------



## jussi (Abr 18, 2013)

Hola buenas tardes!!
Tengo un proyecto con un PIC16F628A , 3 botones , 2 leds y un Display 7 seg.







Consiste en que cada vez que el botón conteo se pulsa el numero va ir cambiando del 1-9.
cada numero va tener un ciclo distinto.
el botón START va activar ese ciclo dependiendo en el numero que se encuentre va ir ejecutando ese ciclo.
ejemplo:
Si el conteo esta en el numero 1 hace lo siguiente:
se prenden los 2 les después hace una pausa de 100 mili segundos se apaga el led2 y hace otra pausa 100 mili segundos y repite el ciclo infinitamente hasta que el botón RESETse apriete empezara todo.
y así sucesivamente con cada numero con la diferencia que cada numero cambia el timpo de espera.
Numero:
1------- 9 mili segundos
2------- 8 mili segundos
3------- 7 mili segundos
4------- 6 mili segundos
5------- 5 mili segundos
6------- 4 mili segundos
7------- 3 mili segundos  
8------- 2 mili segundos  
9------- 1 mili segundos

yo realice este código que aun no termino pero si me pudieran echar una manita por favor.


```
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device  pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_on, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7
TRISA = %00000011
TRISB = %00000000
PORTA = 0
PORTB = 0
'*******************************************************************************
dI1 var byte
dI2 var byte
B0 var byte
B1 VAR BYTE
SUMA var byte
SUMA = 0
B0 = 0
B1 = 0
PORTB = 121
'*******************************************************************************
INICIO:
Button PORTA.0,1,255,0,B0,1,ESTADO
Button PORTA.1,1,255,0,B1,1,CLOCK
GOTO INICIO 

ESTADO:
suma = suma+1
if suma = 9 then suma = 0
di1 = suma
LOOKUP di1, [121,36,48,25,18,2,120,0,16], di2
PORTB = di2
pause 10
goto inicio

CLOCK:
PORTA.2 = 1
PAUSE 100
GOTO CLOCK1

CLOCK1:
END
```
que función me recomiendan para activar con un IF o con un CASE son las dos formas que se me ocurre para la activación del START.
Gracias y espero me puedan ayudar


----------



## jussi (Abr 18, 2013)

> que función me recomiendan para activar con un IF o con un CASE son las dos formas que se me ocurre para la activación del START.
> Gracias y espero me puedan ayudar



Buenas Noches!
aquí pongo una de las formas con la cual esta trabajando el proyecto bien!!

con la función Select Case:


```
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device  pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_on, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7
TRISA = %00000011
TRISB = %00000000
PORTA = 0
PORTB = 0
'*******************************************************************************
dI1 var byte
dI2 var byte
B0 var byte
B1 VAR BYTE
SUMA var byte
SUMA = 0
B0 = 0
B1 = 0
PORTB = 121
'*******************************************************************************
INICIO:
Button PORTA.0,1,255,0,B0,1,ESTADO
Button PORTA.1,1,255,0,B1,1,CLOCK
GOTO INICIO 

ESTADO:
PAUSE 200
suma = suma+1
if suma = 9 then suma = 0
di1 = suma
LOOKUP di1, [121,36,48,25,18,2,120,0,16], di2
PORTB = di2
pause 10
goto inicio

CLOCK:
PORTA.2 = 1
GOTO CLOCK1

CLOCK1:
PAUSE 200
Select Case PORTB
case 121
goto NUM1
case 36
goto NUM2
case 48
goto NUM3
case 25
goto NUM4
CASE 18
goto NUM5
CASE 2
goto NUM6
CASE 120
goto NUM7
CASE 0
goto NUM8
CASE 16
goto NUM9
End Select 

NUM1:
PORTA.7 = 1
PAUSE 9
PORTA.7 = 0
PAUSE 9
GOTO NUM1

NUM2:
PORTA.7 = 1
PAUSE 8
PORTA.7 = 0
PAUSE 8
GOTO NUM2

NUM3:
PORTA.7 = 1
PAUSE 7
PORTA.7 = 0
PAUSE 7
GOTO NUM3

NUM4:
PORTA.7 = 1
PAUSE 6
PORTA.7 = 0
PAUSE 6
GOTO NUM4

NUM5:
PORTA.7 = 1
PAUSE 5
PORTA.7 = 0
PAUSE 5
GOTO NUM5

NUM6:
PORTA.7 = 1
PAUSE 4
PORTA.7 = 0
PAUSE 4
GOTO NUM6

NUM7:
PORTA.7 = 1
PAUSE 3
PORTA.7 = 0
PAUSE 3
GOTO NUM7

NUM8:
PORTA.7 = 1
PAUSE 2
PORTA.7 = 0
PAUSE 2
GOTO NUM8

NUM9:
PORTA.7 = 1
PAUSE 1
PORTA.7 = 0
PAUSE 1
GOTO NUM9
end
```

de esta manera hace los ciclos que necesito hasta que el reset reinicia todo.

Saludos y si a alguien le interesa el Código con gusto adjunto los archivos.


----------



## jffrc (Abr 20, 2013)

Buenas Saludos a todos. soy nuevo en programación picbasic pro, quiero hacer un programa que active por un pin del pic16f628a una bomba de agua por 4 horas continuas. no encuentro instruccion que active un pulso por largo tiempo y posteriormente de desactive. Gracias por adelantado


----------



## D@rkbytes (Abr 20, 2013)

D@rkbytes dijo:


> Mira _este proyecto_ y para 2 horas cargas la variable de tiempo t2 con 7200
> 
> Suerte.


Así que si requieres de 4 horas de temporizado, cargas la variable t2 con 14400

Suerte.


----------



## jffrc (Abr 20, 2013)

Gracias D@rkbytes pero no entiendo la logica de 
t2 = 300                ; 5 x 60 = 300 segundos (5 Minutos)

entiendo que los retardos son de 500ms como son dos es igual a 1sg pero, por que el contador tiene que ser hasta 300?



para 60 segundos seria:

LEDENCENDIDO VAR PORTB.0
SW1 var porta.0
I VAR BYTE
T var word
T1 var word

INICIO:

T=60
t1=0

If sw1=0 then goto PRENDERBOMBA
goto inicio


PRENDERBOMBA:
high ledencendido

TIEMPO:
if t1<T then 
     t1=t1+1
     PAUSE 1000
Goto tiempo
ENDIF

low ledencendido
goto inicio:
END



Ok gracias ya entendi


----------



## linkf3r (Abr 21, 2013)

Hola, una pregunta, estoy planenando hacer un sensor de luz para abrir y cerrar las ventanas de mi casa por medio de 1 solo motor, el problema es que me necesito usar el comparador analogico digital del pic 12f683, pero no se cuales sean los defines que necesito poner, si me pudieran ayudar con eso se los agradeceria mucho.


----------



## D@rkbytes (Abr 22, 2013)

linkf3r dijo:


> Hola, una pregunta, estoy planenando hacer un sensor de luz para abrir y cerrar las ventanas de mi casa por medio de 1 solo motor, el problema es que me necesito usar el comparador analogico digital del pic 12f683, pero no se cuales sean los defines que necesito poner, si me pudieran ayudar con eso se los agradeceria mucho.


Definiciones hay muchas, vienen en la ayuda de MicroCode Studio.
Tan solo escribe define y con el cursor sobre la palabra presiona la tecla F1, aparecerá la ayuda de PBP
Para empezar debes leer la hoja de datos del PIC en la sección 8.3 (*Comparator Configuration*)
Verás que los registros asociados son CMCON0, CMCON1 y VRCON

Suerte.


----------



## inspector gadget (Abr 25, 2013)

jussi dijo:


> Buenas Noches!
> aquí pongo una de las formas con la cual esta trabajando el proyecto bien!!
> 
> con la función Select Case:
> ...



amigo, podrias compartir los archivos simulacion etc?


----------



## jussi (Abr 26, 2013)

> amigo, podrias compartir los archivos simulacion etc?


los Archivos están en la pagina 129
de todas formas te dejo el enlace
https://www.forosdeelectronica.com/f24/curso-programacion-pic-picbasic-pro-20658/index129.html

Nota:
Esta echa la Simulación en el nuevo proteus por eso no aparece la extensión común DNS , si no es PDSPRJ


----------



## D@rkbytes (Abr 26, 2013)

*AVISO*

Para evitar confusiones entre los nuevos formatos de archivos de Proteus v8.x.
Por favor adjunten si es posible, el archivo de diseño con la versión 7.x.
Y si no es posible, mencionen que el archivo de simulación está realizado en la nueva versión 8.x.
Ya que muchas personas aún no tienen la nueva versión, y les será imposible abrirlos.

*Gracias.*​


----------



## MrCarlos (Abr 26, 2013)

Hola

Por lo pronto jussi, en su mensaje #2579 dejó también una imagen de donde se puede realizar el diseño en ISIS 7.x.

saludos
a sus ordenes


----------



## inspector gadget (Abr 26, 2013)

jussi dijo:


> los Archivos están en la pagina 129
> de todas formas te dejo el enlace
> https://www.forosdeelectronica.com/f24/curso-programacion-pic-picbasic-pro-20658/index129.html
> 
> ...



ahhhh con razon no aparecia el DSN, diablos....donde consigo la version 8? ya lo he intentado con algunos en laces queaparecen en el buscador pero no es ni siquiera ingles donde dice como hacer la descarga. debo pasar el esquematico a proteus en mi version, no veo de otra. 
Gracias amigo.


----------



## MrCarlos (Abr 26, 2013)

Hola inspector gadgetl

Pero. . . . en la pagina 129, mensaje #2579 de jussi viene el: Control-Velocidad.ZIP.
En él trae un archivo nombrado: Velocidad-001.Jpg; en éste te puedes basar para hacer tu diseño el el ISIS que tengas.

Si no puedes aquí está:

saludos
a sus ordenes


----------



## jussi (Abr 27, 2013)

> Si no puedes aquí está:



Gracias MrCarlos por echarme la mano a convertirlo a versión 7.X por que yo ya la borre y solo tengo instalada la 8.0, pero me parece que en un mensaje  de D@rkbytes dijo que se podia tener instalado las 2 versión esto es correcto??
Gracias


----------



## MrCarlos (Abr 27, 2013)

Hola jussi

La verdad no sé si se puede tener las 2 versiones; es muy probable que sí.
Habría que experimentar un poco.

Pero es muy creible lo que dice D@rkbytes.

saludos
a sus ordenes


----------



## ricbevi (Abr 27, 2013)

jussi dijo:


> Gracias MrCarlos por echarme la mano a convertirlo a versión 7.X por que yo ya la borre y solo tengo instalada la 8.0, pero me parece que en un mensaje  de D@rkbytes dijo que se podia tener instalado las 2 versión esto es correcto??
> Gracias



Hola...yo en particular tengo instalada las dos versiones dado que tengo infinidad de trabajos en la versión 7xx y funcionan perfectamente las dos.

Saludos.

Ric.


----------



## ferdy575 (Abr 27, 2013)

hola a todos, les cuento que ando haciendo un dimmer para la sala de TV a control remoto y tengo estos 2 códigos:
para el transmisor el código es:

```
;***************************************
;transmisor 16f84a con potenciometro   *
;***************************************
include "modedefs.bas"
trisb=0
portb=0
pos var byte		
dim1 var portb.1           
mainloop: 
Pot porta.0,127,pos
pos = pos / 2 + 100
        serout dim1,T2400,[6,6,"ok",#pos]        
 Goto mainloop		
        End
```

y para el receptor el código es:

```
'*******************************************************
'receptor 16f84a serie                                 *
'*******************************************************
include "modedefs.bas"
trisa=1
porta=1
trisb=0
portb=0
pos var byte  'aquí guardamos el valor de la posición
dimin var porta.0
dim   var portb.0
pulsout servo,150
principal:
serin dimin,T2400,100,reset,#pos 'función serin en porta.0
pos = pos 
pulsout dim,pos
serout portb.1,T2400,[6,6,"ok",#pos]
goto principal
reset:
pulsout dim,150 ; aquí sera el punto medio de iluminación   
goto principal
```
la verdad son códigos creados por el compañero D@rio pero con algunas reformas pero no me quieren funcionar, a ver  sí me pueden ayudar y les encuentran los errores además quisiera saber sí puedo enviar la información de varios potenciometros al mismo receptor y como lo puedo hacer como seria la reforma del código emisor y como seria la reforma del código receptor pues me gustaría controlar tambien por ejemplo las cortinas y el ventilador; les agradezco de antemano


----------



## jussi (Abr 27, 2013)

Gracias por su respuesta!!
ricbevi y MrCarlos instalare la versión 7.10 que tengo, a ver como me va con las 2 versiones instaladas!!!


----------



## PauJef (Abr 27, 2013)

Saludos amigos ando con un problema, estoy tratando de hacer un proyecto que cuenta los pulsos de un medidor de flujo y los luego los transformo en PWM para poder variar la velocidad de un motor y todo lo muestro en un LCD, pero al utilizar el comando COUNT, se daña to porque como es un comando que demora un tiempo realizando la lectura de los pulsos, se demora bastante, y eso que le baje el tiempo de lectura de COUNT PORTC.1,1000,dato a COUNT PORTC.1,125,dato ; y al momento de generar el PWM, es como si al momento de leer los pulsos se apagara por un instante y vuelve a retornar provocando que el motor esta como que se quiere apagar y de nuevo toma velocidad, me aconsejaron realizarlo con interrupciones pero no tengo claro como setar el OPTION_REG y el INTCON, porque quiero hacerle que lea interrupciones externas y no sew que habilitar ya que segun el datasheet se tiene que habilitar el T0CKI que es el pin RA4 pero de ahi no se que mas habilitar, osea OPTION_REG=%???????? y INTCON=%???????? no se si me puden ayudar con el programa, AQUI ENVIO EL PROGRAMA con COUNT.

El programa consiste solo en que el motor varie su velocidad en un rango de caudal o sea entre 0 y 5lt/s baja un 40%, entre 6 y 10 lt/s se mantiene en el voltaje seteado y > 10lt/s sube.

Un dato más, hice el programa leyendo en vez de pulsos una señal analogica en vez de pulsos usando el conversor AD y me salio mucho mejor, asi que he estado tratando de consegir un acondicionador de señal de frecuencia a voltaje, pero son muy costosos, por favor necesito de su ayuda. Gracias



```
PROGRAMA CONTADOR DE PULSOS DE UN MEDIDOR DE FLUJO
DEFINE  LCD_BITS    4
Define	LCD_DREG	PORTC        
Define	LCD_DBIT	4
Define	LCD_RWREG	PORTD         
Define	LCD_RWBIT	6               
Define	LCD_RSREG	PORTD         
Define	LCD_RSBIT	5             
Define	LCD_EREG	PORTD         
Define	LCD_EBIT	7            
DEFINE  ADC_BITS 8
define  OSC 4
define ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 30
;TRISD = %00000000 
TRISB = %01001111
TRISA = 255
ADCON1 = 2
caubaj var byte
caumini var byte
volt var byte
oxbajo var byte
x  var byte
dato var word
;pulsos var byte
datoE var byte
datoS var byte
botsubir var portb.1
botbajar var portb.2
enter  var portb.3
led var portd.3
alerta var PORTD.2
Qnormal var PORTD.0
Qbaja var PORTD.1
sensor1 var portb.6
frec var byte            
bandera var bit
frec = 10
eeprom 0,[5,10,1,90]         ;contenido inicial de la EEPROM

inicio:                ;3 parpadeos del led indica que funciona
for x =1 to 3
    HIGH led
    pause 200
    low led
    pause 200
next
READ 0, caubaj             ;lee la EEPROM 0 y lo guarda en tempbaj
READ 1, caumini            ;lee la EEPROM 1 y lo guarda en tempalt
read 2, volt
read 3, oxbajo
medir:
    pwm PORTC.2,FREC,100
    low led 
    bandera = 0
    count PORTC.1,125,dato 
    adcin 1, datoE
    adcin 2, datoS
	Lcdout $fe, 1 ,"Q.mi Q.lt/m Q.ma"
    dato = dato*2 
    datoE = datoE/2
    datoS = datoS/2              
    Lcdout $fe,$c6,DEC dato	
    Lcdout $fe,$c0,DEC caubaj	
    Lcdout $fe,$cc,DEC caumini 
    lcdout $fe,$d5,dec oxbajo,"%"
    lcdout $fe,$9f,"V"
    lcdout $fe,$90,"Oent":lcdout $fe,$95,"Oref":lcdout $fe,$9a,"Osal"
    lcdout $fe,$d0,DEc datoE,"%":Lcdout $fe,$da,dec datoS,"%"
    lcdout $fe,$de,dec volt
    if sensor1 = 1 then medir
    for x = 1 to 3             
    if enter = 0 then grabar1a
    pause 10
    next  
    if botsubir = 0 then SUBIR
    if botbajar = 0 then BAJAR
    if datoS < Oxbajo then high alerta
    if datoS > oxbajo then low alerta
    if caubaj > dato then disminuir  
    if caumini > dato > caubaj then mantener
    goto medir
aviso:
   high led
    goto medir
mantener:
    low Qbaja: high Qnormal  
    if frec > (volt*10) then medir
    if bandera = 1 then medir
    high led
    bandera = 1
    frec = frec + 10
    goto medir    
disminuir:
    low Qnormal:  high Qbaja
    if botsubir = 0 then SUBIR
    if frec < (volt*7) then medir
    if bandera = 1 then medir
    high led
    bandera = 1
    frec = frec - 10
    goto medir
SUBIR:
    if frec > 249 then aviso
    if bandera = 1 then medir
    high led
    bandera = 1
    frec = frec+10
    goto medir
BAJAR:
    if frec < 11 then aviso
    if bandera = 1 then medir
    high led
    bandera = 1 
    frec = frec - 10
    goto medir
grabar1a:
    gosub soltar 

grabar1:
    Lcdout $fe, 1 ,"Programar Q."
    lcdout $fe,$c0,"bajo= ",dec caubaj ,"lt/m"
    pause 100
    if botbajar = 0 then restar1
    if botsubir = 0 then sumar1
    if enter = 0 then grabarA
goto grabar1

restar1:
    gosub soltar                  ;programa antirrebote de tecla
    if caubaj < 1 then grabar1
    caubaj = caubaj - 1
goto grabar1

sumar1:
    gosub soltar
    if caubaj > 24 then grabar1
    caubaj = caubaj + 1
goto grabar1

grabarA:
    gosub soltar
    write 0, caubaj       ;escribir en la dirección 0 de la EEPROM

grabar2:   
    Lcdout $fe, 1 ,"Programar Q."
    lcdout $fe,$c0,"alto= ",dec caumini ,"lt/m"
    pause 100
    if botbajar = 0 then restar2
    if botsubir = 0 then sumar2
    if enter = 0 then grabarB
goto grabar2

restar2:
    gosub soltar
    if caumini < 5 then grabar2
    caumini = caumini - 1
goto grabar2

sumar2:
    gosub soltar
    if caumini > 24 then grabar2
    caumini = caumini + 1
goto grabar2 

grabarB:
    gosub soltar
    write 1, caumini          ;escribir en la dirección 1 de la EEPROM
grabar3:
    Lcdout $fe, 1 ,"Programar Volt."
    lcdout $fe,$c0,"Volt= ",dec vOLT ,"V"
    pause 100
    if botbajar = 0 then restar3
    if botsubir = 0 then sumar3
    if enter = 0 then grabarC
goto grabar3

restar3:
    gosub soltar                  ;programa antirrebote de tecla
    if Volt < 1 then grabar3
    Volt = Volt - 1
goto grabar3

sumar3:
    gosub soltar
    if Volt > 23 then grabar3
    Volt = Volt + 1
goto grabar3

grabarC:
    gosub soltar
    write 2,Volt 

grabar4:
    Lcdout $fe, 1 ,"Programar O."
    lcdout $fe,$c0,"O.bajo= ",dec oxbajo,"%"
    pause 100
    if botbajar = 0 then restar4
    if botsubir = 0 then sumar4
    if enter = 0 then grabarD
goto grabar4

restar4:
    gosub soltar                  ;programa antirrebote de tecla
    if oxbajo < 1 then grabar4
    oxbajo = oxbajo - 1
goto grabar4

sumar4:
    gosub soltar
    if oxbajo > 99 then grabar4
    oxbajo = oxbajo + 1
goto grabar4

grabarD:
    gosub soltar
    write 3,oxbajo   
goto inicio

soltar:                       ;programa antirrebote de tecla
    high led
    pause 150
    low led
soltar2:
    if botbajar = 0 then soltar2
    if botsubir = 0 then soltar2
    if enter = 0 then soltar2
    pause 100
    return
end
```


----------



## torres.electronico (Abr 28, 2013)

PauJef dijo:


> Un dato más, hice el programa leyendo en vez de pulsos una señal analogica en vez de pulsos usando el conversor AD y me salio mucho mejor, asi que he estado tratando de consegir un acondicionador de señal de frecuencia a voltaje, pero son muy costosos, por favor necesito de su ayuda. Gracias



Hola, hay muchos integrados que cumplen esa funcion y no todos son de costos elevados... leete pdf sobre la familia el LM39xx y LM29xx ... Un CI especificos para esto  y economico es el LM2907N... hay muchos en mercado (AD650, VFC32, XR4151)                                                                      
de que tension estamos hablando? 0 a 5Vcc? por que con un sencillo capacitor y una resistencia (se lo llama filtro) en la salida del pic, se puede hacer la salida analogica con el pwm...
Ahi te subo el pcb y el diagrama basico de un proyecto que arme donde enero una señal analogica a la salida del PIC a partir de un pwm que trabaja similar a lo que vos estas haciendo (segun una señal analogica entrante, tenemos una señal analogica proporcional a la salida)...

PD: te agrego algunpos datos para que tengas en cuenta

```
;*****************************************************
; NOTAS COMPLEMENTARIAS:
; PARTIENDO DE LA BASE PARA UN DAC R-C, TENEMOS QUE:
;Variable nivel PWM - nivel = (Vout * 255) / V.Fuente
;para 1100mV nivel = 55
;para 1000mV nivel = 50
;para 900mV nivel = 45
;para 800mV nivel = 40
;para 700mV nivel = 35
;para 600mV nivel = 30
;para 500mV nivel = 25
;para 400mV nivel = 20
;para 300mV nivel = 15  
;para 200mV nivel = 10
;para 100mV nivel = 5
;******************************************************
```


----------



## torres.electronico (Abr 28, 2013)

torres.electronico dijo:


> Hola, hay muchos integrados que cumplen esa funcion y no todos son de costos elevados... leete pdf sobre la familia el LM39xx y LM29xx ... Un CI especificos para esto  y economico es el LM2907N... hay muchos en mercado (AD650, VFC32, XR4151)
> de que tension estamos hablando? 0 a 5Vcc? por que con un sencillo capacitor y una resistencia (se lo llama filtro) en la salida del pic, se puede hacer la salida analogica con el pwm...
> Ahi te subo el pcb y el diagrama basico de un proyecto que arme donde enero una señal analogica a la salida del PIC a partir de un pwm que trabaja similar a lo que vos estas haciendo (segun una señal analogica entrante, tenemos una señal analogica proporcional a la salida)...
> 
> ...



PD2: encontraste por lo que veo parte de mi codigo... me resulta familiar parte de tu programa... solo queria mencionarte que la escritura de la eeprom, tiene un numero limitado... es grande el numero, pero solo queria mencionarte que si lo vas a usar en otro proyecto y hay escrituras de eeprom muy continuas (por decir 150 escrituras por hora)... al año te vas a quedar sin micro


----------



## PauJef (Abr 29, 2013)

Disculpa creo que me esplique mal o te confundiste, TorresElectronico, yo necesito sacar PWM de salida metiendo pulsos al pic, lo que no puedo es leer los pulsos, ya lo hice con el comando COUNT pero es demasiado lento, y me dijeron que le haga con interrupciones pero no puedo setear el OPTION_REG Y EL INTCON para logra que lea una interrupcion externa po medio del RA4 T0CKI, ya que deseo controlar un motor de 24V y lo hago disparando unos SCRs

Necesito obtener voltaje DC variable el cual sea proporcional al numero de pulsos (frecuencia) que me da un medidor de flujo.
Yo lo realice mediante un Pic al cual le envio a un pin los pulsos del medidor de flujo y saco por otro pin PWM y de ahi voy controlando un voltaje mas alto con el disparo de un Tip o un SCR, pero no me sale un voltaje optimo, tambien le puse una pantalla LCD para que me vaya mostrando los litros/seg que mide el medidor de flujo, es decir a 4 pulsos por segundo es 1 litro, y al ser mi rango de control entre 5 lt/s y 10lt/s, o sea si vaja de 5lt/s me reduce un 40% el voltaje de entrega y si sobrepasa los 10 lt/s sube un 20% de voltaje, todo facil hasta ahi, pero cuando arme el circuito y al hacerlo funcionar, se nota que al monento que esta leyendo los pulsos se demora el programa y el voltaje de salida baja notablemente, y se apaga y se enciende.
Hice un cambio y en vez de leer pulsos medi el voltaje analogico de un poten, el voltaje PWM me salio perfento reduciendo un 40% al baja de 5lt/seg y sube un 20% al subir de 10lt/seg, sin demorarse perceptiblemente nada.
Intente convertir los pulsos mediante un Lm2907N, para enviarle un voltaje analogico al PIC, pero el LM2907N no me convierte de frecuencia a voltaje, teniendo en cuenta que estoy utilizando 5 VCD de alimentacion.
Que solucion puede haber?


----------



## torres.electronico (May 1, 2013)

hola...relee tu consulta inicial...relee mi resspuesta... luego,relee tu nueva consulta y fijate lo que respondo.... o sea, si lees,vas a interpretar como generar con un pwm y un filtro a la salida esa señal analogica de cero a cincol volts son prescindir de cualquier otro IC. lamentablemente te estoy reapondiendo desde el telefono y se complica ayudarte,pero pon un poco xe voluntad y trata de interpretar lo que te digo.... no hay mucha ciencia


----------



## plh489 (May 1, 2013)

Perfecto hola...darkbyte, te agradezco la correccion, ya que soy nuevo en el foro, tengo cosas que aprender aun.
en fin pasando a lo que me conpete como dije necesito hacer un reloj decreciente de 24 a 0 segundos para basquet, esto incluye que se detenga en cualquier segundo y poder volver a 24 con un pulsador de reset, y cuando pase los 14 segundo en descuento y se pause el reloj, luego al reanudar debe volver a 14 y descontar desde ahi hasta 0.
espero se entienda a lo que me refiero. 
estuve investigando un poco pero me vuelve loco la programacion en PicBasic Pro, tengo hecho el contador pero nose como agregar los pulsadores.-
les envio una imagen de como seria a grandes razgos el diagrama de flujo de lo que necesito, y como va el programa en basic. seguro con error por eso acudo a uds a por una ayuda. gracias. 
mas o menos las conexiones las tengo. ya lo voy a diagramar y lo subo para que lo vean. 

enserio muchas gracias cualquier aporte! saludos


----------



## PauJef (May 2, 2013)

Si, te entiendo Torres Electronico, pero el pwm si me sale, lo que no puedo es leer los pulsos del medidor de flujo los cuales son 4pulsos/segundo = un litro/s, y tambien tengo que mostrar los litros por segundo en un LDC, pero con el comando COUNT es muy lento porque se demora 1 segundo hasta leer los pulsos,y por eso se me estropea el pwm de salida, y me aconsejaron leer los pulsos con interrupcione y eso es lo que no comprendo bien para setear el OPTION_REG y el INTCON, porfa si puedes ayudarme con eso porque segun estuve leyendo en el dataSheet toca habilitar el T0CKI en el pin RA4


----------



## DEPREDADORX1 (May 2, 2013)

Hola PauJef,

Pues este es un ejemplo donde se captura por toki usando el timer1, ya te toca seguir mirando para agregar el pwm, espero te sea de ayuda.

```
'PICBASIC PRO program to demonstrate using Timer1 gate in single-pulse mode to capture single pulse event times.
' Description : PICBASIC PRO program to demonstrate using Timer1 gate
' in single-pulse mode to capture single pulse event times.

Device = 16F877A
Xtal = 20

All_Digital true
'Declaration for LCD 
       Declare LCD_Type = 0         ;LCD is Alpha
       Declare LCD_DTPin = PORTD.4  ;LCD data line starting port.pin
       Declare LCD_ENPin = PORTD.1  ;LCD EN line
       Declare LCD_RSPin = PORTD.0  ;LCD RS line
       Declare LCD_Interface = 4    ;LCD 4 line interface
       Declare LCD_Lines = 2
	 
  Dim	Pval As Word    ' Holds pulse time from Timer1
  
  GoSub Init    ' Hardware initialization routine  
	    
'Clear
   
	mainloop:
	   PORTB.4 = 1   ' Toggle RB4 on Timer1 gate pin high
       PORTB.4 = 0   ' Toggle Timer1 gate pin low to stop Timer1	    
	   Pval.LowByte = TMR1L  ' Read Timer1 value
	   Pval.HighByte = TMR1H	    
	   Print At 2,1, "pulsos",Dec Pval	    
	  ' GoSub Reset1   ' Clear Timer1 count & reset T1 gate
	   DelayMS 500   
	   GoTo mainloop ' Do it forever
	    
	Reset1:
	   TMR1H = 0    
	   TMR1L = 0
	   Return
	    
	Init:
       TRISC.0=1	    
	   TRISB = %00100000  ' RB5 = input for T1 gate, RB4 = output to gate
	   PORTB = 0          ' Hold T1 gate low at start	    
	   T1CON = %00000011  ' Timer1 on, incremento por tocki   
       Return
	   End
```


----------



## inspector gadget (May 3, 2013)

hola expertos, estoy practicando un conteo en un display de 7 segmentos, pero no se como acceder y manejar la eeprom del 16f628a, lo que intento es conservar el conteo, cuando desenergize el chip, y cuando retorne la alimentación, que el conteo siga desde donde quedo antes de que la alimentación se interrumpiera, también me interesa como y cuando emplear y acceder a una memoria externa, pero ya posteare mis inquietudes cuando mis practicas lleguen a ese punto. espero me puedan colaborar y gracias por su tiempo.


di var byte     
dat VAR BYTE    
TRISB = 0

prog:
    for di=0 to 15    
    lookup di,[64,121,36,48,25,18,2,120,0,16,8,3,70,33,6,14],dat
    portb=dat                                      
    pause 500        
    next di          
goto prog
END



bien, podria alguien explicarme como usar las declaraciones EEPROM, READ Y WRITE para tratar de usarlas en el ejemplo anterior, o al menos con un ejercicio basico, ya que desconociendo como usarlas, es imposible hacer avances en el codigo...ojala alguien tenga la voluntad de orientarme ya que mi duda es clara, y es lo que pretendo aprender en este CURSO PROGRAMACION EN PBP...gracias.


----------



## D@rkbytes (May 3, 2013)

inspector gadget dijo:


> hola expertos, estoy practicando un conteo en un display de 7 segmentos, pero no se como acceder y manejar la eeprom del 16f628a, lo que intento es conservar el conteo, cuando desenergize el chip, y cuando retorne la alimentación, que el conteo siga desde donde quedo antes de que la alimentación se interrumpiera, también me interesa como y cuando emplear y acceder a una memoria externa, pero ya posteare mis inquietudes cuando mis practicas lleguen a ese punto. espero me puedan colaborar y gracias por su tiempo.
> 
> 
> di var byte
> ...


Aquí adjunto un proyecto con lo que deseas hacer.
El sistema está basado en la interrupción por RB0 cuando se produce un corte eléctrico.
Se mantiene alimentado al PIC por medio de un capacitor y un diodo que separa la fuente principal.
El capacitor debe ser de un valor tal, que lo mentenga alimentado durante un breve período.
(Tiempo suficiente para poder escribir en la EEPROM interna), usé uno de 2200µF.

Las recomendaciones a tener en cuenta para que funcione bien, son:
.- Configurar el fuse BOREN (Brown Out Reset) en OFF
.- Procurar evitar carga excesiva del PIC en los periféricos.
En este ejemplo usé un display de ánodo común para tal efecto.
El proyecto funciona tanto en la simulación, como físicamente.
Se incluyen programa, esquema y simulación.

Espero les sirva como referencia. Suerte


----------



## ferdy575 (May 8, 2013)

ferdy575 dijo:


> hola a todos, les cuento que ando haciendo un dimmer para la sala de TV a control remoto y tengo estos 2 códigos:
> para el transmisor el código es:
> 
> ```
> ...



definitivamente no le he podido hallar donde estará el error que no permite que funcione el código


----------



## reyvilla (May 9, 2013)

Hola muy buenas, vuelvo después de un tiempo por acá de nuevo un saludos a todos los compañeros. Voy a retornar aportando soluciones en lo que pueda por acá. 
Empiezo con el amigo ferdy575, Amigo he trabajado con modulos RF un tiempo incluso llegue a trabajarlos bidireccionamente y no es nada sencillo, lo primero que noto en tu codigo es la configuración de los fuses no se si la haces de forma manual y por eso lo menciono. Aparte algo que me ayudo a solucionar problemas con los módulos RF es ver si trasmitian y recibian la información los microcontroladoes y para eso me hice un pequeño cable con un conector rs-232 y utilizando únicamente el pin 5 GND y el pin2 RX y con ayuda del virtual terminal del PBP podía ver si efectivamente estaba enviando la información y el microcontrolador y si el receptor la estaba recibiendo, esto conectando el cable de gnd a l gnd del circuito y el cable de rx al tx del circuito o a la salida del RX del modulo RF. Por el momento esto el dia de mañana te adjunto una imagen del cable que hice y si me da chance un vídeo de como lo uso. Por otro lado que módulos estas usando?


----------



## Oskaring (May 10, 2013)

Hola compañeros, y siempre gracias por todo lo aquì aprendido.
 El tema es que pese a que todavía estoy en pañales en programación, me animé a hacerme un simulador amanecer-anochecer para el acuario por pwm, modificando un poco el programa de rtc ds1307 con pic 16f628a del libro de Carlos Reyes. En la simulacíon todo anda correcto pero en la práctica la posición 16 de la segunda linea parpadea y nada mas. Si se les ocurre alguna idea les estarìa muy agradecido (estoy a poco de quedarme calvo de pensar).


----------



## zal (May 10, 2013)

Hola! estoy entrando al mundo de los conversores A/D, en este caso utilizo un PIC 16F877A para covertir y enviar una señal por puerto serie y visualizar en labview. El problema es el siguiente cuando lo simulo en el proteus puedo observar desde el virtual terminal que hay una conversión y envío de datos, sin embargo al cnectarlo virtualmente con el labview o el serial comunicator del PBP (por medio del programa virtual serial port driver) no logro transferir nada. No logro encontrar donde esta el error.

el programa es el siguiente:

include "modedefs.bas"
@ device XT_OSC
define osc 4
DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50
dato var byte
adcon1=%1110
inicio:
    pause 300
    ADCON0=%1000001
    pauseus 50
    ADCON0.2=1
    pauseus 50
    dato=ADRESH
    pause 300
    serout portc.7,N9600,[dato]
    pause 300
    goto inicio
end


----------



## ferdy575 (May 10, 2013)

reyvilla dijo:


> Hola muy buenas, vuelvo después de un tiempo por acá de nuevo un saludos a todos los compañeros. Voy a retornar aportando soluciones en lo que pueda por acá.
> Empiezo con el amigo ferdy575, Amigo he trabajado con modulos RF un tiempo incluso llegue a trabajarlos bidireccionamente y no es nada sencillo, lo primero que noto en tu codigo es la configuración de los fuses no se si la haces de forma manual y por eso lo menciono. Aparte algo que me ayudo a solucionar problemas con los módulos RF es ver si trasmitian y recibian la información los microcontroladoes y para eso me hice un pequeño cable con un conector rs-232 y utilizando únicamente el pin 5 GND y el pin2 RX y con ayuda del virtual terminal del PBP podía ver si efectivamente estaba enviando la información y el microcontrolador y si el receptor la estaba recibiendo, esto conectando el cable de gnd a l gnd del circuito y el cable de rx al tx del circuito o a la salida del RX del modulo RF. Por el momento esto el dia de mañana te adjunto una imagen del cable que hice y si me da chance un vídeo de como lo uso. Por otro lado que módulos estas usando?


Hola Rey 
Gracias por mirar mi código, a ver tecuento lo de los fuses los configuro manualmente y los módulos usados son el TXR434 y el RXR434 la verdad ya he probado los módulos con los HT12D y Ht12E y me funcionaron bien sin embargo voy a hacer la prueba del cable como me dices te agradezco mucho tu ayuda


----------



## reyvilla (May 10, 2013)

ferdy575 dijo:


> Hola Rey
> Gracias por mirar mi código, a ver tecuento lo de los fuses los configuro manualmente y los módulos usados son el TXR434 y el RXR434 la verdad ya he probado los módulos con los HT12D y Ht12E y me funcionaron bien sin embargo voy a hacer la prueba del cable como me dices te agradezco mucho tu ayuda



Hola yo tengo los TLP434 emisor y receptor que trabajan a 315Mhz y los he trabajado bastante y funcionan muy bien, con respecto al cable te dejo las imágenes para que veas de que te hable, el cable verde de la imagen va conectado al tierra osea al GND del circuito que va a trasmitir y el cable azul directo al pin TX del pic ó al RX dependiendo de lo que quieras probar, si es la recepción del modulo RF o la trasmisión del pic. Un ejemplo si lo primero que quieres probar es que el pic si esta enviando la información lo conectas directo al pin del pic que esta conectado al emisor RF. Y si lo que quieres es saber si el pic esta recibiendo la señales RF lo conectas al Pin de salida del modulo RF. Y allí ya a través del hiperterminal del PBP veras como llegan la señales, ten en cuenta que seguro veras cuando conectes al pin del salida del receptor del RF vas a ver mucha basura y eso es por que el receptor recibe todas las señales que esta en el ambiente a esa frecuencia, lo importante es que puedas ver que en un momento si este recibiendo los datos que tu le envías. Avísame cualquier cosa o dudas que tengas... Mucho éxito 





Oskaring dijo:


> Hola compañeros, y siempre gracias por todo lo aquì aprendido.
> El tema es que pese a que todavía estoy en pañales en programación, me animé a hacerme un simulador amanecer-anochecer para el acuario por pwm, modificando un poco el programa de rtc ds1307 con pic 16f628a del libro de Carlos Reyes. En la simulacíon todo anda correcto pero en la práctica la posición 16 de la segunda linea parpadea y nada mas. Si se les ocurre alguna idea les estarìa muy agradecido (estoy a poco de quedarme calvo de pensar).



Hola amigo Oskarin, estuve revisando tu código y observo que el PWM que usas es por emulación o soft, debido a esto limitas al microcontrolador hacer otras cosas mientras ejecuta s el pwm por soft. En estos días me decidí a realizar varias pruebas y verificar las diferencias de cada una de las características de los microntroladores que traen ya ellos internamente y los emulados por el PBP. Entre ventajas y desventajas de ese modulo PWM existe un muy importante entre el PWM emulado del PBP y el de Hardware del PIC.  Y es que el PBP mantiene ocupado al PIC para ejecutar el PWM que en si tarda un tiempo a menos que sea lo único que vayas a realizar no te lo recomiendo. En cambio el que trae el PIC por Hardware con sus registros etc... Se mantiene constante y ejecutándose mientras el PIC puede realizar cualquier otra tarea sin perturbar el ciclo de trabajo ni frecuencia del PWM. Y ya veras que al saber trabajar con este modulo del pic es muy facil y practico. Por otra parte una desventaja de este modulo es que es uno solo  ya quisieran mucho que fueran mas, pero bueno con este puedes multiplexar o incrementarlo con compuertas pero ya ese es otro tema. Ahora como utilizas ese modulo pues revisa un poco la hoja del micro y busca la sección de PWM para el 16F628A y cualquier duda me avisas. Éxito...


----------



## reyvilla (May 11, 2013)

zal dijo:


> Hola! estoy entrando al mundo de los conversores A/D, en este caso utilizo un PIC 16F877A para covertir y enviar una señal por puerto serie y visualizar en labview. El problema es el siguiente cuando lo simulo en el proteus puedo observar desde el virtual terminal que hay una conversión y envío de datos, sin embargo al cnectarlo virtualmente con el labview o el serial comunicator del PBP (por medio del programa virtual serial port driver) no logro transferir nada. No logro encontrar donde esta el error.
> 
> el programa es el siguiente:
> 
> ...



Hola amigo zal, unas observaciones para tu código, al igual que mencione al amigo ferdy575, ten en cuenta los fuses ya sea que lo hagas en forma manual o en tu código, lo otro debes definir cuales pines de los puertos van hacer salidas y cuales van hacer entradas los I/O, estoy ya que si vas a leer un pin de cualquier puerto ya sea digital o análogo lo debes configurar como entrada ya que de lo contrario no vas a poder leerlo. Otra cosa que debes tomar en cuenta es la configuración del A/D los registros ADCON0 y ADCON1 tienen configuraciones bien estrictas que deben de coincidir de lo contrario puedes confundirte con respecto a lo que esta leyendo el PIC y lo que tu crees que esta leyendo, esto por que una de las configuraciones es la justificación o forma de ordenar el valor obtenido por el A/D si es justificado a la derecha o a la izquierda. En esa misma idea debes tomar en cuenta que en tu código estas configurando el ADCON0 con cada lectura y debes tomar en cuenta que el bit 2 del ADCON0 es un bit de estatus del A/D y seteo por lo tanto es un bit que puedes leer y escribir, "ADCON0.2=1", esto iniciaría la lectura del A/D y para saber si ya termino de leer, valga la redundancia debes leer el bit 2 de ADCON0 y seria algo asi, (IF adcon.2 = 0 then) que seria lo mismo que preguntar si ya termino la lectura del A/D, para entonces saber si ya puedes copiar el dato obtenido en ADRESH ó ADRESL, y trasmitirlo. Continuando con el ADCON0, como te indicaba estas configurándolo con cada vuelta del loop que hiciste en tu código, en la primera linea después del inicio colocaste "ADCON0=%1000001", donde estas configurando desde el bit 6 hasta el bit 0, y donde el bit 0 = 1, bit1 = 0, bit2= 0, bit3 = 0, bit4= 0, bit5= 0, bit6=1 y bit7= 0, el bit 7 queda en 0 por definición si no se especifica, el bit 7 y 6 son los ADCS1:ADCS0 con los cuales especificas el reloj que vas a utilizar y ademas tienes el ADCS2 que es el bit 6 de ADCON1 que ayuda a lo mismo de selección de reloj, en tu caso que el ADCON1 = %1110, quedan del bit 4 al 7 en 0 y los demás bit 0 = 0, bit1 = 1,bit2 = 1, bit3 = 1. Por lo cual tu A/D quedaría configurado de la siguiente manera: 

ADCON0 =01000001

ADCS2 = bit 6 del ADCON1
ADCS1:ADCS0 = bit 7-6 de ADCON0

ADCS2:ADCS1:ADCS0: A/D Conversion Clock Select bits (ADCON0 bits in bold)
001 FOSC/8

bit 5-3 CHS2:CHS0: Analog Channel Select bits
000 = Channel 0 (AN0)

bit 2 GO/DONE: A/D Conversion Status bit
When ADON = 1: Cuando ADON = 1
1 = A/D conversion in progress (setting this bit starts the A/D conversion which is automatically
cleared by hardware when the A/D conversion is complete). La conversion esta en progreso.
0 = A/D conversion not in progress. La conversion no esta en progreso.

bit 1 Unimplemented: Read as ‘0’

bit 0 ADON: A/D On bit
1 = A/D converter module is powered up. Enciende el A/D
0 = A/D converter module is shut-off and consumes no operating current. Apaga el A/D


ADCON1 =00001110 

bit 7 ADFM: A/D Result Format Select bit
0 = Left justified. Six (6) Least Significant bits of ADRESL are read as ‘0’.

bit 6 ADCS2:

ADCS2:ADCS1:ADCS0: A/D Conversion Clock Select bits (ADCON0 bits in bold)
001 FOSC/8

bit 5-4 Unimplemented: Read as ‘0’

bit 3-0 PCFG3CFG0: A/D Port Configuration Control bits

           AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 VREF+ VREF- C/R
1110   D       D      D     D       D     D      D       A     VDD     VSS    1/0

Con lo cual tenemos seleccionado el Análogo digital 0, con un reloj de Fosc/8, estoy creo que es cuando quieres sincronizar de alguna manera el muestreo. Normalmente yo utilizo Frc ya que tendrías que sacar un calculo en función a tu selección de reloj con respecto al oscilador que estas usando y la frecuencia de la señal Análoga. Estas disparando GO sin tomar en cuenta si ya termino la conversión y estas leyendo el registro ADRESH igual sin saber si ya la conversión termino. 

Otra cosa es que en el PBP existe un comando que te lo facilita mas que se llama ADCIN donde únicamente colocas algo así: "ADCIN 0, dato", y ya tienes toda la conversión resumida allí. Claro esta ese comando no indica ninguna configuración es solo la lectura y guarda el valor obtenido en la variable.
A parte con respecto a lo de la transmisión no le veo ningún problema, lo que si veo es que colocaste el A/D con 10-bit y la variable de A/D osea dato de 8-bit, debes estar pendiente ya que puede cambiarte el valor al superar los 256 que es el valor máximo de la variable.

Conclusión: Revisa lo comentado y luego cualquier cosa me avisas si tienes dudas. Éxito


----------



## Oskaring (May 12, 2013)

Muchisimas gracias Reyvilla por tomarse la molestia de echarle un ojo al código.
  Como me recomendó, intenté utilizar la modulación por hardware, pero al utilizar HPWM y compilar en microcode studio plus me devuelve el siguiente mensaje:
    Macro HPWM?TCC not found in macro file. Alguna sugerencia? Otra vez gracias compañeros.


----------



## reyvilla (May 12, 2013)

Oskaring dijo:


> Muchisimas gracias Reyvilla por tomarse la molestia de echarle un ojo al código.
> Como me recomendó, intenté utilizar la modulación por hardware, pero al utilizar HPWM y compilar en microcode studio plus me devuelve el siguiente mensaje:
> Macro HPWM?TCC not found in macro file. Alguna sugerencia? Otra vez gracias compañeros.



Hola si colocas el código seria mas fácil de ver donde esta el error, lo otro seria si tienes alguna simulación también ayudaría.


----------



## Oskaring (May 13, 2013)

Ahí val el código. La simulación no la puedo enviar, porque al darme ese error no me genera el .HEX. Otra vez gracias


----------



## reyvilla (May 13, 2013)

Oskaring dijo:


> Ahí val el código. La simulación no la puedo enviar, porque al darme ese error no me genera el .HEX. Otra vez gracias



Hola veo que lograste avanzar bastante, pero aun así te comento al igual que lo hago con lo demás compañeros, algo que aprendí en 4 años desde que empece con lo de programación y todavía sigo aprendiendo, es tener un  orden de pasos a seguir a la hora de realizar un código, esto como observación y como consejo,* ya que hasta el que tiene mas experiencia si no lo hace de una forma ordenada hasta una coma puede hacerle perder mucho tiempo, solo por no saber donde se encuentra esa coma por el desorden en el código*.

Ahora continuando con tu código, hace poco como comente mas arriba empece a utilizar el modulo pwm por hardware lo cual me pareció interesante como practica, ahora para lograrlo tuve que al igual que tu investigar y leer y seguir investigando hasta que me di cuenta que casi todo estaba en la hoja de datos de micro ahora voy hacer un pequeño resumen de como se trabaja con el modulo pwm de pic.

Todos lo módulos de los micro tienen o están ligados a uno o varios registros de lectura o escritura, para configuración o control. Estos registros generalmente de 8 bits 10 bits 16 bits.
Para configuración normalmente son de 8 bit del 0 al 7.
Dependiendo de cada registro varia su compresión, a que me refiero con esto, que puede haber un bit de registro que sea para una sola configuración o varios bit igual para una sola configuración.


En si el modulo no se llama PWM, se llama CCP. 
Que es modulo de: 
Captura/Comparación y PWM = Modulación de Ancho de Pulso

Entonces lo primero que tenemos es que este modulo tiene tres maneras de operar
y por lo tanto lo primero que vamos hacer configurar el modulo y para eso debemos buscar
el registro que nos permita eso.

Datos de la sección 9 de la hoja de datos del 16F628A.

9.0 CAPTURE/COMPARE/PWM (CCP) MODULE

El módulo CCP (Captura / Comparación / PWM) contiene una
Registro de 16 bits que puede funcionar como un registro de captura de 16 bits o
como un registro comparacion de 16 bits, o como registro PWM
maestro / esclavo para ciclo de trabajo. La Tabla 9-1 muestra la
recursos temporizador de las modalidades del módulo CCP.

Módulo CCP1
Captura / Comparación / PWM Registro1 (CCPR1) está compuesta 
de dos registros de 8 bits: CCPR1L (byte bajo) y
CCPR1H (byte alto). El registro CCP1CON en el registro de los controles de 
la operación de CCP1. Todos son de lectura y escritura.
Información adicional sobre el módulo CCP está disponible
en el manual de referencia de medio rango PICmicro ™,
(DS33023).

Registro de control "CCP1CON" del modulo CCP1 es lo que nos permite seleccionar el modo de operación a continuación veamos ese registro:

U-0   U-0  R/W-0   R/W-0  R/W-0     R/W-0     R/W-0     R/W-0
—      —    CCP1X  CCP1Y  CCP1M3  CCP1M2  CCP1M1  CCP1M0
bit 7                                                                              bit 0

Donde:
U = bit no implementado   R = bit puede leerse
0 = bit es borrado             W = bit puede escribirse

Descripción de cada bit:

7 y 6 no estas implementados

bit 5-4 CCP1X:CCP1Y: PWM Bits menos significativos

Capture Mode: Unused
Compare Mode: Unused
PWM Mode: Estos bits son los dos bits menos significativos del ciclo de trabajo de PWM. Los ocho MSB se encuentran en CCPRxL.

bit 3-0 CCP1M3:CCP1M0: CCPx  Bits de Selección de Modo 

0000 = Capture/Compare/PWM off (resets CCP1 module)
0100 = Capture mode, cada flanco de bajada
0101 = Capture mode, cada flanco ascendente
0110 = Capture mode, cada 4th de flanco ascendente
0111 = Capture mode, cada 16th de flanco ascendente
1000 = Compare mode, establecer la salida en el arranque (CCP1IF bit is set)
1001 = Compare mode, borrar la salida en el arranque (CCP1IF bit is set)
1010 = Compare mode, generar interrupción por software en el arranque (CCP1IF bit is set, CCP1 pin is
unaffected)
1011 = Modo de comparación, evento especial trigger (CCP1IF bit is set; CCP1 resets TMR1
11xx = Modo PWM 

Hasta aquí espero todo  se entienda, disculpen la traducción es gracias a google.

Ahora luego de analizar un poco este registro, no mucho solo un poco, si lo que vamos es a trabajar con PWM creo que estas mas que sobre entendido como debe quedar configurado el
registro CCP1CON.

Por si acaso por acá dejo la configuración:

Seleccionamos el modo de PWM con los bits del 0 al 3, quedando solo 2 y 3 en 1 sin importar los bits 1 y 0.

Ahora en ese mismo capitulo 9, nos muestra una tabla con los módulos y sus respectivas fuentes de temporizacion, para el caso del PWM nos especifica que se hace uso del Timer2, estar pendiente de este dato ya que cambia entre pic igual hay que estar pendiente de todo.

Ahora en una sección mas abajo la 9.3 de la hoja de datos del 16F628A, ahora si mas especifico nos indica como trabaja el modulo, como se hacen los cálculos, etc...
En fin todo lo que necesitamos saber para manejar el PWM. Ahora de todo eso hay algo bien interesante una pagina mas abajo en una sección que es la siguiente:

Lo llamaría pasos a seguir para trabajar con el modo PWM

9.3.3 SET-UP FOR PWM OPERATION   

Indica lo siguiente: Según traducción directa de la hoja en google

Los siguientes pasos se deben tomar cuando se configura
el módulo CCP para la operación PWM:

1. Establezca el periodo PWM escribiendo al registro PR2.

2. Ajuste el ciclo de trabajo del PWM escribiendo en
CCPR1L del registro CCP1CON los bits <5 y 4> .

3. Hacer el pin CCP1 una salida en la limpieza de la
TRISB <3> bits.

4. Establecer el valor de preescaler TMR2 y habilitar Timer2
escribiendo en T2CON.

5. Configure el módulo CCP1 para la operación PWM.


Ahora dentro de estos pasos algo importante que  hasta el momento no hemos hablado de frecuencia, dentro de la misma sección hay otra tabla que nos habla de cual es la frecuencia mínima dependiendo del oscilador usado y el divisor osea el presscaler.  Para el caso 
de usar un crystal de 20Mhz la frecuencia mínima es de 1.22Khz. Lo que significa que no podemos trabajar por debajo de esa frecuencia.


Bueno esto es solo una orientación ya luego colocare un PDF mas detallado de todo, de igual forma espero les sea útil como lo es para mi esta información.

Ahora como traducimos toda esa información en el PBP la parte facil . 

Primero vamos con las definiciones que hasta el momento estaba bastante bien el compañero Oskaring.


Nota: Todo lo siguiente esta en el manual de PBP versión ingles que esta en la web.

Definimos para el caso del 16F628A en modo PWM 3 parámetros.

El puerto y el numero de bit o pin por donde se va a sacar la señal PWM. 

definición del puerto donde se encuentra la salida del PWM para el caso del 16F628A puerto B

*DEFINE* CCP1_REG PORTB ‘ Channel 1 port

definición del bit o pin de salida del PWM para el caso del 16F628A pin o bit 3

*DEFINE *CCP1_BIT 3           ‘ Channel 1 bit


La siguiente definición es la del registro de temporizacion que puede variar dependiendo del pic. Para el caso del 16F628A solo es el TIMER2 por que solo tiene un PWM.

*DEFINE* HPWM1_TIMER 2 'Hpwm channel 1 timer

Ahora ya finalizando el comando HPWM y su estructura.

*HPWM* Channel,Dutycycle,Frequency

CHANNELl ó CANAL tiene que ser un numero o una variable definida con un numero
esto lo digo por que gracias al compañero Oskaring realice unas pruebas y no funcionaron y fue porque se quería colocar una variable en el channel, el problema fue que esa variable era del PORTB.3 que de echo era por donde sale la señal PWM, pero en este caso lo que espera este comando es un numero no un bit de un puerto y por eso no la toma, así que no queda de otra que usar un numero directo o una variable o constante que tenga el numero del canal a utilizar. Para PBP lo maximo en canales son 4 así que el numero no puede ser mayor.

Dutycycle ó Ciclo de Trabajo, se refiere a otro numero pero esta ves comprendido entre 0 y 255 donde 0 = 0% y 255 = 100%. Puede ser una variable o constante de 0 a 255.

Frecuencia como dije antes hay una tabla en la hoja de datos de cada pic que lo especifica. Cuanto es lo mínimo, para el caso del 16F628A es de 1.22Khz con 20Mhz 
Con 4Mhz 245Hz según manual PBP en ingles.

Entonces un ejemplo seria:


```
@ DEVICE PIC16F628A
@ DEVICE XT_OSC
@ DEVICE WDT_OFF 
@ DEVICE PWRT_OFF
@ DEVICE BOD_Off
@ DEVICE LVP_OFF 
@ DEVICE CPD_OFF 
@ DEVICE PROTECT_OFF

DEFINE OSC 4


DEFINE CCP1_REG PORTB 'Channel 1 port
DEFINE CCP1_BIT 3     'Channel 1 bit
DEFINE HPWM1_TIMER 2 'Hpwm channel 1 timer

TRISA = %00000000
TRISB = %00000000 'Pin 3 del Puerto B como salida
PORTA = %00000000
PORTB = %00000000

Dutycycle VAR WORD

INICIO:
FOR Dutycycle = 0 TO 255
HPWM 1,Dutycycle,1000   'Va de 0% A 100% y repite el ciclo
PAUSEUS 200
NEXT
GOTO INICIO
```

Bueno hasta aca espero halla despejado mas las dudas y a su vez halla abierto mas la curiosidad por aprender y curiosear mas del mundo de los pic y de todo lo que llevan por dentro.

Cualquier cosa me avisan saludosss y mucho éxito 

PD: Disculpen los moderadores si escribí demás.


----------



## ferdy575 (May 14, 2013)

hola a todos vengo nuevamente a molestar por estos lados.
solo por practicar y estudiar más sobre programación estoy haciendo un circuito donde controlo un servo con un  potenciometro y envió una señal serial a otro pic para que accione otro servo al mismo tiempo pero no logro que el segundo pic haga trabajar el  segundo servo, aquí les pongo los archivos para que los vean a ver sí me pueden ayudar les agradezco su colaboración.


----------



## reyvilla (May 14, 2013)

ferdy575 dijo:


> hola a todos vengo nuevamente a molestar por estos lados.
> solo por practicar y estudiar más sobre programación estoy haciendo un circuito donde controlo un servo con un  potenciometro y envió una señal serial a otro pic para que accione otro servo al mismo tiempo pero no logro que el segundo pic haga trabajar el  segundo servo, aquí les pongo los archivos para que los vean a ver sí me pueden ayudar les agradezco su colaboración.



Hola de nuevo compañero, vi el circuito y los códigos, pensando que vería algo mas completo, tu código solo tiene unos detalles, aun le falta un montón para que quede al 100% pero ya funciona,  revisa bien los cambios realizados y analiza todo y cualquier duda me comentas saludosss


----------



## ferdy575 (May 17, 2013)

reyvilla dijo:


> Hola de nuevo compañero, vi el circuito y los códigos, pensando que vería algo mas completo, tu código solo tiene unos detalles, aun le falta un montón para que quede al 100% pero ya funciona,  revisa bien los cambios realizados y analiza todo y cualquier duda me comentas saludosss



Hola Rey gracias por mirar mi proyecto lo hiciste funcionar perfectamente te felicito eres un monstruo para esta vaina lo analice todo y hay algunas cosas que no entiendo, todos sabemos que la programación se basa en escribir pequeñas frases mágicas que hacen que el pic haga lo que queremos pero hay unas frasesitas que pusiste y no entiendo su funcionamiento por ejemplo:

*Dutycycle VAR WORD
clear*

que función tiene?

*if pos > pos2 + 5 or pos < pos2 - 5 then
pos2 = pos*

que función tiene? por que añadiste la variable pos2 y la haces comparar con la variable pos?
¿que obtenemos con esto? 

tampoco entiendo como funciona el tema de los corchetes en la función *SEROUT* y además agregaste 2 números que no se de donde te salieron ¿como sabes que valor se debe usar en esta función?:

*Serout portb.1,T2400,["ok",#pos,10,13]*

no se de donde te salio el *10* y el *13* y en el receptor tambien hiciste un cambio importante en esta misma función cuando escribes:

*serin sigin,T2400,10,inicio,["ok"],#pos*

aquí sacaste la variable del corchete por que este cambio?, me perdonas tanta preguntadera pero tú sabes que "no hay preguntas tontas sino tontos que no preguntan" y "quien no pregunta no aprende jamas" he venido siguiendo esta pagina desde el inicio y gracias a ustedes he aprendido muchísimo sobre este tema y les estoy muy agradecido pero yo siempre quiero aprender muy bien lo que me gusta y me perdonan sí llego quizá a fastidiar con tanta  molestadera pero hay cosas que ni en los libros de programación se encuentran y veo que ustedes si las saben no se de donde saben tanto y agradezco que las publiquen para así aprender de ustedes nuevamente gracias a todos por su colaboración


----------



## ricbevi (May 17, 2013)

Hola..."@ferdy575"para colaborar algo te aclaro algunas dudas de las que tenes...

*Dutycycle VAR WORD 'define la variable llamada Dutycycle a valor a Word (0 a 65535) 
clear ' coloca todas las variables a valor 0 para limpiarlas

*Sic "...no se de donde te salio el *10* y el *13* ..." 10 es el valor decimal de Line Feed o avance de linea que hace que se avance una linea hacia abajo y el 13 es el valor decimal del Carriage Return o retorno de carro comúnmente llamado "Enter" en el teclado

Sic"*serin sigin,T2400,10,inicio,["ok"],#pos" *Espera 10 si no va a Inicio y si recibe la frase literal "ok" y lo que llega a continuación lo guarda en la variable "pos" de forma decimal.  

Todo esto lo encontrás en la ayuda del compilador la cual deberías consultar ante cualquier duda de ese tipo.

Saludos.

Ric.


----------



## reyvilla (May 17, 2013)

ferdy575 dijo:


> Hola Rey gracias por mirar mi proyecto lo hiciste funcionar perfectamente te felicito eres un monstruo para esta vaina lo analice todo y hay algunas cosas que no entiendo, todos sabemos que la programación se basa en escribir pequeñas frases mágicas que hacen que el pic haga lo que queremos pero hay unas frasesitas que pusiste y no entiendo su funcionamiento por ejemplo:
> 
> *Dutycycle VAR WORD
> clear*
> ...



Hola de nuevo me alegra que te intereso, lo primero que preguntas es que esa variable como te fijas no esta siendo usada en ninguna parte ademas te deje varios DEFINE y otra parte del código como como comentario y es así por que la finalidad es que si te animas a utilizar en vez de PULSOUT el HPWM creo seria mejor ya que si leíste lo que escribí con respecto a como funciona y no es muy complicado si lo aplicas en la practica notaras la diferencia entre HPWM y PUSOUT. Entre hoy y mañana lo subo completo para que veas como funciona.

La sentencia  *if pos > pos2 + 5 or pos < pos2 - 5 then
pos2 = pos*  ,
 Se refiere a que si la lectura del potencio metro cambia con respecto a la ultima referencia guardada en la variable pos2 entonces envía la nueva posición al otro pic. Esto para evitar estar enviando constantemente la misma posición al otro pic si ya el otro la tiene. 

Ejemplo: Si el potenciometro mide 100 ese valor se guarda en pos digamos que eso pone al servoen 30 grados y envía al otro pic para que coloque el servo a 30 grados también. 

Ahora para evitar que este enviando constantemente el valor 100, lo que hice antes de enviar el dato fue guardar ese mismo dato en otra variable llamada pos2, esto para luego compararla con la lectura actual del potenciometro que se guarda en pos.
Entonce lo que indica eso es:

Si la variable pos es mayor pos2 + 5 o si la variable pos es menor que pos2 - 5 entonces.
le sume 5 por que el valor del potenciometro es muy dinámico y puede variar entre una lectura y otra y esto hace que a si no muevas el potenciometro el valor cambie.

Y esto se debe a que lo que realmente esta sucediendo es que el pin donde esta conectado el potenciometro en un momento es salida y en otro momento es entrada. Esto lo encontré en las librerías del PBP.  
El comando POT, convierte el pin donde esta el potencimetro en salida para cargar el condensador y luego lo convierte en entrada para ver cuanto tarda en descargarse el condensador y eso va a depender del valor que tenga en ese momento el potenciometro.

 Un dato que no te había mencionado es que el poenciometro no debes conectarlo a VCC ya que el mismo pic se encarga de eso enviando un 1 al potenciometro como te comente arriba.

Entonces luego de que el detecta que el valor de pos + 5 es diferente de pos2 mas o menos lo que hago es igualar nuevamente los valores de pos y pos2. 

Ahora con : *Serout portb.1,T2400,["ok",#pos,10,13]*

El 10 y 13 son comando en ASCII http://es.wikipedia.org/wiki/ASCII notaras que uno es para indicar que se desplace a la siguiente linea y el otro retorno de carro, que en si es que se desplace al comienzo de la linea.


En el receptor :  *serin sigin,T2400,10,inicio,["ok"],#pos*

Saque la variable por que no va dentro de los corchetes te recomiendo tener el manual de PBP para que no te confundas ya que a mi me paso y busque en google y lo descargue en español y en ingles y estos me han ayudado bastante.

El "ok" se refiere a algo que se puede llamar como comando de start o bits de start y es para indicarle al receptor que solo en caso de recibir esos comando es entonces cuando va a guardar el valor que le sigue en la variable pos.

Y no te preocupes por fastidiar siempre y cuando sea para aprender no tengo problemas eso es lo importante ya que no se trata solo de lo que tu aprendes si no también de lo que yo aprendo explicándote. Cualquier cosa me avisas.  

PD: Compañero ricbevi gracias por el apoyo espero no haber enredado mucho la cosa en un rato subo el ejemplo completo para que lo vean funcionando y así se entienda mejor.


----------



## inspector gadget (May 20, 2013)

hola xpertos, como sigo experimentando con contadores con displays 7 segmentos y gracias a la ayuda de ustedes he entendido el concepto de la multiplexacion. Ahora tengo la duda sobre las interrupciones en el pic 16f628, si estoy empleando todo el puerto b para manejar atravez de un deco cuatro displays (unidades,decenas,centenas,millares mas los cuatro transistores para multiplexar), ¿puedo trabajar con las interrupciones pero con pulsadores conectados en el puertoa? sucede que necesito emplear las interrupciones en un contador, ya que mientras el contador corre descendentemente, quiero tener la posibilidad de aumentar el tiempo de conteo, pero sin esperar que el tiempo llegue hasta 00:00, gracias por su tiempo y espero alguna respuesta para ponerme manos a la obra y postear los avances en el codigo y seguir la politica de no pedir ayuda sin antes no habeer al menos intentar resolverlo por mi cuenta.


----------



## reyvilla (May 21, 2013)

Buenas por fin tuve algo de tiempo libre, por acá les dejo el sistema de los dos pic que se comunican vía serial y controlan los servos por HPWM, revisen y cualquier cosa me avisan saludos.


----------



## ricbevi (May 21, 2013)

inspector gadget dijo:


> hola xpertos, como sigo experimentando con contadores con displays 7 segmentos y gracias a la ayuda de ustedes he entendido el concepto de la multiplexacion. Ahora tengo la duda sobre las interrupciones en el pic 16f628, si estoy empleando todo el puerto b para manejar atravez de un deco cuatro displays (unidades,decenas,centenas,millares mas los cuatro transistores para multiplexar), ¿puedo trabajar con las interrupciones pero con pulsadores conectados en el puertoa? sucede que necesito emplear las interrupciones en un contador, ya que mientras el contador corre descendentemente, quiero tener la posibilidad de aumentar el tiempo de conteo, pero sin esperar que el tiempo llegue hasta 00:00, gracias por su tiempo y espero alguna respuesta para ponerme manos a la obra y postear los avances en el codigo y seguir la politica de no pedir ayuda sin antes no habeer al menos intentar resolverlo por mi cuenta.



Hola...para trabajar con interrupciones debes consultar donde se pueden usar en cada pic en particular en la hoja de datos correspondientes...en el caso del pic 16F628 es en el puerto B exclusivamente.
Saludos.

Ric.


----------



## inspector gadget (May 21, 2013)

ricbevi dijo:


> Hola...para trabajar con interrupciones debes consultar donde se pueden usar en cada pic en particular en la hoja de datos correspondientes...en el caso del pic 16F628 es en el puerto B exclusivamente.
> Saludos.
> 
> Ric.



gracias por tu respuesta, si eso estaba viendo, lo que intentare hacer es multiplexar con el puerto a y usar las interrupciones por cambio de estado de RB.0 a RB.4...a ver como me va y ya subire avancs en el codigo y las dudas que seguro se me presentaran, ojala me pudan ayudar.


----------



## ugt (May 23, 2013)

hola amigos del foro,  quiero pedirles su ayuda por favor, yo soy radio aficionado y quiero implementar este 
frecuencimetro a mi equipo casero, he encontrado parte de este codigo el cual abria que agregar lineas para 
que cuente hasta 20mhz ò tal vez mas.. de ante mano gracias 
pd: yo solo entiendo ò estoy mas familiarizado con pbp, tengo 2 tipos de pic el pic16f84a y el 16f628a


----------



## ferdy575 (May 23, 2013)

reyvilla dijo:


> Buenas por fin tuve algo de tiempo libre, por acá les dejo el sistema de los dos pic que se comunican vía serial y controlan los servos por HPWM, revisen y cualquier cosa me avisan saludos.



hola Rey te cuento que entusiasmado por el progreso que tuviste con este proyecto y viendo que en el proteus funciona perfectamente lo monte en el protoboard y que crees  NO funciona lo he revisado por todos lados y no simplemente no funciona no se que estara pasando con este bicho


----------



## ricbevi (May 24, 2013)

ugt dijo:


> hola amigos del foro,  quiero pedirles su ayuda por favor, yo soy radio aficionado y quiero implementar este
> frecuencimetro a mi equipo casero, he encontrado parte de este codigo el cual abria que agregar lineas para
> que cuente hasta 20mhz ò tal vez mas.. de ante mano gracias
> pd: yo solo entiendo ò estoy mas familiarizado con pbp, tengo 2 tipos de pic el pic16f84a y el 16f628a



OFF TOPIC:
Hola...hay un problema y es que no es posible medir frecuencias altas de esa forma...lo que buscas lo encontrás NO EN BASIC y sí en asembler en la pagina de OM3CPH busca en el Google.
Saludos.

Ric.


----------



## reyvilla (May 24, 2013)

ferdy575 dijo:


> hola Rey te cuento que entusiasmado por el progreso que tuviste con este proyecto y viendo que en el proteus funciona perfectamente lo monte en el protoboard y que crees  NO funciona lo he revisado por todos lados y no simplemente no funciona no se que estara pasando con este bicho



Hola exactamente que no funciona, no lee el adc no se mueven los motores, no envia la señal serial? Especifica un poco, yo lo montaría en físico pero no cuento con un servo motor. Por lo tanto no tengo como saber que es lo que no funciona, tal vez mañana compre un servo para probar. Pero igual indícame que no te funciona.

PD: Cuales son las especificaciones de los servo motores que estas usando.


----------



## ugt (May 25, 2013)

gracias ricbevi !! por el dato me sirvió de mucho, entiendo y hasta cuanto podría contar ò medir con 
un pic16f628a en pbp?? gracias saludos


----------



## ferdy575 (May 26, 2013)

reyvilla dijo:


> Hola exactamente que no funciona, no lee el adc no se mueven los motores, no envia la señal serial? Especifica un poco, yo lo montaría en físico pero no cuento con un servo motor. Por lo tanto no tengo como saber que es lo que no funciona, tal vez mañana compre un servo para probar. Pero igual indícame que no te funciona.
> 
> PD: Cuales son las especificaciones de los servo motores que estas usando.



hola Reyvilla te cuento, los motores no se mueven probé con un frecuencimetro y los pics no dan señales de salida, cambie los pics y tampoco y los servos son HT500 HEXTRONIK no se que faltara a la hora de configurar los pics
te agradezco por estar ayudandome


----------



## ricbevi (May 27, 2013)

ugt dijo:


> gracias ricbevi !! por el dato me sirvió de mucho, entiendo y hasta cuanto podría contar ò medir con
> un pic16f628a en pbp?? gracias saludos


No recuerdo...deberias consultar la ayuda del PBP para el comando que uses pero seguramente no pasaras los 100Khz.
Saludos.

Ric.


----------



## reyvilla (May 27, 2013)

ferdy575 dijo:


> hola Reyvilla te cuento, los motores no se mueven probé con un frecuencimetro y los pics no dan señales de salida, cambie los pics y tampoco y los servos son HT500 HEXTRONIK no se que faltara a la hora de configurar los pics
> te agradezco por estar ayudandome



Hola, me imagino que cuanto te refieres a frecuenciometro te refieres a osciloscopio o algo similar con lo cual puedas ver la señal de salida ya que no le veo el uso del frecuenciometro para ver la señal.
Por otro lado coloca el código que estas programando en los pics y coloca si puedes una imagen del circuito y el esquema para ver que es lo que esta sucediendo.


----------



## ferdy575 (Jun 2, 2013)

hola a todos de nuevo ando por estos lados con la molestadera, a ver les cuento un poco de historia hace ya casi 11 años tuve un accidente y estuve incapacitado 3 meses por lo cual tuve bastante tiempo para mi, así que me puse en la tarea de hacerme un frecuencimetro que tambien fuera capaz de contar pulsos o eventos y lo hice totalmente con tecnología TTL y aunque hoy día aun funciona perfectamente ya creo que está obsoleto y quiero hacerlo ahora con un pic en aquella época utilice para este fin la gran cantidad de integrados de 13 en total, 12 para contadores y divisores y un 74c925 para el control de los 4 display de cátodo común; ya hice un prototipo en proteus y escribí un programa, pero como suele pasar  no me funciono como yo quiero, en frecuencimetro funciona perfectamente pero no en la función contador, se supone que en esta función debe ser capaz de contar los pulsos que lleguen a su entrada con la misma velocidad que entren pero esto no lo he podido conseguir, creo que lo mejor sería usar interrupciones pero no se como usarlas para este fin, aquí les subo los archivos para que los vean.

este era mi antiguo frecuencimetro 



 media frecuencias hasta de 100 MHz como verán ya se ve muy anticuado pero aun funciona perfectamente 
estaré muy agradecido por su ayuda


----------



## ricbevi (Jun 3, 2013)

ferdy575 dijo:


> hola a todos de nuevo ando por estos lados con la molestadera, a ver les cuento un poco de historia hace ya casi 11 años tuve un accidente y estuve incapacitado 3 meses por lo cual tuve bastante tiempo para mi, así que me puse en la tarea de hacerme un frecuencimetro que tambien fuera capaz de contar pulsos o eventos y lo hice totalmente con tecnología TTL y aunque hoy día aun funciona perfectamente ya creo que está obsoleto y quiero hacerlo ahora con un pic en aquella época utilice para este fin la gran cantidad de integrados de 13 en total, 12 para contadores y divisores y un 74c925 para el control de los 4 display de cátodo común; ya hice un prototipo en proteus y escribí un programa, pero como suele pasar  no me funciono como yo quiero, en frecuencimetro funciona perfectamente pero no en la función contador, se supone que en esta función debe ser capaz de contar los pulsos que lleguen a su entrada con la misma velocidad que entren pero esto no lo he podido conseguir, aquí les subo los archivos para que los vean.
> 
> este era mi antiguo frecuencimetro http://youtu.be/K1LhIJD8aQ8 media frecuencias hasta de 100 MHz como verán ya se ve muy anticuado pero aun funciona perfectamente
> estaré muy agradecido por su ayuda



Hola...te oriento en tu problema...no esperas el cambio de estado del pin a la hora de contar...no le indicaste al compilador que el "puertoa" sera usado de forma digital...no tienes cargada la entrada con una resistencia a GND para prevenir la entrada de señales espurias al estar siempre en alta impedancia.
Saludos.

Ric.


----------



## ferdy575 (Jun 3, 2013)

ricbevi dijo:


> Hola...te oriento en tu problema...no esperas el cambio de estado del pin a la hora de contar...no le indicaste al compilador que el "puertoa" sera usado de forma digital...no tienes cargada la entrada con una resistencia a GND para prevenir la entrada de señales espurias al estar siempre en alta impedancia.
> Saludos.
> 
> Ric.



Hola Ric gracias por mirar mi proyecto, ya hice lo que me dices pero igualmente sigue sin funcionar sera que habrá que usar un código basado en interrupciones? y sí es así como se haría las interrupciones no se como se usan tú me podrías ayudar?


----------



## ricbevi (Jun 3, 2013)

ferdy575 dijo:


> Hola Ric gracias por mirar mi proyecto, ya hice lo que me dices pero igualmente sigue sin funcionar sera que habrá que usar un código basado en interrupciones? y sí es así como se haría las interrupciones no se como se usan tú me podrías ayudar?



@ferdy575 Observa las modificaciones que le realice a tú programa y mejora la representación del valor de los pulsos después de un reset....evidentemente se podía!!!. 

Ric.


----------



## ferdy575 (Jun 4, 2013)

ricbevi dijo:


> @ferdy575 Observa las modificaciones que le realice a tú programa y mejora la representación del valor de los pulsos después de un reset....evidentemente se podía!!!.
> 
> Ric.



Excelente te felicito funciona perfectamente te agradezco mucho, dime que función se obtiene cuando escribes:
* repeat
               until in = 0 *
y lo más importante donde la conseguiste.


----------



## ricbevi (Jun 4, 2013)

ferdy575 dijo:


> Excelente te felicito funciona perfectamente te agradezco mucho, dime que función se obtiene cuando escribes:
> * repeat
> until in = 0 *
> y lo más importante donde la conseguiste.



Dicha instrucción o conjunto lo que hace es repetir lo que se encuentre después del "repeat" hasta que se cumpla la condición que enumera "until"...en este caso nada esperando a que cambie de estado bajo "int" después de haber detectado un alto en él..."conseguirlo"... LEE LA AYUDA que trae PBP que allí  se encuentra descriptos los comando que soporta el compilador y como usarlos como ya te lo indique anteriormente.

Ric.


----------



## davo81 (Jun 5, 2013)

le puedes añadir proteccion antirrebotes en el pulsador como 20ms por ejemplo?



mecatrodatos dijo:


> Proyecto2 pulsadores
> 
> 
> 
> ...


----------



## davo81 (Jun 6, 2013)

Hola a todos.

Soy nuevo en esto, estoy haciendo un programa enciende apaga osea un pulsador en PICBasic Pro
y necesito una ayuda en el programa que he elaborado, díganme que instrucciones me faltan para lograrlo.
Estoy tratando de usar num para verificar las pulsaciones por PORTA.1 

De antemano gracias por su apoyo 
********************************************************************

```
LED1    var    portb.0        ;designamos LED1 al portb.0
boton    var    porta.1        ;designamos boton a porta.1
num    var BYTE
num=0
Pulsar

porta.1=num
IF boton=0 THEN    encender

GOTO    Pulsar

encender:

        IF boton=0 THEN    encender;espera que suelte boton
        PAUSE    200                ;pausa de 200 milisegundos para antirrebotes
        HIGH    LED1            ;encendemos LED1
        num=2                       ;no estoy seguro si esto debe ir 
        IF num=2 THEN apagar ;contabiliza dos pulsaciones y va a apagar
apagar
        LOW        LED1

GOTO    Pulsar

END
```


----------



## D@rkbytes (Jun 6, 2013)

davo81 dijo:


> Hola a todos.
> 
> Soy nuevo en esto, estoy haciendo un programa enciende apaga osea un pulsador en PICBasic Pro
> y necesito una ayuda en el programa que he elaborado, díganme que instrucciones me faltan para lograrlo.
> Estoy tratando de usar num para verificar las pulsaciones por PORTA.1


Te hace falta especificar que PIC estás usando, aparte así como está tu programa no lograrás ver que pase algo.
Todo sería tan rápido que no alcanzarías a ver cuando el LED se encienda.
¿Por qué?
Porque tu mismo le das valor a la variable num, y luego comparas con el mismo valor asignado.
Asignas a num el valor 2
Entonces este "If num = 2 Then encender" sale sobrando, ya que num siempre será 2
A soltar el botón haces una pausa de 200ms y prendes el LED,
pero inmediatamente después de la comparación, como num es 2, lo apagas, por eso no notarias el cambio.

Si lo único que quieres hacer es prender y apagar un LED, puedes usar la instrucción "Toggle"
Algo así...

```
Pulsar:
    If boton = 0 Then Encender
    GoTo Pulsar

Encender:
    If boton = 0 Then Encender
    Toggle LED1
    GoTo Pulsar
```
Explícanos bien ¿para que quieres contar las pulsaciones?

Saludos.


----------



## kano2468 (Jun 6, 2013)

buenas noches amigos por favor les pido podrían ayudarme con este proyecto. se trata de una red de suministro de agua automatizada.
la misma posee :
sensores de flujo (sensor hall, salida cuadrada, 0 y 1, 0v y 5v)
sensor de nivel (sensor ultrasónico hc-sr04)
pic16f877a
comunicación serial inhalambrica entre pic y pic,  (transceiver kyl-210)
comunicación serial entre pc (visual basic) y pic
electroválvulas 12vdc
entre otros..

en principio pensaba utilizar 3 pic16f877a;
uno para el control y monitoreo de sensores válvulas... recibir y enviar información inalámbricamente  por su puerto serial portc.6 y portc.7..con el transceiver kyl-210.
otro para recibir y enviar información por el puerto serial portc.6 y portc.7 inalámbricamente igual con otro kyl-210... este a su vez activaría alguno pines entre 1 y 0 los cuales se conectaban a un tercer pic. 
este tercer pic, según el estado de los pines enviaba o recibia información a o desde la pc igualmente por su puerto serial portc.6 y portc.7 en un programa en visual basic donde se visualizara todo el proceso..
otro para recibir esa información...

este simulando, me funcionaba , si se puede decir bien. los tres pic y visual basic se comunicaba bien..

pero me entere que se puede enviar y recibir datos por cualquier pin del pic. entonce decidi reducir la cantidad de pic a 2.  

aquí fue donde comezo todo el problema!
no he podido comunicar los 2 pic inhalambricamente. ya que uno de ellos se comunicara al pc por su puerto serial portc.6 y portc.7, y también se comunicara con el otro pic mediante el transceiver kyl-210 pero a otros pin cualquiera del pic (ya he probado varios y nada). y el otro pic solo se conecta al kly-210 ademas de los sensores y válvulas.
puedo observar por que los kyl-210 tiene luces para tx y rx. y si están enviando y recibiendo (pero al parecer no en el mismo idioma) y lo pruebo conectando el otro kyl-210 a la pc por rs-232 y con un programa que es para probar los mismos, y me envía caracteres muy diferentes a lo que quiero que envie o reciban.. 

aquí los códigos:

```
'pic conectado a pc y a kyl-210

INCLUDE "modedefs.bas"
DEFINE OSC 4
TRISB = %11101111 ' Configuración el Puerto A
TRISD = %00000000 ' Configuración el Puerto B
TRISC = %10101111
SENSOR1 VAR BYTE
SENSOR2 VAR BYTE
SENSOR3 VAR BYTE
SENSOR4 VAR BYTE
TX VAR PORTC.6
RX VAR PORTC.7
B0  VAR BYTE
A VAR BYTE
A = 1
B VAR BYTE
B = 2
C VAR BYTE
C = 3
D VAR BYTE
D = 4
E VAR BYTE
E = 5
F VAR BYTE
F = 6
G VAR BYTE
G = 7
H VAR BYTE
H = 8
PORTD = %11111111 ' Inicializa el puerto "D".
PORTB = %00001000

INICIO:
   
   SERIN RX,T9600,2000,SENSAR,B0     'RECIBE DESDE VISUAL BASIC
   if B0 = "1" THEN CALL purga1            'SI ES 1 LLAMA A PURGAR TUBERIA 1
   IF B0 = "2" THEN CALL purga2
   IF B0 = "3" THEN CALL purga3
   IF B0 = "4" THEN CALL purga4
   IF B0 = "5" THEN                              'SI ES 5,PIDE INFORMACION DE LOS SENSORES, 
   CALL SENSORUNO                           'LLAMA A SENSOR 1
   PAUSE 1000
   CALL SENSORDOS
   PAUSE 1000
   CALL SENSORTRES
   PAUSE 1000
   CALL SENSORCUATRO
   PAUSE 1000
   ENDIF
   GOTO INICIO
   END

SENSAR:
   CALL SENSORUNO
   PAUSE 100
   CALL SENSORDOS
   PAUSE 100
   CALL SENSORTRES
   PAUSE 100
   CALL SENSORCUATRO
   PAUSE 100
   GOTO INICIO
   
purga1:
  LOW PORTD.0               'ESTO SOLO SON LEDS PARA VERIFICAR EL FUNCIONAMIENTO
  PAUSE 250
  SerOut PORTB.4,T9600,["X",A]  'ENVIA EL COMANDO PARA HACER PURGA
  PAUSE 500
  HIGH PORTD.0              'ESTO SOLO SON LEDS PARA VERIFICAR EL FUNCIONAMIENTO
  RETURN

purga2
  LOW PORTD.1
  PAUSE 250
  SEROUT PORTB.4,T9600,["X",B]
  PAUSE 500
  HIGH PORTD.1
  RETURN

purga3:
  LOW PORTD.2
  PAUSE 250
  SEROUT PORTB.4,T9600,["X",C]
  PAUSE 500
  HIGH PORTD.2
  RETURN

purga4:
  LOW PORTD.3
  PAUSE 250
  SEROUT PORTB.4,T9600,["X",D]
  PAUSE 500
  HIGH PORTD.3
  RETURN
   
SENSORUNO:
   low PORTD.4          'ESTO SOLO SON LED PARA VERIFICAR EL FUNCIONAMIENTO
   SEROUT PORTB.4,T9600,["X", E]  'ENVIA POR PORTB.4, KYL-210, PIDE INFO DE SENSOR1
   PAUSE 100
   SERIN PORTB.5,T9600,["X"],SENSOR1   'ESPERA POR EL PORTB.5 CONECTADO AL KYL-210                                                       'RESPUESTA  DEL SENSOR 1 EN EL OTRO PIC
   PAUSE 100
   SEROUT TX,T9600,[SENSOR1]             'ENVIA DATOS POR TX A LA PC, A VISUAL BASIC
   PAUSE 100
   HIGH PORTD.4                          'ESTO SOLO SON LED PARA VERIFICAR EL FUNCIONAMIENTO
   RETURN
   
SENSORDOS:
   low PORTD.5
   SEROUT PORTB.4,T9600,[6]
   PAUSE 100
   SERIN PORTB.5,T9600,["X"],SENSOR2
   PAUSE 100
   SEROUT PORTB.4,T9600,[SENSOR2]
   PAUSE 100
   HIGH PORTD.5
   RETURN
   
SENSORTRES:
   low PORTD.6
   SEROUT PORTB.4,T9600,[7]
   PAUSE 100
   SERIN PORTB.5,T9600,["X"],SENSOR3
   PAUSE 100
   SEROUT TX,T9600,[SENSOR3]
   PAUSE 100
   HIGH PORTD.6
   RETURN
   
SENSORCUATRO:
   low PORTD.7
   SEROUT PORTB.4,T9600,[8]
   PAUSE 100
   SERIN PORTB.5,T9600,["X"],SENSOR4
   PAUSE 100
   SEROUT TX,T9600,[SENSOR4]
   PAUSE 100
   HIGH PORTD.7
   RETURN    

   END
```


```
'Pic conectado a kyl-210, sensores y válvulas

INCLUDE "modedefs.bas"
DEFINE OSC 4
TRISA = %111111
TRISB = %11111111 ' Configuración el Puerto A
TRISD = %00000000 ' Configuración el Puerto B
TRISC = %10111000
ADCON0 = %00000000
ADCON1=7
TX VAR PORTC.6
RX VAR PORTC.7
B0  VAR BYTE
SENSOR1 VAR BYTE
SENSOR2 VAR BYTE
SENSOR3 VAR BYTE
SENSOR4 VAR BYTE
FRECUENCIA1 VAR BYTE
FRECUENCIA2 VAR BYTE
FRECUENCIA3 VAR BYTE
FRECUENCIA4 VAR BYTE
e var byte
f var byte
g var byte
h var byte
PORTA = %000000
PORTD = %00000000 ' Inicializa el puerto "B".
PORTB = %00000000
PORTC = %00000000

INICIO:
   IF PORTC.3 = 1 THEN CALL MANUAL 'uso manual
   IF PORTC.4 = 1 THEN CALL RecibeRF  'automatico
   PAUSE 100
   GOTO INICIO
   END
MANUAL:   
   IF PORTB.0 = 1 THEN CALL purga1
   IF PORTB.1 = 1 THEN CALL purga2
   IF PORTB.2 = 1 THEN CALL purga3
   IF PORTB.3 = 1 THEN CALL purga4
   PAUSE 100
   RETURN
   
RecibeRF:
   PAUSE 250
   HIGH PORTD.7    'solo para verificar funcionamiento
   SERIN RX,T9600,["X"],B0    'recibe comando guarda en B0 y elije 
   if B0 = 1 THEN CALL purga1    'para purgar tubería principal
   IF B0 = 2 THEN CALL purga2
   IF B0 = 3 THEN CALL purga3
   IF B0 = 4 THEN CALL purga4
   IF B0 = e THEN CALL SENSORUNO  'para sensar en el sensor 1
   IF B0 = f THEN CALL SENSORDOS
   IF B0 = g THEN CALL SENSORTRES
   IF B0 = h THEN CALL SENSORCUATRO
   LOW PORTD.7
   RETURN

SENSAR:
   CALL SENSORUNO
   PAUSE 100
   CALL SENSORDOS
   PAUSE 100
   CALL SENSORTRES
   PAUSE 100   
   CALL SENSORCUATRO
   PAUSE 100
   GOTO INICIO
     
purga1:
    portd.0 = 1 'CIERRA V1 
    pause 1000
    portd.1 = 1 'ABRE V2
    pause 1000
    portc.0 = 1 'ENCIENDE BOMBA 
    pause 10000  'TIEMPO QUE DURA BOMBA ENCENDIDA(MODIFICABLE), SI LA PRESION AUMENTA SE APAGA AUTOMATICAMENTE LA BOMBA! 
    portc.0 = 0 'APAGA BOMBA
    pause 1000
    portd.1 = 0 'ABRE V1
    pause 1000
    portd.0 = 0 'CIERRA V2
    pause 1000
    goto inicio
purga2:
    portd.2 = 1 'CIERRA V3
    pause 1000
    portd.3 = 1 'ABRE V4
    pause 1000
    portc.0 = 1 'ENCIENDE BOMBA
    pause 10000
    portc.0 = 0 'APAGA BOMBA
    pause 1000
    portd.2 = 0 'ABRE V3
    pause 1000
    portd.3 = 0 'CIERRA V4
    pause 1000
    goto inicio
purga3:
    portd.4 = 1 'CIERRA V5 
    pause 1000
    portd.5 = 1 'ABRE V6
    pause 1000
    portd.5 = 0
    portc.0 = 1 'ENCIENDE BOMBA
    pause 10000
    portc.0 = 0 'APAGA BOMBA
    pause 1000
    portd.4 = 0 'ABRE V5
    pause 1000
    portc.1 = 1 'CIERRA V6
    pause 1000
    portc.1 = 0
    goto inicio    
purga4:
    portd.6 = 1 'CIERRA V7 
    pause 1000
    portd.7 = 1 'ABRE V8
    pause 1000
    portd.7 = 0
    portc.1 = 1 'ENCIENDE BOMBA
    pause 10000
    portc.1 = 0 'APAGA BOMBA
    pause 1000
    portd.6 = 0 'ABRE V7
    pause 1000
    portc.2 = 1 'CIERRA V8
    pause 1000
    portc.2 = 0
    goto inicio

SENSORUNO:   
   count PORTB.4,2000,SENSOR1   ' cuenta la salida del sensor 1 y guarda
   FRECUENCIA1 = SENSOR1/2
   PAUSE 100
   SEROUT PORTC.6,T9600,["X",FRECUENCIA1]  'envía respuesta al otro pic por kyl-210
   RETURN
SENSORDOS:   
   count PORTB.5,2000,SENSOR2 
   FRECUENCIA2 = SENSOR2/2
   PAUSE 100
   SEROUT PORTC.6,T9600,["X",FRECUENCIA2]
   RETURN
SENSORTRES:   
   count PORTB.6,2000,SENSOR3 
   FRECUENCIA3 = SENSOR3/2
   PAUSE 100
   SEROUT PORTC.6,T9600,["X",FRECUENCIA3]
   RETURN
SENSORCUATRO:   
   count PORTB.7,2000,SENSOR4 
   FRECUENCIA4 = SENSOR4/2
   PAUSE 100
   SEROUT PORTC.6,T9600,["X",FRECUENCIA4]
   RETURN
     
   end
```
  por favor me podrian decir que estoy haciendo mal???
el serin y serout desde otro pin del pic funciona igual?
o cuales tengo que utilizar?? serin2, serout2, hserin, hserout, debug, debugin??? y si me pueden decir como seria???

y otra consulta como desactivo el conversor a/d del pic16f877a??? necesito esos pines como entradas y salidas, pa los sensores de nivel (hc-sr04), que aun no incluyo en programación.

por favor ayúdenme no ignoren este mensaje ni lo borren.. por favor... solo necesito una ayudadita de ustedes los expertos..


----------



## davo81 (Jun 7, 2013)

D@rkbytes dijo:


> Te hace falta especificar que PIC estás usando,  aparte así como está tu programa no lograrás ver que pase algo.
> Todo sería tan rápido que no alcanzarías a ver cuando el LED se encienda.
> ¿Por qué?
> Porque tu mismo le das valor a la variable num, y luego comparas con el mismo valor asignado.
> ...


Gracias por el aporte (Toggle cambio el estado de led1 ) buena ;-)
el programa salio así le añadi 200ms para los rebotes funciona , quisiera contar las pulsaciones en porta para  manejar 3 salidas en portb en con un solo pulsador obviamente

gracias por el aporte me ayudo muchísimo.

```
LED1    var    portb.0        ;designamos LED1 al portb.0
boton    var    porta.1        ;designamos boton a porta.1


Pulsar:
    If boton = 0 Then Encender
    GoTo Pulsar

Encender:
    If boton = 0 Then Encender
    PAUSE 200
    Toggle LED1
    GoTo Pulsar
```


----------



## D@rkbytes (Jun 7, 2013)

kano2468 dijo:


> buenas noches amigos por favor les pido podrían ayudarme con este proyecto. se trata de una red de suministro de agua automatizada.
> la misma posee :
> sensores de flujo (sensor hall, salida cuadrada, 0 y 1, 0v y 5v)
> sensor de nivel (sensor ultrasónico hc-sr04)
> ...


En lo que a mi respecta, sólo te podré ayudar con la comunicación serial, lo demás ya corre por tu cuenta.

Existen algunos problemas al tratar de establecer comunicación serial a 9600 bps,
con tan solo 4MHz como frecuencia de reloj para el PIC, "Ésto ya se a tratado en otros temas".
Al ser PICBasic Pro un lenguaje de alto nivel, utiliza recursos y no los registros para lograr un propósito.
Así que para trabajar en PBP a 9600 bps, es recomendable aumentar la frecuencia de reloj.
También es importante tener en cuenta las temporizaciones del programa para que no exista desincronización.
Se debe también tener en cuenta que pasará tras el regreso de una sub rutina y su continuación.

He modificado solamente el primer programa, qué es dónde realizas doble recepción y transmisión de datos.
Pruébalo con la interfaz que adjunto creando dos instancias.
"Crear dos instancias, es ejecutar dos programas idénticos a la vez."
Una instancia la configuras para trabajar virtualmente por el puerto 3, y la otra para trabajar por el puerto 5
Cada vez que se crea una nueva instancia, el programa pregunta si se desea crear otra nueva.
Cada instancia del programa tendrá un identificador de ventana "Handle Window" ó HWND
También se le puede identificar por el número de conexión al puerto en la parte baja del programa.

Debido a tus pocos conocimientos en el tema de PBP y RS-232, sé que te costará algo de trabajo entender.
Pero aquí tienes un tema que te puede ayudar bastante en tu proyecto.
*Interfaz RS232 PIC PC (Proyecto Completo VB6)*

Adjunto el programa con los cambios realizados, dónde ya se puede establecer comunicación bilateral.

Suerte.


----------



## kano2468 (Jun 8, 2013)

D@rkbytes dijo:


> En lo que a mi respecta, sólo te podré ayudar con la comunicación serial, lo demás ya corre por tu cuenta.
> 
> Existen algunos problemas al tratar de establecer comunicación serial a 9600 bps,
> con tan solo 4MHz como frecuencia de reloj para el PIC, "Ésto ya se a tratado en otros temas".
> ...




buen diaaa 
D@rkbytes muchisiiiiiimasssssssss gracias hermanoooooo.... gracias por tu respuesta...
te comento que ya lo había logrado de tanto insistir, buscar, estudiar.. lo consegui con algunos detalles.. pero tu información me ayudara bastante para que funcione correctamente..
y por supuesto que lo voy a implementar como tu lo hicisteee....
pero tengo unas dudas....

@ Device WDT_OFF,PWRT_ON ?????? que hace???? disculpa mi ignorancia...!! jejeje
 en esta línea:
Sensar:
   SerOut TX,T9600,[B0]     ; Sólo para saber si el caractér recibido es = a $

no la entiendo muy bien..  va para visual basic, pero seria para que se confirme si visual basic recibe la info??? o algo asi?

en estas líneas
SerOut PORTB.4,T9600,["X",A,13,10]  'ENVIA EL COMANDO PARA HACER PURGA
SerOut TX,T9600,[SENSOR1,13,10]             'ENVIA DATOS POR TX A LA PC, A VISUAL BASIC 

13,10 podrias decirme que función hacen??? me imagino que tengo ponerlo tal cual en el otro pic es cierto?, pero en visual basic? 
y los datos que envía a visual basic, ejemplo: [SENSOR1,13,10] no debería ser asi: ,[#SENSOR1,13,10].. bueno digo por que asi fue que me funciono.. a mi..

y una ultima duda, yo lo logre conectando portb.4 y portb.5 a la pc mediante resistencias de 1k. si intercambio los puertos de tu programación funciona igual verdad?


gracias por todo viejo. te gradezco un  mundo de verdad
espero tu respuesta.
gracias


----------



## D@rkbytes (Jun 8, 2013)

kano2468 dijo:


> tengo unas dudas....
> 
> @ Device WDT_OFF,PWRT_ON ?????? que hace???? disculpa mi ignorancia...!! jejeje


Esa es la palabra de configuración para el PIC.
Determina varios parámetros sobre el funcionamiento del microcontrolador.
Lee este documento Significado de los Fuses y también busca información acerca de ello.



kano2468 dijo:


> en esta línea:
> Sensar:
> SerOut TX,T9600,[B0]     ; Sólo para saber si el caractér recibido es = a $
> 
> no la entiendo muy bien..  va para visual basic, pero seria para que se confirme si visual basic recibe la info??? o algo asi?


El comentario lo dice, y sólo fue puesto para hacer un eco de los datos enviados al PIC.
Al hacer eso puedes saber que está recibiendo el PIC, ya que debe regresar lo mismo que envías.
Si regresa un dato diferente al enviado, entonces puedes saber que algo anda mal.


kano2468 dijo:


> en estas líneas
> SerOut PORTB.4,T9600,["X",A,13,10]  'ENVIA EL COMANDO PARA HACER PURGA
> SerOut TX,T9600,[SENSOR1,13,10]             'ENVIA DATOS POR TX A LA PC, A VISUAL BASIC
> 
> 13,10 podrias decirme que función hacen??? me imagino que tengo ponerlo  tal cual en el otro pic es cierto?, pero en visual basic?


El 13 equivale a enviar un retorno de carro, y el 10 a enviar un salto de línea.
Que vendría siendo como en Visual Basic usar "vbCrLf"
Tan solo sirve para que los datos no se muestren uno detrás del otro.
Los puedes eliminar en las líneas de código donde no se necesiten.
Consideremos que este fue un programa debug, y contiene código que puedes quitar.


kano2468 dijo:


> y los datos que envía a visual basic, ejemplo: [SENSOR1,13,10] no  debería ser asi: ,[#SENSOR1,13,10].. bueno digo por que asi fue que me  funciono.. a mi..


Si, todo depende de la forma en que quieras recibir los datos, y solamente se usa para números.


kano2468 dijo:


> y una ultima duda, yo lo logre conectando portb.4 y portb.5 a la pc  mediante resistencias de 1k. si intercambio los puertos de tu  programación funciona igual verdad?


Posiblemente, en tu programa estás usando los pines del módulo USART, pero les das un uso normal,
porque la recepción y transmisión la haces por software, y no usando el módulo.
Para eso tendrías que usar HSerOut y HSerIn y entonces si lo harías usando el módulo USART.
Lee la información del tema que te mencioné, ahí encontrarás lo que necesitas saber.


kano2468 dijo:


> gracias por todo viejo. te agradezco un  mundo de verdad


De nada, Saludos.


----------



## kano2468 (Jun 8, 2013)

D@rkbytes dijo:


> Esa es la palabra de configuración para el PIC.
> Determina varios parámetros sobre el funcionamiento del microcontrolador.
> Lee este documento Significado de los Fuses y también busca información acerca de ello.
> 
> ...




eres el mas mejor D@rkbytes jejejeje
gracias por tu ayuda de verdad creo que entendí jejejeje

de todas maneras para salir de duda.. con esto:


> El comentario lo dice, y sólo fue puesto para hacer un eco de los datos enviados al PIC.
> Al hacer eso puedes saber que está recibiendo el PIC, ya que debe regresar lo mismo que envías.
> Si regresa un dato diferente al enviado, entonces puedes saber que algo anda mal.



quieres decir que "$" es: cualquier cosa extraña que se reciba por rx... osea lo que se recibe cuando hay mala comunicación o algo anda mal es decir figuritas extrañas.... 


de antemano muchas gracias me has ayudado mucho. soy nuevo programando y quisiera aprender bastante sobre el tema. pero aquí en Maracay Venezuela es difícil conseguir donde te den un curso de programación de pic, y si lo consigues te dan lo básico lo que medio uno sabe. 
te adjunto una imagen del programa en visual basic, para que me des tu punto de vista, de verdad tu lo debes ver muy fácil pero llegar a esto me ha costado mucho, prácticamente volver a estudiar y todo lo he hecho en menos de 2 meses. yo quisiera que este proyecto funcionara lo mejor posible, pero tampoco tengo tanto conocimiento en visual basic solo lo básico. y bueno hay voy. todavía me falta agregar lo de los sensores de nivel. y hacer que el prototipo funcione.

gracias un saludo.


----------



## kano2468 (Jun 8, 2013)

kano2468 dijo:


> eres el mas mejor D@rkbytes jejejeje
> gracias por tu ayuda de verdad creo que entendí jejejeje
> 
> de todas maneras para salir de duda.. con esto:
> ...




buenas noches.. D@rkbytes
creo que pude hacer funcionar el proyecto, con tu ayuda por supuesto!  

te adjunto los archivos para que me des tu punto de vista si no es mucha molestia. y si me puedes corregir algunas cosas y falllitas que tengo que aun no se como solucionar.
como por ejemplo cuando se sensa el sensor 2, la pc suena como un error..
otro es que tuve que quitar del serout al pc el 13,10 ya que no me hacia una función el visual basic, es de ocultar y mostrar imágenes, comote dije no se mucho de visual basic tampoco.
y otro es que cuando cualquiera de los sensores su valor sea 0 me envía dos mensajes, ya que no encontré como ponerlo, intente con select case, y no pude o no supe, lo hice con if.. then.. else... endif... osea:

```
Low PORTD.4          'ESTO SOLO SON LED PARA VERIFICAR EL FUNCIONAMIENTO
   SerOut TX,T9600,["X",e,13,10]  'ENVIA POR PORTB.4, KYL-210, PIDE INFO DE SENSOR1
   Pause 100
   SerIn RX,T9600,["se"],SENSOR1   'ESPERA POR EL PORTB.5 CONECTADO AL KYL-210                                                       'RESPUESTA  DEL SENSOR 1 EN EL OTRO PIC
   Pause 100
   if SENSOR1 > 30 then
   SerOut TXPIN,T9600,[" FLUJO EN TUBERIA PRINCIPAL: CORRECTO "]             'ENVIA DATOS POR TX A LA PC, A VISUAL BASIC
   ELSE   
   SerOut TXPIN,T9600,[" FLUJO EN TUBERIA PRINCIPAL: BAJO "]
   endif
   if sensor1 = 0 then
   SerOut TXPIN,T9600,[" *FALLA TUBERIA PRINCIPAL* "]
   endif 
   Pause 1000
   High PORTD.4                          'ESTO SOLO SON LED PARA VERIFICAR EL FUNCIONAMIENTO
   Return
```


ahh aun no pruebo incluyendo los sensores de nivel...

saludos gracias y disculpa la molestia..


----------



## D@rkbytes (Jun 9, 2013)

Saludos kano2468

Estuve revisando tus programas y noté que aún no incluyes la palabra de configuración el tus códigos.
Ahora más que nada es importante que la incluyas, pues cambiaste de 4MHz a 20MHz.
Y el compilador usará XT_OSC y necesitas usar HS_OSC
También estará el Watch Dog Timer habilitado, y eso te puede estar reseteando el microcontrolador.
Es recomendable habilitar el fuse PWRTE "Power Up Timer" para estabilizar voltajes al iniciar.
En cuanto al fuse BOREN "Brown-Out Reset" puede quedar habilitado.
Su uso provocará un reset cuando exista un bajo voltaje en la alimentación del PIC.
Por lo tanto, si tu fuente de alimentación es estable, y con suficiente amperaje, puede quedar habilitado.
Tienes que tener en cuenta esto cuando trabajas con la misma fuente para activar motores, válvulas, etc.

El símbolo $ usado en el Select Case puede ser cualquiera, ése es un símbolo muy usado, por eso lo usé.
Pero puedes usar el que quieras, no es para saber si el caractér es basura.
En ese caso lo que se utilizaría es la opción "Else".
Así cualquier dato no incluido en la selección, entrará en la parte contraria "Else".

Pasando al programa en Visual Basic, es recomendable el uso de Option Explicit
Para esto tienes dos opciones...
Puedes escribir Option Explicit en la cabecera del programa, o ir al menú Herramientas/Opciones...
Ahí seleccionas "Requerir declaración de variables"
Con esto obligas al compilador a que detecte los tipos de variables no declaradas en el programa.
Y en tu código existen errores por no usar esta sentencia.
Si miras bien tu programa, sobre todo en los bucles For del Timer1, verás que escribes... For y = o To 2
En vez de For y = 0 To 2

Te recomiendo que en vez de usar un timer, uses el evento OnComm del control MSComm32
Así la recepción de datos no estará limitada por la temporización de Timer1, y podrás tener más control.

Otra recomendación es que tengas un control sobre los posibles errores que puedan ocurrir.
Por ejemplo... ¿Qué pasaría si tu programa fuera ejecutado en una PC que no tiene puertos seriales?
Obviamente se producirá en error que terminará tu programa abruptamente. Y eso no es deseado.

En cuanto a hacer comparaciones con cadenas de texto, no lo veo funcional.
Solamente puedes guardar un byte dentro de la variable de recepción. Y en tu programa comparas cadenas.
Es mejor que envíes un caractér ó número, y posteriormente lo compares.

También te recomiendo que no diseñes formularios tan grandes, no todos tienen grandes resoluciones de pantalla.
Puedes hacer uso de las API de Windows para saber la resolución de la pantalla, y dar aviso al usuario.
Cuando un programa es mayor en tamaño que la resolución en pixeles de la pantalla, éste se sale.
Se pierde visibilidad de los controles, quedando incomodo para el usuario.
En estos casos lo que se hace, es crear formularios redimensionables que se puedan ajustar a la pantalla.
Trata en lo posible de no usar gráficos pesados, eso hace que tu programa ocupe mucha memoria.
Siempre son buen vistos los programas ligeros, de rápida carga, y menos consumo de recursos.
"Por eso me gustan los programas realizados en ensamblador de 32 bits" *MASM32*
Nota que tu programa compilado "*.exe" pesa más de 4Mb y no tiene mucho código.
Eso es debido al uso de gráficos que puedes sustituir por mensajes, o imágenes GIF.
Ahora que si te gusta la programación gráfica puedes usar DirectX para VB y verás mejores resultados.

Saludos y suerte.


----------



## kano2468 (Jun 9, 2013)

> Estuve revisando tus programas y noté que aún no incluyes la palabra de configuración el tus códigos.
> Ahora más que nada es importante que la incluyas, pues cambiaste de 4MHz a 20MHz.
> Y el compilador usará XT_OSC y necesitas usar HS_OSC
> También estará el Watch Dog Timer habilitado, y eso te puede estar reseteando el microcontrolador.
> ...



buenas noches gracias por tu respuesta.. esto creo que lo puedo hacer con el programa que uso para programar el pic.. adjunto imágenes... en la parte de fuses... espero que sea asi..

la fuente del pic es diferente de la de las válvulas y sensores, los pic tiene fuentes independientes..



> El símbolo $ usado en el Select Case puede ser cualquiera, ése es un símbolo muy usado, por eso lo usé.
> Pero puedes usar el que quieras, no es para saber si el caractér es basura.
> En ese caso lo que se utilizaría es la opción "Else".
> Así cualquier dato no incluido en la selección, entrará en la parte contraria "Else".



aquí todavía tengo dudas.. pero creo que no hay problemas con esto me ha funcionado bien..



> Pasando al programa en Visual Basic, es recomendable el uso de Option Explicit
> Para esto tienes dos opciones...
> Puedes escribir Option Explicit en la cabecera del programa, o ir al menú Herramientas/Opciones...
> Ahí seleccionas "Requerir declaración de variables"
> ...



listo activado y corregido errores....



> Te recomiendo que en vez de usar un timer, uses el evento OnComm del control MSComm32
> Así la recepción de datos no estará limitada por la temporización de Timer1, y podrás tener más control.



en principio intente utilizarlo, pero no supe como hacerlo, si me pudieras dar un ejemplo te lo agradecería.. 



> Otra recomendación es que tengas un control sobre los posibles errores que puedan ocurrir.
> Por ejemplo... ¿Qué pasaría si tu programa fuera ejecutado en una PC que no tiene puertos seriales?
> Obviamente se producirá en error que terminará tu programa abruptamente. Y eso no es deseado.



si tienes razón,pero ni siquiera me había pasado por la mente eso.. y ni idea de como solucionarlo, tocaria seguir indagando.



> En cuanto a hacer comparaciones con cadenas de texto, no lo veo funcional.
> Solamente puedes guardar un byte dentro de la variable de recepción. Y en tu programa comparas cadenas.
> Es mejor que envíes un caractér ó número, y posteriormente lo compares.



listo cambie por letras, que en principio lo tenia asi, pero haciendo pruebas cambio todo. por mi inexperiencia trabajo probando como funciona cada cosa.



> También te recomiendo que no diseñes formularios tan grandes, no todos tienen grandes resoluciones de pantalla.
> Puedes hacer uso de las API de Windows para saber la resolución de la pantalla, y dar aviso al usuario.
> Cuando un programa es mayor en tamaño que la resolución en pixeles de la pantalla, éste se sale.
> Se pierde visibilidad de los controles, quedando incomodo para el usuario.
> ...


[/QUOTE]

en eso te refieres al tamaño de la ventana del programa? lo tengo asi ya que queda perfecto en la pantalla de mi pc. que eso donde pienso correrlo.
graficos pesados? te refieres a las imágenes prediseñadas? es lo que consegui ni idea si existe algo parecido.

como funciona el directX para vb??? ya lo descarque pero no encuentro como utilizarlo..?


gracias por tu ayuda amigo..


----------



## D@rkbytes (Jun 9, 2013)

Saludos nuevamente kano2468

Los fuses que tienes establecidos no están bien, debes usar esta palabra de configuración...
@ Device PIC16F877A
@ Device HS_OSC, WDT_OFF, PWRT_ON
*Define* OSC 20
Vista de los fuses con WinPIC800. "Es el que uso"


Si el programa en Visual Basic se ve bien en tu PC, y únicamente lo vas a usar tu, puedes dejarlo así.
En cuanto al uso de DirectX en VB6 existen muchos ejemplos en internet.
En la pagina que te mencioné puedes descargar un ejemplo sencillo y explicado, pero está en inglés.
Cómo esto ya se saldría del tema, no creo conveniente seguir explicando su uso.
Pero adjunto un ejemplo para que tengas una idea de lo que se puede hacer con DirectX.
Es la base de muchos juegos y aplicaciones multimedia.

Por ahora que empiezas, y para que no compliques tu programa, es preferible que lo dejes así.
Ya más adelante y cuando te adentres en la programación, podrás mejorarlo.

Lo importante por ahora es que logres realizar la comunicación entre los dispositivos y la PC.

Suerte.​


----------



## kano2468 (Jun 10, 2013)

buenas noches....



> Los fuses que tienes establecidos no están bien, debes usar esta palabra de configuración...
> @ Device PIC16F877A
> @ Device HS_OSC, WDT_OFF, PWRT_ON



cuando los coloco me da error en el compilación... yo utilizo microcode, picbasicpro...
si los activo en el programador igualmente necesito usar esas palabras de configuración?



> *Define* OSC 20
> Vista de los fuses con WinPIC800. "Es el que uso"
> Ver el archivo adjunto 93956
> 
> ...




ok esta bien..



> Lo importante por ahora es que logres realizar la comunicación entre los dispositivos y la PC.



en la simulación funciona espero que cuando lo monte funcione...

una consulta y vuelve me a disculpar por tanta molestia....
 en esta parte donde recibo los datos de cada sensor por ejemplo este:
SensorNT1:
   LOW PORTD.0
   SerOut TX,T9600,["X",I,13,10]
   PAUSE 100
   SerIn RX,T9600,["si"],SENSORT1
   IF SENSORT1 > 40 THEN
   SerOut TXPIN,T9600,["M"]
   else 
   SerOut TXPIN,T9600,["N"]
   IF SENSORT1 = 0 THEN
   SerOut TXPIN,T9600,["O"]
   PAUSE 100
   ENDIF
   HIGH PORTD.0
   RETURN  


 como puedo hacer esta selccion? o para que me envie el carácter que es? por que si SENSORT1es > a 40 ok mandara M la pc, Fino..
si SENSORT1 es < a 40 mandara N OK fino, pero si SENSORT1 es = 0 me manda N Y O juntos.. intente con select case y no pude, o no supe. y aun no lo logro.. me podrias sugerir algo? por favor...


gracias y saludos..​


----------



## xmagdielx (Jun 10, 2013)

Saludos compañeros!, primero quiero agradecer a todos los que aportaron conocimientos que me han ayudado grandemente. Bueno les comento que estoy haciendo una especie de calculadora con teclado y mostrarlo en LCD pero solo las operaciones básicas (suma,resta,multiplicación y division), basándome en el ejemplo del amigo mecatrodatos. Mi problema surge cuando quiero decirle al pic que ya ingrese un numero y que me pida el otro numero ( o los otros) para realizar la operación, me explico?, es decir, ingreso por ejemplo el 6, y que el pic lo reconozca como un primer digito, luego que ingrese por ejemplo el 5, y al presionar la tecla de (sumar) me muestre en el lcd el numero (5+6=11).

aqui tengo el codigo pero por los momentos solo puedo leer la tecla del teclado 

```
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTD
Define  LCD_RSBIT       2
Define  LCD_EREG        PORTD
Define  LCD_EBIT        3

TRISA=%00000000
TRISB=%00001111
                  'declaracion de filas y columnas
fila1 VAR portB.0
fila2 VAR portB.1
fila3 VAR portB.2
fila4 VAR portB.3
columna1 VAR portB.4
columna2 VAR portB.5
columna3 VAR portB.6
tecla VAR BYTE         
PAUSE 500

TECLA="@"
LCDOUT $FE, 1
LCDOUT $FE,$0F
lcdout $fe,"Introduzca numero"
inicio:
GOSUB teclado

if tecla<>"@"  then
if tecla="*" or tecla ="#" then
LCDOUT TECLA
LCDOUT $FE,$14
TECLA="@"
PAUSE 10
else
lcdout dec TECLA
LCDOUT $FE,$14
TECLA="@"
PAUSE 10
endif
ENDIF
LCDOUT $FE,$10
GOTO inicio

teclado:  'buscar en el teclado para ver la tecla presionada
HIGH columna1
IF fila1=1 THEN TECLA=1
PAUSE 10
IF fila2=1 THEN TECLA=4
PAUSE 20
IF fila3=1 THEN TECLA=7
PAUSE 20
IF fila4=1 THEN TECLA="*"
PAUSE 20
LOW columna1                  

HIGH columna2
IF fila1=1 THEN TECLA=2
PAUSE 20
IF fila2=1 THEN TECLA=5
PAUSE 20
IF fila3=1 THEN TECLA=8
PAUSE 20
IF fila4=1 THEN TECLA=0
LOW columna2
PAUSE 20

HIGH columna3
IF fila1=1 THEN TECLA=3
PAUSE 20
IF fila2=1 THEN TECLA=6
PAUSE 20
IF fila3=1 THEN TECLA=9
PAUSE 20
IF fila4=1 THEN TECLA="#"
LOW columna3
pause 10

IF TECLA<>"@" THEN
RETURN
ELSE
GOTO TECLADO
ENDIF
end
```





kano2468 dijo:


> buenas noches....
> 
> 
> 
> ...



Saludos amigo kano2468 tu problema cuando SENSORT1=0 te envia N Y O juntos es porque segun tu codigo tienes que cuanod sensor1 es menor que 40 te envia n y cuando sensor1=0 te envia O, entonces se te cumplen las dos condiciones al mismo tiempo es decir 0 es menor que 40 y sensor1 < 40. Entonces trata de hacer lo siguiente: para la parte de sensor1 < 40 colocale otra condicion es decir: if SENSORT1 < 40 and SENSORT1 > 0 then.... me entiendes lo que te quiero decir?
Bueno intenta hacerlo y comenta a ver en que te podemos ayudar, saludos!!!


----------



## kano2468 (Jun 10, 2013)

xmagdielx dijo:


> Saludos compañeros!, primero quiero agradecer a todos los que aportaron conocimientos que me han ayudado grandemente. Bueno les comento que estoy haciendo una especie de calculadora con teclado y mostrarlo en LCD pero solo las operaciones básicas (suma,resta,multiplicación y division), basándome en el ejemplo del amigo mecatrodatos. Mi problema surge cuando quiero decirle al pic que ya ingrese un numero y que me pida el otro numero ( o los otros) para realizar la operación, me explico?, es decir, ingreso por ejemplo el 6, y que el pic lo reconozca como un primer digito, luego que ingrese por ejemplo el 5, y al presionar la tecla de (sumar) me muestre en el lcd el numero (5+6=11).
> 
> aqui tengo el codigo pero por los momentos solo puedo leer la tecla del teclado
> 
> ...



Muchas gracias amigo... gracias por tu respuesta. intentare eso y comento.. asi como tu también agradezco por que he recibido gran ayuda para realizar mi proyecto, en especial al sr. Dar@bytes que me ha ayudado bastante y el cual he molestado mucho.

puedo consultarte algo? con respecto a visual basic y el pic???
si puedes ayudarme te lo agradecería..
estoy tratando de enviar a visual basic desde el pic el nivel exacto de cada tanque y que se vea en una progressbar, pero como tengo pocos conocimiento de visual basic, del pic a visual basic solo envio caracteres como "A" "B" "M" y en visual basic según lo que reciba hago algo como por ejemplo:

```
Private Sub MSComm1_OnComm()
A = MSComm1.Input 'el dato que ingresa guardarlo en variable A
If A = "M" Then
Text1.Text = " TANQUE 100% LLENO "
ProgressBar1.Value = 100
End If
```

y asi envio desde el pic:


```
Sensor_4:
   Low PORTD.7  'esto es un led, solo para verificar funcionamiento 
   SerOut TX,T9600,["X",h,13,10] 'envía a pic2 conectado con sensores, solicitando info de s4
   Pause 100
   SerIn RX,T9600,["sh"],SENSOR4 'recibe info de s4
   if SENSOR4 > 30 then               'según como sea el valor decide:
   SerOut TXPIN,T9600,["J"]             'ENVIA DATOS POR TXpin A LA PC, A VISUAL BASIC
   else
   SerOut TXPIN,T9600,["K"]
   endif
   if sensor4 = 0 then
   SerOut TXPIN,T9600,["L"]
   endif 
   Pause 1000
   High PORTD.7
   Return
```

asi lo hago con cada sensor de flujo y nivel, pero  como te dije quisiera recibir el valor exacto y mostrarlo en la progressbar de cada tanque. como podría hacer eso?? en realida también quería hacerlo con los sensores de flujo, enviar el valor exacto, y en visual basic decidir que hacer... pero no supe.. soy un novato. te adjunto el programa en visual basic.

gracias.. y un saludo..


----------



## kano2468 (Jun 12, 2013)

Buenas noches amigos.. informo que ya tengo mi proyecto casi culminado...
lo importante es que ya tengo lo que parecía mas difícil que era la comunicación pic a pic por rf, y pic a pc por rs232. esta ultima la logre con 2 resistencias una de 22k y otra de 1k. y colocando la velocidad dato invertido: N9600 en vez de dato verdadero: T9600, ya que no se esta utilizando el max232 y los datos no pasaran por el inversor que tiene integrado... 

en el proyecto aun tengo fallas con el sensor de nivel, estoy utilizanzo el sensor ultrasonico hc-sr04.. el cual pruebo por separado del proyecto y me funciona bien.. pero dentro del proyecto no funciona.. me manda puro 0,

la distancia de los cables influye??? son como 2 o 3 metros el mas largo

estos son los códigos que utilizo en el proyecto:

este es una parte del pic 1 cuando solicita al pic 2 información sobre el nivel en el tanque1

```
SensorNT1:
   LOW PORTD.0   'esto es solo son led para identificar el funcionamiento
   LOW PORTD.1
   SerOut TX,T9600,["X",9,13,10]   'envía a pic2 comando solicitando info de sensor tanque1
   PAUSE 500
   SerIn RX,T9600,5000,SensorNT1,["stuno"],SENSORt1       'recibe informacion
   SerOut TXPIN,T9600,[#SENSORT1]       'envía a visual basic, solo para verificar el valor
   PAUSE 2000
   if sensort1 > 81 then SerOut TXPIN,T9600,["M"]    'según sea el valor decide '(vacio)
   IF SENSORT1 < 80 AND SENSORT1 > 61 THEN SerOut TXPIN,T9600,["N"]   '25% lleno
   IF SENSORT1 < 60 AND SENSORT1 > 41 THEN SerOut TXPIN,T9600,["O"]    '50% lleno
   IF SENSORT1 < 40 AND SENSORT1 > 21 THEN SerOut TXPIN,T9600,["P"]    '75 % lleno
   IF SENSORT1 < 20 THEN SerOut TXPIN,T9600,["Q"]               '100% lleno
   PAUSE 3000 
   HIGH PORTD.0     'led solo para verfificar funcionamiento
   HIGH PORTD.1
   RETURN
```

parte del pic 2 donde recibe solicitud de información del sensor del tanque1

```
RecibeRF:  '''''del pic 1
   HIGH PORTD.7
   SERIN RX,T9600,60000,SENSAR,["X"],B0 ' recibe y decide, en este caso seria 9, SENSORNT1
   if B0 = 1 THEN CALL purga1
   IF B0 = 2 THEN CALL purga2
   IF B0 = 3 THEN CALL purga3
   IF B0 = 4 THEN CALL purga4
   IF B0 = 5 THEN CALL SENSORUNO
   IF B0 = 6 THEN CALL SENSORDOS
   IF B0 = 7 THEN CALL SENSORTRES
   IF B0 = 8 THEN CALL SENSORCUATRO
   IF B0 = 9 THEN CALL SENSORNT1
   if B0 = 11 THEN CALL SENSORNT2
   IF B0 = 12 THEN CALL SENSORNT3
   LOW PORTD.7
   RETURN


                                 ''''PRUEBO asi:
SENSORNT1:                'SENSOR TANQUE 1,
   pause 40
   DISPAROT1 = 0          'Inicializa el valor de DISPARO
   PulsOut DISPAROT1,10    'Manda un pùlso de disparo para empezar a medir
   GoSub LEER_ECOST1       'Llamada a funcion para leer el ancho del eco recibido
   RETURN 
   LEER_ECOST1:
   select case SENSORT1
   case 1
   goto LEER_ECOST1
   case 0
   pulsin sensort1,1,NIVELT1
   NIVELST1 = NIVELT1/58
   PAUSE 1000
   SEROUT TX,T9600,["stuno",NIVELST1,13,10]
   END SELECT
   return

                               '''y asi: y no funciona tampoco.. manda 0... 0 0 0
SENSORNT2:                'SENSOR TANQUE 2
   high disparot2
   pauseus 10
   low disparot2
   pulsin sensort2,1,NIVELT2
   NIVELST2 = NIVELT2/58
   PAUSE 1000
   SEROUT TX,T9600,["stdos",NIVELST2,13,10]
   RETURN
```



Aquí el código donde pruebo el sensor independientemente y funciona bien... no entiendo por que no funciona en el proyecto. 


```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 03/06/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
INCLUDE "modedefs.bas"
DEFINE OSC 4
TRISA = %000010
TRISB = %00000110 ' Configuración el Puerto A
TRISD = %00000000
ADCON1 = 6
CMCON = 7
DISPARO VAR PORTA.0
SENSOR VAR PORTA.1
ALARMA  VAR PORTD.0 
CONTADOR VAR WORD
DISTANCIA VAR WORD 
ALARMA = 0

INICIO:
if portb.0 = 1 then call sensornt1
goto inicio
end

sensornt1:
pause 40
disparo = 0          'Inicializa el valor de DISPARO
PulsOut DISPARO,10    'Manda un pùlso de disparo para empezar a medir
GoSub LEER_ECO       'Llamada a funcion para leer el ancho del eco recibido
GoTo INICIO 
LEER_ECO:
select case sensor
case 1
goto LEER_ECO
case 0
pulsin SENSOR,1,DISTANCIA
DISTANCIA = DISTANCIA/58
PAUSE 1000
SEROUT PORTC.6,T9600,[#DISTANCIA]
IF  DISTANCIA < 22 AND DISTANCIA > 10 THEN ALARMA = 0
IF  DISTANCIA < 9 AND DISTANCIA > 1 THEN ALARMA = 1
END select
RETURN

END
```


adjunto proyecto completo y si alguien me puede ayudar en esta parte se lo agradecería.. es solo los sensores de nivel que me falta para completar el proyecto..


saludos a todos. espero su ayuda amigoos se los agradezco.


----------



## digito (Jun 13, 2013)

Hola como te va, veo que preguntas sobre la distancia de los cable por la comunicaciòn Uart,

ese problema se puebe soluzionar utilizando simple I.C. como MAX 485, MAX 487 etc.

Encontraras en los Datasheet como utilizarlo sea en TX como en RX.

Espero que te haya dado indicaciones utiles.

* Por el lado de la programaciòn de los PIC no te puedo ayudar tanto (utilizo Mikrobasic Pro)*

Muchos Saludos


----------



## Alcocer Garcia Felix Davi (Jun 21, 2013)

Hola a todos los participantes de este interesante tema tengo el pic16f628a quiero hacer una ruleta de leds tengo el codigo y el circuito adjuntado. El problema es que a pesar de colocar cmcon=7 para utilizar los puertosa como digitales solo me funcionan hasta el led a3. El problema solo es el puertoa el puertob funciona normal. gracias


----------



## D@rkbytes (Jun 21, 2013)

Alcocer Garcia Felix Davi dijo:


> El problema es que a pesar de colocar cmcon=7 para utilizar los puertosa como digitales solo me funcionan hasta el led a3. El problema solo es el puertoa el puertob funciona normal. gracias


Busca la tabla 3-2 en la hoja de datos y lee las características del pin RA4, ahí encontrarás la respuesta.

Palabra clave: OD

Saludos.


----------



## olimatari (Jun 25, 2013)

buen dia, disculpe, la falla que tengo es que cuando inserto en el programa 
@ device xt_osc  ; oscilador externo XT
define osc 4   
...
me aparece error, al parecer el error son esas dos lineas, ya que cuando borro los espacios entre ellos, despues de @ borro el espacio y tambien despues de device, el error ya no vuelve aparecer, estaria bien ponerlo en esta forma..

@devicext_osc  ; oscilador externo XT
define osc 4 

asi no me arroja errores.


----------



## kano2468 (Jun 25, 2013)

buenas tardes..
aun tengo problemas con los sensores hc-sr04 los tengo conectado al puerto A del pic16f877a, funcionan bien cuando conecto 1 por uno, MUY bien, pero los conecto todos al pic al mismo tiempo y no funcionan, no me me da la lectura.
el trigger de cada uno esta en el porta0, porta1, porta2, respectivamente, y los echo en porta3, porta4, y porta5, respectivamente. los intercambio y nada.. postivio y negativo desde la misma fuente del pic..
que podrá ser.. si alguien tiene una idea se lo agradecería/... por favor ayúdenme..
aquí el código de configuración: 

```
@ Device PIC16F877A 
@ Device HS_OSC, WDT_OFF, PWRT_ON
INCLUDE "modedefs.bas" 'LIBRERIA PARA COMUNICACION SERIAL
DEFINE OSC 20          'OSCILADOR 20 MHZ
TRISA = %111000   ' Configuración el Puerto A
TRISB = %11111111 ' Configuración el Puerto B
TRISD = %00000000 ' Configuración el Puerto D
TRISC = %10111000 ' Configuración el Puerto C
ADCON1 = 6        'DESAHLILITA CONVERTIDOR A/D
CMCON = 7         'DESAHILITA COMPARADORES ANALOGICOS
TX VAR PORTC.6    ' PUERTO TX
RX VAR PORTC.7    ' PUERTO RX
B0  VAR BYTE         'DECLARACION DE VARIABLES
SENSOR1 VAR BYTE     '  '' 
SENSOR2 VAR BYTE     '  ''
SENSOR3 VAR BYTE     '  ''
SENSOR4 VAR BYTE     '  ''
FRECUENCIA1 VAR BYTE '  ''
FRECUENCIA2 VAR BYTE '  ''
FRECUENCIA3 VAR BYTE '  ''
FRECUENCIA4 VAR BYTE '  ''
NIVELT1 VAR word     '  ''
NIVELT2 VAR word     '  ''
NIVELT3 VAR word     '  ''
DISPAROT1 VAR PORTA.0  'PUERTO DE DISPARO SENSOR TANQUE 1
DISPAROT2 VAR PORTA.1  'PUERTO DE DISPARO SENSOR TANQUE 2
DISPAROT3 VAR PORTA.2  'PUERTO DE DISPARO SENSOR TANQUE 3
SENSORT1 VAR PORTA.3 'PUERTO DE ENTRADA SEÑAL SENSOR TANQUE 1
SENSORT2 VAR PORTA.4 'PUERTO DE ENTRADA SEÑAL SENSOR TANQUE 2
SENSORT3 VAR PORTA.5 'PUERTO DE ENTRADA SEÑAL SENSOR TANQUE 3
PORTA = %000000   ' Inicializa el puerto "A".
PORTD = %00000000 ' Inicializa el puerto "D".
PORTB = %00000000 ' Inicializa el puerto "B".
PORTC = %00000000 ' Inicializa el puerto "C".
```




kano2468 dijo:


> Buenas noches amigos.. informo que ya tengo mi proyecto casi culminado...
> lo importante es que ya tengo lo que parecía mas difícil que era la comunicación pic a pic por rf, y pic a pc por rs232. esta ultima la logre con 2 resistencias una de 22k y otra de 1k. y colocando la velocidad dato invertido: N9600 en vez de dato verdadero: T9600, ya que no se esta utilizando el max232 y los datos no pasaran por el inversor que tiene integrado...
> 
> en el proyecto aun tengo fallas con el sensor de nivel, estoy utilizanzo el sensor ultrasonico hc-sr04.. el cual pruebo por separado del proyecto y me funciona bien.. pero dentro del proyecto no funciona.. me manda puro 0,
> ...


----------



## D@rkbytes (Jun 26, 2013)

kano2468 dijo:


> buenas tardes..
> aun tengo problemas con los sensores hc-sr04 los tengo conectado al puerto A del pic16f877a, funcionan bien cuando conecto 1 por uno, MUY bien, pero los conecto todos al pic al mismo tiempo y no funcionan, no me me da la lectura.
> el trigger de cada uno esta en el porta0, porta1, porta2, respectivamente, y los echo en porta3, porta4, y porta5, respectivamente. los intercambio y nada.. positivo y negativo desde la misma fuente del pic..
> que podrá ser.. si alguien tiene una idea se lo agradecería/... por favor ayúdenme.


Saludos kano2468

Es algo complicado seguir el código de tu proyecto por los parámetros de SerIn.
Lo que te recomiendo es que lo hagas por pasos hasta ver en que parte del programa deja de funcionar.
Cuando agregas el uso de SerIn dentro de subrutinas, tienes que esperar a que se reciba algo.
Solamente hasta que se reciba algo, el programa continúa con la siguiente instrucción.
Ya que la instrucción SerIn detiene el programa dentro de un bucle definido por la etiqueta de retorno.
En algunas partes si tomas control pero en otras no, y puede ser que el programa quede en un bucle.

Mencionas que colocas los sensores uno por uno, pero que al colocar todos deja de funcionar.
Repite el proceso, pero fijándote que cada subrutina cumpla con las condiciones para retornar.

Suerte.


----------



## kano2468 (Jun 26, 2013)

D@rkbytes dijo:


> Saludos kano2468
> 
> Es algo complicado seguir el código de tu proyecto por los parámetros de SerIn.
> Lo que te recomiendo es que lo hagas por pasos hasta ver en que parte del programa deja de funcionar.
> ...



saludos D@rkbytes gracias por tu respuesta. 
no amigo ninguno de los dos pic se quedan en un bucle ya que puedo observar el funcionamiento tanto de los pic (por los leds) como el de las antenas cuando envían y reciben (igual por los leds tx y rx), el problema es cuando conecto 2 o los 3 echo de cada sensor en cada uno de sus puertos (ra3, ra4,ra5) la medida o lectura que me arroja es 0, en todas (los triggers están conectados en ra0, ra1, ra2). si conecto un solo echo de un solo sensor en su puerto, si me da la medida exacta, o aproximada. osea funciona bien. 

mi pregunta es si tendre configurados bien el puerto A como entradas/salidas digitales??
es decir con esta configuración funciona bien:

```
ADCON1 = 6        'DESAHLILITA CONVERTIDOR A/D
CMCON = 7         'DESAHILITA COMPARADORES ANALOGICOS
```
 he conseguido por internet varias formas de como desactivarlos pero en realidad no se cual es la forma verdadera o si todas funcionan.
una es con este:

```
ADCON1 = 7
```

otra con esta configuración:

```
To make portA as normal port, you must declare
CMCON = 7 to shut off the comparators and
ADCON0.0 = 0 to shut off the A/D converter 1
ADCON1.PCFG0 = 0
ADCON1.PCFG1 = 1
ADCON1.PCFG2 = 1
ADCON1.PCFG3 = 0
to shut off the A/D converter 2
```

cual de estas sera? 
con esto deshabilito también los de puertoE? 
será que cambio de puerto (dejo los triggers en portA y pongo los echos en portB?)
o tendre que cambiar todo?

gracias por tu ayuda.


----------



## D@rkbytes (Jun 26, 2013)

kano2468 dijo:


> cual de estas sera?
> con esto deshabilito también los de puertoE?
> será que cambio de puerto (dejo los triggers en portA y pongo los echos en portB?)
> o tendre que cambiar todo?



ADCON1 = 6 y ADCON1 = 7, es exactamente lo mismo, mira este post sobre la hoja de datos.
Has lo que te mencioné, ve agregando sensor por sensor hasta que veas cuando dejan de funcionar.
También puedes tener caídas de tensión, ruidos etc.

El problema de no poder ayudarte bien, es que no todos tenemos los sensores.

Saludos.


----------



## D@rkbytes (Jun 26, 2013)

olimatari dijo:


> buen dia, disculpe, la falla que tengo es que cuando inserto en el programa
> @ device xt_osc  ; oscilador externo XT
> define osc 4
> ...
> ...


@devicext_osc  ; oscilador externo XT
define osc 4 
No te da error porque el compilador lo toma como una etiqueta.
Lo correcto es...
*@ Device XT_OSC*
El *@* "ASM" sirve para decirle al compilador que se escribirá en ensamblador,
y debe ir sin espacios a la izquierda, lo que sigue a continuación de *Device*, son los Fuses.

Cuando PBP genera errores al escribir la palabra de configuración, es por usar MPASMWIN,
o porque estás usando una versión de PBP anterior a la 2.60, en ese caso actualízalo.


----------



## everardors (Jul 1, 2013)

buenas, se que van muy avanzados en esto, pero queria pedirles si pueden porner una referencia de como hacer un menu como el que aparece en este video , gracias


----------



## ferdy575 (Jul 5, 2013)

Alcocer Garcia Felix Davi dijo:


> Hola a todos los participantes de este interesante tema tengo el pic16f628a quiero hacer una ruleta de leds tengo el codigo y el circuito adjuntado. El problema es que a pesar de colocar cmcon=7 para utilizar los puertosa como digitales solo me funcionan hasta el led a3. El problema solo es el puertoa el puertob funciona normal. gracias



hola vi tu proyecto y le hice algunas reformas aqui te pongo los archivos para que los veas a ver si te sirve


----------



## Alcocer Garcia Felix Davi (Jul 5, 2013)

hola a todos los amigos del foro tengo el siguiente esquema en proteus y el siguiente programa pbp creo que el programa es correcto pero solo visualizo 8888 no se por que no conmutan los transistores gracias. Simplemente debo visualizar la palabra "hola".


----------



## D@rkbytes (Jul 5, 2013)

Alcocer Garcia Felix Davi dijo:


> hola a todos los amigos del foro tengo el siguiente esquema en proteus y el siguiente programa pbp creo que el programa es correcto pero solo visualizo 8888 no se por que no conmutan los transistores gracias. Simplemente debo visualizar la palabra "hola".


Para simular tu programa en proteus, sustituye los transistores por inversores, escribe "inverter" en la ventana de selección de componentes, y para crear el PCB usa el esquema con transistores.

También deberías agregar la palabra de configuración a tu programa, y la frecuencia de trabajo.

Saludos.


----------



## Alcocer Garcia Felix Davi (Jul 6, 2013)

ferdy575 dijo:


> hola vi tu proyecto y le hice algunas reformas  aqui te pongo los archivos para que los veas a ver si te sirve



Me parecen excelentes tus cambios pero yo quería usar todo el puerto A como salida digital y eso 
hasta ahora no lo puedo lograr igual tu aporte estuvo genial.


----------



## Alcocer Garcia Felix Davi (Jul 6, 2013)

darkbyte muchas gracias por tu aporte use los 74hc14 y funciono gracias


----------



## megatecpower (Jul 12, 2013)

Hola alguien hizo control de velocidad de un motor de 12VCC 100 RPM con HPWM , miis dudas son las sgts: 

1: configurar el HPWM para el pin portd0 y portd1 puesto que los toma por defecto al portc le hize el cambio con el define pero no me sale


2:cuando le da run o inicio y se va ala rutina funciona viste,  pero cuando tiene que volver a       " inicio" no se apaga sigue generando pulsos , lo que hice fue poner en low esos pines pero sigue andando. Segun lei este comando es programado por hardware es decir genera el pwm y el pic puede hacer al mismo tiempo otaras funciones barbaro ,pero el tema es que nose como detenerlo.


----------



## Alcocer Garcia Felix Davi (Jul 13, 2013)

Miren implemente el siguiente programa y circuito con proteus y microcode .Trata de una matriz de 5x7 donde aparece un muñeco que saluda con movimientos y programación sencilla.
He implementado el circuito pero el puerto a no me responde como salida digital ni para el 16f628a ni para el 16f877a quisiera saber si se trata de un error del microcode . Ya que en la hoja de datos dice que funcionan como entradas y salidas  digitales o analogicas gracias.


----------



## ricbevi (Jul 13, 2013)

Alcocer Garcia Felix Davi dijo:


> Miren implemente el siguiente programa y circuito con proteus y microcode .Trata de una matriz de 5x7 donde aparece un muñeco que saluda con movimientos y programación sencilla.
> He implementado el circuito pero el puerto a no me responde como salida digital ni para el 16f628a ni para el 16f877a quisiera saber si se trata de un error del microcode . Ya que en la hoja de datos dice que funcionan como entradas y salidas  digitales o analogicas gracias.



Hola...verifica en la hoja de datos el puerto A en el pin A.4 es de colector abierto ese es tu problema.
Para la simulación lo puedes resolver del modo que te adjunto.

Saludos.

Ric.


----------



## Alcocer Garcia Felix Davi (Jul 13, 2013)

ricbevi te debo una buena


----------



## ricbevi (Jul 13, 2013)

megatecpower dijo:


> Hola alguien hizo control de velocidad de un motor de 12VCC 100 RPM con HPWM , miis dudas son las sgts:
> 
> 1: configurar el HPWM para el pin portd0 y portd1 puesto que los toma por defecto al portc le hize el cambio con el define pero no me sale



Lee la hoja de datos del PIC en cuestión y el hardware esta donde lo pone le fabricante no donde uno quiera definirlo



megatecpower dijo:


> 2:cuando le da run o inicio y se va ala rutina funciona viste,  pero cuando tiene que volver a       " inicio" no se apaga sigue generando pulsos , lo que hice fue poner en low esos pines pero sigue andando. Segun lei este comando es programado por hardware es decir genera el pwm y el pic puede hacer al mismo tiempo otaras funciones barbaro ,pero el tema es que nose como detenerlo.



  Había errores de conexiones en pulsadores, revisa los limites que pueden tomar las variables por que se te desbordaran con resultados aleatorios en la operación, estaba mal la velocidad del reloj en el PIC en la simulación, etc, etc.Hay para seguir trabajando!!!

Saludos.

Ric.


----------



## Alcocer Garcia Felix Davi (Jul 15, 2013)

Hola a todos los adictos a la electrónica aquí adjunto archivos de circuitos que quisiera unificar comunicando serialmente 2 pic y visualizar las señales en matlab ademas deseo obtener mientras halla mas temperatura mas intensidad del foco  gracias.


----------



## diodito (Jul 23, 2013)

amigos me pueden  decir cual es el problema que tiene esto, es que instalo mplab con el compilador pbp en windows xp y al compilar siempre me sale este error no se por que me pueden ayudar....

 saludos


----------



## Alcocer Garcia Felix Davi (Jul 24, 2013)

diodito te aconsejo que instales el plugins correctamente


----------



## Mushito (Jul 31, 2013)

Hola a todos:El siguiente código sería útil a todos, si me ayudan a mejorarlo.Hasta donde esta corre bien, pero me falta lo siguiente:El tiempo de consigna se escribe en dos dígitos, temporizará de 01 a 99 seg.La velocidad consigna de dos dígitos del  01% al 99%El tiempo se graba en la EPROM interna en las variables t1 y t2 (digito 1 y 2) desde el tecladoLa velocidad se graba en la EPROM interna en las variables v1 y v2 (digito 1 y 2) desde el teclado.El problema es que no está en decimal, (me parece que está en ASCII).¿Cómo convierto los valores (parecido a concatenar en EXCEL) de dos variables a 2 dígitos y en decimal?Ejemplo:T1=0T2=9T=09    (minutos)Les envío el código y la simulación, en la simulación no olviden optar por la opción 2 para poner el set de tiempo y velocidad y luego escoger iniciar (con la tecla 1)Saludos,
De antemano muchas gracias, especialmente al señor  Moderador 
D@rkbytes que incondicionalmente me ofreció su ayuda anteriormente.


----------



## D@rkbytes (Jul 31, 2013)

Mushito dijo:


> El problema es que no está en decimal, (me parece que está en ASCII)[/SIZE]


Trabaja el teclado con números enteros, por ejemplo tecla = 1 no tecla = "1"
Y para poder mostrar el valor de las variables en la pantalla debes usar #t1 ó Dec t1


Mushito dijo:


> ¿Cómo convierto los valores (parecido a concatenar en EXCEL) de dos variables a 2 dígitos y en decimal?Ejemplo:T1=0T2=9T=09    (minutos)


Tan solo tienes que sumarlas.
Si quieres mostrar dos digitos, usa Dec2 
Suerte.


----------



## Mushito (Ago 1, 2013)

Muchas gracias señor Moderador 
D@rkbytes, asi es, asi fue como lo solucionè.


----------



## Mushito (Ago 2, 2013)

Estimados amigos:
Continuando y mejorando con mi código, (con ayuda del Sr. Moderador) conseguí las siguientes mejoras:
·         Logré introducir variables de tiempo desde el teclado
·         Logre mostrar las nuevas variables desde el teclado
·         Logre temporizar en minutos según la variable introducida desde el teclado, enciende un led un tiempo en minutos desde el teclado.Ahora se me presenta el siguiente problema:…Donde pongo el siguiente código (corresponde a un motor PAP) que se ejecute mientras el led esté encendido y pare cuando se apague, sin perturbar el tiempo de temporización.El código del motor es.
	
	



```
giro:
for x = 1 to 6 'Repite 6 veces la parte comprendida entre' FOR y NEXT
portc= %1100
pause v
portc= %0110
pause v
portc= %0011
pause v
portc= %1001
pause v
NEXT
pause 100
for x =1 to 6
portc= %1001
pause v
portc= %0011
pause v
portc= %0110
pause v
portc= %1100
pause v
next
pause 100
GOTO giro:
```

Otra consulta:
si hago t=99 
u=(1/t)*1000
u=10.10101010
el resultado me da con decimales
¿tengo que usar algún artificio para obtener la parte entera (como lo  hace int o entero en excel) o PBP sobreentenderá y trabajará con la  parte entera?


----------



## D@rkbytes (Ago 2, 2013)

Mushito dijo:


> Ahora se me presenta el siguiente problema:…Donde pongo el siguiente código (corresponde a un motor PAP) que se ejecute mientras el led esté encendido y pare cuando se apague, sin perturbar el tiempo de temporización.


Para hacer eso, tendrás que hacer uso de interrupciones, porque las pausas congelaran el proceso.
Puedes hacer uso del TMR1 para generar los tiempos mientras corre tu programa.
Algo así como en este ejemplo Temporizador con TMR1


Mushito dijo:


> Otra consulta:
> si hago t=99
> u=(1/t)*1000
> u=10.10101010
> ...


Con PicBasic Pro no podrás obtener el resultado de esa formula porque PBP no trabaja con punto flotante.
El resultado que obtendrás con PicBasic Pro será u = 0
Posiblemente lo puedas hacer con este otro ejemplo _*Ejemplo FP.bas*_
Otra opción más recomendable es migrar a Proton, con ese programa si se puede manejar punto flotante.
Con Proton el resultado si será u = 10.101

Suerte.


----------



## dp500 (Ago 8, 2013)

Hola a todos.
Escribo este primer mensaje como presentación en este magnifico foro.
Estoy haciendo un generador de RF mezcla DDS y VCO's. Utilizare el DDS un ad9850 hasta los 20MHz y los VCO hasta los 200MHz. La parte de los VCO la tengo terminada, y la parte del DDS estoy un poco estancado. Tengo funcionando el AD9850 y un codificador con el siguiente código:

```
DEFINE  LCD_DREG        PORTA        ' Puerto de Datos del PIC
DEFINE  LCD_DBIT        0            ' Empieza en PORTA.0 hasta PORTA.3
DEFINE  LCD_RSREG       PORTA
DEFINE  LCD_RSBIT       4             ' Posicion de la linea RS
DEFINE  LCD_EREG        PORTA
DEFINE  LCD_EBIT        5             ' Posicion de la linea E
DEFINE  LCD_BITS        4             ' 4-bit data bus 
DEFINE  LCD_LINES       2             ' LCD lineas
DEFINE  LCD_COMMANDUS   1000         ' Retardo Comandos 
DEFINE  LCD_DATAUS      50           ' Retardo Datos 

DEFINE  OSC 48                        ' Especifica reloj

'_________________________________________________
'   Configuracion  registros PIC   
'_________________________________________________

TRISA  = %00000000           ' Configura in/out  0=salida
TRISB  = %11111111           ' Configura in/out  1=entrada
TRISC  = %00110000           ' Configura in/out   
PORTA   = 0                     
PORTB   = 0
PORTC   = 0
LATA    = 0                  ' Registros Latch
LATB    = 0
LATC    = 0
ADCON0  = $00                ' Deshabilita ADC
ADCON1  = $0F                ' Pines ADC todos digitales
CMCON   = $07                ' Comparador deshabilitado
UCON    = %00000000          ' Deshabilita USB y habilita RC4 e RC5
UCFG.3  = 1                  ' Deshabilita USB Transceiver
INTCON2.7=0                  ' Habilita R de pull-up
'T2CON   = %00000100          ' Prescaler=1 TMR2=ON
PORTA   = 0
PORTB   = 0
PORTC   = 0    

INTCON.7 = 1                 ' Habilita interrupciones globales GIE=1
INTCON.6 = 1                 ' Habilita interrupciones perifericas PEIE=1   
PIE1.5 = 1                   ' Habilita interrupciones recepciones RCIE
' On Interrupt Goto RxService  ' Asignar interrupción

'___________________________________
'   Simbolos del programa
'___________________________________
symbol EA = portc.4             ' Encoder A
symbol EB = portc.5             ' Encoder B
symbol P6 = portb.6             ' Menu
symbol P7 = portb.7             ' 
symbol P0 = portb.0             ' 

'___________________________________
'   Variables del programa   
'___________________________________
  
ValorSinto    VAR   LONG     ' Palabra de sintonia
Frecuencia    var   LONG     ' Valor frecuencia
Control       var   BYTE     ' Registro control DDS
Dato_pin      var   PortC.0  ' Pin de Datos
Reloj_pin     var   PortC.2  ' Pin de Reloj
Carga_Pin     var   PortC.1  ' Pin de actualizacion del DDS
Enc           var   byte     ' Lectura encoder
Ent_Parte     var   word     ' Parte entera division    
Fra_Parte     var   word     ' Parte decimal division

'___________________________________
'   Titulo del LCD en PowerON
'___________________________________

    pause   200
    lcdout  $FE,1, $FE,2     'Limpia LCD y va primera linea
    LCDOUT  "CCT2013 V1.0" 

'___________________________________
'   Inicializa variables   
'___________________________________

    Control=0               ' Ajuste inicial variable modificable       
    Frecuencia=5000000      ' Ajusta frecuenza inicial
    Fre_Rango=2             ' Rango inicial
    Fre_Desplaza=0          ' Modifica simbolo mas significativo
    Carga_Pin= 1    
    pause 2000
    gosub Calcular
    gosub Enviar_DDS
    
'___________________________________
'   Principal
'___________________________________   

Retorno_Menu
    Pause 10
    if p6=0 then Retorno_Menu
    call LCD_Refresco
    
Principal
    if p6=0 then goto Menu
    if ea=0 then goto Enc_Giro
goto principal 

Enc_Giro 
    if EB=0 then Enc_Inc
    
Enc_Dec
    
    Frecuencia = Frecuencia-1 
    GOTO    Enc_Confirm

Enc_Inc    
    Frecuencia = Frecuencia+1  
    goto    Enc_Confirm
    
Enc_Confirm
    if frecuencia>20000000 then frecuencia=20000000 
    if Frecuencia<400000 then Frecuencia=400000    
    call LCD_Refresco
    gosub Calcular
    gosub Enviar_DDS         
       
Enc_Complete    
    if EA=1 and EB=1 then  Principal        
    goto    Enc_Complete   
goto Principal

'___________________________________
'   Gestion pulsadores
'___________________________________   

'___________________________________
'   Gestiona Menus
'___________________________________   
 menu

 goto Principal
'___________________________________
'   Subprograma de calibración
'___________________________________   





'___________________________________
'   Actualizacion LCD
'___________________________________   

LCD_Refresco
    
    lcdout $FE,1, $FE,2
    lcdout "F: "
    
    if frecuencia < 1000000 then
        Ent_Parte = Frecuencia/1000
        Fra_Parte = Frecuencia//1000         
        lcdout #Ent_Parte, "."
        if Fra_parte < 100 then lcdout "0"
        if Fra_Parte < 10 then lcdout "0"
        lcdout #Fra_Parte, "KHz"
    else
        Ent_Parte = Frecuencia/1000000
        Fra_Parte = Frecuencia//1000000         
        lcdout #Ent_Parte, "."
        if Fra_parte < 100 then lcdout "0"
        if Fra_Parte < 10 then lcdout "0"
        lcdout #Fra_Parte, "MHz"
    endif
return

'___________________________________
'   Actualiza frecuencia del DDS
'___________________________________ 

Calcular

    ValorSinto = Frecuencia ** 2251800         

return

'___________________________________
'   Transferir al DDS
'___________________________________   

Enviar_DDS
    SHIFTOUT Dato_Pin, Reloj_pin, 0,[ValorSinto.BYTE0, ValorSinto.BYTE1, ValorSinto.BYTE2, ValorSinto.BYTE3, Control]
    Carga_Pin = 1
    pauseus 10
    Carga_Pin = 0
    pause 1000
return
```

Utilizo un PIC de la serie 18 para utilizar variables Long
Pero me gustaría ponerle un teclado matricial 4x4 para poder introducir la frecuencia. Por ejemplo escribir "4566000MHz". Me gustaría hacer que tenga barrido, introduciendo la frecuencia de inicio, la frecuencia final y los incrementos de frecuencia.
Todas las ideas serán bienvenidas.


----------



## ferdy575 (Ago 10, 2013)

hola a todos. aquí desparchado sin nada que hacer me dedique a realizar una matriz para adorno de mi banco de trabajo y haciendo pruebas hice 2 programitas uno para una figura fija y otro para una móvil pero: al compilar la fija funciona perfectamente y al compilar la móvil el compilador no hace nada y genera el asm pero no el hex y se queda bloqueado incluso para que funcione de nuevo debo reiniciar el pc como sí se tratara de un virus:cabezon:, sera que alguien me puede ayudar echándole un ojito a mi proyecto? a ver sí puedo hacer funcionar la figura móvil? aquí les subo los archivos para que los vean les agradezco de antemano su ayuda


----------



## ricbevi (Ago 10, 2013)

dp500 dijo:


> Hola a todos.
> Escribo este primer mensaje como presentación en este magnifico foro.
> Estoy haciendo un generador de RF mezcla DDS y VCO's. Utilizare el DDS un ad9850 hasta los 20MHz y los VCO hasta los 200MHz. La parte de los VCO la tengo terminada, y la parte del DDS estoy un poco estancado. Tengo funcionando el AD9850 y un codificador con el siguiente código:
> 
> ...



Hola...Bienvenido al foro y yo estuve hace tiempo pensando en un proyecto similar pero por aquí se hace muy difícil conseguir en el mercado local los materiales necesarios e imposible importarlos...¿que compilador estas usando? por que ni el Proton ni el PBP (al menos las versiones que yo tengo) reconocen la variable definidas como LONG.
Lo del teclado deberías dejar el puerto B libre y allí colocarlo.
Saludos.

Ric.


----------



## reyvilla (Ago 10, 2013)

ferdy575 dijo:


> hola a todos. aquí desparchado sin nada que hacer me dedique a realizar una matriz para adorno de mi banco de trabajo y haciendo pruebas hice 2 programitas uno para una figura fija y otro para una móvil pero: al compilar la fija funciona perfectamente y al compilar la móvil el compilador no hace nada y genera el asm pero no el hex y se queda bloqueado incluso para que funcione de nuevo debo reiniciar el pc como sí se tratara de un virus:cabezon:, sera que alguien me puede ayudar echándole un ojito a mi proyecto? a ver sí puedo hacer funcionar la figura móvil? aquí les subo los archivos para que los vean les agradezco de antemano su ayuda



Hola compañero no veo ningún problema lo único que hice fue apagar todos los fuses y colocar el master clear a 5v es como una carita feliz pero no se mueve lo que hace es como si estuviera hablando o algo así, prueba cambiando eso y me avisas


----------



## dp500 (Ago 11, 2013)

> Hola...Bienvenido al foro y yo estuve hace tiempo pensando en un proyecto similar pero por aquí se hace muy difícil conseguir en el mercado local los materiales necesarios e imposible importarlos...¿que compilador estas usando? por que ni el Proton ni el PBP (al menos las versiones que yo tengo) reconocen la variable definidas como LONG.
> Lo del teclado deberías dejar el puerto B libre y allí colocarlo.
> Saludos.
> 
> Ric.


La version del PBP es la 2.60. A partir de esta version puedes declarar variables LONG de 32 bits, siempre que utilizes PIC de la serie 18. La version del Microcode Studio es la 4.0.0.0, y en opciones del compilador tienes que marcar la casilla "use PBPL". 
Los materiales los consigo por ebay. 
La parte de 20MHz a 200MHz la tengo hecha y funcionando con 4 osciladores (2 VCO de micro-circuits (POS200 y POS100 comprados por internet en una tienda de Australia), y 2 VCO hechos con transistores fet. La parte de 400KHz a 20MHz es la que voy hacer con un modulo DDS AD9850 comprado en ebay por 3€. Luego cuando pase de 20MHz quiero utilizar el DDS como fuente para el PLL y pilotar los otros VCO. Tengo tambien un nivelador de amplitud funcionando perfectamente que conecto a las salidas del DDS y VCO's. Me falta por hacer un amplificador de banda ancha, un atenuador y un medidor de la potencia de la señal.
El teclado lo tengo en el portB, pero no consigo que me funcione bien. Realmente lo que quiero es introducir cualquier numero entre 1 y 200000000, que me lo vaya mostrando en el LCD y cuando pulse por ejemplo "#" que me lo introduzca en la variable "frecuencia".
Piensa que cuando ulitize la funcion de "sweep" (barrido), tengo que introducir 3 frecuencias. A saber: Inicial, Final e Incremento. Tambien quiero poner 2 barridos con frecuencias centrales de 455KHz y 10,7MHz para ajustar los filtros de las FI.
Si estas interesado puedo enviarte mas informacion, aunque la tengo todavia como borrador, y los link donde he comprado las cosas.
Cristobal


----------



## ricbevi (Ago 11, 2013)

dp500 dijo:


> La version del PBP es la 2.60. A partir de esta version puedes declarar variables LONG de 32 bits, siempre que utilizes PIC de la serie 18. La version del Microcode Studio es la 4.0.0.0, y en opciones del compilador tienes que marcar la casilla "use PBPL".
> Los materiales los consigo por ebay.
> La parte de 20MHz a 200MHz la tengo hecha y funcionando con 4 osciladores (2 VCO de micro-circuits (POS200 y POS100 comprados por internet en una tienda de Australia), y 2 VCO hechos con transistores fet. La parte de 400KHz a 20MHz es la que voy hacer con un modulo DDS AD9850 comprado en ebay por 3€. Luego cuando pase de 20MHz quiero utilizar el DDS como fuente para el PLL y pilotar los otros VCO. Tengo tambien un nivelador de amplitud funcionando perfectamente que conecto a las salidas del DDS y VCO's. Me falta por hacer un amplificador de banda ancha, un atenuador y un medidor de la potencia de la señal.
> El teclado lo tengo en el portB, pero no consigo que me funcione bien. Realmente lo que quiero es introducir cualquier numero entre 1 y 200000000, que me lo vaya mostrando en el LCD y cuando pulse por ejemplo "#" que me lo introduzca en la variable "frecuencia".
> ...



Ok me faltaba lo de la casilla "PBPL" ...te sugiero que pases por aquí (https://www.google.com/url?q=https:...ds-cse&usg=AFQjCNGSuhpCArWCM2eylDGieBx7LF3HeQ ) donde hay un atenuador de RF en distintas versiones que quizás te interese. Entiendo la forma y disponibilidad de materiales desde donde tú resides pero NO es lo mismo desde aquí. Por otra parte en este momento en particular ya no me seria de mucha utilidad mas allá del ejercicio de "hacerlo".
En este mismo hilo hay algunos ejemplos de PBP y el uso de teclado que podrías revisar...utiliza el buscador del foro que es una herramienta invaluable. Tal ves para el amplificador de banda ancha puedas usar algún MMIC tipo MAR X(MAR4,5,6,7,etc).
Saludos.

Ric.


----------



## reyvilla (Ago 11, 2013)

Muy buenas compañeros en esta oportunidad vengo con una duda con respecto a interrupciones en PBP. El caso es que estoy tratando de detectar flancos de bajada y subida por un pin del pic esto lo hago a través de la interrupción externa y al momento de detectar el flanco ya sea de bajada o subida la idea es deshabilitar la interrupción externa y habilitar la interrupción por desbordamiento del TMR0 y luego esperar hasta que se desborde el TMR0 y en ese momento hacerlo inverso activar la interrupción externa de nuevo y desactivar la del TMR0. 

Ya he avanzado bastante con respecto a esto pero aun no logro que funcione al 100%.
Comento como hago cada cosa.

El pic es el 12F675

Para la detección de los flancos lo hago intercambiando el bit 6 del registro option de la siguiente manera:


```
OPTION_REG.6 = OPTION_REG.6 ^%1
```

Eso hace que si la interrupción fue por flanco de bajada el bit 6 estaba en 0 y  por lo tanto lo cambio  a 1 para que detecte cuando vuelva a cambia.

INTEDG: Interrupt Edge Select bit
1 = Interrupt on rising edge of GP2/INT pin
0 = Interrupt on falling edge of GP2/INT pin

Hasta aqui todo funciona al 100%

Ahora los pulsos son constantes tardan aproximadamente 8.3ms eso tomándolo de la red de 60Hz. Y la idea de esta parte era hacer un detector de cruce por cero.

Luego sabiendo esto lo que quiero es a partir del punto de detección implementar el TMR0 para activar el triac. Y porque el TMR0 y no un simple pause. Bueno de tanto investigar y leer resulta que mientras que el TMR0 me permite continuar con el programa principal el pause no me lo permite y me genera conflictos.

Entonces para lograr esto genere una variable para incrementar o decrementar el TMR0.
Active el TMR0 luego de la interrupción externa y deshabilite la interrupción externa.
Espero hasta que se desborde el TMR0 y luego activo el triac por un instante y lo desactivo.
Y luego desactivo la interrupción por TMR0 y vuelvo activar la interrupción externa.

Ahora funciona? Si si funciona, lo probé en físico.
Me permite hacer el programa principal? No no me lo ejecuta correctamente.

El loop de interrupción es este:


```
DISABLE
CRUCE_POR_CERO:
TMR0 = A 'variable que contiene el valor para el desboramiento del TMR0 de 0 a 255
IF INTCON.2 = 1 AND INTCON.1 = 0 THEN 'bandera de interrupción del TMR0 y la bandera de 
INTCON.2 = 0                                  'de la interrupción externa
TRIAC = 1
'PAUSEUS 100
TRIAC = 0   
INTCON = %10010000    'deshabilito la interrupción por TMR0
ELSE                                  'en caso de que no se haya desbordado el TMR0
OPTION_REG.6 = OPTION_REG.6 ^%1 'intercambio el estado del bit de interrupción externa
INTCON = %10100000                'habilito la interrupción por TMR0 y deshabilito la externa. 
ENDIF 
RESUME
ENABLE
```


Aun no se como hacer lo de darle prioridades a las interrupciones me gustaría saber si es eso lo otro que se puede hacer y como lo haría.

Si tengo algún error en el código avísenme se los agradezco muchas gracias de antemano


----------



## ferdy575 (Ago 11, 2013)

reyvilla dijo:


> Hola compañero no veo ningún problema lo único que hice fue apagar todos los fuses y colocar el master clear a 5v es como una carita feliz pero no se mueve lo que hace es como si estuviera hablando o algo así, prueba cambiando eso y me avisas



jajaja como te pareció la figura muchas gracias por tu ayuda
lo vuelvo a decir eres un monstruo para esta vaina gracias.


----------



## everardors (Ago 21, 2013)

buenas, pidiendo una manita para poder hacer el cambio de variable en un select case, abajo pongo el ejemplo, esta con un boton que al precionarlo hace el cambio pero la variable tiempo no cambia su valor lo he declaro de 2 formas y no funciona espero puedan ayudarme, gracias.


```
SELECT CASE cambios
CASE CAMBIOS = 1 : TIEMPO = 200 : lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 2 : TIEMPO = 150 : lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 3 : TIEMPO = 100 : lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 4 : TIEMPO = 50 : lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 5 : TIEMPO = 20 : lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
END SELECT
```


```
SELECT CASE cambios
CASE CAMBIOS = 1
   TIEMPO = 200
   lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 2
   TIEMPO = 150
   lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 3
   TIEMPO = 100
   lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 4
   TIEMPO = 50
   lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 5
   TIEMPO = 20
   lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
END SELECT
```


----------



## D@rkbytes (Ago 21, 2013)

everardors dijo:


> buenas, pidiendo una manita para poder hacer el cambio de variable en un select case, abajo pongo el ejemplo, esta con un boton que al precionarlo hace el cambio pero la variable tiempo no cambia su valor lo he declaro de 2 formas y no funciona espero puedan ayudarme, gracias.


Tienes que hacer la selección así...

```
SELECT CASE cambios
CASE 1
   TIEMPO = 200
   lcdout $FE,$C0,DEC CAMBIOS, DEC3 TIEMPO
CASE 2
   TIEMPO = 150
   lcdout $FE,$C0,DEC CAMBIOS, DEC3 TIEMPO
CASE 3
   TIEMPO = 100
   lcdout $FE,$C0,DEC CAMBIOS, DEC3 TIEMPO
CASE 4
   TIEMPO = 50
   lcdout $FE,$C0,DEC CAMBIOS, DEC3 TIEMPO
CASE 5
   TIEMPO = 20
   lcdout $FE,$C0,DEC CAMBIOS, DEC3 TIEMPO
END SELECT
```
Pero veo que se juntará en la pantalla la variable cambios con la variable tiempo.
Por lo tanto tendrás que hacer una separación con " " Por ejemplo...
LCDOut $FE, $C0, Dec cambios, " ", Dec3 tiempo

Suerte.


----------



## everardors (Ago 21, 2013)

gracias, vi que tenia de mas la comparacion de la variable cambios, por eso no funcionaba, gracias


----------



## ferdy575 (Ago 23, 2013)

hola a todos.
por aquí desocupado me puse a revisar un programa que realizo alguno de ustedes no recuerdo quien, es para mensajes en matriz de leds con 16f84a, funciona perfectamente pero no se como alterar la velocidad de desplazamiento, aquí pongo el codigó: 
	
	



```
'*******************************************************************************
'matriz desplazamiento de mensaje con pic 16f84a y registro de desplazamiento 47ls164*
'*******************************************************************************
@ DEVICE PIC16F84A   
@ DEVICE XT_OSC       
@ DEVICE WDT_Off      
@ DEVICE PWRT_OFF       
@ DEVICE PROTECT_Off 
DEFINE OSC 4  
 'declaracion de variables

LINEA            var byte[16]
CHAR             VAR BYTE[8]
CHAR_ACT         VAR BYTE ' puntero de caracter
CHAR_LENGTH_ACT  VAR BYTE ' puntero de la longitud del caracter
CHAR_LENGTH      var byte ' longitud de la longitud
Caracter         var byte
Counter1         var byte
Counter2         var byte
Counter3         var byte
Counter4         var byte  


'declaracion de alias

DATOS            var PORTA.0
CLOCK            var PORTA.1

'Inicializacion de los datos


TRISA = 0
TRISB = 0

linea[1]=$FF
linea[2]=$FF
linea[3]=$FF
linea[4]=$FF
linea[5]=$FF
linea[6]=$FF
linea[7]=$FF
linea[8]=$FF
char_act=0
counter3=0
counter4=0
counter2=1
char_length_act = 1
low clock
low datos

DATA @0,"# FOROS DE ELECTRONICA " 'aquí guardamos nuestro mensaje, es modificable al gusto
read char_act,caracter
gosub tabla_char

'inicio del programa
Inicio:

MENSAJE:
        linea[1]=char[char_length_act]
        IF CHAR_LENGTh_act = char_length  then
           char_act = char_act + 1  
Mens_Salto1:
           read char_act,caracter
           if caracter=$FF then 
              char_act=0
              goto mens_salto1
           endif   
           gosub tabla_char
           char_length_act=0
        endif   
Img:
        counter1=0
                
LineH:
         PORTB = $FF
         counter1 = counter1 + 1      'envia LA ACTIVACION del registro
         if counter1 = counter2 then  'serial paralelo
            gosub send_data0          'para activar la linea vertical
         else
             gosub send_data1
         endif
         if counter1 = 8 then goto LineV
         goto lineh

LineV:
      PORTB = LINEA[COUNTER2]    'determina la posicion activa horizontal
      pauseus 500                'y genera la activacion de los leds verticales
      if counter2 = 8 then
           counter2 = 1
      ELSE
            counter2 = counter2 + 1
      endif
 
      
Shift_Left:
           if counter3 = 250 then
                counter3 = 0
                COUNTER4 = COUNTER4 + 1
                if counter4 = 2 then ' 250 del counter3 *4 del 
                   linea[8]=linea[7]'counter4 es aprox 0.5seg
                   linea[7]=linea[6]'si hay mas lineas 
                   linea[6]=linea[5]'hay q agrandar los vectores
                   linea[5]=linea[4]'y cambiar por un for   
                   linea[4]=linea[3]  
                   linea[3]=linea[2]  
                   linea[2]=linea[1]
                   counter4 = 0
                   char_length_act = char_length_act+1
                   GOTO INICIO
                endif
            ELSE
                counter3 = counter3 + 1
            endif
            goto IMG
                      
SEND_DATA0:
           low datos
           pauseus 1
           low clock
           pauseus 1
           high clock
           RETURN

SEND_DATA1:
           HIGH DATOS
           pauseus 1
           low clock
           pauseus 1
           high clock
           RETURN

'tabla de seleccion de caracter
           
TABLA_CHAR:
    select case caracter
            case " "
                char_LENGTH=3
                char[3]=$FF
                char[2]=$FF
                char[1]=$FF
            
            case"1" 
                char_LENGTH=4
                char[4]=$FF
                char[3]=%11111110
                char[2]=%10000000
                char[1]=%11011110

            case "2"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001110
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%11011000

            case "3" 
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001001
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%11011101
    
            case "4"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11110111
                char[3]=%10000000
                char[2]=%11010111
                char[1]=%11100111
   
            case "5" 
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10110001
                char[3]=%10101110
                char[2]=%10101110
                char[1]=%10001110
    
            case "6" 
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11110001
                char[3]=%11101110
                char[2]=%10101110
                char[1]=%11000001
    
            case "7"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10001111
                char[3]=%10110011
                char[2]=%10111100
                char[1]=%10111111
    
            case "8"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001001
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%11001001
    
            case "9" 
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11000001
                char[3]=%10110110
                char[2]=%10110111
                char[1]=%11001111
                 
            case "0"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11000001
                char[3]=%10111110
                char[2]=%10111110
                char[1]=%11000001
            
            case "@"
                char_LENGTH=7
                char[7]=$FF
                char[6]=%11000001
                char[5]=%10111010
                char[4]=%10100010
                char[3]=%10101010
                char[2]=%10110110
                char[1]=%11000001    
            
            case ":"
                char_LENGTH=3
                char[3]=$FF
                char[2]=%11001001
                char[1]=%11001001
            
            case "["
                char_LENGTH=3
                char[3]=$FF
                char[2]=%10111110
                char[1]=%10000000
            
            case "]"
                char_LENGTH=3
                char[3]=$FF
                char[2]=%10000000
                char[1]=%10111110
            
            case ","
                char_LENGTH=3
                char[3]=$FF
                char[2]=%11111001
                char[1]=%11111110
                
            case "."
                char_LENGTH=2
                char[2]=$FF
                char[1]=%11111110
                
            case"-" 
                char_LENGTH=4
                char[4]=$FF
                char[3]=%11110111
                char[2]=%11110111
                char[1]=%11110111             
            
            case "A"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11000000
                char[3]=%10110111
                char[2]=%10110111
                char[1]=%11000000
                          
           case "B"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001001
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%10000000
           
           case "C"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11011101
                char[3]=%10111110
                char[2]=%10111110
                char[1]=%11000001 
            
            case "D"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11000001
                char[3]=%10111110
                char[2]=%10111110
                char[1]=%10000000
                
            case "E"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10111110
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%10000000
                               
            case "F"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10111111
                char[3]=%10110111
                char[2]=%10110111
                char[1]=%10000000
                
            case "G"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11010001
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%11000001
            
            case "H"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10000000
                char[3]=%11110111
                char[2]=%11110111
                char[1]=%10000000
            
            case "I"
                char_LENGTH=4
                char[4]=$FF
                char[3]=%10111110
                char[2]=%10000000
                char[1]=%10111110
                
            case "J"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10111111
                char[3]=%10000001
                char[2]=%10111110
                char[1]=%11111101
            
            case "K"
                char_LENGTH=4
                char[5]=$FF
                char[3]=%10111110
                char[3]=%11011101
                char[2]=%11101011
                char[1]=%10000000
            
            case "L"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11111100
                char[3]=%11111110
                char[2]=%11111110
                char[1]=%10000000
            
            case "M"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%10000000
                char[4]=%11011111
                char[3]=%11101111
                char[2]=%11011111
                char[1]=%10000000
            
            case "M"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%10000000
                char[4]=%11011111
                char[3]=%11101111
                char[2]=%11011111
                char[1]=%10000000
                
            case "N"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10000000
                char[3]=%11110011
                char[2]=%11001111
                char[1]=%10000000
            
            case "O"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%11000001
                char[4]=%10111110
                char[3]=%10111110
                char[2]=%10111110
                char[1]=%11000001
            
            case "P"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001111
                char[3]=%10110111
                char[2]=%10110111
                char[1]=%10000000
                
            case "Q"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%11111110
                char[4]=%11000001
                char[3]=%10111001
                char[2]=%10111101
                char[1]=%11000011
                
            case "R"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001000
                char[3]=%10110111
                char[2]=%10110111
                char[1]=%10000000
            
            case "S"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11011001
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%11001101
                
            case "T"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%10011111
                char[4]=%10111111
                char[3]=%10000000
                char[2]=%10111111
                char[1]=%10011111
                
            case "U"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%10000001
                char[4]=%11111110
                char[3]=%11111110
                char[2]=%11111110
                char[1]=%10000001
            
            case "V"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%10000111
                char[4]=%11111001
                char[3]=%11111110
                char[2]=%11111001
                char[1]=%10000111
                
            case "X"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10001000
                char[3]=%11110111
                char[2]=%11110111
                char[1]=%10001000
                                            
            case "Y"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10001111
                char[3]=%11110000
                char[2]=%11110000
                char[1]=%10001111
                
            case "Z"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10011110
                char[3]=%10100110
                char[2]=%10110010
                char[1]=%10111100
                              
            case else
                char_LENGTH=5
                CHAR[1]=$FF
                CHAR[2]=$FF
                CHAR[3]=$FF
                CHAR[4]=$FF
                CHAR[5]=$FF

    end select
    return
             
                 
END
```
agradezco su colaboración


----------



## Mushito (Ago 27, 2013)

Ayuda, señor moderador D@rkbytes, en mi ultimo mensaje adjunte un archivo en rar donde esta el código y la simulación.
En base al mismo temporizador hice uno nuevo, el problema es que el temporizador funciona mas o menos bien hasta los 3 min. Cuando seteo a 9 min el temporizador ya no temporiza los 9 minutos.
No logro entender por que no funciona, peor pasa cunado seteo a cualquier numero de 2 dígitos por ejemplo 60 minutos.
¿que podrá ser?
En un principio creí que era por el proteus, asi que lo monte en proto y pasa el mismo efecto.
Ayuda por favor.


----------



## D@rkbytes (Ago 27, 2013)

Mushito dijo:


> Ayuda, señor moderador D@rkbytes, en mi ultimo  mensaje adjunte un archivo en rar donde esta el código y la simulación.


Sube tu nuevo programa porque así no es posible saber que pueda estar fallando.

*Ten en cuenta esto por favor:*

*Reglas del Foro 23)* Es de mala educación referir una consulta a un solo miembro de la Comunidad.
  Además de que te pierdes la posibilidad de que otros miembros te respondan.


----------



## Mushito (Ago 28, 2013)

Con las disculpas del caso...
En el mensaje #2684 adjuntè un archivo en rar (por falla en mi navegador no lo puedo subir otra vez) en el que encontraran un temporizador en pbp y proteus.
En base al mismo temporizador hice uno nuevo, el problema es que el temporizador funciona más o menos bien hasta los 3 min. Cuando seteo a 9 min (09) el temporizador ya no temporiza los 9 minutos.
No logro entender por qué no funciona, peor pasa cunado seteo a cualquier numero de 2 dígitos por ejemplo 60 minutos.
¿que podrá ser?
En un principio creí que era por el proteus, así que lo monte en proto y pasa el mismo efecto.
Ayuda por favor.


----------



## D@rkbytes (Ago 28, 2013)

Mushito dijo:


> el problema es que el temporizador funciona más o menos bien hasta los 3 min. Cuando seteo a 9 min (09) el temporizador ya no temporiza los 9 minutos.
> No logro entender por qué no funciona, peor pasa cunado seteo a cualquier numero de 2 dígitos por ejemplo 60 minutos.
> ¿que podrá ser?


Puede ser por la dimensión de la variable, quizás la declaraste del tipo Byte (Máximo 255).
Si te funciona con tres minutos es por esto: 3 x 60 = 180 (< 255 Y cabe dentro de la variable)
Pero... 9 x 60 = 540 (No cabe dentro de la variable, necesitas una variable del tipo Word, max. 65535)
Con PicBasic Pro el tipo de variable más alta para la familia PIC16 es del tipo Word.
En la familia PIC18 si puedes usar variables del tipo Long.

Si este es el problema, prueba cambiando la variable al tipo Word.

Saludos.


----------



## Mushito (Ago 29, 2013)

Gracias Señor Moderador D@rkbytes, otra vez me sacó de apuros.Era eso, lo probé en el proteus (existe bastante diferencia entre el cronometro externo y el proteus) pero en el proto lo probé con 5 minutos y 60 minutos y la variación es de pocos segundos y a pesar que estoy usando oscilador interno del pic 16F628a.


----------



## vimato (Sep 6, 2013)

buenos días. necesito un poco de su ayuda, estoy desarrollando un proyecto, estoy comunicando 4 canales analógicos a través de el puerto serial del 16f870, quiero enviar los cuatros datos de los canales analógicos y asignarlos a 4 variables en otro pic 16f870, el problema que tengo es que envío correctamente los 4 datos pero no he logrado recibirlos correctamente en el otro pic para poder mostrarlos en una lcd.

*transmisor*

```
INCLUDE "modedefs.bas"

@ device xt_osc 
define OSC 4
define LCD_DREG  PORTC
DEFINE LCD_DBIT  4
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG  PORTC
DEFINE LCD_EBIT  3
DEFINE LCD_BIT   4
DEFINE LCD_LINE  4

DEFINE ADC_BITS  10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPELUS 50

TRISB = %11000000
TRISA.4 = 1
SUMA VAR PORTB.6
RESTA VAR PORTB.7
L1 VAR PORTB.0
L2 VAR PORTB.1
L3 VAR PORTB.2
L4 VAR PORTB.3
L5 VAR PORTB.5
SONIDO VAR PORTB.4
SELECTOR VAR PORTA.4
SEL VAR BYTE
SET1 VAR WORD
SET2 VAR WORD
SET3 VAR WORD
SET4 VAR WORD
DATO1 var WORD
DATO2 VAR WORD
DATO3 VAR WORD
DATO4 VAR WORD
SENAL1 var word
SENAL2 VAR WORD
SENAL3 VAR WORD
SENAL4 VAR WORD
ADCON1 = %00000000
ADCON0 = %01000001
PAUSE 100
SEL = 1 
SET1 = 20000
SET2 = 20000
SET3 = 20000
SET4 = 20000

inicio:

ADCIN 0,DATO1
dato1 = ( dato1 / 64 ) * 489
SENAL1 = div32 10

ADCIN 1,DATO2
dato2 = ( dato2 / 64 ) * 489
SENAL2 = div32 10

ADCIN 2,DATO3
dato3 = ( dato3 / 64 ) * 489
SENAL3 = div32 10


ADCIN 3,DATO4
dato4 = ( dato4 / 64 ) * 489
SENAL4 = div32 10

SEROUT PORTC.0,N9600,[#SENAL1,",",#SET1,",",#senal2,",",#set2,",",#senal3,",",#set3,",",#senal4,",",#set4,","]

GOSUB SERIAL

if suma or resta = 1 then gosub calibracion
IF SELECTOR = 1 THEN GOSUB SELEC
IF SENAL1 > SET1  THEN
HIGH L1 
HIGH SONIDO 
ELSE
LOW L1
LOW SONIDO
ENDIF

IF SENAL2 > SET2  THEN
HIGH L2 
HIGH SONIDO 
ELSE
LOW L2
LOW SONIDO
ENDIF

IF SENAL3 > SET3  THEN
HIGH L3 
HIGH SONIDO 
ELSE
LOW L3
LOW SONIDO
ENDIF

IF SENAL4 > SET4  THEN
HIGH L4 
HIGH SONIDO 
ELSE
LOW L4
LOW SONIDO
ENDIF

SELECT CASE SEL

CASE 1
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.01  SE.MAX"
lcdout $FE, $C0, DEC SENAL1 dig 4,".", dec senal1 dig 3, dec senal1 dig 2, " V"  
LCDOUT $FE, $CE, DEC SET1 dig 4,".",dec set1 dig 3,dec set1 dig 2," V" 
PAUSE 100

CASE 2
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.02  SE.MAX"
lcdout $FE, $C0, DEC SENAL2 DIG 4,".",DEC SENAL2 DIG 3,DEC SENAL2 DIG 2," V"  
LCDOUT $FE, $CE, DEC SET2 DIG 4,".",DEC SET2 DIG 3,DEC SET2 DIG 2," V"
PAUSE 100

CASE 3
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.03  SE.MAX"
lcdout $FE, $C0, DEC SENAL3 DIG 4,".",DEC SENAL3 DIG 3,DEC SENAL4 DIG 2," V" 
LCDOUT $FE, $CE, DEC SET3 DIG 4,".", DEC SET3 DIG 3, DEC SET3 DIG 2," V"
PAUSE 100

CASE 4
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.04  SE.MAX"
lcdout $FE, $C0, DEC SENAL4 DIG 4,".",DEC SENAL4 DIG 3,DEC SENAL4 DIG 2," V"  
LCDOUT $FE, $CE, DEC SET4 DIG 4,".",DEC SET4 DIG 3,DEC SET4 DIG 2," V" 
PAUSE 100

END SELECT

goto inicio

calibracion:

SELECT CASE SEL

CASE 1
IF SUMA = 1 THEN SET1 = SET1 + 1000
IF RESTA = 1 THEN SET1 = SET1 - 1000
PAUSE 200

CASE 2
IF SUMA = 1 THEN SET2 = SET2 + 1000
IF RESTA = 1 THEN SET2 = SET2 - 1000
PAUSE 200

CASE 3
IF SUMA = 1 THEN SET3 = SET3 + 1000
IF RESTA = 1 THEN SET3 = SET3 - 1000
PAUSE 200

CASE 4
IF SUMA = 1 THEN SET4 = SET4 + 1000
IF RESTA = 1 THEN SET4 = SET4 - 1000
PAUSE 200

END SELECT
return

SELEC:
IF SELECTOR = 1 THEN SEL = SEL + 1
PAUSE 200
IF SEL = 5 THEN SEL = 1
RETURN

SERIAL:
HIGH L5
PAUSE 12
LOW L5
RETURN

end
```
*receptor*

```
INCLUDE "modedefs.bas"
@ device xt_osc 
define OSC 4
define LCD_DREG  PORTB
DEFINE LCD_DBIT  4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG  PORTB
DEFINE LCD_EBIT  3
DEFINE LCD_BIT   4
DEFINE LCD_LINE  4

TRISB = %00000000
TRISC = %00000111
SUMA VAR PORTC.1
RESTA VAR PORTC.2
SELECTOR VAR PORTC.0
SEL VAR BYTE
L1 VAR PORTC.4
L2 VAR PORTC.5
L3 VAR PORTC.6
L4 VAR PORTC.7
L5 VAR PORTC.3
SONIDO VAR PORTB.0
SET1 VAR WORD
SET2 VAR WORD
SET3 VAR WORD
SET4 VAR WORD
SENAL1 var word
SENAL2 VAR WORD
SENAL3 VAR WORD
SENAL4 VAR WORD
A VAR BIT

SEL = 1
INICIO:

if suma or resta = 1 then gosub calibracion
IF SEL = 1 THEN GOSUB SELEC
IF SENAL1 > SET1  THEN
HIGH L1 
HIGH SONIDO 
ELSE
LOW L1
LOW SONIDO
ENDIF

IF SENAL2 > SET2  THEN
HIGH L2 
HIGH SONIDO 
ELSE
LOW L2
LOW SONIDO
ENDIF

IF SENAL3 > SET3  THEN
HIGH L3 
HIGH SONIDO 
ELSE
LOW L3
LOW SONIDO
ENDIF

IF SENAL4 > SET4  THEN
HIGH L4 
HIGH SONIDO 
ELSE
LOW L4
LOW SONIDO
ENDIF

SELECT CASE SEL

CASE 1
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.01  SE.MAX"
lcdout $FE, $C0, DEC SENAL1 ," V"  
LCDOUT $FE, $CE, DEC SET1 ," V" 
PAUSE 100

CASE 2
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.02  SE.MAX"
lcdout $FE, $C0, DEC SENAL2 DIG 4,".",DEC SENAL2 DIG 3,DEC SENAL2 DIG 2," V"  
LCDOUT $FE, $CE, DEC SET2 DIG 4,".",DEC SET2 DIG 3,DEC SET2 DIG 2," V"
PAUSE 100

CASE 3
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.03  SE.MAX"
lcdout $FE, $C0, DEC SENAL3 DIG 4,".",DEC SENAL3 DIG 3,DEC SENAL4 DIG 2," V" 
LCDOUT $FE, $CE, DEC SET3 DIG 4,".", DEC SET3 DIG 3, DEC SET3 DIG 2," V"
PAUSE 100

CASE 4
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.04  SE.MAX"
lcdout $FE, $C0, DEC SENAL4 DIG 4,".",DEC SENAL4 DIG 3,DEC SENAL4 DIG 2," V"  
LCDOUT $FE, $CE, DEC SET4 DIG 4,".",DEC SET4 DIG 3,DEC SET4 DIG 2," V" 
PAUSE 100

END SELECT

SERIN PORTB.1,N9600,SENAL1,SET1,senal2,set2,senal3,set3,senal4,set4
HIGH L5
PAUSE 50
LOW L5
pause 50

GOTO INICIO

calibracion:

SELECT CASE SEL

CASE 1
IF SUMA = 1 THEN SET1 = SET1 + 1000
IF RESTA = 1 THEN SET1 = SET1 - 1000
PAUSE 200

CASE 2
IF SUMA = 1 THEN SET2 = SET2 + 1000
IF RESTA = 1 THEN SET2 = SET2 - 1000
PAUSE 200

CASE 3
IF SUMA = 1 THEN SET3 = SET3 + 1000
IF RESTA = 1 THEN SET3 = SET3 - 1000
PAUSE 200

CASE 4
IF SUMA = 1 THEN SET4 = SET4 + 1000
IF RESTA = 1 THEN SET4 = SET4 - 1000
PAUSE 200

END SELECT
return

SELEC:
IF SELECTOR = 1 THEN SEL = SEL + 1
PAUSE 200
IF SEL = 5 THEN SEL = 1
RETURN

END
```


----------



## xmagdielx (Sep 8, 2013)

que tal vimato, primero dejame hacerte una pregunta, tienes el pic transmisor en una simulacion y el pic receptor en otra simulacion? porque si es asi no te va a funcionar, te recomiendo que prurebes conectando la salida tx del pic emisor al rx del pic receptor y de esa forma verificas si la recepcion y el codigo estan trabajando como tu quieres. Realiza esa prueba y comenta a ver en  que te podemos colaborar. Suerte y Saludos!


----------



## ricbevi (Sep 8, 2013)

Hola "vimato"...hay unas cuantas cosas que veo a la "pasada de vista" en tú código...deberías subir los archivos de simulación para facilitarle las cosas al que te quiera ayudar.
En el código en el TX emites las comas"," como separadores de la cadena que enviás pero en el RX no haces nada con ellas...deberías mandar algún carácter de sincronizacion para así saber donde comienza la cadena de datos en el emisor y en el receptor deberías usar el comando "Wait" para tal efecto...tienes un pic con UART interna(HSerin) y usas comunicación serie emulada(Serin) que no es lo optimo...etc. Consulta la ayuda del PBP.
No entre a analizar la lógica del programa en sí.
Saludos.

Ric.


----------



## Nano24 (Sep 12, 2013)

Buenas amigos tenia tiempo que no pasaba por el foro, hace unos días me puse a recordar un poco de picbasic ya que me la paso mas metido con programación Arduino. El caso es que estoy haciendo un monitor cardíaco para medir las pulsaciones, estaba pensando usar el comando *COUNT* pero no conseguía los datos correctos en el manejo de dicha sentencia, así que me dispuse a hacer un sistema como flanco.

Voy a empezar por pasos en la programacion:


```
DEFINE OSC 4                      ;DEFINCION OSCILADOR
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB       ;DEFINICION DE LOS PINES DEL PIC AL LCD
DEFINE LCD_EBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3

TRISB = 0     ;PUERTO B COMO SALIDA
PORTB = 0    ;INICIA EL PUERTO B EN CERO

DATOS VAR PORTB.0    ;PIN CON EL NOMBRE DATO, POR DONDE SE LEERÁN LOS PULSOS
PULSOS VAR BYTE       ;VARIABLE DONDE SE GUARDARAN LOS PULSOS OBTENIDOS

LCDOUT $FE,1          ;LIMPIAR LCD
PAUSE 500              ;RETARDO


INICIO:                                                ;LOOP CON NOMBRE INICIO
LCDOUT $FE,2,"PULSOS = ",DEC2 PULSOS   ;MOSTRAR RESULTADO EN LA LCD
IF DATOS = 1 THEN                                ;SI DATOS ENTRA EN ESTADO 1 ENTONCES
LCDOUT $FE,1,"PULSOS = ",DEC2 PULSOS   ;MOSTRAR RESULTADO EN LA LCD 
PULSOS = PULSOS + 1                            ;SUMA "1" A LA VARIABLE PULSOS
ESPACIO:                                             ;LOOP CON NOMBRE ESPACIO
IF DATOS = 1 THEN ESPACIO     ;SI EL PIN DATOS PERMANECE EN UNO, NO HACE NADA
ENDIF                                    ;FINALIZAR SI
GOTO INICIO                           ;IR A INICIO

END                       ;FIN DEL PROGRAMA
```


Bueno como puede ver la lógica del programa se basa en, que al cambiar a estado 1 el pin dato se suma la variable pulsos y esta no seguirá sumando hasta no volver a 0 y luego iniciar otra vez, así conseguí leer la entrada de pulsos en tiempo real sin importar la velocidad con que llegan los pulsos al pin DATOS.

El problema es que quiero que, a medida que se cuente los pulsos por el pin DATOS, se pueda mostrar en la LCD un conteo de 60 segundos al mismo tiempo, que sea independiente uno del otro, he intentado que el programa me trate de realizar ambas funciones al mismo tiempo y no puedo, tiene retardos o se cuelga, ¿hay que usar interrupciones? he intentado con el manual pbp que aparece unos ejemplos y no me da tampoco.

Les voy a dejar el diagrama que detecta los pulsos y el diagrama de proteus con el archivo HEX, ojala me puedan ayudar y me haya hecho explicar bien.


----------



## ferdy575 (Sep 20, 2013)

Hola a todos.
De nuevo ando por estos lados molestándolos a ver sí me pueden ayudar.
He estado haciendo pruebas de matrices de leds y tengo un pequeño problema con un código para una de 8x24 no se por que no logro que los registros 74hc164 colocados en cascada funcionen como debe ser pues en lugar de ir añadiendo las letras que siguen atrasan la información un bit por cada registro y en cada 8 columnas se ve lo mismo aquí les subo los archivos para que vean lo que quiero decir, y a ver sí me pueden ayudar a corregir los errores que tenga en el código, además en el puerto a3 me sale un dato invertido y tuve que poner un inversor que quiero quitar pero no se como invertir este dato en el código  les agradezco de antemano su colaboración, muchas gracias por su paciecia


----------



## reyvilla (Sep 22, 2013)

ferdy575 dijo:


> Hola a todos.
> De nuevo ando por estos lados molestándolos a ver sí me pueden ayudar.
> He estado haciendo pruebas de matrices de leds y tengo un pequeño problema con un código para una de 8x24 no se por que no logro que los registros 74hc164 colocados en cascada funcionen como debe ser pues en lugar de ir añadiendo las letras que siguen atrasan la información un bit por cada registro y en cada 8 columnas se ve lo mismo aquí les subo los archivos para que vean lo que quiero decir, y a ver sí me pueden ayudar a corregir los errores que tenga en el código, además en el puerto a3 me sale un dato invertido y tuve que poner un inversor que quiero quitar pero no se como invertir este dato en el código  les agradezco de antemano su colaboración, muchas gracias por su paciecia



Hola compañero rápidamente noto que estas programando el pic a 4Mhz y lo estas simulando a 20Mhz no revise de momento otra cosa prueba ajustando eso primero y me avisas saludos


----------



## ferdy575 (Sep 22, 2013)

reyvilla dijo:


> Hola compañero rápidamente noto que estas programando el pic a 4Mhz y lo estas simulando a 20Mhz no revise de momento otra cosa prueba ajustando eso primero y me avisas saludos



Hola Reyvilla. Gracias por mirar mi proyecto.
Si tienes razón esto lo hice a propósito para ver pasar más rápido el mensaje pues no se como alterar la velocidad en el programa y al simularlo o en el protoboard a 4 MHz corre lentisimo  y como dije antes no se por que no funcionan bien los registros y en protoboard sucede exactamente lo mismo agradezco muchísimo sí me puedes ayudar


----------



## reyvilla (Sep 22, 2013)

ferdy575 dijo:


> Hola Reyvilla. Gracias por mirar mi proyecto.
> Si tienes razón esto lo hice a propósito para ver pasar más rápido el mensaje pues no se como alterar la velocidad en el programa y al simularlo o en el protoboard a 4 MHz corre lentisimo  y como dije antes no se por que no funcionan bien los registros y en protoboard sucede exactamente lo mismo agradezco muchísimo sí me puedes ayudar



Hola de nuevo, revisando el codigo me doy cuenta que esta echo para una matrix e 8x8 por lo cual si tomas en cuenta que para una matriz de 24 puntos horizontales lo cuales vas a ir activando los led verticales según sea necesario para ir armando la imagen. Que sucede tu lo que haces en el código es un recorrido de 8 horizontales siempre por lo cual lo que sucede es que se va repitiendo en cada registro el mismo dato del registro anterior por lo cual se muestra la misma imagen en cada una de las matrices de 8x8. Ahora lo que se debe hacer es expandir esos 8 pulsos de reloj a 24. Tienes que tomar en cuenta lo siguiente:

Para tu primera duda lo de la compuerta inversora, lo que me encanta de los circuitos lógicos es eso mismo que hay que ser muy lógico en su funcionamiento para saber diseñar un circuito en tu caso lo conectaste en el clock. Lo cual si solo funciona con esa compuerta lo que te dice esa inversora es que inviertas la lógica del reloj en el código y listo.


Ahora lo de los tiempos y el bit de desplazamiento, te voy hacer una breve explicación general de como funciona toda la matriz. 

Tenemos 24 columnas y 8 filas.
Las columnas están fijadas a los registros por ser mayoría y las filas a un puerto de pic.

Con estos datos puedes concluir lo siguiente viéndolo de modo programación lógica para que se sea mas fácil de entender.

En un esta matriz tienes un total de 24 tiempos o estados.  Donde en cada estado podemos a su vez tener una combinación de 8 bits. Osea esto te dice que es casi inimaginable las 
combinaciones que puedes tener allí entre filas y columnas.

Ahora bien sabiendo esto como es  tiene que ser la arquitectura o algoritmo del código para que podamos usar cualquier combinación. 

Primero determinar los tiempos, los voy  llamar tiempo de led fila "TLF" y tiempo de led columna "TLC" mas el tiempo de desplazamiento o clock "Tclock" de los registros. 
Adicional a eso como los datos que estamos enviando a los registros duran muy poco
no tendríamos tiempo de ver nada en la matriz ya que pasaría muy rápido. entonces para eso vamos a utilizar un repetidor que voy a llamar tiempo de repetición "TR". Ahora jugando con estos tiempos podemos aprender y lograr desplazar una imagen y poder verla como queramos.

Entonces tenemos:
tiempo de led fila "TLF" 
tiempo de led columna "TLC"
tiempo de desplazamiento o clock "Tclock"
tiempo de repetición "TR"

Ahora tiempo de ejecución:
Tiempo1:
Y activar la columna 1.
Y en este punto aplicas TLC

Tiempo2:
Enviar la combinación de los 8 bits por el puerto del pic.
Y en este punto aplicas "TLF"

Tiempo12: Aquí se determina cuantas veces se va a mostrar el mismo dato para poder verlo.
 Y en este punto aplicas "TR"

Tiempo3: Para desplazar dato.
Y en este punto aplicas "Tclock" 

Y vas desplazando los bit del dato y repitiendo el mismo proceso. Ahora pareciera que TLC Y TLF son dos tiempos de retardos distintos, en realidad es uno solo tiempo ya que para encender el del deben combinarse ambas activaciones tanto horizontal como vertical.

 En resumen:
Cargas el dato en los registros con Tclock y activas los 8 bit en los pines del pic
esperas con TLC y TLF.

Repites n veces esto hasta sincronizarlo que puedas verlo bien.
Luego cargas el siguiente dato y empiezas de nuevo.

Datos:
Invierte la logica del clock
Trabaja a 20Mhz
Y regula los tiempos
Avísame cualquier cosa yo igual voy a estar chequeando que otra cosa puede haber en el código saludoss


----------



## xcamotitox (Sep 22, 2013)

Me estoy iniciando en Programación P.B.P.
Necesito ayuda con la instrucción SELECT CASE, información más detallada que en los libros y ejemplos fáciles de entender.



Estoy Practicando con el libro de microcontroladores 16f628a y el pic16f877a.
También no puedo convertir la salida del puerto A, hago el ejemplo del libro y no funcionan algunas luces del puerto A, se mantiene encendido.
Todo en lenguaje PICBasic Pro.


----------



## reyvilla (Sep 22, 2013)

xcamotitox dijo:


> Me estoy iniciando en Programación P.B.P.
> Necesito ayuda con la instrucción SELECT CASE, información más detallada que en los libros y ejemplos fáciles de entender.
> 
> 
> ...



hola compañero si colocas tu código y un diagrama si es en proteus mejor, puedo ayudarte saudos


----------



## D@rkbytes (Sep 22, 2013)

xcamotitox dijo:


> Me estoy iniciando en Programación P.B.P.
> Necesito ayuda con la instrucción SELECT CASE, información más detallada que en los libros y ejemplos fáciles de entender.
> 
> 
> ...


Usa la opción de *Buscar en este Tema* o la *Búsqueda Avanzada* para encontrar posts que contengan ejemplos.
Te podría sugerir que uses el Manual de PicBasic Pro en Castellano, pero no aparece ayuda para *SELECT CASE*
Es que en realidad _es muy sencillo su uso_ y no deberías tener complicación para aplicarla.

En la ayuda de MicroCode Studio viene explicado el uso de *SELECT CASE*

Saludos.


----------



## ferdy575 (Sep 22, 2013)

reyvilla dijo:


> Hola de nuevo, revisando el codigo me doy cuenta que esta echo para una matrix de 8x8 por lo cual si tomas en cuenta que para una matriz de 24 puntos horizontales lo cuales vas a ir activando los led verticales según sea necesario para ir armando la imagen.



hermano muchas muchas gracias eres un mago, seguí tus instrucciones y funciono perfectamente pero no logro que el mensaje se desplace más rápido por fa dime como lo acelero


----------



## reyvilla (Sep 22, 2013)

ferdy575 disminuye el counter3 y el pauseus de lineV juega entre esos dos para que veas como va mas rápido.


----------



## Pull1988 (Sep 24, 2013)

Amigos buenas, tengo una pregunta que quisiera que me puedan ayudar, la verdad no se si estoy en el foro correcto, pido disculpas de antemano, si así fuese. Estaba realizando un proyecto y en el programa al compilarlo, me ha salido un error, el cual hace referencia que me he pasado de la o las paginas del pic (16F877A), e investigado y se que hay un registro llamado PCLATH; he leido ya mucha teoría referente a ese registro, pero no se como aplicarlo en el programa como tal. Por favor necesito su gran ayuda.


----------



## D@rkbytes (Sep 24, 2013)

Pull1988 dijo:


> Amigos buenas, tengo una pregunta que quisiera que me puedan ayudar, la verdad no se si estoy en el foro correcto, pido disculpas de antemano, si así fuese. Estaba realizando un proyecto y en el programa al compilarlo, me ha salido un error, el cual hace referencia que me he pasado de la o las paginas del pic (16F877A), e investigado y se que hay un registro llamado PCLATH; he leido ya mucha teoría referente a ese registro, pero no se como aplicarlo en el programa como tal. Por favor necesito su gran ayuda.


Con PICBasic Pro, no debes preocuparte por ese mensaje, es una advertencia del compilador cuando el programa es muy grande y  se ha cambiado de página, pero PBP se encarga de que todo marche bien.

En versiones del compilador PBP como la 2.60X no conozco forma de solucionar esta advertencia, pero en PBP3 si se puede suprimir usando *@ errorlevel    -306* para que el compilador no mande ese mensaje.

Saludos.


----------



## Pull1988 (Sep 25, 2013)

D@rkbytes dijo:


> Con PICBasic Pro, no debes preocuparte por ese mensaje, es una advertencia del compilador cuando el programa es muy grande y  se ha cambiado de página, pero PBP se encarga de que todo marche bien.
> 
> En versiones del compilador PBP como la 2.60X no conozco forma de solucionar esta advertencia, pero en PBP3 si se puede suprimir usando *@ errorlevel    -306* para que el compilador no mande ese mensaje.
> 
> Saludos.



Estimado amigo, muchas gracias por tu respuesta, pero la duda que tengo esque por este mensaje que sale al parecer no me deja modificar nada en el programa, ejem: si quiero agregar una nueva salida para que active un led, al momento de grabar en el pickit 2 no surge efecto, como digo al parecer no m deja hacer ninguna modificacion mientras aparezca este mensaje; con todo voy a probar con el fuse que me dejas para ver si por ahi es la solución.

saludos


----------



## reyvilla (Sep 25, 2013)

Pull1988 dijo:


> Estimado amigo, muchas gracias por tu respuesta, pero la duda que tengo esque por este mensaje que sale al parecer no me deja modificar nada en el programa, ejem: si quiero agregar una nueva salida para que active un led, al momento de grabar en el pickit 2 no surge efecto, como digo al parecer no m deja hacer ninguna modificacion mientras aparezca este mensaje; con todo voy a probar con el fuse que me dejas para ver si por ahi es la solución.
> 
> saludos



Hola pienso que lo mejor es una imagen del error un print pant, así poder ver el error exacto ya que a mi me ha dado el mismo error y lo e solucionado de diferentes formas abecés no me deja hacer nada y es por una variable o un registro mal configurado y otras no pasa nada, lo otro seria que colocaras el código para probarlo en otros pc haber si es cuestión de software...saludosss


----------



## xcamotitox (Sep 26, 2013)

Una  Sugerencia se deberia hacer un compilado de todos los proyectos con sus respectivos nombres y archivos rar.
Hacer una clase de Tutorial, hacerlo de acuerdo a la complejidad de los proyectos


----------



## erickp (Sep 27, 2013)

TECLADO 6X6 CON DISPLAY DE 7 SEGMENTOS Y SUMADOR

Hola buenas tardes:

Ojala me pudieran ayudar he realizado con exito, al menos en la simulacion, un teclado de 6x6 con dos display de 7 segmentos y ademas vaya sumando el valor de cada tecla.
El unico problema que tengo es que quisiera que en lugar de que los switches del teclado  fueran momentaneos, fueran permanentes , es decir, que si dejo presionado porejemplo la tecla 1 y despues sin soltar presiono la tecla 2, me de la suma de 3 sin necesidad de soltar la tecla 1.

Cabe mencionar que es para autoamizar un sistema de los juegos de canicas que existen en las ferias, donde la canica dejaria presionada cada tecla.
Anexo los archivos y agradeceria mucho su ayuda.

La distribucion y valor de lasteclas es el siguiente 

1 2 3 4 5 6
6 5 4 3 2 1
1 2 3 4 5 6
6 5 4 3 2 1
1 2 3 4 5 6
6 5 4 3 2 1


Saludos

codigo:


```
'****************************************************************
trisb = %00111111
trisc = 0
trisd = 0
portb = 0
portc = 0
portd = 0
cuenta var byte
cuentabcd var byte
nu var byte
nu1 var byte
nu2 var byte
nu3 var byte
nu4 var byte
nu5 var byte
nu6 var byte
nu7 var byte
nu8 var byte
nu9 var byte
nu10 var byte
nu11 var byte
nu12 var byte
nu13 var byte
nu14 var byte
nu15 var byte
nu16 var byte
nu17 var byte
nu18 var byte
nu19 var byte
nu20 var byte
nu21 var byte
nu22 var byte
nu23 var byte
nu24 var byte
nu25 var byte
nu26 var byte
nu27 var byte
nu28 var byte
nu29 var byte
nu30 var byte
nu31 var byte
nu32 var byte
nu33 var byte
nu34 var byte
nu35 var byte
nu36 var byte

                           

inicio:

'primera fila
portd = %00000001
if portb = %00000000 then nu = 0
if portb = %00000001 then nu1 = 1
if portb = %00000010 then nu2 = 2
if portb = %00000100 then nu3 = 3
if portb = %00001000 then nu4 = 4
if portb = %00010000 then nu5 = 5
if portb = %00100000 then nu6 = 6

pause 10
'segunda fila
portd = %00000010
if portb = %00000001 then nu7 = 6
if portb = %00000010 then nu8 = 5
if portb = %00000100 then nu9 = 4
if portb = %00001000 then nu10 = 3
if portb = %00010000 then nu11 = 2
if portb = %00100000 then nu12 = 1
pause 10
'tercera fila
portd = %00000100
if portb = %00000001 then nu13 = 1
if portb = %00000010 then nu14 = 2
if portb = %00000100 then nu15 = 3
if portb = %00001000 then nu16 = 4
if portb = %00010000 then nu17 = 5
if portb = %00100000 then nu18 = 6
pause 10
'cuarta fila
portd = %00001000
if portb = %00000001 then nu19 = 6
if portb = %00000010 then nu20 = 5
if portb = %00000100 then nu21 = 4
if portb = %00001000 then nu22 = 3
if portb = %00010000 then nu23 = 2
if portb = %00100000 then nu24 = 1
pause 10
'quinta fila
portd = %00010000
if portb = %00000001 then nu25 = 1
if portb = %00000010 then nu26 = 2
if portb = %00000100 then nu27 = 3
if portb = %00001000 then nu28 = 4
if portb = %00010000 then nu29 = 5
if portb = %00100000 then nu30 = 6
pause 10
'sexta fila
portd = %00100000
if portb = %00000001 then nu31 = 6
if portb = %00000010 then nu32 = 5
if portb = %00000100 then nu33 = 4
if portb = %00001000 then nu34 = 3
if portb = %00010000 then nu35 = 2
if portb = %00100000 then nu36 = 1
pause 10

cuenta = nu+nu1+nu2+nu3+nu4+nu5+nu6+nu7+nu8+nu9+nu10+nu11+nu12+nu13+nu14+nu15+nu16+nu17+nu18+nu19+nu20+nu21+nu22+nu23+nu24+nu25+nu26+nu27+nu28+nu29+nu30+nu31+nu32+nu33+nu34+nu35+nu36

cuentabcd = ((cuenta / 10) << 4) + (cuenta // 10)

portc = cuentabcd
```

Ya por ultimo me podrian dar la configuracion de este pic ya que al momento de programarlo en el MASTER PROG  me sale esta leyenda 
AVISO FALTAN LOS BITS DE CONFIGURACION EN EL ARCHIVO HEX


----------



## ferdy575 (Sep 28, 2013)

hola a todos 
de nuevo por aquí molestandoles a ver sí alguien me puede decir de donde me sale este mensaje en el programador es primera vez que me aparece y no logro hacer lo que me pide, reformando la configuración en el programa en el microcode tampoco hay cambio en el pickit, aquí les dejo 2 imágenes para que vean de que estoy hablando, les agradezco mucho su ayuda y su paciencia


----------



## D@rkbytes (Sep 28, 2013)

El formato para la palabra de configuración en el PIC16F88 es de esta forma...

;*******************************************************************************
@ DEVICE PIC16F88
@ DEVICE HS_OSC, WDT_OFF, PWRT_ON, MCLR_ON, BOD_OFF, LVP_OFF
@ DEVICE2 IESO_OFF, FCMEN_OFF
;*******************************************************************************
*DEFINE* OSC 20
;*******************************************************************************

Prueba incluyendo de esta forma la palabra de configuración en tu programa.

Saludos.


----------



## reyvilla (Sep 28, 2013)

La forma en que yo lo hago es copiando directamente del archivo .INC los fuses correspondientes al pic y luego lo voy modificando según sea lo que necesite. En este caso de la matrix yo lo coloque así.

@ DEVICE PIC16F88
@ DEVICE XT_OSC
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF       
@ DEVICE MCLR_OFF
@ DEVICE BOD_OFF
@ DEVICE LVP_OFF        
@ DEVICE CPD_OFF 
@ DEVICE WRT_OFF 
@ DEVICE DEBUG_OFF 
@ DEVICE CCPMX_OFF 
@ DEVICE PROTECT_OFF


----------



## D@rkbytes (Sep 29, 2013)

reyvilla dijo:


> La forma en que yo lo hago es copiando directamente del archivo .INC los fuses correspondientes al pic y luego lo voy modificando según sea lo que necesite. En este caso de la matrix yo lo coloque así.
> 
> @ DEVICE PIC16F88
> @ DEVICE XT_OSC
> ...


Este PIC tiene dos direcciones para la palabra de configuración*: 0x2007* y  *0x2008*
En la dirección *0x2007* (*CONFIG1*) se establecen los fuses que muestras, pero en *0x2008* se establecen estos otros:
CONFIG2:
*FCMEN* = Fail-Safe Clock Monitor Enable bit
*IESO* = Internal External Switchover bit

Solo se establecen los primeros 2 bits (0 y 1) de los 13 bits del registro *CONFIG2*.
Por eso _los incluí_ usando *@ DEVICE2*

No ocurrirá problema en nuestro programa si estos bits al no ser configurados quedan activos, mientras no falle el oscilador principal, pero si llegara a fallar se activaría el oscilador interno a la frecuencia que haya sido configurado en el registro *OSCCON* que por default será de 4MHz.
Y esto podría prestarse a confusiones sobre los tiempos de trabajo en el programa si se usa otra frecuencia.

Por aquí expuse unos ejemplos demostrando el _funcionamiento del sistema "Fail-Safe Clock Monitor"_

Saludos.


----------



## reyvilla (Sep 29, 2013)

Gracias por la información muy bueno ese dato, ya revise y efectivamente esta incluido un poco mas abajo en el archivo .INC del 16f88 algo nuevo que aprendí hoy muchas gracias.


----------



## ferdy575 (Sep 29, 2013)

D@rkbytes dijo:


> Este PIC tiene dos direcciones para la palabra de configuración*: 0x2007* y  *0x2008*
> En la dirección *0x2007* (*CONFIG1*) se establecen los fuses que muestras, pero en *0x2008* se establecen estos otros:
> CONFIG2:
> *FCMEN* = Fail-Safe Clock Monitor Enable bit
> ...



Hola Darkbytes gracias por tu ayuda esta muy interesante esta información te cuento que puse los fuses como dijiste y en efecto ya no me sale el mensaje de error en el pickit2, y se deja cargar bien en el pic pero no da señales de vida, no logro que el pic arranque, subo el código a ver sí le encuentras donde está el error en la simulación en proteus funciona bien pero en protoboard no hace nada, muchas gracias de antemano


----------



## D@rkbytes (Sep 29, 2013)

ferdy575 dijo:


> en la simulación en proteus funciona bien pero en protoboard no hace nada


Necesitas configurar el puerto A como digital I/O, ya que usas los pines RA2 y RA3.
Utiliza ANSEL = 0 al inicio del programa para que el puerto A sea configurado con entradas y salidas digitales.

Suerte.


----------



## reyvilla (Sep 29, 2013)

Compañero ferdy575 aun otra cosa se me olvido explicarte antes fue las configuraciones de los registros que controlar el hardware del microcontrolador, debes tomar en cuenta que el micro en si tiene una estructura interna que debes conoces bien asi como los fuses, también hay registros de control para los periféricos internos y externos del microcontrolador. En tu caso el micro tiene comparadores A/D y conversores A/D los cuales deben ser desactivados si no se van a utilizar de lo contrario van a estar activados. Estos registros normalmente son el CMCON y el ADCON0 y ADCON1 y ANSEL. 
Como no los vas a usar colócalos así:

CMCON   = 7 'desactiva modulo comparador
ADCON0  = 0 'desactiva modulos conversores
ADCON1  = 0 'controla modulos conversores
ANSEL     = 0 'configura todos los canales del A/D  a digitales

ADCON1 no influye si ADCON0 esta desactivado pero igual yo coloco todo a 0 para estar mas tranquilo con respecto a los módulos A/D.

Por otra parte e falto en los fuses 

@ DEVICE2 IESO_OFF, FCMEN_OFF

Espero sea la solución a tu problema y si funciona coloca unas imágenes a ver como quedo...saludos


----------



## ferdy575 (Sep 30, 2013)

D@rkbytes dijo:


> Necesitas configurar el puerto A como digital I/O, ya que usas los pines RA2 y RA3.
> Utiliza ANSEL = 0 al inicio del programa para que el puerto A sea configurado con entradas y salidas digitales.
> 
> Suerte.





reyvilla dijo:


> Compañero ferdy575 aun otra cosa se me olvido explicarte antes fue las configuraciones de los registros que controlar el hardware del microcontrolador, debes tomar en cuenta que el micro en si tiene una estructura interna que debes conoces bien asi como los fuses, también hay registros de control para los periféricos internos y externos del microcontrolador. En tu caso el micro tiene comparadores A/D y conversores A/D los cuales deben ser desactivados si no se van a utilizar de lo contrario van a estar activados. Estos registros normalmente son el CMCON y el ADCON0 y ADCON1 y ANSEL.
> Como no los vas a usar colócalos así:
> 
> CMCON   = 7 'desactiva modulo comparador
> ...


Señores los felicito y les agradezco su ayuda ustedes son unos monstruos para esta vaina segui sus consejos y funciona de maravilla nuevamente muchas gracias


----------



## reyvilla (Sep 30, 2013)

Buen día que bueno me alegro mucho por ti, recuerda compartir aunque sea una imagen de tu proyecto funcionando..saludosss


----------



## erickp (Oct 2, 2013)

Hola alguien que me pueda ayudarcon la palabra de onfiguracion de un pic 18f4520 aca les dejo los archivos del programa y la simulacion en proteus es una matriz 6x6 que va sumando.


----------



## D@rkbytes (Oct 2, 2013)

erickp dijo:


> Hola alguien que me pueda ayudarcon la palabra de onfiguracion de un pic 18f4520


Para establecer la palabra de configuración en ese PIC o en otros de la serie 18, tienes que hacer lo siguiente.

*1.-* Buscar dentro de la carpeta de instalación del compilador PBP, el archivo *18F4520.INC* y realizas una copia de seguridad de ese archivo, ya que tendrá que ser modificado.
2.- Para saber que fuses están disponibles para el PIC18F4520 se necesita el archivo *P18F4520.INC* que se encuentra en  la carpeta* MPASM Suite* en la carpeta de instalación de MPLAB.
Por defecto en: C:\Archivos de programa\Microchip\MPASM Suite
Dentro del archivo que será editado (18F4520.INC) está el siguiente código:

```
;****************************************************************
;*  18F4520.INC                                                 *
;*                                                              *
;*  By        : Leonard Zerman, Jeff Schmoyer                   *
;*  Notice    : Copyright (c) 2010 microEngineering Labs, Inc.  *
;*              All Rights Reserved                             *
;*  Date      : 05/21/10                                        *
;*  Version   : 2.60a                                           *
;*  Notes     :                                                 *
;****************************************************************
        NOLIST
    ifdef PM_USED
        LIST
        "Error: PM does not support this device.  Use MPASM."
        NOLIST
    else
        LIST
        LIST p = 18F4520, r = dec, w = -311, w = -230, f = inhx32
        INCLUDE "P18F4520.INC"   ; MPASM  Header
        __CONFIG    _CONFIG1H, _OSC_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
        __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
        __CONFIG    _CONFIG3H, _CCP2MX_PORTC_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H
        __CONFIG    _CONFIG4L,  _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L
        NOLIST
    endif
        LIST
EEPROM_START    EQU    0F00000h
BLOCK_SIZE    EQU    32
```
*5.-* El código que contiene ese archivo deberá ser modificado en la parte que contiene la palabra de configuración.
Por ejemplo, de esta forma:

```
NOLIST
    ifdef PM_USED
        LIST
        "Error: PM does not support this device.  Use MPASM."
        NOLIST
    else
        LIST
        LIST p = 18F4520, r = dec, w = -311, w = -230, f = inhx32
        INCLUDE "P18F4520.INC"   ; MPASM  Header
        [B]CONFIG OSC = XT, WDT = OFF, PWRT = ON, LVP = OFF, BOREN = OFF[/B]
        NOLIST
    endif
        LIST
EEPROM_START    EQU    0F00000h
BLOCK_SIZE    EQU    32
```
En este ejemplo utilicé la palabra de configuración que requiere tu programa, y puedes modificarla utilizando los fuses que se encuentran disponibles en el archivo *P18F4520.INC

Nota importante:*
Este tipo de palabra de configuración tiene que ser soportada por MPASM, por lo cual se tiene que tener actualizado MPLAB ya que en el archivo *P18F4520.INC *se menciona lo siguiente...
*;   IMPORTANT: For the PIC18 devices, the __CONFIG directive has been
;              superseded by the CONFIG directive. *
*Traducción:*
IMPORTANTE: Para los dispositivos PIC18, la directiva __ CONFIG ha sido sustituida por la directiva CONFIG.
​De esta forma es como he agregado la nueva palabra de configuración al archivo de PBP, *18F4520.INC
*
Teniendo este detalle en cuenta, no debes tener problema para compilar tu programa con la palabra de configuración.

Suerte.


----------



## technique (Oct 10, 2013)

Hola amigos de los pic:
Estoy intentando hacer un timer regulable (con pot) con el pic12f675 por ser pequeño, he buscado informacion pero solo hay en lenguaje C, y la verdad soy nuevo con esto de los pic, todavia no comprendo como usar el ADC, si alguien me ayuda por favor. El proyecto es para encender 2 luces exteriores, cuando se presiona un pulsador se encienden las dos y luego la una se apaga en 1 min aprox y la otra se apaga en 5min aprox. Lo tengo hecho con tiempos fijos, con pauses y next for, pero me gustaria hacerlo regulable para no estar retirando el pic cada rato para probar un nuevo tiempo. Por cierto estoy practicando con basic. Gracias por su ayuda.


----------



## 13Avallejo82 (Oct 14, 2013)

Hola LaElectronicaMeOdia, muchas gracias por tu valioso aporte, agradecería mucho me puedas ayudar con una duda que tengo, he bajado tu código y al inicio del programa CyberCtrl.pbp tienes algunas declaraciones que van precedidas de un símbolo aroba @, es necesario poner eso?; porque yo estoy realizando un programa con un PIC18F2550 al cual he conectado 18 LED en los puertos desde el A1 al B7; todo me funciona perfecto y puedo encender y apagar los LEDs desde la PC usando VB.NET 2010 sin uysar esas declaraciones; pero al aumente una parte de código para que una vez encienda el puerto usando DoUSBOut yo lea el puerto que acabo de encender y lo mando hacia la compu la cual me lee si es (1) ó (0) y me da un mensaje de que se encendió correctamente o no; pero al incrementar eso el programa empieza a colgarse y para encender cada led debo esperar entre 3 segundos o 4 no puedo encenderlos de manera seguida porque el PIC deja de funcionar; y en otras ocaciones asi espere ese tiempo ya no responde el PIC, espero ser claro en mi pregunta y gracias de antemano





LaElectronicaMeOdia dijo:


> Hola Torres, me sirvio mucho tu consejo para cambiar la forma de como estaba viendo el flujo del USBIN, y efectivamente se queda "esperando" el valor.
> 
> pongo el diagrama de flujo por si a alguien le sirve.
> 
> ...




Hola LaElectronicaMeOdia, muchas gracias por tu valioso aporte, agradecería mucho me puedas ayudar con una duda que tengo, he bajado tu código y al inicio del programa CyberCtrl.pbp tienes algunas declaraciones que van precedidas de un símbolo aroba @, es necesario poner eso?; porque yo estoy realizando un programa con un PIC18F2550 al cual he conectado 18 LED en los puertos desde el A1 al B7; todo me funciona perfecto y puedo encender y apagar los LEDs desde la PC usando VB.NET 2010 sin uysar esas declaraciones; pero al aumente una parte de código para que una vez encienda el puerto usando DoUSBOut yo lea el puerto que acabo de encender y lo mando hacia la compu la cual me lee si es (1) ó (0) y me da un mensaje de que se encendió correctamente o no; pero al incrementar eso el programa empieza a colgarse y para encender cada led debo esperar entre 3 segundos o 4 no puedo encenderlos de manera seguida porque el PIC deja de funcionar; y en otras ocaciones asi espere ese tiempo ya no responde el PIC, espero ser claro en mi pregunta y gracias de antemano


----------



## erickp (Oct 14, 2013)

Hola amigo D@rkbytes
Agradezco mucho tu ayuda hice lo que me dijiste y le meti el codigo para mi programa como tu me lo escribiste y todo funcionaba bien excepto que el no leia el portb, como te comentaba desconozco lo referente a editar la palabra de configuracion y no se el significado de los fuses quisiera aprender mas de esto si pudieras decirme o recomendarme donde aprender mas de esto te lo agradeceria.
Al ver que mi puerto b no lo leia me meti al archivo que me mencionaste y comence a leer un poco y por un golpe de suerte me encontre con la instruccion de PBADEN = OFF  PORTB<4:0> pins are configured as digital I/O on Reset, y decidi agregarsela al programa que tu me enviaste y pum funciono mi programa al menos en la simulacion en proteus, espero que funcione fisicamente. Nuevamente te agradezco y pongo como quedo el programa. Saludos y espero me recomiendes donde aprender mas de esto.
Saludos

```
;****************************************************************
;*  18F4520.INC                                                 *
;*                                                              *
;*  By        : Leonard Zerman, Jeff Schmoyer                   *
;*  Notice    : Copyright (c) 2010 microEngineering Labs, Inc.  *
;*              All Rights Reserved                             *
;*  Date      : 05/21/10                                        *
;*  Version   : 2.60a                                           *
;*  Notes     :                                                 *
;****************************************************************
                    NOLIST
    ifdef PM_USED
        LIST
        "Error: PM does not support this device.  Use MPASM."
        NOLIST
    else
        LIST
        LIST p = 18F4520, r = dec, w = -311, w = -230, f = inhx32
        INCLUDE "P18F4520.INC"   ; MPASM  Header
        CONFIG OSC = XT, WDT = OFF, PWRT = ON, MCLRE = ON, PBADEN = OFF, LVP = OFF, BOREN = OFF
        NOLIST
    endif
        LIST
EEPROM_START    EQU    0F00000h
BLOCK_SIZE    EQU    32
```



D@rkbytes dijo:


> Para establecer la palabra de configuración en ese PIC o en otros de la serie 18, tienes que hacer lo siguiente.
> 
> *1.-* Buscar dentro de la carpeta de instalación del compilador PBP, el archivo *18F4520.INC* y realizas una copia de seguridad de ese archivo, ya que tendrá que ser modificado.
> 2.- Para saber que fuses están disponibles para el PIC18F4520 se necesita el archivo *P18F4520.INC* que se encuentra en  la carpeta* MPASM Suite* en la carpeta de instalación de MPLAB.
> ...


----------



## D@rkbytes (Oct 14, 2013)

erickp dijo:


> Hola amigo D@rkbytes
> Agradezco mucho tu ayuda hice lo que me dijiste y le metí el código para mi programa como tu me lo escribiste y todo funcionaba bien excepto que el no leía el portb, como te comentaba desconozco lo referente a editar la palabra de configuración y no se el significado de los fuses quisiera aprender mas de esto si pudieras decirme o recomendarme donde aprender mas de esto te lo agradecería.
> Al ver que mi puerto b no lo leía me metí al archivo que me mencionaste y comencé a leer un poco y por un golpe de suerte me encontré con la instrucción de PBADEN = OFF  PORTB<4:0> pins are configured as digital I/O on Reset, y decidí agregársela al programa que tu me enviaste y pum funciono mi programa al menos en la simulación en proteus, espero que funcione físicamente. Nuevamente te agradezco y pongo como quedo el programa. Saludos y espero me recomiendes donde aprender mas de esto.
> Saludos


Lo ves, no es tan complicado modificar el archivo con la palabra de configuración que requiera tu programa.
Tan solo tienes que ver para que sirve cada fuse y determinar si lo necesitas activar o no.

En cuanto a aprender más acerca de la palabra de configuración, hay poca información al respecto,
ya que son muchos tipos de PIC los que hay, y varían los nombres que se usan en la palabra de configuración.
El mejor archivo con la explicación es precisamente el que te mencioné, ahí vienen explicados.
En esa carpeta encontrarás los archivos correspondientes *.INC con mucha información del PIC en cuestión.

Saludos.


----------



## erickp (Oct 31, 2013)

Hola quiero hacer una suma de variables, quisiera saber si alguien me puede ayudar para simplificar el codigo lo intente con FOR NEXT pero no me quedo en que estare equivocandome
Lo hice asi:


```
cuenta = nu[0]+nu[1]+nu[2]+nu[3]+nu[4]+nu[5]+nu[6]+nu[7]+nu[8]+nu[9]+nu[10]+nu[11]+nu[12]+nu[13]+nu[14]+nu[15]
```

aca esta mi codigo completo.


```
CLEAR
trisb = %00111111
trisc = 0
trisd = 0

portb = 0
portc = 0
portd = 0
cuenta var byte
cuentabcd var byte
nu var byte [36]


                           

inicio:

'primera fila
portd = %00000001
if portb = %00000000 then nu[0] = 0
if portb = %00000001 then nu[1] = 1
if portb = %00000010 then nu[2] = 2
if portb = %00000100 then nu[3] = 3
if portb = %00001000 then nu[4] = 4
if portb = %00010000 then nu[5] = 5
if portb = %00100000 then nu[6] = 6
pause 10
'segunda fila
portd = %00000010
if portb = %00000001 then nu[7] = 6
if portb = %00000010 then nu[8] = 5
if portb = %00000100 then nu[9] = 4
if portb = %00001000 then nu[10] = 3
if portb = %00010000 then nu[11] = 2
if portb = %00100000 then nu[12] = 1
pause 10
'tercera fila
portd = %00000100
if portb = %00000001 then nu[13] = 1
if portb = %00000010 then nu[14] = 2
if portb = %00000100 then nu[15] = 3
if portb = %00001000 then nu[16] = 4
if portb = %00010000 then nu[17] = 5
if portb = %00100000 then nu[18] = 6
pause 10
'cuarta fila
portd = %00001000
if portb = %00000001 then nu[19] = 6
if portb = %00000010 then nu[20] = 5
if portb = %00000100 then nu[21] = 4
if portb = %00001000 then nu[22] = 3
if portb = %00010000 then nu[23] = 2
if portb = %00100000 then nu[24] = 1
pause 10
'quinta fila
portd = %00010000
if portb = %00000001 then nu[25] = 1
if portb = %00000010 then nu[26] = 2
if portb = %00000100 then nu[27] = 3
if portb = %00001000 then nu[28] = 4
if portb = %00010000 then nu[29] = 5
if portb = %00100000 then nu[30] = 6
pause 10
'sexta fila
portd = %00100000
if portb = %00000001 then nu[31] = 6
if portb = %00000010 then nu[32] = 5
if portb = %00000100 then nu[33] = 4
if portb = %00001000 then nu[34] = 3
if portb = %00010000 then nu[35] = 2
if portb = %00100000 then nu[36] = 1
pause 10


cuenta = nu[0]+nu[1]+nu[2]+nu[3]+nu[4]+nu[5]+nu[6]+nu[7]+nu[8]+nu[9]+nu[10]+nu[11]+nu[12]+nu[13]+nu[14]+nu[15]+nu[16]+nu[17]+nu[18]+nu[19]+nu[20]+nu[21]+nu[22]+nu[23]+nu[24]+nu[25]+nu[26]+nu[27]+nu[28]+nu[29]+nu[30]+nu[31]+nu[32]+nu[33]+nu[34]+nu[35]+nu[36]

cuentabcd = ((cuenta / 10) << 4) + (cuenta // 10)
portc = cuentabcd


goto inicio
```

Saludos


----------



## xmagdielx (Nov 1, 2013)

Saludos erickp, si pudieses colocar el archivo de la simulacion para buscar una solucion, y ver en que te podemos ayudar seria bueno.! Saludos!


----------



## erickp (Nov 1, 2013)

xmagdielx dijo:


> Saludos erickp, si pudieses colocar el archivo de la simulacion para buscar una solucion, y ver en que te podemos ayudar seria bueno.! Saludos!




Hola te nvio las archivos que me pides, cabe señalar que el codigo si funciona, solo quiero depurar esa parte, ya que soy novato en programacion, agradezco tu interes. saludos


----------



## erickp (Nov 2, 2013)

Hola. A ver si alguien me puede ayudar.
Hice el siguiente código y lo simule en proteus, pero al ponerle 4 mhz en la frecuencia del microcrontrolador, me sale un error de que ADC conversión clock está mal.
El otro problema es. ¿Por qué en la simulación se ven así los displays?
No lo he llevado a cabo a la practica. ¿Me sucederá lo mismo?
Saludos y gracias.


----------



## D@rkbytes (Nov 4, 2013)

erickp dijo:


> al ponerle 4 mhz en la frecuencia del microcrontrolador, me sale un error de que ADC conversión clock está mal.


Eso se debe al utilizar las configuraciones que usa PICBasic Pro en las Definiciones.
No en todos los PIC establece los parámetros adecuados para el conversor analógico.
Por eso es recomendable hacer un debug del programa para ver los valores de los registros en Watch Window


erickp dijo:


> El otro problema es. ¿Por qué en la simulación se ven así los displays?


En la simulación muchas veces debido a la velocidad de conmutación los displays no funcionan bien.
Existen algunos trucos por software y por hardware para disminuir el parpadeo durante la simulación, pero luego al montar el circuito físicamente se tienen que eliminar para que el circuito funcione correctamente.


erickp dijo:


> No lo he llevado a cabo a la practica. ¿Me sucederá lo mismo?


Muy probablemente, ya que en tu código estás utilizando retardos de 10Ms después de cada lectura.
Eso hará que el parpadeo de los displays sea muy notorio, porque estás realizando 6 lecturas.

Te recomiendo que antes de programar un PIC, leas bien sobre los registros con los que vas trabajar.
Así tendrás mayor información sobre lo que tienes que configurar y sabrás mejor lo que estás haciendo.

Adjunto tu programa y simulación funcionando, y si llegas a tener problemas al compilar el programa, puede ser porque agregué la palabra de configuración para usar el oscilador interno que es como lo necesitas en tu proyecto.
Y vi que compilaste tu programa con MPASM y eso te puede causar problemas al compilar.
Cómo es un PIC16 no selecciones utilizar compilar con MPASM y no debes tener problemas.

Notas:
Realicé varios cambios tanto al diseño de simulación como al programa y están comentados.
Al montar el proyecto físicamente,  puedes realizar algunas pruebas con los valores de los retardos de conmutación hasta encontrar la mejor respuesta visual en los displays de 7 segmentos.

No tengo ese PIC, por lo tanto, lograr que funcione físicamente, ya corre por tu cuenta. 

Suerte.


----------



## erickp (Nov 4, 2013)

D@rkbytes dijo:


> Eso se debe al utilizar las configuraciones que usa PICBasic Pro en las Definiciones.
> No en todos los PIC establece los parámetros adecuados para el conversor analógico.
> Por eso es recomendable hacer un debug del programa para ver los valores de los registros en Watch Window
> 
> ...



Hola D@rkbytes:

Como siempre una felicitacion y reconocimento por tu gran ayuda. Te comento que mi pc tiene el  windows 7 de 64 bits y por lo que yo se, no puedo compilar si no es con MPASM, ¿habra alguna solucion o necesito definitivamente una maquina de 32 bits?
Saludos y nuevamente gracias por tu gran ayuda a nosotros los novatos.

atte
erickp


----------



## D@rkbytes (Nov 4, 2013)

erickp dijo:


> Te comento que mi pc tiene el  windows 7 de 64 bits y por lo que yo sé, no puedo compilar si no es con MPASM, ¿Habrá alguna solución o necesito definitivamente una maquina de 32 bits?


Lo que puedes hacer es realizar el mismo procedimiento que mencioné en el _post #2733_ para modificar la palabra de configuración en el archivo 16F677.INC y así seguir compilando con MPASM.

En la parte de configuración de fuses lo dejas de esta forma:

```
NOLIST
    ifdef PM_USED
        LIST
        include 'M16F6xx.INC'    ; PM header
        device  pic16F677, intrc_osc_noclkout, wdt_on, mclr_on, protect_off
        XALL
        NOLIST
    else
        LIST
        LIST p = 16F677, r = dec, w = -302
        INCLUDE "P16F677.INC"    ; MPASM  Header
       [B] __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _BOREN_OFF & _IESO_OFF & _FCMEN_OFF[/B]

        NOLIST
    endif
        LIST
```



erickp dijo:


> Como siempre una felicitación y reconocimiento por tu gran ayuda.
> Saludos y nuevamente gracias por tu gran ayuda a nosotros los novatos.
> 
> Atte.
> erickp


De nada erickp, y en lo que te podamos ayudar, cuenta con  ello.

Suerte.


----------



## juanc08 (Nov 5, 2013)

D@rkbytes dijo:


> Tu código contiene varios errores, sobre todo en el control de la interrupción por cambio de estado RB4-RB7
> Ya los corregí, y ahora al presionar el botón de tiempo extra, se reinicia el conteo a 29.
> 
> Suerte.
> ...


Suerte.
Buenas tardes amigo D@rkbytes. Gracias por este circuito.
Me tome el atrevimiento y lo monte en PROTEUS con un 16F628A y 3 displays.
Con un poco más de exactitud en el tiempo con respecto al reloj de PROTEUS en el ejemplo.
Arranca desde 180 y el reloj marca 3 minutos cuando llega a  000 el timer.
Adjunto carpeta con archivos y sigo en el proceso de poder programarlo con pulsadores.
Cualquier ayuda será bien recibida.


----------



## D@rkbytes (Nov 6, 2013)

juanc08 dijo:


> Suerte.
> Buenas tardes amigo D@rkbytes. Gracias por este circuito.
> Me tome el atrevimiento y lo monte en PROTEUS con un 16F628A y 3 displays.
> Con un poco más de exactitud en el tiempo con respecto al reloj de PROTEUS en el ejemplo.
> ...


Si lo que quieres es hacer un contador programable, es mejor que realices otro código.
Ese no está diseñado para eso y tardarás más en modificar el código que en hacer un nuevo programa.

Saludos.


----------



## helbertc (Nov 10, 2013)

viggiani1975 dijo:


> Pues no sé si serán los módulos rf los que presenten problema (FSI000A-CDR03A), hasta ahora los veo funcionando bien y como te comenté anteriormente, cuando programo para un solo pin parece funcionar bien por lo que creo que el problema no es tan trivial como parece.  Voy a probar con un solo pin durante todo el día a ver si se mantiene y lo estoy comentando aquí nuevamente esta noche, de lo contrario, pues me tocaría desechar la idea del bloqueo con rf y pensarlo con teclado directamente en la moto para mayor seguridad.
> 
> Gracias.



Hola compañero, soy nuevo en cuestiones de módulos RF y tengo receptor y emisor como los suyos, la verdad no se como los puedo hacer funcionar y ya he buscado en google pero no hay mucha información para ellos podrías darme una mano con algo de info para este módulo?


----------



## Oskaring (Nov 14, 2013)

Pues eso, que gracias a todos ustedes y sin conocimientos de electrónica, pude armarme un controlador que me regula la temperatura del agua (frío y calor) con simulación de amanecer-anochecer por Hwpm y , mediante el motor de una unidad de Cd rota con un tornillo sinfin  metida en un bote de comida para peces, les dá de comer 3 veces al día programables. Gracias en particular a reyvilla, por atender a mis cuestiones sobre el módulo CCP.

     A quien le pueda interesar le dejo el hex, el archivo pbp y la simulacíon en proteus ( todo un poco caótico y todavía muy mejorable ,pero yo lo tengo funcionando y vá de mil amores ).

    Comentar que todo el programa lo hice sobre la base del termostato y el reloj rtc del libro de Carlos A. Reyes y que en la simulación falta un pulsador cuya única función es encender y apagar la luz del Lcd


----------



## nieves (Nov 18, 2013)

holas una consulta.
Estoy haciendo un proyecto q es mensaje a celular usando un sim900 y el pic 16f873 
El sim fundiona con comandos at en el cual no tengo problema alguno, el problema es en el pic cuando hago el programa en pic basic 
el programa es:

CONEC VAR BYTE

TESTEO:   
SEROUT PORTC.6,N9600,["AT"]       
SERIN PORTC.7,N9600,CONEC        ;ALMACENADO EN CONEC
IF CONEC ="OK"  THEN PASO2 ; COMPARACION SI ESTA OK VA A OTRA FUNC
GOTO TESTEO

El error radica en que en el momento de comparar if CONEC ="OK" me da error
pregunta :cuando yo le envio AT al sim me responde "OK"¿como ago que CONEC me almacen esos dos caracteres?¿como puedo hacer la comparacion en if?
os agradecere en el alma si alguien me ayuda


----------



## LaElectronicaMeOdia (Nov 18, 2013)

> ¿como ago que CONEC me almacen esos dos caracteres?¿como puedo hacer la comparacion en if?


en lugar de la sentencia if-then utiliza la funcion serin2 y WAITSTR ArrayVar{\n}


----------



## nieves (Nov 19, 2013)

perdon pero no entiendo como usar el serin2 ni el CONEC VAR BIT me podrias darun ejemplo por favor


----------



## ricbevi (Nov 19, 2013)

nieves dijo:


> holas una consulta.
> Estoy haciendo un proyecto q es mensaje a celular usando un sim900 y el pic 16f873
> El sim fundiona con comandos at en el cual no tengo problema alguno, el problema es en el pic cuando hago el programa en pic basic
> el programa es:
> ...



Hola...Debes leer la ayuda(Help) del PBP en el que explica el alcance y la forma de usar del comando SERIN2 y la forma de "esperar" una cadena. De todas formas NUNCA una variable del tipo BYTE(0-255) como tienes definido a CONEC puede almacenar una cadena de caracteres pero si el valor numérico de uno solo a la vez( o la "O(79)" o "o(111)" o la "K(75)" o la "k(107)"). 
Saludos.

Ric.


----------



## reyvilla (Nov 20, 2013)

Hola compañeros de nuevo por acá con mis curiosidades, estuve hace un tiempo experimentando con el modulo PWM del PIC16F877A y me fue muy bien probando lo con un led variando su intensidad. En su momento me entero que la minima frecuencia a 20MHZ es de  1.22khz y a 4mhz es de 245hz lo cual es mucho para controlar un motor dc. A mi parecer esto es por la capacidad en si del microcontrolador ya que no es practico si se quiere independizar del manejo, a esto me refiero poder mantener un motor a una velocidad a través del PWM y poder hacer otras cosas sin tener que depender del una interrupción adicional para el control del motor. Esto ya que la única forma de poder bajar esa frecuencia es con un contador a través del timer1. Entonces llego a una conclusión que es preferible manejar un pwm directo por interrupción que el físico del microcontrolador ya que seria como mas eficiente el manejo del mismo y menos complicado que usando el modulo PWM propio del micro ya que no dependería de dos pines si no que podría aplicarlo a cualquier pin I/O. 
Me gustaría saber sus opiniones y análisis al respecto.
A ustedes que les parece mejor...?


----------



## LaElectronicaMeOdia (Nov 20, 2013)

> A ustedes que les parece mejor...?


yo diria que depende del proyecto, la ventaja de utilizar el PWM del modulo del Pic es que trabaja en segundo plano, mientras que si es por codigo no.

con respecto al numero de pines, pues hay pics con varios modulos(PWM)

p.d.espero haber entendido bien tu planteamiento.


----------



## reyvilla (Nov 20, 2013)

Exacto eso es lo que venden del micro y lo que entusiasma a utilizar el modulo PWM que es independiente de las otras ejecuciones del código, pero limitado y esa limitación te obliga a utilizar una subrutina adicional para poder utilizarlo en un motor y por lo tanto ya allí ya pierdes ese aspecto de independiente. Es útil al 100% para situaciones en las cuales manejes frecuencias mayores a 245hz de lo contrario para frecuencias de 50hz por ejemplo no lo veo muy eficaz por lo de la subrutina, en ese caso creo que es preferible hacer una rutina por interrupción y ya.


----------



## xmagdielx (Nov 29, 2013)

Saludos reyvilla, leyendo tu pregunta (espero haber entendido bien) concuerdo con el amigo LaElectronicaMeodia, eso dependeria de tu proyecto, de la complejidad, o mas bien que tan grande con respecto a circuiteria quisieras hacerlo. Pero alguna vez en un proyecto utilice divisores de frecuencia, quizas podriar utilizar cualquiera de estos circuitos (existen muchos) para dividir tu frecuencia minima "245" y asi poder tener un rango mas amplio. De todas formas comenta por aqui cualquier cosa, o si lo haces de otra forma tambien podria interesarle a otros miembros del foro.
Saludos y Suerte!


----------



## gabriel7747 (Nov 30, 2013)

kiyero dijo:


> Hola Volthor, probé el que me enviaste, pero al compilarlo me dá un error, (igual genera el archivo hex), lo simulo en proteus y se queda en el primer efecto, aún cuando vuelvo a presionar el pulsador, adjunto el .pbp y el .dsn, para que por favor lo observes (no sé si tal vez mi simulador está mal configurado), gracias, seguimos en contacto



amigo, el problema que tienes es que esta mal definido el watchdog (wdt) si eliminas o colocas como corresponde la linea, compila sin problema, saludos


----------



## carlos jara (Dic 4, 2013)

Amigos como puedo capturar las señales de cualquier control remoto sony para usarlo como pulsadores para activar relays con picbasic


----------



## LaElectronicaMeOdia (Dic 4, 2013)

carlos jara dijo:


> Amigos como puedo capturar las señales de cualquier control remoto sony para usarlo como pulsadores para activar relays con picbasic



yo hice un codigo en C para el Samsung y philips pero supongo que segun esta ficha es lo mismo para el sony, por interrupcion externa y un timer haces la medicion del tiempo de los pulsos y decodificas.


----------



## carlos jara (Dic 6, 2013)

Gracias amigo por tu pdf


----------



## cesarim (Dic 6, 2013)

Amigos, necesito de su gran ayuda.

Tengo este código. ¿Me podrían ayudar? Está en pic basic.
¿Cómo puedo hacer una rutina de tiempo para cada pulsador?
Oséa que si presiono 5 segundos pulsador1, led1 encienda 30 minutos, si presiono 7 segundos pulsador 1,
el led1 se quede encendido 1 hora y si presiono 2 segundos pulsador1 que el led1 se apague solo al cumplirse un minuto.

Ojala me puedan ayudar. Muchas gracias por su aporte.


----------



## cesarim (Dic 8, 2013)

Amigos del foro logre implementar algo pero aun me falta anexo todo el circuito con el codigo que he podido avanzar espero me puedan ayudar lo incomodo es que no tengo internet en casa y no me dejan instalar  ni el proteus ni el microcode en cabina alquilada jejeje espero su ayuda amigos

la idea es que pueda darle diferentes tiempos presionando el mismo pulsador
ejemplo;
* PRIMER TIEMPO mantengo presionado botón por un mediosegundo y activa led_1 por 10 segundos si vuelvo a presionar el boton  dentro de los 10 segundos le ordenare que se apague led_1 y si no es presionado el boton se apagara después de los 10 segundos automáticamente.

* SEGUNDO TIEMPO mantengo presionado botón por 2 segundos y activa led_1 por 1 minuto si dentro del minuto se vuelve a presionar el boton led_1 se apagara y si no es presionado el boton cumple el tiempo del minuto y el led_1 se apaga automaticamente.

* TERCER TIEMPO mantengo presionado el boton por 5 segundos y se activa led_1 por un tiempo de 2 horas si dentro de este tiempo de 2 horas se vuelve a presionar el boton led_1 se apaga y si no se presiona el boton led_1 se apagara automaticamente cuando se cumpla el tiempo adecuado  amigo por favor he avanzado un poco del codigo pero aun no logro dar con el codigo o con la forma adecuada de hacer por favor es`pero me puedan ayudar con sus conocimientos.
Este es el codigo 

```
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_CLKOUT    
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF            
@ DEVICE LVP_OFF               
@ DEVICE CPD_ON             
@ DEVICE PROTECT_ON 
       
DEFINE OSC 4 

CMCON = 7

TRISB = %00000000 
TRISA = %11110000 
PORTA = %00000000
PORTB = %00000000

TLED1       VAR word  
TLED2       VAR word
TLED3       VAR WORD

MinutO      var byte   
Segundo     Var Byte     
MAS_TIEMPO  VAR BYTE
INITIO      VAR BYTE
I           var byte

FLAG0       VAR BIT
FLAG1       VAR BIT
FLAG2       VAR BIT


;******POTENCIA******///////****** 
LED         var PORTB.0  
LED_1       VAR PORTB.1 
LED_2       VAR PORTB.2 
LED_3       VAR PORTB.3
Trbuz       VAR PORTB.7
;********************///////******

;******PULSADORES****///////******                   
BOTON       VAR PortA.7 
BOTON1      VAR PortA.6
BOTON2      VAR PortA.4
;********************///////******


;gosub beeps
;pause 1000

OPTION_REG = %10000101
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

FLAG0=0
FLAG1=0
flag2=0
i=0

 INICIO:
   
     if boton then    ;como implementar los tiempos adecuadamente??????
      repeat
       pause 10
        i = i + 1      
      until not boton           
     if i =< 50 then         
       toggle led_1    
       toggle flag0    
       TLED1=0         
      else      
    if i=< 150 then 
     high led_1    
      high flag1    
       TLED2=0
     else
       toggle led_1   
       flag0=0
       flag1=0
       tled1=0
       tled2=0
      endif
     endif
    endif
   pause 10
     
GOTO INICIO

    DISABLE            
MI_INTERRUPCION: 
    MAS_TIEMPO = MAS_TIEMPO + 1
    IF MAS_TIEMPO => 61 THEN
    MAS_TIEMPO = 0
    TOGGLE LED
    if FLAG0 THEN 
    TLED1 = TLED1 + 1
    ENDIF
    IF FLAG1 THEN
    TLED2= TLED2 + 1
    ENDIF
    IF FLAG2=1 THEN
    TLED3= TLED3 + 1
    ENDIF

    IF LED_1 = 1 and TLED1 = 10 THEN  ; 10 segundos 
    flag0=0
    LED_1=0
    TLED1=0
    i=0
    ENDIF
    
    IF LED_1 = 1 and TLED2 = 60 tHEN ; 1 minuto ===> 60 segundos
    LED_1=0 
    FLAG1=0
    TLED2=0 
    i =0  
    endif
    ENDIF

    IF LED_1 = 1 and TLED3 = 7200 tHEN ; 2 horas ===> 7200 segundos
    LED_1=0 
    FLAG2=0
    TLED3=0 
    i =0  
    endif
    ENDIF
    
    INTCON = %10100000 
    Resume
    Enable
    END
```

Si quisiera que tenga un sonido buzzer para que me avise cuando active el tiempo de  1 minuto por decir bip bip tiempo de 
for I = 0 to 1
high buzzer
pause 80 
low buzzer
pause 80
next I
y cuando se cumpla el minuto vuelva a sonar bip bip afectaria esto en la rutina del conteo por interrupcion osea afectaria en algo. Ya que estuve haciendo pruebas y cuando le puse el buzzer se retrazaba un poco en contar los segundos o mejor dicho no eran exactos los segundos


----------



## carlos jara (Dic 9, 2013)

mira estuve probando tu codigo agregue un par de lineas pero no trabaja no logro hallar la forma adecuada  esperemos que  puedan ayudar los amigos del foro o amigos moradores
lo estuve probando con segundos en cada tiempo

```
INICIO:
   
     if boton then    
      repeat
       pause 10
        i = i + 1     
      until not boton           
     if i =< 30 then      
       high led_1    
       high flag0    
       TLED1=0         
      elseif 
        gosub Time1 
      ELSE   
    if i=< 150 then 
     high led_1  
      high flag1    
       TLED2=0
     else
      gosub Time1
      endif
     endif
    endif
   pause 10
     
GOTO INICIO

    DISABLE            
MI_INTERRUPCION: 
    MAS_TIEMPO = MAS_TIEMPO + 1
    IF MAS_TIEMPO => 61 THEN
    MAS_TIEMPO = 0
    TOGGLE LED
    if FLAG0 THEN 
    TLED1 = TLED1 + 1
    ENDIF
    IF FLAG1 THEN
    TLED2= TLED2 + 1
    ENDIF

    IF LED_1 = 1 and TLED1 = 8 THEN  ; 
    flag0=0
    LED_1=0
    TLED1=0
    i=0
    ENDIF
    
    IF LED_1 = 1 and TLED2 = 12 tHEN ; 
    LED_1=0 
    FLAG1=0
    TLED2=0 
    i =0  
    endif
    ENDIF
    
    INTCON = %10100000 
    Resume
    Enable
    
    Time1:
       toggle led_1  
       flag0=0
       flag1=0
       tled1=0
       tled2=0
    goto INICIO   
 END
```


----------



## rrc46 (Dic 9, 2013)

carlos jara dijo:


> mira estuve probando tu codigo agregue un par de lineas pero no trabaja no logro hallar la forma adecuada  esperemos que  puedan ayudar los amigos del foro o amigos moradores
> lo estuve probando con segundos en cada tiempo
> 
> ```
> ...



Una pregunta en la instrucción Pause, el período es en milisegundos, según comentas quieres controlar medio segundo, por qué se pregunta por =< 50 ¿no debería ser => 500?


----------



## cesarim (Dic 9, 2013)

al ponerle PAUSE 10 estoy dando un tiempo de 10 ms por el tiempo de presionado del boton que es de 50 ms seria 500 msg o talvez me estoy confundiendo si podrian orientarme por favor  les agradecederia inmensamente


> Una pregunta en la instrucción Pause, el período es en milisegundos, según comentas quieres controlar medio segundo, por qué se pregunta por =< 50 ¿no debería ser => 500?


----------



## D@rkbytes (Dic 10, 2013)

cesarim dijo:


> la idea es que pueda darle diferentes tiempos presionando el mismo pulsador
> ejemplo;
> * PRIMER TIEMPO mantengo presionado botón por un medio segundo y activa led_1 por 10 segundos si vuelvo a presionar el botón  dentro de los 10 segundos le ordenare que se apague led_1 y si no es presionado el botón se apagara después de los 10 segundos automáticamente.
> 
> ...


Mira el programa que adjunto, tal vez te pueda servir como orientación para hacer lo que requieres.
No se utiliza un solo botón para determinar los periodos de retardo, pues eso puede ser muy complicado.
Se utiliza la interrupción por cambio de estado en los pines RB4 a RB7 para determinar que periodo establecer.
El programa cuenta con una rutina para periodos largos de tiempo que puedes utilizar en tu programa.

Como en todas las rutinas de retardo, una vez que el programa entra a la rutina, ya no sale hasta que se cumpla el tiempo establecido.
Por lo tanto el programa principal será retomado hasta que se cumpla la condición y retorne.

Si se puede apagar el LED presionando cualquier botón en RB4 a RB7 y volver a establecer el periodo, pero no se retomará el programa nuevamente hasta que se cumpla el conteo de la rutina.

Espero te sirva de algo este programa, o tal vez hasta lo puedas modificar para lograr tu objetivo.

Nota:
El programa lo escribí con MCS v5.0 y compilado con PBPX 3.0 porque necesitaba el archivo *.cof para realizar un debug al programa.
Sin embargo el código es compatible con versiones anteriores con solo cambiar la palabra de configuración.
La palabra de configuración para PBP 2.60 también está incluida en el programa por si se requiere.

Saludos.


----------



## cesarim (Dic 10, 2013)

gracias amigo por tu respuesta  y ayuda la idea de hacer los tiempos con un solo pulsador es porque hare activar 4 focos  independientes cada uno con su pulsador y este pulsador con sus tiempos diferentes en ese caso como podria darle solucion


----------



## xmagdielx (Dic 10, 2013)

Saludos cesarim, el programa que adjunto D@rkbytes es perfectamente ajustable a lo que tienes pensado hacer.





> Se utiliza la interrupción por cambio de estado en los pines RB4 a RB7 para determinar que periodo establecer.
> El programa cuenta con una rutina para periodos largos de tiempo que puedes utilizar en tu programa.


Despues de eso lo que debes seleccionar es cual foco deseas encender con cada tiempo establecido.
Suerte!


----------



## cesarim (Dic 10, 2013)

Gracias amigo lo leere entoncs y tratare de adecuarlo muchas gracias ya les comento como va todo


----------



## cesarim (Dic 11, 2013)

Amigo desde ya muchas gracias por el codigo esta  muy muy  bueno pero lo que pretendo con esos tiempos es que sean con un mismo pulsador para activar un solo relay 

```
Define OSC 4				; Definir que se trabajará con 4MHz.

; Declaración de variables.
Contador    Var Word
Flag        Var Bit
T1          Var Word
T2          Var Word

; Nombres para los pines.
Symbol LED_1    = PORTB.1

Inicio:
	CMCON = 7				; Comparadores analógicos OFF
	OPTION_REG.7 = 0		; Resistencias de Pull-Up en Puerto B
	TRISB = %11110000
	PORTB = TRISB
    Clear       ; Inicializar variables a 0
	
On Interrupt GoTo PORTB74_CHANGE
INTCON = $C8    ; %11001000 (Interrupción RB<7:4>)

Programa:
; Programa principal.
	Toggle PORTA.1
	Pause 80
	GoTo	Programa

Disable
PORTB74_CHANGE:
    INTCON.0 = 0    ; Limpiar flag por cambio de estado en RB<7:4>

    While PORTB.4 = 0   ; Mientras RB4 es 0...
        Pause 10
        Contador = Contador +1  ; Incrementar Contador cada 10Ms.
        If Contador = 50 Then   ; Si son 500 Ms...
        T2 = 10                 ; 10 segundos.
        LED_1 = 1               ; Enciende LED_1 por 10 segundos
        GoSub Retardo           ; Ir a Subrutina de retardo.
        EndIf
    Wend                        ; Termina el bucle.

    While PORTB.4 = 0        ; el mismo pulsador con un tiempo de 
        Pause 10
        Contador = Contador +1
        If Contador = 200 Then  ; dos segundos
        T2 = 60                 ; prende led_1 por 1 Minuto
        LED_1 = 1
        GoSub Retardo
        EndIf
    Wend

    While PORTB.4 = 0        ;el mismo pulasador con un tiempo de pulsado
        Pause 10
        Contador = Contador +1
        If Contador = 500 Then  ; de 5 segundos
        T2 = 7200               ; enciende led_1 por 2 Horas
        LED_1 = 1
        GoSub Retardo
        EndIf
    Wend
    
    While PORTB.4 = 0
        Pause 10
        Contador = Contador +1
        If Contador = 100 Then
        T2 = 1
        LED_1 = 1
        GoSub Retardo
        EndIf
    Wend

    Contador = 0
    
    If Flag Then            ; Si Flag es 1 es porque se activo el Retardo.
        Flag = 0            ; Se limpia la bandera.            
        LED_1 = 0           ; Apagar LED_1
    EndIf
    
    Resume                  ; Regresar al programa principal.
    Enable                  ; Habilitar nuevamente las interrupciones.
    
; Procedimiento para retardos largos de tiempo (Por D@rkbytes)
Retardo:
    T1 = 0                  ; Iniciar esta variable con el valor 0
    Flag = 1                ; Activar bandera de LED encendido
Aun_No:                     ; Etiqueta para realizar un bucle               
    T1 = T1 + 1             ; Incrementar T1
    Pause 1000              ; Pausar 1 segundo
    If T1 < T2 Then         ; Si la variable T1 es menor a la variable T2...
    GoTo Aun_No             ; Regresar a Aun_No
    Else                    ; Si es mayor sale del If
    LED_1 = 0               ; Apaga el LED (Fin del período)
    Flag = 0                ; Limpiar bandera de LED encendido
    EndIf                   ; Termina el If
    Return                  ; Regresa dentro de la interrupción
    
	End
```

y que se apague cuando se vuelva a presionar el pulsador  asi no haya cumplido su tiempo programado


----------



## reyvilla (Dic 14, 2013)

Hola compañeros estoy aún con lo del PWM, con respecto a sus  limitaciones y sus ventajas, estoy realizando un ejemplo con un  pic16f877A aun estoy en fases de diseño del programa para dar una idea  para compararlo con respecto el PWM del pic y el PWM generado por  interrupción cuando lo tenga listo lo comparto. 

Por otro lado y para no saturarme con solo el PWM, con respeto a lo de  el compañero cesarim estoy revisando el código algo complejo a mi  parecer, creo se puede realizar con instrucciones mas simples y  algoritmos menos complejos ahora estoy editando un código nuevo en base  al código subido hoy mas tarde lo comparto, solo una pregunta. Por que  toggle y por que no usas un simple  =  1 para estar mas seguro de que  sea eso lo que se cumpla. Lo digo por que colocas muchas veces IF  variable THEN en ves de IF variable = 1 THEN, y toggle si es que deseas  mantenerlo apagado por el mismo tiempo que encendido. Mas conveniente es  si utilizas los flag como señalizadores o el mismo pin del led para  saber si esta encendido o apagado y así saber como actuar en cada  situación. Solo probé cambiando el toggle dentro de la interrupción por  led = 0 y los IF variable = 1. Y empezó a dar mejor, de todas formas  tienes muchas cosas que hiciste que hacen que sea difícil de entender y  de ejecutar. Otra cosa que vi es que usas el PORTA.4 el cual debes de  colocar una PULL-UP para que funciones de manera correcta. Los tiempos  no se si realizaste los cálculos pero no veo configuración del TMR0 por  lo que viendo tu configuración estamos hablando de 16 milisegundos con  384 useg  por cada incremento de tu variable MAS_TIEMPO. Osea 16,384 x  61 = 0,999 segundos, Para el primer caso y ultimo se cumple el segundo  dice 20 lo que indica que es 20seg. Al cumplirse en cualquier caso debes  asegurar de volver a 0 el TMR0 y mas cuando estas desactivando el LED  adicional solo activara el contador cuando se este activando alguno de  los led y así hacerlo mas preciso. En conclusión voy a seguir por acá  con el nuevo código y luego lo coloco saludos. 

---------- Actualizado después de 2 horas ----------

Ya realicé el código esta funcionando para un solo led se modifico lo necesario para que funcionara lo mejor posible, parte del código me lo copie de un un código que realice hace unos años atrás para temporizar unas lavadoras por lo que es bien preciso. Ahora funciona de la siguiente manera.

Para iniciar se presiona el primer botón de izquierda a derecha, se mantiene presionado no mas de 200mSeg Ya que sobre pasa el valor de la variable y al pasar de 256 la variable retorna a 0. 
Hay dos maneras de saber cuanto tiempo va a quedar encendido el led. Una es sonora con un beep se mantiene 10Seg con dos beep se mantiene 1 min y con 3 beep se mantiene 2 min es modificable en el código. La otra manera en revisando la memoria eeprom del pic la cual utilice como referencia para verificar el valor de la variable lo cual puede borrarse del código si no es necesario. Lo otro es duplicar las misma lineas de código para los demás botones y ya estaría listo...Cual quier cosa me avisas.

Mucho éxito  saludos.


----------



## cesarim (Dic 16, 2013)

muchas gracias amigo por tu tiempo en ayudarme estoy descargarndo el codigo para poder revisarlo y simularlo


----------



## cesarim (Dic 17, 2013)

Hola amigo reyvilla te agradesco por el codigo esta muy muy bueno, en esta parte que activamos el boton se podria ponerle un pequeño antirrebote digo por si se le podria meter ruido en algun momento y si seria de esta manera o de que manera posible asegurarlo como para evitar que se active solo o talvez no sea necesario amigo 
	
	



```
if boton0 = 1  then
     pause 10
     if boton0 = 1 then
     while boton0  = 1
     I = I + 1
```
veo que guardas el el valor de I en la memoria del pic verdad 





> if boton0 = 1 then    ;activo boton
> WHILE boton0 = 1
> I = I + 1
> FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
> ...


como podria hacer si le quisiera agregar 1 o 2 pulsadores mas cada uno con su respectivo led y que funcione de la misma manera que el primer pulsador con el primer led. tendria que agregarle 2 variables mas o podria trabajar con la misma en este caso la I.
si para 2 min
	
	



```
FLAG0 = 120 'PARA UN TIEMPO DE 2min 
     toggle led_0
     I = 0
     ENDIF
```
 le das 120 segundos verdad podria darle por decir 3600 para una hora en una rutina y en otra rutina
	
	



```
FLAG0 = 60 'PARA UN TIEMPO DE 1min
     toggle led_0
     I = 0
     ENDIF
```
 darle 14400 que seria 4 horas o cuanto de maximo de tiempo le podria colocar a cada uno.


----------



## reyvilla (Dic 19, 2013)

Hola lo del antirebote en este caso no hace falta en caso de ruido para eso estan las pull-down que son las resistencias que mantienen 0V en cada uno de los pulsadores. Lo de grabar el valor era para poder compara el tiempo de pulsación y el tiempo de encendido del led y esa parte la puedes borrar. Los otros pulsadores necesitarías generar su propia rutina en cada sub-rutina, ejemplo en el inicio cada botón tendría que tener su propia rutina de temporizacion lo que si se mantendria seria la variable de referencia I ya que esa se borra. Y efectivamente como indicas si colocas un valor de 3600seg es una hora. El valor máximo seria de 65535seg que es el valor máximo para una variable tipo word y si colocas otro contador pues puedes extenderlo mucho mas. Cualquier otra cosa me avisas saludos


----------



## cesarim (Dic 19, 2013)

Reyvilla como estas amigo se me complica un poco agregarle un pulsador podrias orientarme y decirme por favor en que parte del codigo me estoy equivocando ya que no trabaja  como devberia de ser
	
	



```
MAIN:
     IF BOTON0 = 1 THEN GOTO UNO
     IF BOTON1 = 1 THEN GOTO DOS
   GOTO MAIN   

   UNO:  
     if boton0 = 1 then    
      WHILE boton0 = 1
       I = I + 1
        FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
         PAUSEUS 10
        NEXT
       WEND
      WRITE 00,I
     goto verifica      
    endif 
     
     if led_0 = 0 and led_1 = 0 and led_2 = 0 then
      goto UNO
     else
      goto temporiza
     endif       
    
     verifica:
       
       if i => 256 then
        i = 0
       goto UNO
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG0 = 5 'PARA UN TIEMPO DE 10 SEG
        toggle led_0
       I = 0
      ENDIF
     
       IF I <= 150 and i > 50 THEN 
        for aux = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG0 = 10 'PARA UN TIEMPO DE 1min
         toggle led_0
        I = 0
       ENDIF
     
       IF I <= 200 and i > 150 THEN  
        for aux = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG0 = 15 'PARA UN TIEMPO DE 2min 
       toggle led_0
      I = 0
     ENDIF  
     
     
   DOS:  
     if boton1 = 1 then    
      WHILE boton1 = 1
       I = I + 1
        FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
         PAUSEUS 10
        NEXT
       WEND
      WRITE 00,I
     goto verifica1      
    endif 
     
     if led_1 = 0 and led_0 = 0 and led_2 = 0 then
      goto DOS
     else
      goto temporiza
     endif       
    
     verifica1:
       
       if i => 256 then
        i = 0
       goto DOS
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG1 = 5 'PARA UN TIEMPO DE 10 SEG
        toggle led_1
       I = 0
      ENDIF
     
       IF I <= 150 and i > 50 THEN 
        for aux = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG1 = 10 'PARA PRUEBA 10 SEG
         toggle led_1
        I = 0
       ENDIF
     
       IF I <= 200 and i > 150 THEN  
        for aux = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG1 = 15 'PARA UN TIEMPO DE 15 SEG PRUEBA
       toggle led_1
      I = 0
     ENDIF       
      
     
     temporiza:
     IF MILISEGUNDO => 78 THEN  '998.4 MILISEGUNDOS + 1.14 = 999.54 ML  = 1 SEG APORX.
     MILISEGUNDO = 0
     
     
     IF led_0 = 1 AND TLed1 < FLAG0 THEN
     TLed1 = TLed1 + 1
     ELSE
     TLed1  = 0
     FLAG0  = 0
     Led_0  = 0
     endif       
     GOTO UNO
     
     IF led_1 = 1 AND TLed2 < FLAG1 THEN
     TLed2 = TLed2 + 1
     ELSE
     TLed2  = 0
     FLAG1  = 0
     Led_1  = 0
     ENDIF 
     endif       
     GOTO DOS     
     
    Disable
    MI_INTERRUPCION:
    PAUSEUS 13   'DIFERENCIA EN TIEMPO 13 * 78 = 1014 US = 1.14 MILISEGUNDOS 
                 'EL VALOR DEL TMR0 ES DE 206 Y  EL DEL PREESCALER DE 256
                 'ESO DA UN VALOR DE 12800uSEG OSEA 12.8SEG
                 'ESO MULTIPLICADO POR 78, 12.8 * 78 = 998.4 PARA APROXIMARLO MAS
                 'SE COMPENSO CON UNA PAUSA DE 13uSEG POR CADA MILISEGUNDO
                 
    MILISEGUNDO = MILISEGUNDO + 1

    TMR0 = 206
    INTCON = %10100000
    Resume 'VUELVE DESDE DONDE FUE INTERRUNPIDA
    Enable 'INTERRUMPE DESPUES DE LA CABECERA SEGUN MANUAL PBP 

    END
```
 como que se complica en algunos moementos  o mejor dicho no prende ni apaga como deveria de ser que parte estoy fallando amigo


----------



## xmagdielx (Dic 28, 2013)

saludos amigo cesarim, viendo tu código puedo notar un error al momento en el que usas la instrucción for- next, y ademas lo usas varias veces e tu codigo; para explicarte mejor tu lo usas así :

```
FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
         PAUSEUS 10
        NEXT
```
el error tuyo esta en que en la parte de "next" la forma correcta seria "next aux", y así sucesivamente a lo largo del código. Espero haberme echo entender saludos!


----------



## D@rkbytes (Dic 29, 2013)

xmagdielx dijo:


> saludos amigo cesarim, viendo tu código puedo notar un error al momento en el que usas la instrucción for- next, y adem*á*s lo usas varias veces e*n* tu c*ó*digo; para explicarte mejor, t*ú* lo usas así :
> 
> ```
> FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
> ...


Esto no responde la pregunta de cesarim, es una aclaración sobre el uso del bucle *For*... *Next*

Veamos un ejemplo:

*For* Conteo = Inicio *To* Final {*Step* {-1} Incremento}
{Instrucciones}
*Next* {Conteo}

Lo que se encuentra dentro de los corchetes es opcional.
No es necesario escribir la variable Conteo después de *Next*. PE: "*Next* Conteo"
El compilador asume por orden los bucles *For*... *Next* y genera errores cuando están en desorden las terminaciones *Next* dentro de bucles anidados.

Por lo tanto al compilar el programa se obtendrá el mismo efecto si se escribe de esta forma...

*For* Conteo = 1 *To* 10
*High* PORTB.1
*Pause* 100
*Low *PORTB.1
*Pause* 100
*Next *

Que de esta otra forma...

*For* Conteo = 1 *To* 10
*High* PORTB.1
*Pause* 100
*Low *PORTB.1
*Pause* 100
*Next *Conteo

Ó de esta otra...

*For* Conteo = 1 *To* 10 *Step* 1
*High* PORTB.1
*Pause* 100
*Low *PORTB.1
*Pause* 100
*Next*

Porque se asume que la variable Conteo deberá ser incrementada de 1 en 1 hasta que llegue a 10.

Como el código de cesarim carece de comentarios relevantes, es muy difícil entender que es lo que quiere hacer.
Y por lo tanto dar una solución a su problema también lo es.
Aparte únicamente se refiere a una sola persona para la resolución a su problema y con ello se pierde la oportunidad de que otras personas le puedan sugerir como en tu caso, alguna colaboración extra.

*Normas del Foro 23)* Es de mala educación referir una consulta a un solo miembro de la Comunidad.
  Además de que te pierdes la posibilidad de que otros miembros te respondan.

Saludos.


----------



## cesarim (Dic 29, 2013)

saludos amigos del foro espero no interpreten mal mi ayuda  a mi codigo, se me es muy dificil entrar por motivos de trabajo al foro ya que no tengo internet en casa. el codigo que generosamente ustedes me estan ayudando a resolver y a terminar  para mi ejercicio va quedando como me ayudo nuestro amigo reyvilla, pero al ponerle otro  boton con otro relay que trabaje con los mismos tiempos de pulsacion que el primer boton no me funciona y eh ahi donde pido su ayuda ya que me gustaria no solo adecuarle 2 botones cada uno con su respectivo relay sino adecuarlo a 4 botones o pulsadores cada uno con sus respectivos relays. espero me sepan disculpar si me exprese mal o si no supe pedir la ayuda adecuada

el problema que tengo radica aca creo yo y no se de que manera intentarle

```
MAIN:
     IF BOTON0 = 1 THEN GOTO UNO ;aca le indico que lea boton0 si no esta presionado 
     IF BOTON1 = 1 THEN GOTO DOS ;entonces pase a leer boton1 y si detecta que se                                        
   GOTO MAIN   ;presiono cualquiera de estos dos entonces salta a su rutina adecuada
                     ;o si no sigue leyendo hasta que detecte el boton activado

   UNO:  
     if boton0 = 1 then    
      WHILE boton0 = 1
       I = I + 1
        FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
         PAUSEUS 10
        NEXT
       WEND
      WRITE 00,I
     goto verifica      
    endif 
     
     if led_0 = 0 and led_1 = 0 and led_2 = 0 then
      goto UNO
     else
      goto temporiza
     endif       
    
     verifica:
       
       if i => 256 then
        i = 0
       goto UNO
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG0 = 5 'PARA UN TIEMPO DE 10 SEG
        toggle led_0
       I = 0
      ENDIF
     
       IF I <= 150 and i > 50 THEN 
        for aux = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG0 = 10 'PARA UN TIEMPO DE 1min
         toggle led_0
        I = 0
       ENDIF
     
       IF I <= 200 and i > 150 THEN  
        for aux = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG0 = 15 'PARA UN TIEMPO DE 2min 
       toggle led_0
      I = 0
     ENDIF  
     
   ;el punto es que al pulsar un boton cualquiera de los dos se encienden los dos leds y no 
   ;deveria hacer eso deveria solamente prender un led y al activar el otro boton encender 
   ;el otro led es lo que me marea que manera adecuada podria hacerlo con dos o tres o hasta 
   ; cuatro pulsadores mas  
   DOS:  
     if boton1 = 1 then    
      WHILE boton1 = 1
       I = I + 1
        FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
         PAUSEUS 10
        NEXT
       WEND
      WRITE 00,I
     goto verifica1      
    endif 
     
     if led_1 = 0 and led_0 = 0 and led_2 = 0 then
      goto DOS
     else
      goto temporiza
     endif       
    
     verifica1:
       
       if i => 256 then
        i = 0
       goto DOS
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG1 = 5 'PARA UN TIEMPO DE 10 SEG
        toggle led_1
       I = 0
      ENDIF
     
       IF I <= 150 and i > 50 THEN 
        for aux = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG1 = 10 'PARA PRUEBA 10 SEG
         toggle led_1
        I = 0
       ENDIF
     
       IF I <= 200 and i > 150 THEN  
        for aux = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG1 = 15 'PARA UN TIEMPO DE 15 SEG PRUEBA
       toggle led_1
      I = 0
     ENDIF       
      
     
     temporiza:
     IF MILISEGUNDO => 78 THEN  '998.4 MILISEGUNDOS + 1.14 = 999.54 ML  = 1 SEG APORX.
     MILISEGUNDO = 0
     
     
     IF led_0 = 1 AND TLed1 < FLAG0 THEN
     TLed1 = TLed1 + 1
     ELSE
     TLed1  = 0
     FLAG0  = 0
     Led_0  = 0
     endif       
     GOTO UNO
     
     IF led_1 = 1 AND TLed2 < FLAG1 THEN
     TLed2 = TLed2 + 1
     ELSE
     TLed2  = 0
     FLAG1  = 0
     Led_1  = 0
     ENDIF 
     endif       
     GOTO DOS     
     
    Disable
    MI_INTERRUPCION:
    PAUSEUS 13   'DIFERENCIA EN TIEMPO 13 * 78 = 1014 US = 1.14 MILISEGUNDOS 
                 'EL VALOR DEL TMR0 ES DE 206 Y  EL DEL PREESCALER DE 256
                 'ESO DA UN VALOR DE 12800uSEG OSEA 12.8SEG
                 'ESO MULTIPLICADO POR 78, 12.8 * 78 = 998.4 PARA APROXIMARLO MAS
                 'SE COMPENSO CON UNA PAUSA DE 13uSEG POR CADA MILISEGUNDO
                 
    MILISEGUNDO = MILISEGUNDO + 1

    TMR0 = 206
    INTCON = %10100000
    Resume 'VUELVE DESDE DONDE FUE INTERRUNPIDA
    Enable 'INTERRUMPE DESPUES DE LA CABECERA SEGUN MANUAL PBP 

    END
```
por favor espero su ayuda


----------



## juancaca (Ene 2, 2014)

buenas noches compañeros de foros de electrónica me podrían colaborar explicándome una parte de este código que publicaron en post del foro, hay parte del código que no la entiendo.


```
ADCON1 = %10000010  
TrisB  = %00000001
TrisC  = %00000000
TrisD  = %00000001
PortB  = %00000000
PortC  = %00000000


LPV     con 70    'Porcentaje minimo de bateria
LB      var word
adVal   var word					
aVal    var word		
aACC    var byte
L       var byte

Lcdout $fe, 1   				
Lcdout "Lubeck "			
Pause 50       		
aval=0

Inicio: 
 'Inserta tu codigo Aqui...
 gosub ACC	
 gosub adc
Goto inicio      				
End

ACC:
 if aacc<>portb.0 then                        ; en esta parte dicen que aacc no es igual a portb.0
   LCDOUT $FE,64                               ; cargan en en la memoria CG RAM
   LCDOUT $1F,$11,$1B,$E,$4,$4,$4,$4  ; mostrar el carácter personalizado de un enchufe 
   LCDOUT $A,$1F,$11,$1B,$E,$4,$4,$4
   LCDOUT $0,$A,$1F,$11,$1B,$E,$4,$4
   LCDOUT $0,$0,$A,$1F,$11,$1B,$E,$4
   LCDOUT $0,$0,$0,$A,$1F,$11,$1B,$E
   LCDOUT $0,$0,$0,$0,$A,$1F,$11,$1B
   LCDOUT $0,$0,$0,$0,$0,$A,$1F,$11
   LCDOUT $0,$0,$0,$0,$0,$0,$A,$1F
   if not PortB.0 then                         ; esta parte no la se expresar bien y no se lo que hace
    for L=7 to 0 step-1                        ; hace que se muestre el carácter como si estuviera 
     lcdout $FE,$8F,l                           ; desconectando de la luz.
     pause 50
    next L
   else                                             ; 
    for L=0 to 7
     lcdout $FE,$8F,l
     pause 50
    next L
   endif
   LCDOUT $FE,$8F,"E"
   pause 2000
  aacc=  portb.0   
 endif
return
 
ADC:
 ADCIN 0, adval			
 lb=(1024/100)*LPV;LB = 717
 L=(adval-lb)/((1024-lb)/7) 
 if aacc=0 or l+1<7 then			
  if aval<>adval then
   LCDOUT $FE,64 
   lcdout $0E,$11,$1B,$15,$1B,$11,$1F,$1F
   lcdout $0E,$11,$11,$11,$11,$11,$11,$1F
   lcdout $0E,$11,$11,$11,$11,$11,$1F,$1F
   lcdout $0E,$11,$11,$11,$11,$1F,$1F,$1F
   lcdout $0E,$11,$11,$11,$1F,$1F,$1F,$1F
   lcdout $0E,$11,$11,$1F,$1F,$1F,$1F,$1F
   lcdout $0E,$11,$1F,$1F,$1F,$1F,$1F,$1F
   lcdout $0E,$1F,$1F,$1F,$1F,$1F,$1F,$1F
   LCDOUT $FE,$8F,l+1
   pause 2000
  endif
 else  
  LCDOUT $FE,$8F,"C"
 endif 
 aval=adval		
Return
end
```

el archivo de proteus y el codigo estan en el post de Solo Ejemplos PICBASICPRO-PROTEUS UPS para microcontroladores. Estaría muy agradecido si me pudieran explicar bien el funcionamiento de este código ya que me serviría de mucho para el proyecto que quiero realizar.
Cordial saludo


----------



## jesusmolo (Ene 4, 2014)

hola buenas tardes. de antemano muchas gracias por la atención prestada.
pude instalar proteus 8, pbp v4, tengo un pic 16f84a y un lcd 16*2 ; mirando varios de todos los ejemplos aquí mostrados he hecho varias practicas pequeñas ya que no se nada de programación. pero tengo muchas ganas de aprender de todos ustedes.

En este primer programa mantengo presionado un pulsador y durante el tiempo que lo mantengo presionado el pulsador sale en pantalla un mensaje.

En el 2do programa, la idea es que al presionar 1 vez el pulsador, aparezca el mensaje, luego al presionar el pulsador por segunda vez, el mensaje desaparezca. No lo he podido lograr, una vez presionado el pulsador, sale un mensaje intermitente y el pulsador no responde mas. sin embargo lo coloco para que me ayuden, me corrijan y me expliquen

Programa 1

```
DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS
DEFINE LCD_DBIT 0     'DESDE EL BIT A.0 AL BIT A.3
DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO A
DEFINE LCD_RSBIT 4    'EN EL BIT A.4
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

TRISA=0  'ESTABLECER EL PUERTO A COMO SALIDA
TRISB=1 ; RB0,RB1 SON ENTRADAS
PAUSE 500 ' PAUSE DE MEDIO SEGUNDO

;CONFIGURACION DE ENTRADAS AL PIC 16F84a
Symbol PULSADOR = PORTB.0   ; BOTON DE AJUSTE PARA HORA


IF PULSADOR = 1 THEN
LCDOUT $FE, 1 ' LIMPIAR VISOR
LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
LCDOUT $FE, $0C                                        'APAGAR EL CURSOR
ENDIF

IF PULSADOR = 0 THEN
LCDOUT $FE, 1 ' LIMPIAR VISOR
ENDIF
```
Programa 2

```
DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS
DEFINE LCD_DBIT 0     'DESDE EL BIT A.0 AL BIT A.3
DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO A
DEFINE LCD_RSBIT 4    'EN EL BIT A.4
DEFINE LCD_EREG PORTB  'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

TRISA=0 'ESTABLECER EL PUERTO A COMO SALIDA
TRISB=1 ; RB0,RB1 SON ENTRADAS
PAUSE 500  ' PAUSE DE MEDIO SEGUNDO

;CONFIGURACION DE ENTRADAS AL PIC 16F84a
Symbol PULSADOR = PORTB.0   ; BOTON DE AJUSTE PARA HORA

CONTADOR VAR BYTE

INICIO: 

   IF PULSADOR  THEN
   CONTADOR = CONTADOR + 1 
   GOSUB AUMENTAR
   ENDIF
GOTO INICIO

AUMENTAR:

   IF CONTADOR = 1 THEN
   GOSUB PRENDER
   ENDIF
   IF CONTADOR = 2 THEN
   GOSUB APAGAR
   ENDIF
GOTO AUMENTAR

PRENDER:
   LCDOUT $FE, 1 ' LIMPIAR VISOR
   LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
   LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
   LCDOUT $FE, $0C                                        'APAGAR EL CURSOR
GOTO AUMENTAR

APAGAR:
   LCDOUT $FE, 1 ' LIMPIAR VISOR
GOTO AUMENTAR
                                  
END
```
Muchas gracias por la atención prestada, disculpen la ignorancia pero por algo se empieza. ...


----------



## juancaca (Ene 4, 2014)

hola jesusmolo porque no ensayas en la etiqueta apagar colocar la bandera contador otra vez en cero y en inicio en la parte de if pulsador colocale si pulsador=1 ó pulsador=0 segun como tengas el pulsador configurado si con resistencia pull-up ó pull-down.


----------



## D@rkbytes (Ene 5, 2014)

jesusmolo dijo:


> En este primer programa mantengo presionado un pulsador y durante el tiempo que lo mantengo presionado el pulsador sale en pantalla un mensaje.
> 
> En el 2do programa, la idea es que al presionar 1 vez el pulsador, aparezca el mensaje, luego al presionar el pulsador por segunda vez, el mensaje desaparezca. No lo he podido lograr, una vez presionado el pulsador, sale un mensaje intermitente y el pulsador no responde mas. sin embargo lo coloco para que me ayuden, me corrijan y me expliquen


Para el programa 1 puedes hacerlo de esta forma:

```
Symbol Pulsador = PORTB.0

Inicio:
    LCDOut $FE,1        ; Inicializar la pantalla.
    
Programa:
    If Pulsador Then                ; Si Pulsador = 1
    While Pulsador                  ; Mientras Pulsador = 1
    LCDOut $FE,$80,"HOLA"           ; Escribir en línea 1
    LCDOut $FE,$C0,"ELECTRONICA"    ; Escribir en línea 2
    Pause 100
    Wend                            ; Pulsador ahora está en 0
    LCDOut $FE,1                    ; Limpiar la pantalla
    EndIf
    GoTo Programa
```
Para el segundo programa de esta otra forma:

```
Symbol Pulsador = PORTB.0

; Declaración de variables.
B0          Var Byte
Contador    Var Byte

Inicio:
    LCDOut $FE,1        ; Inicializar la pantalla.
    Clear               ; Limpiar variables.
    
Programa:
    Button Pulsador,1,255,255,B0,0,Programa
    Contador = Contador + 1         ; Incrementar Contador
    If Contador = 1 Then            ; Si Contador llegó a 1...
    LCDOut $FE,$80,"HOLA"           ; Escribir en línea 1
    LCDOut $FE,$C0,"ELECTRONICA"    ; Escribir en línea 2
    Pause 100
    Else                            ; Si es superior a 1...
    LCDOut $FE,1                    ; Borrar la pantalla.
    Contador = 0                    ; Regresar Contador a 0
    EndIf
    GoTo Programa
    
    End
```
Nota que estás usando el pin RA4 para el pin RS de la pantalla y el pin RA4 es con drenador abierto.
Para utilizar ese pin y obtener los dos estados lógicos que se requieren, debes colocar una resistencia Pull-Up.

Adjunto los códigos y la simulación por si requieres saber la conexión.

Saludos.


----------



## jesusmolo (Ene 5, 2014)

juancaca dijo:


> hola jesusmolo porque no ensayas en la etiqueta apagar colocar la bandera contador otra vez en cero y en inicio en la parte de if pulsador colocale si pulsador=1 ó pulsador=0 según como tengas el pulsador configurado si con resistencia pull-up ó pull-down.



hola juancaca, de antemano gracias por tu pronta respuesta, te comento que siguiendo tus indicaciones o corrígeme si me equivoque en algo, hice lo siguiente:


```
DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS
DEFINE LCD_DBIT 0     'DESDE EL BIT A.0 AL BIT A.3
DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO A
DEFINE LCD_RSBIT 4    'EN EL BIT A.4
DEFINE LCD_EREG PORTB  'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

TRISA=0 'ESTABLECER EL PUERTO A COMO SALIDA
TRISB=1 ; RB0,RB1 SON ENTRADAS
PAUSE 500  ' PAUSE DE MEDIO SEGUNDO

;CONFIGURACION DE ENTRADAS AL PIC 16F84a
Symbol PULSADOR = PORTB.0   ; BOTON DE AJUSTE PARA HORA

CONTADOR VAR BYTE

INICIO: 

   IF PULSADOR = 1  THEN
   CONTADOR = CONTADOR + 1 
   GOSUB AUMENTAR
   ENDIF
GOTO INICIO

AUMENTAR:

   IF CONTADOR = 1 THEN
   GOSUB PRENDER
   ENDIF
   IF CONTADOR = 2 THEN
   GOSUB APAGAR
   ENDIF
GOTO AUMENTAR

PRENDER:
   LCDOUT $FE, 1 ' LIMPIAR VISOR
   LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
   LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
   LCDOUT $FE, $0C                                        'APAGAR EL CURSOR
GOTO AUMENTAR

APAGAR:
   CONTADOR = 0
   LCDOUT $FE, 1 ' LIMPIAR VISOR
GOTO AUMENTAR
                                  
END
```

La resistencia es PULL DOWN en PORTB.0, me sigue apareciendo el mensaje intermitente.
Probare ahora como me indica D@rkbytes y les comentaré.
De todas maneras muchas gracias juancaca por tu tiempo. 

Adjunto el diagrama en proteus.


----------



## jesusmolo (Ene 5, 2014)

D@rkbytes dijo:


> Para el programa 1 puedes hacerlo de esta forma:
> 
> ```
> Symbol Pulsador = PORTB.0
> ...



hola D@rkbytes buenas tardes, muchas gracias por tan pronta, corta y acertada respuesta, hermanazo , con respuestas como estas, haces que los que apenas empezamos y veiamos la programacion de pic como algo muy complejo; le tomemos empeño y ganas de seguir explorando.   

si no es molestia me gustaria que me expliacaras 2 dudas que tengo:

1.- esta instruccion del 2do programa.

Button Pulsador,1,255,255,B0,0,Programa


2.- La funcion del  pulsador de reset en el pin MCRL, del pic es borrar todo rastro de programa grabado, para poder grabar otros programas? o tiene otra funsión? es necesario colocarlo en todos los ejercicios que quiera hacer? o al momento que yo quiera montar el ejercicio fisicamente no lo coloco para no borrar por accidende el programa? 

Nuevamente muchas gracias compañero.


----------



## juancaca (Ene 5, 2014)

jesusmolo dijo:


> hola juancaca, de antemano gracias por tu pronta respuesta, te comento que siguiendo tus indicaciones o corrígeme si me equivoque en algo, hice lo siguiente:
> 
> 
> ```
> ...



hola jesusmolo mirando tu codigo le hice unas modificaciones y ya me funciona e hice otro muy parecido al de D@rkbytes y tambien funciona

codigo 1


```
INICIO: 

    IF PULSADOR = 1 THEN
        while pulsador=1
        wend
        pause 200
        CONTADOR = CONTADOR + 1 
        GOSUB AUMENTAR
    ENDIF
GOTO INICIO

AUMENTAR:

    IF CONTADOR = 1 THEN
        GOSUB PRENDER
    ENDIF
    IF CONTADOR = 2 THEN
        GOSUB APAGAR
    ENDIF
GOTO inicio

PRENDER:
    LCDOUT $FE, 1 ' LIMPIAR VISOR
    LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
    LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
    'LCDOUT $FE, $0C 'APAGAR EL CURSOR
return 

APAGAR:
    
    CONTADOR = 0
    LCDOUT $FE, 1 ' LIMPIAR VISOR
return

END
```

codigo 2


```
INICIO: 

    IF PULSADOR = 1 THEN
        while pulsador=1
        wend
        pause 200
        CONTADOR = CONTADOR + 1 
        if contador=1 then
            LCDOUT $FE, 1 ' LIMPIAR VISOR
            LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
            LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA 
        else
            contador=2
            LCDOUT $FE, 1 ' LIMPIAR VISOR
            CONTADOR = 0
        endif    
    ENDIF
GOTO INICIO
end
```
espero te sirva
cordial saludo


----------



## D@rkbytes (Ene 5, 2014)

jesusmolo dijo:


> si no es molestia me gustaría que me explicaras 2 dudas que tengo:
> 
> 1.- esta instrucción del 2do programa.
> 
> ...


Para la primer pregunta mira por aquí: *Instrucción Button PBP*

La función del pin MCLR es resetear el microcontrolador, no borra el programa interno.
Al llevar este pin a un estado lógico 0 el microcontrolador reinicia el programa desde el vector de reset.
Sin embargo no reinicia los valores almacenados en la memoria RAM.
Por ese motivo hay que iniciar las variables con el valor deseado antes de la ejecución del programa.

En el PIC16F84A y algunos otros, por ejemplo los PIC16F87X/A este pin puede colocarse directamente a VCC.
De esta forma no se podrá resetear el microcontrolador por accidente.
La única forma de que se borre el programa es regrabando el microcontrolador o que éste se dañe.
En otros microcontroladores PIC el pin MCLR puede también ser usado como entrada.

Cualquier duda sobre el funcionamiento del PIC que uses se encuentra en su hoja de datos.


jesusmolo dijo:


> hola D@rkbytes buenas tardes, muchas gracias por tan pronta, corta y acertada respuesta, hermanazo ,  con respuestas como estas, haces que los que apenas empezamos y veíamos  la programación de pic como algo muy complejo; le tomemos empeño y  ganas de seguir explorando.


De nada. 
Continúa leyendo este Tema y encontrarás mucha información.

Saludos.


----------



## jesusmolo (Ene 5, 2014)

juancaca dijo:


> hola jesusmolo mirando tu codigo le hice unas modificaciones y ya me funciona e hice otro muy parecido al de D@rkbytes y tambien funciona
> 
> codigo 1
> 
> ...



juancaca, muchas gracias por tan variadas soluciones, me doy cuenta que todo esta en el empeño y la creatividad que uno desarrolle para cada problema.


----------



## trincherafull (Ene 22, 2014)

Saludos a todos.
Amigo jesusmolo: Porque  limpias la pantalla dos veces, creo que no es necesario.


----------



## cesarim (Ene 23, 2014)

Amigos despues de casi 2 semanas de trabajo puedo entrar con un poco de calma al foro, es dificil para mi ya que del trabajo soy exclavo, ayer estuve intentando modificar el codigo del codigo sobre los pulsadores pero aun no le encuentro el logaritmo adecuado para que trabaje como deberia de ser. este es el primer codigo que un amigo del foro me ayudo y trabaja perfecto con un solo pulsador activando su respectivo relay 
	
	



```
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_CLKOUT    
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF            
@ DEVICE LVP_OFF               
@ DEVICE CPD_ON             
@ DEVICE PROTECT_ON 
       
DEFINE OSC 4 

CMCON = 7

TRISB = %00000000 
TRISA = %11110001 
PORTA = %00000000
PORTB = %00000000

TLED1       VAR word 
TLED2       VAR word 
TLED3       VAR WORD 

MinutO      var byte   
Segundo     Var Byte     
MAS_TIEMPO  VAR BYTE
INITIO      VAR BYTE
I           var byte

FLAG        VAR WORD
FLAG0       VAR word
FLAG1       VAR word
FLAG2       VAR word

AUX         VAR BYTE
MILISEGUNDO var byte



;******POTENCIA******///////****** 
LED_0       var PORTB.0  
LED_1       VAR PORTB.1 
LED_2       VAR PORTB.2 
LED_3       VAR PORTB.3
Trbuz       VAR PORTB.7
;********************///////******

;******PULSADORES****///////****** 
                
BOTON0      VAR PortA.0 
BOTON1      VAR PortA.6
BOTON2      VAR PortA.7
;********************///////******

TMR0 = 206
OPTION_REG = %10000111 'preescaller 256 
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

FLAG0=0
FLAG1=0
flag2=0
i=0
    

     INICIO:  
   
     if boton0 = 1 then    ;activo boton
     WHILE boton0 = 1
     I = I + 1
     FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
     PAUSEUS 10
     NEXT
     WEND
     WRITE 00,I
     goto verifica      
     endif 
     
     if led_0 = 0 and led_1 = 0 and led_2 = 0 then
     goto inicio
     else
     goto temporiza
     endif       
    
     verifica:
       
     if i => 256 then
     i = 0
     goto inicio
     endif
     
     IF I <= 50  THEN 
     SOUND Trbuz,[110,5] 
     Trbuz = 0
     FLAG0 = 10 'PARA UN TIEMPO DE 10 SEG
     toggle led_0
     I = 0
     ENDIF
     
     IF I <= 150 and i > 50 THEN 
     for aux = 0 to 1
     SOUND Trbuz,[110,5]
     pause 300
     next
     Trbuz = 0
     FLAG0 = 60 'PARA UN TIEMPO DE 1min
     toggle led_0
     I = 0
     ENDIF
     
     IF I <= 200 and i > 150 THEN  
     for aux = 0 to 2
     SOUND Trbuz,[110,5]
     pause 300
     next 
     Trbuz = 0
     FLAG0 = 120 'PARA UN TIEMPO DE 2min 
     toggle led_0
     I = 0
     ENDIF    
     
     temporiza:
     IF MILISEGUNDO => 78 THEN  '998.4 MILISEGUNDOS + 1.14 = 999.54 ML  = 1 SEG APORX.
     MILISEGUNDO = 0
     
     
     IF led_0 = 1 AND TLed1 < FLAG0 THEN
     TLed1 = TLed1 + 1
     ELSE
     TLed1  = 0
     FLAG0  = 0
     Led_0  = 0
     ENDIF 
     endif       
     GOTO INICIO
     
    Disable
    MI_INTERRUPCION:
    PAUSEUS 13   'DIFERENCIA EN TIEMPO 13 * 78 = 1014 US = 1.14 MILISEGUNDOS 
                 'EL VALOR DEL TMR0 ES DE 206 Y  EL DEL PREESCALER DE 256
                 'ESO DA UN VALOR DE 12800uSEG OSEA 12.8SEG
                 'ESO MULTIPLICADO POR 78, 12.8 * 78 = 998.4 PARA APROXIMARLO MAS
                 'SE COMPENSO CON UNA PAUSA DE 13uSEG POR CADA MILISEGUNDO
                 
    MILISEGUNDO = MILISEGUNDO + 1

    TMR0 = 206
    INTCON = %10100000
    Resume 'VUELVE DESDE DONDE FUE INTERRUNPIDA
    Enable 'INTERRUMPE DESPUES DE LA CABECERA SEGUN MANUAL PBP 

    END
```

pero al agregarle el segundo pulsador con su respectivo relay y que haga las mismas funciones que el primero ya no trabaja de la misma manera y se loquea o hace cosas que no le estoy indicando aca les dejo el codigo que trato de implementar espero poder explicarme bien y recibir su ayuda
	
	



```
TMR0 = 206
OPTION_REG = %10000111 'preescaller 256 
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

FLAG0=0
FLAG1=0
FLAG2=0
i=0

    MAIN:
      IF BOTON0 = 1 THEN 
      GOTO UNOOO
      endif
      IF BOTON1 = 1 THEN 
      GOsub DOS
      endif
    GOTO MAIN   

   UNOOO:  
     IF BOTON0 = 1 THEN   
      WHILE BOTON0 = 1
       I = I + 1
        FOR AUX0 = 0 TO 1000 
         PAUSEUS 10
        NEXT 
       WEND
      goto verifica      
     endif
     
     if LED_0 = 0 then
      goto UNOOO    
     else
      goto temporiza
     endif   
    return

     verifica:
       
       if i => 256 then
        i = 0
       goto UNOOO
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG0 = 5 'PARA UN TIEMPO DE 5 SEG
        toggle LED_0
       I = 0
      ENDIF
     
       IF I <= 150 and i > 50 THEN 
        for AUX0 = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG0 = 10 'PARA UN TIEMPO DE 10 seg
         toggle LED_0
        I = 0
       ENDIF
        
       IF I <= 200 and i > 150 THEN  
        for AUX0 = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG0 = 15 'PARA UN TIEMPO DE 15 seg 
       toggle LED_0
      I = 0
     ENDIF 
   return  
     
   DOS:  
     if BOTON1 = 1 then    
      WHILE BOTON1 = 1
       I = I + 1
        FOR AUX1 = 0 TO 1000 
         PAUSEUS 10
        NEXT
       WEND
     goSUB verifica1      
    endif      
    
     if LED_0 = 0 then
      goto DOS    
     else
      goto temporiza
     endif                
    return
    
     verifica1:
       
       if i => 256 then
        i = 0
       goto DOS
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG0 = 5 'PARA UN TIEMPO DE 5 SEG
        toggle LED_1
       I = 0
      ENDIF
        
       IF I <= 150 and i > 50 THEN 
        for AUX0 = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG0 = 10 'PARA UN TIEMPO DE 10seg
         toggle LED_1
        I = 0
       ENDIF
       
       IF I <= 200 and i > 150 THEN  
        for AUX0 = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG0 = 15 'PARA UN TIEMPO DE 15 seg
       toggle LED_1
      I = 0
     ENDIF   
    return  
     
     temporiza:
     IF MILISEGUNDO => 78 THEN  '
     MILISEGUNDO = 0
     
     
     IF LED_0 = 1 AND TLed1 < FLAG0 THEN
     TLed1 = TLed1 + 1
     ELSE
     TLed1  = 0
     FLAG0  = 0
     LED_0  = 0
     I      = 0
     endif       
     GOTO UNOOO
     
     IF LED_1 = 1 AND TLed2 < FLAG1 THEN
     TLed2 = TLed2 + 1
     ELSE
     TLed2  = 0
     FLAG1  = 0
     LED_1  = 0
     I      = 0
     ENDIF 
     endif       
     GOTO DOS     
     
    Disable
    MI_INTERRUPCION:
    PAUSEUS 13   
                 
    MILISEGUNDO = MILISEGUNDO + 1

    TMR0 = 206
    INTCON = %10100000
    Resume 
    Enable 

    END
```
la simulacion tambien lo adjunto


----------



## alex candelo q (Ene 28, 2014)

Hola, amigos foreros,estoy tratando de aprender a programar microcontroladores,pero se me hace un poco dificil ya que en donde vivo no conosco a alguien que sepa de esto,tampoco hay centros de educacion para esto,el caso es que me compre un programador de pic y unos cuantos pic para probar,el caso es que estoy tratando de hacer un contador ascendente y descendente con dos pulsadores, un display de 7 segmentos y un pic 16F84A,en internet encontre lo que necesitaba para hacerlo funcionar, pero uno de 0 a 9 y de hecho funciona,pero quiero que cuente de 0 a 6 y viceversa y que donde va el cero ponga el 1 y donde va el 1 ponga el 0, es decir 1,0,2,3,4,5,6 y viceversa 5,4,3,2,0,1,aqui dejo el esquema y el archivo .asm y el .hex para que alguien me ayude a modificarlo, de antemano muchas gracias.


----------



## COSMICO (Ene 28, 2014)

Hola amigos.
Hace tiempo vengo siguiendo este hilo y me asalta una duda con respecto al reloj ds1307.
en el siguiente tramo de codigo, como hago para pasarlo a 12horas el reloj
Se supone que debo escribir el bit 6 del registro 2 en 1 sea %01000000, pero se me borra la hora sera haciendo una and, u or bueno mientras pido ayuda

grabarRTC:

    I2CWRITE DPIN,CPIN,%11010000,0,[$00]   ;setear 00 segundos
        Pause 10                     ;retardo para finalizar grabación
    I2CWRITE DPIN,CPIN,%11010000,1,[$39]   ;setear 39 minutos
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,2,[$12]    ;setear las 23 horas
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,3,[$5]    ;setear día lunes ,D=1,L=2
        Pause 10                              ;M=3 , M=4, J=5, V=6, S=7
    I2CWRITE DPIN,CPIN,%11010000,4,[$06]    ;setear día 27 del mes
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,5,[$8]    ;setear mes agosto
        Pause 50  
    I2CWRITE DPIN,CPIN,%11010000,6,[$09]    ;setear año  09
        Pause 10 
    I2CWRITE DPIN,CPIN,%11010000,7,[$10]   ;control %00010000 para
        Pause 10                           ;encender el led cada 1 seg.


    WRITE 0,1       ;escribe en la memoria 0 el valor de 1 para que no    
                    ;se vuelva a grabar otra vez estos datos en el RTC

    goto inicio                 ;ir a presentar los datos en el LCD

end


----------



## D@rkbytes (Ene 29, 2014)

alex candelo q dijo:


> aquí dejo el esquema y el archivo .asm y el .hex para que alguien me ayude a modificarlo, de antemano muchas gracias.


Para que alguien te pueda ayudar necesitas adjuntar el código en PICBasic Pro, no el código en ensamblador que genera el compilador.

Este debe tener extensión *.bas ó *.pbp


----------



## gabriel7747 (Ene 29, 2014)

alex candelo q dijo:


> Hola, amigos foreros,estoy tratando de aprender a programar microcontroladores,pero se me hace un poco dificil ya que en donde vivo no conosco a alguien que sepa de esto,tampoco hay centros de educacion para esto,el caso es que me compre un programador de pic y unos cuantos pic para probar,el caso es que estoy tratando de hacer un contador ascendente y descendente con dos pulsadores, un display de 7 segmentos y un pic 16F84A,en internet encontre lo que necesitaba para hacerlo funcionar, pero uno de 0 a 9 y de hecho funciona,pero quiero que cuente de 0 a 6 y viceversa y que donde va el cero ponga el 1 y donde va el 1 ponga el 0, es decir 1,0,2,3,4,5,6 y viceversa 5,4,3,2,0,1,aqui dejo el esquema y el archivo .asm y el .hex para que alguien me ayude a modificarlo, de antemano muchas gracias.


 te ayudaria pero es asm yo solo trabajo en pbp.


----------



## ByAxel (Ene 29, 2014)

alex candelo q dijo:


> quiero que cuente de 0 a 6 y viceversa y que donde va el cero ponga el 1 y donde va el 1 ponga el 0, es decir 1,0,2,3,4,5,6 y viceversa 5,4,3,2,0,1,aqui dejo el esquema y el archivo .asm y el .hex para que alguien me ayude a modificarlo, de antemano muchas gracias.


Juega con la tabla puesta en el Label "L0012:", ahí están las combinaciones de dígitos para mostrar en el display.
Sugiero que pongas tus dudas en el tema adecuado como ASM desde cero, además el archivo *.asm está generado por un compilador Basic, revisa los comentarios para que puedas ir entendiendo el pseudocódigo.


----------



## COSMICO (Ene 29, 2014)

Amigos, esto es un troso del código pbp, no se por que dicen que es asembler, también manejo asembler
no es de mi autoria eso si , solo lo estoy modificandolo.



Hola amigos, este es el código como les digo no es mio y esta aqui en el foro
Donde dice grabarRTC: se configura el Ds1307, pero no he podido pasarlo a formato 12 horas
y lo intento asi:
I2CWRITE DPIN,CPIN,%11010000,2,[$64]    ;formato 12 horas %01000000
        Pause 10  
I2CWRITE DPIN,CPIN,%11010000,2,[$12 & $127 ]    ;setear las 12 horas, 127 para no borras bit 6
Pause 10  

```
;------------------------------------------------------------------------
;Programa para escribir y leer un RTC DS1307
include "modedefs.bas"        

;OPTION_REG.7=1  

Define LCD_DREG PORTB     ;usamos puertoB como salida de datos
Define LCD_DBIT 4           
Define LCD_RSREG PORTB   ;RS va conectado a puertoB
Define LCD_RSBIT 2               ; RS a Rb5
Define LCD_EREG PORTB     ; E va conectado a puertoB
Define LCD_EBIT   3
DEFINE LCD_COMANDUS 2000 
DEFINE LCD_DATAUS 600


CPIN  Var PortA.3                 ;pin señal de reloj I2C
DPIN  Var PortA.4                 ;pin de datos I2C
UP    VAR PORTA.0
DOWN_MODE  VAR PORTA.1
SET   VAR PORTA.2
TX VAR PORTB.1
POS   VAR BYTE

X VAR BYTE
FLAG VAR BIT
TIMEX VAR BYTE

LIMIT VAR BYTE

segu    var byte   ;definir tamaño de variable segundos 1 a 255
minu    var byte                    ;variable para los minutos
hora    var byte                    ;variable para las horas
diaS    var byte                    ;variable día de la semana 
diaF    var byte                    ;variable día fecha del mes
mes     var byte                    ;variable mes 
anio    var byte                    ;variable año de 2 dígitos
XTEMP VAR BYTE
TEMP1 VAR BYTE

dato    VAR BYTE                 ;variable para almacenar dato leído
actualizado VAR BIT              ;variable para almacenar un 1 o 0

EEPROM 0,[0]        ;memoria 0 con el valor inicial 0 , sirve para
                        ;indicar que nunca ha corrido este programa
READ 0,actualizado    ;carga el valor de la memoria EEPROM dirección 0

IF actualizado =0 THEN grabarRTC   ;si es la 1ra vez que corre ir a grabar RTC
                                   ;caso contrario solo leer el RTC
INICIO:   
    I2CREAD DPIN,CPIN,%11010000,0,[segu]   ;leer los datos de mem. 0,            
    I2CREAD DPIN,CPIN,%11010000,1,[minu]   ;1,2,..y guardarlos en sus
    I2CREAD DPIN,CPIN,%11010000,2,[hora]   ;respectivas variables
    I2CREAD DPIN,CPIN,%11010000,3,[diaS] 
    I2CREAD DPIN,CPIN,%11010000,4,[diaF]             
    ;hora=((hora DIG 1)*16)+(hora DIG 0)
    ;minu=((minu DIG 1)*16)+(minu DIG 0)

   ;lcdout $fe,1,DEC2 hora,":",DEC2 minu,":",hex2 segu       
    lcdout $fe,1,HEX2 hora,":",HEX2 minu,":",HEX2 segu;, " ",DEC2 TEMP1   ;mostrar la
                          ;hora minuto y segundos en 2 dígitos (HEX2)
 
PAUSE 300                            ;esperar 0,3 segundo
    

goto inicio                         ;volver a leer los datos

; ************************ subrutina grabar *********************
grabarRTC:
      
    I2CWRITE DPIN,CPIN,%11010000,0,[$00]   ;setear 00 segundos
        Pause 10                     ;retardo para finalizar grabación
    I2CWRITE DPIN,CPIN,%11010000,1,[$39]   ;setear 39 minutos
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,2,[$23]    ;setear las 23 horas
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,3,[$5]    ;setear día lunes ,D=1,L=2
        Pause 10                              ;M=3 , M=4, J=5, V=6, S=7
    I2CWRITE DPIN,CPIN,%11010000,4,[$06]    ;setear día 27 del mes
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,5,[$8]    ;setear mes agosto
        Pause 50  
    I2CWRITE DPIN,CPIN,%11010000,7,[$10]   ;control %00010000 para
        Pause 10                           ;encender el led cada 1 seg.
    
    
    WRITE 0,1       ;escribe en la memoria 0 el valor de 1 para que no    
                    ;se vuelva a grabar otra vez estos datos en el RTC
    
    goto inicio                 ;ir a presentar los datos en el LCD
end
```


----------



## alex candelo q (Ene 29, 2014)

D@rkbytes dijo:


> Para que alguien te pueda ayudar necesitas adjuntar el código en PICBasic Pro, no el código en ensamblador que genera el compilador.
> 
> Este debe tener extensión *.bas ó *.pbp



Hola, aqui subo nuevamente todo con el codigo .bass.


----------



## COSMICO (Ene 29, 2014)

Hola amigos.
Ya solucione el problema, efectivamente tenia que hacer una or al escribir la hora para no borrar el bit am pm.Gracias a todos.


----------



## D@rkbytes (Ene 30, 2014)

alex candelo q dijo:


> quiero que cuente de 0 a 6 y viceversa y que donde va el cero ponga el 1 y donde va el 1 ponga el 0, es decir 1,0,2,3,4,5,6 y viceversa 5,4,3,2,0,1.


El programa que adjuntas está en Basic pero para el PIC Simulator IDE.
Es algo más parecido al Basic de PROTON IDE pero de todas formas los lenguajes son similares.

Cómo este tema trata de programas en PICBasic Pro, hice la conversión del código y así es como quedaría.

```
@ Device PIC16F84A    ; Microcontrolador utilizado
; Palabra de configuración:
@ Device XT_OSC,WDT_OFF,PWRT_ON
;*******************************************************************************

Digito Var Byte

Inicio:
    TRISB = $80
    PORTB = 6
    Clear

MainLoop:
    If PORTA.1 = 1 Then
    Pause 250
       Digito = Digito + 1
        If Digito > 6 Then
            Digito = 0
        Endif
    EndIf

    If PORTA.0 = 1 Then
    Pause 250
        If Digito = 0 Then
            Digito = 6
        Endif
        Digito = Digito - 1
    EndIf
    
    LookUp Digito,[6, $3F, $5B, $4F, $66, $6D, $7D], PORTB
    
Goto MainLoop


    End
```
Adjunto el proyecto para usarlo con el compilador PICBasic Pro y la simulación.



COSMICO dijo:


> Hola amigos.
> Ya solucione el problema, efectivamente tenia que hacer una or al escribir la hora para no borrar el bit am pm.Gracias a todos.


Que bueno que lo lograste. 

Cómo comentario, los mensajes anteriores estaban referidos a *alex candelo q
*Ya que él fue quién subió el código en ensamblador.* 

* Suerte.


----------



## COSMICO (Ene 30, 2014)

jeje gracias por la aclaracion amigo D@rkbytes
Ye se me hacía raro raro raro


----------



## alex candelo q (Ene 30, 2014)

D@rkbytes dijo:


> El programa que adjuntas está en Basic pero para el PIC Simulator IDE.
> Es algo más parecido al Basic de PROTON IDE pero de todas formas los lenguajes son similares.
> 
> Cómo este tema trata de programas en PICBasic Pro, hice la conversión del código y así es como quedaría.
> ...



Hola, muchisimas gracias D@rkbytes ,funciono bien , usare los dos codigos para hacer modificaciones para tratar de comprender algo de programacion de pic.
Estoy leyendo tambien el tema de asm desde cero.Suerte.


----------



## reyvilla (Ene 31, 2014)

Hola compañeros de vuelta por acá luego de mucho trabajo, ya logre ponerme de nuevo con el código del compañero cesarim luego de retomarlo con calma lo cambie un poquito pero en esencia lo que hice fue copiar y pegar varias veces las misma instrucciones para cada pulsador lo cual es bueno ya que si funciona con uno con los otros debe funcionar también ya que se repiten las misma sentencias en cada uno, revisalo y me avisas mucho éxito y saludos


----------



## COSMICO (Ene 31, 2014)

Bueno amigos. otra pregunta y a  esto ya le luche mucho, leí la ayuda de pbp y nada
Lo que quiero es en vez de enviar los datos directos al DS1307 con este formato [$12] el cual lo recibe bien.
este trozo de código.
I2CWRITE DPIN,CPIN,%11010000,2,[$12]    ;setear las 12 horas
Pause 10

Hacer lo siguiente

horas var byte; variable tipo byte horas
horas=0

IF porta.0 = 0 then
horas = horas + 1
I2CWRITE DPIN,CPIN,%11010000,2,[horas]    ;setear las 12 horas
Pause 10
ENDIF

de la anterior manera se escriben los datos en forma erronea despues del número 9
Tambien probe interponiendo el $ para formato hexa [$hora], pero sin efecto alguno
Como hago para pasar el dato de esta variable a su igual en hexadecimal, ya comprobe que este es el problema. Por ejemplo, 10 dcimal debe ser igual a 0x10 hexa para que el rtcc me lo reconozca bien y lo grabe como 10 en su registro.Segun la hoja del DS1307 los valores deben ser escritos en formato hexadecimal...


----------



## ByAxel (Ene 31, 2014)

COSMICO dijo:


> Por ejemplo, 10 dcimal debe ser igual a 0x10 hexa para que el rtcc me lo reconozca bien y lo grabe como 10 en su registro.Segun la hoja del DS1307 los valores deben ser escritos en formato hexadecimal...



Nop, el formato del RTC es BCD... 
El RTC no reconoce entre binario, decimal, hexa ya que es lo mismo pero el BCD tiene una regla que es cada 4 bits es un valor numérico de 0 a 9.

10 decimal = 0x0A en hexa. por aquí ya está mal.

No recuerdo pero creo que el PBP tiene para convertir binario a BCD y viceversa pero no es dificil.
> Para decenas 10 decimal / 10 = (1) división.
> Para unidades 10 decimal % 10 = (0) resto de división.
Con eso ya tienes separado el valor en BCD para luego unir los 4 bits de cada uno en una sola variable.
Saludos.


----------



## LaElectronicaMeOdia (Ene 31, 2014)

Hola compañeros.

estoy intentando establecer una comunicacion entre un pic18f2550 y un PC mediante USB, y estoy en el tipico error de que en proteus si funciona pero en la realidad no, el problema que presenta es que se conecta el circuito y se instala el controlador pero aparece un error y al volverlo a conectar el PC pone que no se recoconoce el dispositivo. 

yo supongo que son los fuses no se si podrian echarle una miradita al codigo del Pic.


```
@ __config _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
@ __config _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
@ __config _CONFIG2L, _PWRT_OFF_2L & _BOR_OFF_2L & _BORV_3_2L & _VREGEN_ON_2L
@ __config _CONFIG2H, _WDT_OFF_2H & _WDTPS_1_2H
@ __config _CONFIG3H, _MCLRE_OFF_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_OFF_3H
@ __config _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _ICPRT_OFF_4L &_XINST_OFF_4L & _DEBUG_OFF_4L
@ __config _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
@ __config _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
@ __config _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
@ __config _CONFIG6H, _WRTB_OFF_6H & _WRTC_OFF_6H & _WRTD_OFF_6H
@ __config _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
@ __config _CONFIG7H, _EBTRB_OFF_7H

DEFINE OSC 20          

USBBuffer        Var Byte[2] 
USBBufferCount   Var Byte 
Freq             var word 


usbinit 
main: 

 gosub DoUSBIn
 if usbbuffer[0]=1 then 
  toggle portb.0
  Freq=10130
  usbbuffer[0]=Freq.lowbyte
  usbbuffer[1]=Freq.highbyte
  gosub DoUSBOut
 endif

 freq=0
 
goto main

DoUSBIn:
   USBBufferCount = 2              
   USBService                                    
   USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   
   return
    
DoUSBOut:
   USBBufferCount = 2              
   USBService                                   
   USBOut 1, USBBuffer, USBBufferCount, DoUSBOut 
   return
```

anexo simulacion de proteus, visual basic y PBP


----------



## COSMICO (Ene 31, 2014)

si tienes razon amigo ByAxel
creo que me confundi, gracias, a ver sia hago la conversion


----------



## LaElectronicaMeOdia (Ene 31, 2014)

Ya solucione mi problema con el 18f2550, los codigos estaban bien, el error estaba en que al parecer la pasta de soldadura hacia puente entre las pistas de los pines del cristal, la limpie y raspe con un cepillito. todo ok. gracias.

ahora surgió otro problema con el circuito para medir Inductancias pero ese ya es otro rollo. vere si lo soluciono por mi mismo


----------



## dp500 (Feb 3, 2014)

Hola.
Me gustaria saber como ir sumando el valor de las teclas pulsadas en un teclado matricial, y luego me lo almacene en una variable y me lo muestre en eun LCD
Ejemplo. Si pulso en el teclado13579000 me almacene 13.579.000 y me lo muestre el LCD


----------



## LaElectronicaMeOdia (Feb 3, 2014)

una manera es que utilices la suma y un contador, algo como esto:

c=1
do
resultado=(resultado*c)+tecla
c=c*10
loop


----------



## dp500 (Feb 4, 2014)

Gracias.
Tenia la formula matematica, pero no sabia como pasarlo al basic.


----------



## cesarim (Feb 4, 2014)

Hola ReyVilla te agradesco por tu tiempo yo acabo de descargar el archivo lo pruebo y te comento pero desde ya muchas gracias por tu ayuda ya que ahora podre ver que es lo que me faltaba inmediatamente lo probare amigo gracias



Amigo funciona de maravillas te agradesco mucho a ti y a todos que siempre aportan sus conocimientos ahora tratare de ponerle un led que oscile tiempo de 2 seg para poder ver que este encendido la placa. muchas gracias amigo muchas gracias a todos


----------



## marconikov (Feb 27, 2014)

Saludos a todos compañeros.
Hoy les traigo 2 dudas que me han surgido de una guía practica de lenguaje basic para PICS.
La cuestión es la siguiente:
Nota: el PIC que estoy usando es un 16f84A.


```
1 Define    LCD_DREG    PORTB
2 Define    LCD_DBIT    0
3 Define    LCD_RSREG    PORTB
4 Define    LCD_RSBIT    4
5 Define    LCD_EREG    PORTB
6 Define    LCD_EBIT    5
7 trisb = 0
8 trisa = %00011
9 dato var byte
10 dato=25
11 lcdout $fe,1
12
13 inicio:
14 lcdout $fe,2,"P1 suma P2 resta" 
15 Lcdout $fe,$C0,"Dato: ",Dec Dato
16 if porta.0 = 0 and dato<50 then call suma
17 if porta.1 = 0 and dato>0 then call resta
18 goto inicio
19
20 suma:
21 dato = dato+1
22 pause 250
23 return
24
25 resta:
26 dato = dato-1
27 pause 250
28 return
29
30 END
```
Cómo ya saben, simplemente muestra en pantalla cuando sumo o resto, la duda es que en la guía me especifican que el comando de la linea 15 debe ser escrito así   

15 Lcdout $fe,$C0,"Dato: ",Dec Dato," "

Con ese espacio entre comillas, realmente desconozco el porque de eso, y es que si no coloco cuando empiezo a restar llega un punto en que el mensaje del display pierde coherencia con lo que hago y en vez de restar de 1 en 1, salta de 10 en 10 :S.
Me gustaría saber si alguien sabe cual es la función de ese espacio. OJO en la guía no me dicen en ningún momento el porque de ese espacio.
Bueno la otra cuestión es mas sencilla. ¿En que se diferencía un pic16f84A de un 16f84 ?  (sin la A)


----------



## D@rkbytes (Feb 27, 2014)

Sobre la primer pregunta:
Al utilizar *Dec* Dato, Si el resultado de Dato es de 3 dígitos (por ejemplo),
cuando el resultado sea de 2 ó 1 dígito, éste quedará a la izquierda de los dígitos anteriores y el resultado se verá confuso.
Para solucionar eso, debes utilizar *DecX* dónde *X* es la cantidad de dígitos a mostrar en el resultado.
Por ejemplo LCDOut $FE,$80,Dec4 Dato

Si el resultado es de 2 dígitos, se mostrará así: *0012
*
El espacio que se usó después de Dato,*" "* debe servir para borrar algo a la derecha del resultado.

Sobre la otra consulta, lee las hojas de datos para que veas cual es la diferencia entre ambos.


----------



## marconikov (Feb 27, 2014)

claro ! ya lo veo por eso es que la cuenta pierde coherencia
12
11
10
90
80
70
...
el espacio para quitar ese cero porque no se especifica el numero de dígitos, gracias por eso.
en cuanto a lo de la "A " ya tengo los datasheet a primera vista tiene que ver por como estan hecho (cmos)

Por cierto referente al código anterior hay algo que me tiene liado con todos los codigos, y es que por ejemplo cuando tengo que hacer las pausas no se por que PARA MI cuando simulo en Proteus tengo que escribir 250 en Microcode para que en la simulacion transcurra 1 s .. lo que pienso es que es una mala configuracion pero no se como arreglarlo


----------



## D@rkbytes (Feb 27, 2014)

marconikov dijo:


> Por cierto, referente al código anterior, hay algo que me tiene liado con todos los códigos, y es que por ejemplo, cuando tengo que hacer las pausas, no sé porque PARA MI cuando simulo en Proteus tengo que escribir 250 en Microcode para que en la simulación transcurra 1 s.
> Lo que pienso es que es una mala configuración pero no sé como arreglarlo.


Eso debe ser porque en proteus algunos PIC tienen por defecto como frecuencia de trabajo 1MHz y seguramente tu programa trabaja con 4MHz.

Cambia la frecuencia de trabajo del PIC en proteus de acuerdo a la frecuencia de trabajo de tu programa.


----------



## marconikov (Feb 28, 2014)

si, gracias compañero la opcion se llama "processor clock frecuency" y esta dandole a las propiedades del microcontrolandor en el proteus, vienen con una configuración por defecto.


----------



## vimato (Mar 1, 2014)

Buenas, quisiera saber si alguien me pudiera orientar en la comunicacion 1wire, ya tengo algunos conocimientos es programacion, quiero usar el sensor parallax colorpal con el PIC 16f877A, actualmente programo con PIC BASIC PRO....


----------



## chaires (Mar 1, 2014)

Hola  compañero sabrás si es posible lo que intento?
Lo que pasa es que tengo una impresora epson TMU-220 y quiero enviarle unos comandos Esc/Pos desde un pic  16F628 que tiene un puerto USART la impresora tiene RX y tx POR se me hizo posible poder usar este pic la verdad nunca en mi vida me habia metido en lo de la programacion de pic ni mucho menos se como grabarlo jejeje espero y me puedas orientar lo que quiero enviar al pic desde el puerto USART a la impresora epson es una leyenda y saber que la comunicación en ella si esta funcionando, pongo un ejemplo del los comandos Esc/Pos Y espero me puedas orientar a saber como lo puedo meter en el pic o si no es posible desde este pic basico me ayudes a buscar el optimo tengo varios proyectos y espero podamos colaborar juntos jjeje saludos
______________________
Ejemplo Esc/Pos
PRINT #1, CHR$(&H1B);"@"; 'Initializes the printer (ESC @)
PRINT #1, CHR$(&H1B);"a";CHR$(1);'Specifies a centered printing position (ESC a)
PRINT #1, CHR$(&H1B);"!";CHR$(0); 'Specifies font A (ESC !)
PRINT #1, "January 14, 2002 15:00"; 
PRINT #1, CHR$(&H1B);"d";CHR$(3); 'Prints and 3 line feeding (ESC d)
PRINT #1, CHR$(&H1B);"a";CHR$(0); 'Selects the left print position (ESC a)
PRINT #1, CHR$(&H1B);"!";CHR$(1); 'Selects font B
PRINT #1, "TM-U210B $20.00";CHR$(&HA);
PRINT #1, "TM-U210D $21.00";CHR$(&HA);
PRINT #1, "PS-170 $17.00";CHR$(&HA);
PRINT #1, CHR$(&HA); 'Line feeding (LF)
PRINT #1, CHR$(&H1B);"!";CHR$(17); 'Selects double-height mode
PRINT #1, "TOTAL $58.00"; CHR$(&HA);
PRINT #1, CHR$(&H1B);"!";CHR$(0); 'Cancels double-height mode
PRINT #1, "------------------------------";CHR$(&HA);
PRINT #1, "PAID $60.00";CHR$(&HA);
PRINT #1, "CHANGE $ 2.00";CHR$(&HA);
PRINT #1, CHR$(&H1D);"V";CHR$(66);CHR$(0); 'Feeds paper & cut
’Drawer Kick (ESC p)
PRINT #1, CHR$(&H1B); CHR$(&H70); CHR$(&H0); CHR$(60); CHR$(120); 
________________________________________________________________-
 La nota queda asi desde la impresora:






Aqui esta el manual esc/pos
y el datasheet del pic
http://content.epson.de/fileadmin/content/files/RSD/downloads/escpos.pdf
http://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf
saludos cordiales y gracias por cualquier ayuda brindada por adelantado


----------



## sml (Mar 6, 2014)

Como habrán notado soy nuevo en el foro, solicito sus comentarios y ayuda para terminar este proyecto con buen termino.
Estoy haciendo un contador en lcd, la idea es que graba la última cifra de la cuenta en la memoria interna hasta 65535, ya que le integro la memoria interna y solo me cuenta hasta 255 y se reinicia la cuenta de nuevo.
¿Alguien me puede ayudar por favor?
Anexo código en pbp. Saludos.

```
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
' Define registros y bits del LCD
Define    LCD_DREG    PORTB
Define    LCD_DBIT    0
Define    LCD_RSREG    PORTB
Define    LCD_RSBIT    4
Define    LCD_EREG    PORTB
Define    LCD_EBIT    5

CMCON = 7
Cnt VAR Word    ' variables cont con capacitas de 8 bytescapacidad de 65535
                  
TRISB = 0         ' PORTB es salida
PAUSE 500        ' retardo para inicializar el LCD
Cnt = 0            ' limpia contador  y lo coloca a cero
LCDOUT $FE,1    ' limpia LCD 

inicio:                          ; rutina de conteo
    if porta.0=0 then        'pregunta
    cnt = cnt + 50           ' Incrementa contador 
    write 0,cnt                'graba mem.int.
    pause 10
    read 0,cnt 'CAJA 255     'lee mem. int.
    PAUSE 10       
    LCDOUT $FE,2             ' inicio del cursor LCD
    LCDOUT "CNT = ", DEC Cnt ' muestra en el display cnt y su conteo en decimal             
    PAUSE 300                ' espera un 0.3 seg.
    endif
    
    GOTO inicio              ' crea un bucle cerrado
    END                        ' fin del programa
```


----------



## LaElectronicaMeOdia (Mar 7, 2014)

Tienes que ponerlo en dos partes
Para escribir :
Write 0,cnt.highbyte
Write 1,cnt.lowbyte
Para leer:
Read 0,cnt.highbyte
Read 1,cnt.lowbyte


----------



## sml (Mar 7, 2014)

LaElectronicaMeOdia dijo:


> Tienes que ponerlo en dos partes
> Para escribir :
> Write 0,cnt.highbyte
> Write 1,cnt.lowbyte
> ...



Gracìas funcionò de maravilla al ponener  el codigo recomendado, lo pueden usar los compañeros de este foro, hay se los dejo, saludos,


----------



## sml (Mar 9, 2014)

Ahora si me permiten compañeros del foro, quiero preguntarles que añadidura tengo que hacer para que me cuente hasta el limite word, pero ahora con mem. exterior, por su ayuda gracias de antemano.
Anexo mi programa:


```
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

' Define registros y bits del LCD
Define    LCD_DREG    PORTB
Define    LCD_DBIT    0
Define    LCD_RSREG    PORTB
Define    LCD_RSBIT    4
Define    LCD_EREG    PORTB
Define    LCD_EBIT    5

CMCON = 7
TRISA=%11111100
TRISB=%0

Symbol SDA = PORTA.1 ' Alias para RB0
Symbol SCL = PORTA.0 ' Alias para RB1
      I VAR Byte     ' Declaración de variable "I"
     A1 VAR Byte     ' Declaración de variable "A1"
Direc VAR Word       ' Declaración de variable "Direc"
Control VAR Byte     ' Declaración de variable "Control"
Dato VAR Byte        ' Declaración de variable "Dato"

Pause 200            ' Pausa de 200 milisegundos para la LCD
LCDOut $fe, 1        ' Limpia la LCD

      Control = %10100000 ' Dato de Control
      Direc = $00 ' Dirección en la memoria externa
      Dato = 0 ' Dato inicial a ser grabado
memoria1:
      IF PORTA.2=0 THEN  'pregunta
      Dato = Dato + 50     ' Suma 2 a la variable "Dato"
      pause 300
      I2Cwrite SDA, SCL, Control, Direc, [dato] ' Escribe la memoria
      Pause 10 ' Pausa de 10 milisegundos

      I2CREAD SDA, SCL, Control, Direc, [Dato]  ' Lectura de memoria
      LCDOUT $FE,1
     LCDOUT $fe, 2,"Dato ",#Dato                   ' Muestra el dato leido
      Pause 1000 ' Pausa de 1 segundo      
      ENDIF         'medio fin

GoTo memoria1 ' Salta a la etiqueta memoria a empezar nvo.
End
```


----------



## ferdy575 (Mar 16, 2014)

hola a todos yo otra vez por aquí preguntando bobadas a ver sí me pueden ayudar, quisiera saber sí es posible crear un programa en basic donde yo pueda escoger varias funciones y estas estén en asm, algo así:

IF PORTA.0 = 1 THEN
c1	equ		h'0c'
	org		h'00'
reset
	goto	start
	org		h'04'
start
	mov1w	h'09'
	movwf	c1
loop
	incfsz	c1,F
	goto	loop
	goto	start
ENDIF


----------



## papirrin (Mar 16, 2014)

si pero tienes que indicar cuando va a ser en ASM algo asi

ASM
   bsf PORTA, 0 ; Set bit 0 on PORTA
   bcf PORTB, 0 ; Clear bit 0 on PORTB
ENDASM


----------



## D@rkbytes (Mar 16, 2014)

ferdy575 dijo:


> ¿Quisiera saber sí es posible crear un programa en basic dónde yo pueda escoger varias funciones y éstas estén en asm?


Si se puede, pero si quieres usar las variables dentro de un bloque en ensamblador en otra parte del programa, se tienen que usar diferente, "poniendo un guión bajo" para que el compilador distinga los punteros.

Mira este ejemplo en donde muestro como hacer lo que necesitas: _*Post #2379*_

Suerte.


----------



## papirrin (Mar 16, 2014)

D@rkbytes dijo:


> Si se puede, pero si quieres usar las variables dentro de un bloque en ensamblador en otra parte del programa, se tienen que usar diferente, "poniendo un guión bajo" para que el compilador distinga los punteros.
> 
> Mira este ejemplo en donde muestro como hacer lo que necesitas: _*Post #2379*_
> 
> Suerte.



en tu codigo:

```
Loop100Ms
	decfsz	_Cnt1,F
	goto	$+2
	decfsz	_Cnt2,F
	goto	Loop100Ms
	goto	$+1
	nop
	return
```

porque pones el Goto $+1 y delante un nop seguido del return, ¿que no seria lo mismo poner?:

```
Loop100Ms
	decfsz	_Cnt1,F
	goto	$+2
	decfsz	_Cnt2,F
	goto	Loop100Ms
	return
```

o ¿cual es el fin de ponerlos?


----------



## D@rkbytes (Mar 16, 2014)

papirrin dijo:


> en tu codigo:
> 
> ```
> Loop100Ms
> ...


Como son rutinas anidadas, los nop cuentan como ciclos de instrucción.
Si omites los nop, el retardo generado no será tan preciso.


----------



## Alcocer Garcia Felix Davi (Abr 6, 2014)

Esta es la simulacion de un perrito en una lcd usando un algoritmo conocido , el perrito se desplaza de derecha a izquierda y viceversa , tengo la duda de por q no sale el cuerpo completo del perrito aqui adjunto el programa , la simulacion y el libro donde lo saque gracias.


----------



## papirrin (Abr 6, 2014)

en la configuracion del pic en proteus ponle que corra a una velocidad de 1MHz. teoricamente en la realidad no deberia pasar.


----------



## Alcocer Garcia Felix Davi (Abr 6, 2014)

bueno papirrin te agradezco el comentario pero como es eso de que en la realidad eso no sucederia??


----------



## papirrin (Abr 6, 2014)

es que en esa simulacion el pic a 8MHZ envia mas rapido los datos al LCD y se satura. en la realidad el LCD es mucho mas veloz.

si en la realidad pasa prueba con los retardos:

DEFINE LCD_COMMANDUS 2000 'Command delay time in us 
DEFINE LCD_DATAUS 50 'Data delay time in us


----------



## kayito4036 (Abr 9, 2014)

Tambien poedes entrar en la configuracion del LCD en proteus ponle que corra a una velocidad de 20MHz y listo puedes verlo correr a la velocidad que es, claro tienes que volver a colocarle la velocidad al pic, espero me entiendan.


----------



## terminator (Abr 11, 2014)

Saludos amigos listeros, estoy realizando unos programas en picbasic pro para el 16F628A y tengo una gran duda con las siguientes líneas de programa que no logro entender.
Espero su valiosa ayuda. Gracias de antemano.

Aquí parte del programa:
.....
eprom1="0"

PAUSE 100
READ 0, eprom1
IF eprom1=255 THEN grabar_clave
GOTO Bienvenida

grabar_clave:
Write 0, n1
....

Se supone que eprom1 vale cero. ¿Entonces qué quiere preguntar cuando eprom1=255?
Yo me he dado cuenta que al inicio del programa (con la memoria limpia) siempre se ejecuta "grabar_clave", logrando de esta manera en forma inicial guardar los datos iniciales en n1, n2... en la memoria eeprom para luego introducirlos como la clave.
Pero lo que no entiendo es. ¿Por qué con el IF está preguntando si eprom1=255, por qué no dice otro valor?
Ahora si se ejecuta inicialmente "grabar_clave" es por qué el IF dio un SI.
¿Pero cómo puede dar un SI, si dice que eprom1 (que vale 0) será igual a 255?

Saludos.

Terminator


----------



## papirrin (Abr 11, 2014)

No cuando inicia asigna el codigo ascii a eprom1 como lo tienes, el que parece ser 48 necesitas quitar las comillas asi:

```
n1 var byte
eprom1 var byte

eprom1=0
[COLOR="red"]'aqui siiii... eprom1 vale 0[/COLOR]
PAUSE 100
[COLOR="blue"]'no tiene sentido que antes declares a eprom1=0 si haces la lectura de la eeprom[/COLOR]
READ 0, eprom1
[COLOR="red"]'aqui si no se ha grabado la eeprom con n1 , eprom1 vale 255[/COLOR]
IF eprom1=255 THEN grabar_clave
GOTO Bienvenida

grabar_clave:
[COLOR="Red"]??? aqui a n1 nunca le dices cuanto vale?[/COLOR]
Write 0, n1
pause 10

' debes poner una pausa de 10ms para que complete la grabacion
```

siempre entra al iniciar porque la memoria por defecto esta en 255 (FF)


----------



## papirrin (Abr 12, 2014)

Solicito apoyo en picbasicpro + ASM , requiero de hacer un retardo de 100ms en mitad de un codigo, segun yo va asi y me gustaria que me lo revizaran.
FOsc= 20Mhz
Ciclo instruccion .2uS

pseudocodigo:

```
Define Osc 20
cnt1             var byte
cnt2             var byte
cnt3             var byte

main:
  .
  .
  .
 cnt1=249
 cnt2=3
 Cnt3=100
 asm
 ;retard0 de 100 ms
retardo  
  nop  ;.2uS
  nop  ;.4uS
  nop  ;.6uS
  decfsz  _cnt1,f ;.8uS
  goto    retardo ; 1uS
  decfsz  _cnt2,f ; 250uS*4=1mS
  goto    retardo
  decfsz  _cnt3,f;1ms*100=100mS
  goto    retardo
 endasm 
   .
   .
   .
 Goto main
```

en lo que me confundo mucho es en la cuenta de los ciclos decfsz


----------



## D@rkbytes (Abr 12, 2014)

papirrin dijo:


> Solicito apoyo en picbasic pro + ASM , requiero de hacer un retardo de 100ms en mitad de un código.
> FOsc= 20Mhz
> Ciclo instrucción .2uS


Prueba con este código de retardo (100Ms. @ 20MHz.)

```
retardo
    movlw    0x03
    movwf    _cnt1
    movlw    0x18
    movwf    _cnt2
    movlw    0x02
    movwf    _cnt3
retardo_0
    decfsz    _cnt1,f
    goto    $+2
    decfsz    _cnt2,f
    goto    $+2
    decfsz    _cnt3,f
    goto    retardo_0
    goto    $+1
    return
```



papirrin dijo:


> en lo que me confundo mucho es en la cuenta de los ciclos decfsz


Mira por aquí: http://www.golovchenko.org/cgi-bin/delay 

Suerte.


----------



## papirrin (Abr 12, 2014)

Gracias Darkbytes 

no hay problema que asigne los valores a las variables fuera del retardo no? para que no me "gaste" los microsegundos al declararla, puesto que hago una activacion de interrupcion asi:

pseudocodigo:

```
cnt1=3 [COLOR="Blue"]'asigno valores de retardo[/COLOR]
 cnt2=24
 Cnt3=2
 TMR0L=0
 HIGH GIE  [COLOR="blue"]'activo interrupcion[/COLOR]
 input F_Port [COLOR="blue"]'cambio puerto a entrada[/COLOR]
 asm
retardo  
  decfsz _cnt1,f
  goto $+2
  decfsz _cnt2,f
  goto $+2
  decfsz _cnt3,f
  goto retardo
  goto   $+1
  goto   $+1
  goto   $+1
 endasm  
 output F_Port [COLOR="blue"]'cambio como salida el puerto [/COLOR]
 T0_High = TMR0L [COLOR="blue"]' tomo lectura de tiempo[/COLOR]
```


----------



## D@rkbytes (Abr 12, 2014)

papirrin dijo:


> Gracias Darkbytes
> 
> ¿No hay problema que asigne los valores a las variables fuera del retardo? Para que no me "gaste" los microsegundos al declararla, puesto que hago una activacion de interrupcion asi:


Si existe problema si asignas los valores fuera del bucle de retardo ya que se requiere reasignar los valores cada vez que se ingresa a la rutina.

¿Por qué? Por que cada vez que se sale de la rutina quedan almacenados otros valores en las variables.
Por lo tanto la rutina ya no funcionará, tal vez solo funcione la primer vez que se llama.

Y si cargas las variables antes de llamar a la rutina de retardo, da igual que si estuvieran dentro.

Nota:
Me faltó aclarar que al nombre de la rutina también hay que ponerle un guión bajo para poderla llamar.
También se puede nombrar como se hace normalmente con las etiquetas, pero antes de entrar al bloque ASM.

Saludos.


----------



## papirrin (Abr 14, 2014)

No funciona 

algo estoy haciendo mal no hace caso a las instrucciones de ASM, sera porque compilo con MPASM? 

-utilizo un pic18f2550, y me he dado cuenta que va a 48MHz porque utilizo el PLL5y div 2.
-el codigo no es mas que oscilar un led.

pseudocodigo:

```
define osc 48
d1               var byte
d2               var byte
d3               var byte
main:
 
 toggle led1
  asm
	movlw	0xA3
	movwf	_d1
	movlw	0x9E
	movwf	_d2
	movlw	0x03
	movwf	_d3
Delay_0
	decfsz	_d1, f
	goto	$+2
	decfsz	_d2, f
	goto	$+2
	decfsz	_d3, f
	goto	Delay_0
     
			;6 cycles
 [B][COLOR="Red"]'aqui arroja un warning en los tres goto,
 dice  que el destino de la direccion  debe ser un word  alineado y se pasma el pic, 
si los  quito no se pasma pero no hace el retardo
(Warning:destination address must be word aligned)[/COLOR][/B]
	goto	$+1 
	goto	$+1 '  
	goto	$+1

 endasm

Goto Main
```

el algoritmo de retardo si lo hago desde MPLAB si funciona en un pic 16f628A

mi opinion es que no funcionan los $+1 y $+2 creo 



Vaya!!!!!!!

si era eso no reconoce los $+1 y $+2
lo deje asi y funciona 
psudocodigo:

```
movlw	0xA3
	movwf	_d1
	movlw	0x9E
	movwf	_d2
	movlw	0x03
	movwf	_d3
Delay_0
	decfsz	_d1, 1
    goto	ex1
	decfsz	_d2, 1
ex1	
    goto	ex2
	decfsz	_d3, 1
ex2	
	goto	Delay_0
```


----------



## papirrin (Abr 17, 2014)

Amigos no se si ya lo mencionaron pero hoy me acabo de enterar,  en el MicrodeStudio 5 con PBP3 se pueden utilizar Variables tipo Long de 32Bits, solo se tiene que poner en la linea de commando un -n

asi:


----------



## D@rkbytes (Abr 17, 2014)

papirrin dijo:


> Amigos, no sé si ya lo mencionaron pero hoy me acabo de enterar,  en el MicrodeStudio 5 con PBP3 se pueden utilizar Variables tipo Long de 32Bits, solo se tiene que poner en la línea de comando un -n


Sip, pero únicamente funciona con los PIC18 



			
				La ayuda de PBP3 dijo:
			
		

> Use Compiler Long Words. If enabled, LONG variables are made available. This  mode is only available when compiling for a target device with the PIC18 prefix.  LONG variables are interpreted as  twos-complement, signed values.



Saludos.


----------



## papirrin (Abr 17, 2014)

no habia visto eso  , bueno ya es un avance hacia  los 32bits XD


----------



## caiman93 (Abr 18, 2014)

Duda programa 16f88 para entrada analogica y PWM
Hola amigos,

Estoy aprendiendo poco a poco en esto de programar PIC en PBP , y temas de entradas y salidas digitales, mas o menos lo controlo (al menos lo básico).
Me gustaria en un 16f88, tener una entrada analogica con un potenciometro entre 0 y 5v, y una salida PWM para poder controlar un servomotor que varie su posicion segun el valor del potenciometro.
e estado pensando el asunto y e visto q el funcionamiento de un joystick es algo parecido y me gustaria intentarlo asi que si me podrian ayudar estaria agradecido

Me podeis orientar un poco sobre como diseñar el programa.

Gracias!!!! ...


----------



## papirrin (Abr 19, 2014)

> Me gustaria en un 16f88, tener una entrada analogica con un potenciometro entre 0 y 5v,



ve la funcion pot



> una salida PWM para poder controlar un servomotor que varie su posicion segun el valor del potenciometro.



puedes ver la funcion PWM, aunque no estoy muy seguro si lo que necesitas es un PWM por hardware.


----------



## ferdy575 (Abr 23, 2014)

Hola muchachos de nuevo vengo por aquí a molestar, a ver les cuento resulta que nunca he usado las memorias I2C pues nunca las he necesitado, y me dio por estudiar este interesante tema y encontré en un libro de basic para pics un programa que supuestamente escribe y lee la memoria, pero en el proteus no da ninguna señal de vida y como no conozco del tema no se que le faltara ó que estará mal aquí les subo los archivos para que los vean a ver sí me pueden ayudar. 
Ahí me disculpan la molestadera


----------



## D@rkbytes (Abr 23, 2014)

ferdy575 dijo:


> encontré en un libro de basic para pics un programa que supuestamente escribe y lee la memoria, pero en el proteus no da ninguna señal de vida y como no conozco del tema no sé que le faltará ó que estará mal


1.- Estás poniendo el pin RS en el pin RA4 y ese pin es Open Drain, coloca una resistencia pull-up.
2.- En el diseño tienes el pin E en el pin RB3, pero en el código estás seleccionando RA5.
3.- Esto es opcional, pero te falta agregar la palabra de configuración.

Saludos.


----------



## ferdy575 (Abr 23, 2014)

D@rkbytes dijo:


> 1.- Estás poniendo el pin RS en el pin RA4 y ese pin es Open Drain, coloca una resistencia pull-up.
> 2.- En el diseño tienes el pin E en el pin RB3, pero en el código estás seleccionando RA5.
> 3.- Esto es opcional, pero te falta agregar la palabra de configuración.
> 
> Saludos.



hola darkbytes gracias por mirar mi proyecto, lo acabo de mirar y tienes razón con estos errores pero ya los corregí y sigue sin funcionar, aquí pongo de nuevo los archivos para que los vean y adicionalmente puse el pedacito del libro de donde saque el proyecto para que lo vean a ver sí es que me equivoque en algo para que por favor me colaboren.


----------



## D@rkbytes (Abr 23, 2014)

ferdy575 dijo:


> Hola D@rkbytes, gracias por mirar mi proyecto, lo acabo de mirar y tienes razón con estos errores pero ya los corregí y sigue sin funcionar


Debería funcionar, mira el archivo que adjunto con las correcciones que te mencioné.


----------



## papirrin (Abr 23, 2014)

Porque dices que no funciona? yo lo probe y si funciona 

otra cosa es que no tiene sentido el If que pones dentro de For..Next  y las etiquetas leer: escribir:

ponlo asi


```
Define Osc 4 ' Define el Oscilador para un Cristal de 4 Mhz.

DEFINE  LCD_BITS 4
Define	LCD_DREG	PORTA
Define	LCD_DBIT	0
Define	LCD_RSREG	PORTA
Define	LCD_RSBIT	4
Define	LCD_EREG	PORTB
Define	LCD_EBIT	3              
DEFINE LCD_COMMANDUS 2000

Symbol SDA = PORTB.0 ' Alias para RB0
Symbol SCL = PORTB.1 ' Alias para RB1

I       VAR Byte ' Declaración de variable "I"
A1      VAR Byte ' Declaración de variable "A1"
Direc   VAR Word ' Declaración de variable "Direc"
Control VAR Byte ' Declaración de variable "Control"
Dato    VAR Byte ' Declaración de variable "Dato"

Pause 200 ' Pausa de 200 milisegundos para la LCD

LCDOut $fe, 1 ,"HOLA"

Direc   = $00 ' Dirección en la memoria externa
Control = $A0 ' Dato de Control
Dato    = 1 ' Dato inicial a ser grabado

For I = 0 To 49 ' Repetición
 I2Cwrite SDA, SCL, Control, Direc, [dato] ' Escribe la memoria
 pause 10 ' Pausa de 10 milisegundos
 Direc = Direc + 1 ' Suma 1 a la variable "Direc"
 Dato = Dato + 2 ' Suma 2 a la variable "Dato"
Next I

LCDOUT $fe, 2,"Datos Grabados" ' Muestra mensaje por la LCD
Pause 2000 ' Pausa de 2 segundos

LCDOut $fe, 2,"Inicia Lectura" ' Muestra mensaje por la LCD
Pause 2000 ' Pausa de 2 segundos

Direc = $00 ' Inicializa la dirección en la memoria externa

For I = 0 To 49 ' Repetición
 I2CREAD SDA, SCL, Control, Direc, [A1] ' Lectura de memoria
 LCDOUT $fe, 2,"Dato ",#I,": ",#A1," " ' Muestra el dato leido
 Pause 1000 ' Pausa de 1 segundo
 Direc = Direc + 1 ' Suma 1 a la variable "Direc"
Next I

GoTo Final ' Salta a la etiqueta "final"
End
```


----------



## ferdy575 (Abr 23, 2014)

MUCHACHOS muchas gracias los felicito ustedes son unos MONSTRUOS para esta vaina ese bicho funciono de maravilla, y no era mucho lo que le faltaba pero ustedes lo hicieron funcionar, nuevamente gracias.


----------



## torres.electronico (Abr 24, 2014)

Buenas; hace un tiempo habia implementado unas librerias para atender interrupciones no convencionales mienras trabajabael micro... No recuerdo la pagina y justo ahora que las necesitabas para o presindir de otro micro  
Basicamente me refiero a que en esta alarma que estoy jugando, tengo un modem enfora, el cual enviar u realizar llamados no es el problema... el problema es que no puedo leer mensajes u respuestas del modem y colocarlas en el display sin que me pare el programa por la instruccion serin...por que? por que serin pausa el programa y se queda esperando el dato entrante. Si bien puedo configurar el tiempo de espera y luego saltar a una etiqueta...el problema es uqe puedo perder mensajes... Implemente interrupciones por tiempo y tampoco sirve...
Si alguien recuerda esta pagina que sugiere estas interrupciones no convencionales, o tiene algunas idea, se lo voy agradecer...
Les comparto lo qe hay hasta el momento...una alarma con teclado y al detectar el disparo de la entrada portb.0, manda un sms al numero prefijado en la programacion... como esta, funciona, pero si no le encuentro solucion, para poder exprimir mas el modem, tendre que usar otro pic mas y que este se encargue solo del modem, y el 16f877 del teclado, lcd y sensores...


```
include "modedefs.bas"
define OSC 4

ADCON1 = %00001111 
TRISA = %00001111
TRISB = %00011111
TRISC = %10000000
TRISD = %00000011
TRISE = %00000000
;*************** DISPLAY LCD ****************
DEFINE LCD_DREG PORTD 
DEFINE LCD_BITS 4                
DEFINE LCD_DBIT 4                
DEFINE LCD_RSREG PORTD 
DEFINE LCD_RSBIT 2              
DEFINE LCD_EREG PORTD 
DEFINE LCD_EBIT 3               
DEFINE LCD_LINES 2              
POS1 var Byte
POS2 var Byte
POS3 var Byte
POS4 var Byte
POS1 = $C0 
POS2 = $C1 
POS3 = $C2 
POS4 = $C3
LCDOUT $FE,$40,$00,$00,$10,$0F,$0F,$0D,$18,$10 
LCDOUT $FE,$48,$04,$0E,$1F,$1C,$1C,$1C,$06,$05 
LCDOUT $FE,$50,$00,$00,$10,$0F,$0F,$0D,$04,$06 
LCDOUT $FE,$58,$04,$0E,$1F,$1C,$1C,$1C,$08,$18 
LCDOUT $FE,$60,$04,$0E,$1F,$07,$07,$07,$02,$03 
LCDOUT $FE,$68,$00,$00,$01,$1E,$1E,$16,$04,$0C 
LCDOUT $FE,$70,$04,$0E,$1F,$07,$07,$07,$0C,$14 
LCDOUT $FE,$78,$00,$00,$01,$1E,$1E,$16,$03,$01 

;**************** TECLADO ******************
UNO      VAR PORTB.1 
DOS      VAR PORTB.2
TRES     VAR PORTB.3
CUATRO   VAR PORTB.4
A        VAR PORTB.5 
B        VAR PORTB.6
C        VAR PORTB.7
D        VAR PORTC.0

;*************** SALIDAS ********************
LEDROJO      VAR PORTE.0
LEDVERDE      VAR PORTE.1
SIRENA   VAR PORTE.2
SONIDO    VAR PORTA.5
;*************** VARIABLES ******************
bData   Var Byte
BANDERA VAR BYTE
BANDERA1 VAR BYTE
BANDERA2 VAR BYTE
NUMERO   VAR BYTE 
R        VAR BYTE 
SET1 VAR BYTE
SET2 VAR BYTE
SET3 VAR BYTE 
SET4 VAR BYTE
dato VAR WORD 
seguridad_ON var byte

On Interrupt GoTo ZONA 
INTCON = %10010000 

LCDOUT $FE,1
LCDOUT "INICIO SISTEMA"
LCDOUT $FE,$C2,"DE SEGURIDAD"
PAUSE 1000
GOSUB perroGUARDIAN 
LCDOUT $FE,1
BANDERA = 0
INICIANDO:
FOR R=1 TO 2

HIGH LEDROJO:HIGH LEDVERDE:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW LEDVERDE:LOW SONIDO
PAUSE 100
NEXT

LCDOUT $FE,$C0, 0
;******************GUARDAR LA CLAVE EN LA MEMORIA EEPROM************************
EEPROM 0,[1,2,3,4]
;*******************************************************************************

ARRANQUE:
PAUSE 500
LCDOUT $FE,1
LCDOUT "(*)S/N (#)Config"
LCDOUT $FE,$C0,"(0) PRUEBA GSM"
BANDERA = 0
;*******************************************************************************
LOW A
IF UNO=0 THEN NUMERO=1:RETURN
IF DOS=0 THEN NUMERO=2:RETURN
IF TRES=0 THEN NUMERO=3:RETURN
HIGH A
;*******************************************************************************
LOW B
IF UNO=0 THEN NUMERO=4:RETURN
IF DOS=0 THEN NUMERO=5:RETURN
IF TRES=0 THEN NUMERO=6:RETURN
HIGH B
;*******************************************************************************
LOW C
IF UNO=0 THEN NUMERO=7:RETURN
IF DOS=0 THEN NUMERO=8:RETURN
IF TRES=0 THEN NUMERO=9:RETURN
HIGH C
;*******************************************************************************
LOW D
IF UNO=0 THEN mensajeACTIVADO
IF DOS=0 THEN MODEM
IF TRES=0 THEN GRABAUNO
HIGH D
PAUSE 25
GOTO ARRANQUE

mensajeACTIVADO:
GOSUB perroGUARDIAN
LCDOUT $FE,1
LCDOUT $FE,2," SISTEMA ALARMA "
LCDOUT $FE,$C0,"    ACTIVADA    "
PAUSE 2000
LCDOUT $FE,1
BANDERA = 1
GOTO RESETEO

RESETEO:
;LOW PUERTA
LCDOUT $FE,1
FOR R=1 TO 2
HIGH LEDROJO:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW SONIDO
PAUSE 100
IF D=0 AND UNO=0 THEN RESETEO
NEXT

READ 0,SET1
READ 1,SET2
READ 2,SET3
READ 3,SET4

GOSUB TECLAUNO

GRABAUNO:
lcDout $FE,1
LCDOUT $FE,3,"INGRESE SU CLAVE":LCDOUT $FE,$C3,"ANTERIOR"
PAUSE 1000
GOSUB TCLAUNO
RETURN

TCLAUNO:
LCDOUT $FE,1
LCDOUT $FE,2,"CLAVE ANTERIOR:"
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET1 THEN GOSUB TCLADOS
GOTO FALSO

TCLADOS:
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET2 THEN GOSUB TCLATRES
GOTO FALSO1

TCLATRES:
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET3 THEN GOSUB TCLACUATRO
GOTO FALSO2

TCLACUATRO:
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET4 THEN GOSUB GRABA_1
GOTO FALSO3

GRABA_1:
LCDOUT $FE,1
LCDOUT $FE,2,"INGRESE SU NUEVA":LCDOUT $FE,$C3,"CLAVE:"
LCDOUT $FE,$C5
GOSUB PTECLA:HIGH LEDROJO
GOSUB BARRIDO:GOSUB PTECLA
HIGH LEDROJO
WRITE 0,NUMERO

GRABADOS:

GOSUB BARRIDO:GOSUB PTECLA
GOSUB PTECLA:HIGH LEDROJO
HIGH LEDROJO
WRITE 1,NUMERO
GRABATRES:

GOSUB BARRIDO:GOSUB PTECLA
GOSUB PTECLA:HIGH LEDROJO
HIGH LEDROJO
WRITE 2,NUMERO

GRABACUATRO:

GOSUB BARRIDO:GOSUB PTECLA
GOSUB PTECLA:HIGH LEDROJO
HIGH LEDROJO
WRITE 3,NUMERO
LOW D
IF D=0 AND UNO=0 THEN RESETEO
HIGH D
PAUSE 500
LCDOUT $FE,1
LCDOUT $FE,2,"NUEVA CLAVE HA"
LCDOUT $FE,$C0,"SIDO CONFIGURADA"
PAUSE 2000
GOTO ARRANQUE

BARRIDO:
;*******************************************************************************
LOW A
IF UNO=0 THEN NUMERO=1:RETURN
IF DOS=0 THEN NUMERO=2:RETURN
IF TRES=0 THEN NUMERO=3:RETURN
HIGH A
;*******************************************************************************
LOW B
IF UNO=0 THEN NUMERO=4:RETURN
IF DOS=0 THEN NUMERO=5:RETURN
IF TRES=0 THEN NUMERO=6:RETURN
HIGH B
;*******************************************************************************
LOW C
IF UNO=0 THEN NUMERO=7:RETURN
IF DOS=0 THEN NUMERO=8:RETURN
IF TRES=0 THEN NUMERO=9:RETURN
HIGH C
;*******************************************************************************
LOW D
IF UNO=0 THEN GOSUB BORRAR
IF DOS=0 THEN NUMERO=0:RETURN
IF TRES=0 THEN GOSUB GRABAUNO
HIGH D
PAUSE 25
GOTO BARRIDO
;*******************************************************************************

PTECLA:

HIGH LEDROJO:HIGH SONIDO
PAUSE 100
LOW LEDROJO:LOW SONIDO

ESPACIO:
IF UNO=0 THEN ESPACIO
IF DOS=0 THEN ESPACIO
IF TRES=0 THEN ESPACIO
PAUSE 25
RETURN

TECLAUNO:
LCDOUT $FE,2,"INTRODUCIR CLAVE"
GOSUB BARRIDO
LCDOUT $FE,$C5, "*"
GOSUB PTECLA
IF NUMERO=SET1 THEN TECLADOS
GOTO FALSO

TECLADOS:
GOSUB BARRIDO
LCDOUT "*"
GOSUB PTECLA
IF NUMERO=SET2 THEN TECLATRES
GOTO FALSO1

TECLATRES:
GOSUB BARRIDO
LCDOUT "*"
GOSUB PTECLA
IF NUMERO=SET3 THEN TECLACUATRO
GOTO FALSO2

TECLACUATRO:
GOSUB BARRIDO
LCDOUT "*"
GOSUB PTECLA
IF NUMERO=SET4 THEN ABRIR
GOTO FALSO3

ABRIR:
LCDOUT $FE,1
LCDOUT $FE,2," CLAVE CORRECTA"
;HIGH PUERTA
FOR R=1 TO 4
HIGH LEDVERDE:HIGH SONIDO
PAUSE 200
LOW LEDVERDE:LOW SONIDO
NEXT
PAUSE 500
LOW D
IF D=0 AND UNO=0 THEN BORRAR
HIGH D
PAUSE 25
GOTO mensajeDESACTIVADO

FALSO:
GOSUB BARRIDO:GOSUB PTECLA:LCDOUT $FE,$C5, "*"
FALSO1:
GOSUB BARRIDO:GOSUB PTECLA:LCDOUT "*"
FALSO2:
GOSUB BARRIDO:GOSUB PTECLA:LCDOUT "*"
FALSO3:
LCDOUT $FE,1
FOR R=1 TO 10
HIGH LEDROJO:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW SONIDO
NEXT
IF D=0 AND UNO=0 THEN BORRAR

ALERTA:
LCDOUT $FE,2,"CLAVE INCORRECTA"
HIGH LEDROJO:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW SONIDO
LOW D
IF D=0 AND UNO=0 THEN BORRAR
HIGH D
GOTO ALERTA 

BORRAR:

LCDOUT $FE,1
GOSUB RESETEO
RETURN

mensajeDESACTIVADO:
PAUSE 1500
LOW SIRENA
BANDERA = 0
LCDOUT $FE,1
LCDOUT $FE,2," SISTEMA ALARMA "
LCDOUT $FE,$C0,"  DESACTIVADA   "
PAUSE 2000
GOTO ARRANQUE

MODEM:
LCDOUT $FE,1
LCDOUT $FE,2,"PRUEBA MODEM GSM"
LCDOUT $FE,$C0,"    ACTIVADA    "

PRUEBA1:
PAUSE 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGR=1"
serout PORTC.6,T9600,["AT+CMGR=1",10,13]
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA2,[],dato
LCDOUT $FE,$C0,DEC DATO

PRUEBA2:
PAUSE 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGD=1"
SEROUT PORTC.6,T9600,["AT+CMGD=1",10,13]
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA3,[],dato
LCDOUT $FE,$C0,DEC DATO

PRUEBA3:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGD=2"
SEROUT PORTC.6,T9600,["AT+CMGD=2",10,13]
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA4,[],dato
;SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,DEC DATO

PRUEBA4:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGF=1"
SEROUT PORTC.6,T9600,["AT+CMGF=1",10,13]
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA5,[],dato
;SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,DEC DATO

PRUEBA5:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"2976256173"
SEROUT PORTC.6,T9600,["AT+CMGS=",34,"2976256173",34,10,13]
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA6,[],dato
;SERIN PORTC.7,T9600,DATO  
LCDOUT $FE,$C0,DEC DATO

PRUEBA6:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"SMS: PRUEBA TEL"
SEROUT PORTC.6,T9600,["PRUEBA TEL",26,10,13] 
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA7,[],dato
;SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,# DATO
pause 1000

PRUEBA7:
PAUSE 1500
LCDOUT $FE,1
LCDOUT $FE,2,"PRUEBA TERMINADA"
LCDOUT $FE,$C0,"   REINICIANDO  "
;SEROUT PORTC.6,T9600,["ATS10=254",10,13]
;serin PORTC.7,T9600,[],dato
;serin PORTC.7,T9600,2000,arranque,[],dato
PAUSE 2000
GOTO ARRANQUE

perroGUARDIAN:
LCDOUT $FE,POS1, 0 
LCDOUT $FE,POS2, 1 
Pause 300
LCDOUT $fe, 1 
LCDOUT $FE,POS3, 2 
LCDOUT $FE,POS4, 3 
Pause 300
POS1 = POS1 + 3
POS2 = POS2 + 3
POS3 = POS3 + 3
POS4 = POS4 + 3
If POS4 > $CF Then RETRO 

goto perroguardian 

RETRO:
POS1 = $CF
POS2 = $CE
POS3 = $CD
POS4 = $CC
RETROCEDE:
LCDOUT $fe, 1 
LCDOUT $FE,POS1, 7 
LCDOUT $FE,POS2, 6 
Pause 300
LCDOUT $fe, 1 
LCDOUT $FE,POS3, 5 
LCDOUT $FE,POS4, 4 
Pause 300

POS1 = POS1 - 3
POS2 = POS2 - 3
POS3 = POS3 - 3
POS4 = POS4 - 3
If POS4 < $C0 Then REINICIA 
GoTo RETROCEDE

REINICIA:
POS1 = $C0
POS2 = $C1
POS3 = $C2
POS4 = $C3
return 

DISABLE

ZONA:
IF BANDERA = 1 THEN
HIGH SIRENA
BANDERA1 = BANDERA1 + 1
ELSE
LOW SIRENA
ENDIF

BANDERA1 = BANDERA1 + 1
IF BANDERA1 > 6 THEN BANDERA1 = 0
IF BANDERA = 1 AND BANDERA1 < 3 THEN
PAUSE 100
serout PORTC.6,T9600,["AT+CMGR=1",10,13]
PAUSE 500
SEROUT PORTC.6,T9600,["AT+CMGD=1",10,13]
pause 500
SEROUT PORTC.6,T9600,["AT+CMGD=2",10,13]
pause 500
SEROUT PORTC.6,T9600,["AT+CMGF=1",10,13]
pause 1000
SEROUT PORTC.6,T9600,["AT+CMGS=",34,"2976256173",34,10,13]
pause 1000
SEROUT PORTC.6,T9600,["DISPARO ALARMA",26,10,13]
PAUSE 100
ENDIF

INTCON = %10010000 
Resume 
Enable 
END
```
si alguien necesita los comandos AT u manuales de este modem, tengo todos...
basicamente, para enviar un SMS seria algo asi: 

```
Inicio:
gosub ELIMINAR
serout PORTC.6,N9600,["AT+CMGR=1",10,13]
pause 100
if PORTB.0=0 then Z1on:
goto inicio

Z1on:
gosub ENVIO_1
serout PORTC.6,N9600,["ALARMA Z1",26,10,13]
GOSUB ENVIO_2
serout PORTC.6,N9600,["ALARMA Z1",26,10,13]
GOTO INICIO

ENVIO_1:
pause 2000
SEROUT PORTC.6,N9600,["at+cmgf=1",10,13]
pause 1000
SEROUT PORTC.6,N9600,["at+cmgs=",34,"+54297xxxxxxx",34,10,13]
pause 5000
return

ELIMINAR:
PAUSE 100
SEROUT PORTC.6,N9600,["at+cmgd=1",10,13]
pause 1000
SEROUT PORTC.6,N9600,["at+cmgd=2",10,13]
pause 1000
return
```
 lo  bueno de este modem, que por el puerto RS232, podemos hacer una  infinidad de cosas... El mismo modem cuenta con 4 puertos configurable  como entrada o salida para no depepnder de un microcontrolador en el  caso de querer controlar luces u artefactos... Igualmente, con un  PIC16F877A, Experimente enviar imagenes de camaras web IP, controles  domoticos que incluyen control de luces, alarmas sectorizadas,  preguntarle al sistema el estado de las luces (con dos pic 16F877), que sensor detecto  intruso, etc... Lo unico que me falto probar, es la funcion GPRS de  movistar, la cual por una triangulacion de antenas, nos da la ubicacion  aproximada del modem... los datos que se obtienen serian similares a  estos:
El  móvil XXXXXXXXXX esta en un Radio: 0.19 Km.; desde ing. Butty 240,  Ciudad de Buenos Aires, Ciudad de Buenos; Coordenadas (-58 22 15,-34 35  45)
 realmente muy bueno este equipo
les  comparto un breve video de un software que habia arrancado lubeck hace  un año y medio atras...un bocho ese pibe si le das un teclado, un  monitor y un cpu... hace maravillas 
https://www.facebook.com/photo.php?v=446373595464761


----------



## papirrin (Abr 24, 2014)

Yo es la primera ves que escucho eso de interrupciones no convensionales, y me suena a mentira,un modulo tiene una interrupción y es todo, lo demás serian algoritmos.
Prueba utilizar el modulo USART  con las instrucones hserin y hserout,al ser por hw  seguramente llama a la subrutina de interrupción.


----------



## reyvilla (Abr 24, 2014)

hola buen día compañeros la pagina que yo conozco de interrupciones es esta:
http://www.darreltaylor.com/DT_INTS-14/intro.html
saludosss


----------



## papirrin (Abr 24, 2014)

reyvilla dijo:


> hola buen día compañeros la pagina que yo conozco de interrupciones es esta:
> http://www.darreltaylor.com/DT_INTS-14/intro.html
> saludosss



Algo asi me imagino con lo de "interrupciones no convencionales", ese tipo imagino que las nombro "instant interrupts", no es mas que utilizar algoritmos en ensamblador hacia las mismas interrupciones que tenga el microcontrolador.

siempre es util utilizar ensamblador en basic, siempre y cuando la aplicación lo requiera y uno lo domine, en el caso de una comunicacion serial yo no lo veo necesario.


----------



## torres.electronico (Abr 24, 2014)

reyvilla dijo:


> hola buen día compañeros la pagina que yo conozco de interrupciones es esta:
> http://www.darreltaylor.com/DT_INTS-14/intro.html
> saludosss



 Tal cual!!!!  
pero justo no funciona el link de descarga voy a tener que usar otro micro mas 





papirrin dijo:


> Yo es la primera ves que escucho eso de interrupciones no convensionales, y me suena a mentira,un modulo tiene una interrupción y es todo, lo demás serian algoritmos.
> Prueba utilizar el modulo USART  con las instrucones hserin y hserout,al ser por hw  seguramente llama a la subrutina de interrupción.



  La idea era resumir el circuito... Viendo que no reesponde por USART el modem, creo que no hay muchas vueltas que darle...   crees que no agote todas las instancias antes de consultar?!


----------



## papirrin (Abr 24, 2014)

> Viendo que no reesponde por USART el modem,



puedes poner el codigo que utilizaste usando el modulo, me parece un poco raro, si funciona por SW, no tiene porque no funcionar por HW. quizas solo te falto configurarlo adecuadamente.


----------



## torres.electronico (Abr 24, 2014)

papirrin dijo:


> puedes poner el codigo que utilizaste usando el modulo, me parece un poco raro, si funciona por SW, no tiene porque no funcionar por HW. quizas solo te falto configurarlo adecuadamente.



para enviar o recibir con HSERIN/HSEROUT, es la misma linea que con SEROUT, pero se le suma la H delante...
la configuracion fue esta:


```
INCLUDE "modedefs.bas"
DEFINE HSER_RCSTA 90H
DEFINE HSER_TSTA 20H
DEFINE HSER_BAUD9600
```

Probe  en 2400 Baudios y menos que menos... pensando que era el hardware, configure el modem y despues ni con serin y serout pude establecer comunicacion con el hyperterminal, asi que lo deje en 9600 nuevamente y con serin y serout ya hablamos y tomamos mates con el modem...
creo que un 16F628 que tengo dando vueltas me salva las papas (tengo otro 877 pero es mucho ya)


----------



## ferdy575 (Abr 26, 2014)

hola a todos: de nuevo por estos lados con la preguntadera alguien sabe si en LINUX se puede instalar el PBP y el PROTEUS?


----------



## torres.electronico (Abr 26, 2014)

ferdy575 dijo:


> hola a todos: de nuevo por estos lados con la preguntadera alguien sabe si en LINUX se puede instalar el PBP y el PROTEUS?


Yo intente con wine en una netbook del gobierno (conectar igualdad) y no me dejo correrlo; mplab y ccs si pero pbp no intente. Que distro le vas a colocar? quizas buscando en google proteus parra linux, te sale que version podrias usar...saludos


----------



## ByAxel (Abr 26, 2014)

ferdy575 dijo:


> hola a todos: de nuevo por estos lados con la preguntadera alguien sabe si en LINUX se puede instalar el PBP y el PROTEUS?



Puede que... intenta con Virtual Box para Linux


----------



## torres.electronico (May 3, 2014)

Bueno, anoche termine la segunda beta de un RX-TX 4-20mA HOME MADE para leer instrumentos que trabajan con este protocolo... Le falta pulir, pero lo mas importante es que el hardware despues de renegar lo saque a flote. Basicamente lo que hago es leer señales 4-20mA (24Vcc) y generar con un PWM 4-20mA (24Vcc)... La otra funcion que le sume, es poder generar un espejo de corriente entre la entrada y la salida, osea, si lee 5mA, a la salida genera 5mA.
Todo corre en base a dos LM358 con fuente simple (uno se alimenta a 12Vcc y el otro a 24Vcc). GND se comparte entre ambos amplificadores operacionales y señales de entrada / salida.
Para leer la señal 4-20mA y colocarlo en el display, como anoche estaba cansado y no se me ocurria nada para trabajar con punto flotante, implemente las siguientes lineas y medianamente quedo pasable:


```
ADCIN 0, ent420
  nivel = ent420
  aux1=(ent420*100)/250            ;(V*100)/(R*100)
  aux1= aux1 *2
  ;****blabla bla
   LCDOUT $FE, 1
  LCDOut $fe,2,"Sal: ",DEC4 aux1,"mA"
```

para generar el pwm que me lleve el filtro de 0-5Vcc para crear los 4-20mA, implemente estas lineas:


```
PWM PORTC.2,nivelAUX,100 ;nivel PWM = (Vout * 255) / V.Fuente
```
  Les comparto el diagrama, si necesitan algo mas, me lo piden y te lo comparto; La proxima beta es sumarle un par de lineas mas y crear otra funcion mas... "Una fuente a modo generador de corriente" para probar y calibrar instrumentos.


----------



## Dario (May 3, 2014)

hola martin, pudiste configurar los fuses para pics 12fxxx??? saludosss


----------



## torres.electronico (May 3, 2014)

D@rio dijo:


> hola martin, pudiste configurar los fuses para pics 12fxxx??? saludosss


No  , pero seria ideal migrar todo asi queda mucho mas chico una version  ... total lo del display es chiche que no se justifica  ... practicamente es derrochar un 18F452 o un 16F877 
Me olvide comentar que para obtener a la salida del filtro que esta asociado al pin donde sale el PWM, la misma tension que la entrante por el puerto analogico, uso estas lineas, lo cual me simplifica mucho mas las cosas a la hora de querer hacer un espejo de corriente:


```
DEFINE OSC 20 
'****************************************************************
TRISA = 1 
ADCON1 = 0 
ADCON0 = %11000001
TRISB = %00000000  
TRISC = %11100000
'****************************************************************
DEFINE ADC_BITS 8 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50 
'****************************************************************
ent420 var word
nivel var byte
nivelAUX var byte
aux1 var byte
tiempo var byte
'****************************************************************
ejemplo:
ADCIN 0, ent420
nivel = ent420
aux1=(ent420*100)/250            ;(V*100)/(R*100)
aux1= aux1 *2
 LCDOUT $FE, 1
 LCDOut $fe,2,"Ent=Sal: ",DEC4 aux1,"mA"
 PWM PORTC.2,nivel,100  ;nivel PWM = (Vout * 255) / V.Fuente
pause 100
GOTO ejemplo
```


----------



## Dario (May 4, 2014)

ah, bueno, aqui encontre un pequeño programita que hice para un 12f675 y ahi tiene los fuses configurados, el problema era que habia perdido el codigo de calibracion del oscilador interno del pic, el que aparece en la ultima linea del .hex, fijate si te sirve. saludosss
https://www.forosdeelectronica.com/posts/561757/


----------



## torres.electronico (May 4, 2014)

D@rio dijo:


> ah, bueno, aqui encontre un pequeño programita que hice para un 12f675 y ahi tiene los fuses configurados, el problema era que habia perdido el codigo de calibracion del oscilador interno del pic, el que aparece en la ultima linea del .hex, fijate si te sirve. saludosss
> https://www.forosdeelectronica.com/posts/561757/



Recien mire el topico completo, pero de esta manera, osea por oscilador interno, no lo podria usar en 20Mhz:

@ DEVICE pic12F675, intrc_osc, wdt_off, pwrt_on, mclr_off, bod_off, protect_off

DEFINE OSC 4
DEFINE OSCCAL_1K 1

Ahora voy a ver si encuentro ejemplos basicos con FUSES y configuracion de puertos, por que como te comente, solo fueron un par de veces que use este tipo de pic y no me acuerdo nada...
Tengo que acordarme como activar el ADC y como configurar GPIO ya sea como entrada o como salida asi ya puedo pasar todo de un micro al otro... supuestamente, para hacer el pasaje de un pic a otro, tengo que anexar oscilador externo, configurar el ADC0 para usarlo como entrada analogica y configurar un puerto como salida digital y de ahi sacar el PWM... en pocas palabras parece simple, pero tengo que refrezcar la memoria al parecer 
Para la version del pic grande, ahora estoy trabajando con una nueva BETA, que lo que hace es transformar una lectura en 4-20mA... osea, lee un valor analogico, lo guarda como valor max y lee otro valor como min... con eso sacamos los 4-20mA y el resto de la escala, es conversion... Seria otra de las tantas maneras de encarar la lectura del sensor HOME MADE sin importar si la saldida de este es o no 4-20mA


----------



## blackpic (May 4, 2014)

Hi torres.electronico, de esta manera recientemente use un 12f683 con ADC configurado a 10bit, espero que te sirba de algo ya que tiene los fuses, las configuracion del oscilador interno, ADC y como poner los diferentes pines como salida (GPIO).
'Config de Fuses
@ DEVICE PIC12F683
@ DEVICE PIC12F683, FCMEN_OFF
@ DEVICE PIC12F683, IESO_OFF
@ DEVICE PIC12F683, WDT_ON
@ DEVICE PIC12F683, BOD_ON
@ DEVICE PIC12F683, PWRT_ON
@ DEVICE PIC12F683, PROTECT_OFF
@ DEVICE PIC12F683, MCLR_OFF
@ DEVICE PIC12F683, INTRC_OSC_NOCLKOUT
@ DEVICE PIC12F683, BOD_ON 
'Config parametros ADC 
DEFINE ADC_BITS 10      'Numero de bits ADC
DEFINE ADC_CLOCK 1      'Reloj ADC interno
DEFINE ADC_SAMPLEUS 30  'Tiempo ADC
'Config de Registros
OSCCON=%01100001    'Calibrar el oscilador interno a 4Mhz
CMCON0 = 7          'Comparador OFF, salida como digitales
ADCON0=%10000000    'Resultado AD justificado a la derecha
ANSEL = %00110011   'AN0,AN2 analogico, los demas digitales 
TRISIO = %11001011  'GP0,GP1,GP3 Entrada,GP2,GP4,GP5 salida
GPIO = 0            'Apago los puertos GP0


----------



## torres.electronico (May 4, 2014)

Buenisimo  gracias por ahorrarme un buen rato   ... consulta para ver si entendi la configuracion...
Para implementar GP0 como entrada analogica,GP1,GP3,GP4,GP5 como entradas digitales y GP2 como salida de pwm or software, se configuraria asi?

'*****************************************************
'Config de Fuses
@ DEVICE PIC12F683
@ DEVICE PIC12F683, FCMEN_OFF
@ DEVICE PIC12F683, IESO_OFF
@ DEVICE PIC12F683, WDT_ON
@ DEVICE PIC12F683, BOD_ON
@ DEVICE PIC12F683, PWRT_ON
@ DEVICE PIC12F683, PROTECT_OFF
@ DEVICE PIC12F683, MCLR_OFF
@ DEVICE PIC12F683, INTRC_OSC_NOCLKOUT
@ DEVICE PIC12F683, BOD_ON 
'Config parametros ADC 
DEFINE ADC_BITS 8      'Numero de bits ADC
DEFINE ADC_CLOCK 1      'Reloj ADC interno
DEFINE ADC_SAMPLEUS 30  'Tiempo ADC
'Config de Registros
OSCCON=%01100001    'Calibrar el oscilador interno a 4Mhz
CMCON0 = 7          'Comparador OFF, salida como digitales
ADCON0=%10000000    'Resultado AD justificado a la derecha
ANSEL = %00110001   'AN0,analogico, los demas digitales 
TRISIO = %11111011  'GP0,GP1,GP3,GP4,GP5Entrada,GP2 salida
GPIO = 0            'Apago los puertos GP0 - osea, GP2
'*****************************************************
Gracias por tu tiempo, saludos


----------



## reyvilla (May 4, 2014)

Hola amigo torres manejo los pic12F bastante bien, si quieres coloca el código que quieres pasar del pic grande al mas pequeño para echarte una mano...saludoss


----------



## torres.electronico (May 5, 2014)

reyvilla dijo:


> Hola amigo torres manejo los pic12F bastante bien, si quieres coloca el código que quieres pasar del pic grande al mas pequeño para echarte una mano...saludoss



 Hola Rey, gracias por la mano que me das… Te comento que justo ahora  me trabé  con la reforma /mejora del proyecto… o sea, , me trabe por que la técnica de punto flotante que implemente anteriormente no sé si me desborda o se pierde PBP y no puedo hacer la función mas importante de esta mejora, que sería grabar una señal de referencia máxima, una señal de referencia mínima, y a partir de estas dos señales, sacar el porcentaje promedio para compararlo con una tabla y sacar una señal analógica 4-20mA (1-5v) , que básicamente, en realidad me da una salida de 20 niveles (4mA-4,5mA-5mA-etc. etc. hasta 20mA) y al referirme como salida analógica, me refiero más a lo conceptual, que a lo real.
  Matemáticamente, se hace así:
  Aux1 = lecturaADCmax  –  lecturaADCmin
  Aux2 = Aux1 / lecturaADCmin
  Aux2 = Aux2 * 100
  Teniendo esta parte terminada, lograría mejorar la función transductor, ya que la función transmisor, esta lista y funciona bien. 
  A la tarde te paso lo que ya funciona, gracias


----------



## Nano24 (Jun 26, 2014)

Por aqui les dejo un voltimetro que realice con un pic16f877a esta un documento pdf como lo realice y una carpeta con el pbp, hex y la simulacion en proteus.


----------



## blackpic (Jun 26, 2014)

Una consulta como seria para sacar el valor promedio de una lectura adc, por ejemplo tomando algunas 50 muestras del adc.. 
Agradeceria sugerencia como guia para guiarme gracias..


----------



## papirrin (Jun 26, 2014)

> Una consulta como seria para sacar el valor promedio de una lectura adc, por ejemplo tomando algunas 50 muestras del adc..



pues saca dos muestras y vas promediando, no importa si son 10 20 50 o 10000, siempre es un promedio, son matematicas de primer nivel


----------



## Americo8888 (Jun 26, 2014)

blackpic dijo:


> Una consulta como seria para sacar el valor promedio de una lectura adc, por ejemplo tomando algunas 50 muestras del adc..
> Agradeceria sugerencia como guia para guiarme gracias..


Haz un lazo o bucle for next, mas o menos asi:

    promedio=0                  'al inicio promedio es cero      
    for cnt=1 to 10 step 1   '10 es el numero de muestras
    gosub muestrear           'va a tomar muestra de un pin ADC y guarda en "valor_ADC"
    promedio=valor_ADC+promedio  'sumas y sumas
    next cnt

    promedio=promedio/10     'promedias


----------



## blackpic (Jun 26, 2014)

Gracias por sus respuesta...


----------



## D@rkbytes (Jun 26, 2014)

blackpic dijo:


> Una consulta como seria para sacar el valor promedio de una lectura adc, por ejemplo tomando algunas 50 muestras del adc.
> Agradecería sugerencia como guia para guiarme gracias.


Mira este ejemplo por aquí: _*ADC Promedio*_

Saludos.


----------



## Nano24 (Jul 11, 2014)

Alguien sabe si esto es posible? Desde hace tiempo he querido saber como se puede grabar sonidos en un pic, segun me encontre este video y veo que si, pero como se hace esto?






Otra pagina encontré un programa llamado BTCSound transforma un archivo wav en bits, lo saca en lenguaje Assambler, pero lo hace demasiado extenso que ni se puede guardar en el pic dicho lenguaje generado.

http://www.romanblack.com/picsound.htm


----------



## D@rkbytes (Jul 12, 2014)

Nano24 dijo:


> ¿Alguien sabe si esto es posible? Desde hace tiempo he querido saber como se puede grabar sonidos en un pic, según me encontré este video y veo que si, pero como se hace esto?


No creo que sea cierto lo que está haciendo ese PIC.
Dice que le está metiendo música en formato MP3 y aunque el MP3 sea un formato comprimido, se necesita mucha memoria para almacenar tantas canciones o fragmentos de ellas en la poca memoria de un PIC.
(Suficiente para lo que realmente puede hacer un PIC)

Aparte hay que tomar en cuenta el algoritmo de decodificación y eso en un PIC resultaría muy complicado, si no es que imposible.
Tal vez se pueda controlar un reproductor de MP3, pero que el PIC lo haga todo, no lo creo.
Para eso están los dsPIC pero no es nada sencillo. *dsPIC MP3 Decoder [PIC24]*


Nano24 dijo:


> Otra pagina encontré un programa llamado BTCSound transforma un archivo  wav en bits, lo saca en lenguaje Assambler, pero lo hace demasiado  extenso que ni se puede guardar en el pic dicho lenguaje  generado.


Ese programa si funciona pero utiliza bancos externos de memoria para almacenar hasta 1MBit.
Necesitas estudiarlo muy bien o comprar el TalkBotBrain para reproducir los sonidos.
Como quiera no se me hace nada fácil llevar a cabo un proyecto similar y se requieren muchos conocimientos sobre archivos wav y algoritmos de codificación y decodificación.

Saludos.


----------



## COSMICO (Jul 12, 2014)

El programa si funciona, pero la calidad del audio, que sale del PIC es muy mala, el código que genera el 
BTSC es asembler, pero muy extenso para poder grabar toda una canción en el micro.
Creo que en el mismo programa hay un ejemplo de filtro para usarlo en el PIC.
Personalmente pienso que es mejor usar un Dspic para este tipo de trabajo.


----------



## Nano24 (Jul 13, 2014)

D@rkbytes dijo:


> No creo que sea cierto lo que está haciendo ese PIC.
> Dice que le está metiendo música en formato MP3 y aunque el MP3 sea un formato comprimido, se necesita mucha memoria para almacenar tantas canciones o fragmentos de ellas en la poca memoria de un PIC.
> (Suficiente para lo que realmente puede hacer un PIC)
> 
> ...



En pocas palabras seria muy dificil hacer un proyecto asi entonces, gracias por la respuesta amigo, bueno por aca te dejo este video segun el autor dice que genera con PWM los sonidos, la verdad le quedo excelente.


----------



## D@rkbytes (Jul 13, 2014)

Nano24 dijo:


> En pocas palabras seria muy dificil hacer un proyecto asi entonces, gracias por la respuesta amigo, bueno por aca te dejo este video segun el autor dice que genera con PWM los sonidos, la verdad le quedo excelente.


Así es, más que nada la limitación es por la memoria.
Ese video ya lo había visto por alguno de los post del Foro dónde se ha tratado esto. Está bien ese proyecto. 

Si te interesa, aquí hay un proyecto más sencillo porque usa dos programas como herramientas, pero es en C (Hi-Tech for PIC18)
*PIC sound player (PCM to PWM converter)*
Lo he probado personalmente y si funciona, se pueden generar sonidos cortos a partir de archivos wav.
Previamente hay que convertir los archivos *.WAV a *.PCM con el programa *MPlayer*
El autor del proyecto adjunta un programa para convertir los archivos PCM a archivos *.H
Éstos archivos son los que se agregan al programa para generar los sonidos por medio de PWM.

El proyecto tiene sus limitaciones en cuanto al tamaño de archivos *.h generados (Unos 50Kb. Aprox.) o tal vez menos, no he realizado muchas pruebas por lo tedioso de estar grabando, convirtiendo y compilando, pero con las pruebas que hice me entretuve buen rato. 

Suerte.


----------



## papirrin (Jul 13, 2014)

Yo creo que seria mas facil y barato con uno de estos:





_Buscar en Mercadolibre: MLM-453310698-modulo-reproductor-de-audio-mp3-wtv020-sd-arduino-picavr-_JM_
cuestan algo asi como 10USD.


----------



## COSMICO (Jul 13, 2014)

Módulo Sintetizador de voz, es una buena idea, pero costoso.
Los sonidos generados en el video arriba, son algo como tipo Midi, eso si lo genera muy fácil el pic, existen librerias para notas musicales en Ccs, Pic Basic, Proton, Mikrobasic; Mikroc entre otros, que hacen más facil el trabajo.


----------



## Nano24 (Jul 14, 2014)

A fin de cuentas veo que seria mejor usar el modulo y así no complicarme tanto la vida entonces, se ve muy complicado con los otros programas también 



COSMICO dijo:


> Módulo Sintetizador de voz, es una buena idea, pero costoso.
> Los sonidos generados en el video arriba, son algo como tipo Midi, eso si lo genera muy fácil el pic, existen librerias para notas musicales en Ccs, Pic Basic, Proton, Mikrobasic; Mikroc entre otros, que hacen más facil el trabajo.



Las librerias para Picbasic como cuales serian?


----------



## COSMICO (Jul 14, 2014)

La libreria SOUND, de la cual hay un ejemplo en el PBP, sirve para tal proposito.


----------



## inspector gadget (Jul 16, 2014)

saludo expertos, estoy realizando una maqueta de una linea de montaje la cual tiene 5 estaciones con sensores fin de carrera y 5 pulsadores de llamada, la idea es que mediante los pulsadores de llamada, pueda hacer que el carrito se desplaze hasta una de las 5 estaciones a las que se envio y se detenga hasta que reciba otra orden para desplazarse, usare un motor dc con un puenteH para invertir el giro, por lo que tengo señal de avance y retroceso simuladas por 2 leds,  no necesito que atienda los llamados con prioridad, simplemente tome el ultimo dato y se desplaze hasta alli, realize todas las combinaciones posibles, exceptuando las que si se encuentra el fin de carrera en la estacion 1, y se pulsa el llamado 1 no atienda ese llamado , si esta en la 2 y se pulsa el llamado 2 no atienda y asi con todas las 5 estaciones, serian 25 combinaciones menos 5 referentes al mismo piso que el llamado. quedan 20, bueno, emplee el condicional if-then, el problema es que no se me ocurre como efectuar la parada en la estacion, ya que si empleo el dato proporcionado por el fin de carrera para parar, lo hace, pero como el fin de carrera queda enclavado hasta recibir una orden para que se desplace, al dar la nueva orden el sistema permanece parado, ya que el fin de carrera dicta que por estar enclavado, el dato es leido como parada y no arranca hasta la siguiente posicion, espero que entiendan la explicacion y me puedan sugerir como hacer que pueda recibir la nueva orden y ejecutarla, osea se desplace, talvez no sea la manera precisa de encarar este programa y me refiero a usar combinaciones, o tal vez deba usar algun otro operador matematico para lograrlo, ojala me puedan ayudar sugiriendome como hacerlo, muchas gracias por su tiempo


----------



## torres.electronico (Jul 18, 2014)

Nano, buscale la manera de guardarlo en la eeprom externa, y despues vemos como reproducirlo en la frecuencia correspondiente...


```
DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50

Adc VAR WORD

D0 VAR Adc.0
D1 VAR Adc.1
D2 VAR Adc.2
D3 VAR Adc.3
D4 VAR Adc.4
D5 VAR Adc.5
D6 VAR Adc.6
D7 VAR Adc.7
D8 VAR Adc.8
D9 VAR Adc.9

TRISA = %11111111
TRISB = %00000000
TRISD = %00000000

ADCON1.7 = 1

Inicio:
 
 ADCIN 0,Adc
 
 PORTD.0 = D0
 PORTD.1 = D1
 PORTD.2 = D2
 PORTD.3 = D3
 PORTD.4 = D4
 PORTD.5 = D5
 PORTD.6 = D6
 PORTD.7 = D7
 PORTB.0 = D8
 PORTB.1 = D9
 
GoTo Inicio
```

Basicamente lo que hace es reproducir en tiempo real el sonido que entra por el puerto analogico en un formato de 10 bits (algo similar al musiquita del mario bros en las antiguas family games jajaja); A la salida de este ejemplo, se implementa un dac, pero si lo guardas en una eeprom, te doy una mano para sacarlo con un sencillo filtro (resistencia + capacitor). Voy a ver si encuentro una idea que me habia compartido reimy en su momento para guardar y reflotar los valores en la eeprom


----------



## torres.electronico (Jul 19, 2014)

inspector gadget, basicamente lo que necesitas es la logica del ascensor... hay algo acá:
https://www.forosdeelectronica.com/f24/curso-programacion-pic-picbasic-pro-20658/index118.html
solo te va servir para guiarte en la logica por que no esta terminado


----------



## Nano24 (Jul 21, 2014)

torres.electronico dijo:


> Nano, buscale la manera de guardarlo en la eeprom externa, y despues vemos como reproducirlo en la frecuencia correspondiente...
> 
> 
> ```
> ...




Se ve sencillo la manera en que lo has colocado, lo simule en el proteus con una señal de audio y funciona 

Hasta ahí llegan mis conocimientos, hasta ahora no he manejado memorias eeprom, necesitaría un programador de este tipo de memorias también.



torres.electronico dijo:


> inspector gadget, basicamente lo que necesitas es la logica del ascensor... hay algo acá:
> https://www.forosdeelectronica.com/f24/curso-programacion-pic-picbasic-pro-20658/index118.html
> solo te va servir para guiarte en la logica por que no esta terminado




Aquí te adjunto el programa simulado en proteus, le elimine unas lineas de programación.


----------



## torres.electronico (Jul 22, 2014)

Hola NANO, no necesitarias un grabador de eeprom, ya que es una ,memoria  serial que la grabas y lees con el mismo PIC... Ahora, vi tu circuito,  pero tenemos dos problemas...
Una, te falto acondicionar la entrada  con un Amp Op... mas uqe nada para no perder picos del espectro del  habla Humana o musica o lo que sea... O sea, acondicionamos la señal  entrante para que trabaje en tensiones que esten entre 0 y 5 Vcc...
Dos,  la salida para pdoer implementarla de esa manera, tendrias que cambiar  todo el programa, ya que te faltaria un filtro y despues, tendrias que  generar una tabla para poder reproducir el PWM que virtualizaria tu  sonido... Tene en cuenta que cada fonema tiene su frecuencia, y si no lo  reproducimos escalarmente, seria como escuchar ruidos entrecortados o  como leer un libro mencionando cada letra por separado... "HOLA...  Hache-O,ELE,A"; Se entiende hasta acá?
Bueno, para reducir el  programa, lo que se hace, es implementar un DAC de 10bits conectado a  esos 10 puertos de salida... cuando me refiero a DAC, me refiero a un CI  similar a este:
	

	
	
		
		

		
			




(Fuente: http://www.analog.com/en/digital-to-analog-converters/da-converters/dac10/products/product.html )
Al implementar un Ci similar a este, lo que obtendriamos a la salida del DAC, seria algo similar a esto:






Fijate que se ve bien enmarcada la salida escalar (no necesariamente la señal de salida tiene forma triangular... busque  en google una imagen escalar para mostrarte como quedaria, pero en si,  es semisinuidal en realidad la señal de salida)... 
Ahora, la salida del DAC te va a generar una tension muy pobre, asi que para amplificarla, con la implementacion de un Amp Op mas, tendrias todo practicamente resuelto... Hoy me pongo en campaña y te comparto la idea que me habia comentado en su momento el maestro Reimy...


----------



## Manrique (Jul 22, 2014)

Hola amigos necesito que alguien me oriente en que estoy fallando en la programacion de este ejercicio que es de una secuencia de luces como la del auto fantastico, utilizando el puerto Ay B del pic 16f628a en basic, ya que las salidas RA6 y RA7 no quieren activarse.
les adjunto programa, la simulacion y el .hex
Saludos.....


----------



## D@rkbytes (Jul 22, 2014)

Manrique dijo:


> Hola amigos necesito que alguien me oriente en que estoy fallando en la programación de este ejercicio que es de una secuencia de luces como la del auto fantástico, utilizando el puerto A y B del pic16f628a en basic, ya que las salidas RA6 y RA7 no quieren activarse.


Es porque te falta agregar la palabra de configuración, si no la pones el compilador establece una por defecto con oscilador a cristal.

Es por eso que los pines RA6 y RA7 al estar configurados para usar oscilador a cristal, no funcionan.
Si no declaras los bits de configuración en tu programa, también lo puedes hacer en tu programador de PIC's, pero es muy importante que siempre uses una palabra de configuración.

Usa esta palabra de configuración y colócala en la cabecera del programa (Hasta arriba del código)


```
[COLOR=Green][B]@ Device [/B][/COLOR][B]INTRC_OSC_NOCLKOUT, WDT_OFF, MCLR_OFF, PWRT_ON, BOD_OFF, LVP_OFF[/B]
```
También es importante que declares la frecuencia de trabajo.
*Define OSC 4*
Aunque en este caso al usar el oscilador interno que en el PIC16F628A es de 4MHz, el compilador también por defecto establece esta frecuencia.

Suerte.


----------



## torres.electronico (Jul 22, 2014)

Nano, mirá...aca te subo la simu completa con todos los archivos... En la simulacion, tenes 3 capturas del osciloscopio... fijate que la señal o canal amarillo, es la señal analogica entrante... la del medio convertida y la ultima, la salida del DAC... 

En un rato vuelvo con lo que me comento reymi alguna ves para complementar el mensaje y el tema

edit: acá subo parte de lo que alguna ves hablamos con Reimy sobre este proyecto



			
				Reimy dijo:
			
		

> bueno es una idea.imagina que creamos dos variables para la señal uno esas dos variables son para dividir el dato en dos
> y poder grabarlo quedando algo asi
> 
> señaluno1.0 = adc.0
> ...


----------



## Dario (Jul 22, 2014)

Exelente torres, ¿asi que con este circuito podes grabar audio en una memoria 24cxx mediante un pic? porque si es asi, seria genial!!!  saludosss


----------



## torres.electronico (Jul 22, 2014)

...hay que parcharlo para que no quede en solo pura chachara jajaja...esa idea que da Reimy es buena, pero hay qeu llevarlo a la practica... Yo calculo que con lo lento que es PBP, no se va poder reproducir asi; Yo creo que habria que guardarlo en la memoria ecxterna, y antes de reproducir, implementar espacios de memoria temporal para almacenar estos registros y recien despues de tener todos esos bits, reproducirlos... Igualmente estamos hablando de..1,5segundos casi 2...
Igualmente, de la idea a la practica hay un largo trecho... hay bastantes cosas por ver, probar etc etc

Edit:
Yo tengo un ejemplo completo en microbasic para trabajar esto mismo con una memoria 24cXXX y sacar el sonido por pwm; Pero no puedo llevar un codigo al otro, ya que trabaja con una variable tipo integer y justamente se me desbordo la memoria de tanto pensar como trabajar el punto flotante jajajaja.



No se si seria desvirtuar el tema, pero si Ricardo quiere y le parece buena idea para modificar, subo todo (archivo para convertir archivo WAV en 8bits para subir a la memoria - codigo de fuente - circuito - pcb) y arrancamos con la re-interpretacion del codigo, que en un 90% es muy similar a PBP


----------



## Dario (Jul 23, 2014)

che, estaria bueno hacer algo asi con pic... no por hacerse un reproductor de mp3, sino porque sacar sonido con pic, podria servir para poner voz a un robot por ejemplo, o a un sistema automatizado, alarma etc etc... ya se que hay intgrados especificos para eso, pero en mi caso, no he podido encontrar por ejemplo, ni el ISD1100, que ya tiene como 20 años en el mercado y esto seria un buen reemplazo... saludosss


----------



## papirrin (Jul 23, 2014)

Dario hay bastantes modulos ya prefabricados e integrados de muy buena calidad y a un precio mas bajo que un pic. no vale la pena perder el tiempo, un PIC no fue diseñado para eso.

como bien dijo torres.electronico que si solo es por aprender y el tiempo y dinero no es limitante, si estaria bueno.


----------



## Manrique (Jul 23, 2014)

D@rkbytes dijo:


> Es porque te falta agregar la palabra de configuración, si no la pones el compilador establece una por defecto con oscilador a cristal.
> 
> Es por eso que los pines RA6 y RA7 al estar configurados para usar oscilador a cristal, no funcionan.
> Si no declaras los bits de configuración en tu programa, también lo puedes hacer en tu programador de PIC's, pero es muy importante que siempre uses una palabra de configuración.
> ...



Gracias por responder D@rkbytes, resulta que ya le habia colocado que utilizara el osc interno y apagado el mclr y el bod y aun asi no trabajan esas 2 salidas, adjunto el ejercicio y tambien otro ejercicio de solamente el puerto A, donde si funcionan esas 2 salidas y no veo diferencia.
Saludos.


----------



## torres.electronico (Jul 23, 2014)

papirrin dijo:


> Dario hay bastantes modulos ya prefabricados e integrados de muy buena calidad y a un precio mas bajo que un pic. no vale la pena perder el tiempo, un PIC no fue diseñado para eso.
> 
> como bien dijo torres.electronico que si solo es por aprender y el tiempo y dinero no es limitante, si estaria bueno.



Dario, un pic 16FXX y una memoria 24CXXX creoq ue ronda los 40-50 mangos? y el ICD creo que ronda los 280 pesitos... dejá...te paso porprivado las cosas asi achicamos comentaris que no tienen idea sobre el tema


----------



## D@rkbytes (Jul 23, 2014)

Manrique dijo:


> Gracias por responder D@rkbytes, resulta que ya le había colocado que utilizara el osc interno y apagado el mclr y el bod y aún así no trabajan esas 2 salidas, adjunto el ejercicio y también otro ejercicio de solamente el puerto A, donde si funcionan esas 2 salidas y no veo diferencia.
> Saludos.


Si hay diferencia y precisamente es lo que te mencioné anteriormente.
En el programa (Secuencia.pbp) tienes la palabra de configuración para usar oscilador interno, pero no está bien escrita y no permite compilarse.

El archivo Secuencia.hex tiene configuración con oscilador a cristal y así no va a funcionar.
El otro programa (juego de luces puerto A.pbp) también tiene la palabra de configuración  para usar oscilador interno, también mal escrita pero el archivo ejecutable juego de luces puerto A.hex si está configurado para trabajar con oscilador interno y es por eso que ese programa si funciona.

Corrige eso porque de otra manera seguirá sin funcionar.
Ya te dije como hacerlo y así es cómo lo debes hacer.
Si quieres poner los bits de la palabra de configuración separados, no importa, pero separa las palabras.

Suerte.


----------



## D@rkbytes (Jul 24, 2014)

torres.electronico dijo:


> No sé si sería desvirtuar el tema, pero si Ricardo quiere y le parece buena idea para modificar, subo todo (archivo para convertir archivo WAV en 8bits para subir a la memoria - código de fuente - circuito - pcb) y arrancamos con la re-interpretación del código, que en un 90% es muy similar a PBP


No hay ningún problema, aquí de lo que se trata es de aprender y difundir la información.
Si el código será realizado en PICBasic Pro, no hay ningún inconveniente de que sea posteado sobre este tema.

Será parte de los muchos otros ejemplos que han beneficiado a muchas personas y me parece muy bien. 

Saludos.


----------



## Manrique (Jul 24, 2014)

D@rkbytes dijo:


> Si hay diferencia y precisamente es lo que te mencioné anteriormente.
> En el programa (Secuencia.pbp) tienes la palabra de configuración para usar oscilador interno, pero no está bien escrita y no permite compilarse.
> 
> El archivo Secuencia.hex tiene configuración con oscilador a cristal y así no va a funcionar.
> ...



Que tal  D@rkbytes, resulta que sigue igual yo he colocado los bits separados de las palabras y a la hora de compilar me genera errores en el pic basic pro 2.5, cuando lo escribo pegado como esta en mi ejemplo si me deja compilar pero las salidas RA6 y 7 no se activan, esto sucede en proteus, ya cuando cargo el .hex en el programador en los fuses escojo osc_RC INT y en la protoboard si funciona bien, encendiendo eso 2 puertos.
Gracias.
Saludos.


----------



## torres.electronico (Jul 24, 2014)

D@rkbytes dijo:


> No hay ningún problema, aquí de lo que se trata es de aprender y difundir la información.
> Si el código será realizado en PICBasic Pro, no hay ningún inconveniente de que sea posteado sobre este tema.
> 
> Será parte de los muchos otros ejemplos que han beneficiado a muchas personas y me parece muy bien.
> ...



Excelente!!! bueno, acá esta el archivo... Yo arranque algo y ahora estoy buscando las librerias para entender un poquito mas el programa que esta en microbasic... Lei un poquito dos pdf sobre este lenguaje y no lo vi muy dificil; Mas para lo que ami me importa (traducir de Mbasic a PBP).
En la simulacion de proteus, tengan en cuenta que para cargar el archivo en la memoria, no los va dejar... no cambien el formato del archivo "PIC"... solo coloquen las dos priemeras letras del archivo y aparecera magicamente para seleccionarlo.
en el protoboard, se defiende un poco mejor que en proteus jajajajaja... Bueno, veamos que se puede hacer en conjunto... Ahi encontre mas ejemplos VIEJISIMOS de gente que implemento basic para reproducir archivos WAV... se ve que nunca habia implementado algunos tag y ahora aparecen como magia, en fin... Arranquemos con una interpretacion, y luego lo traducimos al PBP...saludos


----------



## D@rkbytes (Jul 25, 2014)

Manrique dijo:


> ¿Qué tal  D@rkbytes? Resulta que sigue igual, yo he colocado los bits separados de las palabras y a la hora de compilar me genera errores en el pic basic pro 2.5


Sip, debes actualizar la versión de PBP que estás usando, esa ya tiene mucho tiempo y han habido algunas mejoras con versiones más recientes.

En este momento ya se está usando la la versión 3.xx con MicroCode Studio 5.xx
Me parece que la más actual que se produjo para PBP 2.xx fue la 2.60C

Actualízate a esa versión para que puedas compilar tus programas sin problemas.

Suerte.


----------



## rafapic (Jul 29, 2014)

hola gente estoy usando un circuito que pastearon y estoy tratando de adaptarlo para realizar dos cuantas independientes con un solo pic 16f628a para un marcador deportivo y no encuentro la falla. La verdad que la función ShiftOut no la conozco bien pero seria para especificar  el clock (scl) y dato (sda). en fin seguiré intentando dejo la simulación en proteus y el pbp.uno de los contadores anda bien pero el otro no,y allí es donde nose cual es mi error, espero alguien lo encuentre antes que yo bien lo tenga todo funcionando lo subo. gracias


----------



## D@rkbytes (Jul 30, 2014)

rafapic dijo:


> Hola gente. Estoy usando un circuito que postearon y estoy tratando de adaptarlo para realizar dos cuentas independientes con un sólo pic16f628a para un marcador deportivo y no encuentro la falla.
> La verdad que la función ShiftOut no la conozco bien pero sería para especificar  el clock (scl) y dato (sda).


Mira este proyecto que adjunto, es más sencillo qué el que quieres modificar.
También usa un PIC16F628A y dos 74LS48 para controlar 4 displays de siete segmentos con cátodo común.

El proceso de visualización se lleva a cabo por sistema multiplex.

No lo he probado físicamente "Lo desarrollé en un momento de ocio" pero lo más probable es que si funcione.

Suerte.


----------



## rafapic (Jul 30, 2014)

hola ahora voy a comprar algunos componentes que me faltan,lo armo y les comento como salio todo,gracias por la ayuda.


----------



## Nano24 (Ago 2, 2014)

torres.electronico dijo:


> Nano, mirá...aca te subo la simu completa con todos los archivos... En la simulacion, tenes 3 capturas del osciloscopio... fijate que la señal o canal amarillo, es la señal analogica entrante... la del medio convertida y la ultima, la salida del DAC...
> Ver el archivo adjunto 114257
> En un rato vuelvo con lo que me comento reymi alguna ves para complementar el mensaje y el tema
> 
> edit: acá subo parte de lo que alguna ves hablamos con Reimy sobre este proyecto



Bastante interesante lo que has hecho  muchas gracias por el aporte amigo, investigando un poco tambien, ya que me gusta la programacion en Arduino, mira lo que consegui.


----------



## cosmico74 (Ago 18, 2014)

Hola a todos!!!...En este tutorial de proton post#28
el compañero byker2k3 escribio lo siguiente:

"_*pedasito de codigo que use para generar una portadora de 38Khz 50% Duty con un PIC12f683*_"

TRISIO.2 = 0 ' CCP1 (GPIO.2 = Output)
PR2 = 25 ' Set PWM Period for approx 38KHz
CCPR1L = 13 ' Set PWM Duty-Cycle to 50%
CCP1CON = %00001100 ' Mode select = PWM
T2CON = %00000100 ' Timer2 ON + 1:1 prescfale

Yo utilizare el clasico PIC16F628A...

Ok...Mi duda es la siguiente: He observado en otros posts que al hacer esta practica activan dos pines uno para SALIDA PWM que en este caso seria (GPIO.2=Out) y otro pin cualquiera para habilitar los pulsos del Led Infrarrojo o Modulacion del Led Infrarrojo es cierto esto?
Alguien que haya trabajado con leds infrarrojos me puede corrobar esto por favor
Si es cierto esto entonces tengo que puentear el Led Infrarrojo con el otro pin que yo habilite claro con su respectiva resistencia?
Entonces si habilito el otro pin donde voy a conectar el otro extremo tengo que manejarlo en estado logico 1 y estado logico 0? es correcto? o estoy errando haber si alguien me puede sacar de estas dudas Gracias...


----------



## D@rkbytes (Ago 18, 2014)

cosmico74 dijo:
			
		

> Yo utilizaré el clásico PIC16F628A...
> 
> Ok. Mi duda es la siguiente: He observado en otros posts que al hacer  esta practica activan dos pines uno para SALIDA PWM que en este caso  seria (GPIO.2=Out) y otro pin cualquiera para habilitar los pulsos del  Led Infrarrojo o Modulación del Led Infrarrojo es cierto esto?
> Alguien que haya trabajado con leds infrarrojos me puede corroborar esto por favor
> ...


El PIC16F628A no tiene puerto GPIO, el pin de salida HPWM es por el pin 9 (RB3 o PORTB.3)

Y sip, puedes usar el pin de salida de PWM para controlar la base de un transistor NPN, con el pin de salida de pulsos controlas el emisor y colocas los LED's en colector.

Así lo he hecho yo enviando comandos RS-232 sobre una portadora de 38KHz.

Y para que este método funcione se tienen que enviar los datos invertidos.

Suerte.


----------



## luis30 (Ago 19, 2014)

Yo e trabajado como dice D@rkbytes! y funciona bien a qui te pongo un esquema que uso para un control con el pic 16f628a, te puedes pasar por este link para que veas un ejemplo en ccs de control IR que hice..

https://www.forosdeelectronica.com/f24/aporte-reloj-digital-controlado-infrarrojo-117549/
https://www.forosdeelectronica.com/f24/aporte-comunicacion-pic-pic-116724/


----------



## cosmico74 (Ago 19, 2014)

Gracias DarkBytes por contestar tan rapido bueno en si lo que quiero hacer es mandar datos,info,etc. de un pic a otro pic via Infrarrojos con Serout,Serin.,etc.,utilizando logicamente PicBasicPro(PBP) y bueno pues...tocaste mi gran duda dices que:

"EL pin de salida HPWM es por el pin 9 (RB3 o PORTB.3)
Y sip, puedes usar el pin de salida de PWM para controlar la base de un transistor NPN,
_*con el pin de salida de pulsos controlas el emisor*_ y colocas los LED's en colector.
Así lo he hecho yo enviando comandos RS-232 sobre una portadora de 38KHz.
Y para que este método funcione se tienen que enviar los datos invertidos."

1.-Cuando dices que con _*el pin de salida controle los pulsos del emisor*_,¿como lo interpreto o como lo manejo?
puede ser cualquier pin?,¿que se supone que debe de hacer este pin de salida o que estados debe de tomar?esa es mi duda haber si me la puedes resolver.

2.-_*Y dices para que este método funcione se tienen que enviar los datos invertidos.*_
osea puedo utilizar el sig.circuito en el lado del Receptor:









DarkBytes haber si pudieras subir un ejemplito o un extracto de programa de la pregunta numero 1 donde manipulas el pin pwm y el pin de pulsos para el control del Led_IR.Gracias...


----------



## D@rkbytes (Ago 20, 2014)

cosmico74 dijo:


> Gracias D@rkbytes por contestar tan rápido.
> Bueno, en sí, lo que quiero hacer es mandar datos, info, etc. de un pic a otro pic via Infrarrojos con Serout, Serin., etc. utilizando lógicamente PicBasic Pro (PBP) y bueno pues, tocaste mi gran duda, dices qué:
> 
> 1.-Cuando dices que con _*el pin de salida controle los pulsos del emisor*_.
> ...


Respuesta a pregunta 1:
Si puedes utilizar cualquier pin que sea salida para controlar al emisor del transistor.
Y esto es posible ya que se puede generar RS-232 por software.
Este pin será la salida de datos RS-232 que controlará al emisor con pulsos negativos.
Como se debe usar PWM por hardware para generar la portadora, el pin de salida es por RB3 (CCP1)
Esta señal de 38KHz. se ingresa a la base del transistor y será la que porte la información.

Respuesta a pregunta 2:
Sip, esa es la configuración, pero se realiza la modulación por el emisor.
Y he aquí un dato curioso:
Cuando yo realicé ese proyecto con RS232 por infrarojo, lo hice en C.
Al hacer el ejemplo en PBP la cosa cambió, ya no fue necesario invertir la transmisión.

Aquí está el ejemplo, no tiene mucho alcance y posiblemente exista un mejor método.
En realidad yo únicamente necesitaba una comunicación de pocos centímetros, pero te dará una idea.

Nota:
El post fue movido aquí, ya que mencionas que usarás PICBasic Pro y estaba en un tema de Proton IDE.

Suerte.


----------



## ferdy575 (Ago 21, 2014)

D@rkbytes dijo:


> Respuesta a pregunta 1:
> Si puedes utilizar cualquier pin que sea salida para controlar al emisor del transistor.
> Y esto es posible ya que se puede generar RS-232 por software.
> Este pin será la salida de datos RS-232 que controlará al emisor con pulsos negativos.
> ...



Hola viejo D@rkbytes estuve viendo tu trabajo y lo veo super pero hay algunas cosas que no entiendo y me gustaría sí es posible que nos expliques pues creo que no soy el único que tendrá estas dudas: 
1º como sabes en estas lineas que comando usar?:
SerOut PORTB.2,T9600,["$"]  ; Se envía el comando $ en modo invertido
SerOut PORTB.2,T9600,["#"]  ; Se envía el comando # en modo invertido

2º ahora sí quisiera hacer otras funciones se pueden usar otros comandos? digamos así?
SerOut PORTB.2,T9600,["G"]  ; Se envía el comando G en modo invertido

3º como sabes que el comando va invertido?

te agradezco mucho tu aporte y me perdonas la molestadera


----------



## D@rkbytes (Ago 21, 2014)

ferdy575 dijo:


> Hola viejo, D@rkbytes. Estuve viendo tu trabajo y lo veo súper, pero hay algunas cosas que no entiendo y me gustaría sí es posible que nos expliques, pues creo que no soy el único que tendrá estas dudas:
> 1º ¿Cómo sabes en estas líneas qué comando usar?:
> SerOut PORTB.2,T9600,["$"]  ; Se envía el comando $ en modo invertido
> SerOut PORTB.2,T9600,["#"]  ; Se envía el comando # en modo invertido
> ...


Los comandos pueden ser los que quieras, alfanuméricos o cadenas, para enviar y leer cadenas se usan otras instrucciones.
Ya en el receptor, tan sólo debes esperar los comandos que utilizaste.

Los modos de transmisión están en la ayuda de PBP, tan sólo sitúa el cursor sobre la instrucción de la cual tengas dudas y presiona la tecla F1.
Al hacer eso, aparece la ayuda sobre dicha instrucción con los parámetros requeridos y algún ejemplo.

*Modos de transmisión para SerIn y* *SerOut*

Para usar estos modos se debe incluir el archivo MODEDEFS.BAS
Si no se incluye este archivo, se debe usar su valor numérico. (0 a 15)​ Nota:
T9600 equivale a una transmisión a 9600 Bps. en modo normal, pero como estuve haciendo pruebas, olvidé modificar el comentario.


----------



## Pull1988 (Sep 3, 2014)

D@rkbytes dijo:


> Los comandos pueden ser los que quieras, alfanuméricos o cadenas, para enviar y leer cadenas se usan otras instrucciones.
> Ya en el receptor, tan sólo debes esperar los comandos que utilizaste.
> 
> Los modos de transmisión están en la ayuda de PBP, tan sólo sitúa el cursor sobre la instrucción de la cual tengas dudas y presiona la tecla F1.
> ...



Que tal amigo, vengo realizando un pequeño proyecto con un sensor PIR, que es lo que hace esto, cuando el PIR cambie su estado logico a 1, osea detecta presencia (si se lo puede llamar asi), este manda una alerta vía RS232 (sin driver) a la pc. Se utliza un comando para activar la seguridad y otro comando para desactivar. La gran pregunta es: la alerta me llega a la pc via hyperterminal (el de microcode), todo bien, pero cuando conecto este circuito a un modem GSM para que me mande por SMS la misma alerta, lo hace pero observo que cada vez que yo mando o recibo un comando serialmente al y desde el modem GSM este hace cambiar el estado de o a 1L al PIR, no se si sea por el pic que estoy usando (18F2550), llevo varias semanas inestigando, leyendo la hoja de datos pero no resuelvo este problema, Por favor ayudame compartiendo algun conocimiento que tengas.

saludos


----------



## D@rkbytes (Sep 3, 2014)

Pull1988 dijo:


> la alerta me llega a la pc via hyperterminal (el de microcode), todo bien, pero cuando conecto este circuito a un modem GSM para que me mande por SMS la misma alerta, lo hace, pero observo que cada vez que yo mando o recibo un comando serialmente al y desde el modem GSM, este hace cambiar el estado de o a 1L al PIR, no se si sea por el pic que estoy usando (18F2550), llevo varias semanas investigando, leyendo la hoja de datos pero no resuelvo este problema. Por favor ayúdame compartiendo algún conocimiento que tengas.


Posiblemente tengas que hacer uso de un filtro más estricto para la recepción de datos.
Revisar que otra parte del código no esté interfiriendo con la rutina de alerta.
Tal vez tengas poco filtraje en el circuito y aparte colocar capacitores de 100nF en los pines de alimentación del PIC. Etc.

Sin código es muy difícil poder saber porque está ocurriendo eso.


----------



## papirrin (Sep 3, 2014)

> lo hace pero observo que cada vez que yo mando o recibo un comando serialmente al y desde el modem GSM este hace *cambiar el estado de o a 1L al PIR*,



hay algo raro en lo que dices, donde esta conectado el PIR supongo es de entrada, si esta en modo de entrada no le puede cambiar el estado a menos que lo cambies con alguna instruccion por salida.


----------



## D@rkbytes (Sep 3, 2014)

papirrin dijo:


> hay algo raro en lo que dices, donde esta conectado el PIR supongo es de entrada, si esta en modo de entrada no le puede cambiar el estado a menos que lo cambies con alguna instrucción por salida.


Me supongo que a lo que se refiere que cambia de estado, es la salida del sensor PIR.

Ese que muestro en la imagen lo usé hace muchos años y recuerdo que tuve que hacer una cadena de amplificación con filtros para hacerlo funcionar correctamente.


----------



## papirrin (Sep 3, 2014)

> Me supongo que a lo que se refiere que cambia de estado, es la salida del sensor PIR.



exacto Dark, ahi es lo que se me hace raro, venden modulitos ya con los amplificadores que envian un solo pulso (creo que 1, 2 seg o hasta 20min de pulso) al detectar a alguien, pero nada que ver con que el pic le cambie el estado.

estaria bien que aclarara de que PIR habla, y como es que esta amplificando y acoplando al PIC, si no es un modulo.


----------



## Pull1988 (Sep 3, 2014)

D@rkbytes dijo:


> Posiblemente tengas que hacer uso de un filtro más estricto para la recepción de datos.
> Revisar que otra parte del código no esté interfiriendo con la rutina de alerta.
> Tal vez tengas poco filtraje en el circuito y aparte colocar capacitores de 100nF en los pines de alimentación del PIC. Etc.
> 
> Sin código es muy difícil poder saber porque está ocurriendo eso.



Agradezco mucho tu pronta respuesta, te comento que logré solucionarlo, aqui la aclaración: Al tratarse de un modem que utiliza la tecnología GSM, esta emite y recibe ondas electromagneticas que cuando están cerca en mi caso del sensor PIR, provocaban una interferencia al parecer debido al ruido que estas emanan y hacía que el PIR tenga una lectura erronea, al alejar el modem de este sensor se solucionó el problema.

saludos


----------



## torres.electronico (Sep 3, 2014)

corrijanme si me estoy equivocando.... pero me parece que estoy metiendo la pata en ADCON1... ¿puede ser?
ya llegue a una altura que me estoy mareando y seguro que es algun bit mal configurado...estoy tratando de leer una tension y corriente en el pic16F877A con PORTA.0 y PORTA.1... se me ocurrio probarlo en proteus antes de grabar el micro y... me sale el error que el puertoa.1 no esta configurado, y directamente no me lee y arroja ningun resultado en el display...quizas ustedes vean lo que se me chispoteo...asi lo configure:

```
DEFINE OSC 4

@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_off
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, XT_OSC

;ADCON0=%10001110 
ADCON1=%10000010
TRISA=%11111111              
TRISB=%11111111
TRISC=%00000000
TRISD=%00000000
       
OPTION_REG=%10000010        
INTCON=%10100001           
TMR0=0 
T2CON = %00000110
PR2=124     

DEFINE CCP1_REG   PORTC 
DEFINE CCP1_BIT   2

DEFINE    ADC_BITS    10      
DEFINE    ADC_CLOCK    3      
DEFINE    ADC_SAMPLEUS 50
```

Chas gracias


----------



## papirrin (Sep 3, 2014)

antes de checar a conciencia, te puedo sugerir que pruebes el configurar el registro cmcon.


si no te funciona te ayudo a checarlo en mi compilador XD


----------



## Carl20 (Sep 3, 2014)

saludos.

Estoy realizando un contador ascendente descendente, que puede que sea un tema demasiado gastado, pero es mi proyecto final de materia en la universidad, esto es lo que salio.

A la hora de comenzar a descontar pues no lo hace de la forma como debería, haber si alguien me pudiera ayudar a identificar mi error, se lo agradecería mucho.


----------



## torres.electronico (Sep 3, 2014)

ononononono...para para... acá hay algo raro... si saco la parte del  pwm por hardware (interrupciones y demases), funciona el voltimetro y  amperimetro... 

Ver el archivo adjunto 116916

mirá, este es el programa:


```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 03/09/2014                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

DEFINE OSC 4

@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_off
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, XT_OSC

ADCON1=%10000010
TRISA=%11111111              
TRISB=%11111111
TRISC=%00000000
TRISD=%00000000
       
OPTION_REG=%10000010        
INTCON=%10100001           
TMR0=0 
T2CON = %00000110
PR2=124     
cmcon=6

DEFINE LCD_DREG      PORTD    
DEFINE LCD_DBIT      4        
DEFINE LCD_RSREG  PORTD    
DEFINE LCD_RSBIT  2    
DEFINE LCD_EREG      PORTD    
DEFINE LCD_EBIT   3        
DEFINE LCD_BITS      4    
DEFINE LCD_LINES  4

DEFINE CCP1_REG   PORTC 
DEFINE CCP1_BIT   2

DEFINE    ADC_BITS    10        
DEFINE    ADC_CLOCK    3        
DEFINE    ADC_SAMPLEUS 50        

SYMBOL SUMAR_DUTY  = PORTB.0
SYMBOL RESTAR_DUTY = PORTB.1 
SYMBOL FREC_SUBIR  = PORTB.2   
SYMBOL FREC_BAJAR  = PORTB.3   
SYMBOL TIPO_CELDA  = PORTB.4
SYMBOL PARAR       = PORTB.5
SYMBOL MOD_SUBIR   = PORTB.6
SYMBOL MOD_BAJAR   = PORTB.7

CAMBIO_CELDA  VAR PORTC.3
LED1  VAR PORTC.1
LED2  VAR PORTC.0

MODS     VAR BIT
T_SALIDA_C      VAR BIT
VOLT     VAR  WORD
HAM      VAR  WORD
HVD      var  word
AMPER    var  word
MV       VAR  BYTE
MA       VAR BYTE
U        VAR BYTE
W        VAR BYTE
ADR      VAR BYTE
CONTADOR VAR BYTE
DUTY     VAR BYTE
I        VAR WORD
HAM_DUTY VAR WORD
TIEMPO   VAR WORD

AUXILIAR1 VAR BYTE
AUXILIAR2 VAR BYTE
AUXILIAR3 VAR BYTE    
AUXILIAR4 VAR BYTE     
AUXILIAR5 VAR BYTE     



FRECUENCIA  VAR WORD
PORTB=0
PORTC=0
PORTD=0
ON INTERRUPT GoTo CORTAR
PAUSE 200
LCDOUT $FE,1

ARRANQUE:
LCDOUT $fe,$c0,"HHO PWM CONTROL"
LCDOUT $fe,$90,"BioEEA TorresAM"

PAUSE 500
LCDOUT $FE,1
VOLT=0
DUTY=0:LED1=0:LED2=1

GOSUB FREC_LEER    
GOSUB DISPLAY_LCD
GOSUB CTRL_DUTY
GOSUB PWM_ON

;--------------------------------------------------------------
;--------------------------------------------------------------
INICIO:

IF DUTY>0 THEN
IF TIPO_CELDA=0 AND T_SALIDA_C=0 THEN
  T_SALIDA_C=1
  AUXILIAR3=DUTY 
  GOTO CAMBIO
ENDIF

IF TIPO_CELDA=0 AND T_SALIDA_C=1 THEN
T_SALIDA_C=0
AUXILIAR3=DUTY
GOTO CAMBIO_1
ENDIF
ENDIF

IF PARAR=0 and duty>0 THEN
GOTO DETENER
ENDIF

IF MOD_BAJAR=0  THEN
AUXILIAR1 = 1
GOSUB RESTAR_TIEMPO
ENDIF

IF MOD_SUBIR=0  THEN
AUXILIAR2 = 1
GOSUB SUMAR_TIEMPO
ENDIF

GOSUB FREC_LEER
GOSUB DUTY_CONTROL
GOSUB CTRL_FREC
PAUSE TIEMPO
IF AUXILIAR1 = 1 THEN GOSUB PWM_OFF 
IF AUXILIAR2 = 1 THEN GOSUB PWM_OFF
PAUSE TIEMPO
GOSUB PWM_ON
ADCIN 0,HAM 
IF ADCON0.2=1 THEN INICIO
PAUSE 5 
GOSUB LECTURA_V
ADCIN 1,HAM
PAUSE 5
GOSUB LECTURA_A
GOTO INICIO
;--------------------------------------------------------------
;--------------------------------------------------------------
LECTURA_V: 
       HVD=((HAM+1)*/875)/10 
       RETURN
LECTURA_A:
       HVD=(HAM+1)*/250
       AMPER=HVD/100
       MA=HVD//100
       RETURN               

;--------------------------------------------------------------
;--------------------------------------------------------------
;--------------------------------------------------------------
;--------------------------------------------------------------
SUMAR_TIEMPO:
IF TIEMPO= 900 THEN RETURN
TIEMPO=TIEMPO + 100
RETURN

RESTAR_TIEMPO:
IF TIEMPO= 0 THEN RETURN
TIEMPO=TIEMPO - 100
RETURN


CTRL_FREC:
IF FREC_SUBIR=0 THEN
WHILE FREC_SUBIR=0:WEND
PR2=PR2-1
gosub CTRL_DUTY
IF PR2<5 THEN PR2=5
ENDIF

IF FREC_BAJAR=0 THEN
WHILE FREC_BAJAR=0:WEND
PR2=PR2+1
gosub CTRL_DUTY
IF PR2>124 THEN PR2=124
ENDIF
GOSUB DISPLAY_LCD
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

DUTY_CONTROL:
IF SUMAR_DUTY =0 THEN
CONTADOR=0
DUTY=DUTY+1
IF DUTY=101 THEN DUTY=100
gosub CTRL_DUTY:GOSUB DISPLAY_LCD
 WHILE SUMAR_DUTY=0
 W=1
 IF CONTADOR=>50 THEN
   W=0:CONTADOR=50
   DUTY=DUTY+1:GOSUB DELAY 
   IF DUTY=101 THEN DUTY=100
 ENDIF
 GOSUB CTRL_DUTY
 GOSUB DISPLAY_LCD
 WEND
 W=0:CONTADOR=0
 ELSE 
 W=0:CONTADOR=0
ENDIF

IF RESTAR_DUTY=0 THEN
CONTADOR=0
DUTY=DUTY-1
IF DUTY=255 THEN DUTY=0
GOSUB CTRL_DUTY
GOSUB DISPLAY_LCD
 WHILE RESTAR_DUTY=0
 W=1
 IF CONTADOR=>30 THEN
   W=0:CONTADOR=30
   DUTY=DUTY-1:GOSUB DELAY 
   IF DUTY=255 THEN DUTY=0
 ENDIF
 GOSUB CTRL_DUTY
 GOSUB DISPLAY_LCD
 WEND
 W=0
 ELSE 
 W=0:CONTADOR=0
ENDIF
  
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

CAMBIO:
DUTY=DUTY-1:GOSUB DELAY
IF DUTY>100 THEN 
CAMBIO_CELDA=1:LED1=1:LED2=0
GOTO DUTY_SUBIR
ENDIF
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
GOTO CAMBIO

;----------------------------------------------------------------
;----------------------------------------------------------------

DUTY_SUBIR:
DUTY=DUTY+1:GOSUB DELAY
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
IF DUTY=AUXILIAR3 THEN
GOTO INICIO
ENDIF
GOTO DUTY_SUBIR

;----------------------------------------------------------------
;----------------------------------------------------------------

DETENER:
DUTY=DUTY-1:GOSUB DELAY
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
IF DUTY=0 THEN 
GOTO INICIO
ENDIF
GOTO DETENER

;----------------------------------------------------------------
;----------------------------------------------------------------

CAMBIO_1:
DUTY=DUTY-1:GOSUB DELAY
IF DUTY>100 THEN 
CAMBIO_CELDA=0:LED1=0:LED2=1
GOTO DUTY_SUBIR
ENDIF
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
GOTO CAMBIO_1

;----------------------------------------------------------------
;----------------------------------------------------------------

DELAY: 
  FOR I=0 TO 255:NEXT
RETURN
DELAY1:
  FOR I=0 TO 150:NEXT
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

FREC_LEER:
FRECUENCIA=62500/(PR2+1)     ;FRECUENCIA=62500/(PR2+1) = 500Hz
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

CTRL_DUTY:
HAM_DUTY=(PR2+1)*DUTY/25
CCP1CON.4=ham_DUTY.0
CCP1CON.5=HAM_DUTY.1
CCPR1L=HAM_DUTY>>2
return

;----------------------------------------------------------------
;----------------------------------------------------------------

PWM_ON:
CCP1CON.2=1
CCP1CON.3=1 
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

PWM_OFF: 
CCP1CON.2=0
CCP1CON.3=0
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

DISPLAY_LCD:
LCDOUT $FE,$80,"Duty %",#DUTY
IF DUTY<100 THEN 
GOSUB CONFIG_DIGITO1
LCDOUT $FE,ADR,$20
ENDIF
lcdout $fe,$C0,"FREC.=",#FRECUENCIA
GOSUB CONFIG_DIGITO2
LCDOUT $fe,$90,"VOLT =",DEC VOLT,",",DEC1 MV 
LCDOUT $fe,$D0,"AMPER=",DEC2 AMPER,",",DEC2 MA 
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

CONFIG_DIGITO1:
IF DUTY<100 OR DUTY>9 THEN ADR=$88
IF DUTY<10 THEN ADR=$87
RETURN
CONFIG_DIGITO2:
IF FRECUENCIA>10000 THEN LCDOUT $FE,$CD,"Hz"
IF FRECUENCIA<10000 AND FRECUENCIA>999 THEN LCDOUT $FE,$CC,"Hz "
IF FRECUENCIA<1000 THEN LCDOUT $FE,$CB,"Hz "
RETURN

;*****************************************************************
;++++++++++++++++++++++++ INTERRUPCION +++++++++++++++++++++++++++
;*****************************************************************

DISABLE
CORTAR:
IF W=1 THEN
      CONTADOR=CONTADOR+1 
      IF CONTADOR=101 THEN CONTADOR=0         
ENDIF
INTCON.2=0    
RESUME
ENABLE

END
;*****************************************************************
;*****************************************************************
```

Re  leyendo el programa, le voy acomodar de posicion igualmente la parte en  la que salto a las rutinas de lectura de los puertos... pero fijate que  no necesito configurar referencia externa...
lo mas gracioso, es que  si corto el programa... me anda por separado todo... por ejemplo, si le  saco el voltimetro amperimetro...me funciona el pwm a la perefccion...

Ver el archivo adjunto 116917

si le saco el pwm... me anda el voltimewtro y APERIMETRO 
estan en mi contra  queres que te pase el archivo de proteus? en que formato? 7.10? o 7.0?
saludos


----------



## torres.electronico (Sep 4, 2014)

Ahí lo acomode un poco y mejora la performance de la estructura y lo hace un pocquito mas ligero pero...sigo con el problema de que no tengo lectura.... voy a descargar por las dudas las articulos de Ricardo.... creo que alguna vez citaba la configuracion de los 16F877... no me acuerdo bien... voy a revolver las 141 paginas, salutaciones en general


----------



## D@rkbytes (Sep 4, 2014)

torres.electronico dijo:


> Voy a descargar por las dudas las artículos de Ricardo.
> Creo que alguna vez citaba la configuración de los 16F877. No me acuerdo bien.


¿Qué es lo que necesitas saber exactamente acerca de las configuraciones?


----------



## torres.electronico (Sep 5, 2014)

Hola amigo, me parece que meti la pata en la cconfiguracion de los registros, por que me parece raro que funcione por separado, y junto no funcione....
ahi en el programa, configure la interrupcion por timer, el pwm por hardware y entre ahora en duda si configure bien los dos puertos analogicos para leer ...
Se me chispoteo algo seguro, pero a simple vista no lo veo, y eso me pone mas de los pelos



mira Ricardo.... quiero probar estas configuraciones

```
ADCON0=%11000000       
ADCON1=%10000000     
TRISA=%11111111                    
TRISB=%11111111
TRISC=%00000000
TRISD=%00000000
       
OPTION_REG=%10000010        
INTCON=%10100001           
TMR0=0 
T2CON = %00000110
PR2=124     
DEFINE    ADC_BITS    10        
DEFINE    ADC_CLOCK    3        
DEFINE    ADC_SAMPLEUS 50
```

y ahora no puedo... mepa que despues del escaner antivirus me borro algo por que me sale esto al compilar:



Ahora si que estoy por romper la maquina


----------



## D@rkbytes (Sep 5, 2014)

torres.electronico dijo:


> Hola amigo, me parece que metí la pata en la configuración de los registros, por que me parece raro que funcione por separado, y junto no funcione.
> Ahí en el programa, configuré la interrupción por timer, el pwm por hardware y entré ahora en duda si configuré bien los dos puertos analógicos para leer.
> Se me chispoteo algo seguro, pero a simple vista no lo veo, y eso me pone más de los pelos


Mira el ejemplo que dejo adjunto, en él se hace uso de interrupciones, ADC, LCD y PWM por hardware.

El programa realiza lo siguiente:
.- Se leen dos canales analógicos a 10 bits.
.- Se muestra el valor de ambos canales sobre una pantalla LCD 16x2.
.- Se realiza una interrupción por desborde del Timer0 y otra por cambio de estado en el puerto B <RB4,RB7>
.- Se genera una señal PWM por hardware de 5000Hz.

Esto se realiza en el ejemplo sin conflicto alguno.

Mira las configuraciones realizadas.
Espero te sirvan para comprender y analizar en dónde pueden estar los errores de tu programa.

Suerte.


----------



## torres.electronico (Sep 5, 2014)

uuuuuu, excelente, ahi lo mire desde el TXT y despues simule; Me gusto mucho la manera en que lo haces mucho mas liviano al programa ... Al parecer, y si no mal entendi tu ejemplo, le pifie con mi configuracion: 

ADCON1=%10000010          
OPTION_REG=%10000010  

pero lo uqe no me cierra es que con mi configuracion An0 y 1 estan habilitados al igual que tu ejemplo...

ADCON1 = %10000000      ; Conversión con justificación a la derecha (AN1, AN0) 

mirá, dejame ver si saco algo en limpio con tu ejemplo y lo que escribi yo... El registro de ADCON1 seria entonces:

bit7           _ justificacion a la derecha (1 activa - 0 apaga)
bit6           _ implementacion del reloj en la lectiura / conversion
bit5           _ no se usa
bit4           _ no se usa
bit3-2-1-0 _ se configura los puertos de los cuales, esta seria la tabla de configuracion:

0000 = A7 :An / A6:An / A5:An / A4:An / A3:An / A2:An / A1:An / A0:An

0001 = A7 :An / A6:An / A5:An / A4:An / A3:Vref / A2:An / A1:An / A0:An

0010 = A7Dig / A6Dig / A5Dig / A4:An / A3:An / A2:An / A1:An / A0:An

0011 = A7Dig / A6Dig / A5Dig / A4:An / A3:Vref / A2:An / A1:An / A0:An

0100 = A7Dig / A6Dig / A5Dig / A4:An / A3:An / A2Dig / A1:An / A0:An

0101 = A7Dig / A6Dig / A5Dig / A4:An / A3:Vref / A2ig / A1:An / A0:An

011x = A7Dig / A6Dig / A5Dig / A4Dig / A3Dig / A2Dig / A1:ADig / A0ig

1000 = A7:An / A6:An / A5:An / A4:An / A3:Vref / A2:Vref / A1:An / A0:An

1001 = A7Dig / A6Dig / A5:An / A4:An / A3:An / A2:An / A1:An / A0:An

1010 = A7Dig / A6Dig / A5:An / A4:An / A3:Vref / A2:An / A1:An / A0:An

0011 = A7Dig / A6Dig / A5:An / A4:An / A3:Vref / A2:Vref / A1:An / A0:An

1100 = A7Dig / A6Dig / A5Dig / A4:An / A3:Vref / A2:Vref / A1:An / A0:An

1101 = A7Dig / A6Dig / A5Dig / A4Dig / A3:Vref / A2:Vref / A1:An / A0:An

1110 = A7ig/ A6ig / A5ig / A4ig / A3ig / A2ig / A1ig / A0:An

1111 = A7ig/ A6ig / A5ig / A4ig / A3:Vref / A2:Vref / A1ig / A0:An


 ahora tengo que resolver el tema este que no me compila... y despues voy a tomar parte de tu idea y  ejemplo para hacerlo mas funcional al programa y te comento como me fue... de paso, ya con el compilador funcionando, quizas pueda ver con mas exactitud donde esta el error viendo tu ejemplo.
Gracias amigazo


----------



## torres.electronico (Oct 29, 2014)

Saludos... estoy haciendo un transmisor de presión, caudal, volumen con un 16F876A y se me complico en la etapa del conteo de volumen.



El sensor de presion (Nuova FIMA ST1 ), es un transmisor con salida opcional 4-20mA / 0-5V/ 0-10V; Yo opte por la salida 4-20mA.
El controlador del sensor de caudal (FlowMeet FM-500), me da una salida 4-20mA para caudal (100L/m max.) y una salida de pulsos para Volumen con factor K programable (yo pienso setearlo a 1 pulso por unidad de volumen). Esta ultima parte es un poco engorrosa, ya que en el manual dice:



> Es común contar con la necesidad de tener una salida proporcional al volumen medido, la serie FM-500 resuelve esto de la siguiente manera:
> 
> se dividen los pulsos de entrada por un factor independiente, con este resultado se generan pulsos de salida, en lo que sigue la explicacion ttrataremos con dos factores
> _*FACTOR_K:*_ factor calibrado para el sensor mecanico
> ...


a lo cual supongo e interpreto que me da un pulso por cada unidad de volumen y contándolos por segundo, los voy sumando y con esto saco el volumen instantáneo... El tema esta en como realizar el conteo y que no se me desborde la variable puls (*byte*) y se me ponga en cero... Calculo yo que puedo llegar a contabilizar como max. un volumen de 9.900Lts.
Esto es lo que tengo hasta el momento:


```
count PORTB.1,1000,puls
temp3 = temp3 + puls

ADCIN 0, ent420_presion                            ;600bar/1024=presion
TEMP1 = 488 * ent420_presion                       ; 1024*488=499712
VAL1 = DIV32 10
LCDOUT $fe,1,"P:",DEC VAL1 DIG 3,DEC VAL1 DIG 2,".",DEC VAL1 DIG 1, DEC VAL1 DIG 0,"Bar"

PAUSE 5

ADCIN 1, ent420_caudal                            ;1000ltsM/1024=caudal
TEMP2 = 488 * ent420_caudal                       ; 1024*488=499712
VAL2 = DIV32 10
lcdout $fe,$C0,"C:",DEC VAL2 DIG 3,DEC VAL2 DIG 2,"L/m Vol",dec temp3

PAUSE 5
```
Creería que puede llegar a funcionar la lectura de todo, pero estaría  el error de desbordamiento en la sección del conteo de volumen histórico; Alguien me da alguna idea... Saludos a todos

---------- Actualizado después de 36 minutos ----------


bueno...  Por el momento, tendré que hacer que la variable puls sea del tipo *word*  para que haga el conteo hasta 9999... después veré si hay alguna otra  manera para no tener que partir el word en dos byte y enviar ese dato a  la PC y desde el soft juntar los dos byte


----------



## cosmico74 (Ene 8, 2015)

¡Hola,feliz año 2015 a todos!
               Bueno pues con la novedad de que necesito un poco de ayuda de ustedes
               y quiero que me ayuden a resolver algunas dudas sobre una practica que quiero realizar y es la siguiente: 

               controlar y visualizar 3 entradas ADC con el PIC16f887 atravez de tres potenciometros a 10 bits o a 8 bits(cualquiera)

               saben ya lo he realizado pero con un solo canal ADC y funciona bien pero aqui mi duda es como configurar
               los registros ADCON0 y ADCON1 para que pueda manejar las 3 entradas analogicas y mostrarlas en un display lcd
               ya le eche una leida al datasheet PIC16F887 pero no le hallo la manera lo unico que rescate es que este pic usa 
               los ANSEL (parte baja) ANSELH (PARTE ALTA) para configurar cuales pines seran digitales y cuales analogicos.
               en los pic que he trabajado el PIC16F877A y el PIC16F819 en sus datasheet ya traen una tabla para seleccionar
               cuantos canales y cuales se van van a utilizar pero como tengo 2 PIC16F887 los quiero poner a trabajar 

               En resumen quiero por favor quien haya manejado este pic que me ayude a configurar el ADCON0 y el ADCON1,o que me de alguna
               idea o algun ejemplo,logicamente cuando ya se manejan mas de 2 potenciometros o sensores analogicos.
               el programa esta en pic basic pro.

               Otra duda que tengo es que este pic trabaja a 10 bits de resolucion ADC y por ahi he leido que si pongo en el ADCON1 
               el bit 7 justificado a la derecha trabajara a 10 bits y si pongo justificado a la izquierda trabajara a 8 bits es cierto
               o me equivoco? bueno esto fue lo que entendi.

               Aqui el programa y diagrama en proteus.


----------



## D@rkbytes (Ene 8, 2015)

cosmico74 dijo:


> En resumen, quiero por favor quien haya manejado este pic que me ayude a configurar el ADCON0 y el ADCON1, o que me de alguna idea o algún ejemplo, lógicamente cuando ya se manejan mas de 2 potenciometros o sensores analógicos.
> El programa está en pic basic pro.


               Pues así como tienes tu programa, tan sólo te hace falta usar los otros canales, no has configurado los registros ANSEL y ANSELH, así que se encuentran todos sus bits en 1.
ANSEL = ANS 7<>0 y ANSELH = ANS 13<>8
Entonces los pines donde tienes conectados los potenciómetros, serán análogos.
Así que si usas ADCIn 0, 1 y 2, debes obtener las lecturas de esos canales.
Pero si quieres que los canales sobrantes sean digitales, entonces configuras ANSEL y ANSELH de esta forma:
ANSEL = %00000111
ANSELH = 0

Como ya usaste algunas configuraciones usando las definiciones de PBP para el conversor ADC, entonces sale sobrando que configures el registro ADCON0.

ADCON1 no quedará bien configurado usando las definiciones de PBP para 10 bits y es donde entra esta parte...


cosmico74 dijo:


> Otra duda que tengo es que este pic trabaja a 10 bits de resolución ADC y por ahí he leído que si pongo en el ADCON1 el bit 7 justificado a la derecha trabajara a 10 bits y si pongo justificado a la izquierda trabajara a 8 bits. ¿Es cierto o me equivoco?
> Bueno, esto fue lo que entendí.


Lo que hace el bit 7 (ADFM = A/D Conversion Result Format Select bit) del registro ADCON1, es lo siguiente...
1 = Justificación a la derecha. Los 6 bits más significativos de ADRESH se leerán como "0"
   0 = Justificación a la izquierda. Los 6 bits menos significativos de ADRESL se leerán como "0"

Y por eso se pone el bit 7 en 1 cuando se usan los10 bits, pues resulta más sencilla la lectura de los registros ADRESL y ADRESH con el resultado de ADRESH justificado a la derecha.

Así que nada más te resta la configuración de los registros ANSEL y ANSELH para convertir los pines con ADC no usados, en digitales.

Nota, algo importante:
Cuando muestras valores con más de un dígito usando DEC Valor, es mejor que lo hagas tomando en cuenta cuantos dígitos máximo serán mostrados.
Esto lo haces usando DECX (Donde X será la cantidad de dígitos a mostrar)
Así evitas que valores anteriores que queden en la CGRAM, alteren la visualización del resultado actual.

Entonces si usas 10 Bits = 1023, usas Dec4 y de esta forma cuando la lectura decremente, se observaran ceros a la izquierda.


----------



## juancaca (Ene 8, 2015)

hola amigos buenas noches vengo por aca buscando una ayuda con este codigo, es variador de velocidad activado por interrupcion en el puerto B0 y por TMR0, resulta que cuando quiero visualizar en un display LCD, el programa se desconfigura, he tratado de usar la instruccion SEROUT para visualizarlo en otro pic pero tambien pasa lo mismo.
He intentado varias cosas pero no me da  .
De ante mano muchas por tan excelente foro me a ayudado bastanto a enterder el lenguaje Basic.
Aqui el codigo y adjunto la simulacion en proteus 8.


```
CLEAR                                                       ;Limpio la memoria RAM
INCLUDE "MODEDEFS.BAS"
DEFINE CHAR_PACING 1000
'************************** CONFIGURACION DE FUSES *****************************

_INTRC_OSC_NOCLKOUT                                         ' Reloj interno solo.-
_WDT_OFF                                                    ' Watchdog Timer desconectado.-
_PWRT_ON                                                    ' Power-On Timer conectado.- 
_BOD_OFF                                                    ' Brown-Out Detect conectado.- 
_MCLR_OFF                                                   ' Master Clear Externo desconectado.-
_LVP_OFF                                                    ' Low-Voltage Programming desconectado.-
_CPD_OFF                                                    ' Data Memory Code Protect desconectado.-
_PROTECT_OFF                                                ' Program Code Protection desconectado.-

'******************** DEFINICION DE REGISTROS Y PUERTOS ************************

CMCON = 7 
TRISA = %0111
TRISB = %00000000
PORTB = %11111100
'PORTB = %001000
'****************** DEFINICION DE LA PANTALLA LCD ******************************

DEFINE LCD_BIT 4
DEFINE LCD_LINES 2
DEFINE LCD_DREG PORTB                                       ; configuro la pantalla LCD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT  2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3

'******************** ASIGNACION DE VARIABLES **********************************
 
DISMINUIR   VAR PORTA.0
START_STOP  VAR PORTA.1
AUMENTAR    VAR PORTA.2
;LEDR        VAR PORTB.3
LEDV        VAR PORTA.3
ON_OFF      VAR BIT
POWER       VAR WORD
VISUALIZAR  VAR BYTE
'******************** ASIGNACION DE ALIAS AL REGISTRO INCONT *******************

SYMBOL GIE  = INTCON.7                                      ;Habilitador de interrupciones, 1 habilita - 0 desabilita 
SYMBOL TOIE = INTCON.5                                      ;Habilita la interrupcion por TMR0, 1 habilita - 0 desabilita
SYMBOL INTE = INTCON.4                                      ;Habilita la interrupcion por RB0, 1 habilita - 0 desabilita
SYMBOL TOIF = INTCON.2                                      ;Bandedera de interrupcion por desborde del TMR0, 1 TMR0 pasa de 255 a 0
SYMBOL INTF = INTCON.1                                      ;Bandera de interrupcion por RB0, 1 cuando ocurre interrupcion por RB0

'******************** ASIGNACION DE ALIAS AL REGISTRO OPTION *******************

'symbol RBPU   = OPTION_REG.7                                ;Activacion de las resistencias PullUp 1 ON - 0 OFF
'SYMBOL INTEDG = OPTION_REG.6                                ;Flanco activo de la int. externa 1 ASCENDENTE - 0 DESCENDENTE
'SYMBOL TOCS   = OPTION_REG.5                                ;Senal de reloj 1 POR RA4 - 0 RELOJ INTERNO
''SYMBOL TOSE   = OPTION_REG.4                                ;Incremento de TMR0 por RA4
'SYMBOL PSA    = OPTION_REG.3                                ;Divisor de frecuencia 1 WTD - 0 TMR0
'SYMBOL PS2    = OPTION_REG.2                                ;1        1        1       1       0       0      0      0
'SYMBOL PS1    = OPTION_REG.1                                ;1 = 256  1 = 128  0 = 64  0 = 32  1 = 16  1 = 8  0 = 4  0 = 2
'SYMBOL PS0    = OPTION_REG.0                                ;1        0        1       0       1       0      1      0

ON INTERRUPT GOTO IRS                                       ;Habilito la interrupcion

'INTCON = %10010000                                          ;Habilito las interrupciones por RB.0 y por el Timer0
'OPTION_REG=%00000101                                        ;configuro el registro OPTION_REG
HIGH LEDV                                                   ;
PAUSE 2000                                                  ;Prender y apagra el led durante 2 segundos
LOW LEDV                                                    ;
POWER= 216                                                  ;Inicio la variable power con 255
TMR0=126                                                    ;Inicio el TMR0 con 126 

'************************* INICIO DEL PROGRAMA *********************************

INICIO:        
'        SEROUT PORTB.2,T2400,[POWER,13,10]  
'        LCDOUT $FE, 1, "ESTADO:"
'        LCDOUT $FE, $C0, dec power,"-", dec TMR0
        'pause  500
        IF  START_STOP=0    THEN PRENDER_APAGAR
        IF  DISMINUIR=0     THEN BAJAR
        IF  AUMENTAR=0      THEN SUBIR
        
GOTO INICIO

'************************** PRESION DE TECLAS **********************************

PRENDER_APAGAR:

        IF  START_STOP=0  THEN                              ;Si start-stop es = 0
        while START_STOP=0
        wend       
        pause 50                                            ;pause 50 ms
        toggle ON_OFF                                       ;Colocar en estado contrario la bandera on_off 
                                                            ;(si esta en 1 pase a 0 o viceverza)
        ENDIF
    IF  ON_OFF=1 THEN                                       ;Si on_off esta en 1 
        HIGH LEDV                                           ;Prender led verde        
        OPTION_REG=%11000101                               ;RBPU=1- INTEDG=1- T0CS=0- T0SE=0- PSA=0- PS=64
'        RBPU= 1 : INTEDG= 1 : TOCS= 0 : PSA= 0 : PS2= 1 : PS1=0 : PS0= 1                     
        GIE= 1 : INTE= 1 :
        TRISB.0=1                                           ;Activar la interrupcion por RB0   
    else
        ON_OFF=0
'        IF power <= 255 THEN 
'            POWER = 255
'        ENDIF
        POWER = 216
        TRISB.0=0        
        LOW portb.1
        LOW LEDV
        OPTION_REG=%10000000
        INTCON=%10010000
    ENDIF
GOTO INICIO

BAJAR:

        IF  DISMINUIR=0 THEN
        while DISMINUIR=0
        wend
        POWER=POWER+10 
            IF POWER>=255 THEN 
               POWER = 255                                                         
            ENDIF
        ENDIF
GOTO INICIO

SUBIR:

        IF AUMENTAR=0 THEN
        while AUMENTAR=0
        wend
        POWER=POWER-10    
            IF POWER<=127 THEN 
               POWER=127                            
            ENDIF
        ENDIF
GOTO INICIO

''***************************** INTERRUPCION ************************************
 
disable
IRS:                                 
    if INTF = 1 then                                        ;Pregunto si bandera de interrupcion por RB0 esta en 1 entonces                             
       toie = 1                                             ;Habilita la interrupcion por TMR0 habilita la interrupción por B.0       
       TMR0=126-power                                       ;Variar el valor del TMR0 
       LOW portb.1                                          ;Apago portb.1
       intf = 0                                             ;Bandera de interrupcion por RB0, 0 para inicializar la interrupcion por RB0
    ENDIF

    IF TOIF = 1 THEN                                        ;habilito la bandedera de interrupcion por desborde del TMR0                                                       
       HIGH PORTB.1                                         ;Prendo el puerto portb.1
       TOIF = 0                                             ;Bandedera de interrupcion por desborde del TMR0, 0 para inicializar       
       
    ENDIF

RESUME 'PRENDER_APAGAR                                      ;Volver a donde ocurrio la interrupcion
ENABLE                                                      ;Habilito la interrupcion
END                                                         ;Fin del programa
```

PD: Disculpa subi los archivos que no eran, el codigo sirve para los dos, lo unico es modificar el codigo para que funcione.

en archivo final con LCD y RS232 esta el codigo del otro pic que recibe los datos.

.


----------



## D@rkbytes (Ene 8, 2015)

juancaca dijo:


> Hola amigos, buenas noches, vengo por acá buscando  una ayuda con este código, es variador de velocidad activado por interrupción en el puerto B0 y por TMR0, resulta que cuando quiero  visualizar en un display LCD, el programa se desconfigura, he tratado de  usar la instrucción SEROUT para visualizarlo en otro pic pero también  pasa lo mismo.
> He intentado varias cosas pero no me da.


Pues yo veo dos cosas raras con lo que adjuntas.


Únicamente adjuntas el programa de un microcontrolador. U1, pero ese PIC no tiene la pantalla.
Al no tener conectada ninguna pantalla, pues es lógico que cuando uses las instrucciones LCDOut, todo se comporte extraño, porque tienes configurado usar el puerto B para la pantalla y al mismo tiempo para otros periféricos en uso.


----------



## juancaca (Ene 8, 2015)

Darkbyte muchas gracias por responder, ya edite de nuevo y monte los archivos correctos para que los puedan mirar.

Cordial saludo.


----------



## D@rkbytes (Ene 8, 2015)

juancaca dijo:


> D@rkbytes, muchas gracias por responder, ya edité de nuevo y monte los archivos correctos para que los puedan mirar.


A ver, algo sigue mal entonces.
Aún sigue faltando un archivo. "ensayo lcd.hex" ese es para U2.
Y para U1, se tiene como referencia al archivo "VARIADOR DE VELOCIDAD FINAL.hex", pero estás adjuntando un archivo llamado "Enlace RS232 y LCD.bas"

Corrige esos detalles y adjunta el proyecto con los archivos correctos en cada PIC, de otra forma no se puede saber qué está pasando.
Comprende que si falta un archivo, no se puede ejecutar la simulación.



juancaca dijo:


> El código sirve para los dos, lo único es modificar el código para que  funcione.
> 
> En el archivo final con LCD y RS232 está el código del otro pic que recibe los datos.


No había visto este nuevo agregado del post #2829.

Vamos a empezar por corregir la palabra de configuración:
La que tienes no es válida para PICBasic Pro.
Debes usar ésta, tomando como base la que pusiste:

```
[COLOR=SeaGreen]@ Device INTRC_OSC_NOCLKOUT,WDT_OFF,MCLR_OFF,PWRT_ON,BOD_OFF,LVP_OFF[/COLOR]
```
También es necesario que especifiques la frecuencia de operación con *Define* OSC 4 ( Por ejemplo.)
En este caso no hay problema, pues estás usando el oscilador interno de un PIC16F628A y por defecto estará en 4MHz. Y PBP usa esa frecuencia por defecto cuando no se especifíca.
Pero si usas un cristal u otra frecuencia que no sea de 4MHz. Si tendrás que definirla.
Tampoco es conveniente que coloques retardos dentro del bucle cuando haces uso de *SerIn*

Ahora, ¿Podrías explicar con detalles qué es lo que ocurre?
¿Cuál es el problema específicamente cuando te refieres a que el programa se desconfigura?


----------



## juancaca (Ene 8, 2015)

D@rkbytes dijo:


> A ver, algo sigue mal entonces.
> Aún sigue faltando un archivo. "ensayo lcd.hex" ese es para U2.
> Y para U1, se tiene como referencia al archivo "VARIADOR DE VELOCIDAD FINAL.hex", pero estás adjuntando un archivo llamado "Enlace RS232 y LCD.bas"
> 
> ...



Hola darkbyte lo unico que hay que hacer es montarle nuevamente el codigo hex a los micros, osea los que adjunte, los que aparecen como referencia no son, no se porque lo esta mostrando.
El archivo rar que dice  	VARIADOR DE VELOCIDAD Final con LCD.rar  es el codigo que coloque en el post y sirve para el que dice VARIADOR DE VELOCIDAD Final con LCD y RS232.rar, para el pic que recibe el dato tambien le montas el archivo .hex que se encuentra VARIADOR DE VELOCIDAD Final con LCD y RS232.
de  muchas gracias


----------



## juancaca (Ene 8, 2015)

> Vamos a empezar por corregir la palabra de configuración:
> La que tienes no es válida para PICBasic Pro.
> Debes usar ésta, tomando como base la que pusiste:
> 
> ...



Hola, en esta parte me toco colocar la configuracion de los fuses asi ya que utilizo w7 a 64 bit y no me dejaba compilar con el que trae PBP.




> Tampoco es conveniente que coloques retardos dentro del bucle cuando haces uso de *SerIn*



Bueno en esta parte si me perdi, yo he puesto el SEROUT en la interrupcion, en la etiqueta inicio y a un asi el programa no trabaja bien.



> Ahora, ¿Podrías explicar con detalles qué es lo que ocurre?
> ¿Cuál es el problema específicamente cuando te refieres a que el programa se desconfigura?



Este programa lo que hace es detectar el cruce por cero por B.0 a 60 Hz de la red, yo cojo los dos ciclos y me queda en 120 Hz, la cosa radica en que cuando voy a ingresar el codigo para visualizar en el LCD o con la instruccion SEROUT, ya no me trabaja a los 120 Hz y se distorciona el ciclo de trabajo.

Una pregunta cuantos ciclos de maquina utiliza la instruccion LCDOUT y la SEROUT?


----------



## D@rkbytes (Ene 9, 2015)

juancaca dijo:


> Este programa lo que hace es detectar el cruce por cero por B.0 a 60 Hz de la red, yo cojo los dos ciclos y me queda en 120 Hz.
> La cosa radica en que cuando voy a ingresar el código para visualizar en el LCD o con la instrucción SEROUT, ya no me trabaja a los 120 Hz y se distorciona el ciclo de trabajo.
> 
> Una pregunta: ¿Cuantos ciclos de maquina utiliza la instrucción LCDOUT y la SEROUT?


OK. He realizado algunos cambios importantes al programa, tanto en la forma de llamar a las rutinas, ahora se hace uso de la instrucción "Button", el uso del módulo USART para mejorar la transmisión y recepción de datos, y otras cosas como la activación y detención del motor.

Anteriormente estabas creando una contención lógica al hacer salida RB0. Ahora eso se ha corregido.

Ahora ya se puede visualizar correctamente la lectura RS-232 en la pantalla, esto te servirá para mirar bien el valor enviado por el PIC transmisor.

El diseño de simulación también lo he modificado para trabajar únicamente con señales digitales y hacer más ligera la ejecución.
Sobre este aspecto hay algo importante. Tu simulador es una versión inferior al que yo tengo y posiblemente no puedas abrir el que adjunto, pero también incluyo el mismo diseño con la versión 7.10 que sí podrás abrir con la versión 8.
Ejecuta ISIS y en el dialogo de abrir, seleccionas Desing Files en vez de Project Files.

Así como está ahora el programa de control del motor, ya será más fácil que puedas encontrar errores.
Necesitas ver como funciona ahora e ir viendo la forma de onda en cuanto al valor de POWER.

Y en cuanto a cuantos ciclos de máquina se ejecutan en las instrucciones LCDOut y SerOut, es complicado saber, se tendrían que encontrar esas rutinas en el archivo *.lst que se crea al compilar.

Como nota final:
Los programas los compilé usando PBP3, pero puedes comentar la palabra de configuración y cargar los archivos *.hex, en vez de los archivos *.cof.

Y así como tienes declarada la palabra de configuración, no creo que tenga efecto.
Mira por aquí para que veas como lo puedes hacer con Windows a 64 bits. Fuses con MPASM


----------



## papirrin (Ene 31, 2015)

Pregunta:

alguien sabe como detectar un deborde de una suma de dos variables con ensamblador embebido, en otras palabras, quiero hacer una suma y ver si deborda.

pseudocodigo:
A var byte
B var byte

A=100
B=180
A=A+B 

Aqui el resultado *A* seria 280 pero como es de tipo byte desbordaria y queria saber si se coloca el valor en el registo F o W como 1 si se desborda o 0 si no desborda o en alguna bandera. para despues mover ese valor con RLF a una variable *Temp* mas o menos asi:

@ RLF X,w  
donde *X *es 1 si debordo y 0 si no desbordo la suma...

ya lo intente pero no funciono, porque al parecer ahi no se registra el desborde y quiero hacer la rotacion en ensamblador para evitar usar mucho codigo, o algun algoritmo que no implique usar mucho codigo BASIC que genere mucho codigo ASM.

espero haberme explicado XD


----------



## jesusmolo (Ene 31, 2015)

mecatrodatos dijo:


> El codigo con referente al reloj calentario lo estaba realizando teniendo las siguientes consideraciones, selecionar el dia , el mes ,el año y el uso horario es decir 24 hrs y 12 hrs en el utimo caso apareciendo en el lcd AM y PM respectivamente por medio de tres pulsadores, se podia acceder al menu correspondiente actualizandose el reloj una vez configurado. lo de la alarma  tiene el mismo principio ya que solamente habria que accesar a la memoria EEPROM del pic a utilizar guardar una constante para luego cambiarla por medio de un menu y activarla cuando llegase la hora.
> 
> dejo aqui el codigo en pic basic pro es extenso
> 
> ...



Hola, podrias explicar el programa. gracias


----------



## D@rkbytes (Ene 31, 2015)

papirrin dijo:


> Pregunta:
> 
> ¿Alguien sabe como detectar un desborde de una suma de dos variables con ensamblador embebido?
> En otras palabras, quiero hacer una suma y ver si desborda.
> ...


A ver si entendí y con esto lo puedes hacer:

```
sumar
    movlw    valor        ; Mover el contenido de "valor" a W
    addwf    suma,w        ; Sumar W con el contenido de "suma"
    btfsc    STATUS,C    ; Comprobar si hubo desborde con el bit Carry
    goto    desborde    ; Si se produce desborde, ir a "desborde"
    clrf    x            ; No se produjo desborde, limpiar "x" x = 0
    return                ; Regresar
desborde
    movlw    .1            ; W = 1
    movwf    x            ; Poner en 1 el bit 0 de "x" x = 1
    return                ; Regresar
```
Por este mismo tema subí un ejemplo de cómo declarar la variables para usarlas dentro del código ensamblador.

Las variables a usar serían: valor, suma y x


----------



## papirrin (Ene 31, 2015)

Okis Darkbytes, esa era la bandera que no encontraba.... Gracias... 

(si ya me habias explicado eso de las variables.XD)


----------



## astroloco (Feb 1, 2015)

Hola a todos. Espero me puedan ayudar, soy novato en PICBasic Pro.

He estado intentando realizar un circuito con el PIC16F628A.
Al presionar un pulsador encender un led en modo estrobo, apagarlo con el mismo pulsador al volver a presionarlo, pero solo he podido lograr encenderlo, y después quiero apagarlo con el mismo pulsador y no se apaga.

Muchas gracias por su ayuda .


```
EST VAR BYTe
BUT VAR BYTE
BUT = 0 
X VAR BIt

 
 
 
TRISB = %11000000  ;configuracion de salidas y entradas del puerto  B

                   
 RECIBIR:
 
 
 
 IF PORTB.7 = 1 THEN
   X = X + 1
 While  X = 1 \'Condicional While - Wend
 
    HIgh PORTB.3    \'Enciende el led estrobo 
    PAUSE 120   \'pause de 0.12 segundos
    LOW PORTB.3    \'Apaga el led estrobo 
    PAUSE 120  \'pause de 0.12 segundo
      
 Wend
 ENDIF   
   
 BUTTON PORTB.6,1,0,0,BUT,0,RECIBIR 
 TOGGLE PORTB.3
  
GOTO RECIBIR 

   
 End
```


----------



## Miembro eliminado 356005 (Feb 1, 2015)

Te falta alguna instrucción para que X vuelva a 0.

Algo así:

```
IF PORTB.7 = 1 THEN
	IF X = 1 THEN
		LOW PORTB.3	; aquí apagamos
		X = 0
	ELSE
		HIGH PORTB.3	; aquí encendemos
		X = 1
	ENDIF

	PAUSE 120
ENDIF
```


----------



## D@rkbytes (Feb 1, 2015)

astroloco dijo:


> Hola a todos. Espero me puedan ayudar, soy novato en PICBasic Pro.
> 
> He estado intentando realizar un circuito con el PIC16F628A.
> Al presionar un pulsador encender un led en modo estrobo, apagarlo con el mismo pulsador al volver a presionarlo, pero solo he podido lograr encenderlo, y después quiero apagarlo con el mismo pulsador y no se apaga.


Prueba de esta manera:

```
; Declaración de varibles.
B0          Var Byte
Flag        Var Bit

; Nombres para los pines.
Symbol LED      = PORTB.4
Symbol Pulsador = PORTB.0


Inicio:
    CMCON = 7               ; Comparadores analógicos OFF
    OPTION_REG = 0          ; Pull-Ups (PORTB) y Falling edge (INT-RB0)
    INTCON = %11010000      ; Habilitar interrupción por RB0
    
    On Interrupt GoTo SDI_RB0
    
    Flag = 1
    Low LED        

Programa:
    Button Pulsador,0,10,255,B0,0,Programa
        While Flag = 0 
            Toggle LED
            Pause 50
        Wend
        Low LED
        Flag = 0
    GoTo Programa

SDI_RB0:
    Disable
    
    If INTCON.1 = 1 Then INTCON.1 = 0   ; Limpiar flag INTF
    
    If Flag = 0 Then Flag = 1
    
    Resume
    Enable
    
    End
```
Espero que sea lo que quieres hacer.
Si tienes problema con los fuses para la palabra de configuración, no dudes en preguntar.

Suerte.


----------



## astroloco (Feb 1, 2015)

Gracias amigos, una última duda en el caso de querer hacer el led titile o centelle , como seria  para hacer que al pulsar el sw titile y al volver a pulsar el mismo sw se apague. Muchas gracias y saludos


----------



## D@rkbytes (Feb 2, 2015)

astroloco dijo:


> Gracias amigos. Una última duda: En el caso de querer hacer que el led titile o centelle.
> ¿Cómo sería  para hacer que al pulsar el sw titile y al volver a pulsar el mismo sw se apague?


Creo que no probaste el código que puse, ese programa eso es lo que hace.
Mencionaste hacer un estrobo. ¿No?
Con una presión del pulsador se enciende y apaga el LED cada 50ms y con otra se apaga.

Edit:
Mejoras para eliminar rebotes del pulsador...

```
; Declaración de variables.
B0          Var Byte
Flag        Var Bit

; Nombres para los pines.
Symbol LED      = PORTB.4
Symbol Pulsador = PORTB.0


Inicio:
;    CMCON = 7               ; Comparadores analógicos OFF
    OPTION_REG = 0          ; Pull-Ups (PORTB) y Falling edge (INT-RB0)
    INTCON = %11010000      ; Habilitar interrupción por RB0
    
    ; Activar el servicio de interrupciones.
    On Interrupt GoTo SDI_RB0
    
    Flag = 1                ; "Flag" en 1 al iniciar.
    Low LED                 ; "LED" en 0 al iniciar.

Programa:
    Button Pulsador,0,127,255,B0,0,Programa
       Pause 50
       
        While Flag = 0      ; Mientras "Flag" es 0... 
            Toggle LED      ; Cambiar de estado "LED"
            Pause 50        ; Hacer un retardo. (Aquí se cambia el tiempo del destello)
        Wend                ; Salir del bucle cuando "Flag" cambie a 1
        
        Low LED             ; "LED" en 0
        
        While Pulsador = 1  ; Mientras "Pulsador" esté en 1...
            Pause 20        ; Hacer un retardo de 20ms.
        Wend                ; Salir cuando "Pulsador" sea 0
        
        Flag = 0            ; Establecer "Flag" en 0
        
    GoTo Programa

; Servicio de interrupción por RB0
SDI_RB0:
    Disable                 ; Desactivar interrupciones.
    
    If INTCON.1 = 1 Then    ; Si es interrupción por RB0, entonces...
        If Flag = 0 Then    ; Si "Flag" está en 0, entonces...
            Flag = 1        ; Establecer "Flag" en 1
        EndIf
        INTCON.1 = 0        ; Limpiar flag INTF
    EndIf
    
    Resume                  ; Retornar al programa (RETFIE)
    Enable                  ; Volver a activar interrupciones.
    
    End
```
Al pin del pulsador se le tiene que colocar un capacitor de 100nF hacia negativo.


----------



## astroloco (Feb 2, 2015)

Hola  Darkbytes , Si lo probé el problema que tuve fue que no me fije con que lógica tenías tú el pulsador en el código que me enviaste, yo lo tenía con lógica  Activo-Alto, y por eso no me funciono, la primera vez, hasta que vi tu otro comentario, fue que pensé que algo avía hecho mal ya era justo lo que necesito , me doy cuenta que yo anda muy lejos de encontrar el código apropiado. 

Te agradezco mucho tu ayuda,


----------



## D@rkbytes (Feb 2, 2015)

astroloco dijo:


> Hola  Darkbytes.  Si lo probé.
> El problema que tuve fue que no me fijé con que lógica tenías tú el pulsador en el código que me enviaste.
> Yo lo tenía con lógica  Activo-Alto, y por eso no me funciono la primera vez.


OK. Para que eso no te vuelva a suceder, debes analizar los parámetros de la instrucción "Button"
Sobre todo el segundo "Down" = Estado del pin cuando se oprime el pulsador (0 o 1)


			
				La ayuda de PBP dijo:
			
		

> *Down*    State of pin when button is pressed (1..0)


También está la configuración del registro OPTION_REG que en el comentario dice lo siguiente:
"Falling edge (INT-RB0)" O sea, la interrupción ocurrirá por flanco de bajada. (Cuando RB0 pase de 1 a 0)
Notarás que está todo en 0 porque nos interesa tener el bit 7 (RBPU) y el 6 (INTEDG) en 0
Los demás no importa que queden en 0 pues no se van a usar y no afectan al programa si quedan en 0.

En el post anterior puse el código comentado y con unas mejoras para tratar de evitar los rebotes del pulsador.

Suerte.


----------



## jesusmolo (Feb 2, 2015)

Hola, buenas tardes. 
Estoy iniciando con el uso de los LCD  y pulsadores tomando como ejemplo el siguiente ejercicio donde se realiza con 2 pulsadores un incremento y decremento de un valor mostrado en el LCD.

¿Quisiera saber como haría para ir de la letra "A" a la letra "Z"  o de la letra "Z" a la "A" con este mismo ejemplo de programa?

Gracias.  


```
DEFINE LCD_DREG PORTB ' Indica que el Bus estará conectado en el Puerto B

DEFINE LCD_DBIT 4      ' Selección del Bit de inicio del puerto en el uC para el
                                ' bus de datos de la LCD
DEFINE LCD_RSREG PORTB ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 3     ' "RS" estará conectado en RB3
DEFINE LCD_EREG PORTB  ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 2      ' "E" estará conectado en RB2
Define Osc 4            ' Define el Oscilador para un Cristal
                             ' de 4 Mhz.
TRISA = $FF            ' Configura el puerto A como entrada.
TRISB = $00            ' Configura el puerto B como salida.
Dato Var Byte          ' Declaración de la Variable "Dato" tipo Byte.
Dato = 25              ' Inicializa la Variable Dato = 25.
Lcdout $fe, 1          ' Limpia la pantalla
Inicio:

Lcdout $fe,2              ' Inicio de la primera línea.
Lcdout "P1 Suma P2 Resta" ' Escribe mensaje en la primera línea.
Lcdout $fe,$C0,"Dato: ",Dec Dato," " ' Escribe el mensaje en la 2da línea
                                     ' seguido del valor cargado en la
                                     ' variable "Dato" en Decimal.
                                     
                                     
                                     
If PORTA.1 = 1 And Dato < 50 Then Call Suma 
                                            ' La siguiente instrucción pregunta si hay un "1" en RA1 y si la variable
                                            ' "Dato" es menor a 50. Si se cumplen estas dos condiciones, hace un salto
                                            ' con retorno a la subrutina "Suma".  
                        
                                            
If PORTA.3 = 1 And Dato > 0 Then Call Resta ' La siguiente instrucción pregunta si hay un "1" en RA3 y si la variable
                                            ' "Dato" es mayor a 0. Si se cumplen estas dos condiciones, hace un salto
                                            ' con retorno a la subrutina "Resta".



GoTo Inicio                ' Salta a la etiqueta "Inicio".
Suma:
Dato = Dato + 1            ' Incrementa en una unidad la variable "Dato".
Pause 350                  ' Realiza una pausa de 350 milisegundos para evitar
                           ' que el incremento de la variable sea muy acelerado
                           ' mientras el pulsador "P1" esté presionado.
Return                     ' Retorna una línea después del llamado "Call Suma".
Resta:
Dato = Dato - 1            ' Decrementa en una unidad la variable "Dato".
Pause 350                  ' Realiza una pausa de 350 milisegundos para evitar
                           ' que el decremento de la variable sea muy acelerado
                           ' mientras el pulsador "P2" esté presionado.
Return                     ' Retorna una línea después del llamado "Call Resta".
End
```


----------



## papirrin (Feb 2, 2015)

en la ayuda dice:


> If a pound sign (#) precedes an Item, the ASCII representation for each digit is sent to the LCD.



si un signo # antecede a un elemento, la representacion ASCII para cada digito se envia al LCD

asi que prueba asi:
Lcdout $fe,$C0,"Dato: ",#Dato


----------



## Miembro eliminado 356005 (Feb 2, 2015)

D@rkbytes dijo:


> Edit:
> Mejoras para eliminar rebotes del pulsador...


Hola.

Quiero recordar que el método Button ya tiene un procedimiento antirebote.

De la documentación:

*BUTTON**BUTTON Pin,Down,Delay,Rate,BVar,Action,Label*​Lee un *Pin* y, opcionalmente, realiza un antirebote y una autorepetición. *Pin* se ajusta automáticamente como entrada. *Pin* puede ser una constante (0-15), o una  variable que contenga un número de 0 a 15 (p.e. B0) o el nombre de un patilla (p.e. PORTA.0).

*Down*     Estado de la patilla cuando se pulsa el botón (0,1).
*Delay*    Ciclo de cuenta antes de que comience la autorepetición (0-255). Si es 0, no se realiza ningún antirebote o autorepetición. Si es 255, se realiza un antirebote, y no una autorepetición.
*Rate*     Velocidad de autorepetición (0-255).
*BVar*     Variable de tamaño byte usada internamente para el contador de rebote o repetición. Se debe inicializar a 0 antes de usarla, y no usarla en el resto del programa.
*Action*   Estado del botón para actuar (0 si no debe estar pulsado, 1 si sí debe estar).
*Label*    La ejecución sigue en esta etiqueta si _Action_ es verdadera.

Se puede definir la longitud del antirebote con un DEFINE:

*DEFINE BUTTON_PAUSE 50*

Más información: http://melabs.com/resources/pbpmanual/5_4-5_6.htm#56


----------



## D@rkbytes (Feb 2, 2015)

JoaquinFerrero dijo:


> Quiero recordar que el método Button ya tiene un procedimiento antirebote.
> 
> De la documentación:
> 
> *BUTTON**BUTTON Pin,Down,Delay,Rate,BVar,Action,Label*​


Si, así es, y sobre este tema ya se ha hablado anteriormente unas páginas atrás.

En pruebas físicas no ha resultado suficiente y es por eso que agregué otras rutinas más.
Otro problema es que al interactuar *Button* con la interrupción por RB0, *Delay* debe ser menor a 255 para no afectar la interrupción.

Edit:
Simplificación del _código anterior_ sin usar la instrucción *Button*:

```
; Declaración de variables.
Flag    Var Bit

; Nombres para los pines.
Symbol LED      = PORTB.4

Inicio:
    OPTION_REG = 0          ; Pull-Ups (PORTB) y Falling edge (INT-RB0)
    INTCON = %11010000      ; Habilitar interrupción por RB0
    
    ; Activar el servicio de interrupciones.
    On Interrupt GoTo SDI_RB0
    
    Low LED: Flag = 0       ; "LED" y "Flag" en 0 al iniciar.

Programa:
    While Flag = 1          ; Mientras "Flag" sea 1...
        Toggle LED          ; Cambiar de estado "LED"
        Pause 50            ; Cambiar el tiempo del destello aquí
    Wend                    ; Salir del bucle cuando "Flag" sea 0
        
    Low LED                 ; Apagar el LED
        
    GoTo Programa
    
; Servicio de interrupción por RB0
SDI_RB0:
    Disable                 ; Desactivar interrupciones.
    
    If INTCON.1 = 1 Then    ; Si es interrupción por RB0, entonces...        
        If Flag = 0 Then    ; Si "Flag" está en 0, entonces...
            Flag = 1        ; Establecer "Flag" en 1
        Else                ; Caso contrario...
            Flag = 0        ; Establecer "Flag" en 0    
        EndIf
        INTCON.1 = 0        ; Limpiar flag INTF
    EndIf
    
    Resume                  ; Retornar al programa (RETFIE)
    Enable                  ; Volver a activar interrupciones.
    
    End
```


----------



## jesusmolo (Feb 3, 2015)

papirrin dijo:


> en la ayuda dice:
> 
> 
> si un signo # antecede a un elemento, la representacion ASCII para cada digito se envia al LCD
> ...



Hola , Muchas gracias por tu respuesta. lo que quiero es poder controlar con 2 pulsadores la aparición de letra por letra del abecedario en un LCD. Con el primer pulsador empiece de la letra "A" .....hasta la letra "Z", por cada pulso que haga y me pueda detener en culaquier letra y luego con el segundo pulsador empiece a devolver por cada pulso que haga y me pueda detener en culaquier letra o llegar hasta la letra "A" nuevamnete.

Quiero saber como darle un valor a cada letra, para que al pulsar el pulsador1 una vez, aparezca la letra "A" y quede en pantalla, luego al pulsar el pulsador1 otra vez, aparezca la letra "B", luego al pulsar el pulsador1 otra vez, aparezca la letra "C" y asi sucesivamente llegar a cualquier letra o al final con la letra "Z", luego con el pulsador2 devolverme letra por letra por cada pulsada que haga, desde la letra en que quedé a cualquier letra o al final que para el pulsador2 seria la letra "A".  

Gracias.


----------



## papirrin (Feb 3, 2015)

¿quieres saber como se hace o quieres que te lo hagan? es diferente...

al codigo que pusiste en donde dice 

Lcdout $fe,$C0,"Dato: ",DEC Dato

le pruebas poniendo:

Lcdout $fe,$C0,"Dato: ",#Dato

que es lo que indique en el  mensaje anterior.. y delimitas con la condicion "if" el rango de la A a la Z.


----------



## D@rkbytes (Feb 3, 2015)

papirrin dijo:


> ¿Quieres saber como se hace o quieres que te lo hagan? es diferente...


jesusmolo _ya puso el código que hizo_, pero ha comentado que no le funciona.


papirrin dijo:


> Al código que pusiste en donde dice:
> 
> Lcdout $fe,$C0,"Dato: ",DEC Dato
> 
> ...


Al usar los operadores que propones, lo que se obtendrá será un número y no una letra.

Lo que jesusmolo quiere hacer es algo muy sencillo.
Si tomamos como base la Tabla ASCII, veremos que la letra A mayúscula equivale al número 65 y así sucesivamente hasta la Z que equivale al código ASCII 90.

Entonces mostrar cada letra en orden de abajo hacia arriba y viceversa, sería muy sencillo:

```
Letra       Var Byte

    LCDOut $FE,1,"   Abecedario"
    
    Letra = 65

Programa:
    If PORTB.2 = 0 Then
        Letra = Letra + 1
        If Letra >90 Then Letra = 90
    EndIf
    
    If PORTB.3 = 0 Then
        Letra = Letra - 1
        If Letra <65 Then Letra = 65
    EndIf
        
    LCDOut $FE,$C0,"Letra: ",Letra
    Pause 250
    
    GoTo    Programa


    End
```
Así de fácil.


----------



## papirrin (Feb 3, 2015)

> jesusmolo ya puso el código que hizo, pero ha comentado que no le funciona.



yo entendi diferente, entendi que agarro un codigo que alguien hizo y queria que alguien se lo ajustara a sus necesidades, pero bueno...



> Al usar los operadores que propones, lo que se obtendrá será un número y no una letra


la verdad no me acuerdo, pero ahora que mencionas y seguramente lo tienes mas fresco si, con solo mandar el codigo ascii es suficiente..pero por ahi iba XD


----------



## D@rkbytes (Feb 3, 2015)

Pues si, es por eso que se han hecho preguntas acerca de por qué no se muestra el valor en la pantalla, o por qué se ven letras en vez de números.
Si se manda un 49 se verá un 1, pero si se manda como #49 o Dec 49, se verá el número 49

En el programa anterior se manda a la pantalla desde el 65 hasta el 90, letras <A:Z> en ASCII
Y para la minúsculas sería desde el 97 hasta el 122, letras <a:z> en ASCII

Si recorriéramos toda la tabla, desde el 0 hasta el 127, en los primeros 32 números no se vería nada, o se verían cuadros negros.

También se podría hacer con una tabla LookUp y así se podría poner la ñ o Ñ, pero no todas las pantallas la tienen en su CGROM.


----------



## papirrin (Feb 3, 2015)

si, si te creo dark  segun yo si es correcto tu codigo...

para serte honesto me queda la duda del #, o sea que sea lo mismo el # que el DEC, el dec si estoy seguro que no funcionaria.

cuando tenga un poco de tiempo lo checo para ver si es lo mismo o que diferencia hay, si la hay entre esos.

saludos...


----------



## D@rkbytes (Feb 4, 2015)

papirrin dijo:


> Para serte honesto me queda la duda del #, o sea, que sea lo mismo el # que el DEC, el dec si estoy seguro que no funcionaría.


Para mostrar letras ninguno funcionaría, ambos convierten un número a cadena para poder ser visualizado.

*#* Se usa más que nada para enviar un número como cadena por RS-232 y terminando el envío con 13,10 (Cr/Lf)
Al terminar de esta forma el envío para pasar a la siguiente línea, ya no existe problema de que la siguiente cadena se sobreponga a la anterior.

*Dec* también convierte un número a cadena pero con la ventaja de que se puede definir la cantidad de dígitos a mostrar.
Por ejemplo: *Dec5* *123* nos mostrará, *00123*


papirrin dijo:


> Cuando tenga un poco de tiempo lo checo para ver si es lo mismo o que diferencia hay, si la hay entre esos.


La principal diferencia se notará cuando se escriba en la pantalla *LCDOut $FE,$80,#123* y después se escriba *LCDOut $FE,$80, #5*
Entonces el 5 quedará en el lugar del 1 y la lectura se confundirá.
En cambio con *Dec3* *1* se enviará el número *1* con dos ceros a la izquierda: *001*

De esta forma ya no se mezclarán los números enviados y se mostrará un resultado coherente.


----------



## jesusmolo (Feb 4, 2015)

D@rkbytes dijo:


> jesusmolo _ya puso el código que hizo_, pero ha comentado que no le funciona.
> 
> Al usar los operadores que propones, lo que se obtendrá será un número y no una letra.
> 
> ...






Muy buenos dias. muchas gracias D@rkbytes, era exactamente lo que buscaba, gracias por aclarar esta duda y recordar lo referente al codigo ASCII.


----------



## eoth (Feb 7, 2015)

¡Hola a todos!
Ya que están con los LCD, quiero hacer una consulta.
Hace un par de meses, construí un pequeño módulo para un LCD 16x2 usando un PIC16F628 que tenía un par de puertos dañados, y pensé que sería útil controlarlo con un solo pin.

Me explico: por ejemplo, usar un 12F629 para alguna aplicación y enviar por medio de un solo pin las instrucciones a otro PIC que se encarga exclusivamente de manejar el LCD.

Adjunto el diagrama de mi circuito.
Lo programé (puse pines para ICSP), y solito tal cual está funciona a las mil maravillas.
Mi problema es que cuando envío una palabra (por ejemplo "hola" ) solo muestra un caracter.
Uso la instrucción SerIn/SerOut de PICBASIC PRO.

Este es el código que uso. Sólo módulo.

```
cmcon=7

TRISA=%00000100
TRISB=%00000000

DEFINE LCD_DREG PORTB                             ' Set LCD Data port
DEFINE LCD_DBIT 0                                     ' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_RSREG PORTA                           ' Set LCD Register Select port
DEFINE LCD_RSBIT 4                                   ' Set LCD Register Select bit
DEFINE LCD_EREG PORTA                             ' Set LCD Enable port
DEFINE LCD_EBIT 3                                     ' Set LCD Enable bit
DEFINE LCD_BITS 8                                     ' Set LCD bus size (4 or 8 bits)
'DEFINE LCD_LINES 2                                   ' Set number of lines on LCD
'DEFINE LCD_COMMANDUS 1500                    ' Set command delay time in us
'DEFINE LCD_DATAUS 44                              ' Set data delay time in us

pause 200                                                  'LCD intializing pause

inicio:

lcdout $FE, 1, "Hola"      
lcdout $FE, $C0, "YO SOY GROOT"    
pause 1000

goto inicio
end
```
Módulo con otro PIC:

```
INCLUDE "modedefs.bas"

cmcon=7

TRISA=%00000100
TRISB=%00000000

DEFINE LCD_DREG PORTB                             ' Set LCD Data port
DEFINE LCD_DBIT 0                                     ' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_RSREG PORTA                           ' Set LCD Register Select port
DEFINE LCD_RSBIT 4                                   ' Set LCD Register Select bit
DEFINE LCD_EREG PORTA                             ' Set LCD Enable port
DEFINE LCD_EBIT 3                                     ' Set LCD Enable bit
DEFINE LCD_BITS 8                                     ' Set LCD bus size (4 or 8 bits)
'DEFINE LCD_LINES 2                                   ' Set number of lines on LCD
'DEFINE LCD_COMMANDUS 1500                    ' Set command delay time in us
'DEFINE LCD_DATAUS 44                              ' Set data delay time in us

datos var word

pause 200                                                  'LCD intializing pause

inicio:

serin porta.2, N2400, datos

lcdout $FE, 1, "Hola"      
lcdout $FE, $C0, "YO SOY GROOT"   
pause 1000

lcdout $FE, 1, "palabra"
lcdout $FE, $C0, datos
pause 1000

goto inicio
end
```


----------



## D@rkbytes (Feb 7, 2015)

eoth dijo:


> Hace un par de meses, construí un pequeño módulo para un LCD 16x2 usando un PIC16F628 que tenía un par de puertos dañados, y pensé que sería útil controlarlo con un solo pin.
> 
> Me explico: por ejemplo, usar un 12F629 para alguna aplicación y enviar por medio de un solo pin las instrucciones a otro PIC que se encarga exclusivamente de manejar el LCD.


Mira por aquí: _16F628A LCD One Wire con 74HC595_
Esto viene del tema: Temporizador para insoladora con 16F628A

Ese programa lo podrás migrar sin ningún problema para que funcione con un PIC12F629.


----------



## cosmico74 (Feb 8, 2015)

Que tal Darkbytes! saludos a ti y a todo el foro.
Bueno pues,les escribo por que tengo un par de dudas en una linea de codigo
        es sobre el tema de decodificacion del protocolo Sony,les cuento este codigo lo encontre en la red esta escrito en pic basic
        pro lo estuve analizando y creo que si le entiendo la mayor parte y algo que he leido de teoria sobre la decodificacion del 
        protocolo Sony,este codigo no trae "comentarios" asi que lo yo le entiendo es lo siguiente:

        define variable tipo word
        define los tris
        despues va a main donde detecta la cabecera si es menor a ese valor se regresa si no avanza  
        despues con los pulsin lee los 7 bits que corresponden a comando y salta a la etiqueta detectair y dependiendo el valor 
        si es <80 pongo la variable en cero(0) sino en uno(1) y asi con los siete bits(b0...b6)
        *Nota: El bit7=0 se le agrega un octavo bit puesto a cero para completar un byte y así poder trabajar mejor a nivel del software

        ***Bueno hasta aqui todo bien,creo que le he entendido***


        Mi duda es esta linea donde aparece la variable b9 definida como word:

        b9=(128*b7)+(64*b6)+(32*b5)+(16*b4)+(8*b3)+(4*b2)+(2*b1)+(1*b0)

        bueno supongo que es aqui donde se unen o se juntan los resultados de todos los pulsin individuales de los 7 bits para dar 
        digamos un resultado total,si alguien haya hecho algo semejante con la decodificacion Sony que me pudiera explicar esta Linea
        de codigo osea como saca esos valores que por lo que veo van en orden decreciente(b7...b0) y luego los multiplica por valores
        como 128,64,32,16,8,4,2,1 aqui es donde no le entiendo o habra otra forma de explicarlo?
        lo que esta en la parte de abajo es bastante entendible eso ya es el resultado de b9.
        Anexo imagenes y codigo en PBP...Gracias


----------



## D@rkbytes (Feb 9, 2015)

Lo que hace ese programa, es leer el ancho de los pulsos ingresados e irlos guardando en variables.
Luego se compara cada nivel y dependiendo del tamaño, se le asigna un nuevo valor a cada variable.

Entonces si realizamos una operación con los valores máximos, tendríamos el siguiente resultado:
b0 = 1
b1 = 1
b2 = 1
b3 = 1
b4 = 1
b5 = 1
b6 = 1
b7 = 0

128 * b7 = 0
64 * b6 = 64
32 * b5 = 32
16 * b4 = 16
8 * b3 = 8
4 * b2 = 4
2 * b1 = 2
1 * b0 = 1

Entonces: b9 = (0 + 64 + 32 + 16 + 8 + 4 + 2 + 1) = 127

Como b9 nunca sobrepasará de 127, debería ser del tipo Byte.
Igualmente las otras variables, ya que en las comparaciones tampoco se excede de 255

Obviamente 127 sería el valor máximo de la suma, en el caso de que todos los pulsos fueran superiores a 80.
O sea, el caso "*Else*" de las comparaciones, donde se le reasigna el valor 1 a cada variable.
Por lo tanto b9 podrá ser de un valor inferior a 127 que posteriormente se usa para realizar otras comparaciones.

Nota sobre *PulsIn*:
Cuando se usa una variable del tipo Byte (8 bits) para almacenar el resultado de *PulsIn*, sólo se toma el *LSB*
O sea, los 8 bits menos significativos de los 16 bits que retornan como resultado.


----------



## cosmico74 (Feb 22, 2015)

la instruccion *PULSIN* sera la adecuada?

Que tal Darkbytes y a todos en el foro!

Encontre este proyecto en la red es sobre un *Detector de Proximidad*.Esta diseñado con un solo microcontrolador y esta escrito en ASM cosa que no manejo y bueno ya que estamos en *pic basic pro*,la pregunta es ¿puedo utilizar la funcion *PULSIN* por aquello de PulsIn PORTA.0,0,pulsos ,(lectura de pulsos en estado bajo) para capturar la señal de rebote,como ves en el texto de mas abajo remarque en negrita lo que considere relevante es decir: 
emitir pulsos a 38khz--->rebotar en el objeto--->capturar la señal(frecuencia)--->comparar la señal enviada con la recibida y en base a eso ejecutar acciones.

En resumen mi duda es:¿puedo utilizar la funcion* PULSIN* para capturar la señal de rebote y luego comparar? por que no se me ocurre otra idea.

Anexo un par de imagenes y un programa PWM con Hardware con el pic 16f628A con un ciclo util del 50% y frecuencia de 38 KHZ aproximadamente
Por su aportacion Gracias... 


                 *****Extracto del texto original*****

Principio de funcionamiento:

Por medio del microcontrolador, se activa el LED infrarrojo mediante trenes de pulsos. Cuando algún objeto se aproxima al LED (a una distancia que puede regularse entre 5 y 20 cms, dependiendo de la corriente que se suministre al LED), refleja la energía hacia el detector, el cual envía la señal al microcontrolador._ *El microcontrolador compara la señal enviada con la señal recibida y, si son similares, entonces activa el relevador.
*_
*El envío de pulsos, y la comparación entre la frecuencia de envío y la recibida*, hace posible evitar el disparo en falso del relevador por efecto de sombras o cambios en la luminosidad del ambiente, ya que el dispositivo puede funcionar de día y de noche.

 Descripción:

El principio de funcionamiento es generar, por medio del firmware en el microcontrolador, un tren de 30 pulsos modulando a una portadora de 36 kHz, cada uno con una duración de de 835 us, y seguido por un espacio de la misma duración, como se muestra en la imagen de abajo. Para generar tal señal, se utiliza la función PWM (Modulación por ancho de pulso) integrada en el hardware del microcontrolador 18F2550.

Esta señal se emitida por el  diodo infrarrojo TN153B, reflejada por el objeto y detectada por el receptor de infrarrojo TMF5360. La señal de 36 khz demodulada es analizada por un algoritmo en el firmware del microcontrolador 18F2550, que posteriormente activa el relevador cuando se detecta una señal válida.


----------



## josepo (Mar 6, 2015)

Buenas Arturo vie el dribe de tu video en interne , y me he apuntado al foro , yo no controlo mucho de pic , pero bueno intentare ponerme al dia , el proyecto de este motor con encoder es de lo mejorcito que he visto por la red , lo he intentado simular en Proteus , pero no lo he conseguido asi que lo intentare hacer en fisico , pero me parece tam bueno que creo que se merece un pos independiente , para ver si se sigue desarrollando porque creo que podria dar mas de si , yo algo intentare y si lo consigo lo pondre por aqui anque dudo que lo consiga , pero creo que le hace falta el empujon de un dato mas ( la velocidad ) , porque creo que los desplazamintos los hace todos a la maxima velocidad y estaria bien poder elegir no solo el punto de destino si no a que velocidad lo hace .


----------



## jesusmolo (Mar 26, 2015)

Hola compañeros, buenas noches.

He practicado y realizado proyectos pequeños con el PIC16f84A.
Ahora quise cambiarme al PIC16F88, que según lo que he leído es compatible pin a pin y en la gran parte de la programación.
Quise adaptar este simple programa para encender un LED añadiendo la instrucción CMCON = 7 para habilitar el puerto A como digital, como también la instrucción OSCCON = %01100110 para hablitar el oscilador interno, pero aun así no me funcionó.
¿Ustedes que sugieren?


```
cmcon=7                ; Desactiva los comparadores analogicos de todos los pines del puerto A y
                       ; convierte las salidas y entradas en digital del puerto A.
                       

OSCCON=%01100110     ; Configura oscilador interno en 4MGH de frecuencia estable  
                                          
Define Osc 4 ' Define el Oscilador para un Cristal  ' de 4 Mhz.

TRISA = %11110111            ' Configura el puerto A como entrada.
TRISB = $00            ' Configura puerto B como salida.

PORTB = $00 ' Inicializa el puerto B

Inicio:

If PORTA.4 = 1 Then PORTB.7 = 1 ' Pregunta si RA0 = 1, si se cumple
                                ' la condición entonces enciende el Led.
                                
Pause 1000 ' Hace una pausa de 1 segundo (1000 ms)

Low PORTB.7 ' Apaga el Led

Pause 1000 ' Hace una pausa de 1 segundo (1000 ms)

GoTo inicio ' Salta a la etiqueta "Inicio"

End
```


----------



## D@rkbytes (Mar 26, 2015)

jesusmolo dijo:


> Quise adaptar este simple programa para encender un LED añadiendo la instrucción CMCON = 7 para habilitar el puerto A como digital, como también la instrucción OSCCON = %01100110 para hablitar el oscilador interno, pero aun así no me funcionó.


CMCON no es el registro que hace los pines analógicos como digitales.
Y el oscilador interno no se activa con el registro OSCCON, ahí se configura.


jesusmolo dijo:


> ¿Ustedes que sugieren?


Que le des una buena leída a la hoja de datos. 
Ahí encontrarás las configuraciones y entenderás el por qué no funciona tu programa.

Suerte.


----------



## jesusmolo (Abr 5, 2015)

Hola buenas noches D@rkbytes.

Tenias toda la razón, investigando en la hoja de datos del pic 16f88 encontré que colocando en 0 el registro ANSEL todos los puertos se colocaban en digital o si le coloco en binario puedo determinar que bit puedo establecer como analogo o digital. Muchas gracias.

Tengo una duda porqué al precionar el pulsador me toca esperar hasta 2 segundos para que encienda el led.

Muchas gracias.


----------



## D@rkbytes (Abr 6, 2015)

Porque tienes 2 retardos de 1000 ms después de la sentencia IF.
Por lo tanto, siempre habrá 2 segundos para que se regrese a la etiqueta "Inicio"

Podrías envolver las instrucciones dentro de un solo bloque IF, pero de todos modos siempre existirá el retardo.
Haciendo eso, al menos cuando se salga del bloque IF no tendrás que dejar el pulsador presionado esperando el retorno.


----------



## cosmico74 (Abr 8, 2015)

Que tal a todos!

   Alguien me puede decir ¿como puedo enviar el valor de una variable tipo Byte

   a la pc,via comunicacion serial(rs-232)?

   en formato Binario y Hexadecimal,ya que al compilar en PBP me marca error

   es decir,en este formato es como lo he manejado y me lo acepta.


   SEROUT PORTB.3,N2400,[" DECIMAL: " ,#b9,10,13]  ; b9 variable tipo Byte


   Quiero enviar el siguiente valor: Decimal=42--->Binario:101010

   o cualquier otro valor en binario o hexadecimal.

   por ejemplo:                  

   En decimal no me acepta DEC b9, me acepta #b9

   En binario no me acepta Bin b9

   En Hexadecimal no probe.

   cabe mencionar que en display lcd todo bien,sin problemas.

   aqui la cuestion es en la comunicacion con la pc.

   Gracias por responder...


----------



## papirrin (Abr 8, 2015)

Me parece que el error esta en la cadena de caracteres que envias el "DECIMAL:"

Prueba quitandolo.


----------



## D@rkbytes (Abr 8, 2015)

cosmico74 dijo:


> ¿Alguien me puede decir cómo puedo enviar el valor de una variable tipo Byte a la pc, vía comunicación serial RS-232?
> 
> En formato Binario y Hexadecimal, ya que al compilar en PBP me marca error.
> 
> ...


Ten en cuenta que no es lo mismo enviar 42 que #42. Dec 42, es lo mismo que #42
Y de esa forma se envía para que el número pueda ser visualizado como texto.
Pero si lo necesitas procesar como un valor entero para una variable tipo Byte, Integer, Long, etc.
Entonces tienes que enviarlo sin usar #, Dec, o Bin.

PD:
Las instrucciones que aceptan DecX, HexX y Bin, son *SerOut2* y *HSerOut2*


----------



## bendici (Abr 10, 2015)

Buenos días.

Estoy intentando aprender PICBasic, y como me dedico al mundo del  ascensor he querido iniciarme con algo que tenga que ver con el mismo.
He  empezado con algo que entiendo que es básico, por lo menos a más de uno  le parecerá y he realizado el siguiente código para un ascensor de 3  pisos.

Sin complicarme la vida no tiene memoria lógicamente, y para  facilitar más las cosas he puesto 3 finales de carrera o nivel de piso  o como queramos llamarle para que dé la orden de paro, pero sinceramente  me gustaría mejorar la estructura del código ya que me duele a los ojos  ver tanto If...Then, pero como estoy pez, a ver si alguien me puede  indicar como mejorar ciertas partes del programa, y probablemente  corregirme bastantes errores, pero me gustaría saber si voy bien  encaminado o no.

Por otra parte, no he realizado el circuito, sólo he  empezado a estructurar el código.

He incluido orden de abrir y cerrar puertas así como series de seguridad  que se comprueban antes de iniciar la marcha, pero no sé si el código  que dejo a continuación expresa lo que quiero indicar:

Aquí dejo el código:

```
program Ascensor

' Declarations section 
Symbol         P1=portb.0
Symbol         P2=portb.1
Symbol         p3=portb.2
Symbol         nivel1=portb.3
Symbol         nivel2=portb.4
Symbol         nivel3=portb.5
Symbol         subir=portc.0
Symbol         bajar=portc.1
Symbol         seriepuerta=portb.6
Symbol         seriecabina=portb.7
symbol         abrirp=portc.2
symbol         cerrarp=portc.3
TRISB=$FF
TRISC=$00
PORTB=$00
main:
'   Main program 
 Inicio:
 IF   P1=0   then pcabina
 IF   P2=0   then pcabina
 IF   P3=0   then pcabina
 goto inicio
 pcabina:
 IF   P1=0 nivel1=0 then apuertas  ; si se presiona pulsador 1 y esta en ese nivel 1 va a la rutina de puertas
 IF   P1=0 nivel2=0 then motorb ; si se presiona pulsador 1 y esta en ese nivel 2 va a la rutina motor en bajada
 IF   P1=0 nivel3=0 then motorb si se presiona pulsador 1 y esta en ese nivel 2 va a la rutina motor en bajada
 IF   P2=0 nivel1=0 then motors si se presiona pulsador 2 y esta en ese nivel 1 va a la rutina motor en subida
 IF   P2=0 nivel2=0 then apuertas si se presiona pulsador 2 y esta en ese nivel 2 va a la rutina motor de puertas
 IF   P2=0 nivel3=0 then motorb si se presiona pulsador 2 y esta en ese nivel 3 va a la rutina motor en bajada
 IF   P3=0 nivel1=0 then motors si se presiona pulsador 3 y esta en ese nivel 1 va a la rutina motor en subida
 IF   p3=0 nivel2=0 then motors si se presiona pulsador 2 y esta en ese nivel 2 va a la rutina motor en subida
 IF   P3=0 nivel3=0 then apuertas si se presiona pulsador 3 y esta en ese nivel 3 va a la rutina de puertas
apuertas:
 abrirp=1
 Pause 5000
 cerrarp=1
 goto pcabina
motors:
 IF   seriecabina=1 and seriepuerta=1 then
 IF   P2=0 and nivel2=0 Then  subir=1    else subir=0
 IF   P3=0 and nivel3=0 Then  subir=1    else subir=0
 goto inicio
 
 motorb:
 IF   seriecabina=1 and seriepuerta=1 then
 IF   P1=0 and nivel1=0 Then  bajar=1    else bajar=0
 IF   P2=0 and nivel2=0 Then  subir=1    else bajar=0
 goto inicio

end.
```


Gracias, de antemano.

Un saludo.


----------



## jesusmolo (Abr 11, 2015)

Hola buenos dias compañeros, estoy empezando a utilizar la EEPROM del pic 16f88 pero tengo la siguiente duda: si quiero grabar en la direccion $00 el dato 135 fisicamnete se haria asi $00:1  $01:3  $02:5, lo pregunto ya que al grabar el .hex en el pic, el software del programador me permite visualizar y cambiar los datos en la EEPROM, donde fisicamente me muestra filas de 8bits desde la $00 hasta la $FF; En otras palabras solo es posible guardar 1 caracter ascii en .hex por cada dirección? o no?. muchas gracias.


----------



## D@rkbytes (Abr 11, 2015)

Puedes guardar un Byte por locación, o sea, valores hasta 255. (0xFF)
Cada carácter de la tabla ASCII equivale a un Byte.
Si quieres guardar 135 no hay problema, pues no pasa de 255.
Pero si lo quieres guardar así por números separados, entonces ocupas 3 Bytes. (3 locaciones de memoria.)



bendici dijo:


> sinceramente  me gustaría mejorar la estructura  del código ya que me duele a los ojos  ver tanto If...Then, pero como  estoy pez, a ver si alguien me puede  indicar como mejorar ciertas  partes del programa, y probablemente  corregirme bastantes errores, pero  me gustaría saber si voy bien  encaminado o no.


Como son varias comparaciones y llamadas a rutinas, no te queda otra más que usar If... Then...
Y precisamente sobre estas instrucciones es donde tienes problemas.
Juntas las sentencias If con Else sin terminar algunas con un EndIf. y  en la parte de la rutina "pcabina" hacen falta algún tipo de operador  para completar la instrucción.
Yo puse el operador "And" pero realmente sólo tú sabes como debe ser el  tipo de comparación.

Este es el código corregido, lo cual tal vez no hará que funcione porque  sin un esquema o simulación, es complicado verificar las rutinas y como  deban funcionar.
De hecho tampoco se sabe para que PIC es el programa.

```
; program Ascensor

' Declarations section 
Symbol P1 =             PORTB.0
Symbol P2 =             PORTB.1
Symbol P3 =             PORTB.2
Symbol nivel1 =         PORTB.3
Symbol nivel2 =         PORTB.4
Symbol nivel3 =         PORTB.5
Symbol subir =          PORTC.0
Symbol bajar =          PORTC.1
Symbol seriepuerta =    PORTB.6
Symbol seriecabina =    PORTB.7
symbol abrirp =         PORTC.2
symbol cerrarp =        PORTC.3

;TRISB=$FF
TRISC = 0
PORTB = 0
;main:
'   Main program 
Inicio:
    If P1 = 0   Then pcabina
    If P2 = 0   Then pcabina
    If P3 = 0   Then pcabina
    
    GoTo inicio
 
pcabina:
    If P1 = 0 And nivel1 = 0 Then apuertas   ; Si se presiona pulsador 1 y está en ese nivel 1 va a la rutina de puertas
    If P1 = 0 And nivel2 = 0 Then motorb     ; Si se presiona pulsador 1 y está en ese nivel 2 va a la rutina motor en bajada
    If P1 = 0 And nivel3 = 0 Then motorb     ; Si se presiona pulsador 1 y está en ese nivel 2 va a la rutina motor en bajada
    If P2 = 0 And nivel1 = 0 Then motors     ; Si se presiona pulsador 2 y está en ese nivel 1 va a la rutina motor en subida
    If P2 = 0 And nivel2 = 0 Then apuertas   ; Si se presiona pulsador 2 y está en ese nivel 2 va a la rutina motor de puertas
    If P2 = 0 And nivel3 = 0 Then motorb     ; Si se presiona pulsador 2 y está en ese nivel 3 va a la rutina motor en bajada
    If P3 = 0 And nivel1 = 0 Then motors     ; Si se presiona pulsador 3 y está en ese nivel 1 va a la rutina motor en subida
    If p3 = 0 And nivel2 = 0 Then motors     ; Si se presiona pulsador 2 y está en ese nivel 2 va a la rutina motor en subida
    If P3 = 0 And nivel3 = 0 Then apuertas   ; Si se presiona pulsador 3 y está en ese nivel 3 va a la rutina de puertas

apuertas:
    abrirp = 1
    Pause 5000
    cerrarp = 1
    GoTo pcabina
 
motors:
    If seriecabina = 1 And seriepuerta = 1 Then
        If P2 = 0 And nivel2 = 0 Then
            subir = 1
        Else
            subir = 0
        EndIf
    
        If P3 = 0 and nivel3 = 0 Then
            subir = 1
        Else
            subir = 0
        EndIf
    EndIf
    
    GoTo inicio
 
motorb:
    If seriecabina = 1 And seriepuerta = 1 Then
        If P1 = 0 And nivel1 = 0 Then
            bajar = 1
        Else
            bajar = 0
        EndIf
        
        If P2 = 0 And nivel2 = 0 Then
            subir = 1
        Else
            bajar = 0
        EndIf
    EndIf
    
    GoTo inicio

    End
```


----------



## isaiasjea (Abr 12, 2015)

Saludos comunidad!!!
Aquí les traigo otro pequeño programa ejemplo de Elevador(Ascensor)
Saludos y seguimos en contacto.


----------



## cosmico74 (Abr 12, 2015)

¿Qué tal? Un saludo a todos!

  Necesito de  su ayuda con lo que expongo a continuación:

  Bueno, pues resulta que estoy haciendo un programa sencillo que consiste en un emisor IR
y un receptor IR.
Aquí lo que hago es que por medio del pulsador(ON) genero un código de 6 bits con ciclos for, los famosos UNOS y CEROS con subrutinas, digamos:

DEC=42 (Bin=101010) lo monto sobre una portadora(38khz),despues lo capturo con el  receptor tsopx usando PULSIN y enciendo un led con el codigo recibido hasta ahí todo bien.
El problema está en que cuando oprimo el segundo botón (OFF) me genera el código pero distinto al que programo, es decir, para apagar el LED programo en el PIC emisor DEC=36 (Bin=100100) y me devuelve  DEC=54 (Bin=110110)
¿Esto no sé por qué o a que se deba? No sé si tal vez se deba al comando PULSIN o algo que me esté sobrando o faltando. ¿Alguna solución?

Cabe mencionar, que estos códigos ya los probé en simulador proteus y en protoboard dandome los mismos resultados, solamente el primer pulsador me da el valor correcto.

Al oprimir el segundo botón me arroja otro valor muy distinto al esperado.

Por su ayuda, mil gracias.


Utilizo: 2 PIC16F628A con cristales de 4 MHz.

Anexo: códigos + proteus + imagen.


----------



## D@rkbytes (Abr 13, 2015)

cosmico74 dijo:


> El problema está en que cuando oprimo el segundo botón (OFF) me genera el código pero distinto al que programo, es decir, para apagar el LED programo en el PIC emisor DEC=36 (Bin=100100) y me devuelve  DEC=54 (Bin=110110)
> ¿Esto no sé por qué o a que se deba? No sé si tal vez se deba al comando PULSIN o algo que me esté sobrando o faltando. ¿Alguna solución?


Supongo que al usar PulsIn de manera consecutiva, se obtienen lecturas incorrectas.
PulsIn debe funcionar utilizando el Timer 0, pero seguramente funciona bien usando una instrucción.

Lo que puedes hacer, es usar la interrupción externa por RB0, tomar el tiempo con el Timer 0 y en cada transición de la señal, limpiar el Timer y cambiar el flanco de interrupción.
De esta forma puedes medir lo que dura cada transición.


----------



## bendici (Abr 15, 2015)

Buenos dias D@rkbytes,

Perdona el retraso en contestar, y gracias por aclararme el uso de la instruccion. 

Revisare el codigo que me adjuntas.

Para tu informacion usaré el pic16f877.

Por otra parte me gustaria simplificar el tema de los sensores de piso, ya que uso tres entradas del pic para identificar los 3 niveles de piso, pero con esta metodologia tendria que usar 4 entradas para un ascensor de 4 niveles y asi sucesivamente, como se podría realizar un conteo de pulsos a traves de una unica entrada , me explico:

Pondria dos biestables uno indicando que esta arriba cuando se active y otro abajo, pero en los piso intermedios con un detecto magnetico solo contaria imanes para saber donde esta en cada momento y donde tiene que parar en caso de recibir una llamada, me podrías dar alguna indicacion de como realizar ese conteo y si es factible.

Gracias de antemano.


----------



## torres.electronico (Abr 15, 2015)

Hola, yo te recomendaria un encoder para esta funcion..  algumas marcas implementan IR (mala idea por el polvillo), y otros con un sensor hall.


----------



## jesusmolo (Abr 21, 2015)

Hola buenas tardes.  Me pregunto si alguna vez les ha pasado lo siguiente con el microcode studio: El cursor cambia de forma con diferente funcion; aveces tiene forma de barra vertical y puedo escribir, copiar caracteres dejar espacios con la barra espaciadora; pero no se porque cuando cambia de forma a un cuadro negro no puedo hacer lo mismo, cuando quiero escribir, copiar caracteres dejar espacios con la barra espaciadora lo que hace es borrar los caracteres que le siguen; no se si esto sucede por introcir un comando al tocar una tecla. Si alguien sabe el significado el porque de estas 2 formas le estaria muy agradecido.


----------



## torres.electronico (Abr 21, 2015)

Hola,no es problema del software... eso pasa cuando presionamos la tecla "insert" de nuestro teclado 
Cuando te pase eso,tocas nuevamente esa tecla y volvera todo a la normalidad


----------



## jesusmolo (Abr 21, 2015)

Muchas gracias por tan pronta respuesta.


----------



## jesusmolo (Abr 23, 2015)

Hola. Buenos días. Estoy haciendo un programa sencillo de distintos menús en LCD con 1 solo pulsador,
ya que quiero ir avanzando con lo que he aprendido, pero veo que al compilarlo y probarlo, el LCD me muestra varios menús sin necesidad de un presionar el pulsador, está como loco.

Copio lo que llevo hasta ahora.

```
;*********************************************************************************************************;
                      
OSCCON=%01100110  ; Se utiliza para pic 16f88, Configura oscilador interno en 4MGH de frecuencia estable                                            

ANSEL=0           ; Se utiliza para pic 16f88, Todos los puertos configurados como digital y si los queremos analogos los = 1                     

;*******************************************************************************
DEFINE LCD_DREG PORTB  ; Indica que el Bus estará conectado en el Puerto B

DEFINE LCD_DBIT 4      ' Selección del Bit de inicio del puerto en el uC para el
                       ' bus de datos de la LCD
DEFINE LCD_RSREG PORTB ' Indica al uC que el pin "RS" estará en el Puerto B
DEFINE LCD_RSBIT 3     ' "RS" estará conectado en RB3
DEFINE LCD_EREG PORTB  ' Indica al uC que el pin "E" estará en el Puerto B
DEFINE LCD_EBIT 2      ' "E" estará conectado en RB2
Define Osc 4           ' Define el Oscilador para un Cristal
                       ' de 4 Mhz.

TRISA=%00111110
TRISB=%00000000


;************************* Pines de control ************************

Symbol enter = PORTA.1


;****************************** Declaración de variables******************************
B0      Var Byte
B1      Var Byte
B2      Var Byte

Dias  Var Byte
Tardes   var byte
Noches  var byte

cafe var byte
arroz var byte
jugo var byte

dato var byte
datod var byte
datoa var byte
datoc var byte

Dato = 0
datod = 0
datoa = 0
datoc = 0

LCDOut $fe, 1 ' Limpia la pantalla



Inicio:

LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut "Bienvenidos"
LCDOut $fe,$C0, "Welcome"

clear
     

;Menus:


   For B0 = 1 To 200
   if enter=0 and dato = 0 then gosub suma
   Next
   gosub Hola1
   
   For B1 = 1 To 200
   if enter=0 and dato = 1 then gosub suma
   next 
   gosub Hola2    
    
   For B2 = 1 To 200
   if enter=0 and dato = 2 then gosub suma
   next
   gosub Hola3 

;goto Menus
goto Inicio
    
Hola1:

for Dias = 1 to 30
lcdout $fe,1    
lcdout $fe,$80,"Buenos"
lcdout $fe,$c0,"Dias"
   pause 100
   NEXT Dias

lcdout $fe,1    
lcdout $fe,$80,"Como"
lcdout $fe,$c0,"Estas"   
pause 300  

if enter = 0 then gosub desayuno

return    


    
Hola2:

for Tardes = 1 to 30
lcdout $fe,1    
lcdout $fe,$80,"Buenas"
lcdout $fe,$c0,"Tardes"
   pause 100
NEXT Tardes

lcdout $fe,1    
lcdout $fe,$80,"Veo que"
lcdout $fe,$c0,"Estas bien"
pause 300 

if enter = 0 then gosub almuerzo

RETURN 


Hola3:

for Noches = 1 to 30
lcdout $fe,1    
lcdout $fe,$c80, "Buenas"
lcdout $fe,$c0,"Noches"
  pause 100
  NEXT Noches
  
lcdout $fe,1    
lcdout $fe,$80,"Que pases"
lcdout $fe,$c0,"Bien"
pause 300   

if enter = 0 then gosub cena

RETURN    

desayuno:

for cafe = 1 to 30
lcdout $fe,1    
lcdout $fe,$c80, "Elija 1 opcion"
lcdout $fe,$c0,"de desayuno"
  pause 100
  NEXT cafe  
  
lcdout $fe,1    
lcdout $fe,$80,"1- Americano"
lcdout $fe,$c0,"2- Nativo"
pause 300   

if enter = 0 and datod = 0  then gosub sumad
lcdout $fe,1    
lcdout $fe,$80,"1- Americano"
pause 300

if enter = 0 and datod = 1  then gosub sumad
lcdout $fe,1 
lcdout $fe,$c0,"2- Nativo"
pause 300

lcdout $fe,1    
lcdout $fe,$80,"Gracias por"
lcdout $fe,$c0,"su eleccion"
pause 300  


RETURN   
  
  
almuerzo:

for arroz = 1 to 30
lcdout $fe,1    
lcdout $fe,$c80, "Elija 1 opcion"
lcdout $fe,$c0,"de almuerzo"
  pause 100
  NEXT arroz  
  
lcdout $fe,1    
lcdout $fe,$80,"1- Guisado"
lcdout $fe,$c0,"2- Sopa"
pause 300   

if enter = 0 and datoa = 0  then gosub sumaa
lcdout $fe,1    
lcdout $fe,$80,"1- Guisado"
pause 300

if enter = 0 and datoa = 1  then gosub sumaa
lcdout $fe,1 
lcdout $fe,$c0,"2- Sopa"
pause 300

lcdout $fe,1    
lcdout $fe,$80,"Gracias por"
lcdout $fe,$c0,"su eleccion"
pause 300  


RETURN        



cena:

for jugo = 1 to 30
lcdout $fe,1    
lcdout $fe,$c80, "Elija 1 opcion"
lcdout $fe,$c0,"de almuerzo"
  pause 100
  NEXT jugo  
  
lcdout $fe,1    
lcdout $fe,$80,"1- Asado"
lcdout $fe,$c0,"2- Pizza"
pause 300   

if enter = 0 and datoc = 0  then gosub sumac
lcdout $fe,1    
lcdout $fe,$80,"1- Asado"
pause 300

if enter = 0 and datoc = 1  then gosub sumac
lcdout $fe,1 
lcdout $fe,$c0,"2- Pizza"
pause 300

lcdout $fe,1    
lcdout $fe,$80,"Gracias por"
lcdout $fe,$c0,"su eleccion"
pause 300  


RETURN        
    


Suma:
Dato = Dato + 1            ' Incrementa en una unidad la variable "Dato".
Pause 350                  ' Realiza una pausa de 350 milisegundos para evitar
                           ' que el incremento de la variable sea muy acelerado
                           ' mientras el pulsador "enter" esté presionado.
Return                     ' Retorna una línea después del llamado "gosub Suma".


Sumad:
datod = datod + 1            ' Incrementa en una unidad la variable "Dato".
Pause 350                  ' Realiza una pausa de 350 milisegundos para evitar
                           ' que el incremento de la variable sea muy acelerado
                           ' mientras el pulsador "enter" esté presionado.
Return                     ' Retorna una línea después del llamado "gosub Suma".



Sumaa:
datoa = datoa + 1            ' Incrementa en una unidad la variable "Dato".
Pause 350                  ' Realiza una pausa de 350 milisegundos para evitar
                           ' que el incremento de la variable sea muy acelerado
                           ' mientras el pulsador "enter" esté presionado.
Return                     ' Retorna una línea después del llamado "gosub Suma".



Sumac:
datoc = datoc + 1            ' Incrementa en una unidad la variable "Dato".
Pause 350                  ' Realiza una pausa de 350 milisegundos para evitar
                           ' que el incremento de la variable sea muy acelerado
                           ' mientras el pulsador "enter" esté presionado.
Return                     ' Retorna una línea después del llamado "gosub Suma".
```


----------



## ricbevi (Abr 23, 2015)

Hola. Deberías empaquetar todo (Programa, archivo compilado, simulación) en un archivo comprimido y subirlo porque ya de entrada, si no pones resistencia de Pull-UP en PortA.1, va a ir a "sumar" ya que Dato=0
No seguí analizando la lógica del programa.
Saludos.

Ric.


----------



## jesusmolo (Abr 23, 2015)

Hola, adjunto el archivo de simulación y los demas archivos, asi como esta simulado lo tengo montado en protoboard. El oscilador del pic 16f88, esta configurado internamente a 4 Mh, utilizo una resistencia pull-up en el puerto A.


----------



## ricbevi (Abr 24, 2015)

La lógica del programa no me "cierra", el bucle principal esta permanentemente y de forma innecesaria, imprimiendo en el display y limpiándolo cuando esta a la espera, cuando pulsas "enter", se desencadenan una serie de mensajes, sin ningún tope,etc, etc....te sugiero que empieces por volcar tú idea en un programa corto de pocas lineas y ver como funciona, a este le agregas después otras opciones y pruebas y así sucesivamente hasta que funcione como tú esperas.
No se que quieres hacer con un solo botón/pulsador pero ten en cuenta que cuando mas simple es el hardware, mas complejo es la programación y mas espacio ocupa el software. Cuando usas diferentes freses a mostrar te quedas sin espacio enseguida.
Revisa la instrucción "Button" de la ayuda del PBP, que te puede servir para lo que quieras hacer.
Saludos.

Ric.


----------



## jesusmolo (Abr 27, 2015)

Hola buenas noches, hice unos cambios y logré algo de avance pero me toca dejar undido el pulsador para que me responda a los demas menus secundarios; intentaré con la instrucción Button, gracias de todas maneras por su colaboración.

Disculpen aqui adjunto el archivo modificado. gracias


----------



## jesusmolo (Abr 30, 2015)

Hola buenos dias, He estado leyendo sobre el Pic 18f2550 de 28 pines y lo que he logrado entender acerca de la conversión de los pines de analogo a digital en los 4 puertos que dispone utilizandolos con PBP y MCS; es que solo es posible en los siguientes pines: 

Entrada y salida digital
Puerto A: RA.0-RA.1-RA.2-RA.3-RA.5
Puerto B: RB.0-RB.1-RB.2-RB.3-RB.4-RB.5-RB.6-RB.7
Puerto C: RC.0-RC.1-RC.2-RC.6-RC.7

Solo salida digital
Puerto A: RA.4

Entiendo que CMCOM = 7 , Desactiva los comparadores analogicos, pero no se si de los 3 puertos a la vez; como tambien que ADCON1 = 0F configura el Puerto A con ADC como digital y ADCON1 = 0E configura el Puerto B con ADC como digital; Pero entonces como configuro el puerto C? o estoy totalmente errado en todo lo que acabo de escribir? Muchas gracias.


----------



## D@rkbytes (Abr 30, 2015)

En parte estás errado. Por eso siempre les digo que lean la hoja de datos. 

En la sección ADCON0 se muestra la configuración de bits para la selección de los canales. 

ADCON0 funciona conjuntamente con el registro ADCON1 y muestra ésta tabla: 

Estableciendo adecuadamente los bits de los registros ADCON0 y ADCON1 se selecciona el canal o canales ADC que estarán activos.
En esos mismos registros también se configura el modo de operación.

El registro CMCON no involucra a todos los puertos porque no todos tienen comparadores análogos.
Éstos únicamente se encuentran en el puerto A y esto también lo puedes ver en la hoja de datos. (Sección: Comparator Module)

El puerto C no tiene conversores AD y tampoco tiene comparadores análogos, éste tiene otro tipo de funciones y su configuración depende de los módulos que quieras usar.
Si lo piensas utilizar como un puerto estándar Digital I/O, no hay mucho que configurar.
Pero recuerda que el módulo del Bus USB forma parte del puerto C.


----------



## jesusmolo (Abr 30, 2015)

Muchas gracias por tan pronta respuesta; leyendo nuevamente y comparando con lo que escribiste comprendí un poco mas, realicé una pequeña prueba y funcionó.

4 pulsadores N/A en el Puerto A (0,1,2,3) y un diodo led en el Puerto C.7

OSCCON=%01100110  ; Configura oscilador interno en 4MGH de frecuencia estable
CMCON = 7               ; Desactiva los comparadores analogicos de todos los pines del puerto A .

ADCON0 = 63            ; ADCON0 = 3F     
ADCON1 = 15            ; ADCON1 = F

Define Osc 4             ; Define el Oscilador  de 4 Mhz.

TRISA = %111111      ; Configura el Puerto A como Entrada.
TRISC = %00000000   ; Configura el Puerto C como Salida.

PORTC = $00             ; Inicializa el puerto C.

Inicio:
If PORTA.0 = 0 Then PORTC.7 = 1 ; Pregunta si RA0 = 0, entonces RC.7 = 1 
If PORTA.1 = 0 Then PORTC.7 = 1 ; Pregunta si RA1 = 0, entonces RC.7 = 1                               
If PORTA.2 = 0 Then PORTC.7 = 1 ; Pregunta si RA2 = 0, entonces RC.7 = 1                                
If PORTA.3 = 0 Then PORTC.7 = 1 ; Pregunta si RA0 = 0, entonces RC.7 = 1 

Pause 500                                 ; Hace una pausa de 1 segundo (500 ms)

Low PORTC.7                             ; Apaga el Led
Pause 500                                 ; Hace una pausa de 1/2 segundo (500 ms)
GoTo inicio                                ; Salta a la etiqueta "Inicio"
End


----------



## juancaca (May 6, 2015)

Hola buenas noches, bueno en este momento me encuentro ensayando con las matrices de led, hasta ahora se mostrar una letra, lo que me gustaria hacer, es hacer que se desplace hacia la izquierda, mirando codigos que han subido en el foro no logro entender como hacen para que se desplace el texto utilizando el IC 74hc164, me podria hacer el favor de explicarme como hacerlo con PBP.

Codial saludo.


----------



## jesusmolo (May 7, 2015)

Hola. Buenos días. He estado practicando con el PIC18F2550 utilizando LED y buzzer en pequeños programas y me han funcionado.
No he tenido la necesidad de colocar los fuses en MCS ya que en el software del programador los coloco,
pero ahora empecé a utilizar un LCD de 16x2 con el PIC18F2550 tomando como ejemplo del tutorial de PBP sin tener buenos resultados.

En el LCD me salen varios caracteres, menos los que deben salir y en el proteus se muestra pero no como lo que debería salir.
Adjunto fotos, archivos de simulación y demás.

Agradecería mucho que me indicaran en que me tengo que corregir. Muchas gracias.

---------- Actualizado después de 2 horas ----------

Hola compañeros. Me autocorrijo en lo siguiente:

If P1 = 1 Then Call Mensaje1 ' Pregunta si RA0 = 1
If P2 = 1 Then Call Mensaje2 ' Pregunta si RA1 = 1

Corrección: P1 y P2 se deben igualar a 0

If P1 = 0 Then Call Mensaje1 ' Pregunta si RA0 = 1
If P2 = 0 Then Call Mensaje2 ' Pregunta si RA1 = 1

Y en el  "    Menu #1     " y "    Menu #2     ", se deben llenar los 16  caracteres con espacios de lado y lado dentro de las comillas, para que  se cubra totalmente el renglón superior y no aparezca parte del mensaje  anterior.

Muchas gracias de todas maneras.


----------



## ferdy575 (May 7, 2015)

Hola a todos.
Vengo por aquí a molestar, a ver sí me pueden ayudar con un trabajito.
Se trata de hacer un control para un motor DC.
La idea es poner un número determinado de revoluciones y que si por motivo de trabajo las revoluciones se bajan, el pic aumente el duty del pwm para que el motor se recupere.

La verdad no sé como hacer la comparación de las variables, para que sí una disminuye, la otra aumente y me cambie el duty del pwm.

Aquí les subo los archivos para que vean de que hablo.


----------



## jesusmolo (May 9, 2015)

Hola buenas tardes, estoy realizando ejercicios con el pic 18f2550 y queria saber si es posible que con un pulsador se borre o cambie un dato ya programado en la eeprom de este pic, adjunto un sencillo ejercicio que hice, donde se simula el dato y la direccion donde fue guardado pero todavia no lo he podido cambiar con el pulsador. gracias.


----------



## D@rkbytes (May 9, 2015)

Si estás utilizando un cristal de 4 MHz, entonces la palabra de configuración no es correcta.
Realizas comparaciones de estado de pines y variables, pero las variables nunca las inicializas.
Haces llamadas a subrutinas pero usas *Return*, en ese caso debes usar *GoSub* [Etiqueta]
Puedes ir a subrutinas usando *GoTo* y retornar nuevamente con *GoTo* a una etiqueta.

En PICBasic se puede hacer así:
*If *Sentencia *Then* Mi_Rutina

O así:
*If *Sentencia *Then GoTo* Mi_Rutina

Y de la rutina regresas nuevamente con un *GoTo*: *GoTo* [Etiqueta]

Pero no debes llamar a una subrutina con *Then* Mi_Rutina, porque equivale a usar un *GoTo*
Cuando haces eso se produce un desborde de pila llevando el programa al vector de reset. (ORG 0)

Es decir, el programa se reinicia desde el principio por no tener un punto de referencia a donde regresar.

Entonces como mencioné, si piensas regresar con *Return*, debes llamar a la subrutina con *GoSub* o *Call*


----------



## jesusmolo (May 9, 2015)

D@rkbytes dijo:


> Si estás utilizando un cristal de 4 MHz, entonces la palabra de configuración no es correcta.
> Realizas comparaciones de estado de pines y variables, pero las variables nunca las inicializas.
> Haces llamadas a subrutinas pero usas *Return*, en ese caso debes usar *GoSub* [Etiqueta]
> Puedes ir a subrutinas usando *GoTo* y retornar nuevamente con *GoTo* a una etiqueta.
> ...



Hola buenas noches, muchas gracias por tan pronta respuesta; inmediatamente corregiré lo de la inicializacion de las varibles y para llamar a las subrutinas utilizaré CALL, La verdad es que apenas con este pic 18f2550 que me regalaron, es que estoy colocando los fuses en el MCS ya que siempre con los otros pic mas pequeños utilizaba los fuses del programador, te agradecería enormemente si me indicaras cual es la palabra correcta para utilzar como oscilador externo un cristal de 4MHZ sin utilizar el USB en este pic 18f2550 y si no fuera molestia facilitarme uno o dos ejemplos en PBP donde con un pulsador pueda borrar y o cambiar un dato grabado anteriormente en una y o varias direcciones de la eeprom de este pic. Muy agradecido por tu atención prestada y tu sabio conocimiento.


----------



## D@rkbytes (May 10, 2015)

La palabra de configuración para un cristal de 4 MHz sin usar el módulo USB, es esta:

```
[B]Asm[/B]
[COLOR=Green]    Config FOSC = XT_XT, WDT = OFF, PWRT = ON, LVP = OFF
    Config USBDIV = 1, PLLDIV = 1[/COLOR]
[B]EndAsm[/B]
```
Para que funcione al compilar, se debe editar el archivo 18F2550.INC, comentando los fuses que vienen por defecto.
Esto ya se ha tratado aquí en el Foro: *Bits de Configuracion PIC 18F4550/PicBasic Pro*
El ejemplo citado en ese post también aplica para el PIC18F2550

Sobre los ejemplos de lectura y escritura de la EEPROM interna, no hay mucho que decir.
Lee sobre las instrucciones; *Write* y *Read*. Lo demás es cuestión de aplicarlas en tu programa.

Para obtener ayuda sobre las instrucciones, sitúa el cursor sobre la instrucción y presiona la tecla F1.


----------



## jesusmolo (May 10, 2015)

D@rkbytes dijo:


> La palabra de configuración para un cristal de 4 MHz sin usar el módulo USB, es esta:
> 
> ```
> [B]Asm[/B]
> ...



Buenos dias, te adjunto el archivo mejorado con algunas modificaciones; ya no me muestra errores; los fuses los cambié como me indicaste, pero editados de forma diferente ya que al colocarlos igual como los mostraste, me salian errores, escucho tus sujerencias de como quedó con la mejora que  le hice; todavia estoy investigando como con un 3er pulsador poder cambiar o borrar 1, 2 o los 3 datos grabados anteriormente en las posiciones de memoria $00, $01, $02 de la eeprom del pic 185f2550. Muy agradecido por tu atención y colaboración al desarrollo del conocimiento de estos temas.


----------



## D@rkbytes (May 10, 2015)

jesusmolo dijo:


> Los fuses los cambié como me indicaste, pero editados de forma diferente, ya que al colocarlos igual como los mostraste, me salían errores.


Esa no es la forma correcta de escribir la palabra de configuración. No tiene la sintaxis que requiere MPASWIN.
La forma correcta es como te mencioné, y los errores se deben a que no lo estás haciendo como lo explico en el ejemplo del enlace que coloqué.

De la forma en como estás escribiendo la palabra de configuración no la toma en cuenta el compilador.

Si abres el archivo hexadecimal que se genera al compilar, verás que esos fuses no los toma en cuenta.
El archivo ejecutable sigue manteniendo los fuses por defecto del archivo 18F2550.INC



Escribiendo la palabra de configuración correctamente, así deben quedar.


Aquí el archivo ya se ha compilado con los fuses requeridos.

Lee con atención el ejemplo del enlace que mencioné anteriormente para que lo entiendas bien.

Suerte.​


----------



## jesusmolo (May 11, 2015)

Buenos días. Te cuento que no comprendía, por que no había leído bien, debido a que me confié por tener el archivo.INC actualizado; hasta que  con el 1er ejemplo me di cuenta que el secreto esta en comentar las 5 palabras de configuración en el archivo.INC y listo, el MCS compilo sin errores y para verificar utilicé el winpic para comparar con tu imagen siendo las 2 iguales. Muchas gracias nuevamente.   

---------- Actualizado después de 2 horas ----------


Hola, buenos días. Te comento que en proteus me funcionó perfectamente,  pero al montarlo físicamente en lcd no muestra nada; lo raro es que al  volver a su estado inicial el archivo.INC y colocar los antiguos fuses  corre a las mil maravillas y el lcd muestra todo.
La verdad no entiendo  porque pasa esto. ¿Por qué sucederá esto? En el proteus funciona con el  archivo .INC original y modificado, pero en la realidad con el circuito físico montado sólo funciona con el archivo.INC original y los fuses que  te envié inicialmente.


----------



## D@rkbytes (May 11, 2015)

jesusmolo dijo:


> Te comento que en proteus me funcionó perfectamente,  pero al montarlo físicamente en lcd no muestra nada; lo raro es que al  volver a su estado inicial el archivo.INC y colocar los antiguos fuses  corre a las mil maravillas y el lcd muestra todo.
> La verdad no entiendo  porque pasa esto. ¿Por qué sucederá esto?


Pues si es extraño que no te funcione físicamente.
Para verificar lo que comentas, monté el circuito en un protoboard y grabé el PIC con la palabra de configuración correcta. (O sea, la que te sugerí)

Tanto en proteus como en el protoboard, funcionan bien.


​
Te recomiendo que realices un programa simple, como hacer destellar un LED cada 500 ms.
Cuando esté en funcionamiento, quita el cristal y el programa se debe detener.
Si el LED sigue destellando a la misma frecuencia u otra más baja, entonces quiere decir está entrando en funcionamiento el oscilador interno debido al fuse FCMEN y algo sigue mal con tu palabra de configuración.

Nota:
Por lo que mencionas, todo parece indicar que estás grabando el PIC con los fuses erróneos.​


----------



## jesusmolo (May 12, 2015)

Hola. Buenos días. Aparentemente hice un avance en el programa donde con un pulsador borro o cambio 3 datos guardados con anterioridad en 3 direcciones diferentes de la EEPROM del PIC18F2550.

Les explico:
Al inicio del programa escribí 3 datos (1, 2, 3) en 3 direcciones diferentes de la EEPROM ($00, $01, $02)
Con los pulsadores SUMA y RESTA se pueden observar los 3 datos grabados en 3 direcciones diferentes de la EEPROM.
Con el pulsador BORRA se cambian los datos (1, 2, 3) por los datos (4, 5, 6) en 3 direcciones diferentes de la EEPROM ($00, $01, $02)
Para hacer este paso debe estar colocado en pantalla el dato 3, dirección de memoria $02.
Con el pulsador BORRA2 se cambian los datos (4, 5, 6) por los datos (1, 2, 3) en 3 direcciones diferentes de la EEPROM ($00, $01, $02)
Para hacer este paso debe estar colocado en pantalla el dato 4, dirección de memoria $00.

Aparentemente digo yo que se sobrescriben los datos en la EEPROM, pero al querer verificar con el software del programador, observo que en el visor de la EEPROM DATA no aparece nada grabado, teniendo en cuenta que utilicé  WRITE y READ  para escribir y leer los datos en la EEPROM.

Otro detalle que observe, es que cuando apago y prendo el circuito en simulador y físico, siempre aparecen los 3 datos grabados en el inicio, nunca los que sobrescribí.
¿Por qué sucederá esto? ¿No se supone que al grabar un dato en la EEPROM debería quedar guardado?
¿O es que solamente para que se puedan conservar los datos en la EEPROM en este PIC, sólo es posible a través de un PC?

Teniendo en cuenta esto, investigué un poco sobre la instrucción EEPROM y la apliqué al programa, y si se guardaron en la EEPROM los 3 datos inicialmente inscritos con el PC, pero al apagar y volver a prender en el simulador y circuito físico, no se guardaron los 3 datos sobrescritos; a no ser que esté utilizando mal la instrucción EEPROM.

Escucho ideas y sugerencias, o si no es posible hacer lo que quiero hacer.
Adjunto  todos los archivos con simulación, también fotos del archivo .INC modificado para el PIC18F2550, foto menú de fuses que tiene mi programador con .INC modificado para programar el PIC18F2550 y que al probarlo en Proteus funciona pero al probarlo en físico, sólo se muestran 16 cuadros negros en el LCD.

Muchas gracias por la atención prestada de todos ustedes.


----------



## jesusmolo (May 13, 2015)

D@rkbytes dijo:


> Pues si es extraño que no te funcione físicamente.
> Para verificar lo que comentas, monté el circuito en un protoboard y grabé el PIC con la palabra de configuración correcta. (O sea, la que te sugerí)
> 
> Tanto en proteus como en el protoboard, funcionan bien.
> ...



Hola buenos dias; Te comento que hice el ejercicio que me recomendaste con un led y el resultado fue el siguiente:

Con el archivo .INC original y los fuses que inicialmente le habia colocado, el led prendió normalmente haciendo su rutina de prendido y apagado cada 500 ms; al quitarle el cristal como me indicaste el led se apagó.

Con el archivo .INC modificado y los fuses que me indicaste le colocara, el led no prendió.

Que podria ser? o sera el pic? lo raro es que pedí prestado otro pic 18f2550 y sucede lomismo. 
gracias


----------



## D@rkbytes (May 13, 2015)

Es muy extraño lo que te sucede. Si yo compilo con los fuses por defecto y un cristal de 4 MHz, el LED destella más rápido, como a unos 250 ms.
En cambio, usando los fuses para configuración XT sin USB, el LED destella normalmente a 500 ms.

Este es el sencillo programa de prueba que usé.

```
[B]Asm[/B]
[COLOR=Green]    Config FOSC = XT_XT, WDT = OFF, PWRT = ON, LVP = OFF
    Config USBDIV = 1, PLLDIV = 1[/COLOR]
[B]EndAsm[/B]

Inicio:
    [B]Define[/B] OSC 4
    ADCON1 = 15
    
    TRISB.7 = 0
    
Programa:
    LATB.7 = 1
    [B]Pause[/B] 500
    LATB.7 = 0
    [B]Pause[/B] 500
    
    [B]GoTo[/B] Programa
    
    [B]End[/B]
```
Obviamente, para usar los fuses por defecto del archivo 18F2550.INC, comento los del programa y descomento los del archivo, y para usar los fuses del programa, comento los del archivo y descomento los del programa.

Si haces todo correctamente, deberías tener los mismos resultados que en las pruebas que yo he realizado.


----------



## jesusmolo (May 14, 2015)

D@rkbytes dijo:


> Es muy extraño lo que te sucede. Si yo compilo con los fuses por defecto y un cristal de 4 MHz, el LED destella más rápido, como a unos 250 ms.
> En cambio, usando los fuses para configuración XT sin USB, el LED destella normalmente a 500 ms.
> 
> Este es el sencillo programa de prueba que usé.
> ...



Hola buenos dias, realizaré el ejercicio y te comento. Yo adjunte una foto del menu de fuses que muestra mi programador K150; observaste algo extraño? habrá que cambiarle algún otro dato o está bien? gracias por  tu atencon.


----------



## cosmico74 (May 14, 2015)

D@rkbytes dijo:


> Lo que puedes hacer, es usar la interrupción  externa por RB0, tomar el tiempo con el Timer 0 y en cada transición de  la señal, limpiar el Timer y cambiar el flanco de interrupción.
> De esta forma puedes medir lo que dura cada transición.


¿Qué tal, D@rkbytes?

Perdón por interrumpir el proyecto que vienen realizando.

Tengo unas dudas sobre como *medir el ancho de pulso en alto* de x señal (cuadrada con un duty cycle del 50%) que inyecto por el PIN_RB0.

Ya lo intenté con el comando pulsin y todo bien, ahora quiero experimentar con otros dos métodos que leí por la web, que son los siguientes:

1.- _*Utilizando el Timer0 y la interrupcion RB0*_ <---- Primero sería este.

2.-_* Utilizando el modulo CCP con el timer.
*_
Bueno, sinceramente los he utilizado por separado.
He utilizado el timer0 para hacer parpadear un led variando el registro TMR0 y así obtener diferentes temporizaciones con sus respectivos cálculos utilizando la formula. OK.

Y al igual he utilizado la interrupción por RB0, pero todo esto por separado.
Ahora lo que se me complica es como unir la INT/RB0 con el Timer0 en la rutina para medir el ancho de pulso de una señal cuadrada cualquiera, no importa precisión.

O sea, ¿Cuales serían a detalle los pasos a seguir? ¿Alguien tendrá un ejemplo o aportarme?
Algo como empezar en la rutina de interrupción RB0, activando/desactivando el timer0 cambiando de flancos ascendente/descendente, etc.

Cabe mencionar que intenté adaptar un código ccs con resultados fallidos, no me hace ni pio y quiero mejor empezar desde cero.

Bueno, en este pseudo código lo único que hice es configurar todos los registros OPTION_REG e INTCON necesarios (creo) para hacer funcionar esta práctica.

Todos los aportes, ejemplos, comentarios, jalones de oreja, bienvenidos.

Gracias

Anexo pseudo código + proteus.


----------



## D@rkbytes (May 15, 2015)

jesusmolo dijo:


> Yo adjunté una foto del menú de fuses que muestra mi  programador K150.
> ¿Observaste algo extraño? ¿Habrá que cambiarle algún  otro dato o está bien?


Lo extraño en ese programador es que ponga HS OSC w/PLL (O sea, Oscilador de alta frecuencia con PLL) 
Cuando debería ser: XT used by USB. (En la configuración que se está usando no se usará el módulo USB)

En las pruebas que he realizado lo he grabado con el PICKit 3 y también con el JDM usando WinPic800, obteniendo los mismos resultados.

Los valores de los fuses para las tres aplicaciones son algo diferentes, sin embargo el valor número 1 es el mismo y es el que corresponde al tipo de oscilador.

Éstos son los valores leídos:

Con MicroBrn:


Con WinPic800:


Con PICKit 3:
​ 
Trata de grabar el PIC con otro programador y verifica su comportamiento.



cosmico74 dijo:


> Tengo unas dudas sobre como *medir el ancho de pulso en alto*
> de x señal (cuadrada con un duty cycle del 50%) que inyecto por el PIN_RB0
> O sea, cuales serían a detalle los pasos a seguir. ¿Alguien tendrá un ejemplo o aportarme?
> 
> Algo como empezar en la rutina de interrupción RB0, activando/desactivando el timer0


Necesitas seleccionar un rango para el prescaler establecido al Timer 0 usando el registro OPTION_REG.
Lo puedes hacer fijo desde 1:2 <> 1:256, eso depende de la frecuencia de trabajo y la frecuencia que quieras medir. (Ver; ciclos de instrucciones en un PIC.)
Algo más complicado es verificando el desborde del Timer 0 y cambiando el prescaler.

Después, durante el servicio de interrupción por RB0, (Interrupción externa) limpias el Timer 0, realizas un bucle de espera hasta que RB0 cambie de alto a bajo, das un tiempo de reestablecimiento de unos 3 o 10 us, y a continuación lees el valor del Timer 0.
Ese valor será el periodo que tardó el pulso en cambiar de estado.
Si lo requieres, puedes hacer una conversión dividiendo el valor de la lectura por el rango del prescaler.

Saludos.​


----------



## blackpic (Jun 21, 2015)

Hola primero un saludo a esta magnifica comunidad.
Le escribo por que tengo una pregunta con respecto al ADC del PIC16F886 y es con respecto a su configuracion estoy usando este ej. de esta pagina la cual dejo en este linc http://mrchunckuee.blogspot.com/2014/08/uso-del-adc-con-pic16f887-encender-leds.html 
como en este usan un 16F887 y tengo a mano un 16F886 cambie el puerto a representar para los led la cual lo tengo en el puertoB.

Le explico mi inquietud para que el ADC me trabaje tengo que poner una referencia en RA3/VREF, esto es asi por que eh visto el data del micro para configurar los registros ANSEL,ANSELH,CM1CON0,CM2CON0,etc y no logro hacer que RA3 me funcione como entrada y salida digital.

ADCON1 = %10000000 
ADCON0 = %11000001 
ANSEL = %00000001
CM1CON0 = 0 		
CM2CON0 = 0		
ANSELH = 0 

gracias de ante mano y agradesco sus sugerencia.


----------



## D@rkbytes (Jun 21, 2015)

No entendí bien la pregunta.
Primero dices tener dudas acerca de la configuración del ADC y después mencionas que RA3 no te funciona en modo digital.

Pero mira...
Cualquier canal puede trabajar sin usar una referencia, o como mencionas, sin usar RA3.
El registro ANSEL es para los canales del puerto A y ANSELH para los del puerto B.
Estando ANSEL y ANSELH en 0, todos los pines trabajarán en modo digital y no es necesario configurar los registros CMXCONX.

Entonces, con estar en 0 el bit 3 del registro ANSEL, RA3 será digital I/O


----------



## blackpic (Jun 21, 2015)

Hi D@rkbytes la duda es sobre si es necesario usar el RA3 para el funcionamiento del ADC ya que en la simulacion en proteus solo me funciona de esa manera.
y sobre los registros los tengo de esta manera, la cual por la simulacion surgia mi duda en que si estaban bien configurados.
ADCON1 = %10000000 
ADCON0 = %11000001 
ANSEL = %00000001
CM1CON0 = 0 
CM2CON0 = 0	
ANSELH = 0

Gracias por tu pronta respuesta.


----------



## D@rkbytes (Jun 21, 2015)

Si tu voltaje de entrada es de 0 - 5 V. y no necesitas precisión en la lectura, no es necesario usar tensión de referencia.

Mejor adjunta tu proyecto dentro de un archivo comprimido para verlo en detalle.


----------



## blackpic (Jun 21, 2015)

dejo el archivo de la simulacion.
si no cierras el swich1 el adc no funciona sobre el puertoB


----------



## D@rkbytes (Jun 22, 2015)

Veo que usas el ADC a 10 bits, pero si el puerto B sólo tiene 8 bits, no tiene caso que lo uses a 10 bits.
Usando el ADC a 10 bits obtendrás una lectura de 1023 cuando el ADC esté al tope.
En cambio, con 8 bits obtendrás una lectura de 255 que se acopla a los 8 bits del puerto B.
Y como al parecer lo que quieres hacer es algo así como un VuMeter, puedes separar más fácilmente los rangos dentro del *Select Case* y evitas la división.

Mira este simple programa y haz la prueba para que veas que funciona sin usar RA3 como tensión de referencia.

```
;*******************************************************************************
@ Device PIC16F886    ; Microcontrolador utilizado
; Palabra de configuración:
@ Device INTRC_OSC_NOCLKOUT,WDT_OFF,PWRT_ON,BOD_OFF,LVP_OFF,FCMEN_OFF
@ Device2 WRT_OFF,WRT_HALF
;*******************************************************************************
Define OSC 4                ; Frecuencia por defecto del oscilador interno.

Inicio:
    ; Declaración de variables.
    Valor_ADC   Var Byte
;*******************************************************************************
    ; Configuración de registros.    
    TRISB = 0               ; Todo el puerto B como salidas.
    ANSEL = 1               ; Seleccionar AN0
    ANSELH = 0              ; AN8 - AN13 Digital I/O
    PORTB = 0               ; Puerto B en 0
;*******************************************************************************
    Clear                   ; Limpiar RAM (Variables en 0)
   
Programa:
    ADCIn 0,Valor_ADC       ; Leer el canal 0
    PORTB = Valor_ADC       ; Puerto B = Valor de "Valor_ADC"       
    Pause 100               ; Retardo de 100 ms. (Opcional)
    
    GoTo    Programa


    End
```
Nota que no existen configuraciones extra para el ADC porque se están usando las que el microcontrolador tiene por defecto.
Aquí se obtiene una visualización binaria en el puerto B, ya que sólo es una prueba de funcionamiento para demostrar que sí se puede usar el conversor análogo sin usar RA3.

Suerte.


----------



## blackpic (Jun 22, 2015)

Hi D@rkbytes te comento que en la simulacion anda igual osea necesita el voltaje de referencia, pero pase tu ejemplo a proton ide y funciona sin referencia pero de verdad no se que pasa con el pic basic pro. tambien pienso en que puede ser las versiones que tengo del compilador y micro code.


----------



## D@rkbytes (Jun 22, 2015)

Algo debes estar haciendo mal.
Mira, adjunto el proyecto con la simulación funcionando sin usar RA3.

Si no te funciona, entonces si debes tener algo mal con tus versiones.

Suerte.


----------



## blackpic (Jun 23, 2015)

Gracia por tus aporte y comentario mi problema estan en las versiones que tengo creo que es mas del compilador.


----------



## PANC (Jul 5, 2015)

Hola. ¿Cómo podría sensar el servomotor con un PIC para que cuando esté en funcionamiento el servomotor y uno tiende a frenar, el servo este se detenga?
O sea, que el PIC no le envíe más señal PWM cuando detecta que alguien intenta frenar el eje.

¿Me expliqué bien?


----------



## papirrin (Jul 5, 2015)

> me explique bien?



podrias sensar la corriente con una resistencia shunt+amplificador operacional+ADC del Pic o comparador del PIC, si tu servo motor no tiene encoder o similar incluido.


----------



## torres.electronico (Jul 5, 2015)

Tal cual, es una muy buena idea.
Tendría que leer en estado de reposo, en estado "normal de funcionamiento" y guardar esos valores a ojimetro para después hacer una comparaion.



El tema está en que la lectura tendría que ser por muestreo.
O sea, leer un par de veces, sumar las lecturas y dividirla por la cantidad de veces que se sumó.
¿Me equivoco?


----------



## papirrin (Jul 5, 2015)

> El tema está en que la lectura tendría que ser por muestreo.
> O sea, leer un par de veces, sumar las lecturas y dividirla por la cantidad de veces que se sumó.
> ¿Me equivoco?



yo he echo varios proyectos similares en los que requiero que el motor se pare cuando hay un sobre-consumo, la mayoria de las veces lo hago utilizando los comparadores y su respectiva interrupcion, asi que es instantaneo, osea que no hay tiempos de conversion y el paro sea inmediato pues en ocaciones es tan rapido el aumento de corriente que se alcanza a sobrecalentar el motor o transistor de control antes de que el pic reaccione, pero ahora si que el compañero tendria que dar mas informacion de su proyecto para que se le pueda orientar con mayor presicion.

saludos compañero.


----------



## PANC (Jul 5, 2015)

Gracias, papirrin. Es una buena idea, lo he probado pero lamentablemente no funciona, es muy probable que me esté confundiendo en algo.

Les cuento el proyecto:
Estoy armando una mano robot, a la cual le envío un dato de la PC al PIC y éste tiene que controlar cada dedo independiente, o sea que cada dedo posee su servo,  se debe detener cuando agarre un objeto y cuando sobrecargue al servo.

El problema es que el servo no se detiene cuando sobrecargo al mismo.
Medí la tensión de la resistencia que me indica sobrecarga del servo y ésta me marca entre 1,3 V y 500 mV.

Acá un pedazo del código donde senso el servo del pulgar, y creo que está bien.

```
for R=1 to 80                     'si llega a 80 salgo del for osea le doy 80 pulsos al servo
        high SERVO                    'envio un pulso a la señal del servo
        pauseUS 6480                  'demora del pulso 2,7ms 
        ADCIN 0, sensor5              'muestreo ad0 y lo copio a la variable sensor5
        IF SENSOR5>65 then            ' si la tension de r supera 1.27v  entonces
        r=80                          'r =80 asi salgo del for
        endif                         'fin del if
        low SERVO                     'tiempo en bajo de la señal del servo
        pauseUS 41520                 '17,3ms 
    next                              'vuelvo al for
```


----------



## torres.electronico (Jul 6, 2015)

Estoy intentando hacer algo con un ASC712 y haciendo unas pruebas en proteus, veo que no doy pie con mano...Segun lo que interpreto de la hoja de datos, es que el sensor da una slaida proporcional a la corriente que pasa por el hall... la tension de salida proporcional en el sensor de 30Amp, es de 66mV por cada Amper...

probe con un simple ejemplo y...  no funciono y dbe de ser bobo el error, pero no lo veo :cabezon:


```
ADCIN 1, adc
aux = (adc */ 5000)
VCC = (adc */ 5000) >> 2 
amp= aux / 66

LCDOUT $FE,$80,"V:",dec(VCC/1000),".",dec2 VCC, " A:",dec (AMP/10),".",dec2 amp
```

Lo que intente 1ero es hacer un voltimetro, y segun ese valor, dividirlo por 66 para obtener la corriente... en el segundo reglon, hay una barra que aumenta o decrece segun el dato de entrada... eso si funciona  y es gracias a un ejemplo de Ricardo 


En el archivo ".rar" esta el codigo completo con la simu en proteus... si alguien me puede orientar de como puedo hacer la conversion u darme un cafe para despertarme (hace horas que estoy ensando donde le pifie y nada ), se lo agradecere...saludos


----------



## D@rkbytes (Jul 6, 2015)

Veo que usas el canal 1, pero en el código sólo estás estableciendo como entrada RA0.
Por lo tanto, RA1 quedará funcionando como salida.
Elimina la instrucción TRISA = 1 para dejar el puerto A como entradas. (Por defecto)

Si el sensor mide hasta 30 amperes y se obtiene 1 ampere por cada 0.066 V, entonces...
0.066 * 30 = 1.98 V.
30 Amperes será tu valor de lectura máximo y 1.98 V será el voltaje de entrada máximo al conversor AD.

Aquí conviene usar el voltaje de referencia VRef+ para establecer un limite y poder realizar un ajuste.

Mira este código de ejemplo para que lo entiendas:

```
;*******************************************************************************
@ Device PIC16F877A    ; Microcontrolador utilizado
; Palabra de configuración:
@ Device XT_OSC,WDT_OFF,PWRT_ON,LVP_OFF
;*******************************************************************************
; Definición de pines para la pantalla.
Define LCD_DREG PORTD        ; Puerto de datos.
Define LCD_DBIT     4        ; Bit de inicio de datos.
Define LCD_RSREG PORTD        ; Puerto de RS (Register Select)
Define LCD_RSBIT    3        ; Pin para RS
Define LCD_EREG PORTD        ; Puerto de E (Enable)
Define LCD_EBIT     2        ; Pin para E

; Declaración de variables:
Valor_ADC   Var Word
Amperes     Var Byte

Inicio:
    Define ADC_BITS 10      ; 10 bits de resolución
    ADCON1 = %10000101      ; Just. Der. Canales 0,1, VRef+ AN3

Inicia_LCD:
    LCDOut $FE,$83,"AMPERIMETRO"

Programa:
    ADCIn 0,Valor_ADC
    Amperes = ((30 * Valor_ADC) / 1024)
    LCDOut $FE,$C4,Dec2 Amperes," Amps."
    GoTo    Programa


    End
```
El voltaje de referencia que debe ser de 1.98 V, lo puedes obtener con un CI TL431 y un potenciómetro como divisor de tensión.


----------



## torres.electronico (Jul 6, 2015)

no me cierra algo y debe de ser por eso que estoy trabado como puerta con cerrojo o burro empacado 
por que implementas 0.066 (uV o mV?) ... yo implemente0.66 ... por ahí veo que arranca parte de mi problema... y el otro gran problema que tengo, es que yo me encerre con lo que dice la hoja de dato, que la salida es de 0-5Vcc, o sea, 5Vcc para 30Amp y 2,3Vcc para 0Amp y 0Vcc para -30Amp
Voy a quedarme un buen rato interpretando tu ejemplo y ver si puedo abrir un poco la mente... que brona cuando me trabo  
Millon de gracias   ... termino y subo resultados 

EDIT: me parecia que no me cerraba algo, mirá, esta es la grafica que muestra la curva de la salida segun la corriente que pasa por el hall


Voy a jugar con tu ejemplo para ver si puedo hacer magia  En este caso, podria usar referencia 5Vcc, verdad?


----------



## D@rkbytes (Jul 6, 2015)

torres.electronico dijo:


> ¿Por qué implementas 0.066 (uV o mV)?
> Yo implementé 0.66. Por ahí veo que arranca parte de mi problema.


Yo sólo tomé como referencia los 66 mV que mencionaste.


torres.electronico dijo:


> La tensión de salida proporcional en el sensor de 30Amp, es de *66mV* por cada Ampere.


0.66 V, son 660 mV. y 0.066 V, son 66 mV.

Basándome en eso fue que realicé la fórmula.
Si el voltaje de salida es lineal, no hay problema, pero si no lo es, será necesario realizar una tabla para ir tomando valores.


----------



## torres.electronico (Jul 6, 2015)

me paree que la slaida no es lineal... o por lo menos eso estoy viendo en proteus... Creo que me voy a inclinar por invertir las siguientes horas en una tabla con lookup como bien vos decis... me voy a quedar pelado, eso ponele la firma jajajajaja Gracias amigazo, ahora veo como arrancar de cero...tendria que borrar todo lo que hice para no perderme, equivocarme y arrancare de cero


----------



## torres.electronico (Jul 7, 2015)

sigo dando vueltas como una calesita por que me di cuenta que yo estoy dividiendo por 1024 (supuestamente 5Vcc), siendo que el sensor la señal es de 2.5 a 5Vcc para corrientes positivas de 0 a 30Amp... si yo lo sigo interpretando de la misma manera que antes, si no mal interpreto, estaria metiendo todos los valores enteros dentro del 1024, cuando justamente los valores mas bajos corresponderian a 0-2.4Vcc, o sea, corriente negativa (ejemplo -30Amp)... Como yo necesito solo la parte positiva, tengo que ver como separar las lecturas mayores a 2.5Vcc y de ahi buscarle la vuelta para la transformacion...  Toy muy errado?  acepto un cachetazo


----------



## D@rkbytes (Jul 7, 2015)

Al ver la siguiente gráfica, me parece que existen más de los 1.98 V que supuestamente se obtendrían al sensar 30 amperes.
​Sensar 0 Amperes está por los 2.5 V, mientras que 30 amperes está casi por los 4.5 V.

¿Ya realizaste pruebas en físico con el sensor para ver que valores arroja?


----------



## torres.electronico (Jul 7, 2015)

D@rkbytes dijo:


> Al ver la siguiente gráfica, me parece que existen más de los 1.98 V que supuestamente se obtendrían al sensar 30 amperes.
> Ver el archivo adjunto 131794​Sensar 0 Amperes está por los 2.5 V, mientras que 30 amperes está casi por los 4.5 V.
> 
> ¿Ya realizaste pruebas en físico con el sensor para ver que valores arroja?



Lo estoy por encargar porque me pareció un muy buen precio (99$, o sea, 10 dolares aproximadamente) en cuanto a funcionalidad, tamaño y para la infinidad de proyectos que lo podría meter (si es que puedo llegar a entender como usarlo )

Igualmente, por lo que vi, hay algo de desinformación al respecto.
La hoja de datos dice una cosa, en varios foros y google otras tantas y más o menos, sólo concuerda con la hoja de datos de los valores del sensor si le coloco una corriente variable.

Estaba justamente perdiendo el tiempo en una tabla que pensé que era la solución.
Suena gracioso, pero estaba en el arenero escribiendo una desparramada y de repente me pasó algo por la cabeza y arranqué a escribir unas lineas, pero después me di cuenta que seguía co la misma idea del principio y tendría el mismo problema. 

---------- Actualizado después de 3 horas ----------

No entiendo dónde estoy aplicando mal mis matemáticas. 
El primer error que noté, es que si entran 5V (4,98Vcc), en el micro se lee  ValorADC=1003 como máximo y en 0V=511
Ahí seguro le estoy errando en  la configuración del puerto.

El tema está en que estoy viendo de hacerlo trabajar de esta manera y no me cierra.
Como tengo que trabajar entre 512 y 1024, lo que hago es restar ambos y  lo divido por la cantidad de pasos (30Amp=30pasos), dándome como  resultado la supuesta sensibilidad, o dicho en otra forma, la tensión que  varía entre paso y paso (1,71v)

_* (1024 - 512)=513 / 30 =17.1 = 1,71v por Amp  *_

Hasta acá en una hoja con lápiz cuaja la idea:

_*(ValorADC - Offset)/ sensibilidad * pasos *_

Pero llevarlo al plano real está siendo todo un fastidio. No me da para  nada el valor que tendría que darme.  



```
DEFINE OSC 4
@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16F877A, PWRT_On
@ DEVICE pic16F877A, PROTECT_OFF

DEFINE LCD_DREG      PORTD    
DEFINE LCD_DBIT      4        
DEFINE LCD_RSREG  PORTD    
DEFINE LCD_RSBIT  2    
DEFINE LCD_EREG      PORTD    
DEFINE LCD_EBIT   3        
DEFINE LCD_BITS      4    
DEFINE LCD_LINES  2

Define    ADC_BITS    10             ' Establece el número de bits en el resultado
Define    ADC_CLOCK    3             ' Ajuste el reloj de origen (rc=3)
Define    ADC_SAMPLEUS    50          ' Establezca el tiempo de muestreo en uS 

INTCON=%10100001           
TMR0=0 
T2CON = %00000110
PR2=124     

CMCON=7

ADCON1=%10000010
TRISA=%000001
TRISB=%11111111
TRISC=%01111011
TRISD=%00000000     


AUX var word 
AMP var word
ValorADC var word
Offset con 512               

;ON INTERRUPT GoTo ATENCION
;********************************************************************
;Configuro como valor offset 511 que representa supuestamente el valor 2.49V-0A
;para sacar la escala, resto la lecura maxima con la lectura minima y la divido
;por los pasos
; (1024 - 512)=513 / 30 =17.1 = 1,71v por Amp  
;Supuestamente entonces, para hacer la lectura tendria que:
;(ValorADC - Offset)/ sensibilidad * pasos 
; y no me da para nada... #@¬€<*n¨*^[]&¬¬!!!!!! 
;********************************************************************
LCDOUT $fe,1
Inicio:

pause 200
aDCIN 0, ValorADC
AMP = (ValorADC - offset) * 17 /513
AUX = (ValorADC - Offset) /513         ;una prueba alternativa que tampoco me dá


LCDOUT $FE,$80,"A=",dec AMP,".",dec1 amp," ADC=",dec ValorADC
LCDOUT $FE,$C0,"A=",dec Aux,".",dec1 aux
goto inicio


End

;----------------------------------------------------------------
;----------------------------------------------------------------

;*****************************************************************
;++++++++++++++++++++++++ INTERRUPCION +++++++++++++++++++++++++++
;*****************************************************************

DISABLE
ATENCION:
        

INTCON.2=0    
RESUME
ENABLE

END
;*****************************************************************
;*****************************************************************
```
 
La salida es lineal, al parecer.


----------



## D@rkbytes (Jul 8, 2015)

Cada paso del ADC a 10 bits con VRef+ en 5 V y VRef- en 0V, es cada 0.00488 V (4.88 mV.)

Pero si el ACS712 con 0 Amperes tiene 2.5 V como salida, entonces la lectura del ADC será de 512. (La mitad)
Eso se tendrá que descontar para que con 2.5  V, la lectura en 0 Amperes muestre 0.

Prueba así, pero recuerda que el valor mínimo de entrada al ADC son 2.5 V y el máximo 4.5 V.

```
; Declaración de variables:
Valor_ADC   Var Word
Amperes     Var Byte

Inicio:
    Define ADC_BITS 10      ; 10 bits de resolución
    ADCON1 = %10000101      ; Just. Der. Canales 0,1, VRef+ AN3

Inicia_LCD:
    LCDOut $FE,$83,"AMPERIMETRO"

Programa:
    ADCIn 0,Valor_ADC
    Amperes = (30 * (Valor_ADC - 512) / 439) ; 439 = Valor por paso en 4.5 V. (0.00439 V.)
    LCDOut $FE,$C4,Dec2 Amperes," Amps."
    GoTo    Programa


    End
```
Este programa usa el pin RA3 (AN3/VRef+) en donde deberás establecer la tensión de referencia.
Coloca un potenciómetro y fija un valor alrededor de 4.88 V para realizar la prueba.

Algo así:


----------



## torres.electronico (Jul 9, 2015)

Con la referencia mejoro mucho, tenes razon; Ahí logre hacer algo que se aproxima un poquito mas, pero estoy viendo que lo voy a tener que hacer fisicamente si o si para ver si no es la libreria de proteus lo que no me cierra con exactitud (estoy dudando de los pasos)... 


```
DEFINE OSC 4
@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16F877A, PWRT_On
@ DEVICE pic16F877A, PROTECT_OFF

DEFINE LCD_DREG      PORTD    
DEFINE LCD_DBIT      4        
DEFINE LCD_RSREG  PORTD    
DEFINE LCD_RSBIT  2    
DEFINE LCD_EREG      PORTD    
DEFINE LCD_EBIT   3        
DEFINE LCD_BITS      4    
DEFINE LCD_LINES  2


INTCON=%10100001           
TMR0=0 
T2CON = %00000110
PR2=124     

CMCON=7
TRISB=%11111111
TRISC=%01111011
TRISD=%00000000     
PARAR         VAR PORTB.3
BOTON_MAS     VAR PORTB.4
BOTON_MENOS   VAR PORTB.5
BOTON_ENTER    VAR PORTB.6
BOTON_MENU     VAR PORTB.7

Valor_ADC   Var Word
Amperes     Var Byte 
AMP var word              
Mamp var word
;ON INTERRUPT GoTo ATENCION

Inicio:
Define ADC_BITS 10      ; 10 bits de resolución
ADCON1 = %10000101      ; Just. Der. Canales 0,1, VRef+ AN3
    
Programa1:
    LCDOut $FE,1
    ADCIn 0,Valor_ADC
    Amp = (30 * (Valor_ADC - 512) / 439) 
    gosub limites       
    LCDOut $FE,$80,Dec Amp,".",dec1 mamp," Amps"
    LCDOut $FE,$C0, dec valor_adc 
    pause 100
    GoTo Programa1      

Limites:
    if amp > 0 and amp < 1023 then   ; anti desborde
    amp = Amp-1
    mamp = amp>> 1 +1 
    if Valor_ADC < 512 then
    mAmp = 0
    endif
    endif
    if Valor_ADC < 512 then         ;para ignorar valores negativos
    Amp = 0
    endif
    if Valor_ADC > 1022 then        ;para limitar el maximo
    Amp = 30
    endif
     
    return

End

;----------------------------------------------------------------
;----------------------------------------------------------------

;*****************************************************************
;++++++++++++++++++++++++ INTERRUPCION +++++++++++++++++++++++++++
;*****************************************************************

DISABLE
ATENCION:
        

INTCON.2=0    
RESUME
ENABLE

END
;*****************************************************************
;*****************************************************************
```
 si no puedo sacarle un mejor margen a los mA... tendre que hacer una tabla al parecer


----------



## torres.electronico (Jul 14, 2015)

acá logre mejorarlo un poco sin la referencia de tension ...


```
DEFINE OSC 4
@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16F877A, PWRT_On
@ DEVICE pic16F877A, PROTECT_OFF

DEFINE LCD_DREG      PORTD    
DEFINE LCD_DBIT      4        
DEFINE LCD_RSREG  PORTD    
DEFINE LCD_RSBIT  2    
DEFINE LCD_EREG      PORTD    
DEFINE LCD_EBIT   3        
DEFINE LCD_BITS      4    
DEFINE LCD_LINES  2
;INTCON=%10100001           
;TMR0=0 
;T2CON = %00000110
;PR2=124     
;CMCON=7
DEFINE    ADC_BITS    10        
DEFINE    ADC_CLOCK    3        
DEFINE    ADC_SAMPLEUS    50
ADCON1=%10001110 
TRISB=%11111111
TRISC=%01111011
TRISD=%00000000     

PARAR         VAR PORTB.3
BOTON_MAS     VAR PORTB.4
BOTON_MENOS   VAR PORTB.5
BOTON_ENTER    VAR PORTB.6
BOTON_MENU     VAR PORTB.7

Valor_ADC   Var Word
AMP         var word              
mA          var byte
;ON INTERRUPT GoTo ATENCION

'------------------------------------------------------------------------------- 

Inicio:
   LCDOut $FE,1
   ADCIN 0,valor_adc  
   LCDOut $FE,$80,"ADC =",dec valor_adc
   amp=((valor_adc-511)*100)/139   ;511 es el punto minimo y 139 el valor del paso en mA
   mA=amp//10
   amp=amp/10
   LCDOUT $FE,$C0,"Amp=",dec amp,",",dec mA
   pause 100
   goto inicio 

End

;----------------------------------------------------------------
;----------------------------------------------------------------

;*****************************************************************
;++++++++++++++++++++++++ INTERRUPCION +++++++++++++++++++++++++++
;*****************************************************************

DISABLE
ATENCION:
        

INTCON.2=0    
RESUME
ENABLE

END
;*****************************************************************
;*****************************************************************
```



lo  que no me cierra, es que para que el programa me de un valor aproximado  con esa libreria, eh tenido que colocar en el valor del paso el 139 (el  doble y un poco mas de los 66mV que dice la hoja de datos)... asi que  tendre que esperar a tener el sensor en mis manos para ver realmente de  cuanto es el salto.


----------



## terminator (Jul 23, 2015)

papirrin dijo:


> No cuando inicia asigna el codigo ascii a eprom1 como lo tienes, el que parece ser 48 necesitas quitar las comillas asi:
> 
> ```
> n1 var byte
> ...



Hola amigo. muchas gracias por esta aclaración. Si yo hubiese sabido que la eprom por defecto al inicarse vale 255 (FF) no hubiera preguntado. Ahora todo está claro. Es más. teniendo la teoría que me dijiste, veo (e hice pruebas) que no importa que valor tiene eprom1, por que siempre al iniciarse se escribirá 255 y por lo tanto se ejecutara´"grabar_clave". Luego ya no valdrá 255 y se ejecutará "Bienvenido".  Tambien gracias por el dato de darle una pausa de 10ms después del WRITE. Saludos.


----------



## papirrin (Jul 24, 2015)

Ya te comente que a la eeprom se le asigna un valor "por defecto" con la instruccion DATA busca en la ayuda del pbp como se usa


----------



## PANC (Ago 17, 2015)

como es el codigo de interrupcion por timer en el pic 18f4550 ya vengo buscando horas en internet pero no hay mucho material del tema sino que hay mucho info de interrupcion externa


----------



## D@rkbytes (Ago 17, 2015)

PANC dijo:


> ¿Cómo es el código de interrupción por timer en el PIC18F4550?


¿De cuál timer? El PIC18F4550 tiene 4 timers, 1 de 8 bits y 3 de 16 bits.
El código también depende de lo que quieras hacer.


----------



## torres.electronico (Ago 18, 2015)

D@rkbytes dijo:


> ¿De cuál timer? El PIC18F4550 tiene 4 timers, 1 de 8 bits y 3 de 16 bits.
> El código también depende de lo que quieras hacer.



 Interesante. Cómo se nota que no toqué la hoja de datos.
Ahora implemento el buscador de la página para ver si encuentro más información del 18F4550.
Estoy dejando de lado los 16F876 y 16F877 para adentrarme a esta nueva familia con USB, ya que me di cuenta que varios fuses que usaba anteriormente, no me funcionan con el 18F2550/4550


----------



## D@rkbytes (Ago 18, 2015)

torres.electronico dijo:


> Estoy dejando de lado los 16F876 y 16F877 para adentrarme a esta nueva familia con USB, ya que me di cuenta que varios fuses que usaba anteriormente, no me funcionan con el 18F2550/4550


Así es. Los fuses de la palabra de configuración para los PIC18F2550/4550, son diferentes a los PIC16.
Sobre todo por la configuración del prescaler, aunque algunos PIC de nueva generación como los PIC12F18XX y PIC16F18XX, también lo tienen.
No para el uso del módulo USB con oscilador a cristal, sino para elevar la frecuencia del oscilador interno.

Otra cosa a tener en cuenta, es que usan dos líneas o más para la palabra de configuración.


----------



## torres.electronico (Ago 19, 2015)

si, tenes razon... practicamente estoy re-arrancando de cero por que son similares, pero  iguales....
lo poco que hice, me base en fuses de ejemplo y no preste atencion... vamos a ver si me pongo al dia relativamente rapido, por que tengo varias cositas para hacer y me esta gustando bastante este micro. Saludos y veremos con que dolor de cabezo me vuelvo


----------



## alex candelo q (Ago 29, 2015)

Hola, saludos
hace unos meses atras D@rkbytes me ayudo con un contador ascendente, descendente,de 1 a 6 y viceversa, a partir de ahi logre hacerle unas pequeñas modificaciones a mi gusto, lo que no he podido lograr es hacer que muestre un 0 si le pongo un 0 en el pin RA2 del pic 16f84A independientemente del numero en que este la cuenta, no logro dar la instruccion correcta, pido el favor alguien me ayude con esto y disculpen por haber solicitado ayuda en este tema ya que asm desde cero hace 6 meses nadie escribe, adjunto archivos el .bas que he manipulado y el original sin modificacion, Gracias.


----------



## D@rkbytes (Ago 29, 2015)

alex candelo q dijo:


> Lo que no he podido lograr, es hacer  que muestre un 0 si le pongo un 0 en el pin RA2 del PIC16F84A  independientemente del número en que esté la cuenta, no logro dar la instrucción correcta.


No funciona porque la sentencia la estás colocando al inicio y no dentro del bucle.
Eso hará que sólo sea leída cuando se inicia el programa y no constantemente.

Un cambio para eso, sería así:

```
Digito Var Byte

Inicio:
    TRISB = $80
    PORTB = 6
    Clear
        
MainLoop:

    IF PORTA.2 = 0 then
        PORTB = $3F
    EndIf 
      
    If PORTA.1 = 1 Then
        Digito = Digito + 1
        If Digito > 6 Then
            Digito = 6
        Endif
        GoSub BCD7Segs
        While PORTA.1 = 1: Wend
    EndIf

    If PORTA.0 = 1 Then
        If Digito = 0 Then
            Digito = 0
        Endif
        Digito = Digito - 1
        GoSub BCD7Segs
        While PORTA.0 = 1: Wend
    EndIf
    
    Goto MainLoop
    
BCD7Segs:
    LookUp Digito,[6,$5B,$4F,$66,$6D,$7D], PORTB
    Return

     End
```



alex candelo q dijo:


> Disculpen por haber solicitado ayuda en este tema ya que asm desde cero  hace 6 meses nadie escribe.


Este es el tema correcto porque los archivos que adjuntas están escritos en PIC Basic Pro.
No están escritos en ensamblador y tampoco con Proton IDE como mencionas, por el archivo "asm proton ide.txt"

Ahora hay que aclarar algo importante.
El código que expuse hace lo que quieres, pero retiene el conteo.
Si se presionan los botones para incrementar o decrementar, el conteo continuará  desde donde se quedó.

Si al mostrar un 0 en el display deseas que el conteo también sea 0 nuevamente, el código deberá ser diferente.

Con respecto a los temas sin actividad:
Si puedes preguntar en temas que tengan más de 6 meses sin actividad.
Lo  que no debes hacer, es responder a consultas que ya fueron tratadas en su tiempo o escribir mensajes con contenido irrelevante que no  aporten al tema.


----------



## alex candelo q (Sep 1, 2015)

Gracias, D@rkbytes, me guie con el codigo que envio, logre acomodarlo con un poco de trabajo, y ya hace lo que quiero que haga, contar del 1 al 6 y viceversa y al recibir un pulso negativo en RA2 colocar un cero sin tener en cuenta el numero mostrado y vuelve a empezar, de todas maneras se puede aumentar del 0 al 9, aqui lo pongo de pronto a alguien le interese y le sirva para aplicarlo en algun proyecto, Saludos.


----------



## torres.electronico (Sep 12, 2015)

Hola, no hace mucho me encontre una alarma tirada en el cesto de la basura de un amigo, asi que no dude en tomarla y ahora estoy en fase de recicle.
Esta alarma es un sistema que permite tener sensores alambrico e inalambricos; Como no tiene la posibilidad de conectar teclado, la hace practicamente obsoleta para recuperar y o re-programar, por lo tanto, se me ocurrio adicionar unproyecto que tengo de backup celular y hacer nuevamente que esta alarma funcione nuevamente; O sea, voy a implementar el circuito, pero con otra logica, y adicionando otras funciones mas. 





pasando en limpio el circuito, simplificamos lo que nos interesa y tenemos lo siguiente:



La idea de mi re-diseño, es sumar un backup celular con un motorolla C115; y la etapa de control de salidas y entradas, reciclar la vieja tarjeta... Acá un ejemplo de mi proyecto de backup celular con Motorolla c115:






Lista de comandos AT: https://en.wikipedia.org/wiki/Motorola_phone_AT_commands

No es nada del otro mundo, pero cito este tema acá para compartir algunas partes de mi programa que se, que de seguro a mas de uno le puede servir para sus proyectos....
En esta 1era beta, voy a implementar un 16F877A, pero  futuro vere si implemento un 18F4550 asi programo por software externo la lista blanca de numeros de telefonos, mensajes pre-grabados, etc



Aca un estracto de como mandar un mensaje SMS con el motorola c115 


```
NUM0 var byte
NUM0 = "1"   
;***numero de usuario1***
NUMA1 var byte
NUMB1 var byte
NUMC1 var byte
NUMD1 var byte
NUME1 var byte
NUMF1 var byte
NUMG1 var byte
NUMH1 var byte

;***numero de usuario2***
NUMA2 var byte
NUMB2 var byte
NUMC2 var byte
NUMD2 var byte
NUME2 var byte
NUMF2 var byte
NUMG2 var byte
NUMH2 var byte

.......

SEROUT2 portc.6,84,["AT",13]
PAUSE 500
serout2 portc.6,84,["AT+CMPS=",34,"SM",34,44,34,"SM",34,44,34,"SM",34,13]
pause 2000
serout2 portc.6,84,["AT+CMPS=",34,"ME",34,44,34,"ME",34,44,34,"ME",34,13]
PAUSE 2000
serout2 portc.6,84,["AT+CMGF=1",13] ; pasar modem gsm a modo texto
pause 500
serout2 portc.6,84,["AT+CMGS=",34,DEC NUM0,DEC NUMA1,DEC NUMB1,DEC NUMC1,DEC NUMD1,DEC NUME1,DEC NUMF1,DEC NUMG1,DEC NUMH1,34,13]
PAUSE 300
SEROUT2 portc.6,84,["DISPARO ALARMA",26] ; enviar texto
pause 200
serout2 portc.6,84,["AT+CMGS=",34,dec NUM0,dec NUMA1,dec NUMB1,dec NUMC1,dec NUMD1,dec NUME1,dec NUMF1,dec NUMG1,dec NUMH1,34,13]
pause 300
SEROUT2 portc.6,84,["DISPARO ALARMA",26]; enviar
PAUSE 5000
SEROUT2 portc.6,84,["AT",13]
PAUSE 1000
serout2 portc.6,84,["AT+CMPS=",34,"SM",34,44,34,"SM",34,44,34,"SM",34,13]
pause 2000
serout2 portc.6,84,["AT+CMPS=",34,"ME",34,44,34,"ME",34,44,34,"ME",34,13]
PAUSE 2000
serout2 portc.6,84,["AT+CMGF=1",13] ; pasar modem gsm a modo texto
pause 500
serout2 portc.6,84,["AT+CMGS=",34,dec NUM0,dec NUMA2,dec NUMB2,dec NUMC2,dec NUMD2,dec NUME2,dec NUMF2,dec NUMG2,dec NUMH2,34,13]
PAUSE 300
SEROUT2 portc.6,84,["DISPARO ALARMA",26]; texto a enviar 
pause 200
serout2 portc.6,84,["AT+CMGS=",34,dec NUM0,dec NUMA2,dec NUMB2,dec NUMC2,dec NUMD2,dec NUME2,dec NUMF2,dec NUMG2,dec NUMH2,34,13] ; enviar SMS
pause 300
SEROUT2 portc.6,84,["DISPARO ALARMA",26]; enviar
PAUSE 300
```

Ahora voy a pulir lo que tengo hasta ahora y sacarle un poco mas de brillo; Ni bien ueda terminar aunque sea la 1er parte, voy a subir para compartir el resto... estoy trabado en como sumar controles RF y o sensores RF en la memoria para adicionar o borrar dispositivos inalambricos... En fin, esto es solo el inicio


----------



## torres.electronico (Sep 14, 2015)

para los que me preguntaron como es la parte receptora, 1ero que nada les pido que no me pregunten porprivado asi toda la info queda aca y sirve para todos... 2do, enmodo respuesta, la etapa receptora es 98% siilar a la que esta aca con el lm358
https://www.forosdeelectronica.com/f22/esquema-pcb-modulo-433-mhz-comercial-99526/
Bueno... ya tengo algo funcionando; en un rato si me hago de tiempo libre con el trabajo, me voy a poner a soldar cables y armar la placa del pic con la alarma vieja...
la idea seria que quede algo asi:






aca unas fotos de los avances 

placa ya sin el micro original...


soldando los 1eros conductores...


Al terminar, le di un refuerzon con la pistola de plastico para evitar movimientos que me desuelden los conductores...


Tenia una placa generica mia de 40 pines que se adapta perfecto para el proyecto, sai que me puse a perforarla... 


vista del gabinete con el trafo, la bateria y el hardware antiguo




idea de donde va a quedar la otra placa... y tengo que perforar la chapa del frnte para poner el display


esto solo es el 10% del trabajo... despues tengo que hacer el teclado RF 
Es indispensable antes de armar el sistema, o sea, activar la alarma, saber si todos los sensores estan funcionando o por lo menos, si estos no estan activados (ventanas o puertas abiertas, etc); Es por eso que le sume un par de lineas mas para chequear todas las zonas cuando recibe la orden de activar...les muestro unas lineas de como lo hice


```
BACKUP:
SENAL=0
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"  MODO ALARMA   "
LCDOUT $FE,$C0,"  DESACTIVADA   "
BACKUP2:
SERIN PORTB.1,T2400,50,BACKUP2,SENAL
if SENAL="A" then 
    HIGH BIP
    PAUSE 900
    LOW BIP
    GOTO CHECK
   ENDIF
GOTO BACKUP2

;***************************
;===========================
;***************************
CHECK:
if zona1 = 0 then Z1=1
if zona2 = 0 then Z2=2
if zona3 = 0 then Z3=3
if zona4 = 0 then Z4=4
if zona5 = 0 then Z5=5
if zona6 = 0 then Z6=6
IF PORTB.0=0 THEN Z7=7

if Z1 > 0 THEN ERROR
if Z2 > 0 THEN ERROR
if Z3 > 0 THEN ERROR
if Z4 > 0 THEN ERROR
if Z5 > 0 THEN ERROR
if Z6 > 0 THEN ERROR
IF Z7 > 0 THEN ERROR
GOTO INICIO   ; sub programa donde monitoreamos las zonas

ERROR:
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"ERROR EN ZONAS: "
LCDOUT $FE,$C0,DEC Z1," ",DEC Z2," ",DEC Z3," ",DEC Z4," ",DEC Z5," ",DEC Z6," ",DEC Z7
PAUSE 2000
Z1=0
Z2=0
Z3=0
Z4=0
Z5=0
Z6=0
Z7=0
GOTO BACKUP
```
mañana despues de trabajar, seguire otro buen rato...

Saludos


pd: Ricardo, no me dejo editar e mensaje anterior para poner todo junto... disculpas


----------



## torres.electronico (Sep 17, 2015)

ya casi casi lo tengo... ya hice unas pruebas y corregi algunas cositas...  Como sabia que despues tenia que modificar casi todo para poder configurarlo por software, migre todo al 18F4550 y despues de hacer todo eso, no me arrancaba... le di tantas vueltas que casi casi lo tiro por la ventana (No me reconocia la PC el hardware)...
Se me ocurrio medir el capacitor de VUSB y estaba dañado  sin este capacitor, o con un capacitor de un valor fuera de los 220nF/470nF, no funciona 







Ni bien termine de emprolijar todo y armar el conector RS232 para la comunicacion con el celular C115, armo video y subo las lineas de programacion mas relevantes para que puedan armar sus ideas.
Saludos


PD: El software en Vb me esta volviendo loco, pero vamos a ver si lo puedo sacar a flote bien, sin ningun error 



Bien.... 1er problema surgente.. cuando estaba reformando todo, se me ocurrio ver la manera de reciclar unos controles remotos que tenia tirado... como no sabia si eran de 2400-4800 o 9600 baudios, para ver, se me ocurrio hacer esto:


```
INISISTEMA:
GOSUB PRUEBASENAL
IF SENAL = 0 THEN 
  LCDOUT $FE,1
   LCDOUT $FE,$80,"     NO HAY     "
   LCDOUT $FE,$C0," SENAL ENTRANTE "
   
GOTO INISISTEMA
ENDIF
IF SENAL > 0 THEN BACKUP
IF PORTA.1 = 0 THEN BACKUP
GOTO INISISTEMA


PRUEBASENAL:
LCDOUT $FE,1
LCDOUT $FE,$80," PROBANDO SENAL "
FOR X = 1 TO 5
high bip
pause 1100
low bip
GOSUB TEST1
high bip
pause 1100
low bip
GOSUB TEST2
NEXT
goto inisistema

TEST1:
LCDOUT $FE,$C0,"     EN 2400    "
SERIN PORTB.1,T2400,2000,TEST1A,rfprog1
RETURN

TEST2:
LCDOUT $FE,$C0,"     EN 9600    "
SERIN PORTB.1,T9600,2000,TEST2A,rfprog2
RETURN

TEST1A:
RFprog1= SENAL
GOTO INISISTEMA

TEST2A:
RFprog2= SENAL
GOTO INISISTEMA
```

Pero de la imaginacion al hecho, me parece que algo confundi o mal interprete... No logre que capture ni ruido 
mi idea era que capture algo...aunque sea unos bits... sera que tendre que trabajarlo con una variable word? voy a probar otras cosas pero con otro micro para ver si puedo leer los bits (si no mal recuerdo, la gran mayoria trabaja con 10 bits) aunque sea de los controles remotos y guardarlos... Si alguien tiene una idea de como puedo encarar esta parte...orientacion... cualquier cosa es bienvenida; Slaudos


----------



## papirrin (Sep 18, 2015)

Les tengo una pregunta...

estoy trabajando con la libreria del punto flotante y me surgio una duda...

si yo quiero hacer una multiplicacion en enteros digamos 100*14, pues no es problema pongo:


```
aint = 100
Gosub itofa			' Convert aint to float

bint = 14
Gosub itofb			' Convert bint to float

Gosub fpmul			
Gosub ftoia	
Lcdout  $fe,1, "100*14="
If  (aint.15) Then Lcdout "-"	
lcdout dec abs aint
```

¿pero como en nombre de zeus se le hace para multiplicar un entero con un flotante como por ejemplo 100*2.5 ?


----------



## torres.electronico (Sep 18, 2015)

Ya le diste una leida a las libretias de darrel tailor ? (  mepa que se escribia asi)
Creo que guarde en algun momento algo similar a lo que planteas...dejame ver si encuentro en ie disco esta..no importa si esta en asm?


----------



## papirrin (Sep 18, 2015)

> Ya le diste una leida a las libretias de darrel tailor ?



Nop, no las he leido...



> Creo que guarde en algun momento algo similar a lo que planteas...dejame ver si encuentro en ie disco esta..no importa si esta en asm?


quisiera hacerlo en basic utilizando la libreria del PBP, y lo que quiero evitar es inmiscuirme en ver como esta echa la libreria que hasta donde se utiliza la libreria propia del MPASM (math16).

tambien quiero evitar el hacer operaciones antes, como por ejemplo dividir o sea 5/100 y despues sumar al entero 2 y bla, bla.. quisiera poner directamente el flotante en alguna variable de las que utiliza la propia libreria y despues efectuar la multiplicacion que supongo se podria.


----------



## torres.electronico (Sep 18, 2015)

Lindo laburito... si no queres usar asm y o cuentas, no digo que no puedas por que vi que lo que te propones lo sacas adelante casi siempre, pero vas a tener bastante laburo


----------



## papirrin (Sep 18, 2015)

> Lindo laburito... si no queres usar asm y o cuentas,


Sip,  está laborioso en cuanto a investigar por donde meterla, pero si se  puede porque en los ejemplos de la librería utilizan un resultado que  arroja flotante y lo multiplican por una cantidad y si da.
Lo que no  logro decifrar, es por dónde regresa y cómo ese valor.

Hago la pregunta por si alguien ya lo resolvió, y mientras tanto le sigo  indagando.
Si encuentro la forma la comparto pues no hay mucha  información al respecto o no la he encontrado. XD

---------- Actualizado después de 2 horas ----------


Me encontré esto:


> It should be ...
> ((high_%_span - low_%_span ) / (high_count_span - low_count_span)) * (Measured - low_count_span)
> 
> ((100000 - 0) / (46461 - 22600)) * (Measured - 22600)
> ...


Creo que por ahí va.

¿Pero de dónde sale que?:
*In floating point format, 4.190939189 = 0x81061C2D*

Bueno, me respondo. XD
Sale del protocolo IEEE 754

http://www.h-schmidt.net/FloatConverter/IEEE754.html

Ahora a estudiar cómo se hace eso. XD

Edito:

Si funciona el código, pero no descifro como integra el número.



Lo logreeeeee!!!!!!!!!! 

para sacar ese numero esta en la nota de microchip AN575, esta re-facil pero si no nos dicen pues ¿como? XD...

Aunque vi un rumor de que esa libreria tiene un BUG pero no estoy seguro, porque el que lo menciono parecia que no tenia mucha idea, pero bueno... empezare a jugar con esa libreria para ver hasta donde llega.


----------



## torres.electronico (Sep 30, 2015)

Les dejo un simple ejemplo de un Rele Temporizado (hasta 24Hs)- Rele Biestable (hasta 60 minutos) con un PIC 16F628... Esta configurado para trabajar en RC y es todo por software (sin TMR), por lo tanto los retardos no son perfectos....


```
'****************************************************************
;************* CONFIGURACION DE VARIABLES GENERALES *************
;****************************************************************

Define osc 4    ; definimos el oscilador en 4 mhz

CMCON = 7               ; PUERTO A TODO DIGITAL
TRISA = %11111111       ; PUERTO A TODO COMO ENTRADA
TRISB = %00000000       ; PUERTO B TODO COMO SALIDA

Define    LCD_DREG    PORTB    ;PUERTO B.O.1.2.3 DEL PIC PARA CONTROL DEL LCD
Define    LCD_DBIT    0
Define    LCD_RSREG    PORTB    ; PIN RS CONECTADO EN PORTB5
Define    LCD_RSBIT    5
Define    LCD_EREG    PORTB    ; PIN E CONECTADO EN PORTB4
Define    LCD_EBIT    4
DEFINE LCD_BITS      4             ;LCD CONFIGURADO EN 4 BITS
DEFINE LCD_LINES  2          ;LCD DE 2 LINEAS

START_button var PORTA.0   ; boton inicio
STOP_button var PORTA.1    ; boton parada
CLEAR_button var PORTA.2   ; boton borrar
MAS_button var PORTA.3     ; boton mas
MENOS_button var PORTA.4   ; boton menos
DISP_button var PORTA.5    ; entrada disparo auxiliar
RELAY var PORTB.6          ; salida para control del relay
BEEP VAR PORTB.7           ; salida para el control del buzzer

bandera var byte           ;variable auxiliar 
Ticks VAR byte             ;variable auxiliar para los for-next
setHOUR VAR BYTE           ; variable set HORAS programadas
setMINUTE VAR BYTE         ; variable set minutos programadas
Hour VAR byte              ; variable HORAS cronometro
Minute VAR byte            ; variable Minutos cronometro
Second VAR byte            ; variable Segundos cronometro
DelayHon VAR byte            ; uso futuro
DelayMon var byte            ; uso futuro
DelaySon var byte
DelayHoff VAR byte            ; uso futuro
DelayMoff var byte            ; uso futuro
DelaySoff var byte            ; uso futuro
SETHOUR=0                  ; valor inicial de la variable 
SETMINUTE=0                ; valor inicial de la variable

;*****************************************************************
;******************** INICIO DEL PROGRAMA ************************
;*****************************************************************
Inicio:
HOUR = 0                ; valor inicial de la variable
MINUTE=0                ; valor inicial de la variable
SECOND=0                ; valor inicial de la variable
LCDOUT $FE, 1           ; limpiamos el lcd
HIGH BEEP               ; encender buzzer
PAUSE 1000              ; pausa 1 segundo
LOW BEEP                ; apagar buzzer
pause 50

MENU:
LCDOUT $fe,2,"RTempo   (START)"  
LCDOUT $fe,$c0,"RBiestable(STOP)"  
 if start_button = 0 then 
 LCDOUT $FE, 1
 goto menu2
 endif
 IF stop_button = 0 then CONFIG2
goto MENU

menu2:
LCDOUT $fe,2,"Ini Tempo(-)"  
LCDOUT $fe,$c0,"Prog Tempo(+)"  
 if mas_button = 0 then TEMPO        ;si presionamos boton "MAS",ir a TEMPO 
 IF MENOS_BUTTON = 0 THEN INI_TEMPO  ;si presionamos boton "MENOS",ir a INI_TEMPO
 IF stop_button = 0 then 
 LCDOUT $FE, 1
 goto menu 
 endif
goto menu2
;**************************************************************************
;************* INICIO SUBPROGRAMA PARA CONFIGURAR TIEMPO ******************
;**************************************************************************

TEMPO:
HIGH BEEP
PAUSE 1000
LOW BEEP
PAUSE 800
HIGH BEEP
PAUSE 1000
LCDOUT $FE, 1
LOW BEEP 
pause 50
;**************************************************************************
;**************** sub programa para configurar el tiempo ******************
;**************************************************************************
CONFIG:
  LCDOUT $fe,2,"INICIO   (START)"
  LCDOUT $fe,$C0,DEC2 SETHour,":",DEC2 SETMinute,":00"

IF MAS_button = 0 THEN
  PAUSE 500 
  SETMinute = SETMinute + 1
IF SETMinute = 60 THEN
  SETMinute = 0
  SETHour = SETHour + 1
IF Hour => 24 THEN
 Hour = 24
  ENDIF
   ENDIF
    ENDIF
     

IF CLEAR_button = 0 THEN
  SETHour = 0
  SETMinute = 0
 ENDIF

IF START_button = 0 THEN 
  LCDOUT $FE, 1
  GOTO INI_TEMPO
   ENDIF

GOTO CONFIG

;*****************************************************
;************* PROGRAMA DEL TEMPORIZADOR**************
;*****************************************************

INI_TEMPO:

IF SETHOUR = HOUR AND SETMINUTE = MINUTE THEN

IF STOP_button = 0 THEN GOSUB PARADA
 LCDOUT $FE, 1
  LCDOUT $fe,2,"TIEMPO PROGRAMA"
  LCDOUT $fe,$C0,"    TERMINADO  "
  high beep
  LOW RELAY
  PAUSE 2000
  low beep
  GOTO INICIO
 ENDIF

HIGH RELAY
 
LCDOUT $fe,2,"Set:",DEC2 SETHour,":",DEC2 SETMinute,":00"
LCDOUT $fe,$C0,"Tiempo:",DEC2 Hour,":",DEC2 Minute,":",DEC2 Second

PAUSE 450

GOSUB CONTADOR

IF STOP_button = 0 THEN GOSUB PARADA

GOTO INI_TEMPO

;**************************************************************************
;********************** sub programa para la pausa ************************
;**************************************************************************

PARADA:
LOW RELAY
TICKS=0
LCDOUT $FE, 1
FOR TICKS = 1 TO 4 
LCDOUT $fe,2,"Set:",DEC2 SETHour,":",DEC2 SETMinute,":00"
LCDOUT $fe,$C0,"Tiempo:",DEC2 Hour,":",DEC2 Minute,":",DEC2 Second
PAUSE 250
IF START_button = 0 THEN 
LCDOUT $FE, 1
HIGH RELAY
RETURN
ENDIF
IF CLEAR_button = 0 THEN inicio
NEXT TICKS
TICKS=0
LCDOUT $FE, 1
FOR TICKS = 1 TO 4 
 LCDOUT $FE, 1
 LCDOUT $fe,2,"TIEMPO DETENIDO"
LCDOUT $fe,$C0,"SEGUIR (START)"
PAUSE 250
IF START_button = 0 THEN 
LCDOUT $FE, 1
HIGH RELAY
RETURN
ENDIF
IF CLEAR_button = 0 THEN inicio
NEXT TICKS
GOTO PARADA

;**************************************************************************
;****************** sub programa para el cronometro ***********************
;**************************************************************************

CONTADOR:
  Second = Second + 1  ; incrementar 1 en variable segundo
 IF Second = 60 THEN   ; consigna: si variable segundos es = a 60, entonces
  Second = 0           ; ponemos variable segundos en 0 
  Minute = Minute + 1  ; incrementamos 1 en variable minuto
 IF Minute = 60 THEN   ; consigna dentro de consigna, si minuto es = 60 entonces
  Minute = 0           ; ponemos variable minutos en 0
  Hour = Hour + 1      ; incrementamos 1 en variable hora
 IF Hour = 24 THEN     ; consigna dentro de consigna, si hora = 24 entonces
  Hour = 24            ; ponemos como limite maximo, hora = 24... modificar este
                       ; valor si se quiere mas horas
   ENDIF               ; cerramos 1era consigna
    ENDIF              ; cerramos 2da consigna
     ENDIF             ; cerramos 3er consigna
 PAUSE 500             ; pausa 1/2 segundo
RETURN                 ; volver

;*****************************************************
;************* PROGRAMA RELAY BIESTABLE **************
;*****************************************************
 CONFIG2:
LCDOUT $FE, 1 

 CONFIG2a:
  LCDOUT $fe,2,"RELAY tiempo ON"
  LCDOUT $fe,$C0,"Min:",DEC2 delaymon," Seg:",dec2 delayson

IF MAS_button = 0 THEN
  PAUSE 500 
 delayson = delayson + 1  ; incrementar 1 en variable segundo
 IF delayson = 60 THEN   ; consigna: si variable segundos es = a 60, entonces
  delayson = 0  
  delaymon = delaymon + 1
IF delaymon = 60 THEN
  delaymon = 0
  delayhon = delayhon + 1
IF delayhon => 24 THEN
 delayhon = 24
  ENDIF
   ENDIF
    ENDIF
     endif
     
IF CLEAR_button = 0 THEN
  delayhon = 0
  delaymon = 0
  delayson = 0
 ENDIF

IF START_button = 0 THEN 
  high beep
  pause 1000
  low beep
  pause 50
  LCDOUT $FE, 1
  GOTO CONFIG3
   ENDIF

GOTO CONFIG2a

CONFIG3:
  LCDOUT $fe,2,"RELAY tiempo OFF"
  LCDOUT $fe,$C0,"Min:",DEC2 delaymoff," Seg:",dec2 delaysoff

IF MAS_button = 0 THEN
  PAUSE 500
delaysoff = delaysoff + 1  ; incrementar 1 en variable segundo
 IF delaysoff = 60 THEN   ; consigna: si variable segundos es = a 60, entonces
  delaysoff = 0     
  delaymoff = delaymoff + 1
IF delaymoff = 60 THEN
  delaymoff = 0
  delayhoff = delayhoff + 1
IF delayhoff => 24 THEN
 delayhoff = 24
  ENDIF
   ENDIF
    ENDIF
     endif

IF CLEAR_button = 0 THEN
  delayhoff = 0
  delaymoff = 0
  delaysoff = 0
 ENDIF

IF START_button = 0 THEN 
  high beep
  pause 1000
  low beep
  pause 50
  LCDOUT $FE, 1
  GOTO INI_RELAY
   ENDIF

GOTO CONFIG3

INI_RELAY:
  LCDOUT $fe,2,"ESPERANDO"
  LCDOUT $fe,$C0,"INICIO"
IF START_button = 0 THEN INI_RELAY2
IF STOP_button = 0 THEN INICIO
GOTO INI_RELAY
 
  
INI_RELAY2
hour=0
minute=0
second=0
LCDOUT $FE, 1
gosub activar_relay
hour=0
minute=0
second=0
LCDOUT $FE, 1
gosub desactivar_relay

IF STOP_button = 0 THEN GOSUB INICIO
 
GOTO INI_RELAY2

activar_relay:
IF STOP_button = 0 THEN GOSUB INICIO
bandera=1
LCDOUT $fe,2,"SI:",DEC2 delaymon,":",dec2 delayson,"NO:",DEC2 delaymoff,":",DEC2 delaysoff
LCDOUT $fe,$C0,"T:",DEC2 Minute,":",DEC2 Second," R:",dec bandera
HIGH RELAY
pause 500
gosub contador
IF delaymon = MINUTE and delayson = second THEN return
goto activar_relay

desactivar_relay:
IF STOP_button = 0 THEN GOSUB INICIO
bandera=0 
LCDOUT $fe,2,"SI:",DEC2 delaymon,":",dec2 delayson,"NO:",DEC2 delaymoff,":",DEC2 delaysoff
LCDOUT $fe,$C0,"T:",DEC2 Minute,":",DEC2 Second," R:",dec bandera
low relay
pause 500
GOSUB CONTADOR
IF delaymoff = MINUTE and delaysoff = second THEN return
goto desactivar_relay
PAUSE 450
IF STOP_button = 0 THEN GOSUB PARADA
goto INI_relay

;*************************************************************************
END                    ; Fin del programa
;*************************************************************************
```
Saludos


----------



## NECTOR (Oct 8, 2015)

Hola tengo un problema con un lcd 4x16 .Mi objetivo es hacer 4 cronómetros independientes en las 4 lineas y dependiendo de la entrada (RA0, RA1,RA2,RA3) con un interruptor o pulsador , que se activen o se pause el tiempo.
Primero he hecho un solo cronometro y me funciona (adjunto el programa y el esquema para la simulación) , el problema es al intentar que sean 4 cronómetros el tiempo va super despacio o no cuentan .
Si alguien me pudiera ayudar , os dejo tambien el codigo y el circuito para simular.


----------



## D@rkbytes (Oct 8, 2015)

NECTOR dijo:


> Primero he hecho un solo cronómetro y me funciona.
> El problema es al intentar que sean 4 cronómetros, el tiempo va súper despacio o no cuentan.


El programa está muy mal. Para eso necesitas usar un timer. (P.E. El Timer 1 y algunas banderas "Flags")
Las configuraciones también están mal:
El PIC18F2550 en el puerto E, tan sólo cuenta con el bit 3, (MCLR) y no es necesario que se configure como entrada porque por defecto ese pin es únicamente de entrada.
Y si escribes 8 bits en el registro TRISE, estarás escribiendo en locaciones inexistentes.

También es importante que uses la palabra de configuración correcta, porque en este tipo de PIC que puede ser llevado hasta 48 MHz, si no se usa la configuración adecuada, no funcionará o lo hará mal.
Sobre éste tema puedes usar el buscador porque ya se ha tratado.

La configuración del registro ADCON1 para hacer los puertos digitales también se ha tratado en el Foro, pero puedes recurrir a la hoja de datos y ver cuál es la configuración correcta.

En fin, ese programa es para volverlo a escribir desde 0.


----------



## NECTOR (Oct 9, 2015)

Buenos días. D@rkbytes, he leído la respuesta que has dejado sobre mi caso.
 Intento hacer  4 cronómetros en una pantalla y voy a rehacer el código desde cero.
Estoy iniciándome en este mundo, así que hay partes que me cuesta mas entenderlas.

He montado uno físico con una lcd y me funciona, el problema es que no sé usar los timers, como me recomiendas.
Lo he hecho con el código que te pasé y el tiempo  no va sincronizado, tarda 10 segundos más cada minuto.

He leído por el foro algún ejemplo, éste es el enlace donde lo vi:
https://www.forosdeelectronica.com/f26/cronometro-picbasic-18f2550-128749/#post1005262

¿Podrías compartir el ejemplo, para ver si consigo hacer el de 4 tiempos?


----------



## D@rkbytes (Oct 9, 2015)

NECTOR dijo:


> He leído por el foro algún ejemplo, éste es el enlace donde lo vi:
> https://www.forosdeelectronica.com/f26/cronometro-picbasic-18f2550-128749/#post1005262
> 
> ¿Podrías compartir el ejemplo, para ver si consigo hacer el de 4 tiempos?


Claro que si.
Aquí está el ejemplo de cronómetro usando el Timer 1 (PIC18F2550)

El programa está escrito en MicroCode Studio v5.0.0.5 y PBPX v3.0.8.1
También se puede compilar con versiones anteriores pero se debe omitir la palabra de configuración y usar el procedimiento que se mencionó en éste enlace: https://www.forosdeelectronica.com/f26/cronometro-picbasic-18f2550-128749/#post1005262

PD:
También puedes ver otro ejemplo: Cronómetro con Timer 1 y displays de 7 segmentos

Suerte.


----------



## NECTOR (Oct 13, 2015)

Muchas gracias, D@rkbytes.
El programa me ha sido de gran ayuda, aunque  era más complicado de lo que esperaba.
También lo he montado en un protoboard y va perfecto, sin ningún tipo de retardo.

¿Para hacer que el cronometro sólo cuente cuando esté el pulsador presionado, debería quitar las lineas del contador,o escribirlas de manera que siempre se esté incrementando y cuando deje de presionar pare?
Programa:

```
Button pulsador,0,255,10,B0,0,Display  ; Si se presiona el pulsador...
        While pulsador = 0          ; Mientras esté pulsado...
            contador = contador + 1 ; Incrementar "contador"
            Pause 1                 ; Retardo de 1ms.
            
            If contador = 3000 Then ; Si "contador" llegó a 3000 (3 segundos)...         
                T1CON = 0           ; Deshabilitar Timer1
                horas = 0           ; Limpiar "horas"
                minutos = 0         ; Limpiar "minutos"
                segundos = 0        ; Limpiar "segundos"
                milisegundos = 0    ; Limpiar "milisegundos"
                flag = 1            ; Mantener "flag" en 1 (Para que el soltar el pulsador no avance el conteo)
                LCDOut $FE,$C3,"00:00:00.00"    ; Poner en ceros la pantalla.
            EndIf
        Wend
```
Un saludo.


----------



## D@rkbytes (Oct 13, 2015)

Esa rutina que muestras sobre el pulsador, tiene tres funciones.
Cada vez que se presiona cambia el estado de una bandera (Flag), y eso determina si el Timer 1 se enciende o se apaga.
Pero cuando el pulsador permanece presionado por más de 3 segundos, entonces se resetea el conteo y se apaga el Timer 1.

Si lo único que quieres es que el tiempo se muestre mientras se presiona el pulsador, entonces es más sencillo.
Por ejemplo:

```
While Pulsador = 0
    T1CON.0 = 1
Wend
T1CON.0 = 0
```
Y para reiniciar a 0, lo harás usando el reset (MCLR) del PIC.

También se puede cambiar el estado de una bandera que podrás usar dentro del servicio de interrupción.
El objetivo lo puedes realizar de otras formas porque es condicional.


----------



## NECTOR (Oct 14, 2015)

He sustituido las lineas que me has puesto por las otras ,y parece que funciona bien (el tiempo esta detenido y si presiono el pulsador empieza a contar si dejo de presionar el tiempo se para , todo el tiempo viendose en la lcd) , por lo menos en la simulación del isis. 

Te adjunto el código para que lo veas ,he modificado el que me pasaste. Al cambiarlo quite las banderas ,esto puede influir en que ahora no me haga un segundo justo ?

Si esta bien voy a pasar hacer que se vean dos cronometros , pero no se que estructura seguir ,se puede hacer con el Timer 1 o necesitaria mas Timer ya que este lo estoy usando en el primer cronometro.


----------



## D@rkbytes (Oct 14, 2015)

NECTOR dijo:


> Al cambiarlo quite las banderas.
> ¿Ésto puede influir en que ahora no me haga un segundo justo?


No, eso es algo que no logré solucionar con el PIC18F2550.
He revisado todos los registros sin encontrar nada extraño, pero posiblemente algo se me está pasando.
No pude encontrar la causa por la que va un poco más rápido el conteo. 
Con otros PIC's va muy exacto, pero con éste 18F2550 no sé qué esté pasando.



NECTOR dijo:


> Si está bien, voy a pasar a hacer que se vean dos cronómetros, pero no sé qué estructura seguir.
> ¿Se puede hacer con el Timer 1 o necesitaría más Timers?
> Ya que éste lo estoy usando en el primer cronómetro.


Para otros conteos puedes aumentar las variables y usar banderas, para que sólo se realice el conteo en cada una cuando el estado de su respectiva bandera sea verdadero.

Por ejemplo:

```
If crono_1 = 1 Then
    milisegundos_1 = milisegundos_1 + 1
    ; Incremento de las siguientes variables del cronómetro 1
EndIf

If crono_2 = 1 Then
    milisegundos_2 = milisegundos_2 + 1
    ; Incremento de las siguientes variables del cronómetro 2
EndIf

; Etc.
```
De esa forma usas un solo timer, pero ya no lo debes detener para que el desborde del Timer 1 sirva para incrementar todas las variables.


----------



## NECTOR (Oct 15, 2015)

He declarado las variables y cambiado esa parte que me escribiste  , pero no se como juntar la parte del programa que usa  el timer 1 y que desde ahi me vaya  a la parte 

If crono_1 = 1 Then
    milisegundos_1 = milisegundos_1 + 1
    ; Incremento de las siguientes variables del cronómetro 1
EndIf

Te adjunto el codigo para que me digas que hago mal.


----------



## D@rkbytes (Oct 15, 2015)

Para lograr el funcionamiento de esa forma con más de 1 cronómetro, se tienen que modificar algunas cosas.
Ya no se debe actuar como cuando es sólo un cronómetro, porque el Timer 1 siempre debe estar activo.

Adjunto una forma de hacerlo con dos cronómetros.
Dejé el uso de las instrucciones "Button" pero también se puede hacer uso de sentencias "IF"
El problema va a ser que resuelvas que el tiempo de cada cronómetro sólo funcione cuando esté en 1 o en 0 el pulsador correspondiente.
Te menciono éste detalle porque el uso de "While" detendrá el proceso de verificación de otros pulsadores.


----------



## NECTOR (Oct 19, 2015)

Creo que ya esta el programa acabado ,por ahora solo lo he simulado en el ordenador y funciona bien . 
Cuando lo monte veré si tiene algún tipo de desfase con el tiempo real .
Lo dejo aquí por si le ves algún tipo de mejoría que le pudiera hacer al código.


----------



## torres.electronico (Oct 22, 2015)

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)...


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  , 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:


```
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
;**********************************
;**********************************
```


----------



## torres.electronico (Oct 24, 2015)

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? 





```
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 

saludos


----------



## torres.electronico (Oct 30, 2015)

Bueno, acá les comparto un mini tutorial sobre manejo y control de los display graficos nokia 3310-5110
https://sites.google.com/a/educ.ar/eti/file-cabinet/ETI_CtrlGLCDnokia2.pdf?attredirects=0&d=1
pesa 13 megas, por eso no l subi al foro
saludos


----------



## mecatrodatos (Dic 13, 2015)

Buen aporte el tuyo


----------



## jamesoro (Dic 14, 2015)

torres.electronico dijo:


> Bueno, acá les comparto un mini tutorial sobre manejo y control de los display graficos nokia 3310-5110
> https://sites.google.com/a/educ.ar/eti/file-cabinet/ETI_CtrlGLCDnokia2.pdf?attredirects=0&d=1
> pesa 13 megas, por eso no l subi al foro
> saludos



gracias por compartir,


----------



## rrc46 (Dic 15, 2015)

Gracias. Excelente aporte.


----------



## roberttorres (Dic 16, 2015)

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.


----------



## willyfv (Dic 23, 2015)

roberttorres saludos, falta el circuito de proteus


----------



## roberttorres (Dic 23, 2015)

willyfv dijo:


> 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


----------



## roberttorres (Dic 24, 2015)

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


----------



## willyfv (Dic 24, 2015)

roberttorres

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

*L*o otro, es que al iniciar el circuito, el debería d*e* contar de una vez*.*


----------



## roberttorres (Dic 24, 2015)

willyfv dijo:


> roberttorres
> 
> *¿P*odrías explicar un poco el funcionamiento de cada pulsador y cómo debería trabajar*?*
> 
> *L*o otro, es que al iniciar el circuito, el debería d*e* 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.


----------



## DUOMECANICO (Dic 25, 2015)

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.


```
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.


----------



## Dario (Dic 31, 2015)

Hola amigos, tanto tiempo sin aparecer por aqui...  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...


----------



## DEPREDADORX1 (Ene 11, 2016)

Hola Dario, cómo va el proyecto, realmente lo que he visto está en C y con Arduino, mirando un poco en la web encontré un ejemplo en inglés donde comunican pc-celular, no sé que tan cerca esté de lo que te interesa, de cualquier forma te dejo el enlace a ver que tal.
http://www.extremenxt.com/vbpart1.htm


----------



## D@rkbytes (Ene 11, 2016)

Dario dijo:


> 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.


Dario dijo:


> 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.


----------



## Oliver97 (Ene 24, 2016)

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. 

Es con el PIC16F887

Si necesitan el archivo, lo subo.

```
'****************************************************************
'*  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
```


----------



## D@rkbytes (Ene 24, 2016)

Oliver97 dijo:


> 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.


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.

```
@ 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
```


----------



## Oliver97 (Ene 24, 2016)

D@kbytes, muchas gracias. Veré como logro seguir.
Como decía anteriormente, no sé mucho  de programación, pero gracias.


----------



## Oliver97 (Ene 25, 2016)

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.

```
'****************************************************************
'*  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
```


----------



## D@rkbytes (Ene 25, 2016)

OK. No es complicado realizar secuencias.

Mira esta otra forma de hacerlo:

```
@ 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.   

; Declaración de variables:
B0      Var Byte            ; Variable de 8 bits para propósito general.
Leds1   Var Byte[8]         ; Definir un arreglo de 8 campos
Leds2   Var Byte[8]         ; Definir un arreglo de 8 campos

Inicio:
    TRISA = 0               ; Puerto A como salidas
    TRISB = 0               ; Puerto B como salidas
    PORTA = 0               ; Puerto A en 0
    PORTB = 0               ; Puerto B en 0

    Leds1[1] = %10000000    ; Establecer un valor binario a los arreglos.
    Leds1[2] = %01000000
    Leds1[3] = %00100000
    Leds1[4] = %00010000
    Leds1[5] = %00001000
    Leds1[6] = %00000100
    Leds1[7] = %00000010
    Leds1[8] = %00000001

    Leds2[1] = %00000001
    Leds2[2] = %00000010
    Leds2[3] = %00000100
    Leds2[4] = %00001000
    Leds2[5] = %00010000
    Leds2[6] = %00100000
    Leds2[7] = %01000000
    Leds2[8] = %10000000


    Leds1 = 1
    Leds2 = 1

Programa:
    For B0 = 8 To 1 Step -1 ; Bucle de 8 ciclos (Descendente)
        PORTA = Leds1[B0]   ; Realizar el desplazamiento de bits del puerto A
        PORTB = Leds2[B0]   ; Realizar el desplazamiento de bits del puerto B
        Pause 100
    Next B0
    
    For B0 = 1 To 8         ; Bucle de 8 ciclos (Ascendente)
        PORTA = Leds1[B0]   ; Realizar el desplazamiento de bits del puerto A
        PORTB = Leds2[B0]   ; Realizar el desplazamiento de bits del puerto B
        Pause 100
    Next B0
    
    GoTo Programa           ; Repetir el proceso.
    
    End
```
Compila y ve qué sucede.


----------



## marvin villalobos (Ene 31, 2016)

Hola amigos de Foros de Electrónica. He construido una insoladora con fluorescentes UV y sus reactores.
El detalle es que temporiza dos tiempos distintos, es decir: tiempo lado a y tiempo lado b, y
los tiempos están grabados previamente en la memoria EEPROMdel PIC, que pueden ser configurados también a través de un menú a criterio del usuario.

Adjunto esquema en proteus isis y código fuente en PIC Basic Pro.

El código fuente quisiera que me lo revisen, porque está muy grande y parece que he dado muchas vueltas.

La verdad me funciona, pero no tan bien, porque a veces el tiempo se me cuelga.

Les agradezco de antemano.

Después de todo, puede ser un aporte al foro, pero antes que nada quisiera que me lo revisaran, 

Muchas gracias.


----------



## mikeekim (Ene 31, 2016)

Te dejo mi esquema de insoladora a 1 o 2 caras segun se desee con su hex, con ajuste de contraste del LCD desde el propio LCD sin tener que usar una resistencia variable, pruebalo a ver si te gusta mas, el pic es un 16f887 a 4mhz, en el primer encendido, el setup no detecta config y obliga a configurar contraste del LCD desde el propio menu del programa, despues pasa al menu de retardo, por defecto esta en 61us para que el tiempo de la insoladora sea lo mas parecido al tiempo real y 3o ajusta la velocidad del texto que se desplaza para paliar los efectos de la velocidad del refresco del LCD, todo eso se guarda en la eeprom del PIC y en el proximo inicio detecta que esta configurado y no vuelve a entrar al setup si no se pulsa a la vez intro y pausa y recuerda el tiempo de insolacion que se uso por ultima vez.
Lo unico que no te dejo en el esquema es como se configura el contraste del LCD en proteus desde el propio menu del LCD porque es algo que por ahora quiero mantener solo para mi insoladora.
Un saludo.
C52 ha de estar lo mas cerca posible de las patillas 31 y 32 del PIC.
Y la entrada desde la red electrica con esa fuente capacitiva esta calculada para tener 100ma a 220vAC a 50hz
Para tener 100ma con 120vac y 60hz se ha sustituir el condensador C2 de 1.5uf por uno de 2,2uf.
 o añadir en paralelo al condensador de 1.5uf otro de 680nf.

Sobre lo que te sucede que a veces el tiempo se para o se cuelga es por culpa del oscilador y ese condensador que yo añado a las patillas 31 y 32, en tu caso no se añadiria ese condensador.
El proyecto debes hacerlo con un cristal externo de 4mhz con 2 condensadores de 22pf separados del PIC tanto el cristal como los condensadores y veras como no se para el tiempo solo o se cuelga.
Eso no te sucederia con un 16f887 o un 16f877a, pero el 628a tiene esos pequeños inconvenientes.


----------



## Oliver97 (Feb 1, 2016)

Muy buen día.
Les cuento que estoy programando un display de 16 segmentos con el PIC16F887 mediante Microcode Studio.
Mi meta es llegar a hacer que despliegue la frase 6TO PERITO (lo cual ya logré)
El problema es que necesito programar para que cuando presione un botón en el pin RA0, cambiará su frase a ELECTRONICA y he intentado pero no sé cómo.

¿Me pueden ayudar?
He asignado nombres de las variables pero no sé cómo proseguir para realizar ese cambio.

```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 31/01/2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
define osc 4    ' Define la oscilacion 

    I var Byte  ' Declaracion de la variable I tipo byte
    
                ' Constantes para definir cada signo decimal.
 
                
    
            '87654321
            '////////
    Qb CON  %10111011
    Tb con  %00000011
    Ob con  %11111111
     b con  %00000000
    Pb con  %11000111
    Eb con  %11110011
    Rb CON  %11000111
    Ib con  %00110011
    Lb con  %11110000
    Cb con  %11110011
    Nb con  %11001100
    Ab con  %11001111
    
  
    
    Qc CON  %10001000
    Tc con  %00100010
    Oc con  %00000000
     c con  %00000000
    Pc con  %10001000
    Ec con  %10001000
    Rc CON  %10011000
    Ic con  %00100010
    Lc con  %00000000
    Cc con  %00000000
    Nc con  %00010001
    Ac con  %10001000
  
    
    'Configuracion del puerto de salida: 
   
    TRISB = %00000000  'Configura el puerto "C" como salida
    TRISC = %00000000  'Configura el puerto "D" como salida  
    
Inicio:     

    for I = 0 to 10    ' lazo de repeticion
    
        Call Digito    ' salto con retorno a la etiqueta "digito"
        
        Pause 200      ' Una pausa de 200milisegundos
    
    next I
    
    goto Inicio        ' Repite el proceso hacia la etiqueta "inicio"
    
Digito:

    if I = 0 then PORTB = Qb 
    if I = 0 then PORTC = Qc
    if I = 1 then PORTB = Tb
    if I = 1 then PORTC = Tc
    if I = 2 then PORTB = ob
    IF I = 2 then PORTC = Oc
    if I = 3 then PORTB = b
    IF I = 3 THEN PORTC = c
    if I = 4 then PORTB = Pb
    IF I = 4 THEN PORTC = Pc
    if I = 5 then PORTB = Eb
    IF I = 5 THEN PORTC = Ec
    if I = 6 then PORTB = Rb
    if I = 6 then PORTC = Rc 
    if I = 7 then PORTB = Ib
    IF I = 7 then PORTC = Ic
    if I = 8 then PORTB = tb
    IF I = 8 THEN PORTC = Tc
    if I = 9 then PORTB = Ob
    IF I = 9 THEN PORTC = Oc 
    if I = 10 then PORTB = b     
    IF I = 10 THEN PORTC = c
    
   
    
    return             ' Retorna a la etiqueta "call"
    
    
    end
```


----------



## mikeekim (Feb 1, 2016)

Antes de return crea un if que te lleve fuera de digito: que se llame por ejemplo, cambiar: en caso de que el puerto porta.0=1
Creas la rutina dentro de cambiar: para que el display muestre lo que quieres y al final antes del return vuelves a añadir un if, que en caso de que porta.0=0 vaya a digito:

Así:

```
digito:
' Lo que muestra el display sin presionar
if porta.0=1 then
pausa 100 
goto cambiar
end if
return
cambiar:
' Lo que muestra el display cuando se presiona a0
if porta.0=1 then
pausa 100
goto cambiar
else
goto digito
end if
return
```
El segundo return condicionará la salida de cambiar.
Dependiendo de si quieres que vuelva a digito si no se presiona el pulsador o que se quede en cambiar hasta que se presione de nuevo.

Hay que cambiar:

```
if porta.0=1 then
pausa 100
goto cambiar
else
goto digito
end if
```
Por: 

```
if porta.0=1 then
pausa 100
goto digito
else
goto cambiar
end if
```
Y se añade un goto cambiar antes del último return para asegurar el bucle.
Creo que habría que depurarlo algo más pero casi seguro que con esto consigues lo que buscas.

Y recuerda añadir siempre pausas después de los if o dentro de los if que añades en caso de que sean para salir de un bucle mediante pulsadores o producirás un efecto rebote que no te permitirá ejecutar las operaciones correctamente.


----------



## Oliver97 (Feb 1, 2016)

Muchas gracias mikeekim verificaré todo esto con mi código


----------



## willrey28 (Feb 15, 2016)

Hola a todos. Por favor me podrían ayudar a crear un pic que genere melodias y al mismo tiempo enciendan leds al ritmo de esa melodia ?,he creado por ejemplo la melodia de happy birthday y feliz navidad en el pic, pero no tengo idea como hacer para que por otro puerto enciendan algunos leds ,si yo quiero que enciendan los leds el programa primero ejecuta la melodia y luego recien enciende dichos leds y yo deseo que haga las dos cosas al mismo tiempo.Gracias.
Adjunto el archivo necesario en pic basic.


----------



## ricbevi (Feb 15, 2016)

willrey28 dijo:


> Hola a todos. Por favor me podrían ayudar a crear un pic que genere melodias y al mismo tiempo enciendan leds al ritmo de esa melodia ?,he creado por ejemplo la melodia de happy birthday y feliz navidad en el pic, pero no tengo idea como hacer para que por otro puerto enciendan algunos leds ,si yo quiero que enciendan los leds el programa primero ejecuta la melodia y luego recien enciende dichos leds y yo deseo que haga las dos cosas al mismo tiempo.Gracias.
> Adjunto el archivo necesario en pic basic.



Hola...Una de las formas que se me ocurre ahora es que por cada nota llames a continuacion el cambio de nivel en donde esta los led. Ej:


```
....

music:

DelayMS 500 
Toggle PORTB.1
Sound PORTB.0,[90,50]
Toggle PORTB.1
Toggle PORTB.7
Sound PORTB.0,[94,50]
Toggle PORTB.1
Sound PORTB.0,[94,50]
Toggle PORTB.7
Sound PORTB.0,[90,50]
Toggle PORTB.1
Sound PORTB.0,[99,50]
......
```

O el orden de encendido apagado que quieras realizar.
Saludos.

Ric.


----------



## willrey28 (Feb 15, 2016)

Gracias por responder,y si funciona lo que escribiste ,no se me había ocurrido usar "toggle".
No lo hace precisamente al ritmo de la música pero es una buena solución.
Gracias.
Lo que deseo es realizar una cajita musical como esas cajitas musicales de navidad que se colocan en los arbolitos de navidad y que tienen luces y que varían según las melodías que producen.
He visto en youtube que lo han realizado con un pic pero obviamente el codigo hex ni el diagrama te  quieren dar.
Gracias


----------



## mikeekim (Feb 15, 2016)

En mikrobasic tienes un ejemplo bastante explicito de como hacerlo, solo tienes que asignar un puerto de salida a cada tono, meter cada tono y cada puerto asignado a cada tono en un subproceso y activar el pueto antes de que suene el tono y que se desactive al finalizar el tono y finalizas el subproceso.
No te has de preocupar por los tiempos de encendido y apagado de los leds porque el tiempo de duracion del sound es el tiempo que estara activado cada puerto.
Asi que si un sonido dura 3 segundos y otro 500ms un led estara activado 3 segundos y el siguiente led 500ms.
Te dejo un ejemplo de como se hace.
Este es el programa original

```
' Cabecera******************************************************
program example_13 ' Nombre de programa

sub procedure Tone1()
  Sound_Play(659, 250) ' Frecuencia = 659Hz, duración = 250ms

end sub

sub procedure Tone2()
  Sound_Play(698, 250) ' Frecuencia = 698Hz, duración = 250ms
end sub

sub procedure Tone3()
  Sound_Play(784, 250) ' Frecuencia = 784Hz, duración = 250ms
end sub

sub procedure Melody() ' Tocar una melodía divertida 1
  Tone1() Tone2() Tone3() Tone3()
  Tone1() Tone2() Tone3() Tone3()
  Tone1() Tone2() Tone3()
  Tone1() Tone2() Tone3() Tone3()
  Tone1() Tone2() Tone3()
  Tone3() Tone3() Tone2() Tone2() Tone1()
end sub

sub procedure ToneA() ' Tonos utilizados en la función Melody2
  Sound_Play( 880, 50)
end sub

sub procedure ToneC()
  Sound_Play(1046, 50)
end sub

sub procedure ToneE()
  Sound_Play(1318, 50)
end sub

sub procedure Melody2() ' Tocar Melody2
  dim counter as byte
  for counter = 9 to 1 step -1
    ToneA()
    ToneC()
    ToneE()
  next counter
end sub

main: ' Inicio de programa

ANSEL = 0    ' Configurar pines analógicos como digitales de E/S
ANSELH = 0

C1ON_bit = 0 ' Deshabilitar los comparadores
C2ON_bit = 0

TRISB = 0xF0 ' Configurar los pines RB7..RB4 como entradas y RB3 como salida

Sound_Init(PORTD, 3)
Sound_Play(880, 5000)

while TRUE   ' Bucle infinito
  if (Button(PORTB,7,1,1)) then ' Si se presiona PORTB.7 tocar Tone1
      Tone1()
    while (RB7_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if

  if (Button(PORTB,6,1,1)) then ' Si se presiona PORTB.6 tocar Tone1
      Tone2()
    while (RB6_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if

  if (Button(PORTB,5,1,1)) then ' Si se presiona PORTB.5 tocar Tone1
    Melody2()
    while (RB5_bit <> 0)
      nop ' Esperar que se suelte el botón 
    wend
  end if

  if (Button(PORTB,4,1,1)) then ' Si se presiona PORTB.4 tocar Tone1

    Melody()
    while (RB4_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if
wend

end. ' Final de programa
```

Estos son los tonos

```
sub procedure Tone1()
  Sound_Play(659, 250) ' Frecuencia = 659Hz, duración = 250ms

end sub

sub procedure Tone2()
  Sound_Play(698, 250) ' Frecuencia = 698Hz, duración = 250ms
end sub

sub procedure Tone3()
  Sound_Play(784, 250) ' Frecuencia = 784Hz, duración = 250ms
end sub
```

Pues yo lo que he hecho para que lo comprendas, es esto:

```
' Cabecera******************************************************
program example_13 ' Nombre de programa

sub procedure Tone1() ' g
PORTA.0=1
  Sound_Play(196, 700) ' Frecuencia = 659Hz, duración = 250ms
PORTA.0=0
end sub

sub procedure Tone2() ' d
 PORTA.6=1
  Sound_Play(293, 1200) ' Frecuencia = 698Hz, duración = 250ms
 PORTA.6=0
end sub

sub procedure Tone3() ' c
PORTA.5=1
  Sound_Play(261, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.5=0
end sub

sub procedure Tone4() ' b
PORTA.4=1
  Sound_Play(246, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.4=0
end sub

sub procedure Tone5() ' a
PORTA.3=1
  Sound_Play(220, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.3=0
end sub

sub procedure Tone6()   'g
PORTA.7=1
  Sound_Play(392, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.7=0
end sub

sub procedure Tone7()   'd
PORTA.6=1
  Sound_Play(293, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.6=0
end sub

sub procedure Tone8()   'd
PORTA.3=1
  Sound_Play(220, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.3=0
end sub


sub procedure Melody() ' Tocar una melodía divertida 1
  Tone1() Tone2()  Tone3()  Tone4() Tone5() Tone6() Tone7() Tone3()
  Tone4() Tone5() Tone6() Tone7() Tone3() Tone4() Tone3() Tone8()
end sub

sub procedure ToneA() ' Tonos utilizados en la función Melody2
  Sound_Play( 880, 50)
end sub

sub procedure ToneC()
  Sound_Play(1046, 50)
end sub

sub procedure ToneE()
  Sound_Play(1318, 50)
end sub

sub procedure Melody2() ' Tocar Melody2
  dim counter as byte
  for counter = 9 to 1 step -1
    ToneA()
    ToneC()
    ToneE()
  next counter
end sub

main: ' Inicio de programa

ANSEL = 0    ' Configurar pines analógicos como digitales de E/S
ANSELH = 0
TRISB = 0xF0 ' Configurar los pines RB7..RB4 como entradas y RB3 como salida
TRISA =0x00
porta = 0x00
C1ON_bit = 0 ' Deshabilitar los comparadores
C2ON_bit = 0


Sound_Init(PORTD, 3)
'Sound_Play(880, 5000)

while TRUE   ' Bucle infinito
  if (Button(PORTB,7,1,1)) then ' Si se presiona PORTB.7 tocar Tone1
      Tone1()
    while (RB7_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if

  if (Button(PORTB,6,1,1)) then ' Si se presiona PORTB.6 tocar Tone1
      Tone2()
    while (RB6_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if

  if (Button(PORTB,5,1,1)) then ' Si se presiona PORTB.5 tocar Tone1
    Melody2()
    while (RB5_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if

  if (Button(PORTB,4,1,1)) then ' Si se presiona PORTB.4 tocar Tone1

    Melody()
    while (RB4_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if
wend

end. ' Final de programa
```

Y antes de cada sound y despues, activas y desactivas el puerto que le hayas asignado a ese tono, asi:

```
sub procedure Tone1() ' g
PORTA.0=1
  Sound_Play(196, 700) ' Frecuencia = 659Hz, duración = 250ms
PORTA.0=0
end sub

sub procedure Tone2() ' d
 PORTA.6=1
  Sound_Play(293, 1200) ' Frecuencia = 698Hz, duración = 250ms
 PORTA.6=0
end sub

sub procedure Tone3() ' c
PORTA.5=1
  Sound_Play(261, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.5=0
end sub

sub procedure Tone4() ' b
PORTA.4=1
  Sound_Play(246, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.4=0
end sub

sub procedure Tone5() ' a
PORTA.3=1
  Sound_Play(220, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.3=0
end sub

sub procedure Tone6()   'g
PORTA.7=1
  Sound_Play(392, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.7=0
end sub

sub procedure Tone7()   'd
PORTA.6=1
  Sound_Play(293, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.6=0
end sub

sub procedure Tone8()   'd
PORTA.3=1
  Sound_Play(220, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.3=0
end sub
```

Te dejo la simulacion en proteus para que lo veas en funcionamiento.
Los comentarios de cada linea, solo son validos los del ejemjplo original.
No te guies por los demas comentarios ok?
Un saludo.


----------



## ricbevi (Feb 16, 2016)

willrey28 dijo:


> Gracias por responder,y si funciona lo que escribiste ,no se me había ocurrido usar "toggle".
> No lo hace precisamente al ritmo de la música pero es una buena solución.
> Gracias.
> Lo que deseo es realizar una cajita musical como esas cajitas musicales de navidad que se colocan en los arbolitos de navidad y que tienen luces y que varían según las melodías que producen.
> ...



La duración del encendido apagado así como cual led prendes dura lo que dura la nota ya que cambias el estado una vez que entras o sales al generador de cada una de ellas por lo que de ti depende cuando y que prendes(seguir el ritmo). En ves de la instrucción Toggle puedes activar el bit del puerto individualmente que quieras así como pagarlo con

```
PORTx.x = %01110001(led que quieras prender o apagar)
SOUND.....
......
 PORTx.x = %........
```
Si no quieres escribir tanto, le asignas una variable el numero correspondiente y luego solo la invocas.
Alternativas hay muchas.

Ric.


----------



## D@rkbytes (Feb 16, 2016)

Se me ocurrió una manera más fácil usando interrupciones. (RB0)
Pero se necesita que las notas tengan espacios. (Notas sin sonido de la instrucción "Sound")

Adjunto el ejemplo probado físicamente con dos LED's.
Con dos 4017 y usando las salidas para los LED's, se puede incrementar el número de LED´s.

Saludos.


----------



## disenoselectronicos (Feb 16, 2016)

Adjunto Circuito y programa Probados.


----------



## willrey28 (Feb 16, 2016)

Hola .Gracias por ayudarme en mi proyecto de cajita musical....Tengo una pregunta, al usar la instrucción "if..then"   en mis proyectos para activar o desactivar algo con pulsadores ,yo uso por ejemplo "if porta.0 and porta.1 then (activo algo) ",es decir al apretar dos pulsadores al mismo tiempo me da un resultado ,pero en la simulacion y en la realidad es dificil que realice 
ese resultado ,yo programe por ejemplo que al apretar porta.0 me active el led1 ,al apretar porta.1 me active el led 2 y al apretar al mismo tiempo porta.0 y porta.1 me active el led 3,
pero como dije es muy difícil que me realice esa acción,es decir hay que ser muy preciso al apretar los dos pulsadores para que funcione.Hay alguna solución .
Gracias.


----------



## D@rkbytes (Feb 16, 2016)

Si tiene que funcionar la operación AND sobre los bits seleccionados.
A menos de que estén sucios los pulsadores, no funcionaría correctamente.
Colocar un capacitor de 100 nF. en cada pulsador, puede ayudar a evitar rebotes.

No olvides decirle al compilador los estados a comparar.
La estructura del código es la siguiente:

```
[B][COLOR=Blue]If [/COLOR]PORTB.1 = 0 & PORTB.2 = 0 [COLOR=Blue]Then[/COLOR]
       [COLOR=Green]; Código a ejecutar[/COLOR]
      [COLOR=Blue] While[/COLOR] (PORTB.1 = 0 [COLOR=Blue]Or[/COLOR] PORTB.2 = 0): [COLOR=Blue]Wend[/COLOR]
    [COLOR=Blue]EndIf[/COLOR][/B]
```
Nota:
Para presionar dos pulsadores al mismo tiempo en Proteus, se usa la barra espaciadora del teclado.


----------



## ricbevi (Feb 17, 2016)

willrey28 dijo:


> Hola .Gracias por ayudarme en mi proyecto de cajita musical....Tengo una pregunta, al usar la instrucción "if..then"   en mis proyectos para activar o desactivar algo con pulsadores ,yo uso por ejemplo "if porta.0 and porta.1 then (activo algo) ",es decir al apretar dos pulsadores al mismo tiempo me da un resultado ,pero en la simulacion y en la realidad es dificil que realice
> ese resultado ,yo programe por ejemplo que al apretar porta.0 me active el led1 ,al apretar porta.1 me active el led 2 y al apretar al mismo tiempo porta.0 y porta.1 me active el led 3,
> pero como dije es muy difícil que me realice esa acción,es decir hay que ser muy preciso al apretar los dos pulsadores para que funcione.Hay alguna solución .
> Gracias.



Sospecho que lo tuyo es problema que, como estas tomado decisiones con el estado del pulsador individualmente, si no esperas un tiempo y realizas la verificación del estado de nuevo, y recién allí actuás en consecuencia, tendrás resultados aleatorios dependiendo de que pulsador presiones primero.

Ric.


----------



## willrey28 (Feb 17, 2016)

Hola .Gracias ,voy a probar con "while.. wend",no lo habia hecho.
Es cierto ricbevi ,me produce resultados aleatorios.A veces le acierto.


----------



## Inductancio (Mar 5, 2016)

Estimado TORRES: es posible usar algo de este código para hacer un contador o frecuencimetro o tacómetro, con caracteres grandes, que ocupen 2 lineas de un LCD ??? Algo dice al respecto el comentario Nro. 2963 sobre caracteres gigantes...CURSO DE PROGRAMACION EN PICBASIC.
Aclaro que empecé hace unos pocos días con este lenguaje, y casi no conozco su potencial...Por otro lado, hace años que estoy alejado de la vida estudiantil, más de 30 para ser preciso, ni se conocían las computadores personales por aquellos años, asi que estoy algo oxidado y desactualizado, pero conservo la capacidad de interpretación a pesar de mis años y tengo voluntad para aprender...Si conoce de información para mirar, se lo agradeceré enormemente.

Parece que el sitio no me deja pegar link, ni hacer citas, ni hacerle preguntas por privado, creo que hay que tener un mínimo de mensajes en el foro para ganarse ese derecho.

Saludos !!!


----------



## blackpic (Mar 6, 2016)

Saludos tengo el siguiente codigo con lo cual genero un pwm con una frecuancia fija de 1Khz
pero me gustaria variar el ciclo util de esta osea el duty, ya que haciendo un toggle en el pin
correspondiente consigo el 50% de este.
pero me gustaría realizar lo atraves de dos pus button.
agradeceria una ayuda oh comentario del mismo.


```
' Programa en Pic Basic Pro
'Int. Por TMR0 a 1 KHZ
@ DEVICE PIC12F683
@ DEVICE PIC12F683, FCMEN_OFF
@ DEVICE PIC12F683, IESO_OFF
@ DEVICE PIC12F683, WDT_ON
@ DEVICE PIC12F683, BOD_ON
@ DEVICE PIC12F683, PWRT_ON
@ DEVICE PIC12F683, PROTECT_OFF
@ DEVICE PIC12F683, MCLR_OFF
@ DEVICE PIC12F683, INTRC_OSC_NOCLKOUT
@ DEVICE PIC12F683, BOD_ON
Define Osc 4 ' Define el Oscilador para 4 Mhz.
I var Byte 
inc var byte
On Interrupt GoTo int_tmr0 '
Symbol TOIF = INTCON.2 ' 
Symbol INTF = INTCON.1 ' 
Symbol LED = GPIO.1 ' 
Pb_Inc	var	GPIO.0 ' 
Pb_Dec	var	GPIO.3 ' 
OSCCON=%01100001
ANSEL = 0
CMCON0 = 7
TRISIO = %11011101     
GPIO  = %00000000     
WPU = 0
OPTION_REG = %10000100 '
INTCON = %10100000 ' 

inc=0
Inicio:
if Pb_Inc = 0 then ' 
    inc=inc+1
ENDIF
IF Pb_Dec = 0 THEN
   inc=inc-1
ENDIF
GoTo Inicio ' 
End
'*********************************************************
Disable
int_tmr0:
If TOIF = 1 Then 
    TMR0 = 240
    toggle led
endif          
Reseteo:
TOIF = 0 
Resume
ENABLE
```


----------



## papirrin (Mar 6, 2016)

Me parece XD que pueded lograr un pwm a 1KHz con el módulo PWM del pic y es más estable que hacerlo con un tmr, dale una buscada de como hacerlo.


----------



## torres.electronico (Mar 7, 2016)

Inductancio dijo:


> E_stimado TORRES: es posible usar algo de este  código para hacer un contador o frecuencimetro o tacómetro, con  caracteres grandes, que ocupen 2 lineas de un LCD ??? Algo dice al  respecto el comentario Nro. 2963 sobre caracteres gigantes.._.



Si se puede; Fijate que hay un articulo de como trabajar con estos display, y menciono como se grafican los caracteres 



Inductancio dijo:


> Parece que el sitio no me deja pegar link, ni hacer citas, ni hacerle preguntas por privado, creo que hay que tener un mínimo de mensajes en el foro para ganarse ese derecho.



Tal cual, y con un solo mensaje, yo te recomendaria darte una vuelta por presentaciones, un pase por el foro y ver en que se puede colaborar tampoco estaria mal, etc etc... Bienvenido al foro


----------



## Inductancio (Mar 15, 2016)

Gracias TORRES, voy a estar mirando...Sino encuentro nada, repregunto...Saludos.


----------



## Dario (Mar 22, 2016)

Hola gente tanto tiempo . les cuento que estoy intentando programar un Pic16f876A con un bootloader cargado y el software tiny bootloader.  he estado investigando un poco y al parecer hay que escribir un par de líneas de código extra al programa que uno intenta cargar en el pic. el único problema que tengo,  es que no tengo idea de lo que hay que escribir,  ni en que parte del programa hay que escribirlo. será que podrán ayudarme a definir dónde y que escribir a un programa en pbp con algún ejemplillo??? Saludosss


----------



## torres.electronico (Mar 22, 2016)

Hola cesar, yo en su momento me guie de aca:http://www.piclist.com/techref/post...+Bootloader+and+PIC+BASIC+PRO&w=body&tgt=post

Pero no me funciono el 100% bien (tampoco di muchas vueltas), y decidi sumar los terminales de programaxion en circuito para no tener que sacar el micro ante una reforma


----------



## D@rkbytes (Mar 22, 2016)

Dario dijo:


> ¿Será que podrán ayudarme a definir dónde y que escribir a un programa en pbp con algún ejemplillo?


Saludos.
Mira éste enlace en donde publiqué un Bootloader.
*Bootloader para PIC16F87XA*


----------



## Dario (Mar 22, 2016)

Bueno, pude hacer andar el tiny bootloader y el codigo queda asi como lo ven... lo unico que me pregunto, o mejor dicho le pregunto a los que saben, que significa este mensaje??? (Reading HEX file... 
      WARNING: PCLATH not fully initialised before GOTO! , ... sucessfully repaired.,  Writing flash...
   WRITE OK  at 1:17,   time:0.311 sec)


```
@ device xt_osc  ; oscilador externo XT
DEFINE LOADER_USED 1
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz

LED var portb.4   ; asigna el nombre de led a RB4 del pic 16f877A


programa:          ; inicio de la linea de programa 
high led           ;enciende led
pause 2500         ; esperar 2.5 seg
low led            ;apaga led 
pause 500          ; espera 0.5 seg             
goto programa
end                ; fin del programa
```


----------



## Inductancio (Mar 23, 2016)

Dario, podrías explicar brevemente que es el TINY BOOTLOADER ??? Leí la explicación de D@rkbytes y se entiende para que sirve cargar un bootloader...Saludos !!!


----------



## Dario (Mar 23, 2016)

Inductancio dijo:


> Dario, podrías explicar brevemente que es el TINY BOOTLOADER ??? Leí la explicación de D@rkbytes y se entiende para que sirve cargar un bootloader...Saludos !!!


Pues si leiste la explicacin de Darkbytes y la entendiste, no hay mucho que agregar... es un programa que se usa para cargar un pic serialmente onboard, sin necesidad de estar sacando y poniendo el micro de la placa para reprogramarlo. obviamente el micro debe ser cargado con lo que se llama bootloader, que es un firmware que permite la funcion antes descrita... saludosss


----------



## Inductancio (Mar 23, 2016)

Gracias DARIO...No me quedaba claro si era un grabador o una aplicación...Saludos !!!


----------



## juancaca (Mar 27, 2016)

Buenas noches compañeros del foro, estoy en un proyecto para hacer un termostato con un MAX6675 y un PIC16F628A, la cuestion es que me gustaria saber como hago para visualizar con algun comando los 16 bit que manda el MAX, este conversor tiene que en el bit 2 cuando esta en 0 la termocupla esta conectada, y pone en 1 el bit si esta desconectada, esto seria para generar un aviso que esta mala o desconectadala termocupla, la conexion del MAX al pic la hice con Shiftin, tambien tengo otro problema es que cuando llega a 650 grados se me desborda y vuelve y empieza desde 0°, estoy utilizando una rutina de punto flotante de microchip, dejo el codigo y el archivo de simulacion.

Cordial saludo y de ante mano muchas gracias 
Juan Camilo Cardona


```
CLEAR
DEFINE OSC 20
define __16F628A 1
INCLUDE "modedefs.bas"
INCLUDE "fp2032.bas"
CMCON = 7
TRISA = %00100111
TRISB = 0
PORTA = 255
PORTB.0 = 0
PORTB.1 = 0
SERIAL      VAR WORD
SERIAL2     VAR BYTE
THC         VAR WORD
THC1        VAR WORD
THC2        VAR WORD
ENTERO      VAR WORD
DECIMAL     VAR WORD
AJUSTE      VAR WORD
AJUSTE2     VAR WORD
GRADOS      VAR BYTE
DEFINE LCD_BIT 4
DEFINE LCD_LINES 2
DEFINE LCD_DREG PORTB                                                   ; configuro la panta LCD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
LCDOUT $FE,$40,$18,$18,$03,$04,$04,$04,$03,$00                         ; POSICION 0 vizualiza los °C

INICIO:   
        GOSUB SERIAL_IN                                                ; llamo la sub-rutina que comunica el MAX con el pic                                          
        GOSUB PUNTO_FLOTANTE1                                          ; llamo la sub-rutina que maneja el punto flotante
        LCDOUT $FE,1
        LCDOUT $FE,$80, # ENTERO,".", DEC2 DECIMAL,0                
        LCDOUT $FE,$C0, # THC2;
        ;GOSUB SERIAL_ALARMA        
        PAUSE 250
        
GOTO INICIO
'Cargo la rutina de punto flotante de microchip 
PUNTO_FLOTANTE1:        
        AINT = SERIAL
        GOSUB ITOFA
        BINT = 16
        GOSUB ITOFB
        GOSUB FPDIV
        BINT = 100
        GOSUB ITOFB
        GOSUB FPMUL       
        GOSUB FTOIA
        AINT = AINT - 2475       
        ENTERO = AINT /100
        DECIMAL = AINT //100
        RETURN

SERIAL_IN:
        LOW PORTB.0
        SHIFTIN PORTB.1, PORTB.2,0,[SERIAL\16]                       ; comunicacion SPI
        HIGH PORTB.0
RETURN
 
END
```


----------



## torres.electronico (Mar 27, 2016)

Hola Juan, estoy escribiendo del telefono y se me complica esctibirte un ejenplo completo, pero basicamente 1ero creas la variable tipo word (16bits) y despues, la deglosas asi...

Dato_w VAR word [16]
Dato_b VAR bit [o]
Dato_b VAR bit [1]
Etc etc hasta el bit 16...


----------



## juancaca (Mar 28, 2016)

Hola torres. Muchas gracias por responder.
No entiendo cómo hacerlo  porque al crear las arrays me dice que están duplicadas y la verdad no  veo como hacerlo con el ejemplo que me das.

Cordial saludo. 

---------- Actualizado después de 2 horas ----------

Hola compañeros, hola torres.
Bueno, ya pude entrar al bit que sensa la termocupla, lo hice creando una variable y llamando el bit serial_2 var serial.bit13 y así me muestra la alerta.
Lo que me falta es cómo hacer que no se me reinicie la medición de los grados, ya que cuando va a los 650° empieza nuevamente desde 0° y debería llegar hasta los 1000° aproximadamente.
Yo sé que se está desbordando, ¿pero como podría hacer con esa rutina de Microchip de punto flotante para que no se me desborde y llegue a los 1000°?

```
CLEAR
DEFINE OSC 20
define __16F628A 1
INCLUDE "modedefs.bas"
INCLUDE "fp2032.bas"
CMCON = 7
TRISA = %00100111
TRISB = 0
PORTA = 255
PORTB.0 = 0
PORTB.1 = 0
SERIAL      VAR WORD
SERIAL_2    VAR SERIAL.BIT13
SERIAL2     VAR BYTE
THC         VAR WORD
THC1        VAR WORD
THC2        VAR WORD
ENTERO      VAR WORD
DECIMAL     VAR WORD
AJUSTE      VAR WORD
AJUSTE2     VAR WORD
GRADOS      VAR BYTE
DEFINE LCD_BIT 4
DEFINE LCD_LINES 2
DEFINE LCD_DREG PORTB                                                   ; configuro la panta LCD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
LCDOUT $FE,$40,$18,$18,$03,$04,$04,$04,$03,$00                         ; POSICION 0 vizualiza los °C

INICIO:   
        GOSUB SERIAL_IN                                                ; llamo la sub-rutina que comunica el MAX con el pic                                          
        GOSUB PUNTO_FLOTANTE1                                          ; llamo la sub-rutina que maneja el punto flotante
        LCDOUT $FE,1
        LCDOUT $FE,$80, # ENTERO,".", DEC2 DECIMAL,0                
        LCDOUT $FE,$C0, #SERIAL_2 
        ;GOSUB SERIAL_ALARMA        
        PAUSE 250
        
GOTO INICIO
'Cargo la rutina de punto flotante de microchip 
PUNTO_FLOTANTE1:        
        AINT = SERIAL
        GOSUB ITOFA
        BINT = 16
        GOSUB ITOFB
        GOSUB FPDIV
        BINT = 100
        GOSUB ITOFB
        GOSUB FPMUL       
        GOSUB FTOIA
        AINT = AINT - 2475       
        ENTERO = AINT /100
        DECIMAL = AINT //100
        RETURN

SERIAL_IN:
        LOW PORTB.0
        SHIFTIN PORTB.1, PORTB.2,0,[SERIAL\16]                       ; comunicacion SPI
        HIGH PORTB.0
        IF SERIAL_2 = 1 THEN SERIAL_ALARMA
RETURN

SERIAL_ALARMA:
        LCDOUT $FE,1
        LCDOUT $FE,$80, # ENTERO,".", DEC2 DECIMAL,0                
        LCDOUT $FE,$C0, "TERMOCUPLA OPEN"
        PAUSE 100
        IF SERIAL_2 = 0 THEN GOTO INICIO
GOTO SERIAL_ALARMA
END
```


----------



## torres.electronico (Mar 28, 2016)

juancaca dijo:


> Hola torres. Muchas gracias por responder.
> No entiendo cómo hacerlo  porque al crear las arrays me dice que están  duplicadas y la verdad no  veo como hacerlo con el ejemplo que me das.
> 
> Cordial saludo. .






torres.electronico dijo:


> Hola Juan, estoy escribiendo del  telefono y se me complica esctibirte un ejenplo completo, pero  basicamente 1ero creas la variable tipo word (16bits) y despues, la  deglosas asi...
> 
> Dato_w VAR word [16]
> Dato_b VAR bit [0]
> ...



Lo que queria decir en el ejemplo, es que tenes que normbrar otra variable tipo bit con ditinto nombre



juancaca dijo:


> Hola compañeros, hola torres.
> Bueno, ya pude entrar al bit que sensa la termocupla, lo hice creando  una variable y llamando el bit serial_2 var serial.bit13 y así me  muestra la alerta.
> 
> 
> ...



 o bien, tambien podes hacer este arreglo:


```
SERIAL2 VAR WORD 

S2_0 VAR SERIAL2.0
S2_1 VAR SERIAL2.1
S2_2 VAR SERIAL2.2
S2_3 VAR SERIAL2.3
S2_4 VAR SERIAL2.4
S2_5 VAR SERIAL2.5
S2_6 VAR SERIAL2.6
S2_7 VAR SERIAL2.7
S2_8 VAR SERIAL2.8
S2_9 VAR SERIAL2.9
etc etc...
S2_16 VAR SERIAL2.16
```

Por ejemplo, el bit 4 de la variable SERIAL2 seria S2_4


----------



## torres.electronico (Mar 29, 2016)

Como te fue Juan? podrias sacar una captura del diagrama del circuito? queria ver el adjunto y esta en el formato de Proteus8; Saludos


----------



## juancaca (Mar 29, 2016)

Buenas noches compañeros.
torres te cuento que me fue muy bn, pude entrar a bit que me da la alarma de desconexion ó daño de la termocupla, no he podido solucionar lo del desborde de la variable, solo me mide hasta 650° de los 1023° que da, estoy pensando migrar a un pic 18F que se pueda crear una variable tipo long, hasta ahora no se cual, tengo un 18F2550 pero pbp 2.60 no reconoce ese tipo de variables.
Monto la simulacion en proteus 7.9 y el codigo.

Cordial saludo.
Juancaca


```
CLEAR
DEFINE OSC 20
define __16F628A 1
INCLUDE "modedefs.bas"
INCLUDE "fp2032.bas"
;include "fp4032.bas"
CMCON = 7
TRISA = %00100111
TRISB = 0
PORTA = 255
PORTB.0 = 0
PORTB.1 = 0
SERIAL      VAR WORD
'SERIAL_15   VAR SERIAL.BIT0
'SERIAL_14   VAR SERIAL.BIT1
'SERIAL_13   VAR SERIAL.BIT2
'SERIAL_12   VAR SERIAL.BIT3
'SERIAL_11   VAR SERIAL.BIT4
'SERIAL_10   VAR SERIAL.BIT5
'SERIAL_9    VAR SERIAL.BIT6
'SERIAL_8    VAR SERIAL.BIT7
'SERIAL_7    VAR SERIAL.BIT8
'SERIAL_6    VAR SERIAL.BIT9
'SERIAL_5    VAR SERIAL.BIT10
'SERIAL_4    VAR SERIAL.BIT11
'SERIAL_3    VAR SERIAL.BIT12
SERIAL_2    VAR SERIAL.13
'SERIAL_1    VAR SERIAL.BIT14
'SERIAL_0    VAR SERIAL.BIT15
ENTERO      VAR WORD
DECIMAL     VAR WORD
DEFINE LCD_BIT 4
DEFINE LCD_LINES 2
DEFINE LCD_DREG PORTB                                                   ; configuro la panta LCD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
LCDOUT $FE,$40,$18,$18,$03,$04,$04,$04,$03,$00                         ; POSICION 0 vizualiza los °C

INICIO:   
        GOSUB SERIAL_IN                                                ; llamo la sub-rutina que comunica el MAX con el pic                                          
        GOSUB PUNTO_FLOTANTE1                                          ; llamo la sub-rutina que maneja el punto flotante
        LCDOUT $FE,1
        LCDOUT $FE,$80, # ENTERO,".", DEC2 DECIMAL,0                
        LCDOUT $FE,$C0,#serial_2," BIT DE ALARMA"                     ; 
        PAUSE 250
        
GOTO INICIO
'Cargo la rutina de punto flotante de microchip 
PUNTO_FLOTANTE1:        
        AINT = SERIAL
        GOSUB ITOFA
        BINT = 4
        GOSUB ITOFB
        GOSUB FPDIV
        BINT = 100
        GOSUB ITOFB
        GOSUB FPMUL       
        GOSUB FTOIA
        AINT = AINT - 2475             
        ENTERO = AINT /100
        DECIMAL = AINT //100
        RETURN
'PUNTO_FLOTANTE2:        
'        AINT = AJUSTE
'        GOSUB ITOFA
'        BINT = 100
'        GOSUB ITOFB
'        GOSUB FPMUL    
'        GOSUB FTOIA
'        AINT = AINT - 2475             
'        ENTERO = AINT /100
'        DECIMAL = AINT //100
'        RETURN
PUNTO_FLOTANTE3:
        
SERIAL_IN:
        LOW PORTB.0
        SHIFTIN PORTB.1, PORTB.2,0,[SERIAL\14]                       ; comunicacion SPI
        HIGH PORTB.0
        IF SERIAL_2 = 1 THEN SERIAL_ALARMA
RETURN

SERIAL_ALARMA:
        LCDOUT $FE,1
        LCDOUT $FE,$80, # ENTERO,".", DEC2 DECIMAL,0                
        LCDOUT $FE,$C0, "TERMOCUPLA OPEN"
        PAUSE 100
        IF SERIAL_2 = 0 THEN GOTO INICIO
GOTO SERIAL_ALARMA
END
```


----------



## torres.electronico (Mar 29, 2016)

juancaca dijo:


> Buenas noches compañeros.
> torres te cuento que me fue muy bn, pude entrar a bit que me da la alarma de desconexion ó daño de la termocupla, no he podido solucionar lo del desborde de la variable, solo me mide hasta 650° de los 1023° que da, estoy pensando migrar a un pic 18F que se pueda crear una variable tipo long, hasta ahora no se cual, tengo un 18F2550 pero pbp 2.60 no reconoce ese tipo de variables.
> Monto la simulacion en proteus 7.9 y el codigo.
> 
> ...



Hola Juan, estoy compilando con 2.5



Te dejo un ejemplo de como empleo los bits que yo quiero:


```
'****************************************************************
'*  Name    : PRUEBAbit.pbp                                     *
'*  Author  : [ - prof.martintorres@educ.ar - ]                 *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 29/03/2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 4
  
define LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 2

X VAR BYTE
SERIAL VAR WORD[16]
SERIAL_0 VAR SERIAL.BIT0
SERIAL_1 VAR SERIAL.BIT1
SERIAL_2 VAR SERIAL.BIT2
SERIAL_3 VAR SERIAL.BIT3
SERIAL_4 VAR SERIAL.BIT4
SERIAL_5 VAR SERIAL.BIT5
SERIAL_6 VAR SERIAL.BIT6
SERIAL_7 VAR SERIAL.BIT7
SERIAL_8 VAR SERIAL.BIT8
SERIAL_9 VAR SERIAL.BIT9
SERIAL_10 VAR SERIAL.BIT10
SERIAL_11 VAR SERIAL.BIT11
SERIAL_12 VAR SERIAL.BIT12
SERIAL_13 VAR SERIAL.BIT13
SERIAL_14 VAR SERIAL.BIT14
SERIAL_15 VAR SERIAL.BIT15

MENU:
PAUSE 10
BIT_02:
SERIAL=0
 LCDOUT $FE,1
FOR SERIAL = 1 TO 1023
LCDOUT $FE,$80,"bit0:",DEC SERIAL_0," BIT2:",DEC SERIAL_15
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 50
IF SERIAL_2 = 1 THEN
  LCDOUT $FE,1
  LCDOUT $FE,$80,"BIT2=",#SERIAL_2," -FIN-"
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 1500
GOTO BIT_05
ENDIF
NEXT

BIT_05:
SERIAL=0
 LCDOUT $FE,1
FOR SERIAL = 1 TO 1023
LCDOUT $FE,$80,"bit0:",DEC SERIAL_0," BIT5:",DEC SERIAL_5
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 50
IF SERIAL_5 = 1 THEN
  LCDOUT $FE,1
  LCDOUT $FE,$80,"BIT5=",#SERIAL_5," -FIN-"
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 1500
GOTO BIT_08
ENDIF
NEXT

BIT_08:
SERIAL=0
LCDOUT $FE,1
FOR SERIAL = 1 TO 1023
LCDOUT $FE,$80,"bit0:",DEC SERIAL_0," BIT8:",DEC SERIAL_8
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 50
IF SERIAL_8 = 1 THEN
  LCDOUT $FE,1
  LCDOUT $FE,$80,"BIT8=",#SERIAL_8," -FIN-"
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 1500
GOTO BIT_12
ENDIF
NEXT

BIT_12:
SERIAL=0
LCDOUT $FE,1
FOR SERIAL = 1 TO 1023
LCDOUT $FE,$80,"bit0:",DEC SERIAL_0," BIT12:",DEC SERIAL_12
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 50
IF SERIAL_12 = 1 THEN
  LCDOUT $FE,1
  LCDOUT $FE,$80,"BIT12=",#SERIAL_12," -FIN-"
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 1500
GOTO BIT_15
ENDIF
NEXT

BIT_15:
SERIAL=0
LCDOUT $FE,1
FOR SERIAL = 1 TO 1023
LCDOUT $FE,$80,"bit0:",DEC SERIAL_0," BIT15:",DEC SERIAL_15
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 50
IF SERIAL_15 = 1 THEN
  LCDOUT $FE,1
  LCDOUT $FE,$80,"BIT7=",#SERIAL_15," -FIN-"
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 2500
ENDIF
NEXT

LCDOUT $FE,1
LCDOUT $FE,$80,"fin del"
LCDOUT $fe,$C0,"ejemplo"
PAUSE 2500

GOTO MENU
```
y este es el circuito por si qures ver como se comporta:



Basicamente, lo que hice en el ejemplo que te escribi, es que arranque un conteo y cuando llega a determinados BITS, se frene y te lo indique, para luego arrancar de nuevo y parar en otro bit que seleccione...



el tema del desborde, tendria que ponerme a leer la hoja de datos del MAX por que no recuerdo como funciona y ver con mas atencion tu programa...pero desde el vamos, sacaria las librerias FP y lo haria con menos lineas...eso hablando a la ligera...tendria que verla con mas tiempo...saludos


----------



## callecuatro1976 (Abr 13, 2016)

Consulta. Estoy aprendiendo PICBasic Pro y mi código no mide más que 1,24 voltios en la pantalla lcd.
No sé qué estoy haciendo mal. Es un voltímetro que hago con el PIC16F883

```
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2
define intosc 8
DEFINE ADC_BITS 8
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50
trisa = 1
trisb = 0
ADCON0 = %11000001
ADCON1 = %00000000 
ANSEL = %00000001 
ANSELH = %00000000 
;Variables para guardar los valores leidos
LECTURA VAR word
RESULTADO VAR word
;Dar una pausa antes de iniciar para alistar la LCD
LCDOUT $FE, 1 ;Limpiar la LCD
LECTURA_DE_DATOS: ;Bloque de inicio del programa
ADCIN 0, LECTURA ;Leer por PORTA.0 y guardar en LECTURA
RESULTADO = (LECTURA */ 500)>>2;Guardar en RESULTADO la conversion
LCDOUT $FE, 1 ; Limpiar la LCD
LCDOUT $FE, 2, DEC (RESULTADO/100),".",dec2 resultado, "v" ;Mostrar el resultado en la LCD
PAUSE 100 ;Pausa de 100 milisegundos
GOTO LECTURA_DE_DATOS ;Volver al inicio para leer datos
END ;Fin
```


----------



## juancaca (Abr 13, 2016)

callecuatro1976 dijo:


> RESULTADO = (LECTURA */ 500)>>2;Guardar en RESULTADO la conversion
> [/code]



Hola compañero,
lo unico que debes quitar en el codigo es >>2 para que te de el resultado que esperas, porque lo que estas haciendo es dividir el resultado por 4.


----------



## torres.electronico (Abr 14, 2016)

igualmente, varias paginas para tras en este mismo topico, hay varios ejemplos similares de los cuales puede usar como ejemplos... Yo antes de consultar, suelo implementar el buscador o bien, pegarle una leida a todo el topico completo


----------



## Nano24 (Abr 19, 2016)

Despues de hace un buen tiempo me tomo la molestia de volver por aca para compartir un pequeño proyecto que se me ocurrido hacer, ya que estoy trabajando en reparacion de plantas de sonidos, se me vino a la mente el tema de la conversion de audio analogico / digital, estuve leyendo que el audio A/D se invierte atraves de un proceso y luego con un DAC decodificas el audio binario para asi obtener un sonido mas limpio por asi decirlo, se me ocurrio usar el PIC16F877A ya que trae un conversor A/D, logre guardar lo que leia como audio por la entrada analogica RA0 y la guardaba en una variable X, luego establecia que el puerto PORTC = X con eso cuando la musica empezaba a correr el PIC enviaba una serie de codigos de 8 bits en binarios por el puerto C, lo hice en fisico y use el fulano conversor DAC0808 para decodificar el sonido y al final el resultado es que no se entendia lo que se estaba escuchando.

La pregunta es, como se puede mejorar ese problema y nos de un audio limpio?


----------



## D@rkbytes (Abr 19, 2016)

Necesitas aumentar la velocidad de muestreo.
Tal vez mejores la calidad del sonido resultante, elevando la frecuencia del oscilador a 20 MHz, que es la frecuencia máxima para ese PIC.
Ésto es para que alcances el tiempo más corto de conversión, unos 100 ns. y con el reloj del conversor en Fosc/2
De esa forma, al hacer la conversión no creo que logres una calidad muy alta, pero posiblemente mejore.

Nunca lo he hecho de esa forma, pero si he realizado muestreos de hasta 44.1 Khz. reproduciendo archivos WAV desde una micro SD y obteniendo el audio por PWM con el oscilador a 48MHz. (Pero todo este proceso es digital)


----------



## torres.electronico (Abr 19, 2016)

Ya hablamos de esto el año pasado y esta el mismo ejemplo 
Lo que no re uerdo es en que carpeta de la pc tengo lo que mejore 

Edit1: aca se arranco hablar del tema:
https://www.forosdeelectronica.com/f24/curso-programacion-pic-picbasic-pro-20658/index139.html

Y estoy buscando en la PC la libreria de DT y ejemplo de esto mismo...la unica manera dr sacar esto adelantr sin implementar C o ASM es justamente con la libreria de DT y drmases que armaron en el foro picbasic... Habia un ejemplo con memoria flash y otro instantaneo (adc-pwm)... Sigo buscando


----------



## torres.electronico (Abr 19, 2016)

D@rkbytes dijo:


> Necesitas aumentar la velocidad de muestreo.



 Tal cual... al parecer esta lenta la captura


----------



## Nano24 (Abr 19, 2016)

torres.electronico dijo:


> Tal cual... al parecer esta lenta la captura
> Ver el archivo adjunto 142663


¿Cómo se haría para mejorar?
¿Como dijo D@rkbytes con un cristal mayor de  20 Mhz?
La verdad tenía años que no entraba a la pagina, por eso no me  había enterado.
Sería interesante si volvieras a subir el programa de  cómo lo mejoraste. 

---------- Actualizado ----------

¿Por casualidad este sirve como conversor AD?
Lo hice hace años con un 40106, le conectaba un micrófono y con una etapa amplificadora por la salida se escuchaba con claridad.


----------



## COSMICO (Jul 1, 2016)

Hola amigos.
Como este tema es de PBP, me paso con esta pregunta.
como se interpretan estas instrucciones de programming editor, PICAXE a PBP

symbol PWMpin = 2 , esta instrucción es válida

PWM (0 a 1016), esta da error. Hay que pasarla a una valida e igual en PBP


----------



## D@rkbytes (Jul 1, 2016)

Si quieres definir un pin para la salida de PWM por software, es igual que definir cualquier otro pin.

Por ejemplo:
Symbol PWMpin = PORTX.X

También se puede de ésta forma:
PWMpin Var PORTX.X

En el documento de ayuda de PBP puedes encontrar información sobre PWM por software.


			
				La ayuda de PBP dijo:
			
		

> *PWM* _Pin_*,*_Duty_*,*_Cycle
> 
> _  Outputs a pulse width modulated pulse train on Pin. Each cycle of PWM consists of 256 steps.
> The Duty  cycle for each PWM cycle ranges from 0 (0%) to 255 (100%)
> ...


----------



## COSMICO (Jul 1, 2016)

Si amigo, ya vi el manual, pero Mi duda, es esta instrucción, que no se que significa
PWM (0 a 1016)
Tal vez quieres decir que el PWM, alcanza máximo 0 a 1016, EN CCP


----------



## D@rkbytes (Jul 2, 2016)

Eso no es una instrucción, es un comentario del programa.


			
				torres.electronico en su programa dijo:
			
		

> pwmout PWMpin,254,pwmval        *' envia el valor equivalente PWM (0 a 1016)*



Enlace del post:
* Variador de frecuencia para Ctrl Velocidad Motor AC *


----------



## COSMICO (Jul 2, 2016)

Jeje tienes razón, ya lo comenté, ahora ya me funciona, pero en la ultima rutina se toma 4 segundos
y no se porque.., bueno, sigo con esto..



descargue el programming editor, y la rutina final .

 pwmout PWMpin,254,pwmval   
 pulsout 3,delay.
Demora 4 segundos, ..


----------



## torres.electronico (Jul 2, 2016)

se ve que cuando arme el topico, se corrio una linea el comentario... o sea, seria es5to lo que se tenia que leer:
*' envia el valor equivalente PWM (0 a 1016)*​


COSMICO dijo:


> Jeje tienes razón, ya lo comenté, ahora ya me funciona, pero en la ultima rutina se toma 4 segundos
> y no se porque.., bueno, sigo con esto..
> 
> 
> ...



Cosmico, tendrias que subir todo tu laburo completo PARA PODER AYUDARTE  en PBP en su momento lo encare totalmente distinto (eeprom lo cabie por data, use lokup,etc etc); pero como ya no tengo la PC que tenia antes, se perdio en el tiempo y espacio 
Saludos a todos, esty reactivandome despacito


----------



## COSMICO (Jul 2, 2016)

Hola Amigo torres, gusto saludarle
voy armarlo en físico, por o menos sólo el PIC y les cuento, voy a ver si es cuestión de simulación...
Este circuito, lo probaste con un motor, me interesa es saber como se hace, me gusta la electronica, y es algo que siempre he tenido en mente para mis ratos libres


----------



## torres.electronico (Jul 2, 2016)

lo probe con una bombita centrifuga de 220v... No era mucha carga y funciono relaivamente bien en un rango de frecuencias... si arranca con frecuencias muy bajas hace ruido feo el motor y tiende a calentar mucho


----------



## COSMICO (Jul 2, 2016)

A que frecuencia de cristal trabajaste el picaxe..
Hay algo, que no entiendo, tienes una tabla, que no veo el programa donde la captura..


symbol VoltsTbl = 0
     eeprom 0,(255,246,237,229,221,214,207,201)
     eeprom 8,(195,190,184,179,175,170,166,162)
     eeprom 16,(158,154,151,147,144,141,138,135)
     eeprom 24,(133,130,128,125,123,121,118,116)
     eeprom 32,(114,112,111,109,107,105,104,102)
     eeprom 40,(101,99,98,96,95,93,92,91)
     eeprom 48,(90,88,87,86,85,84,83,82)
     eeprom 56,(81,80,79,78,77,76,75,74)


----------



## torres.electronico (Jul 2, 2016)

creo que le puse uno de 4Mhz, el pwm lo labure por software, ya que en segundo plano la minima que se puede implementar es de 245Hz (se podria implementar un divisor de frecuencias y asi hacer correr el pwm por hardware, pero no me gusta la idea)... fijate si podes cambiar la etapa de disparo, seria bueno que emplearas unos driver y creo que en el foro hay bastante material disponible como para que armes algo...tendrias que revolver un buen rato


----------



## COSMICO (Jul 2, 2016)

Sigo sin entender, lo de la tabla, lo acabo de pasar a un pic, pero no hace nada en el protoboard, en la simulación por lo.menos, se ve algo...


----------



## COSMICO (Jul 2, 2016)

Lo acabo de simular, en un pic16f876a y esto es lo que sale


----------



## torres.electronico (Jul 2, 2016)

COSMICO dijo:


> Lo acabo de simular, en un pic16f876a y esto es lo que sale



si no mostras todo el trabaj completo, se me dificulta ayudarte...salu2


----------



## COSMICO (Jul 2, 2016)

Parece que este no es el código, después lo subo


----------



## torres.electronico (Ago 21, 2016)

Entre en una duda bastante grande...
Trabajando con el pwm por hardware del 16F876A, configuro la frecuencia de la siguientw manera:
Frecuencia=62500/(PR2+1)
El tema esta en qie de 250hz hasta 6Khz voene perfecto con un cristal de 4Mhz... si le pido mas frecuencia, se ve en la salida un pwm erroneo con saltos de 10-20-30khz- y hasta 60khz 
Mi pregunta es si puede ser el cristal el problema  o se me esta pasando por alto algo...
Saludos


----------



## D@rkbytes (Ago 22, 2016)

Yo creo que si estás haciendo algo mal, porque con un cristal de 4 MHz, se puede llagar hasta unos 83 KHz.
No en todos los casos vas a conseguir frecuencias exactas, pero si aproximadas.
Si lo estás haciendo con HPWM o por software, te recomiendo que mejor uses los registros.


----------



## torres.electronico (Ago 22, 2016)

D@rkbytes dijo:


> Yo creo que si estás haciendo algo mal, porque con un cristal de 4 MHz, se puede llagar hasta unos 83 KHz.
> No en todos los casos vas a conseguir frecuencias exactas, pero si aproximadas.
> Si lo estás haciendo con HPWM o por software, te recomiendo que mejor uses los registros.



 mira, ahi encontre un par de cosas que se me habian pasado por alto y ya las corregi, pero sigo con la misma falla...algo se me esta escapando y seguro que debe de ser una tontera 


```
DEFINE OSC 4            

define ADC_BITS 10      
Define ADC_CLOCK 3       ;
DEFINE ADC_SAMPLEUS 50  
DEFINE CCP1_REG PORTC    
DEFINE CCP1_BIT 2        
DEFINE CCP2_REG PORTC    
DEFINE CCP2_BIT 1         

;****************************************************************
Dato1 var word       ; variable pot.duty ccp1
Dato2 var word       ; variable pot.duty ccp1
Dato3 var word       ; variable aux
Dato4 var word       ; variable pot.frecuencia
FRECUENCIA var word  ; variable aux.frecuencia
FREC1 var word
DUTY1 VAR WORD       ; variable aux.duty ccp1
DUTY2 VAR WORD       ; variable aux.duty ccp2
Dvar var word
Fvar var word
dato0 = 0
dato1 = 0
dato2 = 0
dato3 = 0
dato4 = 250

TRISA = %11111111   ;configuro todo el portA como entrada
TRISB = %00000011   ;configuro portB.0 portB.1 como entrada, el resto como salidas
TRISC = %00000000   ;configuro todo el portC como salidas
portc = %00000000   ;pongo en estado bajo todo el portC

ADCON1 =%10000000   ;configuro A/D 
;****************************************************************

MENU:
 IF PORTB.0 = 0 THEN 
  high portc.7
  goto PWM_ON     ;pulsador de encendido 
 endif
pause 50
GOTO MENU

Inicio:
 IF PORTB.1 = 0 THEN PWM_OFF    ;pulsador de apagado

adcin 1, dato1                 ;leemos el potenciometro del ADC2 para establecer duty CCP2-CCP1
 dato1 =( dato1 / 4)           ;arreglo matematico del valor obtenido por el ADC1

adcin 2, dato2                 ;leemos el potenciometro del ADC2 para establecer duty CCP2-CCP1
 dato2 =( dato2 / 4)           ;arreglo matematico del valor obtenido por el ADC1

adcin 3, dato4                 ;leemos el potenciometro del ADC3 para establecer frecuencia
 dato4 = (dato4 / 4)           ;arreglo matematico del valor obtenido por el ADC3

FRECUENCIA=62500/(dato4+1)    
      
 hpwm 2,DATO2,frecuencia       
 hpwm 1,DATO2,frecuencia        
goto inicio
;****************************************************************
PWM_ON:
 CCP1CON.2=1      ;ACTIVAMOS EL MODULO CCP1 (BIT2)
  CCP1CON.3=1     ;ACTIVAMOS EL MODULO CCP1 (BIT3)
 CCP2CON.2=1      ;ACTIVAMOS EL MODULO CCP2 (BIT2)
  CCP2CON.3=1     ;ACTIVAMOS EL MODULO CCP2 (BIT3)
goto Inicio
;****************************************************************
PWM_OFF: 
  CCP1CON.2=0       ;DESACTIVAMOS EL MODULO CCP1 (BIT2)
  CCP1CON.3=0       ;DESACTIVAMOS EL MODULO CCP1 (BIT3)
  CCP2CON.2=0       ;DESACTIVAMOS EL MODULO CCP2 (BIT2)
  CCP2CON.3=0       ;DESACTIVAMOS EL MODULO CCP2 (BIT3)
 low portc.7
goto menu
;****************************************************************
end
```


----------



## D@rkbytes (Ago 22, 2016)

Es que para hacer lo que viene siendo un "Sweep" o barrido, tienen que estar en sincronía los demás registros.
HPWM no puede hacer un funcionamiento óptimo de esa forma.
Sería mejor que usaras una tabla y que actuaras en consecuencia sobre los registros, ya que por estar fuera de límites obtendrás saltos de frecuencia e inestabilidad.

Si no te interesa el ancho del pulso, puedes usar FreqOut, que genera un rango más estable, aunque no es muy elevada su frecuencia, me parece que hasta 32768 Hz.


----------



## torres.electronico (Ago 22, 2016)

D@rkbytes dijo:


> Si no te interesa el ancho del pulso, puedes usar FreqOut, que genera un  rango más estable, aunque no es muy elevada su frecuencia, me parece  que hasta 32768 Hz.



fue lo primero que `probe, pero en el osciloscopio sale deformada la señal con freqout...



D@rkbytes dijo:


> Es que para hacer lo que viene siendo un "Sweep" o barrido, tienen que estar en sincronía los demás registros.
> HPWM no puede hacer un funcionamiento óptimo de esa forma.
> Sería mejor que usaras una tabla y que actuaras en consecuencia sobre los registros, ya que por estar fuera de límites obtendrás saltos de frecuencia e inestabilidad.



interesante dato que no tenia ni la mas palida idea...  ahi con la modificacion si configuro pr2 de 230hz hasta 5Khz funciona perfecto... si hago el calculo para 230hz hasta mas de 5Khz se descontrola... Ahora, si muevo el valor maximo de PR2 (que seria el minimo de frecuencia) y lo dejo para arrancar en 600Hz, lo llevo hasta 9Khz tranquilamente sin descontrol... Voy a mirar las variables detenidamente, quizas tenga que hacer un parchecito y pueda controlarlo... Esta la libreria de DT para pwm por hardware (16F87X), pero me quedo en la PC de escritorio que quedo en la que era mi casa... o sea, esa PC no la recupero mas 
La busque nuevamente, pero no la encontre mas por uqe no esta mas la pagina de Darrel Taylor 
esta relativamente buena, por que con tan solo dos variables, controlabas el pwm por hardware.
vamos a ver como encaro este tema


----------



## ricbevi (Ago 23, 2016)

torres.electronico dijo:


> fue lo primero que `probe, pero en el osciloscopio sale deformada la señal con freqout...
> 
> 
> 
> ...



Hola...torres.electronico¿Si entras acá no podes recuperar/obtener algo de la pagina que buscas?
Saludos.

Ric.


----------



## Alcocer Garcia Felix Davi (Ago 27, 2016)

Buen día. Miren, éstos archivos de comunicación serial del PIC funcionan perfectamente, ya que cuando envío vía serial de visual studio 6.0, funciona, pero si envió de MatLab al PIC, no me funciona.
¿Por qué pasa ésto?

Gracias. Adjunto programación.

La programación en MatLab, es :

```
ps = serial('COM5');    %se crea un objeto que representa el puerto
set(ps,'Baudrate',9600);   % se fijan las caracteristicas del objeto (no es necesario, estas están por default)
set(ps,'DataBits',8);
set(ps,'Parity','none');
set(ps,'StopBits',1);
set(ps,'FlowControl','none');
fopen(ps);              % se abre el objeto para poder utilizarlo

    fprintf(ps,'%s','1')     % se envia un dato de tipo entero sin signo de 8 bits, por el objeto ps
  
fclose(ps);       % se cierra el objeto; si no se cierra y luego se intenta abrir de nuevo, este puerto se bloquea
delete(ps);
clear ps
```


----------



## pepibho (Sep 8, 2016)

torres.electronico dijo:


> Entre en una duda bastante grande...
> Trabajando con el pwm por hardware del 16F876A, configuro la frecuencia de la siguientw manera:
> Frecuencia=62500/(PR2+1)
> El tema esta en qie de 250hz hasta 6Khz voene perfecto con un cristal de 4Mhz... si le pido mas frecuencia, se ve en la salida un pwm erroneo con saltos de 10-20-30khz- y hasta 60khz
> ...




El follo de que varíe la frecuencia tiene que ser otra biblioteca que cargas y te varia el prescaler de tmr2

Tanto prescaler como pr2 son para ajustar la frecuenciia

Frecuencia = 1/(((fosc/4)/prescaler)/pr2)

Las ecuaciones suelen estar en la documentación del integrado en la sección de control pwm


Bueno igual ahora mismo equivoco ccpr1l ccpr1h con pr2.   
Unos sirve para limitar el contador de 16bit 65535 y que cuente solo asta 100. Y pr2 modula pwm

Si quisieras para ajustar pwm para una frecuencia tendrías q jugar con el largo q cuenta tmr2 y una operación para ajustar el duty para que de ajuste el tiempo de pulso alto igual al bajo aun variando el limite del cotador tmr2.

Y puestos a meditar en tres cerveza y cerveza.

Para picbasic y poder ajustar rápido la frecuencia de salida con tmr2
Tendrías que definir una variable de 16bit (llamarla frecuenout, por un poner) creas dos alias de los 8 bit altos y los 8 bit bajos como constantes de ccpr1h ccpr1l.
Si no pasas de 2048 puedes ajustarla a pr2 con la instrucción de des lazar bit ala derecha (es igual a dividir entre dos) recuerda q pr2 pbp la interpreta como 16bit solo q al pasarla al pico solo maneja 10bit si el valor es mallor el pic se cuelga
Si la frecuencia es muy alta con prescaler 1:1 pasa a 4:1
Con un cristal de 4mrz tampoco vas a manejar un rango de frecuencia muy alto pero para 5khz creo q de sobra.

Otra cosa q hay q contar si se usa una biblioteca para el puerto PSI los baudios de comunicación están vinculados a tmr2 y modifican ccpr y el prescaler. El pos escales no creo q te interese manejarlo solo es otra reducción mas de la cantidad de veces allá terminado tmr2 en hacer un ciclo. Permite lecturas de comparación de comparación cada x ciclos pwm 1a16
Espero no averme esplallado mucho

Un saludo


----------



## torres.electronico (Sep 8, 2016)

No estoy usando otras librerias, pero ni bien me libere de mis bolonquis, retorno a la electronica.


----------



## pepibho (Sep 13, 2016)

torres.electronico dijo:


> No estoy usando otras librerias, pero ni bien me libere de mis bolonquis, retorno a la electronica.




los comandos especiales de pbp son subprogramas que ensambla pbp configurando ccp1con y demas rejustrios. hpwm  es por hardward pero hay que definirlo al principio no ace palta tocar ccpcon solo definiro al principio ya ajusta el. 
de la manera que intentaste hacer me gusta mas por poder manejar dorectamente el largo que cuenta tmr2 y el duti como bariables eso quiere decir que en 2 procesos puedes canviar un balor o ala hora de convinarlo solo vas ser dos procesos mas no la carga de una subrrutina entera que ocupe 180 instrucciones (por un poner)
la que si no me equivoco es por sofhtwad es pwm asecas (que yo recuerde)

otra cosa es que definir esto
 CCP1CON.2=1      ;ACTIVAMOS EL MODULO CCP1 (BIT2)
  CCP1CON.3=1     ;ACTIVAMOS EL MODULO CCP1 (BIT3)
pbp entiende que primero camvias el bit de memoria de ccp1con.2 que son 3 procesos
y despues cambias ccp1con.3 otros 3 procesos, los compiladores no suelen simplificar eso 
si vas a ponerlo en marcha del tiron (yo octo por el binario por ser mas facil de contar y poner un 1 o 0) y seria poner ccp1con=%00001100. de esta manera solo seria cargar directamente la bariable ala ram ccp1con (es una ram de funciones o interrutores que enciendes y apagas dentro) esto compilado son solo 2 procesos de los 6 que pides al acerlo por separado.

esta bien el entralazado entre inicio y menu es buena idea. otra donde comes muchas instrucciones es en dividir entre 4. fastidia cuando hay que dividir entre 3, 5 o 7, pero cuando es dividir entre 2 o 4 se usa el comando >>  (menudocomando) en una bariable lo que ace es desplazar los bit acia un lado o el otro como multiplicar entre dos o dividir la bariable entre dos.
ejemplo:
dato1=dato1>>2
pbp lo que ba acer es desplazar dos veces los bit de esa variable ala derecha como dividir entre 4. como es una instruccion propia del pic mover un paso los bit ala dereche come 2 procesos como cualquier bariable pero as poner que mueva dos veces lo que repite este proceso dos veces lo cual que comeria 4 procesos la instruccion (si pusiera 6 comeria 12 procesos)  una division solo por tener que crear la matric de division te come unos 80 procesos

los procesos es algo que se nota al compilar el pic. pongamos si la memoria de un pic es de 1024 instruciones de comando o procesos de comando (puedo estar en errata esplicandome) de esos 1024 x se usan para configuracion de intcon, tmr1con ccp1con y todas las demas instruciones de configuracion, esas ya simplemente ocupan asi que de 1024 quizas solo tengas 990 para las instruciones que le añadas tu desde el compilador (instrucciones o procesos como quieras llamarlo) 

la cuestion que cuanto mas depures el programa mas rapido correra mas espacio de codigo te sobrara para menus obciones etc. lo que interesa de tener el programa bien depurado en el pic es que pueda dar su resultado de insofacto como mucho contar con unas millonesimas de rertaso y algunas veces casi no puedes contar con eso y te quedas en unas nanonesimas de segundo y por eso aveces se suben los osciladores a 16 y muchos mas Mhz. aunque para algo sencillo a 4 o 8mhz esta de sobra y se consume menos corriente

un saludo, y aver lo que me suelta algun corrector de estos


----------



## torres.electronico (Sep 13, 2016)

Hola amigazo, estoy construyendo mi casa y lobque va a ser la nueva ofi, laboratorio y taller; Tu aporte merece el 100% demi atencion, prometo que ni bien me libere de mis cosas vuelvo al tema y lo re leo. Muchas gracias por tu aporte


----------



## pepibho (Sep 14, 2016)

yo tampoco es que sea un filirhranas con la programacion y aveces ago buenos garimatias

esto que voy a pasar seria el principio e un regulador de luz por PWM de los comunes ue suelo montar con el 12f683 que es un modelo pequeño y barato (o porque melo tope barato)


```
contador var word
tiempo var word
infra var contador.byte0
estado Var byte
m1 var estado.bit0
m2 var estado.bit1
errorp var estado.bit2
tiempos var estado.bit3
enc0 var estado.bit4
enc1 var estado.bit5
encm var estado.bit6
enca var estado.bit7
luz var ccpr1l
parada var byte
retraso var byte
temp1 var byte
temp2 var byte
temp3 var byte
temp4 var byte
temp5 var byte
indica var byte
luztemp var byte
reten var byte
pulso var byte
boton var byte
casilla var byte
codigos var byte [12]
codigo var byte [7]
'
' alias de pin's
'
port_piloto var gpio.5 ' bit conectado al led, indicaciones
port_pulsar var gpio.4 ' bit usado para el pulsador independiente
port_ir var gpio.3 ' bit usado para el re eptor infrarrojo
port_encoderA var gpio.1 ' encoder pin desplazamiento A
port_encoderB var gpio.0 ' encoder pin desplazamiento B
'
' registro configuracion inicial
' 
status=%00000000
option_reg=%00000110 ' configuracion de interruciones primarias
intcon=%00000000 ' configuracion de estatado de interrucciones primarias
pie1=%00000000 ' configuracion de interruciobes perineales
pir1=%00000000 ' estado de las interrucciones perineales
pcon=%00000001 ' configuracion del encendido
eecon1=%00000000 ' configuracion de etado de la eepron
osctune=%00000000 ' configuracion calibrado fino del oscilador
osccon=%01110000 ' configuracion del oscilador
t1con=%00100001 ' conpiguracion temporizador 1, TMR1
t2con=%00000000 ' configuracion temporizador 2, TMR2
cmcon1=%00000000 ' configuracion del comparador por TMR1
ccp1con=%00111100 ' configuracion del registro de control ccp1
cmcon0=%00000111 ' configuracion del comparador operacional
vrcon=%00000000 ' configuracion del voltage de referencia del comparadoronfiguracion del comparador operacional
adcon0=%00000000 ' configuracion de las entradas analogicas
ansel=%00000000 ' ajuste de las entradas analogicas
'
'eedat=0 ' bariable que lertura o guardado de la eepron
'eeadr=0 ' direccion donde se almacena en la eepron maximo 255
'
' definicion de puertos inicial
'
trisio=%010011 ' define los bit del puerto entrada o salida
gpio=%010011 ' define los bit del puerto
wpu=%010011 ' define los pull up del puerto
ioc=%000000 ' define como marca de interruccion los bit del puerto
'
pr2=40 ' maximo del contador timer2
'
'ON INTERRUPT GOTO interrucciones 
'
tiempo=0
casilla=0
estado=0
retraso=0
'
' carga los valores de control de la eepron y vefifica q sean correctos
'
read 10, luz
gosub cargarcodigoIR
ccp1con=%00111100 ' activamos PWM
t2con=%00000100 '
'if codigos[0]=0 or codigos[0]=255 then gosub almacena_infra
'
' bucle programa
'
programa:
if port_ir=0 then gosub infrarrojos ' lectura infrarrojos
if pir1.0=1 then 
    gosub temporizadores ' retrasos  y contador tiempo
    gosub pulsador ' pulsador
endif
if port_encoderA=0 then ' lectura encoder rotativo
    if port_encoderb=0 then gosub encoderrota 
endif
if boton>0 then gosub tecla ' acciones
goto programa
```


--- un descuido arranco la configuracon pwm despues de la carga de la eepron por el ruido que pueda generar la portadora pwm al estar funcionando y mas con cargas de 2 a 6A y fallen los condensadores por uso. (permite una carga correcta al arrancar)

que al final estuve biendolo ahora y ccpr1h ccpr1l se encargan del contadorpara disparar el pulso pwm y pr2 el que lo arma de nuevo o limita el contador tmr2 para no contar hasta 65535 en mi caso contar solo asta 40, para conseguir una portadora de 50khz configurando el oscilador a 8Mhz.

lo que me imagino que tendras que hacer seria esto. (o algo asi)


```
frecuenciaout VAR word
ccpr1h CON frecuenciaout.byte1
ccpr1l CON frecuenciaout.byte0
pr2 CON frecuenciaout>>1
```

que tampoco se muy bien si funcionara de esta manera. si no, una rutina para modificar ccpr1h ccpr1l y pr2 que seria la mitad, esto cada vez que modifiques el valor de frecuencia.
no creo que sea necesario parar el modulo tmr2 para cambiar de frecuencia sin parar. porlomenos yo no suelo parar nada al cambiar el largo de pulso de 3 a 37.

un saludo


----------



## pepibho (Sep 15, 2016)

y reflexionandolo hoy creo entender porque quedan mejor la rutina de interruciones definida al principio y el bucle de programa abajo.. si entra por una falla o desvordamiendo y no detecta la linea de donde salto saldria de la subrrutina interrucion  de seguido no volveria sino que se terminaria, de esta manera pasaria a entrar directamente en el bucle programa.

pongamos que esto sucederia en interruciones por perdida de energia o el perro de guardia que tambien te devolveria a programa.
la verdad que es una cosa que nunca seme dio por acer. las interruciones siempre las ponia al final de todo el programa, es mejor definirlo todo cargar las bariables de arranque o lo que sea y un salto de linea a main o programa o como sete antoge llamarlo, la cuestion que cuando el compilador le eche el guante compile al principio la rutina de interrucciones o el programa por interruciones de hardwar.
pensar que las interruciones es una linea de proceso que incrmenta cala x procesos que sea la instruccion que usemos eso agranda mucho el programa.  
pongamos que electronicamente una interrucion es un comando que compara si el bit final de interruciones esta auno y si es asi guarda la linea en la que estaba y salta ala linea asignada para despues retornar ala linea guardada y proseguir el programa por donde iba, entonces tambien se puede jugar con ella en basic o c para desastibar ese comando en una o barias instrucciones.. aunque electricamente por x o por b porde fallar.. por eso el de poner interruciones primero y programa despues. al no aver almacenado el partido o estar a cero prosigue de largo y entraria en el bucle programa.

un saludo. espero que alguien detalle mejor eso


----------



## Dario (Oct 5, 2016)

Hola gente!!! gracias don moderador por el baneo!!! para empezar, queria contarle que no venia a que nadie me haga las cosas sin tener que hacer yo ningun esfuerzo de mi parte, esa no es mi costumbre y ud lo sabe. solo pregunte si alguien tenia una idea de como se hacia y compartiera su comentario, no TRABAJO. pero dejando de lado a nuestro impulsivo moderador,  les cuento que estuve quemandome los cesos y las cejas buscando informacion, leyendo mis libros de programacion y ya encontre la forma de hacer lo que pregunte utilizando pbp para programar. a los que no saben porque no vieron mi pregunta anterior, les cuento que estaba intentando hacer un circuito con pic, que grabara los movimientos de un servomotor y despues los reprodujera automaticamente, algo como el video que les dejo abajo. ese trabajo fue hecho con arduino, sistema de programacion que detesto, pero aqui les dejo un demo de mi trabajo con el codigo y una simulacion en proteus 8.1 hecho con un pic16f628a programado en pbp. bueno, les cuento que cuando termine mi trabajo, lo voy a compartir aqui para que sea una solucion mas, flotando en el mar de post´s sin solucines que es este foro... bueno, como siempre les digo, muchas gracias y a esperar un poquito, en breve estara completo.
Saludos don moderador, no borre este post, tiene un aporte importante!!! 


```
'configuracion de fuses
@ DEVICE MCLR_OFF, XT_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
define osc 4 
CMCON = 7   
TrisA = %11111111             'todo el port A como entrada
TrisB = %00000000               'todo el port B como salida
PORTA = %11111111             'todo el port A en 1
PORTB = %00000000           'todo el port B en 0

touch  var porta.0
knob   var porta.1
play   var porta.2
stp    var porta.3
servo  var portb.0
vpot   var byte
memo   var word(20)

clear

inicio:
if stp = 0 then inicio
gosub leepot
pulsout servo,vpot
if touch = 0 then graba1
if play  = 0 then reprod
goto inicio

graba1:
gosub rebote
gosub leepot
memo(1)=vpot
pulsout servo,memo(1)
if stp = 0 then graba2
goto graba1

graba2:
gosub rebote
gosub leepot
memo(2)=vpot
pulsout servo,memo(2)
if stp = 0 then graba3
goto graba2

graba3: 
gosub rebote
gosub leepot
memo(3)=vpot
pulsout servo,memo(3)
if stp = 0 then inicio
goto graba3

reprod:
if stp = 0 then inicio
gosub rebote
pulsout servo,memo(1)
gosub pausa
pulsout servo,memo(2)
gosub pausa
pulsout servo,memo(3)
gosub pausa
goto reprod

pausa:
pause 1000
return

leepot:
pot knob,127,vpot
vpot = vpot /3+100
return

rebote:
if touch = 0 then rebote
if play = 0 then rebote
if stp = 0 then rebote
return
end
```


----------



## pepibho (Oct 5, 2016)

al principio cuando empece con el picbasic solia tirar de esos comandos de esos muy elaborados (pero siempre terminan dando unas pucetas a largos plazos) para salir del paso aveces estan bien.

al final acia un bucle coo el de la interruccion que para dos servos y un cristal de 4mhz me daba una resolucion de posiciones curiosas y si no un oscilador de 8 o 10mhz.
aun asi si no recuerdo mal creo que a 4mhz no desbordaba de 248 el servo en su maxima posicion contando los 500uS que necesita antes de medir el largo del pulso..

mi idea (seme ocurrio ahora) es usar tmr0 como mandato para el pulso de los servos. se ajusta para que tarde 600uS +- para que despues salte automaticamente por interruccion tmr0 y quede parado el programa mientras da el largo de los pulsos, esto permitiria que el programa solo se detuviera 1000 microsegundos uS cada vez que quiero que el servo se verifique, los interbalos de tiempo entre barrido y barrido a los servos minio uos 70hez. poco mas de 10mS aunque seguro que los puedes acer as frecuentes. usa si eso timer 1 para ajustar la frecuencia de reueo de puertos A/D y servo todo en una creo que lo aria.

piensa que al usar el comando pot (tambien lo usaba al rincipio asta darme cuenta que no...mas si el integrado tiene entradas a/d) el comando pot es un comando elaborado. constaria de un contador donde descarga un condensador y se pone a cargarlo mientras cuenta cuanto tiempo tarda en dar un bit 1. 
vamos que no estas usando el puerto a/d del 16f628a (recuerda que este pic su puerto a del 0 al 4 son solo entradas no entregan corriente para dar un pulso al servo como salida)


```
status=%00000000
option_reg=%00000000 ' tmr0 ajustado para los largos de pulso de los sevos
intcon=%10010000 ' 



programa:


if portb.7=0 then
    'esto se añadiria en algun momento del programa
    'para dar la orden de iniciado de losservos
    '
    portb=portb & %01110000 ' se ponen los pines de los servos a uno
    tmr0=10 ' ajustamos como tiempo del pulso minimo el servo
    intcon.5=1 ' se actiba la interruccion tmr0
    '    
    ' lo puse como un pulsador por poner, si usas esto no mezcles pause
    ' ni instrucciones especiales de picbasic
endif
goto programa


'
' 
' control de interrucciones
'
'
DISABLE
interrucciones:
if intcon.2=1 then ' de esta manera para no alterar otras interrucciones
    for temp1=0 to 255 ' ajustar para el largo el pulso del servo (maximo)
        if servo1=temp1 then low portb.4
        if servo2=temp1 then low portb.5
        if servo3=temp1 then low portb.6
' añadir un pauseus si el tiempo desborda de 8bit no se mueve gran cosa
    next temp1
    intcon=intcon | %00100010 ' boramos bandera tmr0 y la interruccion
endif
```

y bueo esta asi un poco echo alo chapuza. aun asi la parte del for next de los servos puedes acerla en una subrrutina aparte no como puse en plan interruccion (yo porlomenos en antao la tengo echa asi) pero esta fue una ocurrencia para ahorrar de esperar esos 600mS y estar con otras instrucciones )aunque quizas no merezca la pena malgastar tmr0 para ello y esperar ese tiempo..

piensa que un servo o casi todos mas o menos (no es que vengan ala gran perfeccion calibrados relacion tiempo 500 microsegundos seria el largo de pulso para aceptarlo y despues el serbo se posiciona de ocquierda o derecha en un largo de un pulso de 1000microsegundos o 1milisegundo (que es lo mismo) pero que no tiene que ser exacto exacto. vamos topar algo tan exacto seria un milagrio alo de mas nos adactamos.

lo que se que usando esas instrucciones que son pila practicas tardas mucho entre lecturas y barridos.  aparte en el video el programa de memorizado descartaba movimientos pequeños slo almacenaba donde paraba un tiempo.. (abria que acer algo para simplificar o comprimir la informacionde movimiento)

lo otro que para memorizar muchos movimientos y reproducirlos necesitarias mejor una eepron externa.

si te dgo la verdad ver en el video como simula las posiciones quele mandas directamente (aunque con algo de reraso entre ecturas y barridos) la verdad ue mola. jejejeje

si tienes algun circuito de practicas con lcd o display te aconsejaba practicar a manejar la entradas analogicas del pic.

pero no me paree que te allas calentado mucho las pestañas para hacer eso, jejejeje

un saludo



y digo que daria tiempo a acerlo todo en una. por que e los - de 600 milisegundos de pulso minimo que contaria tmr0 daria tiempo hacer las lecturas de las tres entradas analogicas y mas con un cristal de 10mhz. o eso creo..


----------



## torres.electronico (Oct 5, 2016)

Tranqui Dario con el foro; Si crees que hay mejores foros, ya sabes a donde teclear para ir a esos foros... Aca no hay un mar de temas sin solucionar; Pasa que no todos tenemos tu mismo tiempo y ya que vamos al caso, si re lees tu anterior topico, no compartis nada y solamente pedís que te den una mano... Si vamos a las normas de participación, el moderador trabajo dentro de reglamento y no lo veo impulsivo su actuar... 
Respecto al tema de los servos, hay in hilo con ejemplo en este tema al respecto de Reymi





pepibho dijo:


> .
> 
> piensa que al usar el comando pot (tambien lo usaba al rincipio asta darme cuenta que no...mas si el integrado tiene entradas a/d) el comando pot es un comando elaborado. constaria de un contador donde descarga un condensador y se pone a cargarlo mientras cuenta cuanto tiempo tarda en dar un bit 1.
> vamos que no estas usando el puerto a/d del 16f628a (recuerda que este pic su puerto a del 0 al 4 son solo entradas no entregan corriente para dar un pulso al servo como salida)
> ...



 el 16f628 no tiene CAD


----------



## papirrin (Oct 5, 2016)

yo si vi el mensaje de dario el que supongo moderaron o banearon, pero no comente nada porque es un tema supervisto, no hay mas que leer tres potenciometros e igualar al servo, cuando cambia el valor de dos potenciometros o tres se guarda en memoria del primero para que se reproduzca en forma automatica.

ese proyecto es mas practica que utilidad puesto que los servos son bastante imprecisos con respecto a un motor de pasos el que pudiera tener encoders y bla bla bla,

asi que yo tampoco creo que el moderador fuera impulsivo y mas bien el tema esta un poco fuera de lugar, pero en fin comento esto no con animo de agraviar a nadie, mas bien que seamos un poco mas tolerantes con eso de que nos moderen, a mi en realidad no me importa que me manden un mensaje a moderacion.


----------



## reyvilla (Oct 9, 2016)

Buena compañeros un cordial saludos a todos, mucho tiempo sin comentar por aca por crecimiento personal y profecional. Ya teniendo tiempo empezare de nuevo compartiendo de a poco con ustedes mis aportes y conocimientos sobre PBP y buscando apoyo como antes. De momento quería referir a mi amigo D@rio el aporte que realice hace un tiempo años ya a tras sobre un sistema que implemente sobre un brazo con servo motores donde dejo incluso un vídeo y archivos de simulación y código. Seguramente no se recordó mucho al respecto debido al tiempo fue en el 2012 y no recuerdo si fue muy relevante en ese momento en fin amigo te dejo el mensaje y aunque no esta del todo completo o depurado el proyecto me gustaría retomarlo para depurarlo en conjunto ya que es bien interesante llegar al nivel del vídeo o incluso mas alla...Bueno por ahora esto Saludos y éxitos 

_https://www.forosdeelectronica.com/f24/curso-programacion-pic-picbasic-pro-20658/index83.html#post612027_

Un poco de inspiracion...


----------



## callecuatro1976 (Oct 16, 2016)

Hola! consulta que no me doy cuenta porque no anda, estoy aprendiendo en basic y este voltimetro no me funciona, si me pueden indicar porque , saludos


----------



## nelson enrique llontop (Oct 19, 2016)

hola ,bueno soy nuevo en esto de la programacion en pbp,quisiera una ayuda ,estoy en la implementacion de un programa que me permite cambiar desde pc numeros  decimales de 4 digitos  y aparescan en 4 displays de 7 segmententos estoy  usando el modulo usart  de pic 
18f2550. el problema es que hay una nueva entrada decimal que tengo que agregar para controlar el parpadeo de de los 4 digitos en el los display , con 1 parpadean y con 0 regresan a su estado normal osea se detiene  parpadeo ,y cuando estan parpadeando los display  asu vez cambien si yo envio denuevo otros digitos por pc  .
al parecer creo que  etngo qu ehacer interrupciones con usart . sime podrian ayudar con alguna informacion o algun ejemplo les estaria agradecido .


espero su respuesta


----------



## D@rkbytes (Oct 19, 2016)

nelson enrique llontop dijo:


> Estoy en la implementación de un programa que me permite cambiar desde la PC, números  decimales de 4 dígitos  y aparezcan en 4 displays de 7 segmentos.
> Estoy  usando el modulo USART de PIC18F2550.
> 
> El problema es que hay una nueva entrada decimal que tengo que agregar para controlar el parpadeo de de los 4 dígitos en el los display, con 1 parpadean y con 0 regresan a su estado normal.
> ...


Busca en la hoja de datos sobre los registros que debes usar para la interrupción por recepción.
Para recibir los datos puedes usar la instrucción "HSerIn", porque te permite usar varias variables.


----------



## nelson enrique llontop (Oct 20, 2016)

¿Cómo está, D@rkbytes?
He revisado lo que me indicó sobre los registros de interrupción y pues no tengo muy claro el registro PIR1.5, que es el bit RCIF (Flag de recepción por USART)
No sé cómo acomodarlo en mi programa.

Estoy haciendo un pequeño programa con un solo display de 7 segmentos.
Este programa envía 2 dígitos por el puerto serial, el primer dígito  es el del dato que se va a mostrar por el display y el segundo es el del parpadeo.
Si es 1 parpadea y si es 0 deja de parpadear.

Lo que no puedo lograr, es que cuando esté parpadeando cambie el dato si le envío uno nuevo por serial, ya que se queda en el bucle del parpadeo.

Quisiera que me ayude en la distribución de los comandos  como el On interrupt, Disable, Resume y Enable,  y por supuesto el flag de recepción que no lo tengo muy claro.

Le adjunto el programa para que lo revise y me pueda ayudar, y si tiene alguna información para leer y comprender todo lo referido, sería genial.

```
DEFINE OSC 20
DEFINE LOADER_USED 1 
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h      ' add TXSTA value, high speed
DEFINE HSER_SPBRG 32       ' add SPBRG value
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1

RCSTA = %10010000          ;CONFIGURACION DE LA USART, 
TXSTA = %00100000 

INTCON = %11000000         'CONFIGURACION DE LA INTERRUPCION USART 
PIE1   = %00100000
SYMBOL RECEP  = PIR1.5     'FLAG DE RECEPCION USART
on interrupt goto INICIO

HIGH PORTC.2               'enable 
HIGH PORTC.4               'strobe
DAT   VAR PORTC.0          'data
CLK   VAR PORTC.1          'clook

DS1  VAR BYTE
A    VAR BYTE
UNO  VAR BYTE


 
RECEP = 0
DISABLE
INICIO:
HSERIN [DEC1 DS1]
HSERIN [DEC1 uno]

IF UNO = 1 THEN   INTERMITENTE
IF UNO = 0 THEN    MUESTRA 
CONVERTIR:
eeprom 0,[0]
LOOKUP DS1,[191,134,219,207,230,237,252,135,255,231,0],A
write 0,a
read  0,a
SHIFTout DAT,CLK,1,[A]
GOTO INICIO 

INTERMITENTE:
read  0,a
SHIFTout DAT,CLK,1,[A]
pause 200
low 300
pause  200
high 300
pause 200
GOTO INTERMITENTE

MUESTRA:
read  0,a
SHIFTout DAT,CLK,1,[A]
GOTO CONVERTIR 
RESUME 
ENABLE
```


----------



## D@rkbytes (Oct 20, 2016)

En realidad es muy sencillo y no se usa mucho código por lo mismo.
La interrupción por recepción del módulo EUSART es similar a las demás interrupciones.
Pero en éste caso el bit o bandera RCIF se pone en cero cuando se lee el buffer RCREG.

Te adjunto un ejemplo para que entiendas el proceso.
PD:
Así como no usaste resistencias para el display, también te recomiendo que en la simulación no uses el MAX232 y conectes el COMPIM directamente al PIC.


----------



## pepibho (Oct 21, 2016)

Pues hoy me toca rectificarme en el tema de controlar un led rgb con tmr0 y la lectura ir. A 8mhz conseguí justo pero si se pueden trabajar bien ambas cosas con una portadora pwm de 1khz y una definición del duty de 100. Pongamos q*UE* ya tengo el motor funcionando ahora solo faltan los pequeños detalles y mariconadillas para hacer un modulo algo chachi..

Los cálculos. (No suelo andar con ecuaciones complejas q*UE* no se manejar)
Seria esto....

tmr0 interruccion control RGB

 +  2.000.000,00000000 un cuarto osc 
 /          2,00000000 tmr0 2:1 prescaler
 --------------------- 
 +  1.000.000,00000000 
 /          9,00000000 tmr0=247
 --------------------- 
 +    111.111,11111111 frecuencia tmr0 interrupciones
 /        107,00000000  escala pwm 
 --------------------- 
 +      1.038,42159917 frecuencia final pwm


procesos ic entre interruccion tmr0

 +          9,00000000 tmr0=247
 *          2,00000000 prescaler 2:1
 --------------------- 
 +         18,00000000 
 *          4,00000000 un cuarto osc
 --------------------- 
 +         72,00000000 procesos por interruccion tmr0
 -         36,00000000 procesos ocupa interrupción tmr0 pwm
 ----------
36,0000000 procesos restantes


Conté q*UE* son 36 procesos la inter*RUP*ción trm0 pero realmente andarán entre 20 y 30 nunca se dan todas las decisiones al mismo tiempo lo cual sobran mas de 36 procesos para correr el programa normal....

Después si puedo o me dejan procederé a pasar el programa. Preparado para ir mejorando las costillas q*UE* lo *H*aran mas chachi. Co*M*o memoria de colores el control del le*D* blanco de iluminación por pwm interno y bueno dejando el pin gpio.2 libre o con un le*D* por el momento..

Un saludo

Puse un largo de duty en 107 cuando no voy a subir duty a mas de 100 para el rojo quizás 94 de máximo. Eso sera un truquito para ada*P*tar las corrientes de los di*S*tintos colores al transformador q*UE* suele ser de 12.5v y para q*UE* puedan rebajar bien los cuerpos inductores q*UE* estabilizaran la modulación de pulsos en una corriente muy estable y poco rizado por la modulacion.

Un saludo


----------



## PMENACHOC (Oct 21, 2016)

*M*as que hacer una pregunta*,* sólo diré*,* gracias D@rkbytes*,* por la ayuda de PICBasic*.*
*P*asarlo aP[/SIZE]roton IDE no fue muy difícil, sólo tu*v*e q*ue*hacer unos cambios, pero la interrupción serial corre muy bien*.*


----------



## nelson enrique llontop (Oct 22, 2016)

D@rkbytes dijo:


> En realidad es muy sencillo y no se usa mucho código por lo mismo.
> La interrupción por recepción del módulo EUSART es similar a las demás interrupciones.
> Pero en éste caso el bit o bandera RCIF se pone en cero cuando se lee el buffer RCREG.
> 
> ...




Muchas gracias, mi estimado, su ejemplo ha sido importante para comprender la interrupción, 
pero tengo otro detalle.
Sería muy amable de su parte si me ayuda, ya que usted es un experto.

Le cuento que hago la interrupción de recepción por usart, pero no retorna al bucle donde éste empezó.
No sé qué problema puede ser. A ver si me da una mano.

Le dejo el programa de prueba.

```
HIGH PORTC.2               'enable 
HIGH PORTC.4               'strobe
DAT   VAR PORTC.0          'data
CLK   VAR PORTC.1          'clook

DS1     VAR BYTE
A       VAR BYTE

RCSTA = %10010000          'Enable serial port and continuous receive, 
TXSTA = %00100000          ' Enable transmit and asynchronous mode 

INTCON = %11000000         'CONFIGURACION DE LA INTERRUPCION USART 
PIE1   = %00100000

on interrupt goto INTER


A = 63
SHIFTout DAT,CLK,1,[A]
INTERMITENTE:
read  0,a
pause 200
low 300
pause  200
high 300
pause 200
GOTO INTERMITENTE

DISABLE
INTER: 
PIR1.5 = 1                       
HSERIN [DEC1 DS1] 
eeprom 0,[0]
LOOKUP DS1,[63,6,91,79,102,109,124,7,127,103,0],A
write 0,a
read  0,a
SHIFTout DAT,CLK,1,[A]
ENABLE 
RESUME  
END
```


----------



## D@rkbytes (Oct 23, 2016)

No, muy mal.
Necesitas poner mas atención sobre las configuraciones de los registros usados en el ejemplo que subí.
De esa forma no va a funcionar tu programa.

El bit 5 (RCIF = EUSART Receive Interrupt Flag bit) del registro PIR1 es el que necesitas comprobar para verificar si existió interrupción por recepción.


			
				La hoja de datos dijo:
			
		

> 1 = The EUSART receive buffer, RCREG, is full (cleared when RCREG is read)
> 0 = The EUSART receive buffer is empty


[/COLOR]
Ese bit se pondrá en 1 cuando contenga datos, tú no debes establecer esa condición.

Hay mas problemas en tu programa y te recomiendo que le des una buena leída a la hoja de datos.


----------



## pepibho (Oct 31, 2016)

*P*ues ya de vuelta*.* *V*oy exponer c*ó*mo qued*ó* el programa en basic. *F*unc*i*ona perfectamente.


```
'regulador 3 pwm para led rgb con 12f683
'
'
' define osc (8)
'
' defnicion de variables y bit alias
'
' variables variadas
estado Var byte  ' bit de marcas de memoria
tiempos var estado.bit0
secuencias var estado.bit1
pulsado var estado.bit2
m2 var estado.bit3
tiempo var word
temp1 var byte
temp2 var byte
temp3 var byte
' bariables para PWM rgb
PWMrgb var byte
PWMled1 var byte
PWMled2 var byte
PWMled3 var byte
' variables de infrarrojo
contador var word ' aprovechos su alias como punto para retrasos y infrarrojos
infra var contador.byte0 ' esto permite reducir muchos la bariable 16bit
pulso var byte
boton var byte
casilla var byte
codigos var byte [14]
codigo var byte [7]
'
' alias de pin's
'
port_piloto var gpio.1 ' bit usado para el pulsador independiente 
port_ir var gpio.3 ' bit usado para el re eptor infrarrojo
port_led3 var gpio.4 ' control pwm led3
port_led2 var gpio.5 ' control pwm led2
port_led1 var gpio.0 ' control pwm led1
'
' registro configuracion inicial
' 
status=%00000000
option_reg=%00000000 ' configuracion de interruciones primarias
intcon=%00000000 ' configuracion de estatado de interrucciones primarias
pie1=%00000000 ' configuracion de interruciobes perineales
pir1=%00000000 ' estado de las interrucciones perineales
pcon=%00000001 ' configuracion del encendido
eecon1=%00000000 ' configuracion de etado de la eepron
osctune=%00001100 ' configuracion calibrado fino del oscilador
osccon=%01110000 ' configuracion del oscilador
t1con=%00100000 ' conpiguracion temporizador 1, TMR1
t2con=%00000000 ' configuracion temporizador 2, TMR2
cmcon1=%00000000 ' configuracion del comparador por TMR1
ccp1con=%00000000 ' configuracion del registro de control ccp1
cmcon0=%00000111 ' configuracion del comparador operacional
vrcon=%00000000 ' configuracion del voltage de referencia del comparadoronfiguracion del comparador operacional
adcon0=%00000000 ' configuracion de las entradas analogicas
ansel=%00000000 ' ajuste de las entradas analogicas
'
' definicion de puertos inicial
'
trisio=%001000 ' define los bit del puerto entrada o salida
gpio=%000010 ' define los bit del puerto
wpu=%000000 ' define los pull up del puerto
ioc=%000000 ' define como marca de interruccion los bit del puerto
'
' bariables iniciales
'
for temp1=0 to 9
    temp2=temp1+8
    read temp2,codigos[temp1]
next temp1
PWMled1=0
PWMled2=0
PWMled3=0
pwmrgb=108
boton=0
tmr0=247
intcon=%10100000 ' iniciamos interruciones, solo tmr0, perineales apagadas
ON INTERRUPT GOTO interrucciones ' define salto interruciones
goto programa
'
' 
' control de interrucciones
'
'  solo controlando tmr0
DISABLE
interrucciones:
tmr0=247
intcon.2=0
PWMrgb=PWMrgb-1
if pwmrgb=0 then 
    PWMrgb=107
    gpio=%000010 ' borra los 3 pines pwm de los led
endif
if PWMrgb=PWMled1 then port_led1=1 'activa pin's
if PWMrgb=PWMled2 then port_led2=1
if PWMrgb=PWMled3 then port_led3=1
pir1.7=0
resume
enable
'
' programa
'
programa:
if port_ir=0 then gosub infrarrojos ' lectura infrarrojos
if boton>0 then gosub tecla ' acciones

goto programa
'
'  lectura infrarrojos
'
infrarrojos:
contador=0
while port_ir=0 ' leemos el largo del pulso alto de inicio codigo
    contador=contador+1
wend
if contador<180 then salto_ruido ' si es menor seguro sea ruido IR
contador=0
while port_ir=1 ' leemos el largo del pulso bajo de inicio codigo
    contador=contador+1
    if contador>90 then salto_ruido ' si es mayor seguro no sera correcto
wend
pulso=0
repeat
    port_piloto=0
    infra=0
    while port_ir=0 ' cuenta el largo el pulso alto
        infra=infra+1
        if infra>34 then salto_barrido ' si desborda salimos a comprovarlo
    wend
    infra=0
    while port_ir=1 ' cuenta el largo el pulso bajo
        infra=infra+1
        if infra>48 then salto_barrido ' si desborda salimos a comprovarlo
    wend
    casilla=pulso>>3 ' divido entre 4 para encasillar en byte's
    codigo[casilla]=codigo[casilla]<<1 ' desplazo byte para ingresar nuevo bit 
    if infra>18 then codigo[casilla]=codigo[casilla]+1 ' si es un 1 lo suma
    pulso=pulso+1 ' cuenta el largo de bit serial
until pulso=48 ' limite maximo serial 48bit
salto_barrido:
if codigo[0]=codigos[0] then ' comprovamos byte de acceso bajo
    if codigo[1]=codigos[1] then ' comprovamos el byte de acceso alto
        boton=codigo[casilla] ' almaceno el ultimo byte en boton
    endif ' se puede mejorar la veracidad de los  2 
endif     ' ultimos byte's. NEC, RC5, Panasonic48bit
salto_ruido:
port_piloto=1
return
'
' accion de la tecla pulsada del pando infrarrojo
'
tecla:
select case boton ' comprovamos la accion de la tecla pulsada
    case codigos[9]' subir global
        if pwmled1<100 then ' para si un valor llega al maximo
            if pwmled2<100 then
                if pwmled3<100 then
                    if pwmled1>0 then pwmled1=pwmled1+1 ' para mantener a 0
                    if pwmled2>0 then pwmled2=pwmled2+1
                    if pwmled3>0 then pwmled3=pwmled3+1
                endif
            endif
        endif    
    case codigos[8]' bajar global
        if pwmled1>0 then pwmled1=pwmled1-1 ' hasta llegar a 0
        if pwmled2>0 then pwmled2=pwmled2-1
        if pwmled3>0 then pwmled3=pwmled3-1
    case codigos[7]' subir pwm1
        if pwmled3<100 then pwmled3=pwmled3+1
    case codigos[6]' bajar pwm1
        if pwmled3>0 then pwmled3=pwmled3-1
    case codigos[5]' subir pwm2
        if pwmled2<100 then pwmled2=pwmled2+1
    case codigos[4] ' bajar pwm2
        if pwmled2>0 then pwmled2=pwmled2-1
    case codigos[3] ' subir pwm3
        if pwmled1<100 then pwmled1=pwmled1+1
    case codigos[2] ' bajar pwm3
        if pwmled1>0 then pwmled1=pwmled1-1
end select
boton=0
return
'
'
' datos de la eepron 
' 
data @8
data $02,$FD ' 16bit de acceso ir NEC RC5
datA $DF,$5F,$CF,$9F,$7F,$0F ' las 6 telas de subir y bajar
data $4F,$87 ' las dos teclas de subir bajar global
```
*P*o*n*gamos que es lo b*á*sico, con mi rutina de lectura de IR y solo controlar un led RGB, es lo b*á*sisico, pero lo que quiero decir con definirlo todo*,* es que el programa tenga-una una estructura de flujo de procesos viable*, *donde se puede ampliar sin problema su programa...

*E*l que me tengo currado es lo mismo*,* solo que activando el pwm interno*.*
*L*os n*ú*meros del mando*,* las memorias de los colores*, *tecla de almacenado y otra tecla que *h*ace la secuencias de un color a otro de la memoria, quiz*á*s una tecla para aunmentar la velocidad de las secuen*c*ias y  otra que configurar*é *para los valores iniciales al encenderse..
(*E*s una rayada decidir la presencia de la comodidad para usar el chisme.)


*Y* bueno, lo e*x*puse porque en parte esta idea se me ocurri*ó *aqu*í* pele*á*ndome con alguno..
*Y* que por-lo-menos tengo el trabajo con una definici*ó*n del duty de 100 y a una frecuencia PWM a 1 Khz,  una respuesta de un mando que es correcta su codificaci*ó*n serial y ocupando poco mas de 400 procesos

*U*n saludo*.


**Como no escribo correctamente, me editaron el mensaje.*​


----------



## nelson enrique llontop (Nov 5, 2016)

D@rkbytes dijo:


> No, muy mal.
> Necesitas poner mas atención sobre las configuraciones de los registros usados en el ejemplo que subí.
> De esa forma no va a funcionar tu programa.
> 
> ...






muchas grasias dr por su correccion 

tengo una duda  es posible hacer inerrupciones usart con 2 o mas hserin o solo puedo usar un hserin 

disable 
  If PIR1.5 = 1 Then          ; ¿Ocurrió interrupción por recepción EUSART?
        Flag_Rx = 1  
hserin[dec1 a]
hserin[dec1 b]
hserin[dec1 c]
hserin[dec1 d]
hserin[dec1 e]
.
.
.
endif 
resume 
enable 
end


----------



## D@rkbytes (Nov 5, 2016)

No, porque de esa forma todas las variables contendrán lo que en el momento de la interrupción tenga el primer byte del buffer.
Lo correcto sería hacer uso de un único HSerIn, de ésta forma:
*HSerIn ParityLabel, Timeout, Label, [a, b, c, d, e]
*Así recibes de una sola vez cada byte del buffer en las variables.

ParityLabel, Timeout y Label, son parámetros opcionales.
La conversión con "Dec x" la puedes hacer posteriormente.


----------



## willrey28 (Nov 6, 2016)

Hola muchachos,me preguntaba si hay una función similar en pic basic como la hay en arduino que es la funcion millis() ,en el que por comparación puedo realizar otras tareas como apagar y encender un led sin utilizar la función delay o pause.Ya que si uso la función delay detengo la ejecución del programa y no puedo realizar otras tareas segun el tiempo establecido a menos que use interrupciones.
Por ejemplo que un led parpadee y en simultaneo que pueda con un pulsador encender o apagar otro led.
Debido a mi escaso conocimiento sobre picbasic no lo se.
Muchas gracias por sus respuestas.


----------



## papirrin (Nov 6, 2016)

No, no la hay.,.. Como se hace es con un timer , interrupción de timer o un contador con un pauseus, y quizás con algún otro algoritmo similar.


----------



## juancaca (Mar 8, 2017)

Buenos días compañeros del grupo, estoy haciendo una comunicación usart entre un pic 16f887 y un modulo mp3 el DFPLAYER, la comunicación entre el modulo y el pic ya la tengo y viceversa, el problema esta que cuando quiero enviar una cadena con el Hserout [STR ArrayVar\n] no me envía el dato.
La verdad no entiendo muy bien la parte \n, quiero enviar un comando para especificar el volumen inicial ya que el por defecto lo carga en 30.


```
VOL VAR BYTE [7] ; cree la variable array
VOL[0] = $7E ; le cargo el comando a la array 
VOL[1] = $FF
VOL[2] = $06
VOL[3] = $06
VOL[4] = $00
VOL[5] = $00
VOL[6] = $A ;este bit el que le da el Volumen especifico al modulo.
VOL[7] = $EF 

;Cuando quiero enviar el comando lo hago así:
Hserout [STR VOL\8] ; Se supone que acá debería de enviarme los VOL[] cargados con los valores, eso creo ;y entido yo.
```

Espero me puedan colaborar.
Les agradezco de antemano.


----------



## D@rkbytes (Mar 8, 2017)

HSerOut [Str ArrayVar\n] debe funcionar correctamente enviando los datos del arreglo.
\n es para especificar cuantos bytes deben ser enviados.
En tu caso, 8 bytes y como el byte cero también cuenta, la instrucción debe ser así.
HSerOut [Str VOL\7]


----------



## juancaca (Mar 8, 2017)

D@rkbytes dijo:


> HSerOut [Str ArrayVar\n] debe funcionar correctamente enviando los datos del arreglo.
> \n es para especificar cuantos bytes deben ser enviados.
> En tu caso, 8 bytes y como el byte cero también cuenta, la instrucción debe ser así.
> HSerOut [Str VOL\7]



Buenas tardes Dark te cuento que tampoco asi me funciono, me ha funcionado asi:

HSerOut [VOL[1], VOL[2], VOL[3], VOL[4], VOL[5], VOL[6], VOL[7], VOL[8]] 

ó asi directamente

HSerOut [$7E, $FF, $06, $06, $00, $00, $0F, $EF]

pero de la otra forma no me envia los datos, de la otra forma se reduce codigo, pero bueno tocara dejarlo asi mientras veo donde esta la falla.

Cordial saludo y gracias por responder .


----------



## D@rkbytes (Mar 8, 2017)

Pues si funciona como te mencioné, tendrías que entrar en modo de depuración para encontrar el problema.

También se puede usar un bucle for.
Por ahora estoy fuera y con el móvil, pero en cuanto llegue a casa, adjunto dentro de este mismo post, un ejemplo con Str

****Edit****

Adjunto el ejemplo.
Nota:
Si se desea usar la simulación, se debe establecer la vista del Virtual Terminal, en Hex Display Mode.


----------



## juancaca (Mar 10, 2017)

Hola D@rk y compañeros

Te cuento que ya encontre el problema, era que estaba enviando mal el comando con la variable array, la estaba enviando desde [1] y no desde [0], y lo que hacia era que me envia un dato de más.
El ejemplo que montaste esta interesate y no sabia que asi tambien se podia cargar el dato, de pronto tienes ejemplos de HSEROUT, HSERIN y LCDOUT STR con sus modificadores la verdad en español es muy poca la info de estas instrucciones y las que estan en ingles no las entiendo bien y el traductor no ayuda .

Muchas gracias por la ayuda.

Cordial saludo

En la instruccion LCDOUT STR no pude visualizar nada, me salian los caractres del lcd que son en japones creo.


----------



## D@rkbytes (Mar 10, 2017)

Saludos.
Los ejemplos sobre HSerIn y HSerOut, los puedes ver por aquí:
*Interfaz RS232 PIC PC (Proyecto Completo VB6)*

Y para LCDOut Str, prueba con este programa:

```
; Definición de pines para la pantalla.
Define LCD_DREG PORTD        ; Puerto de datos.
Define LCD_DBIT     4        ; Bit de inicio de datos.
Define LCD_RSREG PORTD        ; Puerto de RS (Register Select)
Define LCD_RSBIT    0        ; Pin para RS
Define LCD_EREG PORTD        ; Puerto de E (Enable)
Define LCD_EBIT     1        ; Pin para E

; Declaración de variables:
LCDChar Var Byte[10]        ; Arreglo para los caracteres a mostrar en la pantalla.

Inicio:
    ANSEL = 0               ; Puerto A como digital
    
    ; Cargar el arreglo con el mensaje.
    LCDChar[0] = "H"
    LCDChar[1] = "o"
    LCDChar[2] = "l"
    LCDChar[3] = "a"
    LCDChar[4] = " "
    LCDChar[5] = "M"
    LCDChar[6] = "u"
    LCDChar[7] = "n"
    LCDChar[8] = "d"
    LCDChar[9] = "o"
    LCDChar[10] = " "

    LCDOut $FE,1            ; Inicializa o borra la pantalla.
    LCDOut $FE,$80,"Ej: Str ArrayVar"
    LCDOut $FE,$C0,Str LCDChar\10

Programa:    
    While 1 = 1
       Toggle PORTA.0
       Pause 500
    Wend
    
    End
```


----------



## juancaca (Mar 16, 2017)

D@rkbytes dijo:


> Y para LCDOut Str, prueba con este programa:
> 
> ```
> LCDOut $FE,1            ; Inicializa o borra la pantalla.
> ...



Hola D@rk y compañeros, bueno lo que pretendia hacer con *LCDOut $FE,$C0,Str LCDChar\10* era que si recibia un dato lo cargara en una variable array y visualizarlo con esa instruccion, pero me muestra caracteres del LCD, pero para mas facilidad cargue las arrays en la instruccion y funciona bn.

Tengo una duda con respecto a trabajar con las comunicaciones, cuando uso HSERIN y SERIN2 se me crea un conflicto y el puerto por el cual quiero recibir los datos de un modulo rf empieza a recibir datos sin estar enviando nada, fluctua, en este caso como debo manejar las instrucciones, en rutinas separadas o manejar el HSERIN por interrupciones, otra duda que tengo es cuando se trabaja por los modulos hardware del pic ellos trabajan en segundo plano mientras uno sigue con el codigo?.
El modulo DFPLAYER MP3 trabaja por HSERIN y el modulo RF por SERIN2.

Cordial saludo y un abrazo


----------



## D@rkbytes (Mar 16, 2017)

Los módulos de R.F. tienen mucho ruido en su salida y por ese motivo se tiene que usar un protocolo de codificación y decodificación.

Mira este post, tal vez te pueda servir:
_*PIC12F675 y módulo de R.F, no recibe datos*_


----------



## juancaca (Mar 17, 2017)

D@rkbytes dijo:


> Los módulos de R.F. tienen mucho ruido en su salida y por ese motivo se tiene que usar un protocolo de codificación y decodificación.
> 
> Mira este post, tal vez te pueda servir:
> _*PIC12F675 y módulo de R.F, no recibe datos*_



Hola D@rk, se me olvidaba mencionar que el puerto oscilaba sin tener el modulo conectado al puerto, utilice varios puertos y siempre pasaba lo mismo, cuando colocaba el puente en el pin y lo tocaba en la otra punta empezaba a oscilar, ahi fuen donde descarte el modulo, yo trabaje los modulos antes y no me presentaron ningun problema, claro que los use con unos pic 16f628a  y ahora lo iba a implementar en el 16f887.

Otra de las causas no se si de pronto sea la protoboard en las que monte el circuito son unas wish y no se que tal sean.

Cordial saludo


----------



## D@rkbytes (Mar 17, 2017)

Coloca una resistencia pull-up de 10 kΩ en el pin Rx.
No es conveniente que el microcontrolador funcione con los periféricos desconectados.

Existen algunas Protoboards que son pésimas.
Hace poco tiré una a la basura porque medía bastante resistencia de lado a lado. (Hasta 150 Ω)


----------



## Dario (Abr 17, 2017)

Hola gente del foro, tanto tiempo jeje... bueno en estos dias estoy programando el animatronic del tutorial, pero me he encontrado con una sorpresa jeje... la cosa es que no puedo hacer funcionar un servomotor si utilizo un cristal de 20MHZ. me gustaria saber si a alguno de ustedes le ha pasado y si han podido solucionarlo, me ayuden un poquito jeje... aqui dejo un pequeño ejemplito de control de un servomotor con un pic16f876A a 20MHZ que no funciona. sin embargo, si cambio el oscilador a 4MHZ, si funciona... pero necesito que funcione a 20MHZ...  saludosss 




```
@ device  pic16F876A, hs_osc, wdt_off, pwrt_on, lvp_off, protect_off, bod_off

define osc 20     ; especifica que se va a utilizar uno de 20 Mhz
'*****************************************************************
adcon1 = 7        'se desactivan entradas analógicas'
cmcon  = 7        'se desactivan los comparadores (I/O digitales)'
trisa = 0         'se programa el puerto A como salida' 
trisb = 0         'se programa el puerto B como salida'
trisc = 0         'se programa el puerto C como salida'
PORTA=%00000000
PORTB=%00000000
PORTC=%00000000

'*****************************************************************

'DECLARACION DE VARIABLES
SERVO1 VAR PORTB.0
X     VAR BYTE
'***************************************************************
'****************************************************************
ACCION:
FOR X = 100 TO 200 STEP 1
PULSOUT SERVO1,X
pause 20
NEXT
FOR X = 200 TO 100 STEP-1
PULSOUT SERVO1,X
pause 20
NEXT
GOTO ACCION
END
```


----------



## torres.electronico (Abr 17, 2017)

Dario dijo:


> Hola gente del foro, tanto tiempo jeje... bueno en estos dias estoy programando el animatronic del tutorial, pero me he encontrado con una sorpresa jeje... la cosa es que no puedo hacer funcionar un servomotor si utilizo un cristal de 20MHZ. me gustaria saber si a alguno de ustedes le ha pasado y si han podido solucionarlo, me ayuden un poquito jeje... aqui dejo un pequeño ejemplito de control de un servomotor con un pic16f876A a 20MHZ que no funciona. sin embargo, si cambio el oscilador a 4MHZ, si funciona... pero necesito que funcione a 20MHZ...  saludosss
> 
> Ver el archivo adjunto 155487
> 
> ...



La resolución de pulsout es dependiente del valor del cristal, o mejor dicho, del valor que le decimos en la programación. Para 4Mhz, tenemos un tiempo de 10us, en 20Mhz, el tiempo es de 2us.
En tu ejemplo, supongamos que tengamos en un momento dado los siguientes valores

X=100
PULSOUT SERVO1,X

tenemos que 100x2 = 200, o sea, 200us... Hagámoslo al revés... supongamos que queremos calcular el valor para un ancho del pulso a mandar de 1,8ms... tenemos entonces que:
1,8ms = 1800us
1800/2=900

PULSOUT SERVO1,900


----------



## Dario (Abr 17, 2017)

Grande Torres, muchas gracias por tu aporte. tenes razon, asi si funciona, muchas gracias de nuevo!!! saludos


----------



## juancaca (Abr 24, 2017)

Buenas noches compañeros, despues de un largo tiempo de haber hecho este proyecto y que con la ayuda de Sr. D@rkbytes logre colocarlo a funcionar con visualizacion de una pantalla LCD 16x2, es un variador de velocidad para motores de 120V AC que es lo que se trabaja en colombia, tambien sirve para variar la luminosidad de una bombilla incandescente espero les sirva y si pueden mejorarlo mucho mejor y lo compartan, este proyecto tambien lo pueden hacer sin la pantalla LCD todo viene separado, ya que el pic principal trabaja independiente del pic que hace la visualizacion.

El archivo de simulacion esta en proteus 8.5 SP0.

Ya mi proximo reto es hacerlo para variar motores a 220V AC.

Cordial saludo.

Juan Camilo Cardona


----------



## torres.electronico (May 4, 2017)

juancaca dijo:


> Buenas noches compañeros, despues de un largo tiempo de haber hecho este proyecto y que con la ayuda de Sr. D@rkbytes logre colocarlo a funcionar con visualizacion de una pantalla LCD 16x2, es un variador de velocidad para motores de 120V AC que es lo que se trabaja en colombia, tambien sirve para variar la luminosidad de una bombilla incandescente espero les sirva y si pueden mejorarlo mucho mejor y lo compartan, este proyecto tambien lo pueden hacer sin la pantalla LCD todo viene separado, ya que el pic principal trabaja independiente del pic que hace la visualizacion.
> 
> El archivo de simulacion esta en proteus 8.5 SP0.
> 
> ...



Hola Juan, en que version de proteus lo guardaste? no lo pude abrir por el formato que tiene... Te podria molestar y pedirte que subas los esquemas (circuitos) en formato de imagen? yo te doy una mano para modificarlo y llevar a motores de 220VAC
saludos


----------



## juancaca (May 5, 2017)

torres.electronico dijo:


> Hola Juan, en que version de proteus lo guardaste? no lo pude abrir por el formato que tiene... Te podria molestar y pedirte que subas los esquemas (circuitos) en formato de imagen? yo te doy una mano para modificarlo y llevar a motores de 220VAC
> saludos



Hola torres, te cuento que el archivo esta guardado en proteus 8.5 SP0, te coloco el esquemático en PDF, los archivos que me da el proteus, y los archivos PBP3.

Y muchas gracias por tu colaboración .


----------



## nelson enrique llontop (May 23, 2017)

d@rkbytes dijo:


> no, porque de esa forma todas las variables contendrán lo que en el momento de la interrupción tenga el primer byte del buffer.
> Lo correcto sería hacer uso de un único hserin, de ésta forma:
> *hserin paritylabel, timeout, label, [a, b, c, d, e]
> *así recibes de una sola vez cada byte del buffer en las variables.
> ...



me podria dar un ejemplo de esa convercion "dec x"


----------



## D@rkbytes (May 23, 2017)

"DecX " es igual que "#" y sirve para mostrar y enviar números como texto, pero con DecX se puede dar un formato con ceros.
Me parece que pueden ser hasta 5 ceros, no recuerdo cuantos se permiten.

Por ejemplo:
Variable = 12
LCDOut $FE, 1, Dec4 Variable
Se mostrará: 0012


----------



## nelson enrique llontop (May 24, 2017)

D@rkbytes dijo:


> "DecX " es igual que "#" y sirve para mostrar y enviar números como texto, pero con DecX se puede dar un formato con ceros.
> Me parece que pueden ser hasta 5 ceros, no recuerdo cuantos se permiten.
> 
> Por ejemplo:
> ...



lo que quiero es mostrar lo que ingreso por serial desde pc a mis displays pero por interrupción
que sea una sola trama un solo hserin , pero al parecer tengo que convertir lo que ingreso a decimal le adjunto un block de notas con la diferencia. y quisiera saber el problema ?


----------



## D@rkbytes (May 24, 2017)

No entiendo para qué estás usando la tabla con LookUp y el envío de datos seriales con ShiftOut.
Lo que si sé, es que si ya recibiste los datos, sólo tienes que mostrarlos usando # o Dec.

O sea, así:
LCDOut $FE, 1, #D0, #D1, #D2, #D3
O así:
LCDOut $FE, 1 Dec D0, Dec D1, Dec D2, Dec D3



nelson enrique llontop dijo:


> Lo que quiero es mostrar lo que  ingreso por serial desde la PC a mis displays


¿Qué tipo de displays estás usando?


----------



## nelson enrique llontop (May 24, 2017)

D@rkbytes dijo:


> No entiendo para qué estás usando la tabla con LookUp y el envío de datos seriales con ShiftOut.
> Lo que si sé, es que si ya recibiste los datos, sólo tienes que mostrarlos usando # o Dec.
> 
> O sea, así:
> ...



bueno te explico mi circuito esta conformado con con shift register CD4094  todos en cascada y cada uno su salida paralela va  aun display de 7 segmentos son 28 display  todos estos deben ser controlados por pc mediante puerto serial pero necesito que sea un solo hserin.
desde pic se controlan las señales como clock,data,strobe y enable alguna idea.


----------



## D@rkbytes (May 24, 2017)

Te adjunto un ejemplo, pero sólo con 4 CD4094. Ya posteriormente lo podrás expandir.



Nota: Por ser simulación, no usé resistencias para los displays.​


----------



## nelson enrique llontop (May 27, 2017)

D@rkbytes dijo:


> Te adjunto un ejemplo, pero sólo con 4 CD4094. Ya posteriormente lo podrás expandir.
> 
> Ver el archivo adjunto 156609
> 
> Nota: Por ser simulación, no usé resistencias para los displays.​



exelente ,quisiera controlar el enable con un timer 400 milisegundos para hacer  parpader a todos los display y al cambiar datos por serial cambie y siga con su parpadeo y tambien detener el parpadeo en cuatro displays si ingreso un 1 por serial sria posible, estoy intentando con interrupcion de prioridad pero no se como acomodar mi programa si tienes un ejemplo seria excelente ..


----------



## D@rkbytes (May 27, 2017)

Lo que expones es demasiado sencillo y no requiere de ejemplos, simplemente de noción.
Y si no sabes cómo realizar el programa, vas por muy mal camino.


----------



## nelson enrique llontop (Jun 3, 2017)

D@rkbytes dijo:


> Lo que expones es demasiado sencillo y no requiere de ejemplos, simplemente de noción.
> Y si no sabes cómo realizar el programa, vas por muy mal camino.



bueno solo necesito  un ejemplo de prioridades de interrupción ya que es la primera vez que programo interrupciones de prioridad mejor aun sea de interrupción usart y interrupción timer


----------



## D@rkbytes (Jun 3, 2017)

nelson enrique llontop dijo:


> Bueno, sólo necesito  un ejemplo de prioridades de interrupción, ya que es la primera vez que programo interrupciones de prioridad.
> Mejor aún que sea de interrupción usart e interrupción timer.


No en todos los PIC se pueden tener interrupciones de alta prioridad.
Esto es mas de la familia PIC18 y superiores.

Para saber si el microcontrolador tiene esta opción, debes mirar sus  características especiales.

​ Establecer la prioridad de las interrupciones no requiere de ejemplos, sino de leer la hoja de datos.

En la sección "INTERRUPTS" podrás ver los registros involucrados con las interrupciones.


Si miras el registro IPR1, encontrarás que el bit 5 (RCIP) es el que activa la alta prioridad de interrupción para la recepción del módulo EUSART.​

Como verás, basta con poner en 1 el bit 5 para establecer la alta prioridad de interrupción.
Igualmente con los Timers y otros periféricos.​​


----------



## banistelrroy (Ago 10, 2017)

hola a todos en el grupo, saben necesitaba realizar un proyecto de comunicación por RF pues lo hice con los famosos HT12E - HT12E pero, el problema es el siguiente que solo se puede trasmitir 4 bits y yo necesito 8 o 12 si se pudiera, en fin trate de hacerlo con PIC específicamente los 16F628A, también lo conseguí, uno trabaja como trasmisor y el otro como receptor junto con los módulos RF, que por cierto lo probé hasta 50 metros de distancia sin obstáculos y funciona de maravilla el tema es el siguiente:

1. la programación lo realice en microcode studio
2. uso baterías recargables tanto como en el emisor y el receptor, típicamente las de 9V
3. en el emisor uso un regulador de voltaje 7805 y en el receptor una fuente para protoboard 
       de 3.3 - 5v - 700 ma esas que van insertadas en el protoboard con entrada jack y usb
4. en el receptor solo uso leds por ahora para visualizar los datos de trasmisión.

El problema es que me consume demasiada batería, solo me dura un día, no sé si el problema está en el circuito o en la programación, ya que siempre está trasmitiendo aunque no tenga nada pulsado.

Adjunto lo necesario si alguien pudiera mejorar el proyecto en la programación les agradecería, tal vez allá una forma de hacer que ahorre batería cuando este sin nada pulsado, la programación la hice ayudándome en lo poco que se de pics.


----------



## D@rkbytes (Ago 10, 2017)

banistelrroy dijo:


> Necesito realizar un proyecto de comunicación por R.F.
> Pues lo hice con los famosos HT12E - HT12E, pero el problema es el siguiente, que sólo se puede trasmitir 4 bits y yo necesito 8 o 12 si se pudiera.


Usa un algoritmo como el Manchester, por ejemplo, que luego se decodificará en el receptor.

Puedes ver algo sobre el tema, por aquí:
*PIC12F675 y módulo de R.F, no recibe datos*


banistelrroy dijo:


> El problema es que me consume demasiada batería, sólo me dura un día.
> No sé si el problema está en el circuito o en la programación, ya que siempre está trasmitiendo aunque no tenga nada pulsado.


El problema del transmisor se puede resolver fácilmente si únicamente transmites cuando sea presionado un pulsador.
Aquí puedes usar las interrupciones por cambio de estado en el puerto B. (RB4<>B7)
Ponerlo en modo de bajo consumo, (Sleep) y se pondrá en modo activo tras una interrupción.
O sea, cuando se presione un botón.

Y para el receptor, prácticamente sería lo mismo, pero usando la interrupción externa por RB0.

Con eso tendrías el problema de consumo solucionado, aunque siempre habrá, pero será mucho menor.


----------



## banistelrroy (Ago 11, 2017)

OK D@rkbytes, gracias por responder pense en usar interrupciones pero no se como usar, ademas necesito que vean el programa aver si alguien lo puede mejorar


----------



## D@rkbytes (Ago 11, 2017)

Sobre este mismo tema puedes encontrar varios ejemplos sobre el uso de interrupciones.
Lo más conveniente en el receptor sería el uso de la interrupción por recepción del módulo USART.
Lee la hoja de datos del PIC16F628A y encontrarás todo lo referente a su uso.

Y sobre lo de mejorar el código, ya te mencioné algunas cosas que puedes hacer.


----------



## banistelrroy (Ago 11, 2017)

los archivos que adjuntastes creo estan en c , no tienes en microcode ya que es lo que se por ahora


----------



## D@rkbytes (Ago 11, 2017)

Así es y no tengo ejemplos en Basic.
Tal vez esto que hay por aquí, te pueda servir:
*Manchester Coding / Decoding for RF Modules*


----------



## banistelrroy (Ago 13, 2017)

Estuve leyendo y no encuentro nada parecido por favor algún ejemplo o modificaciones que se pudiera hacer al código para aplicar interrupciones y codificación manchester , porfabor


----------



## Dr. Zoidberg (Ago 13, 2017)

banistelrroy dijo:


> Estuve leyendo y no encuentro nada parecido por favor algún ejemplo o modificaciones que se pudiera hacer al código para aplicar interrupciones y codificación manchester , porfabor


Siempre pensas en copiar lo que otro haga????
Lo que te han explicado te alcanza para hacer lo que quieras...pero parece que queres todo ya hecho.


----------



## banistelrroy (Ago 14, 2017)

Acaso creen que copie el codigo, no saben lo que me costo hacer la comunicacion, como vi que explican a otros cosas mas elementales hasta le dan ejemplos hasta realizan su codigo, yo solo pedi una idea o ejemplo donde yo lo pudiera modificar o agregar ya que no sabia por donde empezar, pero estoy leendo y buscando segun las sugerencias, antes de emitir un comentario insensato, primero ai que valorar el esfuerzo de los que recien se inician, pero vale la acotacion como les dije estoy investigando y leendo ojala lo consiga gracias igual D@rkbytes que fue el unico que emitio un comentario con aportes


----------



## D@rkbytes (Ago 14, 2017)

No te molestes, pero es que primero debes cambiar tu programa con lo que se te ha sugerido.
Cuando lo hagas, y si tienes problemas, se podrá revisar para encontrar posibles errores.

Tu programa actual no es muy grande, pero sí bastante mal elaborado, y es un hecho que se puede mejorar.
Así qué, realiza los cambios con lo que se te ha sugerido y si tienes problemas, lo publicas, mencionando tus problemas.

Si no eres tú quien realice esas mejoras, nadie lo hará por tí.
Y si nadie más ha sugerido mejoras a tu programa, es porque no has hecho caso sobre lo que se te ha dicho, y seguramente están esperando a que lo hagas.


----------



## ricbevi (Ago 14, 2017)

Hola...Aunque no es un ejemplo de PBP ya que no lo tengo instalado, es en Proton Basic.
Enciende un led después de 100 mili segundos y cuando cualquiera de los botones del puerto B desde 4 a 7 cambie de estado(de alto a bajo o de bajo a alto) durante 1 segundo lo mantiene encendido para después mandar a dormir al micro controlador hasta que ocurra el próximo cambio de estado en dichos pines. 
No lo probé en físico pero en el simulador funciona y a fin de tener una ejemplo(era lo que buscabas) te servirá.
Saludos.

Ric.


----------



## banistelrroy (Ago 14, 2017)

gracias, si lo estoy haciendo sabia que mi programa estaba muy mal elaborado es uno de los primeros que realizo siguiendo mi propio criterio, es muy dificil para mi ya tengo problemas con el ingles estoy leendo el manual y tratando de entender como activar las interrupciones usar la interrupcion RCIE: USART Receive Interrupt Enable bit, y la otra TXIE: USART Transmit Interrupt Enable bit, del registro PIE, voy realizar la activacion, hacer la declaracion en microcode, y tratar de acomodar el programa, para este en reposo el RX/TX cuando no se este pulsando nada, y que solo trasmita cuando se pulse cualquiera de las 4 entradas.

El tema del alto consumo tambien creo que pasa por usar el regulador 7805 con bateria de 9V, mucha enerjia se pierde en calor, optare por usar los modulos reguladores de voltaje step down, no se si sera la mejor opcion.


----------



## D@rkbytes (Ago 14, 2017)

Si continuas así, vas por muy buen camino. Porque usar las interrupciones es algo imprescindible.
Mejoran bastante el desempeño de un programa.

En cuanto al consumo de un PIC, es mínimo, lo que consume energía son los dispositivos que controla.
Y puedes controlar cargas de la potencia que requieras. (Previa Interfaz)
Un PIC puede funcionar correctamente con un regulador 78L05 (100 mA Max)
Pero lo que debes ver, es el consumo externo requerido y optar por una fuente de poder bien diseñada.
Puede ser, Step-Up "Boost Converter" o Step-Down "Buck Converter"
Ambos métodos son aceptables y son mucho mejor que una fuente de poder con transformador.
Reducen tamaño y consumo, por ende, mejor rendimiento. Y si es Off-Line, mejor, pero depende el tipo de sistema.


----------



## banistelrroy (Ago 14, 2017)

el problema fue que el programa como esta lo deje conectado un dia entero en el receptor solo tengo leds conectados, pero durante el dia no pulse nada y la bateria de 9v recargable se me descargo en un solo dia, lo cual me parece que es muy poco tiempo. Estoy usando bateria recargable de 9v en trasmisor y receptor igual. teniendo en cuenta lo que dices en cuanto al consumo del pic es  muy poco no entiendo porque me duro tan poco la bateria.


----------



## D@rkbytes (Ago 14, 2017)

Eso es muy normal si transmites todo el tiempo, por eso te sugerí algunas técnicas.


----------



## banistelrroy (Ago 14, 2017)

ok, entiendo, muy buena tu acotacion.

@ricbevi, gracias por ele ejemplo y si me sirve de mucho, ya que es mas o menos lo que pienso hacer


----------



## banistelrroy (Ago 15, 2017)

consulta talves sea elemental para ustedes pero a mi esta dando unos problemas esta duda:

realizando el codigo del pic en microcode studio especificamente del 16F628A.
1. Sino hago uso del las declaraciones de los puertos para que sean entradas ni saldidas en los 2 puertos
    osea no hago uso de TRISA ni TRISB como lo asume el programa.
2.Si declaro TRISB = %00000000 enque estado se pone los pines que no se les programa tarea alguna, osea que quedaran libres.
3.Los pines libres como es combeniente dejarlos, en cuanto a consumo, ruidos, interferencias o falsos.


----------



## D@rkbytes (Ago 15, 2017)

Al usar las instrucciones TRISX = %00000000 (Todo el puerto será configurado como salidas)
Y con TRISX = %11111111 (Todo el puerto será configurado como entradas)
Un 1 establece entrada y un 0, salida.

El valor que tomen si no se establece alguno, se puede ver en la hoja de datos, y se da en el POR (Power On Reset)

Ahora, cuando se usan las instrucciones Low _Pin_ y High _Pin_, no tiene caso hacer uso de TRIS.
Porque esas instrucciones hacen al pin indicado, salida.

PD: El programa de Ricbevi está más orientado al PBP que a Proton.
Porque en Proton Basic no hay motivo de declarar los bits de los registros, ya que se pueden usar directamente.
Por ejemplo:
INTCONbits_GIE = 1

Y ya orientado al Basic de Proton...

```
INTCONbits_GIE = 1      ' Activar las interrupciones globales
    INTCONbits_PEIE = 1     ; Activar la interrupción de los periféricos.
    OPTION_REGbits_RBPU = 0 ' Habilita las resistencias Pull-up del puerto B
    INTCONbits_RBIE = 1     ' Habilta las interrupciones por cambio de estado PORTB[4..7]
```


----------



## ricbevi (Ago 15, 2017)

El programita que subí esta basado en el ejemplo que trae el mismo Proton en su instalación.
Efectivamente si Proton reconoce el nombre puesto como el de un registro, cambia de color en el editor y no sería necesaria su declaración previa ya que fue reconocido. 
Al mismo pin lo puedes usar como entrada y salida (si el micro lo permite y depende de la función que le darás).
Generalmente el compilador cambia solo el estatus del registro TRIS según interprete que lo estas usando como entrada o salida.
Para no dejar dudas al respecto a mi personalmente me gusta declara todo y dejar lo menos posible a la libre interpretación.


Ric.


----------



## D@rkbytes (Ago 15, 2017)

ricbevi dijo:


> Para no dejar dudas al respecto, a mi personalmente me gusta declarar todo y dejar lo menos posible a la libre interpretación.


Lo cual es muy correcto sin entrar en redundancias que a final de cuentas nada más nos hacen escribir código extra sin función útil.
Es correcto que se declaren cosas que no están definidas, pero las que ya son nativas, ni al caso, se usan y se ejecutan directamente.

Y te voy a ser sincero al hablar de PBP a Proton, Proton es mucho mejor al PBP.
Proton cuenta con una optimización de código superior a PBP. (Y hasta permite el uso de variables Float)
Tiene muchas más instrucciones, porque su estructura está orientada al Visual Basic.
Ambos disponen el uso directo de los registros y también se puede agregar lenguaje ensamblador.
Pero, Proton es más amigable es éste aspecto, porque ya los tiene declarados como algo nativo.
Al igual que usar XC o al mismo ensamblador.

Ventajas entre los varios lenguajes hay muchas, lo que se debe tener en cuenta es saber usar lo que se tiene o se sabe.


----------



## banistelrroy (Ago 15, 2017)

creo que es hora de migrar a proton.......

voy a replantear el diagrama de flujo*.*


----------



## ricbevi (Ago 16, 2017)

banistelrroy dijo:


> creo que es hora de migrar a proton.......



No te desalientes solo te falta perseverancia y seguir buscando las alternativas o soluciones que le encuentres. 
Yo uso Proton por costumbre ya que lo hago desde hace bastante tiempo pero la herramienta no lo es todo en esto. 
Debes ponerte en el "lugar" del micro controlador y realizar mentalmente los pasos uno a uno que tu mismo le propones con tu programa.
Revisa programas desarrollados por otros(incluyendo los de la ayuda de los compiladores) en la tematica para así tener otras miradas/alternativas de resolución del mismo problema de distinta forma y evalúa las ventajas y desventajas de hacerlo de esa forma u otra.
Saca tus propias conclusiones y prueba las. Tienes una herramienta invaluable que son los simuladores para tener una idea de por donde va la cosa sin quemar, romper, etc. nada.
Si un programa es complejo, divídelo en pequeñas rutinas y después trata de compatibilizarlas todas.
Recuerda que en realidad solo tu resolverás esto a lo que estas abocado, nosotros solo podemos aconsejarte en base a nuestros saberes.

Ric.


----------



## banistelrroy (Ago 16, 2017)

Tienes razón gracias por el consejo


----------



## banistelrroy (Ago 16, 2017)

hola antes de pasar a la codificacion manchester, quiero mostrarles el avance, pues el programa es para un control remoto a distancia, y la idea es que el microcontrolador solo este en trabajo o lo que quiero conseguir esque tenga consumo solo cuando este pulsada una tecla o mas de no haber nada pulsado los pic entres en modo sleep para ahorrar el consumo de labateria. antes de entrar a reposo en el programa principal el led parpadea 10 veces, de no haber nada pulsado durante esos 10 parpadeos intermitentes, los pic entran a sleep.

pues bien segui los consejos y use interrupciones en el trasmisor la del cambio de estado RBIE: RB Port Change Interrupt Enable bit junto con RBIF: RB Port Change Interrupt Flag bit, y en el receptor INTE: RB0/INT External Interrupt Enable bit y para ambos GIE: Global Interrupt Enable bit, el tema es que sin sleep funciona bien y con el sleep no funciona como debe de ser, aver si aqui me dan una ayuda porfabor.

Pregunta: tiene algo que ver los pines usados para el RX en el receptor ya que antes usaba RB1/RX ahora uso RB0/INT para poder usar la interrupcion al recepcionar un cualquier dato.


----------



## banistelrroy (Ago 17, 2017)

Bueno, a todos quiero decirles que les presento un programa de comunicación RF de 4 bits, usando 2 PIC16F628A, uno como transmisor y otro como receptor.

En la simulación la conexión es de pic a pic, pero físicamente hay una interfaz con módulos rf para hacer la trasmisión inalámbrica.

¿Alguien puede revisar el código y dar sugerencias si el código es muy extenso, redundante o se tiene que mejorar?

El código lo realicé en Microcode Studio, la simulación en proteus y lo hice siguiendo mi criterio, agregando unas sugerencias de colaboradores de este foro.

El funcionamiento que se quiere y que aparentemente se consiguió, queda así:


El proyecto es de control a distancia de 4 pulsadores.
 Cualquier botón pulsado. 1, 2 o los 4 se verá en el receptor.
Se usarán baterías recargables de 9V, por lo que es importante el consumo del circuito.
Cuando no se esté pulsando ningún botón, ambos circuitos deberán estar dormidos modo sleep o similar.
Se usan interrupciones, tanto en el emisor, como en el receptor.
Existen 1 led en el trasmisor que parpadea por lapso de tiempo al encender el circuito y después de del envío del último dato, para luego pasar a bajo consumo. Igual en el receptor
  ¿Si alguien pudiera revisar y decirme alguna sugerencia para mejorar el proyecto?
Adjunto los archivos necesarios

Programa transmisor :

```
include "modedefs.bas"
DEFINE OSC 4
CMCON = 7 ;convierte en digitales el puerto A

trisb.4 = 1
trisb.5 = 1
trisb.6 = 1
trisb.7 = 1
led_rojo var portb.3
botona var portb.4
botonb var portb.5
botonc var portb.6
botond var portb.7
flat1 var bit
flat2 var bit
flat3 var bit
flat4 var bit
x var byte
y var byte
numero var byte

on interrupt goto inicio
INTCON = %10001000
numero = 0

programa:
for x = 1 to 100
low led_rojo
next
for y = 1 to 100
high led_rojo
next
numero = numero +1
if numero = 250 then
sleep 5
endif
goto programa

inicio:
disable
if botona=0 then 
gosub led1_on
flat1 = 1
else
gosub led1_ofF
flat1 = 0
endif

if botonb=0 then 
gosub led2_on
flat2 = 1
else
gosub led2_ofF
flat2 = 0
endif

if botonc=0 then 
gosub led3_on
flat3 = 1
else
gosub led3_ofF
flat3 = 0
endif

if botond=0 then 
gosub led4_on
flat4 = 1
else
gosub led4_ofF
flat4 = 0
endif

if flat1 + flat2=0 and flat3 + flat4=0 then programa2
high led_rojo
goto inicio

led1_on:
serout portb.2,n2400,[$FF,$FF,"OK","A"]
return
led1_off:
serout portb.2,n2400,[$FF,$FF,"OK","B"]
return
led2_on:
serout portb.2,n2400,[$FF,$FF,"OK","C"]
return
led2_off:
serout portb.2,n2400,[$FF,$FF,"OK","D"]
return

led3_on:
serout portb.2,n2400,[$FF,$FF,"OK","E"]
return
led3_off:
serout portb.2,n2400,[$FF,$FF,"OK","F"]
return
led4_on:
serout portb.2,n2400,[$FF,$FF,"OK","G"]
return
led4_off:
serout portb.2,n2400,[$FF,$FF,"OK","H"]
return
GOTO INICIO

programa2:
INTCON = %10001000
resume
enable

end
```
Programa del receptor:

```
include "modedefs.bas"
DEFINE OSC 4
datos var byte
led_1 var portb.1
led_2 var portb.2
led_3 var portb.3
led_4 var portb.4
led_rojo var portb.6
flat1 var byte
flat2 var byte
flat3 var byte
flat4 var byte
x var byte
y var byte
numero var byte

on interrupt goto lop
INTCON = %10010000
numero = 0

programa:
for x = 1 to 100
low led_rojo
next
for y = 1 to 100
high led_rojo
next
numero = numero +1
if numero = 250 then
sleep 5
endif
goto programa

disable
Lop:
serin portb.0,n2400,["OK"],datos

If datos="A" then
flat1=1
endif 
if datos="B" then 
flat1=0
endif

If datos="C" then
flat2=1
endif 
if datos="D" then 
flat2=0
endif

If datos="E" then
flat3=1
endif
if datos="F" then 
flat3=0
endif

If datos="G" then
flat4=1
endif
if datos="H" then 
flat4=0
endif

if flat1=1 then low led_1
if flat1=0 then high led_1
if flat2=1 then low led_2
if flat2=0 then high led_2
if flat3=1 then low led_3
if flat3=0 then high led_3
if flat4=1 then low led_4
if flat4=0 then high led_4
if flat1 + flat2=0 and flat3 + flat4=0 then programa2
high led_rojo
goto Lop
programa2:
INTCON = %10010000
resume
enable
end
```


----------



## astroloco (Ago 17, 2017)

banistelrroy dijo:


> hola antes de pasar a la codificacion manchester, quiero mostrarles el avance, pues el programa es para un control remoto a distancia, y la idea es que el microcontrolador solo este en trabajo o lo que quiero conseguir esque tenga consumo solo cuando este pulsada una tecla o mas de no haber nada pulsado los pic entres en modo sleep para ahorrar el consumo de labateria. antes de entrar a reposo en el programa principal el led parpadea 10 veces, de no haber nada pulsado durante esos 10 parpadeos intermitentes, los pic entran a sleep.
> 
> pues bien segui los consejos y use interrupciones en el trasmisor la del cambio de estado RBIE: RB Port Change Interrupt Enable bit junto con RBIF: RB Port Change Interrupt Flag bit, y en el receptor INTE: RB0/INT External Interrupt Enable bit y para ambos GIE: Global Interrupt Enable bit, el tema es que sin sleep funciona bien y con el sleep no funciona como debe de ser, aver si aqui me dan una ayuda porfabor.
> 
> Pregunta: tiene algo que ver los pines usados para el RX en el receptor ya que antes usaba RB1/RX ahora uso RB0/INT para poder usar la interrupcion al recepcionar un cualquier dato.




Te envió los archivos para simular en proteus los módulos de RF


----------



## banistelrroy (Ago 17, 2017)

gracias astroloco


----------



## banistelrroy (Ago 17, 2017)

lo probe fisicamente y me doy con la sorpresa que la rutina programa en ambos pic tiene la misma logica que corresponden al parpadeo del led en simulacion duran lo mismo pero fisicamente el receptor dura mas y al volver de la rutina dura menos al parecer solo trasmisor trabaja correctamente, necesito una mano


----------



## astroloco (Ago 21, 2017)

banistelrroy dijo:


> lo probe fisicamente y me doy con la sorpresa que la rutina programa en ambos pic tiene la misma logica que corresponden al parpadeo del led en simulacion duran lo mismo pero fisicamente el receptor dura mas y al volver de la rutina dura menos al parecer solo trasmisor trabaja correctamente, necesito una mano



Hola en el programa del receptor te falta habilitar el bit6 del registro INTCON, el bit7 activa interrupciones globales, el bit6 activa las interrupciones externas, si no activas el bit6 no funcionara las interrupciones externas. El bit 1 de INTCON es el indicador de interrupción externa en RB0, al a  ver una interrupción se ponen alto. Hay que que volver a poner en bajo a tras de software.


----------



## banistelrroy (Ago 22, 2017)

entonces al inicio quedaria mas o menos asi:

on interrupt goto programa_2
INTCON = %11010000

programa_1:
..................
..................
goto programa_1


disable
programa_2:
.......................
.......................
......................
INTCON = %11010010
disable
resume


----------



## astroloco (Ago 23, 2017)

banistelrroy dijo:


> entonces al inicio quedaria mas o menos asi:
> 
> on interrupt goto programa_2
> INTCON = %11010000
> ...



Hola, debe ir asi INTCON = %11010000, ya el bit7 activa interrupciones globales, el bit6 activa interrupciones externas, el bit 4 activa interrupciones por RB0, el detalle seria que el bit1 es el indicador de interrupción externa en RB0, no lo debes tu poner en 1, el bit1 se ponen el solo en alto cuando detecta una interrupción en RB0, lo que necesitas hacer tú sería,es  volver a poner a bajo el bit1, para que pueda volver al detectar otra interrupción volver a poner ese en alto. 

seria  algo asi 



    programa_2:

    Disable               ; Desactivar interrupciones.

    If INTCON.1 = 1 Then INTCON.1 = 0    ;si el bit.1 de INTCON está en uno, ponerlo a cero

    Resume       ; Retornar al programa 

    Enable       ; Volver a activar interrupciones. 

De este modo vuelve a quedar listo para recibir otra interrupción por RB0


----------



## banistelrroy (Ago 24, 2017)

muchachos saben como puedo declarar para hacer el envio del resultado de una variable, ya sea en binario decimal o hexadecimal.

ejemplo: tengo declarado esto

numero var byte
NUMERO1 VAR BYTE
NUMERO2 VAR BYTE
NUMERO3 VAR BYTE
NUMERO4 VAR BYTE
-----------------------------
-----------------------------
-----------------------------
-----------------------------
despues de toda la logica me queda:
numero = NUMERO1 + NUMERO2 + NUMERO3 + NUMERO4

estoy tratando de enviar asi:

serout portb.2,n2400,["numero"]

pero nunca logro que llegue el dato, en cambio si envio una letra cualquiera llega.


----------



## D@rkbytes (Ago 25, 2017)

¿Y con qué y cómo recibes el dato?
Si dato es superior a 255 no lo podrás ver completo, necesitas separarlo y enviar MSB y LSB
En RS-232 nada más puedes enviar un Byte, o sea, de 0 a 255.
Y también es importante la forma en que se envía, porque no es lo mismo enviarlo como texto usando Dec, que enviarlo en ASCII. O sea, enviarlo directamente sin conversiones.

Así que... Aunque el dato se envié, nunca lo verás en una interfaz común.


----------



## banistelrroy (Ago 25, 2017)

El dato es el resultado de una variable del tamaño byte pero quiero saber la forma de enviar en decimal binario o hexa osea si el dato fuera 15 como lo enviaría


----------



## D@rkbytes (Ago 25, 2017)

Envíalo sin formato, ya después de recibirlo le puedes dar el formato quieras.
Por ejemplo, caso 1 sin formato:

```
If PORTA.2 = 0 Then
        Numero = 50
        SerOut PORTB.2, T9600, [Numero]
        
        While PORTA.2 = 0: Wend
    
    EndIf
```
Verás lo siguiente:

O sea, un 2, que corresponde al decimal 50 de la tabla ASCII.
Eso es enviar un número sin formato y de esa forma habrá números que no se podrán ver si la interfaz va a mostrar lo que reciba cómo texto.

Caso 2, con formato:

```
If PORTA.2 = 0 Then
        Numero = 50
        SerOut PORTB.2, T9600, [#Numero]
        
        While PORTA.2 = 0: Wend
    
    EndIf
```

Aquí ya se ve el número 50, pero se enviaron dos bytes, porque fue enviado cómo texto.
Así que todo depende de la forma en que se manden e interpreten los datos.

No es nada complicado, pero muchas personas batallan con esto.

Edit: Si le quieres dar otro formato, PBP tiene instrucciones para eso.​Por ejemplo: SerOut2 PORTB.2, T9600, [Hex Numero]
O por Hardware: HSerOut [Hex Numero]
Pero por hardware, ya se tiene que configurar el módulo USART.
Con algo así por ejemplo:

```
; Configuración USART: (9600 Bps @ 4 MHz. 9615 Bps Reales 0.16% de error.)
    SPBRG =    25    ; 00011001
    TXSTA =    36    ; 00100100
    RCSTA =    144   ; 10010000
```
A mi en lo personal me gusta usar los registros directamente, pero PBP tiene sus declaraciones.​


----------



## banistelrroy (Ago 26, 2017)

Ok entendido todo claro


----------



## banistelrroy (Ago 30, 2017)

Buenas a todos, despues de tantas pruebas y batallar con la comunicacion rf con pic, obtuve muchas resultados y la mayoria no era lo que esperaba, se torna tedioso al trabajar con modulos rf y el pic, devido a que existe mucho ruido electrico en el ambiente señales de radio, etc que hicieron que el pic actue de forma erronea, segui los consejos y obtuve mejores resultados pero aun con error.

PRUEBAS Y RESULTADOS:

1. se establecio la conexion entre los 2 pic: TX usando las instrucciones SERIN, enviando datos todo el tiempo mientres se pulse o no, esto debido a que si se apaga el trasmisor el receptor se queda en 0 por mucho tiempo e ingresan datos erroneos.
2.con ambos circuitos TX/RX enlazados siempre, al cabo de unas horas el receptor recibe algun codigo producto del ruido lo cual activa las salidas cualquiera, sin aver enviado ningun dato.

lo que me llevo a deducir que aun sigue el ruido y confunde al pic e interpreta codigo y se queda enganchado con salidas activadas.

Ahora se que necesariamente tengo que codificar los datos a enviar y una de esas codificacion es manchester,que segun la teoria funcionaria asi:

dato = 17, sus equivalencias
decimal =     17
binario  =     0001 0001
manchester=01010110 01010110

navegando por la red encontre un ejemplo de comunicacion rf con codificacion manchester, encontre una rutina para la codificacion:

Variables declaradas:


S_Byte      Var   Byte            
D           VAR BYTE
I           var byte
ENCODED     VAR WORD
ENCODED_LOW VAR ENCODED.LOWBYTE
ENCODED_H   VAR ENCODED.HIGHBYTE
DECODED     VAR  BYTE
.............................................
............................................
.............................................

MAN_ENCODING:
        FOR D = 0 TO 7
            IF  S_BYTE.0[D] = 0 THEN
                ENCODED.0[D*2] = 0
                ENCODED.0[D*2+1] = 1
            ELSE
                ENCODED.0[D*2] = 1
                ENCODED.0[D*2+1] = 0
            ENDIF
        next    D
        return

El problema es que me da el resultado invertido po ejemplo en :
ENCODED_H: me queda asi 10101001
ENCODED_LOW: me queda asi 10101001

El codigo queda en 2 BYTES:  BYTELOW y BYTEHIGH

no entiendo el motivo del resultado invertido ya que tenia realizar opearciones con la codificacion tal y como debe de ser.


----------



## D@rkbytes (Ago 31, 2017)

Dejo un ejemplo de codificación y decodificación Manchester.
En el receptor o decodificador existe un bug al cual no le encontré el motivo, pero si solución.
Lo dejo comentado en el código, tal vez alguien pueda encontrar el error.


----------



## roberttorres (Ago 31, 2017)

D@rkbytes dijo:


> Dejo un ejemplo de codificación y decodificación Manchester.
> En el receptor o decodificador existe un bug al cual no le encontré el motivo, pero si solución.
> Lo dejo comentado en el código, tal vez alguien pueda encontrar el error.



Buenas
En el receptor cuando comparas la variable Dato(tipo word) = $BB sin el 1 sencillamente no hace la comparación, pero si creas otra variable por ejemplo:
Comparar var byte
comparar = Dato
if comparar = $BB then portb.4 = 1, en ese caso si funciona, ahora no se porque al comparar una variable tipo word no funciona y si lo hace con una variable tipo byte(solo soy un hobbista).

PD: también dejo un ejemplo que encontré en el foro de picbasic con algunas modificaciones que hice, pero no lo probé en físico:


----------



## banistelrroy (Sep 1, 2017)

roberttorres tus librerias de los modulos rf no funcionan tiene que estar conectado directo el tx - rx


----------



## banistelrroy (Sep 2, 2017)

En físico tampoco funciona no cimunica


----------



## roberttorres (Sep 2, 2017)

banistelrroy dijo:


> En físico tampoco funciona no cimunica


Prueba el ejemplo de el compañero D@rkbyte, como dije el código del ejemplo que subí no lo probé en físico, solo lo probé en la simulación y aparentemente funciona bien.

Pd: si el código no funciona seria conveniente que un moderador lo borrara para no crear confusión en los que quieran aprender.


----------



## banistelrroy (Sep 2, 2017)

sirve como ayuda, estoy batallando con la comunicacion serial via rf, es tedioso ya que ay que camuflar el codigo por los ruidos que hay y afectan al pic.


----------



## banistelrroy (Sep 8, 2017)

Hola a todos denuevo aqui, un poco con demora pero esque anduve ocupado, bueno les quiero decir que logre un comunicacion hasta el momento muy buena falta probar una par de dias para descartar errores, ya que el proyecto se trata de un radio control de 4 canales donde lo que activare seran coches a bateria para niños, ya logicamente con su interfaz con relays que casi ya la tengo terminada, lo que quiero conseguir esque no falle o mejor dicho que no se balla activar nada solito sin pulsar algun boton. loque me dio problemas fue el ruido ya que al probar funcionaba ok pero al apagar el trasmisor, en el receptor se prendian y se apagaban solos, lo que hice fue seguir unos tics que me dieron y pues use codificacion manchester, con una cabesera de datos y mejoro el tema.

En el trasmisor uso la interrupcion por cambio de estado del RB4 - RB7, en el receptor en un inicio use la interrupcion por RB0 pero, ya no la uso debido a que el receptor en todo momento esta capatando datos del exterior asi que siempre abra una interrupcion y el dato lo tendria que descartar por sofware asumo que seria lo mismo si no la uso, no se si estoy equivocado,adjunto el proyecto para que me digan como vas pues como les digolo hice investigando un poco pero se que es tedioso establecer una comunicacion estable y segura, talvez se mejore o se pueda agregar algo, ya que no quiero que el cochesito camine solito con un niño dentro. necesito su apoyo gracias a todos los que vallan a opinar.


----------



## Dario (Sep 17, 2017)

Hola gente, tanto tiempo. aqui de nuevo molestando con una consulta jeje... 
resulta que estoy intentando hacer funcionar un modulo DFPLAYER MINI y he logrado comunicar el pic con el modulo. el unico problema que tengo, es que cuando reproduce la pista que le he ordenado reproducir, en este caso la numero 1, reproduce la ultima pista cargada. y si le cambio el numero de pista, por ejemlo, la 2, no funciona. queria saber si alguno de uds. ha trabajado con pbp y este modulo y me puede orientar un poquito. desde ya, se agradece cualquier idea. aqui les dejo el codigo que escribi, saludosss  
PD: (ya vi un ejemplo en este mismo thread, pero no lo puedo entender y ademas no puedo usar el hserout en el micro... , perdon )


```
@ device  pic16F876A, hs_osc, wdt_off, pwrt_on, lvp_off, protect_off, bod_off
define loader_used 1
define osc 20     ; especifica que se va a utilizar uno de 20 Mhz
'*****************************************************************
adcon1 = 7        'se desactivan entradas analógicas'
cmcon  = 7        'se desactivan los comparadores (I/O digitales)'
trisa = %00000001         'se programa el puerto A como salida' 
trisb = %00000000         'se programa el puerto B como salida'
trisc = %00000000         'se programa el puerto C como salida'
PORTA=%00000001
PORTB=%00000000
PORTC=%00000000

'*****************************************************************
include "modedefs.bas"



LOOP:
IF PORTA.0=0 THEN 
GOSUB TRANSMITE
ENDIF
PAUSE 100
GOTO LOOP

TRANSMITE: 'PLAY TRACK n-1 
IF PORTA.0=0 THEN TRANSMITE
SEROUT portb.7,t9600,[$7E,$FF,$06,$03,$00,$00,$01,$FE,$F7,$EF] ' play track n.1 
PAUSE 10
RETURN

END
```


----------



## D@rkbytes (Sep 17, 2017)

Yo tuve ese problema, pero no recuerdo si fue con el dfplayer mini o con otro módulo.
El asunto era que reproducía las pistas por fecha de creación y no por nombre de pista.

¿Renombraste los archivos como 001.mp3, 002.mp3, 003.mp3, etc.?


----------



## Dario (Sep 17, 2017)

D@rkbytes dijo:


> ¿Renombraste los archivos como 001.mp3, 002.mp3, 003.mp3, etc.?



Si, asi lo hice... todavia no puedo lograr nada diferente jeje...


----------



## D@rkbytes (Sep 17, 2017)

Entonces puede ser que sí sea ese el módulo con el que tuve ese problema.
Posteriormente conseguí un módulo WT5001M02, pero lo olvidé y nunca lo usé.

Prueba cambiando la fecha a los archivos con esta aplicación: SetFileDate
Si cambia el orden de reproducción, entonces se debe a lo que comenté anteriormente.


----------



## Dario (Sep 17, 2017)

Ok, muchas gracias por tu tiempo amigo D@rkbytes, ya lo logre jeje... solo habia que hacer la siguiente modificacion:


Y el codigo quedaria asi:


```
@ device  pic16F876A, hs_osc, wdt_off, pwrt_on, lvp_off, protect_off, bod_off
define loader_used 1
define osc 20     ; especifica que se va a utilizar uno de 20 Mhz
'*****************************************************************
adcon1 = 7        'se desactivan entradas analógicas'
cmcon  = 7        'se desactivan los comparadores (I/O digitales)'
trisa = %00000001         'se programa el puerto A como salida escepto A0' 
trisb = %00000000         'se programa el puerto B como salida'
trisc = %00000000         'se programa el puerto C como salida'
PORTA=%00000001
PORTB=%00000000
PORTC=%00000000

'*****************************************************************
include "modedefs.bas"

LOOP:
IF PORTA.0=0 THEN 
GOSUB TRANSMITE
ENDIF
PAUSE 100
GOTO LOOP

TRANSMITE: 
SEROUT portb.0,T9600,[$7E,$FF,$06,$03,$00,$00,$01,$EF] ' play track n.1 
PAUSE 1000
RETURN

END
```


----------



## D@rkbytes (Sep 17, 2017)

Muy bien.  Yo siempre enviaba el checksum.
En un rato que tenga tiempo me daré a la tarea de volver a probar ese módulo sin enviarlo.

Por ahora estoy bastante ocupado realizando una interfaz para el ELM327
Y aunque en el mercado ya existen, la que estoy realizando es bastante especial.


----------



## Dario (Sep 17, 2017)

Muy bueno. hoy ya vienen con comunicacion al celular, pero habemos personas que tenemos un autito viejito a las que nos vendria muy bien algo asi jeje... se le podria aumentar un modulo bluetooth para conectar a una aplicacion del celular jeje...


----------



## ATX (Oct 9, 2017)

Buenas amigos del foro, tengo una pregunta, estoy realizando un proyecto de una maquina para embobinar, la idea es que en un display se muestren los mensajes de dichos registros de cada evento, con un teclado matricial se ingresa el numero de vueltas y un sensor de efecto hall se encargara de percibir cuando de una vuelta el motor, mi duda es la siguiente, como hago para guardar 3 digitos en una sola variable, ejemplo, yo ingreso que la maquina va a dar 200 vueltas, cuando digito cada valor en el teclado se guardan cada uno en una misma variable, esa parte no la puedo entender.


----------



## pandacba (Oct 9, 2017)

Si para digito utilizaste una variable, cuando validas los sumas en otra.
ti tienes A, B,C,D como tus variables, utilzas las tres primeras y la suma las guardas en D
Si tienes 128 vueltas, al valida Aserá=1, B será =2 y C será = 8
Ahora que haces, A es unidad de centena por lo tanto multiplicas por 100, B es unidad de decena la multiplias por 10 y C como es unida la dejas tal cual.
ahora haces D=A+B+C en el ejemplo tendras en D almacenado 128 que es lo que te interesa para trabajar
luego haces tu bucle y comparas el valor actual con D y termina cuando son iguales  , es una forma o vas decrementando D hasta que sea 0
O haciendo D parte de la variable del bucle "if"


----------



## torres.electronico (Oct 10, 2017)

ATX dijo:


> Buenas amigos del foro, tengo una pregunta, estoy realizando un proyecto de una maquina para embobinar, la idea es que en un display se muestren los mensajes de dichos registros de cada evento, con un teclado matricial se ingresa el numero de vueltas y un sensor de efecto hall se encargara de percibir cuando de una vuelta el motor, mi duda es la siguiente, como hago para guardar 3 digitos en una sola variable, ejemplo, yo ingreso que la maquina va a dar 200 vueltas, cuando digito cada valor en el teclado se guardan cada uno en una misma variable, esa parte no la puedo entender.



Hace un tiempo hice algo, ahi te comparto lo que yo arme... respecto a como lo hice, te cito algunos fragmentos


```
; DECLARACION DE VARIABLES     
a var byte
b var byte
DEG_1  var    Word
DEG_2  var    Word
DEG_3  var    Word
DEG_4  var    Word
DIGITO_1 var   Word
DIGITO_2 var   Word
DIGITO_3 var   Word
DIGITO_4 var   Word
Unidad   var   Word          ;unidad
Decena   var   Word          ;decena
Centena  var   Word          ;centena
Umil     var   Word
dig_VUELTA var word   
cuarteto   var byte
AuxW       var word        ;sayi var word
AuxB_a     var byte        ;tus var byte
AuxB_b     var byte        ;tus_b var byte
Aux1 var byte
aux2 var byte
aux3 var byte
aux4 var byte

inicio:
;****
;****
;****
;****
;****
programar:
;****BOTONES UNIDAD DE MIL********
IF Umil_MAS = 0 THEN
WHILE Umil_MAS = 0 : WEND
Umil=Umil + 1
if Umil > 9 then Umil=9
if Umil < 0 then Umil=0
aux1=umil
ENDIF
IF Umil_Menos = 0 THEN
WHILE Umil_Menos = 0 : WEND
Umil=Umil - 1
if Umil > 9 then Umil=9
if Umil < 0 then Umil=0
aux1=umil
ENDIF
;****BOTONES CENTENA********
;similar a U. de mil
aux2=centena
;****BOTONES DECENA********
;similar a U. de mil
aux3=decena
;****BOTONES UNIDAD********
;similar a U. de mil
aux4 = unidad
ENDIF
pause 10

digito_1 = aux1  
digito_2 = aux2  
digito_3 = aux3  
digito_4 = aux4 
dig_vuelta=digito_1+digito_2+digito_3+digito_4 
auxW=(digito_1*1000)+(digito_2*100)+(digito_3*10)+(digito_4*1)
;****
;****
;****
arranque:
If sensor=0 Then 
dig_vuelta=dig_vuelta-1 
auxw = auxw - 1
endif
If auxw =0 Then  GoTo FIN
pause 150
goto inicio
```

espero que te sea de ayuda en algo... saludos a todos y todas


----------



## carlosloza (Oct 11, 2017)

hola soy nuevo en este foro aun no se como funciona o como hacer un seguimiento de los participantes





ATX dijo:


> Buenas amigos del foro, tengo una pregunta, estoy realizando un proyecto de una maquina para embobinar, la idea es que en un display se muestren los mensajes de dichos registros de cada evento, con un teclado matricial se ingresa el numero de vueltas y un sensor de efecto hall se encargara de percibir cuando de una vuelta el motor, mi duda es la siguiente, como hago para guardar 3 digitos en una sola variable, ejemplo, yo ingreso que la maquina va a dar 200 vueltas, cuando digito cada valor en el teclado se guardan cada uno en una misma variable, esa parte no la puedo entender.


 

hola como estas queria saber si pudiste terminar el bobinador??


----------



## ATX (Oct 11, 2017)

carlosloza dijo:


> hola soy nuevo en este foro aun no se como funciona o como hacer un seguimiento de los participantes
> 
> 
> 
> ...



De hecho si pude, pero lo tengo en pantalla LCD 16X2, pude resolver el problema de la comparacion de los digitos ingresados del teclado con los del numero de vueltas dados por el motor





torres.electronico dijo:


> Hace un tiempo hice algo, ahi te comparto lo que yo arme... respecto a como lo hice, te cito algunos fragmentos
> 
> 
> ```
> ...



Muchas gracias con tus ideas me dio una solución, pensé en esto, usar 3 variables, ejemplo SET1, SET2, SET3 cada una corresponde cuando presiono una tecla, como es de 3 digitos por el momento, cuando presiono un numero se guardar el valor en SET1, cuando presiono otro numero avanza a guardar en SET2 y luego avanza y guarda en SET3, bien ahora salta en una subrutina al bucle donde empieza el motor a girar y a la vez a contar las vueltas que va dando el motor.

Ahora la solucion, cree otras 3 variables, VUELTAS1, VUELTAS2, VUELTAS3 empieza sumando de 0 a 9 VUELTAS3 y cuando es mayor de 9 suma por 1 a VUELTAS2 ahora tendriamos algo asi 010 serian 10 vueltas que a dado el motor, luego 3 condicionales IF para ver si SET1 es igual a VUELTAS1, si SET2 es igual a VUELTAS2 y si SET3 es igual a VUELTAS3, todo dio perfecto asi comparando variable por individual si pudo comparar y decifrar el numero de vueltas para detener el programa. 





			
				ATX dijo:
			
		

> De hecho si pude, pero lo tengo en pantalla LCD 16X2, pude resolver el problema de la comparacion de los digitos ingresados del teclado con los del numero de vueltas dados por el motor
> 
> 
> 
> ...



Aqui les dejo este proyecto como aporte a la comunidad, se que lo pueden mejorar con mas modificaciones pero el principo del programa puede servir de mucho


----------



## pandacba (Oct 11, 2017)

No te hacen falta tres variables para contar, no tiene sentido, porque las vueltas o las contas en una sola variable hasta llegar al total(suma de los digitos) o la haces la variable de un fucler for hasta llegar a 0


----------



## ATX (Oct 12, 2017)

pandacba dijo:


> No te hacen falta tres variables para contar, no tiene sentido, porque las vueltas, o las contás en una sola variable hasta llegar al total (suma de los dígitos) o las haces en la variable de un bucle for hasta llegar a 0


Comprendo lo que dices, pero la idea no estuvo mal, funciona igual y creo que es menos programación.
El  tuyo es más complejo y la verdad fue lo último que se me ocurrió.


----------



## roberttorres (Oct 12, 2017)

Buenas
¿Ya lo probaste en físico?, tu código tiene problemas de estructura, en la simulación de proteus esta desbordando la pila por la instrucción de retorno(stack overflow return instruccion), eso se debe a que una rutina esta anidada dentro de otra(gosub) y no tiene la instrucción de retorno(return)lo que hace que el micro no sepa en que parte del código retornar desbordando así la pila.


----------



## ATX (Oct 12, 2017)

roberttorres dijo:


> Buenas
> ¿Ya lo probaste en físico?, tu código tiene problemas de estructura, en la simulación de proteus esta desbordando la pila por la instrucción de retorno(stack overflow return instruccion), eso se debe a que una rutina esta anidada dentro de otra(gosub) y no tiene la instrucción de retorno(return)lo que hace que el micro no sepa en que parte del código retornar desbordando así la pila.


Sí, ya lo he probado y no da ningún error, es el proteus.
Al programa le corregí unos errores, después del 099 no podía comparar, le agregué unos condicionales IF y ahora sí puede trabajar.



Aquí la mejora del proyecto:


----------



## pandacba (Oct 12, 2017)

Me alegro que lo hayas echo funcionar, pero respecto de lo que dijiste como yo te lo plantee lleva más código, no es así, precisamente esta planteado para utilizar el menor código posible, al utilizar una sola variable para el total, lleva mucho menos código ya que ese proceso lo tenes multiplicado como tantas veces varibles individuales tienes.
En el que yo hice utilice una memoria flash externa para almacenar esa variable, asi si apago la máquina no debo setear todo de nuevo al encenderla, como me sobraban pines le di la posibilidad de utilzar un display LCD o uno basado en 7 segmentos y algunos extras más que no recuerdo


----------



## torres.electronico (Oct 18, 2017)

Buenas tardes; Alguien tendra por casualidad en sus archivos, algun ejemplo de comunicacion bidireccional con un NRF 24L01 que pueda compartir aqui? No encontre informacion potable y estoy rebotando contra la pared 
Saludos


----------



## pandacba (Oct 18, 2017)

No utilizaste el buscador, ese tema esta en el foro
Comunicación por Radiofrecuencia entre PICs y nRF24L01
también tenes esto otro
16F876 & nRF24L01 - Robótica

En el foro de Microchip
PIC16F887 + wireless transmitter nRF24L01 | Microchip

[SOLVED] PIC16F886 SPI settings with nRF24L01+ | Microchip

En el foro de Mikroelektronika
MikroElektronika Forum • View topic - nRF24L01 and pic16f628a

MikroElektronika Forum • View topic - nRF24L01+ with PIC16F877A and no libraries

MikroElektronika Forum • View topic - library for NRF24L01

Espero te sea de utilidad


----------



## torres.electronico (Oct 18, 2017)

El bus ador del foro fue lo primero que use... Si lees mi enunciado, y si miras en el tópico donde estamos, busco info en pbp...


----------



## pandacba (Oct 18, 2017)

Esto esta en pbp
https://sites.google.com/site/avcnetsite/mcu

https://forum.sparkfun.com/viewtopic.php?t=8455#p36498

https://www.download-geek.com/download/book/picbasic+pro+nrf24l01+tutorial.html?aff.id=8509&aff.subid=99


----------



## torres.electronico (Oct 18, 2017)

Si, ese ejemplo fue el único que encontre pero no funciona


----------



## torres.electronico (Oct 18, 2017)

pandacba dijo:


> Esto esta en pbp
> https://sites.google.com/site/avcnetsite/mcu
> 
> https://forum.sparkfun.com/viewtopic.php?t=8455#p36498
> ...



Por casualidad, el documento del ultimo link, lo viste en algún otro lugar? Intente hacer cuenta pero en la versión prueba, te pide los datos de la tarjeta de crédito, o sea, todo lo que te piden por teléfono para pagar... clave de seguridad...medio peligroso


----------



## pandacba (Oct 18, 2017)

Me fijo y si lo encuentro te lo paso por aquí


----------



## ATX (Oct 20, 2017)

Buenas amigos aqui un proyecto bastante util a la hora de tener una lavadora averiada por la tarjeta, me dispuse a automatizarla con un sencillo microcontrolador PIC16F628A, quedo automatizada con unas funciones a elegir, si solo lavar, solo enjuagar o realizar todo el proceso de llenado, lavar, enjuagar y secar la ropa, luego subo un video para que observen el funcionamiento, hay que elegir el tipo de agua si fria o caliente, luego elegimos si lavar, enguajar o todo el proceso con la tecla de funcion, con start inicia el proceso.


----------



## pandacba (Oct 20, 2017)

Puedes publicar tu esquema en un formato de dibujo universal? jpg, png, etc ya que el formato de tu esquema no es muy utilizado en este foro, y para que todo los podamos ver siempre publicamos el esquema ya se en un formato conocido como los mencionados o en un pdf, asi esta al alcance de todos
Desde ya gracias por compartirlo


----------



## ATX (Oct 20, 2017)

Asi seria el esquema electronico


----------



## ATX (Oct 21, 2017)

No se enojen gente, recuerden que solo lo hice como prueba para salvar la lavadora ya que la tarjeta original cuesta mucho dinero, sin insultar a nadie de changos ni nada por el estilo, del medidor de agua quite esa parte, la deje estandar en el llenado, su rutina se basa en ciclos de tipo FOR, la quise hacer con un reloj temporizado usando el TMR0 pero daba muchos errores.


----------



## nelson enrique llontop (Mar 26, 2018)

buenos dias , estoy trabajando con  el pic 18f26k22 y necesito activar los dos módulos usart , solo he podido activar el usart1 y el usart2 he tenido complicaciones nose que esta pasando al parecer es un tema de oscilador no estoy seguro algun ejemplo estoy usando pbp 3.0 tambien tengo el 2.6
algunas indicaciones serian de gran ayuda muchas gracias.


----------



## pandacba (Mar 26, 2018)

Has leido toda la hoja de datos del micro? has buscado información al respecto en la web de microchip?
Has consultado o buscado en el foro de microchip?
18F26k22, priority interrupts and misterious behaviour with USART (reset?). | Microchip
Le has dado uso al fedback de microchip?


----------



## nelson enrique llontop (Mar 27, 2018)

Sí, en eso estoy. Estoy investigando y ya he logrado activar los dos módulos pero todavía no entiendo cómo configurar el oscilador para así lograr un cálculo exacto para el cambio de baudios.
Quiero que obedezcan a la fórmula que está en el manual, lo cual no logro conseguir, siempre hay una variación en el usart2.
¿Alguna idea?


----------



## D@rkbytes (Mar 27, 2018)

En realidad es muy sencillo y prácticamente es igual que configurar el módulo USART de los PIC que nada más tienen uno.
Al ser dos módulos, cada uno tiene registros independientes y eso es lo que se debe tener en cuenta.



Ya que veo que se te ha complicado, mejor adjunto un ejemplo. (PBP3)
Como esto es realmente muy fácil de implementar, preferí usar interrupciones.


----------



## nelson enrique llontop (Mar 29, 2018)

D@rkbytes dijo:


> En realidad es muy sencillo y prácticamente es igual que configurar el módulo USART de los PIC que nada más tienen uno.
> Al ser dos módulos, cada uno tiene registros independientes y eso es lo que se debe tener en cuenta.
> 
> Ver el archivo adjunto 165124
> ...



Sí, descubrí mi error. Estaba simplemente en el fuse PS.
Quisiera preguntarle si funciona como half duplex,  pues quiero comunicarme con un equipo que tiene una velocidad no estándar de 5787, desde mi PC  a 9600
¿Sería factible? Gracias y saludos.


----------



## D@rkbytes (Mar 29, 2018)

nelson enrique llontop dijo:


> Sí, descubrí mi error. Estaba simplemente en el fuse PS.


Ese Fuse no existe.
Yo únicamente usé los siguientes: FOSC = HSHP, IESO = ON, WDTEN = OFF


nelson enrique llontop dijo:


> Quisiera preguntarle si funciona como half duplex


Half Duplex y Full Duplex.
Date un tiempo para leer la hoja de datos.


nelson enrique llontop dijo:


> quiero comunicarme con un equipo que tiene una velocidad no estándar de 5787, desde mi PC a 9600
> ¿Sería factible?


No se puede lograr la comunicación si las velocidades de los dispositivos son diferentes.


----------



## nelson enrique llontop (Mar 30, 2018)

D@rkbytes dijo:


> Ese Fuse no existe.
> Yo únicamente usé los siguientes: FOSC = HSHP, IESO = ON, WDTEN = OFF
> 
> Half Duplex y Full Duplex.
> ...




me explico quiero utilizar el pic como un conversor de baudios usando los dos modulos usart (hserin 9600 con hserot2 a 5787)de ida  y (hserin2-5787 con hserot9600) de vuelta los dos modulos hacerlo un conversor  rx y tx me imagino que esta manera si podria comunicarme con el equipo o me estoy equivocando es posible hacer los dos modulos uno solo. seria factible la comunicacion .


----------



## D@rkbytes (Mar 30, 2018)

Sí es posible, no encuentro el problema.


----------



## nelson enrique llontop (Abr 12, 2018)

Buenas tardes 


D@rkbytes dijo:


> Sí es posible, no encuentro el problema.


 he tenido problemas con la implementacion del convertidor de baudios de 9600 a 5787 la verdad he configurado los registros como me indico ,tambien los registros     SPBRG1 y  SPBRG2 para la taza de baudios par que no tenga mucho error. pero al probar puenteando el rx con tx para qu e me regrese la dada que envio por la pc a 9600, me regresan datos imcompletos no se que estoy haciendo mal quisas sea la programacion ,quisiera que fuera tan preciso como la usart de una pc aalgun alcance o alguna otra forma de poder cambiar a 5787 baudios en la pc seria interesante .
adjunto el programa.


----------



## D@rkbytes (Abr 12, 2018)

nelson enrique llontop dijo:


> Al probar puenteando el Rx con Tx para que me regrese la dada que envío por la PC a 9600, me regresan datos incompletos.


Para 9600 Bps @ 20 MHz, el valor de SPBRGX debe ser 130 y para 5787 Bps, de 215


nelson enrique llontop dijo:


> Quisiera que fuera tan preciso como la USART de una PC.


La precisión que alcance el PIC será suficiente para que el programa de PC enganche.


nelson enrique llontop dijo:


> Algún alcance o alguna otra forma de poder cambiar a 5787 baudios en la PC, sería interesante.


Necesitas un terminal que permita establecer ese baud rate.


----------



## nelson enrique llontop (Abr 13, 2018)

D@rkbytes dijo:


> Para 9600 Bps @ 20 MHz, el valor de SPBRGX debe ser 130 y para 5787 Bps, de 215
> 
> La precisión que alcance el PIC será suficiente para que el programa de PC enganche.
> 
> Necesitas un terminal que permita establecer ese baud rate.



si, la configuracion es correcta tal como usted dice ,pero de alguna manera al enviar datos esta pierde algunos ,quisas sea el programa,no se lo que sera alguna idea .el terminal que me permite establecer los baudios a 5787 desde la pc directamente ,existe o tengo que implementarlo.si existe como lo puedo conseguirlo y si tengo implementarlo como lo implemento,que copilador ,algunas pautas para hacerlo ,muchas gracias por su ayuda


----------



## D@rkbytes (Abr 13, 2018)

Corrijo lo anterior. Para 9600 Bps @ 20 MHz. El valor de SPBRGX debe ser 129
Creo que me quedé pensando con el valor que pusiste en el programa que subiste.

Calculado con una aplicación mía:


Comprobado con otra aplicación similar:



nelson enrique llontop dijo:


> ¿El terminal que me permite establecer los baudios a 5787 desde la pc directamente, existe o tengo que implementarlo?
> Si existe, ¿Cómo puedo conseguirlo y si tengo implementarlo, cómo lo implemento?
> ¿Qué copilador? ¿Algunas pautas para hacerlo?


No sé si exista, yo diseñé mi propia interfaz RS-232 que sí lo permite.

El compilador usado fue Visual Studio 6 en Basic

Aquí está el enlace del proyecto: 
Interfaz RS-232 PIC PC (Proyecto Completo VB6)

En esa entrega no se tiene esa opción, pero si sabes programar en Visual Basic, fácilmente podrás modificar el proyecto y añadir las funciones o características que requieras.
Y si no tienes conocimientos de ese tipo de programación, aquí adjunto la versión más actual. (Incluyo el calculador de SPBRG)


----------



## nelson enrique llontop (Abr 14, 2018)

D@rkbytes dijo:


> Corrijo lo anterior. Para 9600 Bps @ 20 MHz. El valor de SPBRGX debe ser 129
> Creo que me quedé pensando con el valor que pusiste en el programa que subiste.
> 
> Calculado con una aplicación mía:
> ...



lo que necesito es codigo fuente de la version mas actual  para poder registrar otros baudios y de alguna forma guiarme ,gracias


----------



## D@rkbytes (Abr 14, 2018)

En la versión que subí se puede establecer cualquier baud rate entre 110 y 256000 Bps.
En "Baud rate" debes seleccionar "Otro" para que puedas ingresarlo en donde dice "Otro Baud rate".


----------



## nelson enrique llontop (Abr 16, 2018)

D@rkbytes dijo:


> En la versión que subí se puede establecer cualquier baud rate entre 110 y 256000 Bps.
> En "Baud rate" debes seleccionar "Otro" para que puedas ingresarlo en donde dice "Otro Baud rate".
> Ver el archivo adjunto 165783


si eso si, solo que queria la fuente de esta version  actualizada o alguna rutina referente para poder implementarlo e incluirlo en mi sofware que estoy trabando para controlar desde mi pc  a 5787 o cualquier otro baudaje.


----------



## D@rkbytes (Abr 16, 2018)

Desde la primer versión está la rutina en donde se agregan los Bps.


```
With cmbBauds ' Agregar los BPS al ComboBox cmbBauds
    .AddItem "110"
    .AddItem "300"
    .AddItem "600"
    .AddItem "1200"
    .AddItem "2400"
    .AddItem "4800"
    .AddItem "9600"
    .AddItem "14400"
    .AddItem "19200"
    .AddItem "28800"
    .AddItem "38400"
    .AddItem "56000"
    .AddItem "128000"
    .AddItem "256000"
    .ListIndex = 6 ' Por default en 9600 Baudios
End With
```
En la última versión nada más se agregó algo muy sencillo.


```
Private Sub cmbBauds_Click()
    If cmbBauds.Text = "Otro" Then
        txtBaudRate.Enabled = True
        OtherBaudrate = 1
    Else
        txtBaudRate.Enabled = False
        OtherBaudrate = 0
    End If
End Sub
```
En la rutina Click de cmdOK:


```
Private Sub cmdOK_Click()
    ' Seleccionar el modo de conexión serial.
    If cmbBauds.Text = "Otro" Then
        OtherBaudrate = 1
        Bauds = Val(txtBaudRate.Text)
       
        If Bauds = 0 Then
            MsgBox "Debe proporcionar un valor para el Baudrate.", vbInformation, "Error en el Baudrate"
            txtBaudRate.SetFocus
            Exit Sub
        ElseIf Bauds < 110 Then
            MsgBox "El Baudrate no puede ser inferior a 110 Baudios.", vbExclamation, "Error en el Baudrate"
            txtBaudRate.SetFocus
            Exit Sub
        ElseIf Bauds > 256000 Then
            MsgBox "El Baudrate no puede ser superior a 256000 Baudios.", vbExclamation, "Error en el Baudrate"
            txtBaudRate.SetFocus
            Exit Sub
        End If
    Else
        Bauds = Trim(cmbBauds.Text)
        OtherBaudrate = 0
    End If
```
En la rutina ReadConfig:


```
OtherBaudrate = CByte(GetSetting(App.CompanyName, App.Title, "USER_BAUDRATE", 1))
    txtBaudRate.Text = GetSetting(App.CompanyName, App.Title, "USER_BAUDS", "5000")
```
En la rutina WriteConfig:


```
If OtherBaudrate = 1 Then
        SaveSetting App.CompanyName, App.Title, "USER_BAUDS", txtBaudRate.Text
    Else
        SaveSetting App.CompanyName, App.Title, "BAUDS", cmbBauds.Text
    End If
```
Y la variable OtherBaudrate es del tipo Byte, pero también puede ser Boolean.


----------



## nelson enrique llontop (Abr 19, 2018)

D@rkbytes dijo:


> Desde la primer versión está la rutina en donde se agregan los Bps.
> 
> 
> ```
> ...



EXELENTE,tengo una duda estoy probando comunicacion desde mi pc al equipo  que quiero gobernar un equipo que tiene el siguiente formato de trabajo 


es posible establecer comunicacion desde mi pc con tu terminal al equipo, ps estoy enviando comandos ascci pero en realidad no obtengo respuesta,tu terminal permite enviar estos comandos sin modificarlos  o como haria para establecer comunicacion alguna idea .


----------



## D@rkbytes (Abr 19, 2018)

Sí, es el protocolo o norma estándar RS-232.
Lo que debes tener en cuenta es lo que se menciona: 8 data bits (_*least significant bit transmitted first*_)
O sea que el bit menos significativo debe ser enviado primero.


----------



## leemkapoh (Abr 21, 2018)

Hola Todo el mundo,
Intenté escribió en español, sólo descargar estudio de compilador pic microcódigo básico como una versión de prueba de 15 días, quiero trató de compilar el código cuando llegué de este foro, el PIC16F628A IC así como el código, cuando compilé que tengo un error , el error, así como mi attched foto en mi primer post.
Could ayudarme por favor, qué ajustes a solucionado ese problema.
Esta es mi primera vez use un microcódigo estudio Picbasic (compilador), realmente estoy utilizar compilador MikroC, que quiero aprender a en compilador de PIC Basic.



Gracias.

Saludos,

Kapoh


----------



## D@rkbytes (Abr 21, 2018)

Es necesario ver el código completo, sobre todo, cómo fue escrita la palabra de configuración.
HS_OSC = Oscilador de alta frecuencia. (Cristal superior a 4 MHz)
También es necesario saber qué versión de prueba estás usando y qué compilador estás usando.
El entorno puede usar MPASM o sus nativos PBP Compilers.

Por favor, adjunta el código completo dentro de un archivo comprimido, o usa la opción del editor para insertar código.


----------



## Miembro eliminado 356005 (Abr 21, 2018)

El mensaje de error indica que estás intentando compilar un código escrito en un lenguaje que no entiende el compilador.


----------



## isaiasjea (May 14, 2018)

Hola buenas tardes saludos al todo el foro!!!
Después de un rato que no había entrado al foro, aquí regreso!!
aquí les comparto un código de comunicación de los Módulos TLP434(A) y  RLP434(A) de Radio Frecuencia.



yo lo eh probado físicamente y no eh tenido problemas de interferencia.

Trasmisor:


```
''******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
_intrc_osc_pwrt_on_wdt_off_mclr_off_lvp_off_protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                         'COMPARADORES APAGADOS
TRISA = %00000000                 'SALIDA Y ENTRADAS DEL PUERTO A      
TRISB = %00000001                 'SALIDA Y ENTRADAS DEL PUERTO B
PORTA = 0                         'LIMPIAMOS EL PUERTO A
PORTB = 0                         'LIMPIAMOS EL PUERTO B
TT VAR BYTE                       'VARIABLE DONDE RECIBE EL DATO
TT = 84                           'VALOR QUE SE LE ASIGNO A LA VARIABLE
'*******************************************************************************
Include "modedefs.bas"            'INCLUYE LA LIBRERIA SERIAL

serout PORTB.1,N2400,[$FF,$FF,$10]
INICIO:
IF PORTB.0 THEN
pause 500
SEROUT  PORTB.1,N2400,[$FF,$FF,"OK","A",Tt]
ENDIF
gOTO INICIO
```

Receptor:



```
''******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
_intrc_osc_pwrt_on_wdt_off_mclr_off_lvp_off_protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                         'COMPARADORES APAGADOS
TRISA = %00000000                 'SALIDA Y ENTRADAS DEL PUERTO A        
TRISB = %00000010                 'SALIDA Y ENTRADAS DEL PUERTO B
PORTA = 0                         'LIMPIAMOS EL PUERTO A
PORTB = 0                         'LIMPIAMOS EL PUERTO B
B0 var byte                       'VARIABLE DONDE RECIBE EL DATO
'*******************************************************************************
Include "modedefs.bas"            'INCLUYE LA LIBRERIA SERIAL

INICIO:
SERin PORTB.1,N2400,[$FF,$FF,"OK","A"],B0
if b0="T" then high PortB.0:pause 1000:low PortB.0
gOTO INICIO
```

Les comparto los códigos y la simulación
Saludos y seguimos en contacto.


----------



## cmdima (May 28, 2018)

Hola a todos, estoy retomando un tema de vieja data programando un pic que me dejo con muchas dudas y nunca pude hacer que el circuito anduviera como quería.

Hace unos años compre un equipo que venía con una botonera con dos botones. El primer botón me habilita un circuito por 6 minutos y el segundo botón habilita el mismo circuito por 12 minutos. Esta botonera la reemplace por un circuito que arme donde en vez de botones puse un fichero igual al de los arcades y la idea original mia era que al introducir una ficha me habilite el circuito por los 6 minutos, luego si introduzco una segunda ficha en un periodo x, pongamos unos 4 segundos, me tiene que habilitar el timer de 12 minutos y pasado ese tiempo, si no introduzco nada debe quedar habilitado el timer de los 6 minutos.

Soy nuevo en la programación de pic, todo lo que pude lograr fue que me vaya alternando, es decir que introuzco la primer ficha y me da los 6 minutos, luego una segunda para los 12, vuelve nuevamente a los 6 y asi.

Estoy pensando en escribir nuevamente el código y había pensado en algo asi (la sintaxis no es la adecuada ya que lo escribo a medida que lo recuerdo ya que no lo tengo conmigo):

puerto1= es el puerto donde esta conectado el pulsador
T6= es el puerto donde esta la salida al rele del timer de 6 minutos
T12= es el puerto donde esta la salida al rele del timer de 12 minutos

***CODIGO***

# aca viene la preparacion de puertos y definicion de variables

inicio:
h=0
z=0

if puerto1=0 then h=h+1               ' cuando se mete la primer ficha
while z<1000
   if puerto1=low then h=h+1            ' cuando se mete la segunda ficha
   z=z+1
wend

if h=1 then
             high_T6                            ' si h=1, me habilita el timer de 6 minutos
             pause 200
             low_T6
end if
if h=2 then
             high_T12                          ' si h=2 me habilita el timer de 12 minutos
             pause 200
             low_T12
end if

if (T6=low) and (T12=low) then goto inicio

end

Este seria el esqueleto del nuevo código que estoy armando, necesitaría de su opinión para saber si va a funcionar. es correcto usar el while? necesito que espere al menos 4 segundos, le puse un valor de 1000 por poner ya que no se como determinar el tiempo exacto. El circuito tiene un PICF16F84.

Estoy usando picbasic

Espero sus comentarios.

Saludos y gracias


----------



## zoder45 (Jun 21, 2018)

que tal buenas tardes vengo a pedir su ayuda 
es un proyecto estas son las caracteristicas
teclado matricial 4x4 por aplicacion android que se hizo con app inventor
receptor bluetooth

lo que estoy tratando de hacer esque con la aplicacion del teclado matricial encienda y apague un led  ejemplo el numero 1 enciende y con el mismo apaga el led  


```
INICIO:
portb=0
SERIAL=0
SERIN PORTC.7,T9600,100,SIGUE,SERIAL

SIGUE
 
IF SERIAL==1 THEN
   high portb.4
   endif
goto inicio
```

pero no logro hacerlo funcionar tengo que encender todos los leds que estan conectados al puerto portb.0,1,2,3,4,5,6,7 con un respectivo numero del teclado matricial 

saludos


----------



## D@rkbytes (Jun 21, 2018)

De esa forma estás encendiendo el LED cuando recibes el número 1, pero cuando se regresa a INICIO lo vuelves a apagar porque pones en 0 todo el puerto B.


----------



## zoder45 (Jun 21, 2018)

gracias por contestar

ya lo cambie pero no logro encenderlo se quedan apagados los leds y cuando peciono el 1 no lo enciende


----------



## D@rkbytes (Jun 21, 2018)

¿Y cómo lo cambiaste?
¿Qué microcontrolador estás usando?
¿Con qué y de qué forma estás enviando el número 1?
Ten en cuenta que si envías el 1 como texto, el microcontrolador recibirá su valor ASCII (49)


----------



## zoder45 (Jun 22, 2018)

que tal este es el microcontrolador 
es el 16f876a
desde la aplicacion de un bit (1)


```
define LOADER_USED 1
INCLUDE "MODEDEFS.BAS"

TRISA=0
TRISB=0
TRISC=0

ADCON1=7

SERIAL VAR BYTE

PORTA=0
PORTB=0
PORTC=0

SERIAL=0


TECLADO:
SERIAL=0
SERIN PORTC.7,T9600,100,SIGUE,SERIAL
SIGUE:
PORTB=0
IF PORTB.4==0 OR SERIAL==1 THEN
    high portb.0
    endif
    goto esperar
    
    
esperar

IF PORTB.4==0 OR SERIAL==1 THEN
    low portb.0
    endif
    goto teclado
```


----------



## D@rkbytes (Jun 22, 2018)

Ese código sigue mal. Cuando no existen datos se brinca a la etiqueta SIGUE y pone el puerto B en 0.
O sea que cuando se reciba un 1, apenas tendrá un instante activado el pin RB0.
La etiqueta esperar está de sobra porque se ejecuta a continuación.
En Basic la comparación no se hace con == como con el C, solo se usa =



zoder45 dijo:


> Desde la aplicación de un bit (1)


¿Cuál aplicación? Y no se envía un bit, se debe enviar 1 byte.

Ese código no tiene palabra de configuración y es importante saber con qué fuses se está grabando el PIC.
Otra cosa. El PIC16F876A tiene módulo USART y deberías aprovecharlo en lugar de usar RS-232 por software.
Así que puedes usar HSERIN y también la interrupción por recepción.


----------



## zoder45 (Jun 22, 2018)

se hizo una aplicacion para android que simula el teclado matricial de 4x4 donde las configuraciones de la aplicacion es enviar un dato por bluetooth  al pic por eso el 
SERIAL=0
SERIN PORTC.7,T9600,100,SIGUE,SERIAL

si lo dejo asi desde que lo conecto enciende el led y no le e mandado ninguna instruccion


```
IF PORTB.4=0 OR SERIAL=1 THEN
    high portb.0
    endif
```


----------



## D@rkbytes (Jun 22, 2018)

Pues debe de ser porque cuando pones todo el puerto B en cero como te he estado diciendo, se comprueba que RB4 está en cero y por eso RB0 se pone en uno.
Debes de comprender la lógica en tu programación.


----------



## zoder45 (Jul 4, 2018)

que tal gracias ya quedo jejeje 

```
define ADC_BIST 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50

define OSC 20
DEFINE LCD_DREG PORTC
DEFINE LCD_BITS 4
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50

ADCON1=%10001110  ' %10001110 SOLAMENTE PARA EL DE 10 BITS PARA EL DE 8 BITS 14 DIRECTO '

TRISA=1
TRISB=0

SENSAR VAR WORD
TEM VAR WORD
 
SENSAR=0
TEM=0


INICIO:

 ADCIN 0,SENSAR

IF tem=>43 THEN
   ELSE
   SENSAR=SENSAR-1
  
IF TEM=>63 THEN
   ELSE
   SENSAR=SENSAR-2
  
IF TEM=>120 THEN
   ELSE
   SENSAR=SENSAR-3
  
IF TEM=>293 THEN
   ELSE
   SENSAR=SENSAR-4

SENSAR=SENSAR/2
                      
LCDOUT $FE,2, "  TEMPERATURA: "  'POCICION DE LA LINEA 1'
LCDOUT $FE,$C0,#SENSAR,%11011111, "C"
PAUSE 500
LCDOUT $FE,1
ENDIF
ENDIF
ENDIF
ENDIF
GOTO INICIO
```
ahora tengo un problema con un sensor de temperarura con lm35 a 10 bist
lo hice a 8 bits y funciono ala primera sin ningun problema pero a 10 bits no lo puedo hacer funcionar 

de antemano gracias


----------



## D@rkbytes (Jul 4, 2018)

Si TEM se establece en 0 al iniciar, ¿cómo es que pretendes que se pueda comparar con los valores elegidos?
¿Y por qué restas la variable SENSAR? Esta variable es la que contiene la lectura del conversor AD y su posterior modificación se verá afectada cada nueva lectura.
Supongo que debe ser al revés. O sea, comparar la variable SENSAR y modificar la variable TEM

Esos IF anidados no me agradan. Sería mejor usar una selección de datos con Select Case.
Aparte, se debe establecer un rango, porque las lecturas del conversor AD no son estables.
También sería conveniente realizar un promedio para lograr mejor estabilidad.

No sé qué pretendas hacer, pero no le encuentro sentido a ese programa.


----------



## zoder45 (Jul 6, 2018)

gracias por responder los if anidados y las restas es para tener una mejor lectura o la mas estable posible 
la Select Case. no la se utilizar si tienes un ejemplo que mejor y pues ya quedo el sensor de temperatura a 10bits ya lo proble y todo y esta funcionando lo dejo por si tienen un mejora que hacer etc 


```
define ADC_BIST 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50

define OSC 20
DEFINE LCD_DREG PORTC
DEFINE LCD_BITS 4
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50

ADCON1=14 
PORTB=0
TRISA=1
TRISB=0

SENSAR VAR WORD
TEM VAR WORD
 
SENSAR=0
TEM=0


INICIO:

 ADCIN  0,SENSAR

IF tem=>43 THEN
   ELSE
   SENSAR=SENSAR-1
  
IF TEM=>63 THEN
   ELSE
   SENSAR=SENSAR-2
      
IF TEM=>120 THEN
   ELSE
   SENSAR=SENSAR-3
  
IF TEM=>293 THEN
   ELSE
   SENSAR=SENSAR-4

SENSAR=SENSAR/2
LCDOUT $FE,1                     
LCDOUT $FE,2, "  TEMPERATURA: "  'POCICION DE LA LINEA 1'
LCDOUT $FE,$C0,#SENSAR,%11011111, "C"
PAUSE 500
LCDOUT $FE,1
ENDIF
ENDIF
ENDIF
ENDIF

IF SENSAR>35 THEN
PORTB.0=1
PAUSE 500
LCDOUT $FE,1   'LIMPIAR PANTALLA '
LCDOUT $FE,2, "  VENTILADOR "  'POCICION DE LA LINEA 1'
LCDOUT $FE,$C0, "ENCENDIDO" 'POCICION DE LA 2 LINEA'
PAUSE 2000
      ELSE
IF SENSAR=28 THEN
PORTB.0=0
PAUSE 500
LCDOUT $FE,1   'LIMPIAR PANTALLA '
LCDOUT $FE,2, "  VENTILADOR "  'POCICION DE LA LINEA 1'
LCDOUT $FE,$C0, " APAGADO " 'POCICION DE LA 2 LINEA'
PAUSE 2000
      ENDIF
   ENDIF   
GOTO INICIO:
```


----------



## D@rkbytes (Jul 6, 2018)

zoder45 dijo:


> los if anidados y las restas es para tener una mejor lectura o la mas estable posible


De esa forma no se logra una mejor lectura porque no se está involucrando con el conversor AD.
Con lo que se logra una lectura más estable, con lo que te mencioné.


zoder45 dijo:


> La Select Case no la sé utilizar. Si tienes un ejemplo, que mejor.


En este tema existen varios ejemplos en donde se ha usado.
También cuentas con los temas de ayuda del entorno. Presiona la tecla F1 y aparecerá el documento de ayuda.
De igual forma, si tienes dudas con alguna instrucción, posiciona el cursor en ella y a continuación presiona la tecla F1


----------



## zoder45 (Ago 22, 2018)

Que tal como están, una pregunta, y lo he estado buscando en el foro, y mi pregunta es éste sensor dht11 que es de temperatura y humedad, ya tengo la programación en microcode estudio de un sensor de temperatura con un lm35 pero me gustaría añadir éste que contiene los 2 , ¿se podría ? y cómo sería su configuración?, de antemano gracias


----------



## DOSMETROS (Ago 22, 2018)

Resultados de búsqueda de consulta: sensor dht11


----------



## zoder45 (Ago 22, 2018)

gracias por responder ya busque pero no encontre como configurarlo en microcode estudio


----------



## juancaca (Oct 13, 2018)

Buenas noches compañeros , por aca nuevamente molestandolos, he estado tratando de leer un tren de pulsos que sale por los pines del puerto del pic, por decir portb.0, despues portb.1 y leerlo siempre por portb.7, lo que quiero es identificar por cual pin salio el tren de pulsos.
Lo que busco hacer es un probador de red que no tenga que estar otra persona en el otro extremo a probar, los que he visto en internet debe haber una persona al extremo del otro punto para verificar si el hilo esta bien o esta abierto, que si es uno a uno o es cruzado.

De ante mano muchas gracias y me puedan colaborar.


----------



## D@rkbytes (Oct 13, 2018)

juancaca dijo:


> Lo que quiero es identificar por cuál pin salió el tren de pulsos.


- Sencillo: Usando frecuencias diferentes.
- Algo complicado: Enviando un identificador por canal, algo así como la Codificación Manchester.


----------



## juancaca (Oct 16, 2018)

Hola compañeros, gracias D@rk por tu respuesta, lo del envio de identificador lo tengo claro, pero donde estoy trocado es en la parte de la recepción del identificador, si tendria que hacer por hardware o software. Por  Software no me dio utilizando el comando Count, Pulsin o no lo supe inplementar.


```
clear
anselh = $00
DEFINE LCD_DREG PORTB                               ; configuro la panta LCD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
TRISB = 0
TrisC = %00000000
PORTC = 0
w var WORD
inicio:
        LCDOUT $FE,1
        LCDOUT $FE,$80,#W      ;Muestro en la pantalla lo que se cargo en w.
        PAUSE 500
Pulsos:

    portC = %00000001            ;Prendo portc.1 o hilo 1 del utp
    pause 300                            ;pause 300 ms
    PULSOUT PORTC.0, 2000    ;envio un tren de pulso
    PULSIN PORTB.3,1,W          ;y los recepciono.
    pause 300
    goto inicio
end
```
Seria de gran ayuda se me pudiesen dar una mano.
Cordial saludo.


----------



## MaShicO (May 23, 2019)

Buenas tardes a todos , quisiera una ayuda o sugerencia con algún moderador , verán , programo en microcode studio 3.0 y compilador PBP 2.6 . Estoy usando dos módulos Xbee y pues por medio del software XCTU eh podido configurar a cada uno , estos modulos pueden comunicarse inalambricamente por comandos AT ( comunicación punto a punto) y el segundo modo es por red , es decir , estos módulos se pueden configurar a cada módulo como coordinador o router , al configurar a uno de ellos como coordinador(ya que es necesario al menos uno para poder crear una red) podemos obtener una trama y esta trama  es de la siguiente forma 7E 00 0F 10 01 00 13 A2 00 40 C0 E3 EE FF FE 00 00 se pueden dar cuenta que esta en hexadecimal , toda esta configuración y la trama se obtienen del software XCTU(Este software se puede descargar gratis desde la pagina DIGI , empresa que provee los módulos). Voy al problema :
Estoy trabajando en la comunicación serial , puedo hacer comunicación serial enviando numeros, letras y hasta cadenas pero el detalle esta en recibir cadenas y que el PIC receptor pueda distinguir cada cadena que le envíe , eh configurado los modulos para trabajar en red y pues tengo la trama que es 7E 00 0F 10 01 00 13 A2 00 40 C0 E3 EE FF FE 00 00 , a esta trama le tengo que añadir unos cuantos caracteres depende de lo que quiera hacer , es decir , si quiero prender un led seria de la siguiente manera : TRAMA(7E 00 0F 10 01 00 13 A2 00 40 C0 E3 EE FF FE 00 00) + 01 6A  Estos dos ultimos numeros corresponden al comando que le añadí para que el PIC pueda prender el led ,si se dan cuenta todos estos caracteres estan en hexadecimal y  para enviar estas combinaciones antecedo con el signo de " $ " . Eh simulado en proteus y pues toda esta trama son enviados pero al momento de que el PIC receptor detecta estos comandos prende el led pero cuando envio otra trama para apagarlo , el  PIC no apaga el led . Eh identificado que el problema esta en que el PIC no recibe la cadena de caracteres hexadecimales(trama), no los diferencia y pues al momento que le envie la trama de prender o apagar pues el PIC solo prende el led , no importa cual sea la trama , espero que puedan darme una mano con esto por favor , adjunto código y simulación .



```
CODIGO DEL PIC TRANSMISOR


include "modedefs.bas"
DEFINE OSC 4
CMCON=7
TRISA=%00011100
TRISB=%00000000
TX VAR PORTB.2
'RX VAR PORTB.1

BOTON1 VAR PORTA.2
BOTON2 VAR PORTA.3


voidMain:

if boton1=1 then envio1
 
IF BOTON2=1 THEN envio2



GOTO voidmain


envio1:
if boton1=1 then envio1
serout tx,T9600,[$7E,$00,$0F,$10,$01,$00,$13,$A2,$00,$40,$C0,$E3,$EE,$FF,$FE,$00,$00,$01,$6A,13] ; TRAMA para prender led
goto voidmain


envio2:
if boton2=1 then envio2
serout tx,T9600,[$7E,$00,$0F,$10,$01,$00,$13,$A2,$00,$40,$C0,$E3,$EE,$FF,$FE,$00,$00,$00,$6B,13]  ;Trama para apagar led
goto voidmain



END
```










```
CODIGO DEL PIC RECEPTOR



INCLUDE "modedefs.bas"
DEFINE OSC 4
CMCON=7
TRISA=%00000000
PORTA=0
TRISB=%00000010

'TX VAR PORTB.2
RX VAR PORTB.1
dato var WORD


LED VAR PORTA.2


INICIO:
   SERIN RX,T9600,DATO
 
   SELECT CASE DATO
   CASE $7E,$00,$0F,$10,$01,$00,$13,$A2,$00,$40,$C0,$E3,$EE,$FF,$FE,$00,$00,$01,$6A 
   CALL PRENDE
   CASE $7E,$00,$0F,$10,$01,$00,$13,$A2,$00,$40,$C0,$E3,$EE,$FF,$FE,$00,$00,$00,$6B
   CALL APAGA
  

  
   END SELECT

GOTO INICIO

PRENDE:

  HIGH LED

GOTO INICIO

APAGA:

  LOW LED

GOTO INICIO

END
```


----------



## D@rkbytes (May 23, 2019)

Con esa forma de usar Select Case para comparar los datos no podrás comparar una cadena de bytes.
Recuerda que por RS-232 únicamente se puede recibir un byte a la vez, por lo tanto la variable dato no podrá contener todos los bytes que envías.
Aparte no tiene caso que la declares del tipo Word porque nada más recibirás 8 bits por envío. (1 byte)
Lo que se usa para recibir una cadena en PBP es la instrucción Wait ()

Ejemplos:

```
; Código del PIC Transmisor.

; Palabra de configuración PBPX:
#Config
    __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF
#EndConfig

include "modedefs.bas"
Define OSC 12

Symbol Boton1 = PORTA.2
Symbol Boton2 = PORTA.3

Inicio:
    ; Configuración USART: (19200 Bps @ 12 MHz. 19231 Bps Reales 0.16% de error.)
    SPBRG =    38    ; 00100110
    TXSTA =    36    ; 00100100
    RCSTA =    144    ; 10010000
    
    CMCON = 7

Programa:

    If boton1 = 1 Then
        GoSub Envio1
        While Boton1 = 1: Wend
    EndIf
 
    If Boton2 = 1 Then
        GoSub Envio2
        While Boton2 = 1: Wend
    EndIf
    
    GoTo programa


Envio1:
    ; Trama para encender el LED
    HSerOut [$7E,$00,$0F,$10,$01,$00,$13,$A2,$00,$40,$C0,$E3,$EE,$FF,$FE,$00,$00,$01,$6A,13]
    Return
    
Envio2:
    ; Trama para apagar el LED:
    HSerOut [$7E,$00,$0F,$10,$01,$00,$13,$A2,$00,$40,$C0,$E3,$EE,$FF,$FE,$00,$00,$00,$6B,13]
    Return

    End
```


```
; Código del PIC receptor.

; Palabra de configuración PBPX:
#Config
    __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF
#EndConfig

Include "modedefs.bas"
Define OSC 12

Symbol LED = PORTA.2

Inicio:
    ; Configuración USART: (19200 Bps @ 12 MHz. 19231 Bps Reales 0.16% de error.)
    SPBRG =    38    ; 00100110
    TXSTA =    36    ; 00100100
    RCSTA =    144    ; 10010000
    
    CMCON = 7
    Low LED

Programa:
    HSerIn 100, Apagar, [Wait($7E,$00,$0F,$10,$01,$00,$13,$A2,$00,$40,$C0,$E3,$EE,$FF,$FE,$00,$00,$01,$6A,13)]
    Call Prende
Apagar:
    HSerIn 100, Salir, [Wait($7E,$00,$0F,$10,$01,$00,$13,$A2,$00,$40,$C0,$E3,$EE,$FF,$FE,$00,$00,$00,$6B,13)]
    Call Apaga
Salir:
    GoTo Programa

Prende:
    High LED
    Return

Apaga:
    Low LED
    Return

    End
```
Tal vez de esa forma funcione, o tal vez no, es cuestión de probar, ya que hace mucho tiempo que no programo en PBP.


----------



## MaShicO (May 27, 2019)

D@rkbytes dijo:


> Con esa forma de usar Select Case para comparar los datos no podrás comparar una cadena de bytes.
> Recuerda que por RS-232 únicamente se puede recibir un byte a la vez, por lo tanto la variable dato no podrá contener todos los bytes que envías.
> Aparte no tiene caso que la declares del tipo Word porque nada más recibirás 8 bits por envío. (1 byte)
> Lo que se usa para recibir una cadena en PBP es la instrucción Wait ()
> ...





Hola D@rbytes , gracias por responder al post , eh analizado el código modificado que enviaste y también tenia la idea de usar el USART del pic , pero al momento de simularlo envío la "trama de encender el led" y este efectivamente enciende , al momento de enviar la "trama de apagar el led" , este apaga pero si vuelvo a enviar la "trama de apagado del led" el led enciende (lo cual no deberia de suceder) y eso no es todo, hice una prueba enviando cualquier dato(cualquier cosa) y el led igual enciende , el pic al parecer no esta diferenciando cada trama que se le envía o si yo estoy mal tratando de enviar una trama de esa manera en hexadecimal (con signo $ antepuesto ) ya que la trama me lo genera el propio software XCTU al momento de configurar los módulos XBee , nose si estoy mal en este aspecto de la programación tratando de enviar tramas de ese modo y también eh averiguado sobre el modificador WAITSTR - "Espera por una cadena de caracteres" pero al final es lo mismo que poner un WAIT . Que puedo estar haciendo mal ? o es que no se puede enviar tramas como esto 7E 00 0F 10 01 00 13 A2 00 40 C0 E3 EE FF FE 00 00 01 6A ? Agradecería mucho alguna sugerencia por favor.
Gracias;


----------



## D@rkbytes (May 27, 2019)

MaShicO dijo:


> el pic al parecer no está diferenciando cada trama que se le envía o si yo estoy mal tratando de enviar una trama de esa manera en hexadecimal (con signo $ antepuesto )


Escribir en hexadecimal usando $ es tan solo para que tú puedas verlo así en el editor.
El microcontrolador de todos modos enviará el número en binario.
O sea que si mandas $FF, el microcontrolador enviará 11111111, (255) no los dos caracteres FF que serían dos bytes con el valor 70 cada uno.
De igual forma, si escribes 255 se enviará 11111111
Lo que hay que tener en cuenta es que, no es lo mismo enviar "255" como cadena que como entero.
Si se envía como cadena de caracteres se enviarán 3 bytes: 50, 53, 53 (Números correspondientes a la tabla ASCII)


MaShicO dijo:


> ¿Qué puedo estar haciendo mal? ¿O es que no se puede enviar tramas como esto 7E 00 0F 10 01 00 13 A2 00 40 C0 E3 EE FF FE 00 00 01 6A?


Si se pueden enviar así y el microcontrolador también lo recibe, pero una comunicación serial asíncrona tiene sus desventajas.
Se puede perder información durante el envío y se recibirá cualquier cosa, a veces bien y a veces mal.
Para eso se emplea una comprobación de datos calculando el checksum.
Este es enviado dentro de la trama y el receptor debe recalcular eso nuevamente.
Si los datos son válidos, se procesan, si no, se envía una petición con un comando de error.
Calcular el checksum es sencillo, se suman todos los bytes y se hace un AND con 0xFF (255)
Por ejemplo:
34 + 126 + 245 + 89 AND 255 = 238 (De esta forma el checksum nunca sobrepasará 255)
Si el checksum enviado es el mismo que se recalcula en el receptor, entonces los datos estarán correctos.
Otra cosa que mejora la situación es, usar velocidades altas de transmisión.


----------



## MaShicO (May 28, 2019)

D@rkbytes dijo:


> Escribir en hexadecimal usando $ es tan solo para que tú puedas verlo así en el editor.
> El microcontrolador de todos modos enviará el número en binario.
> O sea que si mandas $FF, el microcontrolador enviará 11111111, (255) no los dos caracteres FF que serían dos bytes con el valor 70 cada uno.
> De igual forma, si escribes 255 se enviará 11111111
> ...



Te comprendo D@rbytes y te soy sincero , en proteus para simular el envío de la trama lo hago de pic a pic (transmisor-receptor) y funciona  como se manda en la programación pero al momento de implementarlo en físico no responde el encendido del led , es decir , armo mi circuito conectado al primer Xbee , luego abro el software XCTU , conectando el segundo modulo XBee , entro a la ventana para enviar la trama de encendido( el XCTU cuenta con una ventana de transmisión y recepción de datos) , al enviar dicha trama me sale que el envió a sido exitoso(Successful) pero el led no enciende, recuerdo que cuando utilicé el modulo HC-05(Bluetooh) la programación es practicamente la misma a diferencia que aqui tengo que enviar tramas , que puede estar faltando ? Ya eh leído una y otra vez la hoja de datos del pic (16F628A) y las intrucciones del PBP . Te adjunto una imagen de la trama enviada y recepcionada en proteus.


----------



## D@rkbytes (May 28, 2019)

No sé qué pase con los XBee pero posiblemente se esté recibiendo ruido.
Tal vez tengas que usar un sistema de codificación como el Manchester, por ejemplo.

Yo tengo programas que envían y reciben hasta más de 50 datos por RS-232 y sin problemas, pero esto de PC a microcontrolador y viceversa.
Luego cambié el modo de comunicación a USB y se acabaron los datos erróneos.


----------



## juancaca (Oct 9, 2019)

Buenas noches compañeros,
Nuevamente por aca molestandolos, estoy tratando de hacer funcionar una varias matriz de led 8x8 con un Max7219, hasta ahora he conseguido hacer funcionar cada una de las matriz pero a la ahora de hacerlo que trabaje uno por uno no me funciona, si alguien me puede colaborar en ver que esta mal en el codigo o en la programacion del Max7219 se lo agradeceria.



Adjunto:
archivo proteus version 8.9
archivo .bas
archivo.COF
archivo.Hex


----------



## ricbevi (Oct 9, 2019)

Para empezar tenes definido una sola salida de data a los MAX y el resto?.

No hay definidos/asignados PINES del microcontrolador para tal fin tanto en el esquema como en el programa.


----------



## juancaca (Oct 9, 2019)

Buenas noches ricbevi y compañeros, el max7219 se puede trabajar en cascada, lo que entra por Din lo envia por Dout y asi sucesivamente en los que esten conectados, lo que no logro conseguir es hacer el corrimiento al siguiente Max7219, no se como habilitarlo por codigo, el datasheet dice:

El registro no operativo se utiliza cuando se conectan en cascada MAX7219 o MAX7221. Conecte todas las entradas LOAD / CS de todos los dispositivos y conecte DOUT a DIN en dispositivos adyacentes. DOUT es una salida de nivel lógico CMOS que maneja fácilmente DIN de partes sucesivamente en cascada. (Consulte la sección Modos de direccionamiento en serie para obtener información detallada sobre el tiempo de entrada / salida en serie). Por ejemplo, si cuatro MAX7219 están en cascada, para escribir en el cuarto chip, se envía la palabra de 16 bits deseada, seguida de tres no-op códigos (hex XXXX, ver Tabla 2). Cuando LOAD / CS sube, los datos se enclavan en todos los dispositivos. Los primeros tres chips reciben comandos sin operación, y el cuarto recibe los datos deseados.

Bueno sin embargo lo que quiero hacer yo es que cuando termine en la primer matriz siga en le siguiente y eso es lo que no me da.
Este es mi codigo:

```
'****************************************************************
'*  Name    : Matrix8x8.BAS                                     *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/09/2019                                        *
'*  Version : 1.0                                               *
'*  Notes   :  PIC16F883                                        *
'*          :                                                   *
'****************************************************************
    Include "Modedefs.bas"
    ANSEL = 0
    ANSELH = 0
' ** Set Xtal Value in mHz **

    Define    OSC    20        ' Set Xtal Frequency

' ** Declare TRIS Used **
'    TRISB = 0


' ** Declare Pins Used **
    Clk     Var    PortB.0        ' Data is clocked on rising edge of this pin
    Dta      Var    PortB.1        ' Bits are shifted out of this pin
    Load    Var    PortB.2        ' Transfers data to LEDs when Pulsed

' ** Declare Constants **
    No_Op            Con $0    ' Scan-limit register.
    Decode_Reg         Con    $9    ' Decode register, a 1 turns on BCD decoding for each digit.
    Intensity        Con    $A    ' Intensity register.
    ScanLimit_Reg    Con    $B    ' Scan-limit register. 
    Shutdown_Reg    Con    $C    ' On/Off Register.
    Display_test    Con    $F    ' Test mode register (all digits on, 100% bright)

'    Max_Digit    Con    5    ' Amount of LED Displays being used.

' ** Declare Variables **
      Counter        Var    Byte    ' Variable used for the Demo Counting routine
    Max_Disp    Var    Word    ' 16-bit value to be displayed by the MAX7219
    i            Var    byte    ' Digit number to place Decimal point (0-4)
    Register    Var    Byte    ' Pointer to the Internal Registers of the MAX7219
    R_Val        Var    Byte    ' Data placed in Each Register
    Digit        Var    Byte    ' Position of individual numbers within MAX_Disp (0-3)
    Digito        Var    Byte    ' Position of individual numbers within MAX_Disp (0-3) 
    Position    Var    Byte    ' Position of each LED display (1-4)
  
' ** INITIALIZE THE MAX7219 **
' Each register address is sent along with its setting data.
' Because the MAX7219 expects to see a packet of 16 bits, then the LOAD pin is pulsed
' Set the scan limit to 3 (4 digits, numbered 0-3)
' Set the Brightness to 5
' BCD decoding to the lower 4 digits
' Switch the display on.
' Turn Off test mode

i = "a"
  
    Register=Shutdown_Reg    ' Point to the Switch Register
    R_Val=$00                ' Set to One, (switches the display ON)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219 

    Register=No_Op             ' Point to the Scan Register
    R_Val=0                    ' send 3, (Four LED Displays 0-3)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219
      
    Register=ScanLimit_Reg    ' Point to the Scan Register
    R_Val=$07                ' send 3, (Four LED Displays 0-3)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219

    Register=Intensity         ' Point to the Luminance Register
    R_Val=$05                 ' Send 5, (Value for Brightness)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219

    Register=Decode_Reg        ' Point to BCD Decode Register
    R_Val=$00                ' Decode the first 5 digits
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219

    Register=Display_test    ' Point to the Test Register
    R_Val=$00                ' Reset to Zero, (turns off Test mode)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219

    Register=Shutdown_Reg    ' Point to the Switch Register
    R_Val=$01                ' Set to One, (switches the display ON)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219

i = "a"
counter = 1

Inicio:

    digito = 1                                      ;Cargo Digito para que comience en 1
    for counter = counter to 8                      ;Contador para las filas de la matriz
        Register = counter                          ;Cargo el valor de Counter a Register para enviarle al max 7219
        for Digit = 1 to 8                          ;Contador de columnas de la matriz
            R_Val=Digito                            ;Cargo el valor de Digito a R_Val para enviarle al max 7219 y prenda led por led como en culebrilla
            Gosub Transfer                          ;Se va a la etiqueta Transfer y envia el dato al Max 7219
            pause 100         
        if digito => 128 then                       ;Pregunta si Digito es mayo o igual a 128
            digito = 0                              ;Se pone a 0 Digito para apagar el led
            R_Val=Digito                            ;Cargo el valor de Digito a R_Val para enviarle al max 7219
            counter = counter + 1                   ;Se incrementa la Counter para pasar a la sigiente fila de la matrix
            Gosub Transfer                          ;Se va a la etiqueta Transfer y envia el dato al Max 7219 y apague el led
            goto devolver                           ;Se va a la etiqueta devolver para que se devuelva nuevamente hacia adelante en la siguiente fila
        endif         
        digito = digito <<1                         ;Se desplaza el led hacia el siguiente led
        next             
    next
                                                    ;Aca se crea el efecto de regresarse hacia el inicio en la otra fila
devolver:
                                                    ;Cargo Digito para que comience en 128
    digito = 128
    for counter = counter to 8
        Register = counter
        for Digit = 1 to 8                       
            R_Val=Digito
            Gosub Transfer
            pause 100
            if digito <= 1 then
                digito = 0 
                R_Val=Digito
                counter = counter + 1
                if counter > 8 then counter = 8
                Gosub Transfer             
                if counter => 8 then       
                    if counter => 8 then i = "b"
                    if counter => 8 and i = "b" then i = "c"
                    counter = 1
                endif
                goto inicio
            endif         
            digito = digito >>1
        next     
    next
goto Inicio 
' Send a 16-bit word to the MAX7219
Transfer:
select CASE i
    
      case "a"
    Shiftout Dta,Clk,msbfirst,[0,0,0,0,0,0,Register,R_Val] ' Escribe en la primera matriz
    High Load                ' The data is now acted upon 
@    Nop
@    Nop                    ' A small delay to ensure correct clocking times
    Low Load                ' Disable the MAX7219   
    Return                    ' Exit from Subroutine

    case "b"
    Shiftout Dta,Clk,msbfirst,[Register,R_Val,00] ' Escribe en la segunda matriz
    High Load                ' The data is now acted upon 
@    Nop
@    Nop                    ' A small delay to ensure correct clocking times
    Low Load                ' Disable the MAX7219
    Return                    ' Exit from Subroutine

      case "c"
    Shiftout Dta,Clk,msbfirst,[Register,R_Val,0,0,0,0] ' Escribe en la tercera matriz
    High Load                ' The data is now acted upon 
@    Nop
@    Nop                    ' A small delay to ensure correct clocking times
    Low Load                ' Disable the MAX7219
    Return                    ' Exit from Subroutine

end select
return

end
```

Cordial saludo y de ante mano gracias!


----------



## ricbevi (Oct 10, 2019)

Antes de abocarme en sí al programa yo haría un simple demo de cómo se enciende los led de la matriz cuando se cambia de MAX estando en cascada.

Tu programa se queda en el primer MAX y nunca sale de allí por lo que debes investigar como es el asunto.

Nunca trabaje con ese chip.


----------



## juancaca (Oct 11, 2019)

Hola compañeros, bueno he conseguido trabajar las matriz cada vez que temine de trabajar en una pase a la siguiente. Lo consegui inicializando todos los MAX7219, se envian los 16 bits por cada *MAX* que se tenga, en mi caso son 3. Anteriormente solo envia una sola trama:


```
Shiftout Dta,Clk,msbfirst,[Register,R_Val,Register,R_Val,Register,R_Val,Register,R_Val] 'Inicializo todos los MAX7219
        High Load                ' Activo el dato enviado al MAX7219   
    @    Nop
    @    Nop                        ' Tiempo de espera
        Low Load                ' Deshabilito el MAX7219
```

Buscando por la web encontre un codigo de una matriz de led 8x32 funcionando, pero me al correrlo en proteus corre de forma vertical, como puedo hacer por codigo para que trabaje de forma horizontal, trate con el codigo de las letras se enderezan pero siguen de forma vertical.




```
SEND_DATA:      'PARTE DEL CODIGO QUE ME GUSTARIA QUE ME EXPLICARAN

For CharLine=0 To 5
GoSub Display_inc
Display[i-1]=FC[CharLine]
GoSub Update_data
pause SpeedScrolling 
Next ;CharLine
Return

Display_inc:
For i=0 To 31
Display[i]=Display[i+1]
Next 
Return
```
Nunca he trabajado los array de esa forma, me podrian colaborar explicando como trabaja esta parte del codigo.
Adjunto codigo y simulacion proteus 8.9

De ante mano muchas gracias.


----------



## D@rkbytes (Ene 7, 2020)

Si lo que quieres es hacer un Roger Beep, mira el proyecto que adjunto.
Es un Roger Beep pero de Tonos Quindar
La base del sistema para el control del PTT te puede servir.


----------



## albatros1 (Ene 19, 2020)

Hola amigo,tengo una pregunta sobre el Hex de tonos del roger beep que expones,me puedes decir como se puede simular dichos tonos si es que se puede y de cuantos tonos consta el Hex?.
 No tengo la suerte de saber programar,pues mi idea seria incorporar tonos originales a dicho pic.
Un saludo

Citar
Denunciar


----------



## ricbevi (Ene 19, 2020)

Posiblemente tenga algo que agregar el tocayo.  Si te refieres al último archivo subido(que está completo).

Al activar el PTT genera un tono de 2.525Hz durante 250 ms(1/4 seg) y al soltar el PTT 2.475Hz durante el mismo tiempo.


Sacado del archivo subido.

Simular, esta incluido el archivo con el esquema para hacerlo(DSN) en el Ares de Proteus en el mismo archivo ".rar" subido.


----------



## albatros1 (Ene 19, 2020)

Gracias Ricbevi,voy a simularlo eso es al que me referia.
   Un saludo


----------



## ricbevi (Ene 19, 2020)

Al pulsar el Ptt hace beep y al largarlo otro beep que a un oído poco entrenado le parecen similares ya que la diferencia de frecuencia es poca.


----------



## albatros1 (Ene 20, 2020)

Gracias de nuevo Ricbevi,pero no es lo que busco,comento hay un enlace en youtube al cual me dirigí y a un amigo del foro de muchos años al cual estoy muy agradecido(Moises Calderon)me gustaría saber si entre todos este llamador al cual me refiero,ya que esta diseñado solo para principio y no al soltar PTT que es lo que busco y personalizar el sonido que yo quiera.Mis conocimientos son los justos veo construyó y sueldo componentes pues es una pasión cacharrear.Bueno no me alargo mas pongo el enlace del youtuber.




   Saludos


----------



## marvin villalobos (Mar 10, 2020)

Buenas noches amigos de Foros de electronica, si me estoy metiendo en un tema que ya se a tocado en esta pagina, por favor me disculpan y a la vez ruego que me deriven a ese tema, es que no se la verdad con que nombre encontrar el problema que quiero solucionar.

Estoy programando en pic basic pro y quiero darle RUN a un programa, que anteriormente eh configurado dos variables con tiempos diferentes, como por ejemplo:

tiempo 1 = 5min 10 seg
tiempo 2 = 10 min 20seg

y cuando le doy RUN, los tiempos empiezan a descernder, y cuando el tiempo1 llega a 0, el tiempo 2 continua hasta llegar a cero tambien.

eh hecho una pruebas y lo que me pasa es que cuando eñ primer timpo llega a cero el segundo tiempo sigue bajando y el primer tiempo baja a 59:59 y no se posiciona en 0.

espero no molestar con mi pregunta tonta. 

gracias


----------



## D@rkbytes (Mar 10, 2020)

marvin villalobos dijo:


> Estoy programando en PIC Basic Pro y quiero darle RUN a un programa


¿Y el programa?


----------



## Dr. Zoidberg (Mar 10, 2020)




----------



## marvin villalobos (Mar 11, 2020)

huy, aqui esta. y cuando empieza a descender, inicia desde 55.


----------



## marvin villalobos (Mar 11, 2020)

Ya encontré la solución de el por que decrementa de 0 a 55,54,53  y no como debe ser: 0,59,58,57,:
es en una comparación :
minut=minut-1
if minut = 255 then mint = 59
en el 255 esta la clave. Gracias.
Ahora estoy en cómo hacer para que el primer tiempo cuando llega a cero se quede estático y el otro tiempo 2 Llegue hasta cero también.

Pude avanzar, pero no logro detener en cero el primer tiempo, donde estará mi error verdad?. Allí dejo el programa pbp e isis esquema. Gracias


----------



## D@rkbytes (Mar 12, 2020)

marvin villalobos dijo:


> Ahora estoy en cómo hacer para que el primer tiempo cuando llega a cero se quede estático y el otro tiempo 2 Llegue hasta cero también.


En el programa adjunto muestro cómo lo haría yo usando interrupciones, el Timer 1 y banderas.


----------



## marvin villalobos (Mar 13, 2020)

Esto funciona excelnte Darbytes, voy a adaptarlo a mi projecto. Muchas graciasd de alli te cuento como va.


----------



## JUNIORPOICON (Mar 25, 2020)

D@rkbytes dijo:


> Te adjunto un ejemplo, pero sólo con 4 CD4094. Ya posteriormente lo podrás expandir.
> 
> Ver el archivo adjunto 156609​Nota: Por ser simulación, no usé resistencias para los displays.



En el ejemplo que envias, me esta dando problemas al momento de trasladar tu ejemplo a mi pic 18f2550. 

Sobre todo por esta línea en negrita.

Display:
    x       Var Byte
    Index   Var Byte
    Numero  Var Byte

    For x = 0 To 3
*Index = Rata[x] -48 ; Convertir el dato a número.*
        ; Obtener el número correspondiente.
        LookUp Index,[63,6,91,79,102,109,124,7,127,103], Numero
        ; Enviar cada número a los registros de desplazamiento
        ShiftOut pin_Data, pin_Clock, MSBFIRST, [Numero]
    Next x


----------



## D@rkbytes (Mar 25, 2020)

No mencionas qué problema, pero supongo que todo se debe a las configuraciones del PIC18F2550.
Este PIC tiene algunos registros especiales que sin los conocimientos adecuados el programa no funcionará correctamente.

Adjunto el mismo programa pero modificado para el PIC18F2550 (FOsc = INTOSC @ 8 MHz.)


----------



## JUNIORPOICON (Mar 30, 2020)

*Muchas gracias D@rkbytes , *ahora solo debo grabar la data enviada en la memoria EEPROM interna del pic.


----------



## torres.electronico (Abr 3, 2020)

Hola, como andan? Tengo una consulta... Estoy haciendo unos calculos de frecuencia respiratoria y me estan fallando las pocas matematicas basica que me permite PBP...
La formula original es:


```
;ie=Inhalacion y Exhalacion
;delay_i_e = retardo de inhalacion y exhalacion
;delay_pausa=Tiempo muerto entre periodo de Inhalacion y Exhalacion

periodo = 600/frecuencia   ; 10 minimo - 30 maximo
i_e = periodo *0,6   
delay_i_e=i_e * 1000/100 ; me entrega el valor en milisegundos
pausa=periodo *0, 4           
delay_pausa=pausa * 1000 / 100  ; me entrega el valor en milisegundos
```

Como no puedo trabajar directamente con esas lineas, opere multiplicando por 10 y luego dividiendo de esta forma:


```
;ie=Inhalacion y Exhalacion
;delay_i_e = retardo de inhalacion y exhalacion
;delay_pausa=Tiempo muerto entre periodo de Inhalacion y Exhalacion

periodo = 600/frecuencia   ; 10 minimo - 30 maximo
i_e = periodo *6   
delay_i_e=i_e * 10000/1000 ; me entrega el valor en milisegundos
pausa=periodo *4           
delay_pausa=pausa * 10000 / 1000  ; me entrega el valor en milisegundos
```

El tema esta en que no me da un resultado estable para hacer los tiempos de los periodos... esta desbordando? Alguien ve el error aqui? se les ocurre aguna manera de hacerlo.

Tengo un error... Es 60/frecuencia....
Igual no me funciona


----------



## blackpic (Abr 5, 2020)

Hola*.* *¿*Qu*é* tal*,* Torres*?* *A* ver si puedo ayudar un poco con mi poco conocimiento que tengo.
Entiendo que en la primera línea de tu c*ó*digo:
Periodo = 600 / Frecuencia ; 10 mínimo - 30 máximo
*E*n esta línea "Periodo" toma un valor como m*í*nimo de 10 y un m*á*ximo de 30
*S*i es as*í* entonces "Frecuencia" toma un valor comprendido entre 20 y 60
1- 20 para un periodo m*á*ximo igual a 30*,* ya que al dividir 600 / 20 = 30 m*á*ximo*.*
2- 60 para un periodo m*í*nimo igual a 60.  600 / 60 = 10 m*í*nimo.

Espero *haber* ayudado y que sea lo que pude comprender.


----------



## torres.electronico (Abr 5, 2020)

Hola amigo, anteriormente comenté que tenia un error de tipografia; Nones 600, es 60. Vamos a otro concepto para entender mejor lo que se necesita calcular.
Interpretemos como periodo a la accion de Inhalar y Exhalar. La cantidad de sucesiones dentro de 60 segundos, la definiriamos como la frecuencia respiratoria. Hasta aqui seria todo facil, peronla mecanica respiratoria tiene otro punto mas a tener en cuenta: " el tiempo muerto", que basicamente es cuando completamos un periodo. Con esto podemos entonces definir que la inhalacion y exhalacion absorbe del tiempo total un 70% aproximadamente, y el 30% y un poco menos tambien, elntiempo muerto.
El calculo que se esta queriendobhacer, es para obtener los tiempos basicos (tiempo inhala - tiempo exhala - tiempo muerto) para determinada frecuencia respiratoria seleccionada. Esto seriabtan solo un pequeño avance en el proyecto, ya que esta señal despues iria con un sincronismo que lo ejerce el mismo cuerpo y se sensa con in sensor de presión. Te agradezco tu participación
Acá alguien implementa la misma formula


----------



## marvin villalobos (Abr 27, 2020)

Buenas tardes, nuevamente por aqui. Estoy concluyendo éste proyecto : *Curso de programación de PIC en PICBasic Pro*  y mi pregunta es porqué cuando *"A VECES"* el tiempo se me cuelga en el display, y queda congelado el tiempo en la pantalla y no continúa, pero eso ocurre con la carga puesta a través de los triacs, sin las cargas, no se hace así ?


----------



## D@rkbytes (Abr 27, 2020)

Solo tú sabes lo que estás haciendo, porque el enlace al que haces referencia es al ejemplo que subí.
Aunque si de TRIAC se trata, podría ser por ruido, lo cual ya se ha tratado en el Foro.


----------



## marvin villalobos (May 3, 2020)

Sabes todo. Está bien.
Sí era ruido, le puse un capacitor 104 y quedo excelente. Gracias, D@rkbytes.


----------



## alex candelo q (May 4, 2020)

Hola*. E*stoy haciendo un control de luces con pulsadores pero no s*é* c*ó*mo hacer para que me funcione sin tener en cuenta que he presionado un pulsador X*.
E*s decir*,* si presiono (pulsador) y (pulsador1) necesito que el programa me encienda los led asociados a cada pulsador sin importar cu*á*l se presion*ó* primero*.
N*ecesito que sea libre*,* que obedezca al pulsador o los pulsadores presionados indistintamente.
*¿*Alguien me puede decir c*ó*mo lo hago*?*
Como lo tengo solo me obedece a uno por vez, no encuentro la forma de hacerlo en MicroCode Studio.
*D*e antemano*,* gracias por su ayuda.

*P*ongo parte del programa:

```
inicio:                   ; inicio de la linea de programa       
if (pulsador=1) then gosub secuencia
pause 100       
if (pulsador1=1) then gosub secuencia1
  pause 100       
if (pulsador2=1) then gosub secuencia3
pause 100
goto inicio       

secuencia:
            HIGH portb.0   
           PAUSE 10000
           LOW portb.0     
            goto inicio           
secuencia1:         
            HIGH portc.0   
           PAUSE 10000
           LOW portc.0     
            goto inicio
secuencia3:           
           HIGH porta.0   
           PAUSE 100
           LOW porta.0     
            goto inicio

end                    ; fin del programa
```


----------



## ricbevi (May 4, 2020)

No lo tomes a mal pero te sugiero que borres y comiences de nuevo.

La Instrucción GOSUB es para derivar el programa a una subrutina que comienza en una etiqueta y termina con RETURN(no existe tal cosa en tu programa .
De la ayuda del MicroCode



Si usas retardos de 10seg(PAUSE 10000, tu programa estará allí esperando que se cumpla el tiempo y recién luego retornara para ver que hiciste con los pulsadores, etc. etc.

SI necesitas estar atento a los pulsador tienes que encontrar la forma de no "matar" durante todo ese tiempo al microcontrolador para que este pueda revisar lo que tú haces con ellos.


----------



## alex candelo q (May 4, 2020)

ricbevi dijo:


> No lo tomes a mal pero te sugiero que borres y comiences de nuevo.
> 
> La Instrucción GOSUB es para derivar el programa a una subrutina que comienza en una etiqueta y termina con RETURN(no existe tal cosa en tu programa .
> De la ayuda del MicroCode
> ...



*H*ola*, *ricbevi*. P*ues lo he intentado de muchas formas pero no lo logro hacer y antes de usar el gosub usaba el goto*,* el else y cambiando el programa en varias formas pero nada*.
A*hora m*á*s o menos entiendo lo que me explicas*,* lo voy a intentar nuevamente.
*¿S*i me podes dar una mano al menos con una linea para tener una idea clara*?*

Gracias de antemano.


----------



## ricbevi (May 5, 2020)

Puede ser porque no te pones tú en el lugar del microcontrolador y el trabajo que según tus instrucciones debe realizar.

Recuerda y grabate que el microcontrolador solo hace una cosa a la vez pero el truco es que lo hace muy rápido para nosotros y así como una película de video es una sucesión de "fotos"a una velocidad rápida, tú puedes implementar un sistema similar en el programa.  

Para qué quieres esperar sin hacer nada mas si debes prender algo durante x tiempo y luego apagarlo?

Hay varias formas de resolver esto según la precisión que amerite la situación.

Puedes realizar un contador con una variable que se incremente cada determinado tiempo(muy corto...ejemplo 50ms) y cada vez que la incrementas revisas los otros pulsadores y haces según tú antojo lo que debas y cuando llegas al tiempo según la suma de estos pequeños retardos apagas lo que has prendido.

La de mayor precisión sería usando interrupciones pero sospecho, por como vas con la programación en general, que lo dejes para más adelante.


----------



## alex candelo q (May 5, 2020)

ricbevi dijo:


> Puede ser porque no te pones tú en el lugar del microcontrolador y el trabajo que según tus instrucciones debe realizar.
> 
> Recuerda y grabate que el microcontrolador solo hace una cosa a la vez pero el truco es que lo hace muy rápido para nosotros y así como una película de video es una sucesión de "fotos"a una velocidad rápida, tú puedes implementar un sistema similar en el programa.
> 
> ...



Hola, ricbevi, soy un novato en esto pero ya entiendo lo que me dices, muchas gracias por tu aclaracion.


----------



## torres.electronico (May 6, 2020)

Coincido con ricbevi; No funciona por que el problema esta entre el computador/teclado y el asiento 
Fuera de broma, se me ocurrio una manera simple de hacerlo. El comandobtoggle invierte el estado del puerto seleccionado. Para que funcione, necesitamos dos cosas:
_Saber el estado inicial del puerto (por eso pongo en estado bajobal inicio para tener una referencia)
_tener un antirebote (con el comando while-wend podemos hacerlo)
_ejemplo:

Low portb.0
Low portb.1

inicio:                    
if pulsador1=1  then
While pulsador1=1 : wend
Toggle portb.0
Endif
if pulsador2=1 then
While pulsador2=1 : wend   ;Antirebote
Toggle portb.1                       ;invierte el estado del puerto
Endif
goto inicio


----------



## ricbevi (May 6, 2020)

Sin Toggle también es posible
haciendo:
portb.1 = ~portb.1


```
Low portb.0
Low portb.1

inicio:
if pulsador1=1 then
While pulsador1=1 : wend
portb.0=~portb.0
Endif
if pulsador2=1 then
While pulsador2=1 : wend ;Antirebote
portb.1=~portb.1 ;invierte el estado del pin del puerto
Endif
goto inicio
```


----------



## Adnejs (May 11, 2020)

Hola que tal me podrían ayudar con unos Contadores con PIC16F877A Y PICF1684A y un codificador 7447

Bueno en el caso del PIC16F84A se realizaba en el display numeros de 9 a 0 (adjunto captura de la simulacion)
Este es el circuito mas el codigo en Microcode el cual si sale el conte de 9 a 0.

Pero al momento de pasar a utilizar el decodificador no se como poder generar el código para MICROCODE STUDIO en el que el display debe de visualizar los números del 9 al 0.




Y el ultimo seria utilizando esta misma simulacion (si es que esta mal hecha podrían decirme en donde) pero ahora se deben de utilizar dos displays y dos CI 7447 yl contador debe de ser de 99 a 0


----------



## ricbevi (May 11, 2020)

Le sugiero y para facilitar el análisis y posibles respuestas, hace un archivo con simulación y código y súbalo como adjunto.

Como se dara cuenta hay mil formas o poco menos de hacer esto.

Para mi el error es el tipo de display con el controlador que no es el que corresponde.


----------



## Adnejs (May 11, 2020)

ricbevi dijo:


> Le sugiero y para facilitar el análisis y posibles respuestas, hace un archivo con simulación y código y súbalo como adjunto.
> 
> Como se dara cuenta hay mil formas o poco menos de hacer esto.
> 
> Para mi el error es el tipo de display con el controlador que no es el que corresponde.



Si, cambie el display y ahí ya hizo el counter correctamente, al igual cambie algo del código y me funciono por ahora


----------



## DOSMETROS (May 11, 2020)

Podrías subir el archivo comprimido (.zip o .rar) con la solución y funcionando como aporte !


----------



## ricbevi (May 12, 2020)

Me olvide incluir el código de mi simulación pero es lo que apreciaba en la imagen de lo aportado en la consulta más pequeños agregados sin el cual a veces las cosas no funcionan.


```
'****************************************************************
'*  Name    : Puerto.BAS                                        *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2020 [RicBevi ] :)                  *
'*          : All Rights Reserved                               *
'*  Date    : 11/05/2020                                        *
'*  Version : 1.0                                               *
'*  Notes   : PIC 16F628A + decodificador 7447 y 4511 conectados*
'*          : a B.0...B.3 con display de 7 segmentos AC y CC    *
'*          : respectivamente                                  *
'****************************************************************
' fusible de programación del pic
_intrc_osc_pwrt_on_wdt_off_mclr_off_lvp_off_protect_off
' uso el oscilador interno y los pines son digitales, sin wdt,mclr, protección de código, programación de bajo voltaje

DEFINE  OSC  4  ' velocidad de trabajo del oscilador

cmcon = 7 ' apago comparadores analógicos

trisb = 0 ' puerto B es salida
portb = 0 ' limpio puerto a estado bajo

i var byte ' defino variable


inicio: ' inicio de la rutina/programa

for i = 0 to 9    ' Para el valor de i entre 0 y 9
portb = i         ' el puerto toma el valor de i
pause 500         ' espero medio segundo
next i            ' incremento i hasta el valor de 9

goto inicio       ' voy a iniciar todo de nuevo

end  ' fin del programa
```

Por cierto en sus esquemas dejas pines libres o flotantes(sin ninguna referencias o a GND o a Power) en los IC decodificadores y eso puede traer problemas en la simulación o en la práctica por lo que es una buena práctica *no hacerlo*.


----------



## Adnejs (May 12, 2020)

[/CODE]

Por cierto en sus esquemas dejas pines libres o flotantes(sin ninguna referencias o a GND o a Power) en los IC decodificadores y eso puede traer problemas en la simulación o en la práctica por lo que es una buena práctica *no hacerlo*.
[/QUOTE]


ricbevi dijo:


> Me olvide incluir el código de mi simulación pero es lo que apreciaba en la imagen de lo aportado en la consulta más pequeños agregados sin el cual a veces las cosas no funcionan.
> 
> 
> ```
> ...


Gracias, en caso de querer conectar dos contadores pero sin decodificador en un PIC16F877A solo me funciona bien el primer contador que esta conectado en el puerto b
este sería el codigo que llevo por ahora


----------



## ricbevi (May 12, 2020)

Al menos a mi me pasa que el archivo pbp no corresponde al hex adjuntado.

Declaras y limpias el puerto B y C en el programa y usas el display conectado al B y al D en la simulación, el cristal de esa forma (en cortocircuito los pines del oscilador) jamas funcionara en la realidad...¿para que esta al igual que los capacitores de 22pF? no son necesarios para la simulación.

Por otro lado si no declaras la velocidad creo que el PBP toma como que sera 4MHz por defecto pero en las propiedades del pic lo declaras a 1MHz.

Esto es importante porque el compilador calcula los retardos de tiempo en función a dicho cristal declarado.

Te aclaro que el PBP lo manejo muy por arriba ya que hace mas de 10 años que migre al Proton Basic por las limitaciones que tiene dicho compilador.

Debes trabajar y mucho ya que esto es horas y horas de silla delante del compilador y simulador pero debes basarte en como son las cosas realmente.

No puedes poner un display de led sin decodificador en un puerto, si no haces tú en el programa el trabajo de pasar el numero a lo que se debe mostrar en los dígitos mediante el prendido de los segmentos.

Subiste un ejemplo con LookUp a eso me refiero y eso es lo que necesitas o alguno otra forma pero no la que adjuntaste en cuanto a programación.


----------



## Adnejs (May 12, 2020)

ricbevi dijo:


> Al menos a mi me pasa que el archivo pbp no corresponde al hex adjuntado.
> 
> Declaras y limpias el puerto B y C en el programa y usas el display conectado al B y al D en la simulación, el cristal de esa forma (en cortocircuito los pines del oscilador) jamas funcionara en la realidad...¿para que esta al igual que los capacitores de 22pF? no son necesarios para la simulación.
> 
> ...


No estan adjuntados los que subi? bueno no los ejecuta?
Bueno la cosa esque en mi trabajo así me lo pide, conectar los dos display sin el decodificador


----------



## ricbevi (May 13, 2020)

Adnejs dijo:


> No estan adjuntados los que subi? bueno no los ejecuta?
> Bueno la cosa esque en mi trabajo así me lo pide, conectar los dos display sin el decodificador



Si el trabajo así se lo pide debe hacerlo así para cumplirlo pero no pretenda que lo que aplica a nivel de software para el circuito con un codificador binario a 7 segmentos sea idéntico al que no lo tiene.

Estoy refiriéndome a lo que subió en el adjunto Ciruito3.rar.


```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2020 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 12/05/2020                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
TRISB = 0
PORTB = 0

TRISC = 0
PORTC = 0
'DECLARACION DE VARIABLES
i VAR BYTE
a VAR BYTE
b VAR BYTE



un0 VAR a.0
un1 VAR a.1
un2 VAR a.2
un3 VAR a.3

de0 VAR b.0
de1 VAR b.1
de2 VAR b.2
de3 VAR b.3



INICIO:
FOR i=99 TO 0 STEP -1
b=i/10
a=i-b*10

PORTB.0=un0
PORTB.1=un1
PORTB.2=un2
PORTB.3=un3  

PORTC.0=de0
PORTC.1=de1
PORTC.2=de2
PORTC.3=de3


PAUSE 500
NEXT i
GOTO INICIO
```

Los archivos incluidos no corresponde el hex al pbp que contienen.

El archivo hex se ejecuta con la falla del dígito de la decena pero no se puede analizar o reformar nada por que no corresponde al archivo pbp que se encuentra allí(ver código subido).

Tal vez soy yo que no veo donde convierte de binario a 7 segmentos en dicho software y usted me lo puede indicar.

Tabla que contiene el codificador binario a 7 segmentos 7447 y que se debe implementar en el software si no se lo quiere usar.



Por cierto también es de buena practica realizar comentarios de que se esta haciendo en el programa para ayudar al otro a comprender que se esta realizando y en el futuro para uno mismo, ver de que forma lo hacia.

Simulacion



Donde se aprecian todas y cada una de las fallas que le advertí anteriormente(cristal, uso erróneo del puertoD cuando el software usa el C, etc).


----------



## JUNIORPOICON (Jul 24, 2020)

Buenas noches.
soy nuevo en esto del PIC12F635, me podrian brindar una mano con alun ejemplo sencillo , como por ejemplo encender un led. por que la verdad no tengo idea de como configurar a sus pines de salida ni como cambiarles de nombre. Dicho sea de paso programo en Pic Basic Pro. 

Pd: 
Por experiencias en otros Pic se que para cambiar de nombre a un pin en especifico que quiero como salida,en este caso un led ,hago lo siguiente:
  LED1    VAR PORTC.5      o     SYMBOL  LED1       = PORTC.5

En el PIC12f635 como llamaria a sus pines de salida.?!

Gracias de ante mano.


----------



## D@rkbytes (Jul 24, 2020)

JUNIORPOICON dijo:


> ¿En el PIC12F635 cómo llamaría a sus pines de salida?


En los PIC con un solo puerto suelen llamarse PORTA o PORTB, en este caso: PORTA


JUNIORPOICON dijo:


> ¿Me podrían brindar una mano con algún ejemplo sencillo, como por ejemplo; encender un LED?


*High Pin* para establecer un estado alto y *Low Pin* para establecer un estado bajo.

Ejemplos sobre LED con PIC en PICBasic existen muchos en el Foro.


----------



## JUNIORPOICON (Jul 24, 2020)

Gracias por la respuesta* D@rkbytes*
Estuve averiguando por mi lado y efectivamente si coincide el Datasheet del PIC con lo que mencionas.



D@rkbytes dijo:


> En los PIC con un solo puerto suelen llamarse PORTA o PORTB, en este caso: PORTA



Encontre tambien este programa: (otra manera de llamar a los pines del PIC)


```
X VAR BYTE              ;crea variable de 255
 
 trisio=%110111               ;todos los pines gpio son de salida

 INICIO:
    FOR x=1 TO 5     
    HIGH gpio.0            ;encender el led del pin gpio.1
    PAUSE 300     
    LOW gpio.0
    PAUSE 300
    NEXT X
        
    GOTO INICIO
    
 END
```


----------



## D@rkbytes (Jul 24, 2020)

JUNIORPOICON dijo:


> trisio=%110111 ;todos los pines gpio son de salida


No, ahí solo se está declarando que GPIO.3 sea salida.
Y aunque usas GPIO.0 que está declarado como entrada, la instrucción "*High Pin*" lo convierte en salida, por eso el programa funcionará.
Por lo tanto, quedó de sobra configurar los pines con TRISIO
Si hubieras escrito GPIO.0 = 1 el programa no funcionaría porque GPIO.0 está configurado como entrada.


JUNIORPOICON dijo:


> Estuve averiguando por mi lado y efectivamente si coincide el Datasheet del PIC con lo que mencionas.


Claro, en la hoja de datos se encuentra esa información, algo que ahora muchos olvidan.


----------



## JUNIORPOICON (Jul 25, 2020)

D@rkbytes dijo:


> No, ahí solo se está declarando que GPIO.3 sea salida.
> Y aunque usas GPIO.0 que está declarado como entrada, la instrucción "*High Pin*" lo convierte en salida, por eso el programa funcionará.
> Por lo tanto, quedó de sobra configurar los pines con TRISIO
> Si hubieras escrito GPIO.0 = 1 el programa no funcionaría porque GPIO.0 está configurado como entrada.
> ...


 Si eso lo se, pero el GP3 es a la vez el MCLEAR es por eso que lo configuro así, bueno se me ocurrió eso para no tocar ese pin. 
Ayudame a configurar bien esos pines y no tener problemas al momento de volver a regrabar el pic.


----------



## D@rkbytes (Jul 25, 2020)

Por defecto en todos los PIC los pines están configurados como entradas.
Así que si todo un puerto se necesita como entrada, no tendrá caso escribir TRISA = %11111111 porque será redundante.
Si no se usan, no captan ruidos, ni afectan al programa como muchos piensan y por eso configuran como salidas los pines que no van a usar.
Un pin que no se usa no tiene porqué afectar al programa, puesto que su sistema lógico es independiente.
Como ejemplo: si un pin estuviera recibiendo datos seriales, no tiene porqué interferir con el resto.


JUNIORPOICON dijo:


> Si eso lo se, pero el GP3 es a la vez el MCLEAR es por eso que lo configuro así, bueno se me ocurrió eso para no tocar ese pin.


Eso tampoco tiene sentido, ya que siendo el Master Clear o Reset, siempre será entrada, así que configurarlo como salida no tiene sentido.
Si no lo piensas tocar, simplemente no lo usas sabiendo que no se puede, a menos que pueda ser entrada digital como en algunos PIC.



JUNIORPOICON dijo:


> Ayúdame a configurar bien esos pines y no tener problemas al momento de volver a regrabar el PIC


Eso no requiere ayuda, simplemente configuras lo que requieras que sea salida y entrada y posteriormente les asignas un estado.
El uso del registro TRISIO es cuando piensas darle un estado al pin directamente sin el uso de las instrucciones "_High Pin_", "_Low Pin_" o "_Toggle Pin_"
Esas instrucciones como mencioné anteriormente configuran el pin como salida haciendo uso de los registros TRISx
O sea que si voy a escribir "GPIO.2 = 1" entonces sí se debe usar el registro TRISIO y configurar GP2 como salida.
TRISIO = %11111011 o TRISIO.2 = 0


----------



## JUNIORPOICON (Jul 25, 2020)

Muchas gracias , acabas de despejar muchas dudas.


----------



## JUNIORPOICON (Jul 25, 2020)

Estimado* D@rkbytes*, buenas noches*.
¿Có*mo podría yo configurar el PIC para q*ue* por más que esté encendido no ejecute el programa hasta despu*é*s de unos minutos, o quizás agregarle una especie de tiempo de retardo*?*

Esto lo hago por protección en caso de apagones.

```
SYMBOL  LED1       = PORTB.0
SYMBOL  MOTOR      = PORTB.1
TRISB=0

Motor_1:
    high MOTOR          
    pause 8000      
    low MOTOR            
    pause 2000        
    GOTO Motor_1
   
END
```


----------



## D@rkbytes (Jul 25, 2020)

Con alguno de los timers, te recomiendo el Timer1 porque es de 16 bits, lo cual permite realizar retardos más grandes.
Lo configuras para que desborde cada 10 o 100 mS y haces cuentas conforme al tiempo que quieras.
Por cada desborde incrementas un contador y cuando llegue a X conteo activas una bandera que comprobarás dentro del bucle principal del programa.

Algo similar comenté por aquí: Timer con PIC12F629. Tiempos


----------



## JUNIORPOICON (Jul 26, 2020)

*D@rkbytes*

Disculpa la molestia pero, me podrías ayudar con algun ejemplo, por favor.

Te comento estuve averiguando sobre como hacer para no ejecute el programa y me encontre con el comando SLEEP

SLEEP    60         ; duerme por aprox. 1 minuto.

se puede usar esto o queda mejor con el Timer1.?

Gracias de antemano.


----------



## D@rkbytes (Jul 26, 2020)

Sí se puede usar pero sería igual que usar "Pause", de todos modos congelaría al microcontrolador durante el tiempo establecido.
Por eso es mejor usar los Timers.

Adjunto un ejemplo usando la interrupción por desborde del Timer 1


----------



## JUNIORPOICON (Jul 27, 2020)

muchas gracias* D@rkbytes *por el apopyo*.*


----------



## JUNIORPOICON (Ago 3, 2020)

Estimado  D@rkbytes 



D@rkbytes dijo:


> Adjunto un ejemplo usando la interrupción por desborde del Timer 1



Intente llevar tu programa al PIC 16f628A ,y no me activa la pantalla LCD, sin embargo si enciende el led1 despues de terminar el tiempo que en este caso es 5 segundos pre-establecidos.
No se que podría estar haciendo mal.

Este es el código:


```
@ __CONFIG _FOSC_INTOSCIO & _WDT_OFF & _PWRTE_ON & _LVP_OFF

Define OSC 8                ; Definir que se trabajará con 8 MHz.

 ; Definición de pines para la pantalla.
Define LCD_DREG PORTB        ; Puerto de datos.
Define LCD_DBIT     4        ; Bit de inicio de datos.
Define LCD_RSREG PORTA        ; Puerto de RS (Register Select)
Define LCD_RSBIT    0        ; Pin para RS
Define LCD_EREG PORTA        ; Puerto de E (Enable)
Define LCD_EBIT     1        ; Pin para E

  Symbol LED1 = PORTA.2        ; LED indicador de tiempo 1 en RA2
  Symbol LED2 = PORTA.3        ; LED indicador de tiempo 2 en RA3

Pre_Timer1    Var Word        ; Variable para el valor de precarga del Timer 1
Ticks_T1    Var Byte        ; Variable para contar los desbordes del Timer 1
Cont_Segs    Var Word        ; Variable para contar segundos
Tiempo_Segs    Var Word        ; Variable para establecer el tiempo deseado en segundos
Flag_Tiempo    Var Bit            ; Variable bandera para indicar tiempo completado

inicio:
    TRISA = 1
    TRISB=1
    ; Configurar el Timer 1
    T1CON = %00111101            ; Prescaler 1:8
    Pre_Timer1 = 40536            ; Para que desborde cada 100 mS @ 8 MHz.
    TMR1H = Pre_Timer1.HighByte    ; Precargar el byte más significativo en el Timer 1
    TMR1L = Pre_Timer1.LowByte    ; Precargar el byte menos significativo en el Timer 1
    PIE1.0 = 1                    ; Activar la interrupción por desborde del Timer 1
    
    INTCON = %11000000
    
    Tiempo_Segs = 5                ; Establecer el tiempo deseado en segundos.
    Flag_Tiempo = 0                ; Inicializar la bandera "Flag_Tiempo" en 0
    
    On Interrupt GoTo Servicio_Interrupciones
  
    LCDOut $FE,1    ; Inicializa o borra la pantalla.
    
Programa:
    ; Dentro del bucle principal no deben existir retardos.
    
    If Flag_Tiempo = 1 Then        ; Si se cumplió el tiempo establecido...
        ; Aquí se ejecutaría el programa cuando se cumpla el tiempo establecido.
        ; Esto es como ejemplo pero no se deben usar retardos dentro del bucle
        ; porque afectarían la operación continua del Timer 1
    
    high led1
    
    LCDOUT $FE,$80, " * Welcome * "   ;limpiar pantalla y sacar el texto
    LCDOUT $FE,$C0, " Prueba No. 01"  ;pasar al comienzo de la segunda línea
        
    Flag_Tiempo = 0            ; Indicar que ya se ejecutó el programa.
    EndIf
    
    ; Dentro del bucle principal no deben existir retardos.
    
    GoTo    Programa
    
Servicio_Interrupciones:
    Disable
    
    If PIR1.0 = 1 Then            ; Ocurrió un desborde del Timer 1
        Ticks_T1 = Ticks_T1 + 1    ; Incrementar la variable "Ticks_T1"
        If Ticks_T1 > 9 Then    ; Cuando llegue a 10 es porque se cumplió un segundo.
            Cont_Segs = Cont_Segs + 1    ; Incrementar la variable "Cont_Segs"
            Ticks_T1 = 0        ; Regresar la variable "Ticks_T1" a 0
        EndIf
        ; Si la variable "Cont_Segs" es igual a la variable "Tiempo_Segs"...
        If Cont_Segs = Tiempo_Segs Then
            Cont_Segs = 0        ; Regresar la variable "Cont_Segs" a 0
            Flag_Tiempo = 1        ; Indicar que se ha cumplido el tiempo establecido.
        EndIf
        
        PIR1.0 = 0                ; Limpiar la bandera TMR1IF
        ; Recargar el Timer 1
        TMR1H = Pre_Timer1.HighByte    ; Precargar el byte más significativo en el Timer 1
        TMR1L = Pre_Timer1.LowByte    ; Precargar el byte menos significativo en el Timer 1
    EndIf
    
    Resume
    Enable

    End
```


----------



## ricbevi (Ago 3, 2020)

Pasar de un PIC a otro no es solo cambiar la cabecera. En muchas ocasiones hay que leer atentamente la hoja de datos de los dos PIC y ver si son 100% compatibles.

En este caso el 16F628 solo tiene oscilador interno de 4MHz y por defecto arranca con los pines de  los puertos con los comparadores analógicos activado, etc y no veo que los desactives.


```
Define OSC 4                ; Definir que se trabajará con 4 MHz.
cmcon = 7                   ' apago comparadores analogicos
```

Todo esto es en general y en particular de ese programa seguramente te contestara el tocayo.

Para cuando hagas una consulta deberías ofrecer el archivo de la simulación, el archivo fuente y el hex ya compilado todo dentro de un archivo comprimido para ver que es lo que estas haciendo.

Saludos.

Ric.


----------



## JUNIORPOICON (Sep 18, 2020)

Buenas tardes
Ando buscando implementar un conversor rs232 a rs485, encontre este diagrama, lo implementé, sin embargo no me esta funcionando. por lo que leí este diagrama es bi-direccional.

Si alguien me pudiera ayudar seria excelente.

Gracias.


----------



## torres.electronico (Sep 18, 2020)

JUNIORPOICON dijo:


> Buenas tardes
> Ando buscando implementar un conversor rs232 a rs485, encontre este diagrama, lo implementé, sin embargo no me esta funcionando. por lo que leí este diagrama es bi-direccional.
> 
> Si alguien me pudiera ayudar seria excelente.
> ...


Algo parecido hice pero sin la conexión de rts, déjame ver dónde tengo la protoboard para verificar
Este es el que arme (el de Lucas ) Conversor RS232 a RS485 – Automatismos Mar del Plata
Pero déjame ver dónde tengo armado en el protoboard por qué algo le modifique


----------



## JUNIORPOICON (Sep 18, 2020)

torres.electronico dijo:


> Algo parecido hice pero sin la conexión de rts, déjame ver dónde tengo la protoboard para verificar
> Este es el que arme (el de Lucas ) Conversor RS232 a RS485 – Automatismos Mar del Plata
> Pero déjame ver dónde tengo armado en el protoboard por qué algo le modifique



la pregunta del millon sería; es bidireccional.??


----------



## D@rkbytes (Sep 18, 2020)

JUNIORPOICON dijo:


> Ando buscando implementar un conversor rs232 a rs485


Ya los venden hechos a un precio demasiado accesible.
Mira por aquí: [Aporte] Librería RS-485 para PIC C Compiler (CCS)


----------



## JUNIORPOICON (Sep 18, 2020)

D@rkbytes dijo:


> Ya los venden hechos a un precio demasiado accesible.


En realidad tienes razón, pero me gustaría implementar dos conversores, son para prueba en realidad, pero si no funciona tendr*é* q*ue *comprar.


----------



## D@rkbytes (Sep 18, 2020)

JUNIORPOICON dijo:


> En realidad tienes razón, pero me gustaría implementar dos conversores, son para prueba en realidad, pero si no funciona tendr*é* q*ue *comprar.


Te va a salir más barato comprarlos hechos que hacerlos, aparte de que no tienes que diseñar ni experimentar nada.


----------



## torres.electronico (Sep 22, 2020)

Hace un tiempo alguien compartió en este tópico un dimmer. Lo estoy buscando y no lo encuentro. Alguien se acuerda quien lo compartió?


----------



## Dr. Zoidberg (Sep 22, 2020)

torres.electronico dijo:


> Alguien se acuerda quien lo compartió?


Será el que hizo @Scooter para mostrar el uso de interrupciones del timer?
Pero creo que estaba en C y no en Basic... y además era con Atmega (Arduino) no con PIC.


----------



## torres.electronico (Sep 22, 2020)

Solo me acuerdo que tenía dos versiones, con potenciómetro o con pulsadores; La idea es verlo y modificarlo para reciclar dos motores de portón que tiene un bta16-600


----------



## Dr. Zoidberg (Sep 22, 2020)

Este es el que yo digo: [Aporte] Control de fase (Dimmer) con Arduino
Pero no usa botones...es solo con un pote


----------



## torres.electronico (Sep 22, 2020)

Dr. Zoidberg dijo:


> Este es el que yo digo: [Aporte] Control de fase (Dimmer) con Arduino
> Pero no usa botones...es solo con un pote


Simplicimo, me gustó; voy a migrar la idea, gracias


----------



## Scooter (Sep 23, 2020)

Si quieres hacerlo con pulsadores tan sol hay que modificar el main loop, quitar el Espera = ... y poner otra función en su lugar, la que queráis.
Leer el potenciómetro es lo mas universal.


----------



## ricbevi (Sep 23, 2020)

Yo encontré este de aquí  que esta en Proton Basic pero para un 16F84A....migrarlo a otro PIC del tipo no implica mucho trabajo pero es con pulsadores y la rutina de impresión deja mucho que desear.

En su momento yo lo acomode  a mi gusto de esta forma

```
'****************************************************************
'*  Name    : Dimmer_16F84A.BAS                                 *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2020 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 10/08/2014                                        *
'*  Version : 2.0                                               *
'*  Notes   : Mod by RicBevi                                    *
'*          :                                                   *
'****************************************************************
 Device 16F84A
 Xtal=4
 EData 30
 On_Hardware_Interrupt GoTo Interrupcion        ' Cuando ocurre la interrupcion salta a Interrupcion
 
 Symbol T0IE = INTCON.5                         ' Habilitacion TMR0
 Symbol T0IF = INTCON.2                         ' Flag TMR0
 Symbol GIE  = INTCON.7                         ' Interrupciones globales habilitadas
 Symbol INTF = INTCON.1                         ' Flag rb0
 Symbol INTE = INTCON.4                         ' Habilitar interrupcion b0
 Symbol T0CS = OPTION_REG.5                     ' Timer0 reloj interno o externo
 Symbol INTEDG = OPTION_REG.6                   ' Flanco ascendente rb0
 
 Input PORTA                                    ' Puerto A como entrada de pulsadores en A.0 y A.1
 Output PORTB                                   ' Puerto B como salida
 Input  PORTB.0                                 ' Puerto B.0 como entrada
 
 Symbol Triac = PORTB.1                         ' Salida triac en B.1
 
Declare LCD_DTPin  PORTB.4                      ' Puerto B salida datos B4 B5 B6 B7
Declare LCD_RSPin  PORTB.2                      ' Puerto B1 pin rs del lcd
Declare LCD_ENPin  PORTB.3                      ' Puerto B2 pin Enable del LCD
Declare LCD_Interface = 4                       ' Configuracion LCD
Declare LCD_Lines 2                             ' Configuracion LCD
Declare LCD_Type 0                              ' Configuracion LCD
 
 Dim Porcentaje As Byte
 Dim contador As Byte
 Dim PorcentajeV As Byte                         ' Valor antiguo de la variable para comparacion

 GoTo Inicio:                                   ' Ir a inicio
   Context Save                           
Interrupcion:   
          ' Context Save                        ' Interrupcion     
    If INTF = 1 Then                            ' Si se produjo la interrupcion de portb0
        Low    Triac                            ' Apago el triac
        INTE = 0                                ' Desabilito interrrupcion rb0
        INTF = 0                                ' Borro el flag de rb0
        contador = 100 - Porcentaje             ' Contador es una variable que se usa para
                                                'generar el retardo desde el punto cero hasta
                                                'el disparo es igual a porcentaje + 10 \'
                                                'ya que 10 es 1ms demora del transistor antes de cero
        TMR0 = 165                              ' El timer deberia ser de 100 pulsos cada vez osea
                                                '255- 100 + algunas instrucciones  que ya pasaron
        T0CS = 0                                ' El timer cuenta con el reloj interno comienza a contar
        T0IE = 1                                ' Abilito la interrupcion del timer
    ElseIf  T0IF = 1 Then                       ' Si se desbordo el timer
        T0IF = 0                                ' Borro el flag del timer
        TMR0 = TMR0 + 150                       ' Cargo Timer con el valor actual mas 150 que serian 100 instrucciones de resto
        Dec contador                            ' Decremento contador
        If contador = 0 Then                    ' Si contador = 0
           T0IE = 0                             ' Desabilito la interrupcion del timer
           INTE = 1                             ' Habilito la interrupcion RB0
           High   Triac                         ' Prendo el triac
        EndIf
     EndIf   
Context Restore                                 ' Restaurar variables y volver al lugar donde se detuvo

Inicio:
    Porcentaje = ERead 0                         ' Leo posicion 0 de eeprom
    GIE  = 1                                     ' Habilito interrupcion general
    INTE = 1                                     ' Habilito interrupcion RB0
  
programa:
 
   Print At 1,1, "Porcentaje "
      
program1:
   If Porcentaje <> PorcentajeV Then
     Print At 1,14, Dec2 Porcentaje
      PorcentajeV = Porcentaje
   EndIf
   DelayMS 100
If PORTA.1 = 1 And  Porcentaje < 99 Then
    Inc Porcentaje
    EWrite 0, [Porcentaje ]   
ElseIf PORTA.0 = 1 And Porcentaje > 1 Then
    Dec Porcentaje
    EWrite 0, [Porcentaje ]
End If
GoTo program1

End
```


----------



## torres.electronico (Sep 23, 2020)

Déjame ver cómo lo meto en algún pic de 8 pines para hacer algo bien chico y aprovechar el resto del hardware que viene en los dos motores... Prácticamente la tengo fácil, solo necesito controlar dos relay, leer dos switch y disparar el moc3022 que dispara el triac... La reforma mecánica es hacer una barrera vehicular, pero está complicado hacer los engranajes, así que voy a jugar con bajarle la velocidad lo más que pueda (hasta notar que pierde par motor) para ver si puedo moverlo 45grados


----------



## ricbevi (Sep 23, 2020)

Justiniano para un PIC de 8 pines....2 de los relay, mas dos de los switch, mas disparo triac, mas entrada de detección cruce por cero, mas dos de alimentación igual 8 pines.

Si no hay necesidad de impresión/salida display, el programa en sí en el compilador Proton  lleva unas 373 palabras como esta, entrara en uno de 8 pines tranquilamente.


----------



## torres.electronico (Sep 23, 2020)

Recién saque humito del triac; grabé una prueba sencilla con tres estados o intencidades y al parecer debo de haber borrado la calibración del osc por qué sacó humo  ... Lo probé en un 16f628 y osc externo y anda lo más bien ese mini programa. Voy a ver si me hago de un tiempo para colectar más info y hacer todo directamente en el pic de18 pines. Termino y comparto


----------



## juancaca (Sep 23, 2020)

torres.electronico dijo:


> Hace un tiempo alguien compartió en este tópico un dimmer. Lo estoy buscando y no lo encuentro. Alguien se acuerda quien lo compartió?





juancaca dijo:


> Buenas noches compañeros, despues de un largo tiempo de haber hecho este proyecto y que con la ayuda de Sr. D@rkbytes logre colocarlo a funcionar con visualizacion de una pantalla LCD 16x2, es un variador de velocidad para motores de 120V AC que es lo que se trabaja en colombia, tambien sirve para variar la luminosidad de una bombilla incandescente espero les sirva y si pueden mejorarlo mucho mejor y lo compartan, este proyecto tambien lo pueden hacer sin la pantalla LCD todo viene separado, ya que el pic principal trabaja independiente del pic que hace la visualizacion.
> 
> El archivo de simulacion esta en proteus 8.5 SP0.
> 
> ...



Hola torres!
Yo postee este dimmer hace algún tiempo.


----------



## torres.electronico (Sep 24, 2020)

Hola Juan, gracias. Ayer arme un dimmer convencional con triac y diac para sacarme la duda y no logré modificar la velocidad. Probé algunas ideas de 2M pero justo no tenía un capacitor de 10u para ponerlo en serie... Probé con uno de 2.5 y el motor hacía ruido de que quería más morro, pero estoy pensando en hacer una especie de rampa para simular el control de velocidad; Al ser una carga inductiva, tengo un tiempo dado en que el bobinado mantiene la energía.... Quizás haciendo un tren de pulsos dentro de la zona de conducción me haga un fenómeno similar al que quiero replicar


----------



## ferdy575 (Nov 8, 2020)

Hola a todos. Muchísimo tiempo que no pasaba por aquí a molestar.
A ver, les cuento. Armé una CNC y ahora quiero controlar el SPINDLE que es un BRUSHLESS hecho por mí y quiero ponerle tacometro con LCD 2X16 pero no he podido lograr que un solo PIC16F628A haga las 2 funciones.
¿Será que definitivamente es imposible, o seré yo que no he podido escribir bien el programa?
Este es mi programa:

```
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'tacometro LCD y pic 16f628a                                    '

'****************************************************************

CMCON = 7                               'Comparadores Apagados

TRISB = %00000000

PORTB = 0

'****************************************************************


@ DEVICE pic16F628A, LVP_OFF

@ DEVICE pic16F628A, PWRT_ON

@ DEVICE pic16F628A, BOD_ON

@ DEVICE pic16F628A, CPD_OFF

@ DEVICE pic16F628A, PROTECT_OFF

@ DEVICE pic16F628A, WDT_ON

@ DEVICE XT_OSC     

define osc 4       


' DEFINICIÓN DE REGISTROS PARA EL LCD

Define LCD_DREG PORTB

Define LCD_DBIT 4 

Define LCD_RSREG PORTB

Define LCD_RSBIT 0

Define LCD_EREG PORTB

Define LCD_EBIT 1 



TRISB=0                       

                    

taco var word                 


PAUSE 100                     


tacometro:                       

count porta.1,1000,taco       

taco=(taco*60)                 

lcdout $fe,1, "    SPINDLE     "

lcdout $fe,$c2,dec taco       

lcdout $fe,$c9,"R.P.M."       


pos var byte

cont var byte

servo1 var porta.1

potein var porta.0


pote:

Pot potein, 255,pos

for cont = 0 to 50

pulsout servo1,pos

pause 15

next cont

goto pote


GOTO tacometro                   

end
```
A ver si me pueden ayudar.
Les agradezco de antemano.


----------



## torres.electronico (Ene 7, 2021)

ferdy575 dijo:


> Hola a todos. Muchísimo tiempo que no pasaba por aquí a molestar.
> A ver, les cuento. Armé una CNC y ahora quiero controlar el SPINDLE que es un BRUSHLESS hecho por mí y quiero ponerle tacometro con LCD 2X16 pero no he podido lograr que un solo PIC16F628A haga las 2 funciones.
> ¿Será que definitivamente es imposible, o seré yo que no he podido escribir bien el programa?
> Este es mi programa:
> ...


En este mismo tema compartieron hace un tiempo un ejemplo de contador con TOKI


----------



## torres.electronico (Ene 29, 2021)

Les dejo y comparto estás librerías para manejo de display i2C.
Observen que son dos archivos, uno corresponde para pbp2.6 y el otro para las versiones pbp3.0 
Me estoy tomando el trabajo de buscar librerías para pbp de shield Arduino; Seria bueno ir acopiando con ejemplos para quien lo necesite


----------



## zoder45 (Feb 2, 2021)

Que tal buenas tardes*,* estoy trabajando con un sensor de temperatura y humedad amt1001*,* éste sensor cuenta con 2 cables de salida uno para humedad y el otro para temperatura*,* el de humedad trabaja con voltaje de salida mientras el de temperatura trabaja con un termistor ntc de 10k*.
M*i problema es que no se como hacer funcionar el de temperatura*,*  no se como va programado*.*


----------



## MaShicO (Feb 2, 2021)

zoder45 dijo:


> mi problema es que no se como hacer funcionar el de temperatura no se como va programado


Puedes conectar una resistencia adicional como divisor de tension para que tu uC pueda leer el valor analógico.


----------



## zoder45 (Feb 2, 2021)

MaShicO dijo:


> Puedes conectar una resistencia adicional como divisor de tension para que tu uC pueda leer el valor analógico.


*G*racias*,* y en la program*a*ci*ó*n como ser*í*a para que me de las lecturas en grados cent*í*grados *?

E*n la hoja de datos me aparece ésto pero hasta aquí estoy atorado de como leer los datos.

Table 6: 10K NTC B.3435 temperature and resistance correspondence table


Temperature（℃）01020304050607080

Resistance（kΩ）27.9018.2212.128.315.804.123.002.211.66


----------



## torres.electronico (Feb 2, 2021)

Termistor / Termopares, las salidas no son lineales, por lo tanto tenes que usar tablas del estilo LOOKUP o LOOKDOWN.
Mirate este link y guardalo tambien por que tenes matematicas para implementar en tus proyectos PBP:


			BASIC Stamp math functions


----------



## zoder45 (Feb 3, 2021)

Buen día*.*
El sensor que uso es el AMT1001 tiene temperatura por NTC 10*K* y humedad como salida máxima 3*V.*

Estuve trabajando con el código y tengo problemas, las lecturas están fluctuando mucho*.*
Alguien que de un vistazo y ver qu*é* estoy haciendo mal*.*

Saludos y gracias*.*


```
TRISA=255 ; DECLARAR TODO EL REGISTRO A COMO ENTRADA
TRISB=0 ; DECLARAR TODO EL REGISTRO B COMO SALIDA
TRISC=%00001111 ; DECLARAR RCO A RC3 COMO ENTRADA Y RC4 A RC7 COMO SALIDA

ADCON1=14  ; DECLARAR QUE LAS ENTRADA ra0 son analogico

SENSAR VAR word
DIGITAL VAR WORD

SENSAR=0
DIGITAL=0

PORTA=0
PORTB=0
PORTC=0

INICIO:

ADCIN 0,DIGITAL
SENSAR=150* DIGITAL
SENSAR=SENSAR/100
PAUSE 500
LCDOUT $FE,1  
LCDOUT $FE,2,"Tem" 
LCDOUT $FE,$C0,"=",#SENSAR,%11011111, "C"
PAUSE 500


GOTO INICIO
```


----------



## ricbevi (Feb 3, 2021)

Disculpa pero así no se entiende nada.

No hay un comentario de las líneas de código ni por casualidad, no nos informas que microprocesador estas usando.

En la lógica de la matemática y sin entrar en mucho detalle multiplicas una variable por 150 y luego la divides por 100, pregunto no será mas rápido y eficiente que tú apliques algo de matemática básica y multipliques por 15 y dividas por 10 que no alterara el resultado?.

Si trabajas con sensores analógicos y sin respuesta lineal o de alguna formula estándar conocida, tienes dos alternativas que se me ocurre o trabajas con una tabla almacenada y comparas la entrada con la tabla o encuentras una formula matemática que defina la curva que represente a tu sensor en funcionamiento con la precisión que desees.


----------



## zoder45 (Feb 3, 2021)

ricbevi dijo:


> Disculpa pero así no se entiende nada.
> 
> No hay un comentario de las líneas de código ni por casualidad, no nos informas que microprocesador estas usando.
> 
> ...



Que tal perdón por no poder mas datos
Dejo los de mas datos que me faltan

utilizo un Pic 16f876A
El sensor de Humedad es lineal y trabaja con un voltaje de salida de 0 a 3V y Humedad de 0 a 100%

El pin del sensor lo coloco en el pin 2 de micro ADC

Tengo el siguiente problema:

tengo valores muy cercanos ya que estoy comprobando con un multtimetro de temperatura y humedad uni-t
pero me esta saltando mucho por ejemplo: esta en 18 y pasa al 22 después que esta en 22 baja a 15 
Y no se mantiene estable sube o baja mucho 

el código es el siguiente:


```
INCLUDE "MODEDEFS.BAS" ; LIBRERIA PARA OCUPAR LA COMUNICACIÓN SERIAL
define LOADER_USED 1
DEFINE OSC 20 ;DEFINIR EL OSCILADOR EN 20 MHz (HS)
DEFINE ADC_BIST 10  ;DEFINE LA RESOLUCION  DEL ADC
DEFINE ADC_CLOCK 3  ;1-LP 2-XT 3-HS
DEFINE ADC_SAMPLEUS 50 ;TIEMPO QUE TARDA LA SEÑAL EN CONVERTIR LA SEÑAL ANALOGICA A DIGITAL
DEFINE LCD_DREG PORTC
DEFINE LCD_BITS 4
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50

TRISA=255 ; DECLARAR TODO EL REGISTRO A COMO ENTRADA
TRISB=0 ; DECLARAR TODO EL REGISTRO B COMO SALIDA
TRISC=%00001111 ; DECLARAR RCO A RC3 COMO ENTRADA Y RC4 A RC7 COMO SALIDA

ADCON1=14 

SENSAR VAR word
DIGITAL VAR WORD

SENSAR=0
DIGITAL=0

PORTA=0
PORTB=0
PORTC=0

INICIO:

ADCIN 0,DIGITAL
SENSAR=299*DIGITAL  ; los 250 es sacando del sensor * 255 que nos da el digital 
SENSAR=SENSAR/250  ; los 250 dividido y me da la humedad
pause 1000
LCDOUT $FE,1   
LCDOUT $FE,2,"humedad" 
LCDOUT $FE,$C0,"=",#SENSAR,%11011111, "%"
PAUSE 1000


GOTO INICIO
```


----------



## ricbevi (Feb 4, 2021)

No conozco el sensor ese ya que hace mucho que trato en lo posible de no trabajar con sensores analógicos habiendo digitales para evitar un montón de problemas que surgen de la comunicación, ruidos, etc. 

Sí el problema es de estabilidad, te sugiero que hagas varias mediciones en un determinado tiempo y luego promedies el resultado para mostrarlo *siempre que el valor halla cambiado.*

También puede ser debido a ruido que se "cuele" durante la medición debido a la longitud entre sensor-microcontrolador y un sinnúmero de etc que no nos comentas.

No es lo mismo algo armado en un PCB diseñado bien y con el uso de cables apantallados para evitar interferencias que un prototipo armado en un  protoboard con cables largos y sin blindaje, etc.

Como implementaste el programa siempre mides y muestras, lo que te estoy sugiriendo es que almacenes el valor anterior en una variable y antes de mostrar el valor actual lo compares y solo lo muestras si es diferente al anterior, de esa forma es mas estable todo y mas rápido ya que si no hubo variación no pierdes el tiempo mostrando algo que ya esta en el display.


----------



## dafer (Feb 25, 2021)

Buenas noches, saludos.
Acudo a este foro con la finalidad de interactuar con ustedes y lograr superar un inconveniente  con un pic y su programa, el cual paso a describir así.
Tengo un calentador de agua a gas, al cual, se le dañó (quemó) la tarjeta de control.
Menciono que esta tarjeta quemada posee como elemento de control un PIC12C509.
Yo analicé el funcionamiento del aparato y diseñé un código en microcode pero basado en el PIC16F84A y funciona sin problema en la simulación de proteus.
El inconveniente se presenta por el tamaño de la tarjeta con el PIC16F84A, que no cabe en el espacio destinado en el calentador, sin menoscabar que sobran pines sin uso.
A partir de ahí, decido pasar previas modificaciones a un pic enano, el PIC12F629, dado a sus bondades, el proyecto necesita solo tres entradas y tres salidas y este pic me ofrece eso.
Ya realizado el cambio o modificaciones al programa del PIC16F84A para compilarlo para el PIC12F629 no logro que funcione y el defecto está en los fuses de ese PIC.
Una de las fallas o error que presenta la simulación es que, no convierte el pin GP.3 en entrada y continúa siendo el pin del MCLR, tampoco se configura el oscilador interno.
Sin más, muestro el código hecho para el PIC16F84A y la simulación en proteus.
Cabe destacar que está realizado en microcode studio




```
'*  Version : 1.0                                               *

'*  Notes   : control calentador agua con pic 16f84a                                                  *

'*          :                                                   *

'****************************************************************

                                                        'pic 16F84A

define osc 4                                    'defino frec osc en 4mhz

    trisa=%00000                             'configuro puerto A como salidas

    trisb=%00111000                       'configuro puerto RB0-RB2 salidas y RB3-RB5 entradas

    portb=0                                      'inicializo las salidas a 0 logico

symbol  TEMP    = portb.3              'nombro el pin RB3 como TEMP

symbol  LLAMA  = portb.4              'nombro el pin RB4 como LLAMA

symbol  FLUJO    = portb.5             'nombro el pin RB5 como FLUJO

symbol  GAS       = portb.0             'nombro el pin RB0 como GAS

symbol  PILOT     = portb.1             'nombro el pin RB1 como PILOT

symbol  ALAR     = portb.2             'nombro el pin RB2 como ALAR


INICIO:                                           'comienzo de programa

    if TEMP = 0 then                        'pregunto si TEMP es 0 si es cierto

    goto ALARM                              'salto a ALARM

    endif                                           'fin del if

    if FLUJO =1 then                        'pregunto si FLUJO es 1 si es cierto

    pause 200                                  'pausa de 200 ms

    goto PRENDER                          'salto a PRENDER

    else                                            'de lo contrario

    goto inicio                                'salto a inicio

    endif                                         'fin del if

  

PRENDER:                                    'subrutina PRENDER

    pause 1000                             'pausa de 1 seg

    IF temp = 0 THEN                   'pregunto si TEMP es 0 si es cierto

    GOTO ALARM                         'salto a ALARM

    endif                                      'fin del if

    if FLUJO =0 THEN                  'pregunto si FLUJO es 0 si es cierto

    GOSUB INICIO                       'salto a INICIO

    ENDIF                                    'fin del if

    high GAS                               'enciendo GAS

    pause 500                             'pausa de 500 ms

    high PILOT                            'enciendo PILOT

    pause 500                             'pausa de 500 ms

  

    if LLAMA = 0 then               'pregunto si LLAMA es 1 si es cierto

    pause 1000                          'pausa de 1 seg

    else                                      'de lo contrario

    low PILOT                            'apago PILOT

    goto MANTENER                 'salto a MANTENER

    endif                                    'fin del if

  

    if LLAMA = 0 then               'pregunto si LLAMA es 1 si es cierto

    pause 1000                          'pausa de 1 seg

    goto APAGAR                      'salto a APAGAR

    else                                     'de lo contrario

    low PILOT                            'apago PILOT

    goto MANTENER               'salto a MANTENER

    endif                                   'fin de if

  

MANTENER:                            'subrutina MANTENER

  

    pause 500                            'pausa de 500 ms

    if TEMP = 0 then                  'pregunto si TEMP es 0 si es cierto

    goto ALARM                        'salto a ALARM

    endif                                     'fin de if

    pause 500                            'pausa de 500 ms

    if LLAMA and FLUJO  =1 then   'pregunta si LLAMA y FLUJO son 1 si es cierto

    gosub MANTENER              'salto a MANTENER de lo contrario

    goto APAGAR                     'salto a APAGAR

    endif                                   'fin del if

  

  

APAGAR:                                'subrutina de APAGAR

    low GAS                            'apago GAS

    low PILOT                         'apago PILOT

    pause 5000                       'pausa 500 ms

    goto  INICIO                     'salto a inicio

  

ALARM:                                'subrutina ALARM

    low gas                             'apago GAS     

    low piloT                           'apago PILOT

    goto LED                            'salto a LED

  

LED:                                      'subrutina LED

    high ALAR                        'prendo ALAR

    pause 100                        'pausa de 100 ms

    low ALAR                         'apago ALAR

    pause 100                        'pausa de 100 ms

    if TEMP =0 then               'pregunto TEMP es 0 si es cierto     

    gosub LED                       'regreso a LED  de lo contrario

    goto INICIO                     'salto a inicio

    endif                               'fin del if

  

    goto inicio                      'ir a inicio

    end                                 'fin del programa
```


```
'*  Version : 1.0                                               *

'*  Notes   : control calentador agua con pic 16f84a                                                  *

'*          :                                                   *

'****************************************************************

                                                        'pic 16F84A

define osc 4                                    'defino frec osc en 4mhz

    trisa=%00000                             'configuro puerto A como salidas

    trisb=%00111000                       'configuro puerto RB0-RB2 salidas y RB3-RB5 entradas

    portb=0                                      'inicializo las salidas a 0 logico

symbol  TEMP    = portb.3              'nombro el pin RB3 como TEMP

symbol  LLAMA  = portb.4              'nombro el pin RB4 como LLAMA

symbol  FLUJO    = portb.5             'nombro el pin RB5 como FLUJO

symbol  GAS       = portb.0             'nombro el pin RB0 como GAS

symbol  PILOT     = portb.1             'nombro el pin RB1 como PILOT

symbol  ALAR     = portb.2             'nombro el pin RB2 como ALAR


INICIO:                                           'comienzo de programa

    if TEMP = 0 then                        'pregunto si TEMP es 0 si es cierto

    goto ALARM                              'salto a ALARM

    endif                                           'fin del if

    if FLUJO =1 then                        'pregunto si FLUJO es 1 si es cierto

    pause 200                                  'pausa de 200 ms

    goto PRENDER                          'salto a PRENDER

    else                                            'de lo contrario

    goto inicio                                'salto a inicio

    endif                                         'fin del if

  

PRENDER:                                    'subrutina PRENDER

    pause 1000                             'pausa de 1 seg

    IF temp = 0 THEN                   'pregunto si TEMP es 0 si es cierto

    GOTO ALARM                         'salto a ALARM

    endif                                      'fin del if

    if FLUJO =0 THEN                  'pregunto si FLUJO es 0 si es cierto

    GOSUB INICIO                       'salto a INICIO

    ENDIF                                    'fin del if

    high GAS                               'enciendo GAS

    pause 500                             'pausa de 500 ms

    high PILOT                            'enciendo PILOT

    pause 500                             'pausa de 500 ms

  

    if LLAMA = 0 then               'pregunto si LLAMA es 1 si es cierto

    pause 1000                          'pausa de 1 seg

    else                                      'de lo contrario

    low PILOT                            'apago PILOT

    goto MANTENER                 'salto a MANTENER

    endif                                    'fin del if

  

    if LLAMA = 0 then               'pregunto si LLAMA es 1 si es cierto

    pause 1000                          'pausa de 1 seg

    goto APAGAR                      'salto a APAGAR

    else                                     'de lo contrario

    low PILOT                            'apago PILOT

    goto MANTENER               'salto a MANTENER

    endif                                   'fin de if

  

MANTENER:                            'subrutina MANTENER

  

    pause 500                            'pausa de 500 ms

    if TEMP = 0 then                  'pregunto si TEMP es 0 si es cierto

    goto ALARM                        'salto a ALARM

    endif                                     'fin de if

    pause 500                            'pausa de 500 ms

    if LLAMA and FLUJO  =1 then   'pregunta si LLAMA y FLUJO son 1 si es cierto

    gosub MANTENER              'salto a MANTENER de lo contrario

    goto APAGAR                     'salto a APAGAR

    endif                                   'fin del if

  

  

APAGAR:                                'subrutina de APAGAR

    low GAS                            'apago GAS

    low PILOT                         'apago PILOT

    pause 5000                       'pausa 500 ms

    goto  INICIO                     'salto a inicio

  

ALARM:                                'subrutina ALARM

    low gas                             'apago GAS     

    low piloT                           'apago PILOT

    goto LED                            'salto a LED

  

LED:                                      'subrutina LED

    high ALAR                        'prendo ALAR

    pause 100                        'pausa de 100 ms

    low ALAR                         'apago ALAR

    pause 100                        'pausa de 100 ms

    if TEMP =0 then               'pregunto TEMP es 0 si es cierto     

    gosub LED                       'regreso a LED  de lo contrario

    goto INICIO                     'salto a inicio

    endif                               'fin del if

  

    goto inicio                      'ir a inicio

    end                                 'fin del programa
```


	Mensaje automáticamente combinado: Feb 25, 2021

Una breve descripción del funcionamiento del programa, al arrancar el programa, se supervisa la entrada TEMP que es un sensor de temperatura por interruptor térmico normalmente cerrado, colocando un 1 lógico en el pin RB.3, cuando es 0 lógico se activa la alarma y evita que siga prendido o que encienda el quemador, al abrir la llave (chorro, regadera) se activa el interruptor del  del FLUJO de agua indicando el comienzo del trabajo de calentar, se activa la salida del GAS (electro válvula) y después de 200 ms se activa la salida de PILOT (generador de alta tención) y se enciende el quemador, luego de otra pausa se supervisa la entrada LLAMA la cual detecta que hay llama en el quemador, apagando la salida PILOT y se mantiene hasta que se cierre la llave abierta o que se apague la llama (agotarse el gas) o se elevo la temperatura max del calentador y halla activado el sensor TEMP.


----------



## D@rkbytes (Feb 25, 2021)

dafer dijo:


> Ya realizado el cambio o modificaciones al programa del PIC16F84A para compilarlo para el PIC12F629 no logro que funcione y el defecto está en los fuses de ese PIC.
> Una de las fallas o error que presenta la simulación es que, no convierte el pin GP.3 en entrada y continúa siendo el pin del MCLR, tampoco se configura el oscilador interno.


Los fuses para los PIC y otros datos más, se encuentran en los archivos .inc
Por ejemplo, estos son los fuses para el PIC12F629:


```
; The following is an assignment of address values for all of the
; configuration registers for the purpose of table reads
_CONFIG          EQU  H'2007'

;----- CONFIG Options --------------------------------------------------
_FOSC_LP             EQU  H'3FF8'    ; LP oscillator: Low power crystal on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_LP_OSC              EQU  H'3FF8'    ; LP oscillator: Low power crystal on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_FOSC_XT             EQU  H'3FF9'    ; XT oscillator: Crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_XT_OSC              EQU  H'3FF9'    ; XT oscillator: Crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_FOSC_HS             EQU  H'3FFA'    ; HS oscillator: High speed crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_HS_OSC              EQU  H'3FFA'    ; HS oscillator: High speed crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_FOSC_EC             EQU  H'3FFB'    ; EC: I/O function on GP4/OSC2/CLKOUT pin, CLKIN on GP5/OSC1/CLKIN
_EC_OSC              EQU  H'3FFB'    ; EC: I/O function on GP4/OSC2/CLKOUT pin, CLKIN on GP5/OSC1/CLKIN
_FOSC_INTRCIO        EQU  H'3FFC'    ; INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN
_INTRC_OSC_NOCLKOUT  EQU  H'3FFC'    ; INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN
_FOSC_INTRCCLK       EQU  H'3FFD'    ; INTOSC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN
_INTRC_OSC_CLKOUT    EQU  H'3FFD'    ; INTOSC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN
_FOSC_EXTRCIO        EQU  H'3FFE'    ; RC oscillator: I/O function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN
_EXTRC_OSC_NOCLKOUT  EQU  H'3FFE'    ; RC oscillator: I/O function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN
_FOSC_EXTRCCLK       EQU  H'3FFF'    ; RC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN
_EXTRC_OSC_CLKOUT    EQU  H'3FFF'    ; RC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN

_WDTE_OFF            EQU  H'3FF7'    ; WDT disabled
_WDT_OFF             EQU  H'3FF7'    ; WDT disabled
_WDTE_ON             EQU  H'3FFF'    ; WDT enabled
_WDT_ON              EQU  H'3FFF'    ; WDT enabled

_PWRTE_ON            EQU  H'3FEF'    ; PWRT enabled
_PWRTE_OFF           EQU  H'3FFF'    ; PWRT disabled

_MCLRE_OFF           EQU  H'3FDF'    ; GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD
_MCLRE_ON            EQU  H'3FFF'    ; GP3/MCLR pin function is MCLR

_BOREN_OFF           EQU  H'3FBF'    ; BOD disabled
_BODEN_OFF           EQU  H'3FBF'    ; BOD disabled
_BOREN_ON            EQU  H'3FFF'    ; BOD enabled
_BODEN_ON            EQU  H'3FFF'    ; BOD enabled

_CP_ON               EQU  H'3F7F'    ; Program Memory code protection is enabled
_CP_OFF              EQU  H'3FFF'    ; Program Memory code protection is disabled

_CPD_ON              EQU  H'3EFF'    ; Data memory code protection is enabled
_CPD_OFF             EQU  H'3FFF'    ; Data memory code protection is disabled
```

Y la palabra de configuración para el PIC12629 en PBPX >= 3.0, sería así:


```
; Palabra de configuración:
#Config
    __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _PWRTE_ON
#EndConfig
```


----------



## switchxxi (Feb 25, 2021)

@dafer ¿ Que programador/quemador usas ?... Lo pregunto porque muchos de ellos te permite "ajustar"/modificar la palabra de configuración. Por lo que, en vez de hacerlo en el programa, lo haces ahí. (No es lo mejor pero es otra opción que te puede sacar de apuros).

Ya que no has puesto el esquema con el PIC12f629, por las dudas,* te advierto que el pin 4 (GPIO 3) no tiene resistencia de pull-up interna, ojo como usas ese pin.*


----------



## dafer (Feb 26, 2021)

Buen día foro, agradecido por la orientación darkbytes y switchxxi , la probare en la tarde y lo del pin GP.4 que funciona como MCLR  siempre a menos que por los fuses se configure como entrada, y cuando les enviae al cod y el circuito con el pi12F629 ese detalle lo tome en cuenta.
mil gracias



> Ser ignorante en algo, no te hace bruto a menos que nunca intentes saber mas de eso.  DAFER




	Mensaje automáticamente combinado: Feb 26, 2021

disculpen  se me olvidaba uso microcode studio, pickit2 y quemador DT2090 por usb.


----------



## torres.electronico (Feb 26, 2021)

dafer dijo:


> Buenas noches, saludos.
> Acudo a este foro con la finalidad de interactuar con ustedes y lograr superar un inconveniente  con un pic y su programa, el cual paso a describir así.
> Tengo un calentador de agua a gas, al cual, se le dañó (quemó) la tarjeta de control.
> Menciono que esta tarjeta quemada posee como elemento de control un PIC12C509.
> ...


podrias optmizar varias lineas con el comando "while" y hasta quizas con un timmer para verificar temperatura.


----------



## dafer (Feb 27, 2021)

Buenas noches foro, coloque la palabra de configuración y aun sin compilar, me da error, indicando que  hay ERROR SINTAXIS (syntax error), sigo haciendo pruebas ye intentos, al amigo torres le comento buena opción pero no aplicable a mi proyecto con el 12F629 que carece de entradas analógicas. 



> Sé perseverante  con tus objetivos y flexible con tus métodos.


----------



## switchxxi (Feb 28, 2021)

¿ Cual sería el error que da el compilador ? ¿ Probaste tal cual como te dijo D@rkbytes ? Por lo que leí, las palabras de configuración deben estar en mayúsculas "_wdt_off" no es lo mismo que "_WDT_OFF", revisa si no viene por ahí el problema.



dafer dijo:


> el 12F629 que carece de entradas analógicas.



Ojo con esa asunción, *el 12f629 si* *que tiene entradas análogas*. No te olvides del comparador análogo que deberás apagar si es que el compilador no lo hace, no manejo ese lenguaje.


----------



## D@rkbytes (Feb 28, 2021)

dafer dijo:


> Coloqué la palabra de configuración y aún sin compilar, me da error, indicando que hay ERROR SINTAXIS (syntax error)


Lo más seguro es que se debe a que usas un compilador inferior a PBPX 3 y la palabra de configuración que recomendé es para esa versión de compilador o superior.


----------



## torres.electronico (Feb 28, 2021)

dafer dijo:


> Buenas noches foro, coloque la palabra de configuración y aun sin compilar, me da error, indicando que  hay ERROR SINTAXIS (syntax error), sigo haciendo pruebas ye intentos, al amigo torres le comento buena opción pero no aplicable a mi proyecto con el 12F629 que carece de entradas analógicas.



Tenes razón, hable pensando en el el 675  Igualmente, antes que nada, te recomiendo que leas estos dos hilos por las dudas:

 No me anda GPIO.0 en pic 12f629 con pbp

 No me anda GPIO.0 en pic 12f629 con pbp

En fin; Ahi lo manoseé un poco lo que tenias; En un rato armo algo en proteus y te comento si funcionó

`;@ DEVICE PIC12F629  
;@ DEVICE INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,WDT_OFF,MCLR_OFF,PWRT_ON,BOD_OFF

DEFINE OSC 4                ; Definir que se trabajará con 4MHz.

CMCON = 7                    ; Comparadores analógicos OFF
TRISIO = %1111000           ; Solo GP1 como salida

symbol  TEMP   = GPIO.3              'nombro el pin RB3 como TEMP
symbol  LLAMA  = GPIO.4              'nombro el pin RB4 como LLAMA
symbol  FLUJO  = GPIO.5             'nombro el pin RB5 como FLUJO

symbol  GAS    = GPIO.0             'nombro el pin RB0 como GAS
symbol  PILOT  = GPIO.1             'nombro el pin RB1 como PILOT
symbol  ALAR   = GPIO.2             'nombro el pin RB2 como ALAR

GPIO.0 = 0 : GPIO.1 = 0 : GPIO.2 = 0                  
    
INICIO:                                           'comienzo de programa
 if TEMP = 0 then                        'pregunto si TEMP es 0 si es cierto
    goto ALARM                              'salto a ALARM
   endif                                           'fin del if
if FLUJO =1 then                        'pregunto si FLUJO es 1 si es cierto
    pause 200                                  'pausa de 200 ms
    goto PRENDER                          'salto a PRENDER
   else                                            'de lo contrario
    goto inicio                                'salto a inicio
   endif                                         'fin del if

PRENDER:                                    'subrutina PRENDER
   pause 1000                             'pausa de 1 seg
   IF temp = 0 THEN                   'pregunto si TEMP es 0 si es cierto
    GOTO ALARM                         'salto a ALARM
   endif                                      'fin del if
    if FLUJO =0 THEN                  'pregunto si FLUJO es 0 si es cierto
     GOSUB INICIO                       'salto a INICIO
   ENDIF                                    'fin del if
    high GAS                               'enciendo GAS
     pause 500                             'pausa de 500 ms
    high PILOT                            'enciendo PILOT
     pause 500                             'pausa de 500 ms
   if LLAMA = 0 then               'pregunto si LLAMA es 1 si es cierto
     pause 1000                          'pausa de 1 seg
    else                                      'de lo contrario
     low PILOT                            'apago PILOT
    goto MANTENER                 'salto a MANTENER
   endif                                    'fin del if
   if LLAMA = 0 then               'pregunto si LLAMA es 1 si es cierto
     pause 1000                          'pausa de 1 seg
     goto APAGAR                      'salto a APAGAR
    else                                     'de lo contrario
     low PILOT                            'apago PILOT
     goto MANTENER               'salto a MANTENER
    endif                                   'fin de if

MANTENER:                            'subrutina MANTENER
    pause 500                            'pausa de 500 ms
    if TEMP = 0 then                  'pregunto si TEMP es 0 si es cierto
     goto ALARM                        'salto a ALARM
     endif                                     'fin de if
    pause 500                            'pausa de 500 ms
    if LLAMA and FLUJO  =1 then   'pregunta si LLAMA y FLUJO son 1 si es cierto
     gosub MANTENER              'salto a MANTENER de lo contrario
     goto APAGAR                     'salto a APAGAR
     endif                                   'fin del if

APAGAR:                                'subrutina de APAGAR
    low GAS                            'apago GAS
    low PILOT                         'apago PILOT
    pause 5000                       'pausa 500 ms
    goto  INICIO                     'salto a inicio

ALARM:                                'subrutina ALARM
    low gas                             'apago GAS     
    low piloT                           'apago PILOT
    goto LED                            'salto a LED
 
LED:                                      'subrutina LED
    high ALAR                        'prendo ALAR
    pause 100                        'pausa de 100 ms
    low ALAR                         'apago ALAR
    pause 100                        'pausa de 100 ms
    if TEMP =0 then               'pregunto TEMP es 0 si es cierto     
    gosub LED                       'regreso a LED  de lo contrario
    goto INICIO                     'salto a inicio
   endif                               'fin del if
goto inicio                      'ir a inicio

end`


----------



## dafer (Mar 3, 2021)

Buenos días foro, lo sugerido por por switcxxi lo tome en cuenta y aun no trabaja, lo expuesto por torres de igual forma lo sometí a mi programa y aun sin funcionar, con respecto a darkbyte, actualice el pbp a versión 3.7 y si compilo pero no trabaja bien, sigo intentando haciendo pruebas, he leído y estudiado libros de pic Basic y parece mentira no sale nada acerca del uso y programa de los pic enanos  
Agrego foto de mi quemador de pic atendiendo a la sugerencia de switchxxi


----------



## torres.electronico (Mar 3, 2021)

Miraste eh hiciste lo que dice esos dos links? Yo armé en proteus lo que creí entenderte y simule; No presté mucha atención y lo hice rápido, pero parecía funcionar. Querés que te pase el hex?


----------



## Carlos_elaguila (Jun 26, 2021)

Buenas noches saludos a todos desde Perú, por favor alguien podría pasarme un link para poder instalar correctamente el programa pbp y pic basic, no logro instalarlo, espero grandemente su apoyo


----------



## FALKON707 (Jul 6, 2021)

Saludos.. alguien sabe como desactivar el Pin MCLR Del *PIC16F873A* ??


----------



## D@rkbytes (Jul 6, 2021)

No se puede, en ese PIC el pin MCLR sirve únicamente para reset y programación.


----------



## ferdy575 (Oct 13, 2021)

Hola a todos*. P*aso por aqu*í* a contarles que despu*é*s de muchos años tuve que actualizar mi PC y pasar a Windows 10
*N*o lo hab*í*a actualizado pensando en la p*é*rdida de mis programas y confirmando mis temores ahora no consigo un Microcode Studio que funcione correctamente en el windows 10
*¿S*erá que alguien me puede ayudar??? *¿Dó*nde lo podr*é* conseguir???
*¿*Existe algún otro programa que funcione así de bonito como el microcode??? Ayuda, por favor.


----------



## D@rkbytes (Oct 13, 2021)

ferdy575 dijo:


> *N*o lo hab*í*a actualizado pensando en la p*é*rdida de mis programas y confirmando mis temores ahora no consigo un Microcode Studio que funcione correctamente en el windows 10


Yo tengo instalado el Microcode Studio en Windows 10 x64 y funciona correctamente.


ferdy575 dijo:


> *¿S*erá que alguien me puede ayudar?


¿Qué problema tienes?


ferdy575 dijo:


> *¿Dó*nde lo podr*é* conseguir?


Donde siempre: *Mecanique MicroCode Studio*


ferdy575 dijo:


> *¿*Existe algún otro programa que funcione así de bonito como el microcode?


Por supuesto, y mucho mejor... *Proton IDE*


----------



## torres.electronico (Oct 14, 2021)

Yo también lo tengo corriendo en un win10 (x64) sin problemas. 
Instalé en el disco raíz "C", la carpeta de pbp como siempre, y en la carpeta "x86", instalé el microcodestudio


----------



## Americo8888 (Oct 14, 2021)

ferdy575 dijo:


> Hola a todos*. P*aso por aqu*í* a contarles que despu*é*s de muchos años tuve que actualizar mi PC y pasar a Windows 10
> *N*o lo hab*í*a actualizado pensando en la p*é*rdida de mis programas y confirmando mis temores ahora no consigo un Microcode Studio que funcione correctamente en el windows 10
> *¿S*erá que alguien me puede ayudar??? *¿Dó*nde lo podr*é* conseguir???
> *¿*Existe algún otro programa que funcione así de bonito como el microcode??? Ayuda, por favor.


Lo mas práctico es tener instalado Virtual Machine en tu PC o laptop con cualquier S.O., e instalar un disco virtual con W XP 32 bits, Microcode corre muy bien allí.
Saludos
Americo8888


----------



## ricbevi (Oct 14, 2021)

D@rkbytes dijo:


> Yo tengo instalado el Microcode Studio en Windows 10 x64 y funciona correctamente.
> 
> ¿Qué problema tienes?
> 
> ...


OFF-TOPIC

Lastima que ya no saldrán nuevas actualizaciones, lo que si es de uno de los programadores de Proton, el Positron. 

Hay un repositorio con ejemplos/temas de Proton que estaban en el foro aquí. 

Personalmente no me satisface como el Proton pero puede ser dado los años que llevo usándolo y acostumbrándome a la interface, etc. 

Saludos.


----------



## EduardoGaristi (Mar 6, 2022)

Hola. Quiero comenzar a programar con PICBasic Pro. ¿Conocen algún curso virtual que pueda realizar? Muchas gracias.


----------



## D@rkbytes (Mar 6, 2022)

Estás consultado dentro del tema de un curso virtual. 
Por el momento tienes 167 páginas por leer.


----------



## Dario (Abr 15, 2022)

Hola gente, tanto tiempo sin entrar al foro jeje... bueno, el foro es como Dios, solo nos acordamos de el cuando nos hace falta...
bueno, les cuento que hace 2 dias que estoy peleando con un pic16f628A y la comunicacion serial. estoy intentando usar un modulo bluetooth HC05 para comunicar una pc con un pic. el problema es con el receptor, que no me quiere funcionar. en realidad funciona erraticamente. no le interesa el numero que le mande, hace cualquiera de las dos funciones que le he programado y esto cuando quiere... aca les comparto el codigo del receptor a ver si alguien me da una manito... 
como transmisor, estoy usando un asistente virtual que llevo tiempo usando para mi robot animatronic, del que he compartido el proyecto en este foro, pero tambien estoy usando una app que instale en mi celular, se llama Bluetooth terminal HC05. esta muy buena para experimentar. bueno, aca les dejo el codigo por si alguien me puede ayudar... saludos a todos!!!


```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2022 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 14/04/2022                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
'******************CONFIGURACION DE FUSIBLES*********************
@ __CONFIG _HS_OSC & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF
'***********CONFIGURACION DE PUERTOS Y FRECUENCIA DE RELOJ*********************
INCLUDE "modedefs.bas"
DEFINE OSC 20                     'DECLARAMOS UN RELOJ DE 4MHZ
CMCON = 7                        'DESACTIVAMOS LOS OPERACIONALES DEL PIC
TRISA=%11111111                  'DECLARAMOS PORTA.0 A 7 COMO ENTRADA
TRISB=%00000111                  'DECLARAMOS TODO EL PUERTO B COMO SALIDA

PORTA=%11111111                  'INICIALIZAMOS PORTA.0 A 7 EN UNO LOGICO
PORTB=%00000111                  'INICIALIZAMOS TODO EL PUERTO B EN CERO LOGICO
'*******************************************************************************
DATO VAR BYTE

RECIBE:
SERIN PORTB.0,N9600,2000,RES,DATO
IF DATO=10 THEN ABRE
IF DATO=20 THEN CIERRA
GOTO RECIBE


ABRE:
LOW PORTB.1
PAUSE 1000
HIGH PORTB.1
GOTO RECIBE

CIERRA:
LOW PORTB.2
PAUSE 1000
HIGH PORTB.2
GOTO RECIBE

RES:
HIGH PORTB.1
HIGH PORTB.2
DATO=0
GOTO RECIBE

END
```


----------



## torres.electronico (Abr 15, 2022)

Dario dijo:


> Hola gente, tanto tiempo sin entrar al foro jeje... bueno, el foro es como Dios, solo nos acordamos de el cuando nos hace falta...
> bueno, les cuento que hace 2 dias que estoy peleando con un pic16f628A y la comunicacion serial. estoy intentando usar un modulo bluetooth HC05 para comunicar una pc con un pic. el problema es con el receptor, que no me quiere funcionar. en realidad funciona erraticamente. no le interesa el numero que le mande, hace cualquiera de las dos funciones que le he programado y esto cuando quiere... aca les comparto el codigo del receptor a ver si alguien me da una manito...
> como transmisor, estoy usando un asistente virtual que llevo tiempo usando para mi robot animatronic, del que he compartido el proyecto en este foro, pero tambien estoy usando una app que instale en mi celular, se llama Bluetooth terminal HC05. esta muy buena para experimentar. bueno, aca les dejo el codigo por si alguien me puede ayudar... saludos a todos!!!
> 
> ...


Hola Darío, probaste usando la interrupción por usart? Ejemplo:

DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_Clear On 
....
Hserin 100,continuo,[dato]
...
IF DATO=10 THEN ABRE
IF DATO=20 THEN CIERRA


----------



## Dario (Abr 15, 2022)

torres.electronico dijo:


> Hola Darío, probaste usando la interrupción por usart? Ejemplo:
> 
> DEFINE HSER_BAUD 9600
> DEFINE HSER_RCSTA 90h
> ...


Hola martin, gracias por responder. probe un codigo parecido que compartieron aqui en el foro, es este que dejo aca. lo probe tal cual, pero sn exito... voy a hacer otra prueba haciendo algunas modificaciones, saludos. 

```
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ __CONFIG _XT_OSC & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF
'INCLUDE  "modedefs.bas"


CMCON = 0

DEFINE OSC 4
'*******************************************************************************
CMCON = 7                     
TRISA = %00000000
TRISB = %00010010
'*******************************************************************************
' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TcSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_Clear On               

LED var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'*******************************************************************************
pause 1000

PORTB.0 = 1                      '*************************
pause 500                       'esto es para saber q el pic vive
PORTB.0 = 0                      '*************************
 
inicio:
    
HSERIN 100,continuo,[led]



continuo:
if led = "A" then
PORTB.0 = 1
pause 500
endif

if led = "B" then
PORTB.0 = 0
pause 500
endif
goto inicio
end
```


----------



## torres.electronico (Abr 15, 2022)

No te estará pasando como me pasó en algún momento con el tema de puerto ocupado? Me acuerdo que darkbyte me ayudó en aquel entonces. Me pasó que cuando quería hacer comunicación serial desde pic al micro, no me funcionaba; Si no mal recuerdo, me dijo que use esos software de puertos virtuales y ahí caímos que era eso, que el puerto no lo podía usar por qué estaba ocupado... Después googleando caí que el verdadero conflicto era por usar un win desatendido ... Migre a otro win y quedó funcional... Chequea con otro micro en paralelo para ver si tenés comunicación. O sea, usa este mismo programa y en el otro micro mándale las instrucciones que le mandarías por el soft que estás usando


----------



## unmonje (Abr 15, 2022)

Dario dijo:


> Hola gente, tanto tiempo sin entrar al foro jeje... bueno, el foro es como Dios, solo nos acordamos de el cuando nos hace falta...
> bueno, les cuento que hace 2 dias que estoy peleando con un pic16f628A y la comunicacion serial. estoy intentando usar un modulo bluetooth HC05 para comunicar una pc con un pic. el problema es con el receptor, que no me quiere funcionar. en realidad funciona erraticamente. no le interesa el numero que le mande, hace cualquiera de las dos funciones que le he programado y esto cuando quiere... aca les comparto el codigo del receptor a ver si alguien me da una manito...
> como transmisor, estoy usando un asistente virtual que llevo tiempo usando para mi robot animatronic, del que he compartido el proyecto en este foro, pero tambien estoy usando una app que instale en mi celular, se llama Bluetooth terminal HC05. esta muy buena para experimentar. bueno, aca les dejo el codigo por si alguien me puede ayudar... saludos a todos!!!
> 
> ...


Lo primero que tiene que hacer, es evitar usar la instrucción PAUSE y saltar al siguiente nivel de programación, PAUSE es para primaria.
Use interrupciones para trabajo profesional y comunicaciones externas,
Con Interrupciones  es mucho mas difícil, pero mucho mas eficaz y eficiente.
Interrupciones es un "cambio de cabeza", pero si lo logra, le va a encantar,
Use también "Watch DOG" o una combinación de ambos.


----------



## Dario (Abr 16, 2022)

torres.electronico dijo:


> No te estará pasando como me pasó en algún momento con el tema de puerto ocupado? Me acuerdo que darkbyte me ayudó en aquel entonces. Me pasó que cuando quería hacer comunicación serial desde pic al micro, no me funcionaba; Si no mal recuerdo, me dijo que use esos software de puertos virtuales y ahí caímos que era eso, que el puerto no lo podía usar por qué estaba ocupado... Después googleando caí que el verdadero conflicto era por usar un win desatendido ... Migre a otro win y quedó funcional... Chequea con otro micro en paralelo para ver si tenés comunicación. O sea, usa este mismo programa y en el otro micro mándale las instrucciones que le mandarías por el soft que estás usando


Ok, ahora estoy usando solo la aplicacion del celular. probe el circuito en proteus usando virtual terminal. puse uno para enviar el caracter y otro conectado al tx del micro para ver que caracteres cargaba en la variable. puse en marcha la simulacion y cuando envio una A, me devuelve una y minuscula y cuando envio una B, me devuelve una r minuscula. probe en el montaje fisico y cuando envio una A, me devuelve unos caracteres raros... igual si envio una B... eso quiere decir que la variable se carga con cualquier cosa, menos con los datos enviados...  adjunto el nuevo codigo...
Gracias por la sugerencia unmonje, la tendre en cuenta por si n logro salir de esta jeje... iba a usar Arduino, pero es demasiado sencillo y la verdad, no me gusta jeje...
PD: ya probe tambien con conexion fisica y tampoco funciona...


```
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSCILADOR
@ __CONFIG _HS_OSC & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF
INCLUDE  "modedefs.bas"
DEFINE OSC 20
'*******************************************************************************
CMCON = 7                    
TRISA = %00000000
TRISB = %00010010
'*******************************************************************************
' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_Clear On              

LED var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'*******************************************************************************
pause 1000

PORTB.0 = 1                      '*************************
pause 1000                       'esto es para saber q el pic vive
PORTB.0 = 0                      '*************************
 
inicio:  
Hserin 10,INICIO,[led]
HSEROUT [led]
if led = "Y" then
PORTB.0 = 1
pause 500
endif
if led = "R" then
PORTB.0 = 0
pause 500
endif
goto inicio
END
```


----------



## unmonje (Abr 16, 2022)

Dario dijo:


> Ok, ahora estoy usando solo la aplicacion del celular. probe el circuito en proteus usando virtual terminal. puse uno para enviar el caracter y otro conectado al tx del micro para ver que caracteres cargaba en la variable. puse en marcha la simulacion y cuando envio una A, me devuelve una y minuscula y cuando envio una B, me devuelve una r minuscula. probe en el montaje fisico y cuando envio una A, me devuelve unos caracteres raros... igual si envio una B... eso quiere decir que la variable se carga con cualquier cosa, menos con los datos enviados...  adjunto el nuevo codigo...
> Gracias por la sugerencia unmonje, la tendre en cuenta por si n logro salir de esta jeje... iba a usar Arduino, pero es demasiado sencillo y la verdad, no me gusta jeje...
> PD: ya probe tambien con conexion fisica y tampoco funciona...
> 
> ...



1-Pase se a 1200 baudios, puede que algo en la cadena, no sea tan rápido y no haga a tiempo.
2- Antes de iniciar una comunicación, debe iniciar un bucle de consulta del bit de "ocupado" del dispositivo, con el cual quiere comunicarse "receptor"  y tambien del cual se usa como "transmisor"
3-Allane nos el camino, aclare que significa cada SETING
   En programación se  usa a la derecha de la linea de comando , otra que aclara que HACE ese comando. (Indispensable para trabajo corporativo)  
' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h      " aqui tiene que aclarar que implica poner 90H"
DEFINE HSER_TXSTA 24h        " aqui tiene que aclarar que implica poner 24H"
DEFINE HSER_SPBRG 25          " aqui tiene que aclarar que implica poner 25"
DEFINE HSER_Clear On

4- Lea detenidamente todo lo relacionado al protocolo  AT , para comunicarse con el modulo bluethooth
5- Si puede muestre un diagrama de la conexión que esta usado.

6-¿ En que momento se ejecuta este codigo  y que pretende ?
RES:
HIGH PORTB.1
HIGH PORTB.2
DATO=0
GOTO RECIBE

¿ Esto es lo que usted quiere hacer ? (Al menos es lo que enunció al principio del tópico.)
¿ Que sistema operativo usa su PC ?
¿Tiene en claro el protocolo AT de configuración de los módulos Bluethooth ?
¿ Como está probando su programa ahora, para verificar lo que dice o está emulando ?  


Leer aqui


----------



## D@rkbytes (Abr 16, 2022)

Dario dijo:


> PD: Ya probé también con conexión física y tampoco funciona.


Adapté un código que tenía por ahí conforme a lo que intentas hacer.
Usa la interrupción por recepción del módulo USART y obviamente está comprobado que funciona.

Lo adjunto como ejemplo.


----------



## Dario (Abr 16, 2022)

Hola D@rkbytes, gracias por tu codigo, es como lo que sigirio unmonje, lo voy a probar. les cuento que probe el codigo que deje en mi ultimo post conectando fisicamente y usando el debuger del microcode. envio A y recibo A, envio B y recibo B, asi que fisicamente, la variable se carga bien, pero no enciende ni apaga el led. voy a probar el ejemplo que dejaste y mas tarde les cuento como me fue y tambien les dejare el diagrama, que es muy sencillo. muchas gracias por tomarse el tiempo para aydudarme, saludos!!!


----------



## MaShicO (Abr 18, 2022)

Hola Dario, hace un tiempo con la ayuda de D@rkbytes llegué a realizar un proyecto con bluetooth, y funcionó. Con el pasar del tiempo me enfoqué en realizar todo en C, y tuve que estudiar las sintaxis y obviamente más a detalle los periféricos de los PIC's y AVR's. 

Te comento, puede pasar que el módulo bluetooth que estas usando este trabajando a otro valor de baudios, y es necesario conectar solo el modulo mediante un adaptador usb-ttl a la pc para configurar sus baudios con la ayuda de los comandos AT. Pero estoy seguro que la ayuda del amigo D@rkbytes lo solucionarás. Nos comentas como te fue ...


----------



## ATX (Abr 20, 2022)

Saludo a todo el grupo, tenia tiempo sin usar este tipo de lenguaje ya que emprendí en otras plataformas, mi duda es si hay algún comando en pbp que pueda extraer dicho numero de una variable, por ejemplo tengo:

VALOR VAR BYTE
VALOR = 234

Quiero extraer un numero especifico de la variable, quiera sacar el 2, 3 o el 4, como haría para ubicarme en la posición de la variable?


----------



## Dr. Zoidberg (Abr 20, 2022)

Querés sacar el 2 ==> VALOR / 100
Querés sacar el 3 ==> (VALOR % 100) / 10
Querés sacar el 4 ==> VALOR % 10 (donde % es el operador módulo o como se llame en PBP)

Por supuesto que todas las operaciones son enteras...


----------



## Gerson strauss (Abr 20, 2022)

ATX dijo:


> Saludo a todo el grupo, tenia tiempo sin usar este tipo de lenguaje ya que emprendí en otras plataformas, mi duda es si hay algún comando en pbp que pueda extraer dicho numero de una variable, por ejemplo tengo:
> 
> VALOR VAR BYTE
> VALOR = 234
> ...


Creo que se usa el operador matemático *DiG*
variable = valor DIG 2


----------



## unmonje (Abr 20, 2022)

ATX dijo:


> Saludo a todo el grupo, tenia tiempo sin usar este tipo de lenguaje ya que emprendí en otras plataformas, mi duda es si hay algún comando en pbp que pueda extraer dicho numero de una variable, por ejemplo tengo:
> 
> VALOR VAR BYTE
> VALOR = 234
> ...



Otras opciones :
TEOREMA del RESTO

y= a . 100 + b . 10 + c
a= int (y/100)
b= int ((y/100)-a) . 10))
c =  y-(a.100) -(b.10)

resto = (y/100)-a


----------



## ATX (Abr 20, 2022)

Gerson strauss dijo:


> Creo que se usa el operador matemático *DiG*
> variable = valor DIG 2


Exactamente tienes toda la razon, habia olvidado por completo el uso de este comando, si marco:

VALOR VAR BYTE
VALOR = 234
RESULT VAR BYTE

RESULT = VALOR DIG 2

Con esto saca el primer numero, el "2" y asi sucesivamente con el resto de los otros dos digitos, si marco 1 o 0. Ahora mi otra duda es como paso a binario el resultado, en realidad quiero mostrar en un display de 7 segmento el resultado que me entrega la variable,  se que si digo:

PORTB = %******** Me mostrara un valor binario en el display, la cosa ahora es pasar la variable, usando el BIN?


ATX dijo:


> Exactamente tienes toda la razon, habia olvidado por completo el uso de este comando, si marco:
> 
> VALOR VAR BYTE
> VALOR = 234
> ...


Este es el codigo que estoy empleando para ese sencillo ejemplo, tuve que hacer del uso de la LCD para ver si era correcto el resultado.

DEFINE OSC 4
DEFINE LCD_LINES 2
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3

TRISB = 0
PORTB = 0

VALOR VAR BYTE
VALOR = 234
RES VAR BYTE
DIS VAR BYTE[10]
DIS[0]=%00111111
DIS[1]=%00000110
DIS[2]=%01011011
DIS[3]=%01001111
DIS[4]=%01100110
DIS[5]=%01101101
DIS[6]=%01111101
DIS[7]=%00000111
DIS[8]=%01111111
DIS[9]=%01101111

LCDOUT $FE,1
PAUSE 500

INICIO:
RES = VALOR DIG 2
LCDOUT $FE,1,DEC RES
PAUSE 100
GOTO INICIO

END

Muchas gracias por las respuestas, es bueno siempre contar con personas cordiales y prestas a ayudar, me han refrescado la memoria y queria compartir mi pequeño ejemplo, sacar de una variable X un determinado numero usando el comando DIG, luego cree un arreglo para almacenar 10 valores que contendran en binario el estado del display y pasar el numero de la variable X al arreglo y de alli extraiga el numero que quiero que muestre el display.

Estoy trabajando en un lector de voltaje AC de la linea del 110/220v por ahora en la simulacion me funciona perfecto usando una LCD, lo quiero llevar a pasar los valores al display, les comparto el codigo, creditos a Gerson strauss gracias por tu ayuda y a los demas que respondieron.


DEFINE OSC 4
DEFINE LCD_LINES 2
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3

TRISB = 0
PORTB = 0
TRISC = 0
PORTC = 0

HAB_DIS1 VAR PORTC.0
VALOR VAR WORD
RES VAR WORD
DIS VAR BYTE[10]
VALOR = 1234

DIS[0]=%00111111
DIS[1]=%00000110
DIS[2]=%01011011
DIS[3]=%01001111
DIS[4]=%01100110
DIS[5]=%01101101
DIS[6]=%01111101
DIS[7]=%00000111
DIS[8]=%01111111
DIS[9]=%01101111

HAB_DIS1 = 1
PAUSE 100

INICIO:
HAB_DIS1 = 0
RES = VALOR DIG 2
PORTB = DIS[RES]
PAUSE 100
GOTO INICIO

END


----------



## switchxxi (Abr 20, 2022)

ATX dijo:


> en realidad quiero mostrar en un display de 7 segmento el resultado que me entrega la variable,  se que si digo:
> 
> PORTB = %******** Me mostrara un valor binario en el display, la cosa ahora es pasar la variable, usando el BIN?



Según el esquema que adjuntas no lo tienes que pasar a binario porque ese display es de 7 segmentos, no entiende "binario puro", osea que si envías 0000000 no muestra 0.

Normalmente se crea una tabla donde cada posición posee la combinación para mostrar en el display, algo así:

(Esto es de lo que recuerdo en C, en PBP ni idea como es pero no es muy distinto).


```
Unisgned char digitos[] = { // XGFEDCBA <<--- Los digitos a prender
                               00111111, // Muestra el 0
                               00000110, // Muestra el 1
                               ........
                               00000000 // Display apagado };
```

Ahí la posición elegida (0 - 9) ya devuelve la conversión correcta para manejar el display (la posición 11 apagaría el display pero con poner el puerto a 0 es lo mismo).


----------



## ATX (Abr 20, 2022)

switchxxi dijo:


> Según el esquema que adjuntas no lo tienes que pasar a binario porque ese display es de 7 segmentos, no entiende "binario puro", osea que si envías 0000000 no muestra 0.
> 
> Normalmente se crea una tabla donde cada posición posee la combinación para mostrar en el display, algo así:
> 
> ...


Exacto al final eso hice, se me ocurrio crear un array y luego tomar el valor de la variable por cada posicion y alli me ubico y lo saco directamente al display.


----------



## ATX (Abr 21, 2022)

Anteriormente les hice una pregunta en el foro sobre el manejo de extraer datos de una variable y pasarlos al display de LED, gracias a la ayuda que me brindaron pude terminar mi proyecto, en la simulacion segun esta bien, hice un lector de voltaje AC y refleja el valor en el display de la tension que hay en la red electrica, comparto y dejo adjunto el proyecto, no se si sea correcto y si en la vida real funcione de verdad, lo que hay que hacer es cambiar el valor de ALTERNATOR por el que le quieran colocar y se reflejara el valor obtenido.


----------



## oswaldus (Ago 1, 2022)

Estimados amigos del foro.
En primer lugar, gracias a todos los que saben más y colaboran para que aprendamos los que sabemos menos.
El motivo de este mensaje es para solicitar que algien enel foro, por favor me explique por qué cuando presiono un botón colocado, por ejemplo en el puerto B.1, en ese momento el resto del programa se detiene hasta que haya dejado de presionar ese botón? 
Hay alguna forma de evitar que esto suceda?
Esperando su amables comentarios, les agradezco.
Saludos!


----------



## DOSMETROS (Ago 1, 2022)

Sube diagrama y programa comprimido en una carpeta !


oswaldus dijo:


> Estimados amigos del foro.
> En primer lugar, gracias a todos los que saben más y colaboran para que aprendamos los que sabemos menos.
> El motivo de este mensaje es para solicitar que algien enel foro, por favor me explique por qué cuando presiono un botón colocado, por ejemplo en el puerto B.1, en ese momento el resto del programa se detiene hasta que haya dejado de presionar ese botón?
> Hay alguna forma de evitar que esto suceda?
> ...




Sube diagrama y programa comprimido en una carpeta !


----------



## oswaldus (Ago 1, 2022)

DOSMETROS dijo:


> Sube diagrama y programa comprimido en una carpeta !
> 
> 
> 
> Sube diagrama y programa comprimido en una carpeta !


DOSMETROS, gracias por responder.
OK, pronto estaré subiendo diagrama y programa comprimidos
Saludos!


----------



## torres.electronico (Ago 2, 2022)

oswaldus dijo:


> Estimados amigos del foro.
> En primer lugar, gracias a todos los que saben más y colaboran para que aprendamos los que sabemos menos.
> El motivo de este mensaje es para solicitar que algien enel foro, por favor me explique por qué cuando presiono un botón colocado, por ejemplo en el puerto B.1, en ese momento el resto del programa se detiene hasta que haya dejado de presionar ese botón?
> Hay alguna forma de evitar que esto suceda?
> ...



Esto lo compartí hace algún tiempo atrás y quizás resuelva tu duda...
Te cito un ejemplo como punto de partida...

main:
if input0 = 1 then encendido    (si la entrada 0 es igual a 1, ir al sub programa…)
if input0 = 0 then apagado      (si la entrada 0 es igual a 0, ir al sub programa ….)
goto main                                  (volver a la 1er línea del programa, osea, main)

encendido:                                (sub programa encendido)
high 7                                        (activar salida 7)
wait 1                                        (esperar 1 segundo)
goto main                                 (volver a la etiqueta “main”)

apagado:                                   (sub programa “apagado”)
high 6                                        (activar la salida 6)
wait 1                                        (esperar 1 segundo)
low 6                                         (desactivar la salida 6)
wait 1                                        (esperar 1 segundo)
high 6                                        (activar la salida 6)
wait 1                                        (esperar 1 segundo)
low 6                                         (desactivar la salida 6)
goto main                                 (volver a la etiqueta “main”)

Como verán, en la rutina anterior, lo único que hice, fue programar el microcontrolador con un dialogo sencillo, en ingles, pero muy deducible para aquellos que estén flojos con este idioma…
Prácticamente, lo único que le ordene al microcontrolador, es que monitoree la entrada numero cero (input cero), y en caso de tener algún estado definido (un alto o un bajo, osea, un 1 o un 0 lógico), este actúe dando como resultado una acción dada….
Internamente, estas líneas de programación, funcionan de la siguiente manera dentro del microcontrolador:

1_ Siempre, la rutina se lee y se ejecuta desde la 1er línea para abajo, salvo que halla un salto en el camino (ver imagen)

2_En este caso en particular, arranca el ciclo en la etiqueta “main”, pasa por la primera instrucción de que visualice y compare el estado de la entrada cero con el valor pre establecido y en caso de ser positivo el resultado saltar e ir al sub programa encendido…. (Ver imagen

Viendolo de otra manera...
En el caso de que la comparación de nula, el microcontrolador sigue líneas abajo leyendo las instrucciones.
Como verán, la siguiente instrucción, es similar, osea, compara el estado de la señal en la entrada cero, y si la comparación da positiva, salta al subprograma apagado; En caso de ser nula la comparación, sigue leyendo las siguientes líneas hasta llegar al fin del programa, o bien, hasta llegar a una bifurcación… En este caso, llega hasta la instrucción “goto”, lo cual, hace repetir el programa una y otra ves sin tener fin… En tu caso particular, al presionar el pulsador, corta la tarea u acción que hacía para atender la línea donde hace referencia de hacer algo si el pulsador está presionado; El tema está en como escribimos el programa, ya que puede quedar en ese punto sin hacer nada, cómo así también, puede que salte a una acción pero nuevamente se genere la misma acción por qué mantuvimos retenido el pulsador un tiempo largo y carecíamos de antirebotes....
Te recomiendo que arranques mirando "todos" los ejemplos de programación que tenés en este tópico para que vayas viendo y aprendiendo a programar en PBP. Saludos

PD: estoy escribiendo desde el teléfono y no puedo editarlo para insertar las imágenes y poner bien el código.perdon


oswaldus dijo:


> Estimados amigos del foro.
> En primer lugar, gracias a todos los que saben más y colaboran para que aprendamos los que sabemos menos.
> El motivo de este mensaje es para solicitar que algien enel foro, por favor me explique por qué cuando presiono un botón colocado, por ejemplo en el puerto B.1, en ese momento el resto del programa se detiene hasta que haya dejado de presionar ese botón?
> Hay alguna forma de evitar que esto suceda?
> ...



main:
if input0 = 1 then encendido    (si la entrada 0 es igual a 1, ir al sub programa…)
if input0 = 0 then apagado      (si la entrada 0 es igual a 0, ir al sub programa ….)
goto main                                  (volver a la 1er línea del programa, osea, main)

encendido:                                (sub programa encendido)
high 7                                        (activar salida 7)
wait 1                                        (esperar 1 segundo)
goto main                                 (volver a la etiqueta “main”)

apagado:                                   (sub programa “apagado”)
high 6                                        (activar la salida 6)
wait 1                                        (esperar 1 segundo)
low 6                                         (desactivar la salida 6)
wait 1                                        (esperar 1 segundo)
high 6                                        (activar la salida 6)
wait 1                                        (esperar 1 segundo)
low 6                                         (desactivar la salida 6)
goto main                                 (volver a la etiqueta “main”)

Como verán, en la rutina anterior, lo único que hice, fue programar el microcontrolador con un dialogo sencillo, en ingles, pero muy deducible para aquellos que estén flojos con este idioma…

Prácticamente, lo único que le ordene al microcontrolador, es que monitoree la entrada numero cero (input cero), y en caso de tener algún estado definido (un alto o un bajo, osea, un 1 o un 0 lógico), este actúe dando como resultado una acción dada….
Internamente, estas líneas de programación, funcionan de la siguiente manera dentro del microcontrolador:

1_ Siempre, la rutina se lee y se ejecuta desde la 1er línea para abajo, salvo que halla un salto en el camino

En este caso en particular, arranca el ciclo en la etiqueta “main”, pasa por la primera instrucción de que visualice y compare el estado de la entrada cero con el valor pre establecido y en caso de ser positivo el resultado saltar e ir al sub programa encendido…. 

Viendolo de otra manera...
En el caso de que la comparación de nula, el microcontrolador sigue líneas abajo leyendo las instrucciones.
Como verán, la siguiente instrucción, es similar, osea, compara el estado de la señal en la entrada cero, y si la comparación da positiva, salta al subprograma apagado; En caso de ser nula la comparación, sigue leyendo las siguientes líneas hasta llegar al fin del programa, o bien, hasta llegar a una bifurcación… En este caso, llega hasta la instrucción “goto”, lo cual, hace repetir el programa una y otra ves sin tener fin…


----------



## PICAXE18X (Ago 2, 2022)

torres.electronico dijo:


> Esto lo compartí hace algún tiempo atrás y quizás resuelva tu duda...
> Te cito un ejemplo como punto de partida...
> 
> main:
> ...



recientemente he realizado un código en pbp  y tuve que usar la siguiente instrucción

'Config for 16F886

#CONFIG
   __config _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_ON & _LVP_OFF & _CP_ON & _CPD_ON
  #ENDCONFIG

DEFINE OSC 8

por defecto el pbp toma la configuración predeterminada y asigna cristal de 4 Mhz,  hay que tener en cuenta el archivo .inc de cada pic en el pbp para configurar los fuses de cada pic. y definir el el cristal a usar.


----------



## torres.electronico (Ago 2, 2022)

Exacto, si no se ponen los fuses, PBP opta por configurar esos registros con unos valores por defecto. 
Ahora tenemos todo un tema aquí, ya que si compilas con PBP o MPASM desde microcode studio, no se configuran los fuses de la misma manera, ya que te marca error.


----------



## PICAXE18X (Ago 2, 2022)

torres.electronico dijo:


> Exacto, si no se ponen los fuses, PBP opta por configurar esos registros con unos valores por defecto.
> Ahora tenemos todo un tema aquí, ya que si compilas con PBP o MPASM desde microcode studio, no se configuran los fuses de la misma manera, ya que te marca error.




*C*uando compilaba el código que estaba realizando en pbp y como no estaba colocando los fuses correspondiente del pic que estaba usando, el pbp lo tomaba por defecto y asignaba el cristal de 4 MHz, cuando grababa el pic usando el mikroprog de mikroelectronic me daba cuenta que los fuses estaban por defecto y el watchdog estaba en on y tuve que leer manual de pbp para ver como se configuraba los fuses de cada pic y definir el oscilador a usar.
*E*n mi caso no marcaba error con respecto a la configuración de fuses, me marcaba error por sintaxis de instrucción equivocadas


----------



## oswaldus (Ago 2, 2022)

torres.electronico dijo:


> Esto lo compartí hace algún tiempo atrás y quizás resuelva tu duda...
> Te cito un ejemplo como punto de partida...
> 
> main:
> ...





torres.electronico dijo:


> Esto lo compartí hace algún tiempo atrás y quizás resuelva tu duda...
> Te cito un ejemplo como punto de partida...
> 
> main:
> ...


Torres.electrónico.
Gracias por tu amable y pronta respuesta.
Voy a probar el código que recomiendas, para de esa manera entender mejor lo que tú con gran paciencia explicas.
Valoro mucho tu ayuda.
Gran saludo!


----------



## torres.electronico (Ago 2, 2022)

oswaldus dijo:


> Torres.electrónico.
> Gracias por tu amable y pronta respuesta.
> Voy a probar el código que recomiendas, para de esa manera entender mejor lo que tú con gran paciencia explicas.
> Valoro mucho tu ayuda.
> Gran saludo!


En realidad, es un ejemplo poco práctico. Te recomiendo que les y busques ejemplos sobre interrupción por hardware, Lee lo practico que es la función while para los antirebotes, etc etc. Saludos


----------



## oswaldus (Ago 2, 2022)

Buenas noches.
Acabo de implementar el código que tan amablemente me sugirió torres.electrónico, pero al parecer no es lo que yo buscaba.
Al no subir esquema y programa, era difícil entender lo que yo estaba planteando.
Bien, ahora si subo el diagrama, el programa y además una nota explicativa en archivo de texto txt.
Espero su valiosa ayuda con este asunto.
Gracias nuevamente.


----------



## switchxxi (Ago 2, 2022)

oswaldus dijo:


> Acabo de implementar el código que tan amablemente me sugirió torres.electrónico, pero al parecer no es lo que yo buscaba.



Tu programa tiene un grave error (Quizás más, solo revise lo que dices). Cuando vas a la subrutina "AR" te quedas en un loop infinito que no saldrá jamas mientras que el fin de carrera este cerrado.

La idea de un antirrebote es para un pulsador en donde se espera que el usuario en algún momento lo suelte. Una vez llegado el ascensor y accionado el fin de carrera ¿ Como esperas que se suelte ?... Jamas pasara a menos que implementes una forma de que el ascensor se mueva nuevamente.

Ademas no necesitas antirrebote en un fin de carrera. Apenas lo detecta, tiene que activar alguna bandera para que un contador "congele" el ascensor por al menos 20 segundos (según lo que has escrito) y que mientras tanto vaya guardando las llamadas de los demás pisos para que, al terminar la temporización, siga camino.

Como bien te ha dicho @torres.electronico, lee sobre interrupciones y trabaja con banderas que te ahorraran mucho trabajo y dolor de cabezas.

¿ Ejemplo de código ? No programo en PBP pero tienes mas de 3000 post de los que leer y aprender.


----------



## oswaldus (Ago 3, 2022)

switchxxi dijo:


> Tu programa tiene un grave error (Quizás más, solo revise lo que dices). Cuando vas a la subrutina "AR" te quedas en un loop infinito que no saldrá jamas mientras que el fin de carrera este cerrado.
> 
> La idea de un antirrebote es para un pulsador en donde se espera que el usuario en algún momento lo suelte. Una vez llegado el ascensor y accionado el fin de carrera ¿ Como esperas que se suelte ?... Jamas pasara a menos que implementes una forma de que el ascensor se mueva nuevamente.
> 
> ...


Gracias por tu respuesta.
En el mundo real no es un fin de carrera, es un sensor óptico, pero por razones de simulación he usado un switch.
Este sensor atraviesa una lámina metálica de aproximadamente 10 Cm de largo .
Lo que yo busco es un código que incremente el contador cada vez que el sensor XSR cambia a “0” e inmediatamente siga con la ejecución del programa, aun cuando el sensor este en “0”, es decir aunque no termine de atravesar la lámina.
El problema que tengo es que mientras el sensor está recorriendo la lámina, el resto del programa no se ejecuta, porque está metido en la subrutina de incrementar el contador y permanece ahí hasta que el sensor sale de la lámina, todo ese tiempo desatiende otros eventos importantes como recibir llamadas de los pisos, etc., etc.


----------



## unmonje (Ago 3, 2022)

oswaldus dijo:


> Gracias por tu respuesta.
> En el mundo real no es un fin de carrera, es un sensor óptico, pero por razones de simulación he usado un switch.
> Este sensor atraviesa una lámina metálica de aproximadamente 10 Cm de largo .
> Lo que yo busco es un código que incremente el contador cada vez que el sensor XSR cambia a “0” e inmediatamente siga con la ejecución del programa, aun cuando el sensor este en “0”, es decir aunque no termine de atravesar la lámina.
> El problema que tengo es que mientras el sensor está recorriendo la lámina, el resto del programa no se ejecuta, porque está metido en la subrutina de incrementar el contador y permanece ahí hasta que el sensor sale de la lámina, todo ese tiempo desatiende otros eventos importantes como recibir llamadas de los pisos, etc., etc.


Aunque sea* óptico* el sensor , se le llama *"fin de carrera*" por la* función* que cumple, no a la *naturaleza* del sensor.
Lo que SI debe incluir el "fin de carrera" es que funcione como* PARADA* en* ausencia* de señal, es decir que, cuando esté* accionado*, sea por FALTA de SEÑAL, ergo, si el sensor deja de funcionar o el haz de luz  se interrumpe, se para todo por seguridad.
Por ejemplo, si el ascensor está en el *piso 4 *y se deteriora el sensor del* piso 2* todo debe detenerse por* incertidumbre del sistema.*
En analogía los senseres mecanicos* Interrumpen la electricidad *cuando estan *accionados* para PARAR la maniobra de* movimiento.*


----------



## oswaldus (Ago 3, 2022)

unmonje dijo:


> Aunque sea* óptico* el sensor , se le llama *"fin de carrera*" por la* función* que cumple, no a la *naturaleza* del sensor.
> Lo que SI debe incluir el "fin de carrera" es que funcione como* PARADA* en* ausencia* de señal, es decir que, cuando esté* accionado*, sea por FALTA de SEÑAL, ergo, si el sensor deja de funcionar o el haz de luz  se interrumpe, se para todo por seguridad.
> Por ejemplo, si el ascensor está en el *piso 4 *y se deteriora el sensor del* piso 2* todo debe detenerse por* incertidumbre del sistema.*
> En analogía los senseres mecanicos* Interrumpen la electricidad *cuando estan *accionados* para PARAR la maniobra de* movimiento.*


Buenos días, gracias por tus comentarios, lo que mencionas lo tengo muy claro.


----------



## torres.electronico (Ago 3, 2022)

Estoy desde el teléfono y no pude ver el archivo


----------



## oswaldus (Ago 3, 2022)

Torres.electrónico, muchas gracias por tu ayuda.
Estuve re-leyendo nuevamente lo que mencionabas y parece que esta vez lo entendí mejor y estoy elaborando un código que podría solucionar mi problema, pero no encuentro la manera de implementar un antirrebotes que no se quede eternamente en un loop, hasta soltar el botón XSR. Intenté con el buscador del foro con las palabras While y antirrebotes en Pic basic pero, pero no me arroja nada sobre esos temas, en su lugar salen otros temas.
Seguiré buscando.
Gracias nuevamente.


----------



## D@rkbytes (Ago 3, 2022)

oswaldus dijo:


> estoy elaborando un código que podría solucionar mi problema, pero no encuentro la manera de implementar un antirrebotes que no se quede eternamente en un loop, hasta soltar el botón XSR.


Usa una interrupción externa, por ejemplo, la de RB0, aunque existen otras disponibles.


----------



## torres.electronico (Ago 3, 2022)

oswaldus dijo:


> Torres.electrónico, muchas gracias por tu ayuda.
> Estuve re-leyendo nuevamente lo que mencionabas y parece que esta vez lo entendí mejor y estoy elaborando un código que podría solucionar mi problema, pero no encuentro la manera de implementar un antirrebotes que no se quede eternamente en un loop, hasta soltar el botón XSR. Intenté con el buscador del foro con las palabras While y antirrebotes en Pic basic pero, pero no me arroja nada sobre esos temas, en su lugar salen otros temas.
> Seguiré buscando.
> Gracias nuevamente.


Podrás copiar y pegar solo el programa?


----------



## oswaldus (Ago 3, 2022)

torres.electronico dijo:


> Podrás copiar y pegar solo el programa?


De acuerdo.
Muchas gracias por tu interés.
Aquí está el código, pero cada que se actúa en el switch XSR se producen rebotes y no cuenta correctamente.
Saludos.
Perdón, dijiste copiar y pegar el programa y yo envié adjunto.
Aquí esta:

```
main:
if XSR = 1 then encendido '(si la entrada 0 es igual a 1, ir al sub programa…)
if XSR = 0 then contar '(si la entrada 0 es igual a 0, ir al sub programa ….)
goto main '(volver a la 1er línea del programa, osea, main)

encendido:
'***************Los bits del SELECTOR, anulan la memorización del piso solicitado********************
IF SELECTOR = 0 THEN
S0=1
ELSE
S0=0
ENDIF

IF SELECTOR = 1 THEN
S1=1         
ELSE
S1=0
ENDIF

IF SELECTOR = 2 THEN
S2=1       
ELSE
S2=0
ENDIF

llamadas:
'*************************LLAMADAS Y MEMORIZACIION DE PISO***********************************
if S0=0 and RP0=1 or XP0=1  then
RP0=1
led0=1
else
RP0=0
led0=0
endif

if S1=0 and RP1=1 or XP1=1  then
RP1=1
led1=1
else
RP1=0
led1=0
endif

if S2=0 and RP2=1 or XP2=1  then
RP2=1
led2=1
else
RP2=0
led2=0
endif

'GOTO INICIO
goto main '(volver a la etiqueta “main”)
'END

'**********************CONTADOR/SELECTOR*************************
'Conforme va subiendo de pisos el selector se va incrementando
contar:
'incrementar:
CONTA=CONTA+1 ; INCREMENTAMOS EL contador

IF CONTA=1 THEN
SELECTOR= SELECTOR+1
CONTA=0
ENDIF

If SELECTOR >= 3 Then SELECTOR = 0
goto llamadas
goto main '(volver a la etiqueta “main”)

END
```


----------



## switchxxi (Ago 3, 2022)

Pues ese no es el programa que has subido anteriormente. A mi me aparece esto: (No subo todo el código).


```
IF XSR = 0  THEN    ; si XSR es accionado entonces
gosub ar            ; ir a antirebote             
gosub contar        ; ir a subrutina contar
endif
```

Que llama a este subrutina para quedarse a vivir en ella:


```
'*****************************ANTIREBOTES*****************************
AR:                     
if XSR =0 then goto ar
return

'***********************************************************************
```


Alguien dijo algo así como que hay tantas formas de programar como programadores existen. Pero te repito, como te han repetido ya varias veces: Aprende a usar interrupciones y usa temporizadores.


Un ejemplo rápido (Que no lo mejor):

*-> Interrupción por fin de carrera (Pulsador)*.
- Chequeo si terminó la temporalización. (Temporización activa).
Si no está activa:
- Activo bandera de que se detecto el fin de carrera.
- Marco para temporizar 1 Segundo (puede ser más, puede ser menos) (Temporizador echo también con interrupciones).
- Salgo de la interrupción.

*Programa:*

-Si la bandera de fin de carrera esta activa -> aumento el contador y borro la bandera.
- Goto programa .


----------



## Dr. Zoidberg (Ago 3, 2022)

Viendo el código que se produce con ese engendro de BASIC...está por darme algo...
Mejor voy a vomitar...

PD: hace mas de 40 años que no uso goto + etiquetas


----------



## oswaldus (Ago 3, 2022)

switchxxi dijo:


> Pues ese no es el programa que has subido anteriormente. A mi me aparece esto: (No subo todo el código).
> 
> 
> ```
> ...


Buenas noches.
Gracias, todas las sugerencias las tomaré en cuenta.
Con respecto al antirebotes, si te fijas en el código actual, no lo estoy utilizando.
Es el mismo programa, pero con las modificaciones realizadas en base a los amables consejos de torres.electrónico.
únicamente no puse la parte superior donde está la declaración de variables, etc. porque creí que no era importante al estar ya en el archivo anterior.

Aquí lo pongo completo:
Saludos.

```
'//directivas

INCLUDE "modedefs.bas"

ADCON1=6                ;Apaga los comparadores de voltaje y digitaliza el puerto A (PIC16F876A)

@ ERRORLEVEL -306       ; anular el mensaje de limite de página rebasado

'@ device XT_osc        ; Utiliza un cristal externo de 4 MHz

'@ device BOD_OFF       ; APAGAMOS EL BODEN DE CONSUMO

'************************************************************

'//dimensionamiento

'VARIABLES     

B5          VAR BYTE    ;SELECTOR PISOS 0~3

C0          VAR BYTE    ;MEMORIA

n1          VAR BYTE    ;variable para intermitnte

n0          VAR byte    ;variable para retardo cerrar puerta

CNT         VAR BYTE    ;variable para conteo interrupción

CONTA       VAR BYTE    ;variable para incrementar o decrementar conteo         

SELECTOR    VAR BYTE    ;variable para almacenar conteo

'************************************************************

'//ALIAS


XP0         VAR  PORTA.0   ;llamada piso 0

XP1         VAR  PORTC.5   ;llamada piso 1

XP2         VAR  PORTA.2   ;llamada piso 2

XSR         VAR  PORTA.1   ;final de carrera selector (contador)         

'***************************SALIDAS************************

led0        VAR PORTB.0    ;Memoria PISO 0

led1        VAR PORTB.1    ;Memoria PISO 1

led2        VAR PORTB.2    ;Memoria PISO 2

    

'*********Variables dependiente del SELECTOR DE PISOS*********

S0          var B5.0       ;borra memoria Piso 0

S1          var B5.1       ;borra memoria Piso 1

S2          var B5.2       ;borra memoria Piso 2

'***********************MEMORIZACION DE PISOS*****************

RP0         VAR  C0.0       ;memoria Piso 0

RP1         VAR  C0.1       ;memoria Piso 1

RP2         VAR  C0.2       ;memoria Piso 2

'*************************************************************

'//configuraciones

TRISA=%11111111          ;Configuara el puerto A como ENTRADAS

TRISB=%10000000          ;Configuara el puerto B.7 como entrada, el resto como salidas

TRISC=%00101000          ;Configuara el puerto _C.3 y C.5 como entrada, el resto como salidas

PORTB=0

'SELECTOR=0


'inicio:



'\\Cuando el final de carrera XSR = 0, es decir, cuando es accionado, esto en la realidad dura

'unos 20 segundos o más, el programa se estanca y no se puede hacer las llamadas

'desde otros pisos y ninguna otra acción.



'IF XSR = 0  THEN    ; si XSR es accionado entonces

'gosub ar            ; ir a antirebote           

'gosub contar        ; ir a subrutina contar

'endif


main:

if XSR = 1 then encendido '(si la entrada 0 es igual a 1, ir al sub programa…)

if XSR = 0 then contar '(si la entrada 0 es igual a 0, ir al sub programa ….)

goto main '(volver a la 1er línea del programa, osea, main)


encendido:

'***************Los bits del SELECTOR, anulan la memorización del piso solicitado********************

IF SELECTOR = 0 THEN

S0=1

ELSE

S0=0

ENDIF


IF SELECTOR = 1 THEN

S1=1         

ELSE

S1=0

ENDIF

 

IF SELECTOR = 2 THEN

S2=1       

ELSE

S2=0

ENDIF


llamadas:

'*************************LLAMADAS Y MEMORIZACIION DE PISO***********************************

if S0=0 and RP0=1 or XP0=1  then

RP0=1

led0=1

else

RP0=0

led0=0

endif


if S1=0 and RP1=1 or XP1=1  then

RP1=1

led1=1

else

RP1=0

led1=0

endif


if S2=0 and RP2=1 or XP2=1  then

RP2=1

led2=1

else

RP2=0

led2=0

endif


'GOTO INICIO

goto main '(volver a la etiqueta “main”)

'END

'**********************CONTADOR/SELECTOR*************************

'Conforme va subiendo de pisos el selector se va incrementando

contar:

'incrementar:

CONTA=CONTA+1 ; INCREMENTAMOS EL contador

IF CONTA=1 THEN

SELECTOR= SELECTOR+1

CONTA=0

ENDIF

If SELECTOR >= 3 Then SELECTOR = 0

goto llamadas


goto main '(volver a la etiqueta “main”)

END

'*****************************ANTIREBOTES*****************************

AR:                   

if XSR =0 then goto ar

return


'***********************************************************************
```



Dr. Zoidberg dijo:


> Viendo el código que se produce con ese engendro de BASIC...está por darme algo...
> Mejor voy a vomitar...
> 
> PD: hace mas de 40 años que no uso goto + etiquetas


No sé por qué lo dices.
Nadie nace sabiendo, y si como novato que soy me sirve el Basic para iniciarme en esto de la programación de los microcontroladores, pues bien venido sea.
A propósito, cuál es el lenguaje que tu utilizas?
Me refiero al de programación.
Saludos!


----------



## Dr. Zoidberg (Ago 3, 2022)

oswaldus dijo:


> Nadie nace sabiendo, y si como novato que soy me sirve el Basic para iniciarme en esto de la programación de los microcontroladores, pues bien venido sea.
> A propósito, cuál es el lenguaje que tu utilizas?
> Me refiero al de programación


La crítica no es hacia vos sino hacia el lenguaje, que es una bestia prehistórica que debió morir en los 80's pero aún sigue viva destrozando la forma de pensar de los programadores...y en especial de los novatos.
Yo uso C y C++ hace muchos años para programar microntroladores, pero también los he programado en PLM y en assembler. También programo en Java y en Python, pero no microcontroladores...y a Python lo odio...


----------



## oswaldus (Ago 3, 2022)

Dr. Zoidberg dijo:


> La crítica no es hacia vos sino hacia el lenguaje, que es una bestia prehistórica que debió morir en los 80's pero aún sigue viva destrozando la forma de pensar de los programadores...y en especial de los novatos.
> Yo uso C y C++ hace muchos años para programar microntroladores, pero también los he programado en PLM y en assembler. También programo en Java y en Python, pero no microcontroladores...y a Python lo odio...


No hay problema!
Tomaré en cuenta tus observaciones.
Saludos!


----------



## unmonje (Ago 3, 2022)

Tranqui Oswald, es como el helado, te gustan unos y otros menos,.
Yo por ejemplo, siempre amé a Basic,(compilable o no) porque me permitía resolver pavadas en 10 minutos, que era mi necesidad inmediata, para resolver asuntos de reparar COSAS.
Al *C* en todas sus versiones, no le tuve paciencia y no me gustaba su sintaxis en general. Tampoco ahora.


----------



## oswaldus (Ago 3, 2022)

unmonje dijo:


> Tranqui Oswald, es como el helado, te gustan unos y otros menos,.
> Yo por ejemplo, siempre amé a Basic,(compilable o no) porque me permitía resolver pavadas en 10 minutos, que era mi necesidad inmediata, para resolver asuntos de reparar COSAS.
> Al *C* en todas sus versiones, no le tuve paciencia y no me gustaba su sintaxis en general. Tampoco ahora.


Estimado unmonje, gracias por tus comentarios.
Algo parecido me pasa, me siento más cómodo con el lenguaje Basic, pero si tengo oportunidad más adelante si me gustaría curiosear el lenguaje C aunque sea para desanimarme.
Cordial saludo!


----------



## Scooter (Ago 4, 2022)

Dr. Zoidberg dijo:


> ...y a Python lo odio...


_"Ya no te ajunto"_* 

Soy Pytoniso total, me encanta de la A a la Z

Yo aprendí a programar en basic de los 80, también ensamblador. Pasar a basic estructurado fue fácil, pasar a objetos no tanto.
C medio me aclaro pero nunca me ha gustado. C++ y C# lo justo tirando a "modificar un poco y ya"
He probado java, javascript, pascal... y por último python y claramente me quedo con la serpiente para todo caso y condición.

El resumen sería que hay que aprender de todo para poder elegir, y que a cada uno le irá una u otra cosa. Si no aprendes el lenguaje X no puedes elegir no usarlo, estás obligado a no usarlo porque lo desconoces.

*Es lo que decíamos en el cole a los 5 años cuando nos enfadábamos con un compañero.


----------



## Dr. Zoidberg (Ago 4, 2022)

Hace muuuuchos me decidí a aprender Cobol por que en esa época era bastante bien pagado en aplicaciones de mainframe. No es que me gustara, solo que parecía que valía la pena y era potencialmente rentable poner algo de tiempo ahí...
Compré un pequeño libro ..tipo "Aprenda Cobol para mermos"...y creo que no llegué a la sexta página, cuando ví que había que tabular y usar espacios para una suerte de identado que definía los alcances de las estructuras de control   
Y en Python es exactamente la misma porquería...
Si...ya sé que los editores se toman el trabajo de hacerlo, pero luego de años de usar delimitadores para las estructuras de control ...sencillamente no soporto su inexistencia


----------



## oswaldus (Ago 4, 2022)

Buenos días compañeros.
Como todos ustedes se habrán dado cuenta, soy nuevo en el foro de Picbasic Pro.
Agradezco el haberme permitido pertenecer a este fabuloso foro.

En este punto me gustaría aclarar un par de cosas.
En ningún momento mi intención ha sido que alguien de ustedes haga el programa por mí.
La ayuda que he solicitado es de orientación para saber cómo debo proceder para solucionar mis inquietudes y poder mejorar mi programa.
Si alguien amablemente me proporciona algún código, será para que yo lo analice  y pueda utilizarlo como una base para lo que deseo desarrollar.

Agradezco a todas las personas que han respondido, en realidad valoro mucho su colaboración porque han invertido tiempo y paciencia para ayudarme.
Estoy buscando la teoría sobre los temas que me sugirieron tales como interrupciones, banderas, contadores, etc. Si alguien tiene ejemplos de código sobre estos temas donde se pueda aprender a utilizarlos les agradeceré muchísimo.

Para finalizar quiero decir que en relación a mi pregunta sobre el momntacargas, que creo que a más de uno ha confundido, lo que quise consultar es que si es posible detectar un pin de entrada solo en el momento que se produce el cambio de “1” a “0” es decir en el flanco de bajada. De lo que he podido leer al parecer es posible usando una interrupción, pero me gustaría saber si alguien conoce otra manera de hacerlo.
Saludos!


----------



## D@rkbytes (Ago 4, 2022)

oswaldus dijo:


> Estoy buscando la teoría sobre los temas que me sugirieron tales como interrupciones, banderas, contadores, etc. Si alguien tiene ejemplos de código sobre estos temas donde se pueda aprender a utilizarlos les agradeceré muchísimo.


Sobre este mismo post hay bastantes ejemplos, y en el Foro también.
No necesitas salir cuando lo tienes todo en casa.


----------



## oswaldus (Ago 4, 2022)

D@rkbytes dijo:


> Sobre este mismo post hay bastantes ejemplos, y en el Foro también.
> No necesitas salir cuando lo tienes todo en casa.


Gracias por tu respuesta amigo.
He buscado valga la redundancia con el Buscador que está en la parte superior derecha de la página donde está una lupa, pero me despliega unos resultados que cuando entro se trata de programación en C u otro diferente de Picbasic Pro. Estaré haciendo algo mal al momento de la búsqueda?


----------



## D@rkbytes (Ago 4, 2022)

oswaldus dijo:


> ¿Estaré haciendo algo mal al momento de la búsqueda?


Busca dentro de este post, o por resultados de búsqueda:
Post #1
Post #2
Post #3

Y existen muchos ejemplos más.


----------



## oswaldus (Ago 4, 2022)

D@rkbytes dijo:


> Busca dentro de este post, o por resultados de búsqueda:
> Post #1
> Post #2
> Post #3
> ...


Muchas gracias, los voy a leer.
Saludos!


----------



## torres.electronico (Ago 4, 2022)

Dr. Zoidberg dijo:


> La crítica no es hacia vos sino hacia el lenguaje, que es una bestia prehistórica que debió morir en los 80's pero aún sigue viva destrozando la forma de pensar de los programadores...y en especial de los novatos.
> Yo uso C y C++ hace muchos años para programar microntroladores, pero también los he programado en PLM y en assembler. También programo en Java y en Python, pero no microcontroladores...y a Python lo odio...



... Este tópico no está referido a nada de lo que usas; Sería bueno Doc que tratemos de no desvirtuar el tema. Yo uso también otros lenguajes y sin embargo, me aferró al pedido concreto y al hilo del tópico "PICBASIC PRO"....

Volviendo al tema original, llegó a casa y te escribo unas líneas de ejemplo, pero con unas modificaciones, ya que el contador en caso de ser electrónico, te conviene hacerlo por una interrupción de hardware y un par de banderas para activar y desactivar la interrupción por puerto y no tener falsos disparos.


----------



## Dr. Zoidberg (Ago 4, 2022)

torres.electronico dijo:


> ... Este tópico no está referido a nada de lo que usas; Sería bueno Doc que tratemos de no desvirtuar el tema.


Yo solo le respondí lo que el me preguntó:


oswaldus dijo:


> A propósito, cuál es el lenguaje que tu utilizas?
> Me refiero al de programación.


y hasta ahí llegó mi explicación . No escribí ningún ejemplo en C ni en ningún otro lenguaje, así que no creo desvirtuar nada...


----------



## oswaldus (Ago 4, 2022)

torres.electronico dijo:


> Volviendo al tema original, llegó a casa y te escribo unas líneas de ejemplo, pero con unas modificaciones, ya que el contador en caso de ser electrónico, te conviene hacerlo por una interrupción de hardware y un par de banderas para activar y desactivar la interrupción por puerto y no tener falsos disparos.


Genial!
Muchas gracias amigo.
Aprecio mucho tu interés en ayudarme.
Perdona el atrevimiento, pero me gustaría pedirte que cuando escribas esas líneas de ejemplo que mencionas, por favor las comentes para de esa manera poder entender mejor y familiarizarme con los términos sobre interrupciones, banderas, etc.
Mientras tanto seguiré leyendo sobre esos temas.
Un Saludo!


----------



## oswaldus (Ago 10, 2022)

Buenas noches amigos del foro, espero que todos se encuentren bien.
Primero que nada quiero agradecer a todos por su ayuda desinteresada y de manera especial a los compañeros torres.electrónico, unmonje y D@rkbytes por su tiempo y paciencia.
He leído lo que me recomendaron, es decir sobre las interrupciones y lo puse en práctica, pero no obtuve los resultados deseados, debe ser por mi falta de experiencia, pero valió la pena porque aprendí algo nuevo en el mundo de la programación de PICs con PBP.
Finalmente resolví mi problema colocando un sensor (fin de carrera, etc.) en cada piso y con eso asunto solucionado en cuanto a la llegada al piso.
El paso siguiente será intentar implementar un programa para manejo de dirección, es decir subir y bajar, luego el control de puerta, etc.
Espero contar con su ayuda si tropiezo con alguna dificultad y tengo alguna inquietud.
Adjunto dejo esquema y programa.
Cordial saludo!


----------



## unmonje (Ago 11, 2022)

oswaldus dijo:


> Buenas noches amigos del foro, espero que todos se encuentren bien.
> Primero que nada quiero agradecer a todos por su ayuda desinteresada y de manera especial a los compañeros torres.electrónico, unmonje y D@rkbytes por su tiempo y paciencia.
> He leído lo que me recomendaron, es decir sobre las interrupciones y lo puse en práctica, pero no obtuve los resultados deseados, debe ser por mi falta de experiencia, pero valió la pena porque aprendí algo nuevo en el mundo de la programación de PICs con PBP.
> Finalmente resolví mi problema colocando un sensor (fin de carrera, etc.) en cada piso y con eso asunto solucionado en cuanto a la llegada al piso.
> ...


¿ Como funciona una interrupción ?
Se debe aclarar que es una tarea relativamente compleja, muy detallada, pero muy eficaz a la vez.
En ella pierde el programador el control lineal del programa, para ganar en eficacia y seguridad.

Los dispositivos que aceptan este tipo de recursos, lo hacen de varias manera pero todos se comporta de manera semejante al ejemplo que describo a continuación  a saber :

1- Se lee toda la *documentación* respecto de las* interrupciones* en la *hoja de datos* del dispositivo elegido.
2- En la hoja de datos se aclaran los diferentes tipos de interrupciones de ese dispositivo (PIC, micro, etc)
3- En la hoja de datos figuran las *dirección de memoria* donde se *atienden* ESAS interrupciones.

4- En muchas *PICs* simples, por ejemplo, esa *dirección de memoria* suele ser *0x0004 hexa *del *banco 0* de memoria. En otros micros, hay varias direcciones de salto, varias interrupciones o todo es mas complejo.
5- La interrupción es *inmediata* y ocurre por *hardware inmediatamente, *ni bien se cumpla la* condición de salto*, por ende cuando se salta a la interrupción, al llegar a ella lo primero que se hace es guardar todos los* registros de memoria,* con los que se estaba trabajando, al momento de la interrupción.
Eso se hace con la instrucción* PUSH X,RX , *que guarda el registro* X *del Pic en el *STACK RX1 *por ejemplo.
6- Terminado los PUSH, se escribe el codigo donde se resuelve la interrupción. Se termina relevando el bit de interrupción y antes de retornar al lugar donde se estaba ejecutando el codigo de programa anterior, se deben recuperar los datos con los que se estaba trabajando mediante las instrucciónes *POP RX1,X *que hubiera, finalmente se ejecuta la instrucción* RETURN INT* para volver al programa principal, como si nada hubiera ocurrido.    Ver abajo

ver esto


----------

