TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: LordLafebre en 29 de Julio de 2005, 15:42:00
-
Hola:
Como estoy de vacaciones y no tengo mucho que hacer y como quien aprendo, voy a ir poniendo aqui algunos pequeños ejemplos en PBP y PROTEUS para aquellos que se animen a aprender...
Un abrazo... <img src="http://pics.miarroba.com/caretos/biggrin.gif" alt="Sonrisa Gigante" title="Sonrisa Gigante" />
-
1) ENCENDER Y APAGAR UN LED
Bueno aqui esta el promer ejemplo y el mas sencillo y por donde aprendi, prender y apagar un led conectado a portb.0:

inicio:
High 0
pause 1000
low 0
pause 1000
goto inicio
end
otra forma de hacer lo mismo:
inicio:
High PORTB.0
pause 1000
low PORTB.0
pause 1000
goto inicio
end
otra mas:
TRISB.0=0
inicio:
PORTB.0 = 1
pause 1000
PORTB.0 = 0
pause 1000
goto inicio
end
y uina mas:
led var PORTB.0
inicio:
high led
pause 1000
low led
pause 1000
goto inicio
end
Los archivos en winrar...
http://miarroba.com/foros/ver.php?foroid=348538&temaid=3607593
-
2) SEMAFORO

El codigo de PBP:
inicio:
High 0:LOW 1:low 2:low 3:low 4: high 5
pause 1000
High 0:high 1:low 2:low 3:low 4: high 5
pause 1000
low 0:LOW 1:high 2:high 3:low 4: low 5
pause 1000
low 0:LOW 1:high 2:high 3:high 4: low 5
pause 1000
goto inicio
end
otra forma:
TRISB=%00000000
inicio:
PORTB = %00100001
pause 1000
PORTB = %00100011
pause 1000
PORTB = %00001100
pause 1000
PORTB = %00011100
pause 1000
goto inicio
end
Los archivos en winrar...
http://rapidshare.de/files/3475254/Semaforo.rar.html
-
3) JUEGO DE LUCES

Juego de luces que cuenta en forma binaria de 0 a 255:
I var byte
TRISB=0
inicio:
for i=0 to 255
PORTB=i
pause 50
next I
goto inicio
end
Juego de luces al estilo AUTO FANTASTICO:
I var byte
cont var word
TRISB=0
inicio:
cont=1
for i=1 to 7
PORTB=cont
pause 100
cont=cont*2
next I
for i=1 to 7
PORTB=cont
pause 100
cont=cont/2
next I
goto inicio
end
Otra manera de hacerlo:
I var byte
leds var PORTB
TRISB=0
Leds=1
inicio:
for i=1 to 7
leds=leds<<1
pause 100
next I
for i=1 to 7
leds=leds>>1
pause 100
next I
goto inicio
end
Otro juego de luces, estas se cierran desde los extremos al centro y luego se abren desde el centro hacia los extremos
I var byte
leds var byte[5]
TRISB=0
leds[1]=%10000001
leds[2]=%01000010
leds[3]=%00100100
leds[4]=%00011000
Leds=1
inicio:
for i=1 to 4
PORTB=leds
pause 100
next I
for i=4 to 1 step-1
PORTB=leds
pause 100
next i
goto inicio
end
Los archivos en winrar...
http://rapidshare.de/files/3475314/Juego_de_luces.rar.html
-
4) BOTON Y LED

En este ejemplo se enciende el led cuando se presiona el boton:
TRISB.0=1
inicio:
if PORTB.0 = 0 then
high 1
else
low 1
endif
goto inicio
end
El mismo ejemplo pero esta ves con una resistencia de pull down:

TRISB.0=1
inicio:
if PORTB.0 = 1 then
high 1
else
low 1
endif
goto inicio
end
Los archivos en winrar...
http://miarroba.com/foros/ver.php?foroid=348538&temaid=3607620
-
5) BOTONES Y LEDS
Este tiene dos botones el uno sirve para subir y el otro para bajar:

i var byte
cont var word
cmcon=7
TRISB=0
TRISA=%00000011
cont=1
PORTB=cont
inicio:
if PORTA.0=0 then
cont=cont*2
PORTB=cont
if cont>=256 then
cont=1
PORTB=cont
endif
pause 200
else
cont=cont
endif
if PORTA.1=0 then
cont=cont/2
PORTB=cont
if cont<=1 then
cont=256
endif
pause 200
else
cont=cont
endif
goto inicio
end
Los archivos en winrar....
http://rapidshare.de/files/3477307/Botones_y_Leds.rar.html
-
¡ Saludos ! LordLafebre
aprovechando que andas dando ejemplos no tendras algun ejemplo de como crear tablas en pbp pro, por aqui vi que hablaban sobre crear tablas pero en la eeprom y yo quiero crearlas en la memoria de programa si puedes ayudarme gracias.
-
Hola:
Tablas como las que estan en el ejemplo 3...?
Un abrazo...
-
Que tal LordLafebre
las tablas a las que te refieres son las que creaste con leds var byte[5]
y luego
leds[1] = un valor
leds[2] = otro valor
.
.
leds[5] = otro valor
pero esto es un array y el array ¿no utiliza la ram? lo que quiero saber es si existe
alguna instruccion en basic parecida a DT en ensamblador o en proton
que es algo como esto:
DATA 5 , 8 , "fred" , 12
y recuperabas el valor de la tabla con:
RESTORE 3
Pointer now placed at location 4 in our data table i.e. "r"
READ VAR1
VAR1 will now contain the value 114 i.e. the "r" character in decimal
espero haberme explicado bien
SALUDOS.
-
hola:
pues non se si haya alguna funcion como la que tu necesitas, no se que es lo que quieras hacer, yo alguna ves las utilice como el ejemplo que mencionaba para sacar mensajes en matrices de leds... si de algo te sirve mira AQUI
Un Abrazo...
-
Al final del ultimo comentario (el de lager)
dice que se puede usar LDATA CON LREAD pero en el pbp pro 2.46 esas instrucciones no existen, creo que las que se usan son READCODE no se, por cierto que compilador usas, en el que uso
pasa algo extraño cuando usas la instruccion PWM en los pines RC2 Y RC1
del micro 16f876a que son las respectivas salidas de los registro CCP1 y CCP2
por ejemplo:
si uso este programa
SYMBOL LED1 = PORTC.2
SYMBOL LED2 = PORTC.1
SYMBOL LED3 = PORTB.7
repite
FOR B0= 0 TO 100 //ciclo 1
PWM LED1,B0,30
HIGH LED1
NEXT
FOR B0= 0 TO 100 //ciclo2
PWM LED2,B0,30
HIGH LED2
NEXT
goto repite
uno esperaria que despues de ejecutarse el ciclo1 el LED1 deberia de estar
encendido pero no es asi y lo mismo pasa al salir de CICLO2, sin embargo
si cambio cualquiera de los dos (LED1 o LED2) POR LED3 (PORTB.7) el prog-
ama funciona bien ¿curioso no? y cuando uso el mismo programa pero con la
instruccion HPWM FUNCIONA BIEN con los pines RC2 Y RC1.
SALUDOS.
-
Cuando se quiera cambiar/conmutar el estado de una linea que esté configurada como salida es más facil usar instrucción TOGGLE.
led intermitente en RB0
inicio
TOGGLE PORTB.0
PAUSE 1000
goto inicio
-
Hola:
Buena acotacion....! Se me escapo...!
-
Hola:
Voy a seguir colgando mas ejemplos, ahora los archivos los voy a poner en el Almacen...
-
6.-) Display
En este ejemplo se va a utilizar un display de 7 segmentos y aremos un contador de 0-9 con la fuincion Look Up

vec var byte
num VAR BYTE
TRISB = 0
prog:
for vec=0 to 9
lookup vec,[191,134,219,207,230,237,253,135,255,239],num
portb=num
pause 500
next vec
goto prog
END
-
Aqui encontraran los archivos en proteus y pbp...!
http://miarroba.com/foros/ver.php?foroid=348538&temaid=3495499
-
7.-) Display
El mismo contador con un display pero ahora con un vector en el cual almacenaremos los valores correspondientes a cada numero (Para los dos ejemplos el Display es de Anodo Comun)

vec var byte [10]
pos var byte
vec[0]=191
vec[1]=134
vec[2]=219
vec[3]=207
vec[4]=230
vec[5]=237
vec[6]=253
vec[7]=135
vec[8]=255
vec[9]=239
TRISB=%00000000
loop:
for pos=0 to 9
PORTB=vec[pos]
pause 500
next
goto loop
end
-
Aqui estan los archivos.... (Display 2)
http://miarroba.com/foros/ver.php?foroid=348538&temaid=3495609
-
8.-) DISPLAY
Un contador ascendente y descendente

vec var byte
num VAR BYTE
TRISB = 0
prog:
for vec=0 to 9
lookup vec,[191,134,219,207,230,237,253,135,255,239],num
portb=num
pause 500
next vec
for vec=9 to 0 step -1
lookup vec,[191,134,219,207,230,237,253,135,255,239],num
portb=num
pause 500
next vec
goto prog
END
-
9.-) Contador con Pulsantes
Este es un contador ascendente y descendente....posee dos pulsantes que sirven para subir y bajar el conteo:

vec var byte
num VAR BYTE
TRISA = %00000011
TRISB = 0
cmcon=7
vec=0
PORTB=64
inicio:
if PORTA.0=0 then
vec=vec+1
lookup vec,[0,191,134,219,207,230,237,253,135,255,239],num
portb=num
if vec>=10 then
vec=0
endif
pause 200
endif
if PORTA.1=0 then
vec=vec-1
lookup vec,[0,191,134,219,207,230,237,253,135,255,239],num
portb=num
if vec<=1 then
vec=11
endif
pause 200
endif
goto inicio
END
-
Aqui los archivos del ejercicio del Display y los pulsantes
http://miarroba.com/foros/ver.php?foroid=348538&temaid=3498682
-
10.-) CONTADOR CON PULSANTES
A diferencia del anterior que el conteo se la hacia cuando se pulsaba aqui es conteo es automatico y los pulsantes sirven para elegir si se quiere que el conteo sea ascendente o descendente...

vec var byte
num VAR BYTE
flag var byte
TRISA = %00000011
TRISB = 0
cmcon=7
vec=0
flag=1
inicio:
if PORTA.0=0 then
flag=1
endif
if PORTA.1=0 then
flag=0
endif
if flag=1 then
gosub subir
endif
if flag=0 then
gosub bajar
endif
goto inicio
Subir:
vec=vec+1
lookup vec,[0,191,134,219,207,230,237,253,135,255,239],num
portb=num
if vec>=10 then
vec=0
endif
pause 200
return
Bajar:
vec=vec-1
lookup vec,[0,191,134,219,207,230,237,253,135,255,239],num
portb=num
if vec<=1 then
vec=11
endif
pause 200
return
end
-
Aqui los archivos del ejepmlo del contador con los pulsantes...
http://miarroba.com/foros/ver.php?foroid=348538&temaid=3498784
-
no tendran por alli ejemplitos manejando el i2c en proteus y eso de serin2, shifting esos tipillos de comandos con el proteus creo se puede simular no, haber si alguien los pudiese colgar
-
Hola a todos,
Pregunta facil:
Para armar el PROTEUS con estos ejemplos necesito el PIc pero al pic tengo que ponerle algo mas, VCC, GND.....
Gracias
-
Hola:
No tiene los pines de VCC y GND, el simulador asume como si el pic ya estubiera "alimentado"...
-
Hola a todos,
No puedo bajarme el primer ejerccio que hay, como lo puedo hacer para bajarlo.
Y perdon por preguntar siempre.
Gracias
-
Hola:
Rapid share lo ha borrado.... voy a subir el ejemplo al almacen del foro y luego te paso el link...
-
Hola:
Ya esta, ya colgue el ejemplo en el almacen del foro, revisa nuevamente el link para que lo descargues...
En estos dias voy a subir los otros ejemplos que tengo...
-
Hola:
Para los que les interese aqui seguimos con mas ejemplos en compiladores Basic y simulacion en Proteus... 
http://miarroba.com/foros/ver.php?foroid=382961&temaid=4270632&ultimomsg=si#ultimomsg
-
hola amigos:
soy nuevo aca y llevo algun tiempo buscando el programa q por lo visto casi todos uds. tienen ya.
se trata del famoso PicBasic. Por lo q he visto en la pagina www.picbasic.com no hay ningun download de demos ni de versiones temporales.
Si alguien me puede ayudar con esto se los voy a agradecer, desde ya un saludo desde buenos aires
-
Hola:
Aqui hay un demo que te lo puedes descargar:
http://www.mecanique.co.uk/products/compiler/pbp.html
Suerte...!!! 
-
Hola, muy buenos tus ejemplos, yo recien estoy empezando con basic,, tendras algun ejemplo basico para un LCD 16x2?? saludos y gracias
-
Hola:
Los ejemplos siguen en este hilo, aqui hay un ejemplo para LCD:
http://miarroba.com/foros/ver.php?foroid=382961&temaid=4270632&pag=6
luego ire poniendo mas, cualquier cosa puedes comentarla alla...
-
bueno por aqui
resucito de las Cenisas como el ave fenis para ayudar y colaborar en lo que pueda
att:
batman123
-
Hola:
Bienvenido nuevamente Batman :mrgreen: y ya conoces nuestra nueva casa... 8)
-
Hola Lordlafebre: estoy siquendo tus ejemplos en pbp, sobre diplay de 7 segmentos, ¿no podras postear alguno donde
tenga mas de un dígito para ver como se hace multiplexado?.
Gracias.
Saludos desde Rocha (Uruguay)
-
Hola:
hsen, Claro que si hoy en la noche te lo subo... solo dame un tiempito que ando algo liado :mrgreen:
-
Hola:
hsen, aqui te dejo el ejempo que te decia, en proteus no se aprecia bien la simulación, aqui te dejo una foto de mi circuito funcionando:
(http://img478.imageshack.us/img478/3525/contador5rw.th.jpg) (http://img478.imageshack.us/my.php?image=contador5rw.jpg)
i var byte
j var byte
unidad var byte
decena var byte
TRISB=0
main:
for i=0 to 99
for j=0 to 99
unidad = i dig 0
portb = unidad + 16
pause 5
decena = i dig 1
portb= decena + 32
pause 5
next j
next i
goto main
end
(http://img307.imageshack.us/img307/1173/cont0ml.th.png) (http://img307.imageshack.us/my.php?image=cont0ml.png)
El codigo es sencillo, esta formado por dos bucles, el primero que es de donde a donde va el contador (0-99) y el segundo bucle es el tiempo que quieres que permanesca visualizado el valor en el display, utilizo la funcion DIG para cojer el digito correspondiente, y le sumo 16 ó 32 para activar el display correspondiente para formar el número.
Cuelaquier cosa me comentas, si no esta claro te lo explico mejor.
Suerte...!!! :mrgreen:
-
Ok, Lorlafebre: Creo que entendi, voy a intentar agregarle más dígitos, pero, en "var i " no me va a dar con byte, tendre
que usar word, no?
Gracias.
Un abrazo
-
Hola otra vez:Me pregunto yo mismo, ¿pero que pasa si uso 5 dígitos, teoricamente contaria hasta 99999, pero word
solo alcanza hasta sesenta y cinco mil quiñientos y....?
-
Que tal compadre Hsen..
Para solucionar tu problema tienes 2 salidas... o usar una variable long word.... o lo que yo haria manejar una variable para unidades, decenas, centen, miles, etc... asi estas variables solo llegarian a un maximo valor de 9.... lo que si te tocaria modificar el codigo que posteo mi compadre Giovanni, para ya no usar la sentencia DIG, sino tocar los valores de unit para el display 1, decenas para el 2 y asi sucesivamente...
bueno compadre, espero que te haya quedado claro la idea...sino pues aca estamos para ayudarte.. y pues cuenten con mis poca ayudad que les puedo brindar....
un abrazo y suerte
-
Hasta 65535 hsen((2 a la potencia 16) - 1).
Compadres, me parece que me voy a unir a ustedes con BASIC...si sigo programando 5 años mas en ASM, me quedo calvo.
Saludotes!
-
Hola:
Fabian, PBP no tiene opcion para declarar Long Word, solo tiene tres tipos:
-bit
-byte
-word. :lol:
Hsen, la otra opcion es hacer como dice el amigo olotill.
Bruno, que bien que te nos unas :mrgreen:
un fuerte abrazo panas 8)
-
Gracias amigos, entendí la idea, espero tener éxito al llevarla a la práctica; de todas maneras
tendre que hacer un stand by por un par de dias, por que se me está amontonando trabajo debido a que esto de los pic y pbp me apasiona, pero me roba tiempo.
Por otro lado, me siento muy bien en este foro, ya que ustedes son muy cordiales.
Gracias por su valioso tiempo.
Un abrazo desde Rocha (Uruguay
-
Hola:
Hsen, de eso se trata este foro, de solucionar problemas y sentirse bien, aqui todos somos amigos :mrgreen:
-
Hola a todos,
Ya consegui conectar el display LCD. El problema que no convertia el puerto en digital antes de conectarlo, por lo menos eso creo.
Me podria explicar alguien la linea de comando "ADCON1 = 7 ' PORTA y E digital" Como se hace esto y que significa, por las vueltas que le doy no entiendo. Si lo que quiero es convertir el Puerto B en digital que tengo que cambiar?
Saludos
-
Hola:
Veamos, me imagino que utilizaras un pic 16F877 o similar de 40 pins, los puertos B, C, D son digitales, no necesitas hacer nada para utilizarlos, solo configurar como entrada o salida con TRISX donde X es el puerto, encambio, los puertos A y E son analógicos, por eso se utiliza ADCON1= 7 esto lo que hace es "digitalizar" los puertos, siempre y cuando los quiereas utilizar como digitales, en el datasheet del micro esta la tabla de balores que hara digital o analógico a un pin especifico de dichos puertos.
-
Hola:
Bueno, especificamente me referia a esta tabla:
(http://img95.imageshack.us/img95/9886/adcon3jf.jpg)
alli puedes ver con que valores haces digital o analogico algunos pines.
-
Gracias Lordlafebre
Saludos desde Sevilla
-
Hola,
Tengo otra consulta que haceros. La linea
OPTION_REG = $55 ' Set TMR0 configuration and enable PORTB pullups
INTCON = $a0 ' Enable TMR0 interrupts
En vez de usar el puerto B, tengo que usar el puerto D.
Que numero en vez de $55 tengo que utilizar?. He buscado en los datasheed del pic, en concreto el 16f877, y no encuentro relacion.
Te pongo la pagina del datasheed que creo hace referencia
TABLE 4-4: SUMMARY OF REGISTERS ASSOCIATED WITH PORTB
Value on Value on: Address Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 all other POR, BOR
Resets
06h, 106h PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxxuuuu uuuu 86h, 186h TRISB PORTB Data Direction Register 1111 11111111 1111 81h, 181h OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 11111111 1111 Legend: x = unknown, u = unchanged. Shaded cells are not used by PORTB.
-
Hola:
enricar883, en el mismo datasheet, mira el pinout, alli podras ver la descripcion de cada pin y que funcion tiene, las resistencias de pull up las tiene solo el Port B, la caracteristica del Port D es que puede funcionar como paralel slave port.
Mira aqui te describe el registro OPTION_REG:
(http://img420.imageshack.us/img420/9143/dibujo8fa.jpg)
y aqui la edscripcion de cada uno de los bits:
(http://img420.imageshack.us/img420/7859/dibujo16lt.jpg)
-
Hola
Una vez a punto determinar el programa y gracias a Lordlafebre os hago otra pregunta, una vez que tenga el programa depurado lo expondre en el foro.
El programa es que tenga un temporizador que cuenta de forma reversible por segundos. Para el mismo hay cuatro entradas desde RD 4 a RD 7, en este caso 0,50 €, 1,00 €, 2,00 € y ficha, que normalmente corresponde al euro.
Una vez comenzado el tiempo a descontar, que es el tiempo que dispone el operario para funcionar, va descontando, de forma que si se vuelve a echar otra moneda, el tiempo que esta contando de forma reversible se suma a la moneda que se acabe de echar.
La ultima pregunta es la siguiente:
En esta parte del programa hay una variable llamada moneda, pero el valor que le ha dado a esta variable es el valor de la moneda en concreto, para que aparezca en la pantalla LCD
MONEDA = " 0,50 €"
pero asi no se lo traga, aunque parezca un problema muy trivial, a ver como se pone esto.
If update = 1 Then '*********************************
if tiempo > 0 then
ASPIRA = 1
LCDOUT $FE,1
LCDOUT "MONEDA: ", #MONEDA
LCDOUT $FE,$C0
Lcdout "TIEMPO: ", #TIEMPO," SEG"
else
ASPIRA = 0
LCDOUT $FE,1
Lcdout " BIENVENIDOS"
LCDOUT $FE,$C0
LCDOUT " INTRODUZCA MONEDAS"
endif
saludos
-
Hola:
Perdon, pero me perdi un poco y no me quedo claro lo que quieres hacer :(, puedes explicarlo de otra forma? :P
-
Hola,
Ya lo he programado de otra forma y lo he solucionado, gracias de todas formas.
Ahora tengo otra consulta para el foro.
Si tengo una variable que por cada paso de moneda me va sumando de 1 en 1 llegará un momento que tendré en esa variable 350, por ejemplo, ahora necesito que ese valor aun cuando se vaya la luz o arranque de nuevo el pic no se pierda.
He leido que con DATA o Write se puede escribir el valor en la eeprom, pero solo al principio de la carga de la programacion, ¿Como podría hacer esto?
El problema consiste en que esos marcadores de pasos de monedas deben de quedar grabados hasta cuando se vaya la luz.
Gracias
-
Hola:
Puedes escribir con EEPROM o WRITE en la eeprom del micro, pero recuerda cada posición de la EEPROM del micro solo es de 8 bits.
-
HOLA EL ULTIMO PROGRAMA DE JUEGO DE LUCES NO SALE
LAS LUCES SOLO SE QUEDAN PRENDIDAS
QUISIERAS HACER ALGO PARECIDO PARA UN TRABAJO
TE ROGARIA QUE LO CORRIGAS
I var byte
leds var byte[5]
TRISB=0
leds[1]=%10000001
leds[2]=%01000010
leds[3]=%00100100
leds[4]=%00011000
Leds=1
inicio:
for i=1 to 4
PORTB=leds
pause 100
next I
for i=4 to 1 step-1
PORTB=leds
pause 100
next i
goto inicio
end
-
No soy un especialista en PBP pero ... :) :lol: :P ... ¿No sería algo asi?
I var byte
leds var byte[4]
TRISB=0
leds[0]=%10000001
leds[1]=%01000010
leds[2]=%00100100
leds[3]=%00011000
inicio:
for i=0 to 3
PORTB=leds[ i ]
pause 100
next I
for i=3 to 0 step-1
PORTB=leds[ i ]
pause 100
next i
goto inicio
end
Edito: Como dice LordLafebre, los paréntesis son corchetes.
-
Hola:
Efectivamente como dice Redpic, falta el subindice, pero no es con parentesis ( i ) sino es entre corchetes [ i ]
Suerte...!!! :mrgreen:
-
una consulta doctor LORD LAFEBRE los "leds" en el codigo anterior es a lo que se le llama una tabla y mediante los [] se les llama?
-
Hola:
pues me a dado un poquito de risa :D, nada de doctor amigo KALLITOS Giovanni para todos los amigos del foro :mrgreen:
Con respecto a "leds" esa es una vector, i los corchetes en el programa son para trabajar con los subindices, en ese caso, previamente asigne valores a los subindices, luego con el bucle accedo a cada uno de ellos y le asigno al puerto ese valor para hacer el juego de luces... :mrgreen:
-
creo que con estos comandos se pueden hacer lo que son las pantallas de leds que desplazan mensajes no
-
Hola:
Claro que se podria urilizar eso, de hecho hace algun tiempo hice un mensage asi mismo con vectores.
-
A pedido de un forista cuelgo aqui una rutina que habia publicado alguna vez en el otro foro.
Lo que hace la rutina y su simulacion en Proteus es aprovechar las dos lineas de un display LCD de 2 x 16 y dibujar numeros tipo display de 7 segmentos de la altura de las lineas juntas, dandole a la lectura del display una distancia mayor de visivilidad.
Espero les aproveche a muchos, ante consultas hacerlo en el hilo por favor, no entro mucho ultimamente pero si tienen paciencia voy a contestarles... :mrgreen: :mrgreen: :mrgreen:
-
A pedido de un forista cuelgo aqui una rutina que habia publicado alguna vez en el otro foro.
Lo que hace la rutina y su simulacion en Proteus es aprovechar las dos lineas de un display LCD de 2 x 16 y dibujar numeros tipo display de 7 segmentos de la altura de las lineas juntas, dandole a la lectura del display una distancia mayor de visivilidad.
Espero les aproveche a muchos, ante consultas hacerlo en el hilo por favor, no entro mucho ultimamente pero si tienen paciencia voy a contestarles... :mrgreen: :mrgreen: :mrgreen:
Ahora va en winrar, no me dejo subir ambos en un mensaje.
La informacion es la misma, solo para los que no tengan zip... :mrgreen: :mrgreen:
-
Muy bueno el foro felicidades por esta comunidad.
En que casos especificos se usuan variables con formato byte y con formato word
Desde ya muchas gracias
:)
-
Hola:
El uso de BYTE y WORD depende del "largo" de tu variable, Byte para variables de hasta 255 y word de hasta 65535.
-
Eres un verdadero Lord, estoy (re)recien llegado a este nuevo foro, me ha costado (re)registrarme;
si puedes ponerme un(os) ejemplo(s) multiplexaje y demultiplexaje con display de 7 segmentos, luego con display matriz o matriz de diodos leds, estuve viendo esta pag: http://www4.tpg.com.au/users/talking/5x7%20Display%20Index.html
pero resulta que los ejercicios estan en ensamblador.
Saludos Ecuador desde Vzla.
-
Hola:
La idea de los ejemplos sigue amigo, pero ahora por el corto tiempo del que dispongo se me hace dificil, pero en unos dos semandas o tres pondre muchos mas ejemplos.
hasta entonces... :mrgreen:
-
Hola:
Bueno, por el pedido de algunos usuarios, aqui les dejo un ejemplo para un contador en 4 displays multiplezados, este incrementa la cuenta cada ves que se precione el pulsante.
cont var word
unid var byte
dece var byte
cent var byte
mile var byte
TRISB = 0
TRISA.0 = 1
cont=0
inicio:
if PORTA.0 = 0 then
cont = cont+1
PAUSE 200
ENDIF
unid = cont dig 0
PORTB = unid + 16
PAUSE 5
dece = cont dig 1
PORTB = dece + 32
PAUSE 5
cent = cont dig 2
PORTB = cent + 64
PAUSE 5
mile = cont dig 3
PORTB = mile + 128
PAUSE 5
GOTO INICIO
-
Hola:
Este es un ejemplo parecido al anterior pero el conteo lo hace solo, aproximadamente cada segundo incrementa su cuenta en uno, es el mismo circuito que el anterior.
cont var word
i var byte
unid var byte
dece var byte
cent var byte
mile var byte
TRISB = 0
TRISA.0 = 1
cont=0
inicio:
for i=0 to 49 'bucle para esperar un tiempo y luego incrementar
unid = cont dig 0 'el conteo
PORTB = unid + 16
PAUSE 5
dece = cont dig 1
PORTB = dece + 32
PAUSE 5
cent = cont dig 2
PORTB = cent + 64
PAUSE 5
mile = cont dig 3
PORTB = mile + 128
PAUSE 5
next i
cont = cont + 1
if cont > 9999 then cont=0
GOTO INICIO
-
Hola Lord,
Excelente aporte para el foro.
Gracias
morfeus :-/
-
Hola señor Lord,
Excelente su codigo de ejemplo muchas gracias por su ayuda, tengo unas dudas... me puede explicar como funciona el comando dig porque no lo tengo muy claro...y cual es el sentido de los numeros 16, 32 64 y 128?.
Sin embargo seguire mirando bien el codigo para entenderlo mejor.
Un gran saludo
Alejandra :g)
-
Hola:
el comando DIG es para coger uno a uno los digitos que forman el numero que quiero ver en el display, en caso de que cont que es la variable que contiene el valor a ser visualizado es 3456 y hago esto:
unid = cont dig 0
entonces en la variable unidad almaceno el primer digito que corresponderia al 6, asi mismo para las decenas, centeas y miles.
y lo de los datos 16, 32, 64 y 128 es para activar cada uno de los displays, por ejemplo, si miras el circuito notaras que el portb esta dividido logicamente en dos partes, en donde los 4 bits menos significativos son para el envio del dato, y los cuatro ultimos bits mas significativos son para activar el display en el que quiero ver ese dato. Ejemplo
cont=0
PORTB = cont +16
eso me visualizara el 0 en el primer display, ya que el valor en binario que voy a tener en el port b seria 00010000 en donde los menos significativos corresponden al valor que quiero ver y solo activo uno de los displays para poder ver el dato.
Espero que este claro, sino me avisas para aclararte mas las cosas.
Suerte... :mrgreen:
-
Hola señor Lord,
Me ha quedado muy claro su explicacion muchas gracias, amo este foro porque he recibido mucha ayuda y quiero ir aprendiendo de maestros como usted. Espero poder colaborar mas adelante con uno que otro aporte.
Un gran saludo
Alejandra :g) :mrgreen:
-
Me parece bien bueno este soft, PBP, pero consegui una version demo y ni idea de como se usa, sabes de donde puedo bajarlo, pero una version que ande fino, y de paso, (abusador yo jejeje) me explicas un poco coo funciona. Yo uso el PIC C compiler. Gracias
-
Hola:
pues algo que te puedo decir es que no acostumbramos en este foro a compartir soft pirata, el como conseguirlo depende de ti, busca por el Emule o algun parecido, con respecto a la ayuda a darte sobre PBP con gusto, habemos muchos aqui :mrgreen:
-
hola amigos, tengo una consulta:
es proteus 100% confiable, o sea, lo que me arroja la simulacion es lo que pasa en un circuito en la practica??
pregunto porque he logrado simular un tacometro ademas del manejo de servos, osea, me realiza las 2 tareas, pero al llevarlo a la practica tengo problema con los servos, no tienen el mismo comportamiento que en la simulacion, es por eso mi duda, o puede ser que mis servos esten fallando, no lo se.-
bueno agradeceria una pronta respuesta, ya que estoy contra el tiempo para entregar mi tarea, adios.-
-
Hola:
como todo simulador no es 100% confiable, y con lo que te paso ya sabes que no se puede confiar al 100%, en la realidad hay algunas cosas que influyen, como ruidos y otras cosas, asi que no te sorprendas que tu programa luego de que lo hayas simulado no te funcione igual en la realidad.
-
Que tal Amigos.!!! soy nuevo en el foro y nuevo con el PBP, he echo algunos programas en assembler, pero me falta aprender bastante todavia, así que por el momento lamento no poder aportar mucho, estoy leyendo todo lo que encuentro sobre PBP y agradezco mucho todos los ejemplos de lordlafebre, los cuales espero realizar pronto, cuando comience con las practicas los molestaré con alguna pregunta, Gracias.!!! y Saludos desde Necochea (Bs.As)
-
Hola:
Bien venido al foro, y cualquier cosa, aqui estamos todos para ayudar en lo que se pueda. :mrgreen:
-
AQUI LES DEJO ALGUNOS EJEMPLOS SENCILLOS DE PWM
Device 16F84A
XTAL 4
TRISB=%00000000
PortB=0
Dim cont as word
X1: for cont=1 to 255
PWM PortB.0,cont,1 'la salida de pwm esta en el port.0,el ancho de pulso sera de cont
,el cual r3epresentar
Next
goto X1
OTRO EJEMPLO
dim a as word
trisa = %00000000 ;salidas
trisb = %11111111 ;entradas
x1: for a = 1 to 2500
pwm porta.0,a,1 ;la salida de pwm esta en el port.0,el ancho de pulso sera de dato a, el cual r3epresentar
delayms 5
next
;un ancho de pulso en un porcentaje incremental.
for a = 2500 to 1 step-1
pwm porta.1,a,1
delayms 5
next
goto x1
-
Saludos amigos,
He estado trabajando un poco con el proteus me ha ahorrado mucho tiempo al poder probar los programas antes de quemar el pic.
Tengo un programita con LCD con 3 pulsadores con 1 aparecen las letras del abc con 2 avanzamos para seguir escribiendo y con 3 nos devolvemos para corregir. Esto me funciona bien :lol: pero le intente agregar otro pulsador para grabar en la Eepron del pic lo que se escribió en pantalla y luego lo desplaza de derecha a izq pero no me funciona :x, no se si pueda poner aquí el programa para que lo revisen… y compañeros que pena pero como le hago para poner la imagen del circuito aquí en otra ocasión estuve intentado poner un circuito del proteus y no pude.
Gracias a todos.
-
Hola:
Pon el codigo por aqui para mirarlo, aunque recuerda que el pic proteus no retiene los datos una ves que terminas la simulacion.
-
Bueno compadre Lafebre te comento que lla mefunciono el programa :lol:, era solo un error de escritura en la instruccion lcdin... pero bueno como no todo es perfecto solo me funciono bien en la simulacion :x, en el circuito solo puedo escribir los mensajes, pero cuando undo el boton para que lo grabe en la EEPROM y lo despliege de derecha a izq so lo se desplazan las casillas en negro, no se que pueda ser pues en proteus funciona bien, de todos modos aqui pongo el codigo a ver si encuentran algo.
'device = 16f84 ' declaramos pic a usar
Define osc 4
DAT VAR BYTE
DATO VAR BYTE
MEMO VAR BYTE
Y VAR BIT
X VAR BYTE
Z VAR BYTE
NUM VAR WORD
JHON con $fe
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 2
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
LED VAR PORTB.0
BUTON1 VAR PORTA.1
BUTON2 VAR PORTA.2
BUTON3 VAR PORTA.3
BUTON4 VAR PORTA.0
INI:
LCDOUT JHON,1
PAUSE 700
LCDOUT JHON,$0F
PAUSE 2000
LCDOUT JHON,$0E
PAUSE 1000
PULSAR:
HIGH LED
PAUSE 200
LOW LED
IF BUTON1=0 THEN ALFA
IF BUTON2=0 THEN DERE
IF BUTON3=0 THEN IZQU
IF BUTON4=0 THEN GRABA
GOTO pulsar
ALFA: NUM=0
HIGH LED
PAUSE 400
IF X=28 THEN X=0
LCDOUT $FE,$10
LOOKUP X,[" ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"],NUM
LCDOUT,NUM
X=X+1
GOTO PULSAR
DERE:
HIGH LED
PAUSE 400
X=0
LCDOUT $FE,$14
GOTO PULSAR
IZQU:
HIGH LED
PAUSE 400
X=0
LCDOUT $FE,$10
GOTO PULSAR
GRABA:
MEMO=$7F
DAT=0
EEPR: MEMO=MEMO+$01
DAT=DAT+1
IF MEMO=$90 THEN DEZPLA
LCDIN MEMO,[DATO]
WRITE DAT,DATO
GOTO EEPR
DEZPLA:
PAUSE 100
LCDOUT $FE,$0C
PAUSE 50
LCDOUT $FE,$7
LCDOUT $FE,1
MOVI: MEMO=0
DAT=$00
LCDOUT $FE,$90
FOR Z=0 TO 15
DAT=DAT+$01
READ DAT,MEMO
LCDOUT,MEMO
PAUSE 400
NEXT
GOTO MOVI
END
-
Bueno toco responderme yo mismo jeje.
Les comento que al programa anterior le quite la parte de los pulsadores y le agregue una rutina para teclado hex, utilize el 16f877 y la simulacion en proteus funciono bien, y cuando lo monte tabien :lol: :lol: :lol: LO que no se es porque con el f84 no funciono, si alguno tiene alguna idea le agradeceria la info.
-
Que tal amigos del foro basic por los ejemplos mostrados yo le spongo uno donde de utiliza el ADC del PIC es un 16f877A el cual es un control de temperatura para poder controlar un ventilador deacuerdo a un valor fijado (referente_ejm. 40°C )y comparando con un sensor LM35 el que muestra el valor en una pantalla LCD el valor de temperatura medido en el ambiente y me realiza la compracion y activa o desactiva mi sistema de calefaccion.
Pues lo malo q tiene moi programa es que no poses decimales y varia en el LCD de 2 en 2 grados °C :( :shock: aunqeu he leido varios temas referentes a estos no logre naa no se tak vez me falte mas programacion pero lo logrado x mi persona ahi le spongo y habe ris podias mejorarlo pa los decimales y el error de los valores cuento con su gran experiencia.. para lo novatos este program si sirve para muchas cosas, q no necesiten precision...
'****************************************************************
'* Name : control de temperatura.BAS *
'* Author : [Jimmy Jefferson] *
'* Notice : Copyright (c) 2006 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 01/08/2006 *
'* Version : 1.0 *
'* Notes : este es un control de temperatura encendiendo o *
'* : apagando un ventilador conectado en D.7 del 16f887A *
'* : el cual hace una comparacion con un valor fijo (52 ºC)*
'* : y el otro es el del sensor lm35 el cual dara la *
'* :orden del aperacion a ejecutar... pero tienes un % de error de 2 ºC*
'****************************************************************
VENTILADOR VAR PORTD.7
DEFINE OSC 20
' Definir los registros y bits del LCD
DEFINE LCD_DREG PORTB 'D0,D1,D2,D3-4,5,6,7
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTE 'E0-RS
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTE 'E1-E
DEFINE LCD_EBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
' Definir los parametros del ADCIN
DEFINE ADC_BITS 8 ' Setear el numero de bits del resultado
' Defenir variables de los resultados de la conversion
ADC1 VAR BYTE
TRISA = %11111111 ' Setear el puerto A como entrada
ADCON1 = %00000100 ' Setear el puerto A como analogico
Pause 500 ' Espera de .5 segundos
LCDOut $fe,1, " LM 35 "
LCDOut $fe,$c0,"PIC 16f877"
Pause 1500
LCDOut $fe,1, " CONTROL DE"
LCDOut $fe,$c0,"TEMPERATURA"
Pause 1500
INICIO:
LCD:
IF adc1>=52 Then ' activa nu ventilador si el valor del ADC1 es mayor o igual a 52 ªc
High VENTILADOR
Else
Low VENTILADOR ' apaga si es menor al valor determinado
EndIF
LCDOut $fe, 1 ' Limpiar el LCD
ADCIN 0, adc1 ' Leer el primer canal del ADC
adc1=adc1*2
LCDOut $fe,1, " sensor "
LCDOut $fe,$c0, "TEMPERATURA=",#adc1 ' muestra la lectura de la temeperatura en ªc
PAUSE 150
GOTO INICIO
el sensor estan el el portA.0 del pic y va directo ... tengo la simulacion en proteus pero no se como colgar en los mensajes ... y unas imagenes...
pues me despido saludos...
Jimmy J.J.
-
Que tal compadre Hsen..
Para solucionar tu problema tienes 2 salidas... o usar una variable long word.... o lo que yo haria manejar una variable para unidades, decenas, centen, miles, etc... asi estas variables solo llegarian a un maximo valor de 9.... lo que si te tocaria modificar el codigo que posteo mi compadre Giovanni, para ya no usar la sentencia DIG, sino tocar los valores de unit para el display 1, decenas para el 2 y asi sucesivamente...
bueno compadre, espero que te haya quedado claro la idea...sino pues aca estamos para ayudarte.. y pues cuenten con mis poca ayudad que les puedo brindar....
un abrazo y suerte
-
Muchachos:pido disculpas puesto que no domino bien esto de los chats.Los PCs,me vuelven loco .
Estoy preguntando sobre un post viejo sobre como hacer un contador con 5 display de 7 seg.y como no me da la variable
word.
Me indican usar una variable para unidades,decenas.centenas etc.
Agradeceria poteen un ejemplo aunque sea de dos o tres display para entender bien la idea y llegar a hacer uno de
5 display que necesito
Muchas gracias
-
Muchachos:pido disculpas puesto que no domino bien esto de los chats.Los PCs,me vuelven loco .
Estoy preguntando sobre un post viejo sobre como hacer un contador con 5 display de 7 seg.y como no me da la variable
word.
Me indican usar una variable para unidades,decenas.centenas etc.
Agradeceria poteen un ejemplo aunque sea de dos o tres display para entender bien la idea y llegar a hacer uno de
5 display que necesito
Muchas gracias
Hola:
Hombre... tomate la molestia de por lo menos leer este mismo tema, retrocede una página y encontraras un ejemplo como el que necesitas.
-
Hola, e buscado en el foro y no encuentro una tabla de caracteres de letras, numeros, y especiales para una matriz, si alguien tiene algo por ahi, me avisa?
bueno de antemano gracias
-
Hola:
Aque te refieres? si es a una matriz de leds, eso lo puedes hacer tu mismo.
-
pero debe haber alguna tabla ya creada con caracteres especiales, a lo que me refiero es a "?","¿","/",",",".", sonrisas y ese tipo de cosas, o algun efecto como alguna bola rebotando o cosas varias.
saludos y gracias
-
Hola:
Eso depende de cada uno, en este caso te puedes basar el los caracteres de los LCD para que a partir de alli lo hagas. Tu podras crear las letras a tu gusto.
-
Hola:
Mira esta tabla, es la que mencioné aqui te puedes basar para hacer tus caracteres:
(http://proton.ucting.udg.mx/expodec/oct2003/ice13/image008.jpg)
-
Me parece Lord que lo que el quiere son las tablas ya hechas en PBP para enviarlas a la matriz de LEDs.
Pero no creo que consigas mucho de eso.Eso dependera del alto de la matriz y otros fatores.
Saludos.
-
Bruno tiene razon,
A lo que me refiero es a esto
en una matriz 7x5
01110
10001
00001
00010
00010
00000
00010
q seria ?
Lo que e hecho hasta el momento es asociar los caracteres con el comando LOOKUP para generar la tabla, ya que otro colega me oriento.
De todos modos gracias por responder
y haber si alguien tiene algo por ahi.
-
Hola:
Claro que se que se refería a eso, por eso pongo esa tabla, puedes de alli sacar como guia las letras y caracteres, eso sería para una matriz de 7x5. Es lo mismo que tienes con 0 y 1, y luego utiliza lookup como lo estas haciendo.
-
Muchachos:pido disculpas puesto que no domino bien esto de los chats.Los PCs,me vuelven loco .
Estoy preguntando sobre un post viejo sobre como hacer un contador con 5 display de 7 seg.y como no me da la variable
word.
Me indican usar una variable para unidades,decenas.centenas etc.
Agradeceria poteen un ejemplo aunque sea de dos o tres display para entender bien la idea y llegar a hacer uno de
5 display que necesito
Muchas gracias
Hola:
Hombre... tomate la molestia de por lo menos leer este mismo tema, retrocede una página y encontraras un ejemplo como el que necesitas.
Hola Lordlafebre:
Disculpa, pero el ejemplo que tiene la página anterior no creo que me sirva, puesto que usa la variable word, y tú mismo
explicaste que pbp no tiene variable long word, y necesito contar hasta 99999, por lo tanto creo que Olotill me sugirió usar una variable para: unidad,decenas, centenas etc.. pero no se como plantear el programa
-
Hola:
Para ese caso puedes utilizar variables independientes, y cuando se complete el ciclo correspondiuente a 10 incrementar en uno la variable siguiente, y asi sucesivamente, de esa manera tendrias por separado el valor total, ejemplo
unidad var byte
decena var byte
centena var byte
vas incrementando uno a una a las unidades, cuando unidades>9 entonces incrementas en uno las decenas, y cuando decenas>9 incrementas en uno a las centenas, y asi sucesivamente para los numeros que quieras, luego mandas a visualizar los valores de unidades, decenas, centenas, etc.
-
Hola:
Para ese caso puedes utilizar variables independientes, y cuando se complete el ciclo correspondiuente a 10 incrementar en uno la variable siguiente, y asi sucesivamente, de esa manera tendrias por separado el valor total, ejemplo
unidad var byte
decena var byte
centena var byte
vas incrementando uno a una a las unidades, cuando unidades>9 entonces incrementas en uno las decenas, y cuando decenas>9 incrementas en uno a las centenas, y asi sucesivamente para los numeros que quieras, luego mandas a visualizar los valores de unidades, decenas, centenas, etc.
Hola:Si, hasta ahí entiendo, pero en edalante no se que hacer ¿Seria mucha molestia si les pido un ejemplo aunque sea cortito de 2 o 3 dígitos?
-
Vamos intentalo se que puedes y si te trabas pones aqui el codigo y te ayudamos, te doy una idea, alguna vez hiciste un reloj de 24 horas con flip-flops, bueno si no pues te digo rapidito como podrias implementar el codigo.
Tienes tus variables unidades, decenas centenas....etc cada una ira de 0-9 puedes implementar un control por ejemplo: prendes el pic y todas valen cero empiezas a contar cada X tiempo y logico inicias con la de unidades, del 1 al 9 cuando esta llegue a 0 incrementas a uno la variable de decenas. y asi para todos. se me ocurre algo asi rapido sin probarlo ni nada:
..........
..........
initzero:
U=0
D=0
C=0
M=0
.......
........
goto inc
inc:
for i=0 to 9
pause X
u=i
............
.........
next i
D=D+1
............
............
if D>9 then
D=0
C=C+1
endif
........
......
goto inc
Los puntitos seria como lo sacarias multiplexado el ejemplo de Gio esta mas que practico para eso, si no te sirve lo lamento se me ocurrio y te lo quise pasar.
saludos
-
Bueno, bueno, me empezó a gustar, voy a ir por partes, dijo Jack el destripador.
Voy a empezar el programa y cuando tega problemas los molestare de nuevo.
Gracias por ahora, Navaismo.
-
'****************************************************************
Bueno ahí va mi programa,es para un odómetro de un vehículo,cada 10500 púlsos de un sensor de la caja de cambios
marca 1 kilómetro.
No lo he probado, debo mencionar que casi todo me ayudó un amigo.
Por favor echenle una ojeada para ver si está bien
cont var word
mul var byte
i var byte
u var byte
d var byte
c var byte
um var byte
dm var byte
TRISB = 0
TRISA.0 = 0
TRISA.1 = 0
TRISA.2 = 0
TRISA.3 = 1
inizero:
cont=0
mul=0
u=1
d=2
c=3
um=4
dm=5
goto inc
inc:
if PORTA.3 = 0 then
cont = cont+1
ENDIF
if cont>10500 then 'aqui empieza a contar pulsos
cont=0 'despues de 10500 pulsos incrementa cont.en 1
u=u+1
endif
if u>9 then
u=0
d=d+1
endif
if d>9 then
d=0
c=c+1
endif
if c>9 then
c=0
um=um+1
endif
if um>9 then
um=0
dm=dm+1
endif
if dm>9 then
dm=0
endif
porta = 0
PORTB = u
PAUSE 5
porta = 1
PORTB = d
PAUSE 5
porta = 2
PORTB = c
PAUSE 5
porta = 3
PORTB = um
PAUSE 5
porta = 4
PORTB = dm
PAUSE 5
goto inc
-
Antes que nada muchas felicidades por sus aportes men, me impresiona las ganas que tienen d ayudar y siempre lo he dicho admiro a este tipo de gente, mis respetos y sigan ayudando a novatos como yo xD,despues d esto tengo una pregunta:
Estoy empezando con el PBP ya lo tengo y todo, quise empezar con el assembler pero la verdad no pude asi que empezare con algo easy como esto, bueno mi duda es como puedo configurar el PBP con el proteus para simular los pics' con el mplab si lo puede hacer y desde alli le doy buil all y me dice que n hay errores, pero con el PBP no se como hacerlo que poner en la configuracion del menu code generation tool. Le agradeceria a quien me explicara o m diero un tuto para hacerlo gracias y salu2.
-
Hola Spurs21, jeje Yo tambien quise empezar con assembler y hasta la fecha no termino, osea no me gusto me quede con PBP. Haces de todo lo que quieras hacer, si de TODO, asi que aun no tengo la necesidad de sufrir con el ASM.
Bueno a tu pregunta, yo lo que hago para simular en proteus es solamente compilar el archivo en PBP y este genera un archivo con extension .HEX y lo cargo en el pic de proteus dandole con el icono de propiedades(una flecha negra como un cursor en la barra de herramientas) y click sobre el pick cargas el archivo hex y listo.
Mas informacion AQUI (http://www.todopic.com.ar/foros/index.php?topic=11275.0) o AQUI (http://www.todopic.com.ar/foros/index.php?topic=2810.0)
-
jejej si man anoche lo hice, gracias por responder, yo pense que se configuraba como el mplab pero no es necesario solo ccargandole el HEX ejjej weno ahora si puedo empezar con los ejemplos, cualquier cosa aqui les pido ayuda :) salu2
-
Hola.
Apenas voy a iniciar con esto del Proteus (ya bajé los tutoriales de la página de YOEL).
Estoy haciendo un control P y quiero saber si Proteus tiene motores para simular.
Revisé todo el tema y no encontré algo.
Gracias.
-
Si, si tiene, tiene de DC de PASOS y SERVOS incluso creo que en la ayuda trae ejemplos de cada uno.
-
Perfecto.
Si no puedo hacer que se acolplen ópticamente en Proteus, trataré de medir la FCM del motor para regular su velocidad.
Apenas bajé lo de proteus, estoy revisándolo.
El fin de semana informo.
Gracias.
-
:-/ Ya pude simular :-/
Tomé el curso 11 de Proteus de la página que sugiere YOEL, sobre cómo cargar información al µicro.
No supe dónde o cómo sacar un LCD asi que me fui a la ayuda y saqué un circuito que se llama LCD4bit o algo así y lo modifiqué para hacer esto.
Le quise poner un potenciómetro (y lo hice) pero no sé cómo incrementarlo por pasos; me meto a sus características y dice algo como:
{MODFILE=POT_LIN}
{STATE=5}
No entiendo eso.
Apenas le estoy agarrando la onda a esto........ que bien, que bien.... muchas posibilidades con esto + el ICD del MicroCode Studio (aunque con la simulada sería mas que suficiente).
Navaismo, ese es el código que dijiste que no funcionaba (el de tu sensor de temperatura); te pone 2.4936 Volts supongo por esto: {STATE=5}, ha de estar a la mitad el potenciómetro.
Anexados van el esquemático y otro archivo que se generó que no se para qué sea (supongo datos de simulación) y el .hex
Como le digo a Navaismo, son 409 líneas de programa para un 16F877, sin suavizar la señal (así como viene la despliega), con 4 decimales, LCD y todo. La rutina sola de conversión del AD de cuatro decimales consume 132 líneas de código, todo lo demás se lo lleva el LCD.
Como cuando me enseñaron compuertas, quería conquistar al mundo con compuertas :lol:; después lógica secuencial, quería conquistar al mundo con flip-flops :lol:; después PLDs (aquí no quise nada porque no les entendí :D); después µicros y quería conquistar al mundo con PICs :lol:; después se compró PBP y Microcode Studio Plus y quería conquistar al mundo con eso :lol:; ahora que tengo proteus............... si lo podré hacer :twisted:
-
Que bueno que puedas simular, desafortunadamente uso una version (la lite) no compatible con tu el DSN que pones.
Lo del lcd hay una opcion que es buscar y puedes poner lcd o mejor busca el componente LM016L para un lcd de 16x2 el icono es una lupa con una not dentro de la lupa.
Lo del potenciometro pues si se simula (aunque no por pasos definidos - o almenos yo no he podido-) normalmente antes de pasarlo a fisico lo hago en proteus para darme una idea y si si jala bien el pot ese que hace las veces del lm35, aunque ya lo voy a dejar para pasar al TC74 o TC77 del que me ayudaste.
Saludos Konqueror
-
Para aquellos que estén interesados en ir viendo paso a paso lo de la simulación, hice una búsqueda rápida en el foro y encontré esto:
Archivos .cod para simulación
http://www.todopic.com.ar/foros/index.php?topic=11202.0
Código fuente paso a paso con proteus
http://www.todopic.com.ar/foros/index.php?topic=11015.0
Simulación paso a paso en proteus
http://www.todopic.com.ar/foros/index.php?topic=4450.0
Navaismo, revisa tus mensajes.
Estos temas los leeré otro día, hoy debo dormir porque tendré una semana agitada.
-
hola tengo una duda acerca del ejemplo del contador
for I=0 to255
portb=i
pause 200
next i
este cuenta solo
pero si quisiera hacer uno que me cuente igual pero con un pulsadoren el puerto a
-
hola:
amigo para esos existen los IF--ENDIF, por ejemplo tu ej que daria de esta manera usando un IF
trisa.0=1 ' el primer pin del puerto a es entrada y a este va el pulsador (RA0)
if porta=0 then
for I=0 to255
portb=i
pause 200
next i
endif
tambien si tienes
trisa.0=1 ' el primer pin del puerto a es entrada y a este va el pulsador (RA0)
if porta=0 then 'con este veras como prende RB3
high 3
pause 200
low 3
pause 200
endif
espero haverte ayudado
-
HOLA A TODOS despuesde un largo semestre en la universidad he vuelto de nuevo a darle duro a los pics estas vacaciones, y ya dandoles el saludo , le posteo una duda, simulo en proteus, y a la hora de cargar el hex, me simula perfectamente pero cuando quiero ver en el modo debug linea por linea el codigo y la emulacion cargo el bas me causa el siguiente error, cabe destacar que algunos de mis codigos si funcionan con el *.bas y puedo ver que hace linea por linea de mi codigo el pic pero en otros casos NO :( alguien sabe a que se debe este error.
Instantiating SPICE models...
[U1] PIC16 model release 6.7 SP0 simulating PIC1684 device.
[U1] Loaded 64 bytes of persistent EEPROM data.
[U1] Loading HEX file 'bOTONES.HEX'.
[U1] Read total of 192 bytes from file 'bOTONES.HEX'.
PROSPICE - Internal Exception: access violation in module 'LOADERS.DLL'.
Real Time Simulation failed to start
Real Time Simulation FAILED.
-
Hola:
Mira aqui:
http://www.todopic.com.ar/foros/index.php?topic=11015.0
Alli Lager indica como hacerlo.
-
Como un pequeño aporte para poder ver bien los ejemplos de mulptiplexacion hechos por LordLafebre por lo menos en mi computador fue necesario modificar en el proteus (en mi caso la version 6.2) el parametro Processor clock Frecuency del pic en este caso el 16F84A a por lo menos 20 MHz, si bien todos sabemos que en la practica que corra a esa frecuencia este pic es una tonteria a modo de simulacion por lo menos a mi me funciono bien :-).
-
Despues de estar un par de dias trabajando con el programa picbasic pro he logrado algunas cosas que me parecieron utilces para alguien que lo necesite, aqui dejo un tipico termometro digital basado en el lm35, para probarlo utilice una fuente de CC en este caso en la foto se muestra un voltaje de 160mV y como todos sabemos el lm35 cada 1grado produce un cambio de 10 mV lo cual deberia entregar una temperatua de 16grados en el lcd :-).
Este ejemplo lo hice basandome en dos fuente (espero no se enojen) que son basicamente la pagina del señor nocturno y un ejemplo del seño lordlafebre. Bueno sin mas preambulo añado los archivos correspondientes. :-)
-
Hola:
Gracias por seguir colaborando con mas ejemplos :-/
-
:D No es nada, bueno dentro de un rato mas voy a subir otros ejemplos que pueden ser utiles...saludos!!! :P
-
Aqui dejo otro ejemplo basado en el reloj parlante del señor LordLafebre, Se basa en el CI de tiepo real DS1307, adjunto los archivos correspondientes al pequeño ejemplo :P. Como dato la hora ingresada corresponde a la hora ed chile :D.
-
Aqui dejo una foto del ejemplo anterior :-/
-
Y el ultimo es una mescla de los dos ejemplos anteriores lo que hace es modificar los datos en la pantalla lcd dependiendo de la pulsacion del boton, por ejemplo si en la pantalla se esta visualizando la temeratura una ves que se pulsa el boton es posible ver la hora, si se presiona de nuevo el boton se accede a la temperatura :D , bueno eso seria mi aporte del dia de hoy :lol:
-
Al igual que en el caso anterior dejo una fotografia del ejemplo, espero les sea util a las personas que lo descargen...saludos :-/
-
Gracias POR EL link LORDFAEBRE :) ,, ya quedo solucionado, el error de loaders .dl, Pasando a otras COsas he buscado y buscado, pero nadie ha puesto ningun ejemplo sobre el uso de matricez de leds pero con PICBASIC, seria mucha molestia si alguien cuelga uno, auqnue sea el uso minimo porque no tengo ni idea de comose conecta, ya intente y no me da nada.
Gracias
-
AQUI les dejo, un ejemplo de un Puente H, con motor de DC, y Tres botones Paro, GiroA,Giro Inverso, conectado a un 16F877, claro con un 84A es igual y menos desperdicio de pines. :mrgreen:
les adjunto EL BAS. Y EL ARCHIVO DE PROTEUS V 6.7 sp3
-
Gracias POR EL link LORDFAEBRE :) ,, ya quedo solucionado, el error de loaders .dl, Pasando a otras COsas he buscado y buscado, pero nadie ha puesto ningun ejemplo sobre el uso de matricez de leds pero con PICBASIC, seria mucha molestia si alguien cuelga uno, auqnue sea el uso minimo porque no tengo ni idea de comose conecta, ya intente y no me da nada.
Gracias
Hola:
Pues te falto buscar un poco mas :D, aqui hay mas ejemplos en basic y tambien hay de matrices:
http://www.todopic.com.ar/foros/index.php?topic=2810.0
-
beatAurex1 podrias subir el codigo de tu ejemplo :mrgreen:
-
Siguiendo el hilo de los ejemplos :-/, aqui dejo un pequeño ejemplo de la lectura del codigo de un dispositivo ibutton.
INCLUDE "modedefs.bas"
DEFINE OSC 20
'@ device pic16f628, hs_osc, wdt_off, pwrt_on, bod_on, protect_off
cmcon = 7 ' to disable portA comparators
intcon.7 = 0 ' to disable interrupts
vrcon = 0 ' to disable reference voltage output at porta.2
ib VAR BYTE[8]
i VAR BYTE
TRISA = %00000000'RA output
TRISB = %00000010'RB output, RB1 input
OPTION_REG=$2F '00101111 Enable Timer0, rising edge, pre->WDT
GoTo start
start:
'While PORTB.1=3D1
'Wend
Pause 50
IF PORTB.1=0 Then
SerOut 3,T9600,["Button Detected",13,10]'output serial, on RB3
GoTo start
EndIF
OWOut PORTB.1,1,[$33]'output command to iButton
OWIn PORTB.1,0,[STR ib\8]'read 64 bit string
IF ib[1]=255 Then start'if error reading do it again
SerOut 3,T9600,["Button Detected",13,10]'output serial, on RB3
SerOut 3,T9600,["FAMILIA",13,10]'output serial, on RB3
SerOut2 3,84,[hex ib[0]]'display the code
SerOut 3,T9600,[13,10]
SerOut 3,T9600,["CODIGO",13,10]'output serial, on RB3
For i=7 TO 1 step -1
SerOut2 3,84,[hex ib]'display the code
next i
SerOut 3,T9600,[13,10]
SerOut 3,T9600,[13,10]
GoTo start
End
-
Y estos dipositivos iButton donde se usan??? :shock:
-
En muchas cosas para control de accesos, Sensores de temperaturas, Dataloggers etc.
Puedes mirar aqui para mas informacion sobre iButton's (http://www.maxim-ic.com/products/ibutton/)
-
Pues muy interesante he visitado la pagina y tienen bastantes aplicaciones, no conocia estos dispoitivos, AsCii seria mucha molestia si comentas tu programa porfavor.
Y otra cosa, segun vi, se nececita el iButton y el receptor Blue dot para leer este dispositivo , o ahi alguna otra manera de leerlos? Disculpen tanta pregunta. :-/ :-/ :-/ :-/
-
Comentado esta, solo que en ingles y que seria de este foro si no fuesemos preguntones :D asi que nada de disculpen eh!!!
Saludos
-
Para el ejemplo que subi 1ero voy detallar algunas caracteristicas del ibutton ocupado. En este caso es el DS1990 que se encuentra en el proteus 6.9 sp4 o superior, este tiene 64 bits en su ROM, del mapa de memoria se tiene que dentro de los 64 bits, los primero 8bits corresponden a el codigo de la familia (01h),luego desde el 2do al 7mo byte se encuentran los 48 bits seriales de identificacion los cuales son unicos e irrepetibles y al final se encuentra el 8vo byte llamado CRC.
El protocolo que ocupa este dispositivo es el 1-wire o un cable, el que corresponde a una linea de datos, lo cual lo hace asincrono, y es necesario por esto lograr la sincronizacion mediante un dispositivo maestro que es en este caso el PIC16F628 siendo el esclavo el ibutton DS1990. Para lograr esta sincronizacion es necesario 1ero que el maestro envie un pulso de reset,despues de esto el ibutton entrega un pulso de presencia (para esto es necesario tener algun interfaz que sea capas de descargar el condensador interno del ibutton en el ejemplo es una resistencia de pullup de 10K, tambien existen otro tipo de interfaz con transistores mosfet), Posteriormente es necesario que el PIC envie el comando correspondiente de lectura de la ROM 33h o 0FH, en el ejemplo se envio 33h, RECIEN HAY EL IBUTTON ENVIA SU INFORMACION desde los bits LSB hacia MSB.
-
Voy a detallar algunas cosas del programa, lo primero como se sabe este pic viene por default en modo comparador por eso es necesario desactivar este modo mediante el registro cmcon (cmcon=7), se declara una variable BYTE [8] la cual es la encargada de recoger la informacion correspondiente a la ROM del ibutton, con la instruccion OWOut PORTB.1,1,[$33] se envia el comando correspondiente a la lectura del ibutton, luego mediante OWIn PORTB.1,0,[STR ib\8] se leen los 64 bits correspondientes a la ROM antes nombrada. cuando existe error en la lectura del ibutton actua la linea IF ib[1]=255 Then start, hasta ahi estaria lista la lectura solo falta la parte de visualizacion en el virtual terminal, como se vio anteriormente la informacion se leia desde LSB hacia MSB por lo tanto en ib[0] esta el byte correspondiente a la familia, en ib[1] esta el 1er byte correspondiente al ID y asi sucesivamente, es por esto que al enviarlos al virtual terminal los bytes deben ser enviados desde el MSB hasta el LSB mediante la instruccion For i=7 to 1 step-1 de otra forma en el terminal los bytes se veran alrevez :D
-
El simbolo que se ve en el proteus mas que el ibutton corresponde al conector (lector) con el cual hace contacto la ibutton, entre los lectores esta el ds9092+ que esta como sample en maxim :mrgreen: este lector corresponde a los F5, tambien ahi lectores para los F3, F5 o F3 tiene que ver con el tamaño del ibutton. Asi que si piden como sample el DS1990A F5 deben pedir el lector ds9092+, dentro de los samples tambien ahi llaveros en los cuales se puede poner el ibutton los ahi azules, rojos , verdes. etc. :-)
DS9093AB+ ---> llaveros azules
DS9093AG+ ---> llaveros verdes
Para mas informacion pueden ver los siguientes links.
Ibutton ( Samples de todos no envian menos de los de humedad, temperatura, etc)
http://www.maxim-ic.com/products/ibutton/products/ibuttons.cfm
Lectores (ojo con lo de F5 o F3, F3 no encontre como lectores si encuentran me dicen)
http://www.maxim-ic.com/products/ibutton/products/readers_probes_ports.cfm. Yo pedi el primero que hay
llaveros:
http://www.maxim-ic.com/products/ibutton/products/mounts.cfm
-
Por ultimo una cosa que no nombre, pero que alomejor es obvia, el ejemplo que plantie es solo lectura del codigo del ibutton, si se deseara hacer un control de acceso por ej. con una chapa electrica o un sistema de identificacion, se debe comparar byte por byte el codigo del ibutton que desiemos ocupar para nuestro sistema y los bytes obtenidos en nuestra vaiable ib :D.
Hace poco hice un sistema de identificacion por RFID que si en parte tiene sus ventajas con respecto al ibutton como son que no necesita contacto fisico con el lector, tampoco necesita linea vista, no asi como son con los lectores de codigo de barra, RFID tiene la gran desventaja con respecto a ibutton que es el costo :?.
-
Ola Lordlafebre,
Meu nome é Marcos de São Paulo,Brasil
Estou tentando baixar alguns exemplos seus em Basic mas não consigo.
È possivel posta-los novamente
Obrigado
Marcos
-
Hola:
Aqui pongo todos los ejemplos que he colgado, asi les sirve a mas personas que los quieran:
http://www.4shared.com/file/9109297/44061c5f/Ejemplos_PBP.html
-
:mrgreen: Que bien maestro estaremos en contacto :P
-
hola
gracias maestro por brindarnos estos archivos si qe estan buenos
-
Hola soy nuevo en este foro y en el tema de los pics. Recientemente termine de hacer proyectos con pbp como parpadeeo de leds con pulsador, encender y apagar un led , secuencia con leds. Pero me gustaria aprender mucho mas. :o En este foro se habla de terminos como bit y byte o word de los cuales todavia no vi y no entiendo para que sirven :? Si alguien me podria guiar un poco o agregarme a su msn se lo agradeceri demasiado.
MUCHAS GRACIAS y ESTA MUY BUENO EL FORO!!!!!!
-
Hola facundo mira puedes ver la ayuda del PBP para guiarte mas pero con lo que comentas:
puedes checar este tema (http://miarroba.com/foros/ver.php?foroid=1149902&temaid=6040164), o bien
Bit solo puede tomar 2 valores 1 o 0
byte puede tomar valores de 0 a 255
Word puede tomar valores de 0 a 65535
-
Hola:
Pues en este caso, bit, byte y word, son el "tamaño" que puede llegar a tener una variable, en el caso de BTI solo dos valores, 0 y 1, en el caso de Byte 256 valores desde 0 a 255, y en el caso de Word 65536 valores desde 0 a 65535.
Estas tamaños dependen de para que se utilice una variable, ya que contendran valores que cambiaran, eso ya depende de tu aplicacion y para que quieras emplear cada variable.
-
oooops, veo que posteamos al mismo tiempo :mrgreen:
-
ME ayudaria mucho si me pudieran agregar al SU MSN colo_kpo_87_dvp@hotmail.com es mi mail.- Tengo solo 15 años y quiero aprender sobre este maravilloso mundo!
-
Hola facundo bien por tu edad y las ganas, con lo del msn si podemos pero precisamente para eso son estos foros para poner todas tus dudas y ayudarnos. Empieza con el link que te di y abre temas nuevos sobre tus dudas. Antes de abrirlos busca si no existen ya y si existen ahi comentanos tus dudas.
Saludos y que ande pues tu velerito en este mundo de los PICS
-
YA ENTENDI EL TEMA DE BIT BYTE Y WORD MASO MENOS , PERO LO QUE NO ENTIENDO ES PARA QUE SE REEMPLAZAN ?
PARA QUE SE UTILIZA CADA UNO DE ESTOS?
POR EJEMPLO ENTIENDO QUE SI UNO PONE PORTB = 255 LOS DEJA A TODOS EN ENTRADA !! ESO PROVOCA QUE SE PRENDA UN LED O QUE SE APAGUE?
SE QUE BIT ES 0 Y 1
BYTE 0 A 255
WORD 0 A 65535
Loque no entiendo es para que se usan como remplazo en algun programa
TRISB = 0 'Puerto B de Salida
TRISA = 0 'Puerto A de Salida
i VAR BYTE ' AQUI PARA QUE SE REEMPLAZA ??
barre: ' etiqueta principal
PORTA = 31 ' encendemos el PORTA
For i=0 to 7 ' empezamos el barrido de 0 a 7 ¿QUE SIGNIFICA FOR i?
High i ' prendemos el PIN del puerto B correspondiente a i ¿¿ QUE PIN DEL PUERTO B corresponde a I?
Pause 500 ' esperamos medio segundo
Low i ' Apagamos el pin de i
Pause 500 ' esperamos medio segundo
Next i ' vamos con el siguiente pin
PORTA = 0 ' apagamos el todo el PORTA
Pause 1500 ' esperamos segundo y medio y repetimos
GoTo barre
End
DEMAS ESTA DECIRLE QUE EL FORO ES GENIAL Y LA GENTE QUE PARTICIPA TMB MUCHAS GRACIAS POR SU AYUDA !!!! :) :D
I COMO DIJE ANTES SI ALGUIEN ME PUDIERA AGREGAR A MI MSN ME SERIA DE MUCHA AYUDA YA QUE HAY VECES QUE ANDO ARMANDO PROGRAMITAS Y ME FALTAN UN PAR DE TERmINOS Y SE LO PREGUNTO RAPIDO A ALGUNO POR MSN YA ME QUEDA. colo_kpo_87_dvp@hotmail.com
MUCHAS GRACIAS
-
Hola
bueno en la parte donde ponen puerto B = 255 es para mandar unos a todo el puerto la asignación de entrada o salida se hace con el tris don 0 es salida y 1 entrada.
Lo que se quiere hacer en este programa es un corrimiento de un alto empezando por B0 para esto se usa i, el porque byte y no otro bueno esto es ya que estara variando de 0 a 7 para cada bit del puerto que no nos serviria configurarlo como bit ya que este dejaria solo dos asi que se usa una mayor escala.
El for lo que hace es un ciclo en el cual incrementa en 1 a i hasta que este alxcance el valor limite en este caso es 7 y dentro realiza la rutina de prender y apagar el bit del puerto que correspoda al valor que tenga i durante el ciclo
espero me hallas entendido.
-
Hola mira esos son tipos de variables que podemos usar los valores son el rango es decir:
si vas a utilizar una variable que solo tome 2 valores puedes usar BIT eso depende de ti.
Si vas a usar un variable que almacene diferentes valores que no pasen de 100 puedes usar una variable BYTE
Si vas a usar una variable que almacena valores mayores a 1000 tendras que usar variable tipo WORD.
En el ejemplo i no se reemplaza se declara Byte porque la usaremos en un FOR que va de 0 a 7 y en tipo byte cabe perfectamente.
Un for es un bucle una instruccion que se repite de m hasta n veces donde m en este caso es 0 y n es 7 es decir esta instruccion se repetira 8 veces contando el cero.
Cuando ponemos HIGH i esto quiere decir que corresponde al indice de i, es decir, empezara en 0 por lo tanto prendera el PORTB.0 espera medio segundo y apaga el PORTB.0 espera medio segundo e incrementa el indice, osea en la siguiente cuenta i tiene un valor de 1 por ende prende el PORTB.1 y asi hasta el 7.
Parte de la sintaxis del HIGH y LOW es que si ponemos un valor de 0 a 7 correponden al PORTB, porque? porque asi lo dispusieron quienes hicierion el programa. para prender cualquier otro puerto es necesario poner PORTX.X donde las x corresponden al puerto y al pin.
-
si ESO YA LO ENTENDI PERO NO SE CUAL ES BIEN EL FIN , NO TENDRIAS ALGUN EJEMPLO ASI YA CEIRRO ESTE TEMA.! MUCHAS GRACIAS!
-
Como cual es el fin??? es un ejemplo de como activar los puertos de un PIC es el clasico ejemplo con el que se empieza, es decir no hay n fin en especial.
Saludos
-
ahora entiendo pero WORD cuando se utiliza?
-
Hola:
Veamos, un ejemplo sencillo seria el de una variable que necesites que cuente hasta 40
for i = 0 to 40
-
-
-
-
next i
En ese caso i debe ser de tipo byte, porque tomara como un valor maximo 40, pero si por ejemplo vas a hacer el mismo contador que cuente hasta 1000
for i = 0 to 1000
-
-
-
-
next i
la variable i debera ser MAS GRANDE, para eso tienes que declararla de tipo WORD, ya que esta puede hacer que tu variable tome mas valores.
La diferencia entre uno y otro tipo de variable esta dada practicamente por el tamaño que quieres que tenga tu variable, pero tampoco o mas bien no es recomendable que todas tus variables declares de tipo WORD (ya que son las de mayor tamaño en pbp) porque dependiendo del TAMAÑO ocupan espacio en la memoria del microcontrolador.
Espero que te haya quedado claro Facundo :mrgreen:
-
Hola a todos, una felicitacion por su gran capacidad y paciencia para transmitir sus conocimientos a los que menos entendemos de este tema, yo quiero colaborar con este programa, que lo que hace es simular pwm para 3 led (rgb) y generar diferentes colores de acuerdo al valor de las variables, hay que ajustar los tiempos de las pausas para lograr una frecuencia de 50hz por ejemplo para que no se noten parpadeo en los leds pero es minima la modificacion que hay que hacer, en cuanto lo tenga al cien subire las correcciones, por otro lado quisiera preguntar si alguien me puede ayudar a corregirlo ya que quiero cambiar los valores de tiempo de cada color a travez de la interrupcion (serin)y no logro hacerlo , de momento solo tengo el serin para modificar el color azul pero no logro cambiar el valor de este. lo de la interrupcion lo copie de algun post que encontre por aqui :mrgreen:, por cierto agrtadesco a todos en este foro ya que he aprendido gracias a ustedes.
include "modedefs.bas"
'***********configuracion del pic******************************************
@ device pic12f629, INTRC_OSC, wdt_off, pwrt_on, mclr_off, bod_off, protect_off
'dispositivo 12f629, ocilador interno,wath dog off, master clear off,
OPTION_REG=%00000000 ' RESISTENCIAS PULL UP ABILITADAS
WPU.2=1 'RESISTENCIA PARA GPIO2 ACTIVA
INTCON.4=1 'INTE - INTERRUPCION POR EL PIN GPIO2 ENABLE
INTCON.7=1 'GIE - interrupciones generales ABILITADAS
CMCON = 7 ' Set GP<2:0> to Digital, Disable comparator
TRISIO = %00001100 ' ENTRADAS GPIO3 Y GPIO2
Define INTHAND _Interrupcion
wsave var byte bank0 system ' estos registros en banco 0 obligatorio
ssave var byte bank0 system
psave var byte bank0 system
azul var byte bank0 system
verde var byte bank0 system
rojo var byte bank0 system
ac var byte [3]
sumat var byte
j var byte
i var byte
menor var byte
indice var byte
gpio=0
azul =200
verde=100
rojo=100
goto inicio '***********saltamos el handler de interrupciones******
Interrupcion: '********* Asegurate que este en pagina 0 *************
intcon.7=0 'desabilita interrupciones generales
serin gpio.2,t2400,["A"],azul
toggle gpio.5 'solo utilizo este pin para detectar si esta entrando
'a la interrupcion
asm
BTFSS intcon,INTF ; Salta si la interrupción es GPIO2
RETFIE ; Interrupción desconocida, regresar
; (es un mecanismo de seguridad).
bcf INTCON , INTF ; Resetea bandera de interrupcion por gpio2
bsf INTCON , GIE ; Activa interrupciones generales
movf psave,w ; restaura
movwf PCLATH
swapf ssave,w
movwf STATUS
swapf wsave,f
swapf wsave,w
retfie
EndAsm
'**************empieza el programa principal*****************
inicio:
gpio.0=1 'ACTIVA LAS SALIDAS 0,1,Y 4 DEL PIC QUE CORRESPONDEN
gpio.1=1 ' A LOS LEDS AZUL,VERDE, ROJO
gpio.4=1
ac[0]=azul 'asigna el valor de las variables de color al arreglo.
ac[1]=verde 'da lo mismo asignar directamente los valores al arreglo
ac[2]=rojo
sumat=0 ' esta variable guarda el valor de el tiempo de la pausa anterior
for j =0 to 2 'en esta parte del programa busca el valor del color
menor=201 'que debe estar menor tiempo encendido, manda la pausa
for i=0 to 2 'correspòndiente, guarda el valor como tiempo
if ac< menor then 'transcurrido cambia el valor de la variable que
menor=ac 'fue apagada para que en el siguiente ciclo
indice=i 'sea ignorada y tomada la siguiente menor y asi
endif 'sucesivamente hasta que simula pwm diferente
'para cada led. en el ciclo for interior se compara
next i 'el valor menor y el indice en el que se encuentra
'para saber cual sera la pausa y el puert0 a apagar.
ac[indice]=201
pause (menor-sumat)
sumat=menor
select case indice
case 0
gpio.0 =0
case 1
gpio.1 =0
case 2
gpio.4 =0
end select
next j
pause 100
goto inicio
-
Hola:
Gracias por el aporte Jorge :-/
-
Es lo menos que puedo hacer Lord ya que como mencione lo poco que se, lo debo a ustedes, y como lo prometido es deuda ya corregi el programa anterior. con las pausas que tengo el pwm para los leds es de 50 hz aprox, tambien agregue un efecto aleatorio para que cambie automaticamente, ahora solo falta agregar mas efectos, pero entendiendo el primero no sera dificil crear otros, tambien tengo pensado hacer algo de soft en basic.net para enviar los datos desde la pc en cuanto lo tenga lo pondre a sus manos.
ah se me olvidaba, los valores asignados a las variables de color deben de estar entre 0 y 254 el 255 lo uso para verificar queel flanco de ese color ya fue apagado por lo que no debe de utilizarse.
saludos desde Mexico
include "modedefs.bas"
'***********configuracion del pic******************************************
@ device pic12f629, INTRC_OSC, wdt_off, pwrt_on, mclr_off, bod_off, protect_off
'dispositivo 12f629, ocilador interno,wath dog off, master clear off,
OPTION_REG=%10000000 ' RESISTENCIAS PULL UP DESABILITADAS
INTCON.4=1 'INTE - INTERRUPCION POR EL PIN GPIO2 ENABLE
INTCON.7=1 'GIE - interrupciones generales ABILITADAS
CMCON = 7 ' Set GP<2:0> to Digital, Disable comparator
TRISIO = %00001100 ' ENTRADAS GPIO3 Y GPIO2
Define INTHAND _Interrupcion
'*********declaracion de variables******************************************
wsave var byte bank0 system ' estos registros en banco 0 obligatorio
ssave var byte bank0 system
psave var byte bank0 system
azul var byte bank0 system
verde var byte bank0 system
rojo var byte bank0 system
ac var byte [3]
arreglo2 var byte [3]
sumat var byte
j var byte
i var byte
menor var byte
indice var byte
tlow var byte
fx var byte
n var byte
m var byte
l var byte
rnd var word
fx=0
gpio=0
azul =200
verde=20
rojo=100
arreglo2=100
frec con 70
goto inicio '***********saltamos el handler de interrupciones******
Interrupcion: '***********rutina de atencion de interrupciones*******
intcon.7=0 'desabilita interrupciones generales
serin gpio.2,t2400,["DATA"],azul,verde,rojo,fx 'espera datos por gpio2
toggle gpio.5 'solo utilizo este pin para detectar si esta entrando
'a la interrupcion
asm
bcf INTCON , INTF ; Resetea bandera de interrupcion por gpio2
bsf INTCON , GIE ; Activa interrupciones generales
movf psave,w ; restaura
movwf PCLATH
swapf ssave,w
movwf STATUS
swapf wsave,f
swapf wsave,w
retfie
EndAsm
'**************empieza el programa principal**************************
inicio:
select case fx
case 0
gosub out
case 1
gosub fx1
end select
goto inicio
'*******incrementa y decrementa aleatoriamente las variables de color********
fx1 :
for n=0 to 2
random rnd
while (rnd>32000) and (arreglo2[n]<200)
'for m=1 to 10
arreglo2[n]=(arreglo2[n]+1)
azul=arreglo2[0]
verde=arreglo2[1]
rojo=arreglo2 [2]
gosub retardo
'next m
wend
while (rnd<32000) and (arreglo2[n]>0)
'for m=1 to 100
arreglo2[n]=(arreglo2[n]-1)
azul=arreglo2[0]
verde=arreglo2[1]
rojo=arreglo2 [2]
gosub retardo
' next m
wend
next n
return
'*******genera pausa para que el incremento/decremento sea suave************
retardo:
for l=0 to 5
gosub out
next l
return
'****************genera pwm para los leds ***********************************
out:
ac[0]=azul
ac[1]=verde
ac[2]=rojo
gpio.0=1 'ACTIVA LAS SALIDAS 0,1,Y 4 DEL PIC QUE CORRESPONDEN
gpio.1=1 ' A LOS LEDS AZUL,VERDE, ROJO
gpio.4=1
sumat=0 ' esta variable guarda el valor de el tiempo de la pausa anterior
for j =0 to 2 'en esta parte del programa busca el valor del color
menor=255 'que debe estar menor tiempo encendido, manda la pausa
for i=0 to 2 'correspòndiente, marca esta pausa como tiempo
if ac< menor then 'transcurrido cambia el valor de la variable que
menor=ac 'fue apagada para que en el siguiente siclo
indice=i 'sea ignorada y tomada la siguiente menor y asi
endif 'sucesivamente hasta que simula pwm diferente
'para cada led. en el ciclo for interior se compara
next i 'el valor menor y el indice en el que se encuentra
'para saber cual sera la pausa y el puert0 a apagar.
'los valores pueden ser de 0 a 254para una frecuencia
ac[indice]=255 'pwm de 50hz aproximadamente
pauseus((menor-sumat)*frec)
sumat=menor
select case indice
case 0
gpio.0 =0
case 1
gpio.1 =0
case 2
gpio.4 =0
end select
next j
tlow=(254-menor)
pauseus (tlow*frec)
return
-
Hola:
Bueno, por el pedido de algunos usuarios, aqui les dejo un ejemplo para un contador en 4 displays multiplezados, este incrementa la cuenta cada ves que se precione el pulsante.
cont var word
unid var byte
dece var byte
cent var byte
mile var byte
TRISB = 0
TRISA.0 = 1
cont=0
inicio:
if PORTA.0 = 0 then
cont = cont+1
PAUSE 200
ENDIF
unid = cont dig 0
PORTB = unid + 16
PAUSE 5
dece = cont dig 1
PORTB = dece + 32
PAUSE 5
cent = cont dig 2
PORTB = cent + 64
PAUSE 5
mile = cont dig 3
PORTB = mile + 128
PAUSE 5
GOTO INICIO
HOLA LORDLAFEBRE gracias por los codigos de multiplexacion de led 7 segmentos pero tengo unos problemas, lo hice en el proteus 6.7 pero mucho retardo en los displays y ademas lelga al segundo 1 o 2 y me sale error de proteus:
[SPICE] Error 106 - TRAN: Timestep too small; time = 0.258446, timestep = 6.93889e-018: trouble with node "#00008"
Y NO PUEDO SEGUIR SIMULANDO.GRACIAS
-
Ah ese error es comun, bueno al menos mas de 4 usuarios lo hemos tenido pero en la realidad funcionan sin ningun problema. Puedes probarlo y nos cuentas
-
Ah ese error es comun, bueno al menos mas de 4 usuarios lo hemos tenido pero en la realidad funcionan sin ningun problema. Puedes probarlo y nos cuentas
Gracias aunque aun no lo intente, sin embargo ya que estoy empezando con algunas cosiilas del picbasic me gustaria q alguien se aportara con un pequeño project hecho en proteus con una multiplexacion de led 7 segmentos usando el 7447 o 74ls48. ya que de tanto buscar encontre codigo pero no me funcionan y si tuviera el proyecto del proteus (archivo DSN) creo q no habria fallas.
GRacias de antemano
-
Contribuyo con un circuito que me dio dolores de cabeza.
PIC 12F675
1 Potenciometro conectado a GPIO 0 (AN0)
4 Leds en los puertos GPIO 1, 2, 4, 5 .
De a cuerdo a la posicion del potenciometro se van prendiendo los leds.
Adjunto archivo y simulacion. Probado fisicamente , luego de varios meses que programo un pic. :(
Saludos
-
AQUI les dejo, un ejemplo de un Puente H, con motor de DC, y Tres botones Paro, GiroA,Giro Inverso, conectado a un 16F877, claro con un 84A es igual y menos desperdicio de pines. :mrgreen:
les adjunto EL BAS. Y EL ARCHIVO DE PROTEUS V 6.7 sp3
Hola que tal, podrias subir el codigo HEX de tu ejemplo, Gracias.
-
alguien que me de una mano con el comando "pot"
¿Como reemplazo el comando readadc de picaxe en pbp ? ¿tengo que usar un pic con entrada analógica? pues estoy usando un 16f84 y no lo puedo hacer andar. alguien qie me responda mil gracias!!!!!!
abrazo para todos
Daniel de Argentina (Mc Guiver)
-
Ah ese error es comun, bueno al menos mas de 4 usuarios lo hemos tenido pero en la realidad funcionan sin ningun problema. Puedes probarlo y nos cuentas
Gracias aunque aun no lo intente, sin embargo ya que estoy empezando con algunas cosiilas del picbasic me gustaria q alguien se aportara con un pequeño project hecho en proteus con una multiplexacion de led 7 segmentos usando el 7447 o 74ls48. ya que de tanto buscar encontre codigo pero no me funcionan y si tuviera el proyecto del proteus (archivo DSN) creo q no habria fallas.
GRacias de antemano
Los ejemplos estan sobre este mismo post, los hizo LordLafebre y estan muy sencillos el circuito funciona aunque segun la version del Proteus te puede dar erroro el display.
Contribuyo con un circuito que me dio dolores de cabeza.
PIC 12F675
1 Potenciometro conectado a GPIO 0 (AN0)
4 Leds en los puertos GPIO 1, 2, 4, 5 .
De a cuerdo a la posicion del potenciometro se van prendiendo los leds.
Adjunto archivo y simulacion. Probado fisicamente , luego de varios meses que programo un pic. :(
Saludos
Muchas Gracias Vegue. Saludos al Peke
alguien que me de una mano con el comando "pot"
¿Como reemplazo el comando readadc de picaxe en pbp ? ¿tengo que usar un pic con entrada analógica? pues estoy usando un 16f84 y no lo puedo hacer andar. alguien qie me responda mil gracias!!!!!!
abrazo para todos
Daniel de Argentina (Mc Guiver)
El comando POT no te sirve como para leer un ADC, el 16f84 no tiene un ADC te recomiendo el 16F88 ese si trae y ejemplos podras encontrar en el foro del uso del comando ADCIN
-
Pues bien como esto ya tiene un rato abandonado vamos a revivirlo el siguiente código es un borrador de un proyecto que tengo entre manos pero como ejemplo vale. Se trata de leer la temperatura con un sensor ds1620 en modo 3 wire. Además lee un sensor analógico de temperatura msp7001a el cual sirve como medida patrón o referencia. Además debe guardar dichas medidas cada cierto tiempo en una memoria 24lc65 todo esto con reloj en tiempo real con un ds1307
La parte de guardar los datos la tengo pendiente porque me estoy rompiendo la cabeza para hacer el dataloger.
Nota. Incluyo un programita en qbasic que no recuerdo de donde lo baje sirve para cargar la hora al ds1307 directamente de la pc vía puerto serie.
DEVICE 16F876A
XTAL=20
'****** configuracion puerto serie fisico *****
HSERIAL_BAUD=9600
HSERIAL_RCSTA=%10010000
HSERIAL_TXSTA=%00100000
HSERIAL_CLEAR=ON
'****** configuracion puerto analogico/digital ***
DECLARE ADIN_RES 8
DECLARE ADIN_TAD frc
DECLARE ADIN_DELAY 50
TRISA=%00000111
ADCON1=%00000000
'****** CONFIGURACION RESTO DE PUERTOS **************
INPUT PORTB.2
INPUT PORTB.1
INPUT PORTB.0
'****** DS1620 control pins *********************
SYMBOL DQ= PORTB.5 ' DS1620 DQ pin #1
SYMBOL CLK0=PORTB.4 ' DS1620 CLK pin #2
SYMBOL RST=PORTB.3 ' DS1620 RST pin #3
DIM decimal AS BYTE
DIM Temp AS WORD
'========= variables temperatura =========
DIM lecturaAn0 AS BYTE
DIM mv AS FLOAT
DIM temperatura AS FLOAT
temperatura=0
mv=0
'======== variables rtc =======
DIM SEGUNDOS AS BYTE
DIM MINUTOS AS BYTE
DIM HORA AS BYTE
DIM dia AS BYTE
DIM fecha AS BYTE
DIM mes AS BYTE
DIM ano AS BYTE
Init:
HBUSOUT %11010000,7,[%00010000] 'int externa 1hz
HBUSOUT %11010000,0,[0] 'inicialisa ds1
DELAYMS 40
nopres:
HIGH PORTC.0
IF PORTB.2=0 THEN
Loadtime:
DELAYMS 40
SEGUNDOS=HRSIN ' Read the Seconds serially
MINUTOS=HRSIN ' Read the Minutes serially
HORA=HRSIN ' Read the Hours serially
fecha=HRSIN ' Read the Date serially
mes=HRSIN ' Read the Month serially
ano=HRSIN ' Read the Year serially
SetTime:
HBUSOUT $D0,$00,[SEGUNDOS,MINUTOS,HORA,dia,fecha,mes,ano] ' write time
GOTO main
ENDIF
GOTO nopres
'============= rutina principal =================
main:
LOW PORTC.0
WHILE 1=1
GOSUB leerMsp700
GOSUB Read_1620
GOSUB GetTime
HRSOUT "time"," ", HEX2 HORA,":",HEX2 MINUTOS,":",HEX2 SEGUNDOS," ","data"," ",HEX2, fecha ,"/",HEX2,mes,"/",HEX2 ano ,10,13
HRSOUT "******************************************",0,10,13
HRSOUT "temperatura_msp700="," ",DEC2 temperatura,"c",0,10,13
HRSOUT "******************************************",0,10,13
HRSOUT "temperatura_ds1620="," ",DEC Temp,".",DEC decimal,0,10,13
HRSOUT "******************************************",0,10,13
GOSUB piloto
mv=0
temperatura=0
WEND
' ************ mcp9700 **********************
leerMsp700:
lecturaAn0=ADIN 0
mv=(lecturaAn0 * .0195)-.400
temperatura=mv/.0195
RETURN
Read_1620:
RST = 1
SHOUT DQ,CLK0,LSBFIRST,[$0C,$02] ' Continuous convert, CPU mode
RST = 0
DELAYMS 10 ' Minimum wait time after write
HIGH RST ' Enable 1620
SHOUT DQ, CLK0, LSBFIRST, [$EE] ' Send start temp convert command
LOW RST ' Disable 1620
DELAYMS 1000 ' Wait for conversion to complete
HIGH RST ' Enable 1620
SHOUT DQ, CLK0, LSBFIRST, [$AA] ' Send read temp command
SHIN DQ, CLK0, LSBPRE, [Temp\9] ' Read 9 bit temperature
LOW RST
IF Temp.7=0 THEN
decimal=5
ELSE
decimal=0
ENDIF ' Disable 1620
Temp = Temp/2 ' Scale reading to whole degrees C.
RETURN
piloto:
HIGH PORTC.2
DELAYMS 100
LOW PORTC.2
DELAYMS 100
RETURN
'================== leer la hora actual =============
GetTime:
HBUSIN $D1,$00,[ SEGUNDOS,MINUTOS,HORA,dia,fecha,mes,ano]
RETURN
-
aqui te dejo unos datos, yo he usado con el pic 16f84 y me a funcionado bien, solo recuedate que vas a medir la descarga de el potenciometro a travez del capacitor para obtener un valor de resistencia no un valor de voltaje.
POT Pin,Scale,Var
Lee un potenciómetro (ú otro dispositivo resistivo) en Pin . Pin puede ser una constante , 0 - 15 , ó una
La resistencia se mide tomando el tiempo de descarga de un capacitor a través de un resistor .
( 5 K a 50 K ) .Scale se usa para ajustar distintas constantes RC . Para constantes RC grandes , Scale debe
ser baja (valor mínmo 1 ) . Para constantes RC pequeñas , Scale debe ser máxima (255) . Si el valor de
Scale es correcto , Var debe ser cero para mínima resistencia y 255 para máxima resistencia .
Desafortunadamente , Scale debe ser determinada en forma experimental .Para esto , coloque el
dispositivo a medir en máxima resistencia y mídalo con Scale=255 . En estas condiciones , Var tendrá un
valor apropiado de Scale .(Este es el mismo tipo de proceso que efectúa la opción ALT-P en BS1 ).
POT,3,255,B0 ´ lee el potenciómetro en pin 3 para determinar Scale
-
se me olvidaba tambien puedes usar rc time :
RCTIME puede usarse para leer un potenciómetro ( ó cualquier dispositivo resistivo ) .La resistencia
puede ser medida descargando un capacitor a través de un resistor ( 5 K a 50 K ) y midiendo el tiempo de
carga ( ó viceversa )
La resolución de RCTIME depende de la frecuencia del oscilador . Si se usa un oscilador de 4 Mhz , el
tiempo estará en incrementos de 10 us .Si se usa un oscilador de 20 Mhz ,el tiempo tendrá una resolución
de 2 us .Definir un valor de OSC no tiene efectos sobre RCTIME. La resolución siempre cambia con la
velocidad del oscilador en uso .
Si el pin no cambia de estado , se devuelve 0
Low PORTB.3 ´ descarga el capacitor para comenzar
Pause 10 ´ descarga por 10 mseg.
RCTIME PORTB.3,0,W0 ´ lee el potenciómetro en pin 3
-
ya hay una nueva version del microcode studio y PBP la 3.0.0.5 y pbp2.50a....si no me equivoco todavia no soporta punto flotante :?
-
Bueno continuando con los ejemplos ahora tenemos la lectura de un sensor de temperatura ds1624 y continuando con el ejemplo anterior le agregamos el data loger con una memoria 24lc65 aclaro que esta muy lejos de estar terminado ase falta optimizar y mejorar el código pero como ejemplo vale.
Lectura del ds1624
DEVICE 16F876A
XTAL=4
'****** configuracion puerto serie fisico *****
HSERIAL_BAUD=2400
HSERIAL_RCSTA=%10010000
HSERIAL_TXSTA=%00100000
HSERIAL_CLEAR=ON
DIM i2c_in[3] AS BYTE 'data received over I2C bus
DIM temp AS BYTE
main:
GOSUB Config_Register 'Set Configuration
GOSUB Start_Convert 'Start continuous conversion
TOP:
i2c_in[0]=0
i2c_in[1]=0
i2c_in[2]=0
temp=0
DELAYMS 500
GOSUB Read_Temp 'Read the current temperature
i2c_in[2] = i2c_in[1] >> 3 'Shift 5 decimal bits to LS position
temp = (i2c_in[1]*1000) 'PIC Doesn’t like decimals, but there is a way to work around this
temp =(temp ** 2048)/100
HSEROUT [DEC i2c_in[0],".",DEC2 temp ,13,10]'Outputs temperature to terminal
GOTO TOP 'Loops forever
Config_Register: 'Set continuous conversion
HBSTART 'Start Condition
HBUSOUT %10010000 'Send Address, (device= %1001, A0= 0, A1= 0, A2= 0, R/W= 0)
HBUSOUT $AC 'Send “Access Configuration” command
HBUSOUT $00 'Send “Continuous Conversion” command
HBSTOP 'Stop Condition
RETURN
Start_Convert: 'Start Conversion
HBSTART
HBUSOUT %10010000 'Send Address, (device= %1001, A0= 0, A1= 0, A2= 0, R/W= 0)
HBUSOUT $EE 'Send “Start to Convert” command
DELAYMS 10
HBSTOP
RETURN
Read_Temp: 'Read temperature
HBSTART
HBUSOUT %10010000 'You must “write” the command to read the temperature before
HBUSOUT $AA 'Send “Read Temperature” command
HBRESTART '* Reissue Start Condition *
HBUSOUT %10010001 'Send Address, (device= %1001, A0= 0, A1= 0, A2= 0, R/W= *1*)
i2c_in[0] =HBUSIN
HBUSACK
i2c_in[1] =HBUSIN
HBUSACK
HBSTOP
RETURN
Data loger
DEVICE 16F876A
XTAL=20
DIM MINU AS BYTE
DIM PONE AS BYTE
DIM PTWO AS BYTE
'****** configuracion puerto serie fisico *****
HSERIAL_BAUD=9600
HSERIAL_RCSTA=%10010000
HSERIAL_TXSTA=%00100000
HSERIAL_CLEAR=ON
'****** configuracion puerto analogico/digital ***
DECLARE ADIN_RES 8
DECLARE ADIN_TAD frc
DECLARE ADIN_DELAY 50
TRISA=%00000111
ADCON1=%00000000
'****** CONFIGURACION RESTO DE PUERTOS **************
INPUT PORTB.2 : SYMBOL sw2=PORTB.2
INPUT PORTB.1 : SYMBOL sw1=PORTB.1
INPUT PORTB.0 : SYMBOL sw0=PORTB.0
OUTPUT PORTC.0 :SYMBOL ledr=PORTC.0
OUTPUT PORTC.1: SYMBOL ledv1=PORTC.1
OUTPUT PORTC.2: SYMBOL ledv2=PORTC.2
'*********** configuracion 24lc65
DIM addres AS WORD
addres=0
DIM data_out AS BYTE
data_out=0
DIM data_in AS BYTE
DIM reading AS BYTE
reading=1
SYMBOL control_write=%10100000
SYMBOL control_red=%10100001
'****** DS1620 control pins *********************
SYMBOL DQ= PORTB.5 ' DS1620 DQ pin #1
SYMBOL CLK0=PORTB.4 ' DS1620 CLK pin #2
SYMBOL RST=PORTB.3 ' DS1620 RST pin #3
DIM decimal AS BYTE
DIM Temp AS WORD
'======== variables rtc =======
DIM SEGUNDOS AS BYTE
DIM MINUTOS AS BYTE
DIM HORA AS BYTE
DIM dia AS BYTE
DIM fecha AS BYTE
DIM mes AS BYTE
DIM ano AS BYTE
Init:
HBUSOUT %11010000,7,[%00010000] 'int externa 1hz
HBUSOUT %11010000,0,[0] 'inicialisa ds1
DELAYMS 40
'******** transmitir la hora actual al ds1307 via pueto serial *********
nopres:
ledr=1
ledv1=0
ledv2=0
IF sw2=0 THEN
Loadtime:
DELAYMS 40
SEGUNDOS=HRSIN ' Read the Seconds serially
MINUTOS=HRSIN ' Read the Minutes serially
HORA=HRSIN ' Read the Hours serially
fecha=HRSIN ' Read the Date serially
mes=HRSIN ' Read the Month serially
ano=HRSIN ' Read the Year serially
SetTime:
HBUSOUT $D0,$00,[SEGUNDOS,MINUTOS,HORA,dia,fecha,mes,ano] ' write time
GOTO main
ENDIF
GOTO nopres
'**************************************************************************
'* rutina principal
'*
'***************************************************************************
main:
ledr=0
WHILE 1=1
GOSUB GetTime
data_out=fecha:GOSUB eprom_write
data_out=mes:GOSUB eprom_write
data_out=MINUTOS:GOSUB eprom_write
data_out=HORA:GOSUB eprom_write
GOSUB Read_1620
data_out=Temp:GOSUB eprom_write
data_out=decimal:GOSUB eprom_write
GOSUB piloto
HRSOUT "estoy grabando" ,10,13
WEND
'================== leer la hora actual =============
GetTime:
HBUSIN $D1,$00,[ SEGUNDOS,MINUTOS,HORA,dia,fecha,mes,ano]
RETURN
'***************** leer ds1620 ************
Read_1620:
RST = 1
SHOUT DQ,CLK0,LSBFIRST,[$0C,$02] ' Continuous convert, CPU mode
RST = 0
DELAYMS 10 ' Minimum wait time after write
HIGH RST ' Enable 1620
SHOUT DQ, CLK0, LSBFIRST, [$EE] ' Send start temp convert command
LOW RST ' Disable 1620
DELAYMS 1000 ' Wait for conversion to complete
HIGH RST ' Enable 1620
SHOUT DQ, CLK0, LSBFIRST, [$AA] ' Send read temp command
SHIN DQ, CLK0, LSBPRE, [Temp\9] ' Read 9 bit temperature
LOW RST
IF Temp.7=0 THEN
decimal=5
ELSE
decimal=0
ENDIF ' Disable 1620
Temp = Temp/2 ' Scale reading to whole degrees C.
RETURN
'****************** gravar en memoria extena ***************
eprom_write:
HBUSOUT control_write,addres,[data_out]
addres = addres + 1
IF addres >= 100 THEN
addres=0
ledr=0
GOTO descargar
ENDIF
RETURN
piloto:
ledr=1
DELAYMS 100
ledr=0
DELAYMS 100
RETURN
'***************** descargar memoria extena ****************
descargar:
IF sw1=0 THEN exit
GOSUB piloto2
GOTO descargar
exit:
ledv1=0
WHILE 1=1
GOSUB eprom_read
data_in=fecha
GOSUB eprom_read
data_in=mes
GOSUB eprom_read
data_in=MINUTOS
GOSUB eprom_read
data_in=HORA
GOSUB eprom_read
data_in=Temp
GOSUB eprom_read
data_out=decimal
HRSOUT "time"," ", HEX2 HORA,":",HEX2 MINUTOS," ","data"," ",HEX2, fecha ,"/",HEX2,mes,10,13
HRSOUT "******************************************",0,10,13
HRSOUT "temperatura_ds1620="," ",DEC Temp,".",DEC decimal,0,10,13
GOSUB piloto3
WEND
'*************** leer memoria externa **************************
eprom_read:
data_in = HBUSIN control_red,addres
addres = addres + 1
IF addres >= 100 THEN
addres=0
ledv2=0
GOTO main
ENDIF
RETURN
piloto2:
ledv1=1
DELAYMS 100
ledv1=0
DELAYMS 100
RETURN
piloto3:
ledv2=1
DELAYMS 100
ledv2=0
DELAYMS 100
RETURN
-
Ah ese error es comun, bueno al menos mas de 4 usuarios lo hemos tenido pero en la realidad funcionan sin ningun problema. Puedes probarlo y nos cuentas
Gracias aunque aun no lo intente, sin embargo ya que estoy empezando con algunas cosiilas del picbasic me gustaria q alguien se aportara con un pequeño project hecho en proteus con una multiplexacion de led 7 segmentos usando el 7447 o 74ls48. ya que de tanto buscar encontre codigo pero no me funcionan y si tuviera el proyecto del proteus (archivo DSN) creo q no habria fallas.
GRacias de antemano
Los ejemplos estan sobre este mismo post, los hizo LordLafebre y estan muy sencillos el circuito funciona aunque segun la version del Proteus te puede dar erroro el display.
Contribuyo con un circuito que me dio dolores de cabeza.
PIC 12F675
1 Potenciometro conectado a GPIO 0 (AN0)
4 Leds en los puertos GPIO 1, 2, 4, 5 .
De a cuerdo a la posicion del potenciometro se van prendiendo los leds.
Adjunto archivo y simulacion. Probado fisicamente , luego de varios meses que programo un pic. :(
Saludos
Muchas Gracias Vegue. Saludos al Peke
alguien que me de una mano con el comando "pot"
¿Como reemplazo el comando readadc de picaxe en pbp ? ¿tengo que usar un pic con entrada analógica? pues estoy usando un 16f84 y no lo puedo hacer andar. alguien qie me responda mil gracias!!!!!!
abrazo para todos
Daniel de Argentina (Mc Guiver)
El comando POT no te sirve como para leer un ADC, el 16f84 no tiene un ADC te recomiendo el 16F88 ese si trae y ejemplos podras encontrar en el foro del uso del comando ADCIN
-
estimado navaismo: gracias por tu respuesta con el tema del comando pot. Ahora estoy practicando con el comando adcin pero no lo puedo hacer funcionar.Solo quiero hacer encender tres leds de acuerdo con la pisición del potenciómetro. Tengo un pic 16f873A es el mismo que el 16f873? porque el editor que tengo solo tiene el 16f873 y no el A.Vi un ejemplo de uno de los muchachos del foro pero usa otro pic y se me compilcó un poco, este es el programa que edité y calciulo que la estoy errando en las declaraciones, es un pic de 10 bits el que uso.
Con un pic 16f873A y con un oscilador de 4 mhz , lo compila y lo programa sin errores pero el pic no obedece al potenciometro, parpadean los leds sin control.
gracias a vos o a cualquiera de los otros genios que esten en el foro.
Programa:
define adc_bits 10
define adc_clock 3
define adc_sampleus 50
dog var byte
TRISA = %11111111 'puerto A se define como entradas
adcon1 = 0 'puerto A es analógico
main: adcin 0,dog
if dog <= 80 then rojo
if dog > 80 and dog <= 160 then verde
goto ambar
rojo: high portb.0
low portb.2
low portb.1
goto main
verde: high portb.1
low portb.0: low portb.2
goto main
ambar: high portb.2
low portb.1:low portb.0
goto main
-
Gracias Vequepic... estoy tratando e adaptar tu programa para un pic 16f873A pruebo y despues te cuento jejeje
saludos Mc Guiver
-
Hola
Dog no deberia ser WORD en vez de byte ya que estas trabajando con 10bits :mrgreen:
Otro detalle de hecho el mas importante :mrgreen: estas colocando adcon1 = 0 eso quiere decir justificacion a la derecha y fosc = fosc/2 por eso no te trabaja coloca, adcon1 = $80 con eso resuelves el problema
Saludos
-
Hola Mc Guiver:
No conozco ese pic pero tengo varias observaciones
Estoy seguro que tiene comparadores y no los veo desactivados.
Solo has definido el puerto A y los otros puertos??
Usando el if de esa manera la rutina ambar siempre se ejecuta, debe ser una de las razones por las que parpadean varias luces.
Saludos
-
EstimadoVequepic:
El puerto Bno esta predefinido como salida?,Cuando lo compilo me aparecen errores como:
error pbppic14.lib 5732: 255 ( entre corchetes) undefined simbol "ANSEL"
" " " " undefined symbol "adcon0"
" " "adres"
" " GO_DONE
una serie de errores que nolos entiendo bien.
si no te molesta en contestarme hacelo y te lo agradezco en el alma sinó tambien voy a probar con un conversor externo 0831 (si lo consigo jejeje)
un abrazo
Mc Guiver
-
Eso quiere decir que el PIC no cuenta cohn los registros o bien el MPASM no esta cachando bien el lugar de la libreria. No desistas siempre es mas facil usar el AD del PIC busca los ejemplos que tenemos aqui mismo y veras, por ejemplo busca los que hemos usado el lm35dz con el 877 y ve como esta la explicacion es mas sencillo de lo que crees.
-
Estimado Navaismo: Estuve mirando los ejemplos del foro , cada vez que miro siempre algo aprendo, te voy a hacer caso con lo del adc del pic ya que se me hace dificil conseguir un adc extrerno. Vi en un ejemplo de justificacion a la derecha y a la izquierda, la pregunta es:
si es a la derecha queda el decimal 1 o sea 00000001=1 pero si esta a la izquierda-segun lo que vi (y me confundiò) ,es 01000000= 64 , porque es 64 y no 128? no seria asì 10000000=128 ?
Otra pregunta: ¿para que se justifica a la derecha o a la izquierda ? (no soy estudiante de electronica ni de computacion, soy tècnico mecànico pero me encanta esto de los pics y todo lo que tenga que ver con la automatizacion)
Si tengo un pic de 10 bits , ¿lo puedo hacer trabajar con 8 bits? Que libro o manual me puedes recomendar para aprender bien pbasic ya que los elemplos de pbasic pro no son tan claros como los de picaxe (por lo menos para mi) entonces lo que hago es de los dos hacer uno jaja.pero bien!!... voy entendiendo, si fuera facil seria aburrido.
Lo de la libreria del pic que me mencionaste, ¿la tiene que tener el compilador o el pic?
un abrazo
Mc Guiver
-
estimado Vequepic:
¿como hago para desactivar los comparadores? ¿si los desactivo automaticamente se activan las entradas del puerto A como analogicas?
Lo del if ya lo corregì .
Gracias, un abrazo y sigo probaaaaannnndooooooooooo !!!ajjajaja
-
Hola ralf2:
que significa fosc = fosc/2 para que se utiliza?
Un abrazo
Mc Guiver
-
Estimados amigos del foro:aca está el programa que hice
'Programa para hacer encender tres leds
'(de a uno por vez) dependiendo de la posición
'del potenciómetro
'PIC : 16f873A
'10 bits
'NO LO PUEDO HACER FUNCIONAAAARRRRRRRR!!!!!
'DE MANDAR UN COHETE A MARTE ....¡¡¡NI HABLARRRRRR!!!!! JA JA JAAA.
Define ADC_BITS 8 'aca probé con Define ADC_BITS 10 y nadaaa
DEfine ADC_CLOCK 3
Define ADC_SAMPLEUS 50
TRISA = %11111111 'defino puerto A como entradas, tambien probé con
'TRISA = %1111111111 (10 numeros y nada)
TRISB = %00000000 'defino puerto B como salidas, tambien probé con
'TRISA = %1111111111 (10 numeros y nada)
adcin1=%00000001 'supongo que el error está acá, pero ni idea de lo
'que estoy haciendo !!!!!!pero
'si pongo adcon1 o adcon0
'me aparecen 14 renglones de errores al compilarlo,
' pero sí lo escribo como está, me pone
'un error de sintaxis en ésta linea (18)
dog VAR byte
main:
adcin 0,dog
if dog<80 then
portb=%00000001
endif
if dog>80 and dog<160 then
portb=%00000010
endif
if dog > 160 then
portb=%00000100
endif
goto main
-
Que tal mc guiver!
Mira olvida el comentario sobre el fosc = fosc/2 esta incorrecto :shock: esto lo habia colocado haciendo referencia al reloj del adc pero tu lo colocaste en modo RC asi que no hay problema :mrgreen:
Sigues insistiendo en colocar el adcon1 = %0000 0001 esto no es correcto, para trabajar con una resolucion de 10bits que era el primer programa debes colocarlo asi: ADCON1 = %1000 0000 ($80)
sino no te va a funcionar.
Ahora bien en tu ultimo ejemplo para trabajar con 8bits debes colocar el adcon1 = %0000 0001 tal como lo colocaste :mrgreen:
todo lo demas se ve bien :?
Revisa bien el hardware a ver si el problema no este alli los led que no esten invertidos...
Saludos
-
gracias ralf2.... el problema que tengo esta al compilarlo, me parece que algo esta fallando con los archivos del pbp porque he probado de todo y ya no se que hacer.si compilo de esta manera solo me pone un error de sintaxis en esta linea:
osctune 4 ( acá me marca el error, lo saque de un ejemplo de uno de los muchachos del foro)
define osc.....
define clock....
define sampleus etc....
si saco este comando, me da una serie de errores como de 15 renglones.
pero de todas maneras cuando compilo un ejemplo de los que ya trae pbp (por ej: adcin10 o adcin8) tambien me da error
un abrazo
mc guiver
-
Hola Mc Guiver, para entender el uso de ADCON0 y ADCON1, debes leer el datasheetdatasheet (http://rds.yahoo.com/_ylt=A0geu7j.mzNI3NIA3GNXNyoA;_ylu=X3oDMTEybnFxb203BHNlYwNzcgRwb3MDMQRjb2xvA2FjMgR2dGlkA0RGUjVfODY-/SIG=12eombqpc/EXP=1211428222/**http%3a//ww1.microchip.com/downloads/en/DeviceDoc/30292c.pdf), capitulo 11, tambien debes desactivar los comparadores, capitulo 12.
No veo que tengas definidos los fuses.
Un consejo, aun me parece que debes reforzar tus conocimientos de PBP y tal vez empezar con ejemplos mas sencillos.
Si lo estas simulando seria bueno que subieras la simulacion para poder ayudarte mejor.
Saludos
Hugo
-
Estimados amigos del foro:
Quiero decirles que he probado nuevamente con el programa y esta vez SI anduvo, estoy mas feliz que nunca , les agradezco enormemente el apoyo que me han dado, espero poder – con lo poco que se-, ayudar a otros. El error estaba al compilarlo, resulta que yo seleccionaba el pic 16f873 desde Micro Code Studio y me daba errores por todos lados (al compilarlo desde DOS).Me puse a ler el manual y probé de seleccionarlo desde DOS con el comando pbp –p16f873 (y el nombre del archivo sin los paréntesis) y JOYAAAAA!!!!! Lo compila de maravillas.
También probé de hacerlo trabajar con 8 bits y bárbaro
Bueno acá les presento mi humilde programa que como mencioné anteriormente , enciende tres leds de a uno por vez dependiendo de la posición del potenciómetro.
Define ADC_BITS 10
DEfine ADC_CLOCK 3
Define ADC_SAMPLEUS 50
TRISA = %11111111 'defino puerto A como entradas
TRISB = %00000000 'defino puerto B como salidas
adcon1=%10000000
dog VAR word
main:
adcin 0,dog
if dog<80 then
portb=%00000001
endif
if dog>80 and dog<160 then
portb=%00000010
endif
if dog > 160 then
portb=%00000100
endif
goto main
saludos para todos
Mc Guiver
-
Excelente!!! Muchas gracias por compartirlo quizas no lo veas pero a muchos eso les va a servir
-
Estimados MAESTROS del foro:
Estoy haciendo funcionar un servo de aeromodelismo con un pic , lo hacia con picaxe y habia un comando "servo" que me controlaba un servo pero mientras el pic leia el resto del programa, el servo quedaba con potencia, o sea que le seguia mandando la serie de pulsos para que permanezca en esa posicion. Con un pic comun, si uso el comando pulsout, este solo dura un tiempo determinado y luego interrumpe la serie de pulsos al servo y sigue leyendo el resto del programa, de esta manera el servo se queda sin potencia y en ese caso lo puedo mover con la mano cosa que no me interesa.Lo que me interesa es que siga con potencia para que quede firme mientras hace el resto del programa.
¿Alguien me puede decir como hacerlo?.
¿Tendre que intercalar el comando pulsout con el resto del programa?
Saludos
Mc Guiver
-
Saludos!
Aquí es donde el basic se queda sin fuerza :D
Para poder manejar correctamente el servo deberás estar mandándole la señal continuamente, como bien tú lo señalas.
Y para hacer eso necesitas interrupciones. Por allí hay un post donde el maestro RedPic explica muy bien cómo manejar hasta 8 servos con una sola interrupción. Pero está en C claro. Es en este tipo de trabajitos cuando se ve cómo el C supera al basic.
Creo que en basic también se puede trabajar con interrupciones, pero no tan bien como en C.
Bueno ya algún experto en basic nos comentará.
nos leemos! :mrgreen:
-
Hola Mc Guiver gracias por tu aportación, podrias subir la simulación en proteus de tu código?? asi veriamos mejor el uso del potencimetro.
Gracias y saludos
-
Maestro LordLafebre me podrias decir por que cuando estoy ejecutando un bucle con el for next,despues de terminar la secuencia e incluso mientras se ejecuta la misma,el programa hace caso omiso de la comprobacion que efectuo con el IF Then.?
Me explico, tengo el siguiente código:
DEVICE = 16F84A
XTAL 4
TRISA.0=1
DIM i as BYTE
inicio:
If porta.0=1 Then atras
Gosub adelante
Goto inicio
adelante:
For i=0 to 10
portb=%00000110:delayns 20
portb=%00000101:delayns 20 Aqui aveces si es reconocido el pulsador o la comparación IF Then
portb=%00000110:delayns 20 y la mayoria de las vece nada
Next
pause 50
portb=%00000110:delayns 100
portb=%00000101:delayns 100 'Cuando el programa ejecuta esta parte el pulsador no hace caso
portb=%00000110:delayns 100 ' aqui pasa algo pero no entiendo el fallo
return
atras:
for i=0 to 5
portb=%00001010:delayns 20
portb=%00001001:delayns 20
portb=%00000100:delayns 20
next i
goto inicio
Quiero decir con esto que cuando llega al punto indicado arriba y pulso virtualmente en proteus el boton correspondiente al porta.0 la comparación IF THEN no es reconocida en ese momento, ??puedes decirme por que ocurre esto?? o que devo hacer
podme un ejemplillo
gracias y un saludo
-
Hola:
Pues no entiendo como es que te compila siquiera,
For i=0 to 10
portb=%00000110:delayns 20
portb=%00000101:delayns 20 Aqui aveces si es reconocido el pulsador o la comparación IF Then
portb=%00000110:delayns 20 y la mayoria de las vece nada
Next i
no existe ese comando que te lo pongo en negritas, en el next también indícale cual es la variable que quieres incrementar.
-
Hola de nuevo.
Ha sido un error de escritura, el comando es DELAYMS,y eso lo tengo correcto en el código, el problema vuelvo a reiterar es que mientras se ejecuta el ciclo de FOR NEXT, la comprobación del IF THEN es ignorada, tienes alguna respuesta??
gracias y saludos
-
Hola:
Es obvio que no se ejecute el IF THEN pues el bucle espera a que termine la condicion para salir, es decir:
For i=0 to 10
portb=%00000110:delayns 20
portb=%00000101:delayns 20 Aqui aveces si es reconocido el pulsador o la comparación IF Then
portb=%00000110:delayns 20 y la mayoria de las vece nada
Next
son 11 iteraciones que realiza ese bucle, para los siguientes valores de i: 0,1,2,3,4,5,6,7,8,9 y 10, por lo tanto, como tienes tres retardos de 20 ms, cada iteración tarda aproximadamente 60 ms, eso multiplicado por las 11 iteraciones, son 660ms ese tiempo se tarda en el bucle que está mencionado en la parte de arriba.
Es mejor que expliques que es lo que quieres hacer, si me adelanto un poco y a juzgar por el nombre de tus subrrutinas, parecería que quieres hacer algo así como comandar motores, para ello los delays los veo demás, así como los bucles.
-
Hola
Maestro LordLafebre solo con ver el código saves de que va la cosa indudablemente eres un maestro
Efectivamente se trata de comandar motores pap bipolares,mi objetivo es hacerlo andar hacia delante y cuando pulse un button que dicho motor gire al contrario un tiempo determinado por.ejemp. 10segundos y una vez termine vuelva a marchar en la misma dirección
Puedes? colocarme un ejemplo y me quito de todo este lio??
Ha! los delaysms me controlan la velocidad de los pasos es por eso que los usos en el codigo, si no que otra forma hay de controlar los pasos??
For i=0 to 10
portb=%00000110:delayms 20
portb=%00000101:delayms 20
portb=%00001010:delayms 20 Por cierto me faltaba una linea ya esta aqui
portb=%00001010:delayms 20
Next
Otra pregunta..?? entonces no hay forma de interrumpir un bucle??? si quiero que en ese momento el motor gire hacia detras por que se haya topado con un obstaculo suponiendo que en vez del interruptor sea un sensor de proximidad, como haria para cesar el bucle, esque si no! este tropezaria no??
-
La forma de hacer lo que planteas de forma más óptima es con interrupciones al CPU.
Pero como no he usado protón, no sé si se admite el uso de interrupciones en dicho compilador.
Supongo que si le echas una miradita al manual lo sabrás. Yo tengo el mikroBasic y el compilador permite las interrupciones, si bien tienes que hacer una rutina leyendo los diferentes flags para saber qué interrupción se ha producido. Si en tu caso sólo atenderás una interrupción, sería más sencillo. Supongo que protón también debe tener esta característica.
En mikroBasic la subrutina de interrupción es algo así como:
sub procedure interrupt
'
'Aquí va el código a ejecutarse
'
end sub
Podrías revisar a ver si en protón hay algo parecido... recuerda usar el buscador del foro, el maestro navaismo hizo un índice para este subforo, tal vez allí te dirija a algún hilo con ejemplos que te sean útiles.
Saludos, nos leemos! :mrgreen:
-
Hola:
Claro que protón tambien tiene interrupciones, que sería de los compiladores sin estas opciones, no? Son estas:
ON INTERRUPT Execute a BASIC or ASSEMBLER subroutine using a SOFTWARE interrupt.
ON_INTERRUPT Execute an ASSEMBLER subroutine on a HARWARE interrupt.
ON_LOW_INTERRUPT Execute an ASSEMBLER subroutine when a LOW PRIORITY HARDWARE interrupt occurs
las dos primeras no son iguales, la una está con espacio y la otra unida con un guión bajo, son diferentes como se puede apreciar en la descripción.
Si no quieres utilizar interrupciones, se me ocurre que el bucle puede ser más corto, eso reduce el tiempo de ejecución, aunque sigo pensando que no haría falta el bucle, ya que puedes hacer lo siguiente:
Device = 16F84A
XTAL 4
TRISA.0=1
Dim i As Byte
inicio:
If PORTA.0=1 Then
GoSub Atras
EndIf
GoSub Adelante
GoTo inicio
Adelante:
'valores para mover el motor adelante
PORTB=%00000110:DelayMS 20
PORTB=%00000101:DelayMS 20
PORTB=%00001010:DelayMS 20
PORTB=%00001010:DelayMS 20
Return
Atras:
'valores para mover el motor atrás
PORTB=%00000110:DelayMS 20
PORTB=%00000101:DelayMS 20
PORTB=%00001010:DelayMS 20
PORTB=%00001010:DelayMS 20
Return
De esta forma, en mover los cuatro pasos tardará 80 ms y puede tranquilamente leer el estado del pin en el que tienes colocado el pulsante, obviamente, si pones menos tiempo entre paso y paso del motór, la lectura del pin en el que tienes el sensor o el pulsador será más rápido.
Lo que tienes que hacer es colocar los valores correctos para que el motor gire, ya que yo les copié igual y no se la secuencia correcta, pruébalo a ver que te parece y me cuentas.
Recuerda, el motór girará hacia atrás mientras tengas presionado el pulsador, si lo sueltas enseguida, solo se moverá cuatro pasos hacia atrás.
-
hola
Gracias por la remisión de ambos, maestro LordLafebre, el codigo va perfecto, pero solo en este caso, quiero decir con tu trozo de código ciertamente el motor gira hacia delante, y si se le pulsa el button realiza el giro hacia atras, pero mi problema sigue persistiendo
Y quiza la culpa ha sido mia por no comentar el error con el código completo, voy a explicar de nuevo y espero me perdonen la confusión.
Este es realmente el código completo, y mi intención es hacer rodar el motor hacia la derecha, el tiempo indicado por el bucle (FOR NEXT) y el tiempo dado por los ( DELAYSMS 20 ) en este caso 20 x 4 x 10 del bucle ( FOR I=0 TO 10 )y una vez termina pasa ala siguiente secuencia donde la demora de los DELAYMS es mayor, de forma que el motor realiza el giro más corto, la secuencia de pasos tarda más en ejecutarse, no se si me explico, y aqui concretamente es donde no me responde el pulsador osea el button, al menos en la simulación de proteus.
Con todo esto quiero decir, si es posible interrumpir la secuencia, dejo el codigo para que lo inspecciones.
Device = 16F84A
XTAL 4
TRISA.0=1
TRISB=%00000000
Dim i As Byte
inicio:
If PORTA.0=1 Then
GoSub Atras
EndIf
GoSub Adelante
GoTo inicio
Adelante:
'valores para mover el motor adelante
FOR i=0 TO 10
PORTB=%00000110:DelayMS 20 '
PORTB=%00000101:DelayMS 20 '
PORTB=%00001001:DelayMS 20 '
PORTB=%00001010:DelayMS 20 '
'
NEXT i '''''''''''''''''' EN ESTE TROZO DE CÓDIGO ES CUANDO QUEDA INHABILITADO EL BUTTON
' LO DEMAS TODO MARCHA PERFE
PORTB=%00000110:DelayMS 200 '
PORTB=%00000101:DelayMS 200 '
PORTB=%00001001:DelayMS 200 '
PORTB=%00001010:DelayMS 200 '
Return
Atras:
'valores para mover el motor atrás
FOR I=0 TO 5
PORTB=%00001010:DelayMS 20
PORTB=%00001001:DelayMS 20
PORTB=%00000101:DelayMS 20
PORTB=%00000110:DelayMS 20
NEXT I
Return
GOTO inicio
Gracias por todo espero tu respuesta maestro LordLafebre, saludos
-
Estimado manupri:
No se como es el proteus, nunca practiquè con el, solo he probado con picaxe (basic) y ahora lo estoy haciendo con Pic Basic Pro pero creo que si el proteus tambien se edita en basic no debe ser muy distinto al ejemplo que subì un poco mas arriba de esta pàgina, tal vez uno de los maestros del foro que estè con proteus te pueda dar una mano. Lamento no poder ayudarte esta vez, pero encantado otra vez que lo pueda hacer
saludos
Mc Guiver
-
Estimados piclisteros:
Si tengo un pic con entradas analògicas , si no las defino como analògicas,¿ arranca con entradas digitales? o tambien las tengo que definir como digitales?
Gracias por la respuesta
Mc Guiver
-
Que tal Mc guiver!
Si utilizas un pic con entradas analogicas como por ejemplo el pic16f877, este al al momento de energizarlo o cuando se produzca un reset, tendra sus entradas en modo analogico, por defecto, en el caso del pic16f877 sera el puerto a y el e :mrgreen:
Si quieres que funcionen como entrada digitales debes configurarlas para ello, a traves del regitro adcom para este pic :mrgreen:
Siempre lee el data sheet para ver cuales registros debes modificar para obtener entradas analogicas o digitales
Saludos
-
Ralf tiene razón, al momento de un reset el valor que toma por defecto el ADCON1 es 0x00, así que se configura todas las entradas como analógicas. No obstante, si estás trabajando con PBP, no tienes que definir nada, al usar la entrada como digital, él hace las configuraciones necesarias para que sea así. Diferente a si trabajas con ellos como puertos analógicos, ahí si tienes que definir el ADCON1 y ADCON0 para decirle al compilador cuáles serán analógicas y cuáles digitales.
Tengo tiempo que no trabajo con el basic, pero cuando lo hacía, si usaba el PORTA como digital creo recordar que nunca declaré el ADCON1 y funcionaba perfecto como digital.
En todo caso el maestro Lafebre puede corregirme si estoy equivocado o hacer alguna aclaratoria.
Saludos, nos leemos! :mrgreen:
-
hola como estas no se si podrias ayudarme con las funciones matematicas de SENO Y COS para un pic 16f877.............
como almaceno la informacion en la memoria EPROM de pic con todos los decimales....
por fa es de urgen...
de ante mano gracias
-
Gracias ralf2 lo veré en el datasheet.
Mc Guiver
-
Hola chicos, un saludo desde Barcelona España.
les pongo un ejemplo que he desarrollado para el control de 4 servos. No se si se me ha escapado algo por que no puedo probarlo aun, empeze hace 3 dias y esto es lo que he sacado en claro. Espero que me corrijan si no esta todo bien.
Por cierto, la pagina esta mas tiempo caida que funcionando o es que quizas se sature con tanta gente?
Ahi va el codigo.
DEFINE OSC 4 ' Para trabajar con un cristal de 4MHz
wsave VAR BYTE $20 system ' Guarda el registro W
ssave VAR BYTE bank0 system ' Guarda el registro STATUS
psave VAR BYTE bank0 system ' Guarda el registro PCLATH
' Aqui van las demas variables a usar
servo1 var byte
servo2 var byte
servo3 var byte
servo4 var byte
contador var byte
INTCON.2=0 'apagar flag de desbordamiento
T0CON.7=0 'Timer apagado
TMR0H=0
TMR0L=5 'Faltan aun 250 ciclos para que desborde. 4 instrucc por ciclo a 4 MHz es 1MHz = 1us 250 * 80 = 20ms
T0CON.6=1 '8 bit mode
T0CON.5=0 'Reloj interno
T0CON.4=0 'Flanco de subida
T0CON.3=1 'Sin prescale
T0CON.2=0 'Prescale
T0CON.1=0 'Prescale
T0CON.0=0 'Prescale
contador = 0
TRISB = %11111111 'Entradas
TRISC = %00000000 'Salidas
pause 250
goto inicio
' SUBRUTINAS DE EJECUCION
posini:
servo1 = 150 '150 es un pulso de 1,5 milisegundos
servo2 = 150
servo3 = 150
servo4 = 150
resume
'********************* Vector de Interrupcion****************** (esto lo saque de un foro, siento no acordarme de quien lo puso)
DEFINE INTHAND Int_Vector ' Handler de Interrupcion
ASM
Int_Vector
MOVWF wsave ; Guardamos el registro W
MOVF STATUS,W
CLRF STATUS ; Guardamos el registro STATUS
MOVWF ssave
MOVF PCLATH,W ; Guardamos el registro PCLATH
MOVWF psave
CLRF PCLATH
ENDASM
;*****************Codigo de interrupcion**********************
if contador < 80 then 'se tiene que desbordar el timer0 80 veces para ser 20ms
contador = contador + 1
TMR0H=0
TMR0L=5 'volvemos a cargarle 5 para que falten 250
else
pulsout PORTC.0, servo1
pulsout PORTC.1, servo2
pulsout PORTC.2, servo3
pulsout PORTC.3, servo4
contador = 0
TMR0H=0
TMR0L=5
endif
ASM ;****** Fin de Interrupcion ***********
End_Int
CLRF STATUS
MOVF psave,W
MOVWF PCLATH ; Restauramos el registro PCLATH
MOVF ssave,W
MOVWF STATUS ; Restauramos el registro STATUS
SWAPF wsave,F
SWAPF wsave,W ; Restauramos el registro W
RETFIE
ENDASM
'************************Inicio del Programa*************************
Inicio:
gosub posini
T0CON.7=1 'Arranco timer 0
' aqui meto el codigo que haga variar los tiempos de los pulsos en servo1 servo2 servo3 y servo4
goto inicio
He leido que haciendo la interrupcion con el handler en asm aun estando en un pause 20000 el pic da preferencia a la interrupcion, es eso cierto?
Un saludo y por favor, criticar mi codigo que aprenderemos todos!
EDITO por un problema ortografico...
-
que tal darmoon!
He leido que haciendo la interrupcion con el handler en asm aun estando en un pause 20000 el pic da preferencia a la interrupcion, es eso cierto?
Eso es correcto si la interrupcion es por hardware este salta directamente a la rutina de atencion a la interrupcion, pero si utilizas interrupciones por software y entras en un pause este espera a que termine el pause para saltar a la rutina de interrupcion.
Eso no pasa en proton ahora :mrgreen:
Saludos
-
Hola Ralf,
Me quedo aun con la curiosidad de que le echéis un vistazo al código, es posible que pueda funcionar? compila bien, pero como no tengo ni proteus ni pic ni nada... AUN!
Tengo aun una duda, la rutina de interrupción que he puesto salta con cualquier interrupción que se produzca en el pic verdad? lo que ocurre es que como solo he configurado el timer0 solo existirá esa interrupción no? estoy equivocado?
Un saludo.
-
Que tal darkmoon!
Mira de momento no tengo el pic basic pro instalado en mi maquina para poderlo probar :shock:
Pero veo una cosita :mrgreen:
Los servos no se moveran todos al mismo tiempo, sino que se movera primero el conectado al portc.0 luego el conectado al portc.1 y asi sucesivamente lo que modificara el periodo de la señal del servo :shock: alargandolo.
Saludos
-
Hola Ralf2,
Ya me he dado cuenta de que en el ultimo servo iran los 20ms + la duracion de los tres primeros, pero piensa que el tiempo que pasa a nivel bajo el cuarto servo sera igual que el que pasa a nivel bajo el primero, ya que despues del pulso del primer servo tiene que esperar los pulsos de los otros 3 servos estando el a nivel bajo, lo cual podria llegar a aumentar el periodo de 20ms a 26ms como maximo. Puedo hacer que en vez de 20ms sean 17ms a nivel bajo, y asi con todos los servos al minimo se haran 20ms a nivel bajo y 23 como maximo y teniendo en cuenta que los 20ms es un poco orientativo (de 20 a 30ms los servos funcionan) se podrian llegar a conectar incluso 11 servos al mismo tiempo. Configurando la interrupcion a 10ms + 10ms si todos los servos estan al minimo = 20ms de nivel bajo y si todos van al maximo serian 10ms de la interrupcion + 20ms = 30ms ya rozando el maximo!!
Madre mia que ladrillo!!! Lo leo yo mismo y casi no lo entiedo!! :D :D :D
Bueno, un saludo y gracias por leer.
-
Por cierto Ralf2, tengo que comprarme un Pic y quisiera que me aconsejaras por un PIC18 de 40 pines (pa no quedarme sin señales, jeje) que vaya bien para mover estos servos, me da igual si es el mejor o el peor, quiero uno que me funcione bien y que sea un poco actual, es que yo me pierdo entre tantos datos del datasheet...
Cuando tenga el primero ya probare de ver que diferencias hay entre uno y otro...
Ah, tengo el JDM plus para "quemarlo", esta bien?
Un saludo.
-
Que tal darkmoon!
Bueno amigo no se como estes con tus conocimientos en microcontroladores pic, pero sino sabes programar en asembler, primero te recomendaria que empezaras por alli, esto porque segun yo :mrgreen: el asembler te permite conocer bien como opera el pic internamente, en cuanto a sus registros, timer ...
Si es asi puedes utilizar un pic menos potente que uno de la serie p18, ese puede ser por ejemplo el pic16f877A que es de 40 pines y hay mucha informacion sobre el :mrgreen:
Si estas claro con el asembler y quieres dar el paso a uno mas avanzado, puedes utilizar por ejemplo el pic18F452 que es parecido a la serie pic16F877A, pero con las ventajas de la serie P18 :mrgreen:
Luego te puedes meter con otros pic mas avanzados como el pic18f2550 que tiene un puerto USB o cualquier otro
Saludos
-
Estimados piclisteros:
Tengo un pequeño problema con los pics, es que cuando los conecto a un pak de pilas de 5 voltios, no siempre arranca como debería arrancar. Por un lado hice una selectora de colores con 4 servos de aeromodelismo y hay veces que los servos trabajan lentos y hacen cualquier cosa,para correjir esto lo desconecto, espero unos segundos y al volver a conectar arranca bien.La alimento con una fuente de computadora que por lo visto anda bien.Fuciona de la siguiente manera: Tengo una torre con cubos de madera de distintos colores ubicados en forma aleatoria, un servo se encarga de ponerlos en una cinta transportadora, y depende el color , en el final de la misma una plataforma movil los selecciona en una caja con cuatro divisiones ubicando cada color en su lugar.Un quinto color, el blanco, lo despide por uno de los costados del la cinta transportadora.
Tambien hice un semáforo de 4 vias con leds, con este nunca tuve problemas.Siempre arranca bárbaro.
Y por ultimo hice un autómata con 6 salidas a relé y seis entradas (como para comandar electroválvulas neumáticas o demas elementos,doy clases de taller en una escuela técnica). El problema con éste último es que me pasa lo mismo que con la selectora, pero a demas, cuando conecto los 24 voltios de las válvulas a los relés, queda activa (encendida) una de las salidas que no debería, pero eso último no me preocupa tanto, lo que si me preocupa es el arranque del pic.
Si alguien me puede dar una mano desde ya muchísimas gracias.
Prometo subir el programa de la selectora y un video de la misma. un abrazo para todos
Mc Guiver
-
Saludos! Tienes habilitado el PUT?
-
Buenas... Tengo unas pequeñas dudas. con respecto al Ejemplo de las luces del cocneh fatastico
yo se hacerlas pero de otra manera. como tu colocas aki este codigo
i var byte
cont var word
TRISB=0
inicio:
cont=1
for i=1 to 7
PORTB=cont
pause 100
cont=cont*2
next I
for i=1 to 7
PORTB=cont
pause 100
cont=cont/2
next I
goto inicio
end.......
ok ahora cuando dicent Cont=1. aque se refiere. si arriba dice que Cont Var Word
bueno en si jajaja no entiendo muchas cosas del codigo. si me lo podrian explicar please!!! Gracias de Ante Mano!!!
-
Hola jhonathanve, antes que nada te recomiendo leas el manual de PBP y la ayuda sobre cada comando, asi sera mas facil que logres hacer tus proyectos o bien entender la sintaxis del compilador.
Lo que hace el programa es poner el valor de la variable CONT en el PORTB, cont toma el valor de 1 y al entrar en el for es multiplicado por 2 para tomar los valores 1,2,4,8...etc, despues este valor es divido por dos para regresar los valores.
La variable CONT es tipo declarada tipo WORD lo que significa que puede tomar valores entre 0 y 65535, si fuera byte tomaria valores entre 0 y 255
-
Buenas... Tengo unas pequeñas dudas. con respecto al Ejemplo de las luces del cocneh fatastico
yo se hacerlas pero de otra manera. como tu colocas aki este codigo
i var byte
cont var word
TRISB=0
inicio:
cont=1
for i=1 to 7
PORTB=cont
pause 100
cont=cont*2
next I
for i=1 to 7
PORTB=cont
pause 100
cont=cont/2
next I
goto inicio
end.......
ok ahora cuando dicent Cont=1. aque se refiere. si arriba dice que Cont Var Word
bueno en si jajaja no entiendo muchas cosas del codigo. si me lo podrian explicar please!!! Gracias de Ante Mano!!!
Hola jhonathanve para que entiendas mejor el codigo simulalo en proteus y asi tambien te daras cuenta de lo que hace cada comando pero como ya te explico navismo lo mejor es que te leas la ayuda del compilador y ves la sistaxi de de cada cosa y asi estaras mas claro de lo que hace ese codigo.
Saludos.
Atten.
Alexander Santana.
Barcelona-Venezuela.
-
Estimado Firepic:
¿Me podrias decir que es el put?, como verás no tengo la mas pálida idea de que es eso jejee. lo busque en el datasheet y no vi nada relacionado con el put
saludos
Mc Guiver
-
Qué tal Mc Guiver!
PUT son las siglas de "Power Up Timer"... es parte de los fuses, cuando programas está en las opciones...
Yo siempre lo colocaba, sin saber qué era... aquí aprendí que lo que hace es un retardo para permitir que la alimentación se estabilice, y entonces arranca el programa... pero para sistemas muy inestables tal vez sea mejor adicionarle un retardo mayor antes del programa principal que se ejecutará indefinidamente...
Son solo sugerencias, en realidad yo tuve problemas parecidos a los tuyos cuando trabajaba en ASM, luego cuando me cambié a C no volvió a pasar... supongo que las rutinas que coloca el C antes del programa principal, que es parte de las definiciones del programa, hacen un retardo que viene como anillo al dedo (es lo que deduzco, si estoy equivocado por favor sírvanse aclarar los expertos).
Un cordial saludo a todos, nos leemos! :mrgreen:
-
Gracias Firepic por tu respuesta, lo voy a poner en práctica y despues te comento.
un abrazo
Mc guiver
-
Hola Firepic, de vuelta yo... Mc Guiver
Estuve mirando el datasheet del pic y algo encontré.Cuando en una oportunidad tuve que configurar entradas como analógicas o digitales lo hacía con el comando CMON1=%0000000 depende el valor del numero binario decidía cuales como analogicas y cuales como digitales.El tema es que si bien encontré una tabla,lo que no encuentro es el comando para configurar el "PUT" o tambien vi que le llaman "POR".
¿Me podrias escribir un simple ejemplo? te lo agradesco
Mc Guiver
-
Ese valor lo puedes configura desde el grabador como el winpic800 aparece como PWRT
-
Gracias muchachos por su atención: comento que ya solucionè el problema del arranque, lo que tenia que hacer en el programa es: una vez definidas las entradas y las salidas y las declaraciones de las variables poner todos los puertos a cero con el comando portx=0 y luego la etiqueta de comienzo.
ej:
trisa=%11111111
trisb=%00000000
cat var byte
dog var word
PORTA=0
PORTB=0
PORTC=0 (si es que tiene puerto C)
inicio:
high 7
etc........
Porque según tengo entendido, cuando se lo alimenta, manda ceros y unos hasta que se estabiliza, por lo tanto tambien lo hace con los puertos y de esa manera enciende pines que no los deberia encender .
Gracias por sus sujerencias
nos escribimooooossssss
-
Qué tal Mc guiver... había estado un poco desaparecido del foro por ciertas circunstancias personales, me alegra regresar y ver que resolviste el problema! Y gracias por compartirlo con la gente de acá, seguro le será muy útil a muchos.
Saludos, nos leemos! :mrgreen:
-
Hola amigos de todopic: quisiera hacerles una consultita, estoy trabajando con el conversor S/D y quiero mostrar el resultado en displays de 7 seg. pero necesito transformar los números de binario a BCD. Lo realice contando así:
Contar:
unidad=0
decena=0
For cont=1 TO conv
unidad=unidad+1
IF unidad>9 THEN
decena=decena+1
unidad=0
ENDIF
Pero pienso que para números muy grandes es poco practico. Existe algun comando en PBP o alguna forma mas corta de hacerlo? solo eso, saludos y gracias de antemano, adios ;)
obs: conv es la variable en la que guarde lo leido en el conversor A/D.
-
Estimado Rasec:
En lo que si te puedo ayudar es en visualizar una variable o una constante, o minutos o segundos lo que se te ocurra en un LCD me parece que es mucho mas facil que en un display de 7 segmentos y es alfanumérico,o sea que podes hacer que muestre palabras y cifras por ejemplo: Variable cuenta= 34 .Es un poco mas caro pero es un caño, yo lo probé y está re bueno, Solo tenés que usar el comando lcdout.
Saludos
Mc. Guiver
-
Hola amigos del foro.
Estoy haciendo un programa en picbasic pro 2.46, y lo que sucede es que cuando deseeo empotrar codigo en assembler, mas especificamente rutinas de conteo, me las lee pero si el código es pequeño y un número de variables menores a las que el pic puede recibir, estoy utilizando el PROTEUS para simular y el pic es un 16f628A.
Por ejemplo el contador:
@ movlw 0x7
@ movwf _B4 'B4 VAR BYTE, asi definí la variable B4
@For_PDU
HSEROUT [#B4,13,10]
@ decfsz _B4, 1
@ goto For_PDU
si el programa es pequeño asi como sus variables en el proteus aparece: 1 2 3 ... 7, pero si es al contrario, esto es el resultado: 0 0 0...0 (muestra 7 ceros).
No se si el problema es mi codidigo o el simulador,gracias, espero sus recomendaciones.
-
podrias probar colocando asm, tu rutina y al final endasm
-
podrias probar colocando asm, tu rutina y al final endasm
Gracias por responder tan rapido pero me gustaria intercalar comandos de asm, con los de picbasic, si te fijas tengo un hserout, en medio del contador hecho en asm, lo que deseo hacer es reducir los for, while y until del picbasic que pueden consumir mucho espacio.
Lo que me parece raro es que funciona, solo si tengo pocas variables y pocas funciones, de lo contrario me trata el _B4 en asm con el B4 de picbasic como si fueran diferentes variables.
-
hola señores
estoy siguiendo sus ejemplos en pic basic.
hasta ahora todo bien,pero me surge una duda a la hora de hacer una aplicacion.
quiero tener un potenciometro conectado a un 16f627a ,de manera que cuando gire ese potenciometro me lo indique en dos digitos de 7 segmentos desde 1 a 99, esto debe de corresponder al porcentaje de modulacionn de un pwm que lo utilizo directamente del pic con el comando hpwm, es decir, con el pot a minimo tengo un 1% de ancho de pulso y con el pot en el otro xtremo tengo un 99% de encho de pulso, y debo de poder leerlo en el display.
alguna ayuda?
me gustaria verlo de dos formas, uno sin interrupciones y otra forma utilizando interrupciones si es posible.
Gracias
-
Estimado Terrapiqui:
Si no puedes hacer funcionar la lectura del potenciómetro para enviarla a una variable, prueba con cambiar el pic con uno con entradas analógicas, por ej el 16f873, el 16f876 o creo que tambien el 16f819 tambien tiene, por las dudas consulta con la hoja de datos.El 16f627 tiene por lo que tengo entendido comparadores analógicos, lo que verifica es cual de dos entradas es mayor que la otra.
A mi me pasó algo parecido, quería hacer encender tres leds de a uno dependiendo de la posición de un potenciómetro.
Ejemplo de programacion:
Define ADC_BITS 8 '
DEfine ADC_CLOCK 3
Define ADC_SAMPLEUS 50
TRISA = %11111111 'defino puerto A como entradas
TRISB = %00000000 'defino puerto B como salidas
adcon1=%00000010 'acá defino que pines trabajarán como analógicos y cuales como digitales,(ver hoja de datos del 16f873a)
dog VAR byte
main:
adcin 0,dog ‘potenciómetro conectado a pin 0 del Puerto A (analógico)
if dog<80 then
portb=%00000001 ‘led rojo
endif
if dog>80 and dog<160 then
portb=%00000010 ‘led amarillo
endif
if dog > 160 then
portb=%00000100 ‘led verde
endif
goto main
No es exactamente lo que buscas pero espero que te sea de utilidad.
Saludos
Mc Guiver :-/
-
hola LordLafebre, una pregunta manejas el protocolo i2c, soy nuevo en el foro :-/, y me gustararia saber como puedo comunicar 2 micros atraves de este protocolo si pudieras ayudarme te lo agradeciria salu2. :)
-
Buenas a Todos pues aqui. esta mi primer aporte productivo al foro. esto es el fruto de unas clases que me esta dando m amigo carlos de peru..
pues este es un comando basico. es encender y apagar un led cada segundo pero de ora manera , con el codigo STEP
define osc 4 ;defino el oscilaodr
cmcon=7 ;covierte todos los puertos en digital
i var byte ; una variable de 255
inicio
high 1 ;encender el pin menos significativo
gosub tiempo ; gosub llama a una Subrutina
low 1 ;apaga el pin
gosub tiempo ; gosub llama a una Subrutina
goto inicio ; el bucle infinico
tiempo: ;La subrutina.
for i = 1 to 10 step 1; aqui el hace 10 pasos cuando los hace cambia
pause 200 ;el estado del pin. espero sirva de ayuda
next i
return
-
i var byte
j var byte
unidad var byte
decena var byte
TRISB=0
main:
for i=0 to 99
for j=0 to 99
unidad = i dig 0
portb = unidad + 16
pause 5
decena = i dig 1
portb= decena + 32
pause 5
next j
next i
goto main
end
El codigo es sencillo, esta formado por dos bucles, el primero que es de donde a donde va el contador (0-99) y el segundo bucle es el tiempo que quieres que permanesca visualizado el valor en el display, utilizo la funcion DIG para cojer el digito correspondiente, y le sumo 16 ó 32 para activar el display correspondiente para formar el número.
Cuelaquier cosa me comentas, si no esta claro te lo explico mejor.
Suerte...!!! ...
Buenas.. alguien me podria explicar exactament el codigo dig. xq estaba viendo y no entiendo es nada.. jajaja suerte saludos
-
Hola jhonathanve, es conveniente que postees tu duda en un hilo nuevo, ya que este es de ejemplos y estas haciendo consultas.
Además al momento de citar ejemplos indicalos para poder entender tu post.
Saludos :)
-
Estimado Terrapiqui:
Si no puedes hacer funcionar la lectura del potenciómetro para enviarla a una variable, prueba con cambiar el pic con uno con entradas analógicas, por ej el 16f873, el 16f876 o creo que tambien el 16f819 tambien tiene, por las dudas consulta con la hoja de datos.El 16f627 tiene por lo que tengo entendido comparadores analógicos, lo que verifica es cual de dos entradas es mayor que la otra.
A mi me pasó algo parecido, quería hacer encender tres leds de a uno dependiendo de la posición de un potenciómetro.
Ejemplo de programacion:
Define ADC_BITS 8 '
DEfine ADC_CLOCK 3
Define ADC_SAMPLEUS 50
TRISA = %11111111 'defino puerto A como entradas
TRISB = %00000000 'defino puerto B como salidas
adcon1=%00000010 'acá defino que pines trabajarán como analógicos y cuales como digitales,(ver hoja de datos del 16f873a)
dog VAR byte
main:
adcin 0,dog ‘potenciómetro conectado a pin 0 del Puerto A (analógico)
if dog<80 then
portb=%00000001 ‘led rojo
endif
if dog>80 and dog<160 then
portb=%00000010 ‘led amarillo
endif
if dog > 160 then
portb=%00000100 ‘led verde
endif
goto main
No es exactamente lo que buscas pero espero que te sea de utilidad.
Saludos
Mc Guiver
Gracias Mc Guiver por tu respuesta, probare con lo que me dices pero creo de esta manera lo que hago es comparar 3 señales si no me equivoco, yo lo que pretendo es simplemente poder leer directamente la posicion del potenciometro en un display, que me lea desde 1 a 99.
pero tu informacion me aporta mucho ya que lo que tu codigo es bastante claro y depurado, me puede servir como ayuda.
-
Estimados piclisteros:
Estoy tratando de compilar un programita en pbp de sólo hacer encender y apagar un led con un pic 16f819. Lo que quiero es usar el oscilador interno del mismo, según el datasheet tengo que confifurarlo con OSCCON=%01100000 (para 4mhz), pero cuando lo compilo es como que no reconoce el comando osccon. Alguien me puede sacar de la duda? se los agradeceré.
Atte.
Mc Guiver
-
Hola muy bueno tu dolor de cabeza. Te escribo para preguntarte si tendrás este mismo programa pero en mplab ó .asm. Gracias.
Contribuyo con un circuito que me dio dolores de cabeza.
PIC 12F675
1 Potenciometro conectado a GPIO 0 (AN0)
4 Leds en los puertos GPIO 1, 2, 4, 5 .
De a cuerdo a la posicion del potenciometro se van prendiendo los leds.
Adjunto archivo y simulacion. Probado fisicamente , luego de varios meses que programo un pic. :(
Saludos
-
Bueno...después de investigar un buen rato he descubierto como configurar el pic 16f819 para hacerlo trabajar solo con oscilador interno y acá va el programita de prueba:
trisa=%00000000
trisb=%00000000
@device pic16f819, intrc_osc 'defino para trabajar con oscilador interno
OSCCON=%01100110 'defino la frecuencia del oscilador (en este caso 4mhz)
'(ver datasheet del pic)
inicio:
y acá el programa que se les ocurra
saludos
Mc. Guiver
goto buena suerte
Espero que sea de utilidad.
-
buenas!!! q tal, soy muy nuevo en esto de los pic! Arranque hace un tiempito a hacer pequeñas cosas, hasta el punto q logro hacer programas q en el simulador han funcionado, obviamente los de los led, llegando hasta algun motor de paso, cosas que no tienen mas misterio que designar las entradas y salidas del pic! Trabajo el 16f628a. Recien antes de ayer fui a grabar uno con un programa que enciende 3 leds para probar en protoboard. El tema es, que no me funciona, yo le puse un cristal de 4 mhz en las patas 15 y 16, pero por lo que se este pic tiene oscilador interno, el tema es, como configuro que oscilador voy a usar??? Aclaro que uso lenguaje basic! Segun he visto algo, seria "define OSC 4", pero mas allla de esto, el pic sigue sin funcionarme! agradezco cualquier ayuda! saludos
-
buenas!!! q tal, soy muy nuevo en esto de los pic! Arranque hace un tiempito a hacer pequeñas cosas, hasta el punto q logro hacer programas q en el simulador han funcionado, obviamente los de los led, llegando hasta algun motor de paso, cosas que no tienen mas misterio que designar las entradas y salidas del pic! Trabajo el 16f628a. Recien antes de ayer fui a grabar uno con un programa que enciende 3 leds para probar en protoboard. El tema es, que no me funciona, yo le puse un cristal de 4 mhz en las patas 15 y 16, pero por lo que se este pic tiene oscilador interno, el tema es, como configuro que oscilador voy a usar??? Aclaro que uso lenguaje basic! Segun he visto algo, seria "define OSC 4", pero mas allla de esto, el pic sigue sin funcionarme! agradezco cualquier ayuda! saludos
Algo tarde la respuesta vdd? :mrgreen:
En fin. El problema que tienes a mi experiencia va a ser una de estas cosas:
1.- Estas usando RA5 como salida siendo que ésta solamente puede ser entrada
2.- debes deshabilitar los comparadores con CMCON=7 (aunque no creo :? )
3.- Te falta poner una Resistencia de Pul-up a la R5 para el Mater Clear Reset. Hay forma de deshabilitarlo desde el programa pero que mejor que tenga reset el pic.
Bueno, espero haberte ayudado en poca o gran medida, saludos.
-
Me gustaria sacar por el puerto B0 una señal de 1 MHz y simultaneamente por el puerto B1 un tren de impulsos por ejemplo 101, para que una vez los tenga se sumen en una puerta AND y obtener asi una portadora de 1MHz modulada por el tren de impulsos.
Utilizo la instruccion PWM portb.0,50, 25 para la portadora de 1 MHz (con el reloj interno del 16f628a a 4 MHz)
Como seria el codigo complet, pues he realizado varias pruebas y primero me genera 1 MHz y una vez terminado de generar, empieza con el tren de impulsos, con lo cual nunca tengo las dos señales simultaneamente. Necesito una ayuda
-
que tal quisiera q me ayudaras con un proyecto ingresar mensajes con un teclado telefonico osea si doy click en el nro 2 debe salir el "2 "si denuevo vueelvo hacer click que salga la letra "a" asi como ingresar mensajes con un celular , ayuda en PBP o en microcode con proteus
-
Hola a todos en el foro, disculpen tengo una duda para ver si me pueden ayudar, ya revise en el foro y creo que a nadie se le a pressentado este caso.
quiero saber como puedo "transformar" un string en decimal en el PBP, ya que de una palicacion en java envio datos numericos, el detalle es que me los envia en string y posteriormente en el microcontrolador PIC16F877 necesito transformar estos string recibidos en decimales y no se que funcion del PBP lo hace. Agradeceria mucho su ayuda o cualquier comentario al respecto.
-
Hola. Mi estimados master Lordlafebre de PBP.
Estoy trabajando en un proyecto de contador de monedas, me llega una señal digital al puerto A.0 al A.3 y con eso determino que moneda es y la cuento
Escribo para pedir ayuda. ya estoy a punto de tirar la toalla y renunciar a los PIC.
El problema que tengo es que no puedo leer la señal de entrada de PIC16F876A en el Puerto A.0 al A.3 y con esta señal. Tengo entendido que el puerto A tiene aplicaciones analógicas y que lo tengo que poner a digital, y que tengo que definir si es de entrada o salida. Estoy seguro que en esta parte esta mi error porque esta misma practica ya la logre pero con el puerto B del mismo PIC recibiendo las señales en el B.0 al B.3 y todo camino OK
Tengo un Oscilar de 4Mhz Externo y estoy programando con un MasterPorg.
Anexo mi programa en MicroPICBASIC. Saludos y muchas gracias de antemano por la ayuda que me puedan brindar.
TRISA = 1 ;defino el puerto A como entradas (0= Salida, 1=Entrada)
ADCON1 = 7 ; Apaga los comparadores de voltaje
@ device XT_OSC
@ device WDT_OFF
@ device PWRT_ON
define osc 4
uno var porta.0 ; chanel 1
dos var porta.1 ; chanel 3
cinco var porta.2 ; chanel 4
diez var porta.3 ; chanel 6
x var BYTE
define LCD_DREG PORTc ;define los bit de Datos para el LDC en el Pto C
define LCD_DBIT 4 ;empesando por el C4 al C7
define LCD_RSREG PORTc ;define el bit de Registro del LCD en el Pto C.2
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTc ;define el bit de Enable del LCD en el Pto C.3
DEFINE LCD_EBIT 3
Inicio:
clear
lcdout $FE, 1
x = 0
display:
lcdout $FE,1
lcdout $FE, $80, "CUENTA MONEDAS"
pause 50
espera:
if uno = 0 then goto cuentauno
if dos = 0 then goto cuentados
if cinco = 0 then goto cuentacinco
if diez = 0 then goto cuentadiez
goto espera
cuentauno:
gosub norebote
x = x + 1
gosub imprime
goto espera
cuentados:
gosub norebote
x = x + 2
gosub imprime
goto espera
cuentacinco:
gosub norebote
x = x + 5
gosub imprime
goto espera
cuentadiez:
gosub norebote
x = x + 10
gosub imprime
goto espera
imprime:
pause 25
lcdout,$FE, $C1
lcdout, "$ ", dec x, ".00 pesos"
return
END
norebote:
if uno = 0 then norebote
if dos = 0 then norebote
if cinco = 0 then norebote
if diez = 0 then norebote
pause 25
return
-
estoy asombrado :-/ por los temas aqui en el foro se ve que dominan los temas espero aprender mucho de ustedes
-
alguien podria tener un ejemplo de como poder hacer un temporizador programable yo lo adaptare a mis necesidades
-
HOLA AMIGO TENGO UNA DUDA Y NECESITO DE SU AYUDA.
EL PROGRAMA QUE ESTOY UTILIZANDO ES PBP Y MI DUDA ES
TENGO DOS CONTADORE (A Y B) SI SUMO A+B OPTENGO C OK
LO QUE QUIERO SABER ES COMO HACERLE PARA SI YO VARIO (A O B) NO
VARIE C AL FINA YO QUIERO TENER 2 RESULTADOS PARA COMPARARLOS
(EL RESULTADO DE ENTRADA Y DE SALIDAD). GRACIAS POR SU ANTENCIO
-
HOLA AMIGO TENGO UNA DUDA Y NECESITO DE SU AYUDA.
EL PROGRAMA QUE ESTOY UTILIZANDO ES PBP Y MI DUDA ES
TENGO DOS CONTADORE (A Y B) SI SUMO A+B OPTENGO C OK
LO QUE QUIERO SABER ES COMO HACERLE PARA SI YO VARIO (A O B) NO
VARIE C AL FINA YO QUIERO TENER 2 RESULTADOS PARA COMPARARLOS
(EL RESULTADO DE ENTRADA Y DE SALIDAD). GRACIAS POR SU ANTENCIO
Hola, lo que puedes hacer es usar 2 variables en las cuales guardas los resultados para luego compararlos.
saludos
-
Hola... Disculpen soy nuevo en esto de programar microcontroladores, usando el proteus hice el primer esquema que esta en los ejemplos..mi duda es donde coloco el archivo o el codigo que ustedes citan. es decir tengo que abrir un compilador? si es asi donde lo encuentro. Gracias =)
-
que tal quisiera q me ayudaras con un proyecto ingresar mensajes con un teclado telefonico osea si doy click en el nro 2 debe salir el "2 "si denuevo vueelvo hacer click que salga la letra "a" asi como ingresar mensajes con un celular , ayuda en PBP o en microcode con proteus
Que tal mi amigo, para realizar lo que deseas primero que nada, y antes de empezar con la programacion debes de saber hacer el hardware, la parte electronica, para poder decodificar los codigos o tonos DTMF del telefono, necesita el decodificador, uno que yo utilizo es el DTMF8807, este ingresa los dos cables de la linea telefonica y por sus cuatro salidas esas las mandas a un puerto de tu microcontrolador, y necesita un enable para saber cuando se presiono una tecla, una vez esto y probado haces una prueba con tu micro.
Debes de dar como entrada un puerto ya sea el a o b, por ejemplo, y le dices que si enable es = 1 leer el puerto y el DTMF se encarga de decodificarlo, tu solo dile al programa si quieres que te lo muestre en decimal, binario, etc. actualmente estoy trabajando en una tarjeta que me permita controlar cargas cuando yo le realizo una llamada, osea que el micro me pueda descolgar la linea, mandar tonos para saber que entro y con una tecla activar cargas con relay,
espero poder ayudarte, estamos para ayudarnos y aprender, saludos desde Mexico
-
he hecho un pequeño programita que dependiendo del numero que tengamos en el display se enciende los led en varias secuencias.
lo hice con un 16f877 y un 7447 en d0 un boton en c7 y los led en b
tiene solo un pequeño fallo que al arrancar se encienden los led pero luego ya nunca vuelva a pasa, si sabeis solucionarlo los pedieis poner por favor
este es el programa:
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Alberto Pumar *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 17/01/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
trisd=%11110000 ;hacemos d0-4 salidas
trisb=0 ;puerto b todas salidas
numero var byte ;numero vale hasta 255
flag var bit ;flag vale hasta 255
z var byte ;z vale hasta 255
x var byte ;x vale hasta 255
led var portb.0 ;led en b1
led1 var portb.1 ;led1 en b1
led2 var portb.2 ;led2 en b3
led3 var portb.3 ;led3 en b3
led4 var portb.4 ;led4 en b4
bot var portc.7 ;boton en c7
encerar: ;subrutina
numero=0 ;cargamos numero inicialmente con 0
display: ;subrutina
portd=numero ;por d sale el valor del numero
if bot=0 then aumentar ;si pulsamos el boton aumentamos un numero
pause 80 ;pausa
flag=0 ;bandera para rebotes
goto display ;vuelve a display
aumentar: ;subrutina
if flag=1 then goto display ;si el boton esta pulsada no cuenta
flag=1 ;bandera antirebotes
if numero=9 then encerar ;si llega a 9 vuelta a 0
numero=numero+1 ;sumar 1 a numero
inicio: ;subrutina
z=numero ;z vale el numero del display
select case z ;se encienden leds dependiendo numero display
case is <3 ;si el numero es menor que 3
for x=0 to z ;se encienden d0 a d4 de 0 al numero
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 ;si el numero es 4
for x=0 to 4 ;se enciende led3 5 veces
high led3
pause 50
low led3
pause 70
next ;si numero es mayor que 8
case is >8 ;se enciende led1 y 2 de 3 al numero de la pantalla
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 ;vuelve al inicio
end
-
Tienes que hacer que el puerto implicado tome valores por defecto, esto se hace después de su configuración, por ejemplo para el puerto B, después de la línea que contiene TrisB, se coloca PortB con la configuración que desees de sus pin.
-
tengo otro nuevo programita es un termostato variable con lm35, tiene una temperatura minima y otra maxima programadas y si la temp actual es mas baja que la baja se enciende el relecalefactor y con la temperatura alta al reves con un16f877
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Alberto Pumar *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 02/01/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
define LCD_DREG PORTD ;define pines del lcd de b4 a b7
define LCD_DBIT 0 ;empezando desde el puerto b4 a b7
define LCD_RSREG PORTD ;define el puerto b para acceder al bit RS
define LCD_RSBIT 4 ;este es el puerto b3
define LCD_EREG PORTD ;define el puerto b para conectar el ennable
define LCD_EBIT 5 ;este es el puerto b2
define adc_bit 8 ;fijar nº bits resultado (5,8,10)
define adc_clock 3 ;fijar el clock (rc=3)
define adc_sampleus 50 ;nº seg fijar canal y comenzar conversion a/d
trisa=%1 ;el puerto a0 es de entrada
adcon1=%00001110 ;el puerto a0 es el a/d los demas digitales
dato var word ;dato vale hasta 6500
temp1 var word
tempbaja var byte ;temperatura baja bale hasta 255
tempalta var byte ;temperatura alta bale hasta 255
eeprom 0, [20,24] ;guardar valores de temperatura de 20 y 24
x var byte ;x vale hasta 255
g con 223 ;este es el ascii de grados
relef var portb.0 ;rele calefactor en d2
relec var portb.1 ;rele enfriador en d3
led var portb.2 ;led en d4
botenter var portb.3 ;enter en d5
botbaja var portb.4 ;boton bajar temperatura en d6
botsube var portb.5 ;boton subir temperatura en d7
inicio: ;subrutina para indicar procesador funciona
for x=1 to 3 ;repetir 3 veces
high led ;encender led
pause 200 ;esperar 200 ms
low led ;apagar el led
pause 200 ;esperar 200 ms
next
read 0,tempbaja ;leer en lugar 0 de eepron y dato guarda en tempbaja
read 1,tempalta ;leer el lugar 1 de eepron y dato guardar en tempalta
lcdout $FE,1 ;limpiar pantalla lcd
lcdout $FE,2,"T.mi T.act T.max" ;sacar ese texto por la primera linea lcd
sensar: ;subrutina
adcin 0,dato ;leer a0 y guardar en dato
temp1=150*dato/77 ;el resultado es este
lcdout $FE,$c6,dec3 temp1,g,"C" ;sacar por la segunda linea el valor de temperatura ambiente
lcdout $FE,$c0,dec3 tempbaja,g,"C" ;sacar por la segunda linea el valor de temperatura minima
lcdout $FE,$cc,dec3 tempalta,g,"C" ;sacar por la segunda linea el valor de temperatura maxima
for x=1 to 50 ;repetir 50 veces
if botenter=0 then grabar1a ;si el boton grabar esta pulsado ir a grabar tempertura
pause 10
next
if temp1<tempbaja then calentar ;si el dato temp1 es < que la temperatura minina ir a sub calentar
if temp1>tempalta then enfriar ;si el dato temp1 es> qaue la temperatura maxima ir a sub enfriar
low relec:low relef ;apagar los dos reles
goto sensar ;continuar sensando
calentar:
high relec:low relef ;encender relecalentar y apagar rele enfriar
goto sensar
enfriar:
high relef:low relec ;encender releenfriar y apagar relecalentar
goto sensar
grabar1a:
gosub soltar ;va a tecla antirebote
grabar1:
LCDout $FE,1,"Programar Temperatura..." ;poner en la 1 linea programar temperatura
lcdout $FE,$C0,"Tminima=",dec3 tempbaja,g,"C" ;en la 2 linea sale la temperatura minima en º
pause 100
if botbaja=0 then restar1 ;si se pulsa boton restar va a subrutina restar1
if botsube=0 then sumar1 ;si se pulsa boton subir va a subrutina sumar1
if botenter=0 then grabarA ;si se pulsa boton enter va a subrutina grabara
goto grabar1a ;sigue en la subrutina mientras no se pulse un boton
restar1: ;subrutina restar a la temperatura minina
gosub soltar ;programa rebote tecla
if tempbaja<1 then grabar1 ;si la temperatura minima es <1º va a subrutina anterior
tempbaja=tempbaja-1 ;restar 1 a la temperatura minima
goto grabar1 ;vuelve a subrutina grabar
sumar1: ;subrutina aumentar temperatura minima
gosub soltar ;tecla antirebote teclas
if tempbaja>40 then grabar1 ;si la temp baja minima es>40 ir a subrutina graba1
tempbaja=tempbaja+1 ;sumar 1 a la temperatura minima
goto grabar1 ;vuelve a subrutina grabar1
grabarA:
gosub soltar ;programa antirebote teclas
write 0,tempbaja ;grabar la nuevga temperatura minima en eeprom
grabar2:
lcdout $FE,1,"Programar Temperatura..." ;primera linea sale ese mensaje
lcdout $FE,$C0,"Tmaxima=",dec3 tempalta,g,"C" ;en la 2 linea sale la temperatura maxima en º
pause 100
if botbaja=0 then restar2 ;si pulsamos boton bajar va a subrutina restar2
if botsube=0 then sumar2 ;si pulsamos boton subir va a subrutina subir2
if botenter=0 then grabarB ;si pulsamos boton enter va a subrutina gragarb
goto grabar2 ;sigue en subrutina mientras no se pulse un boton
restar2: ;subrutina restar grados a la temperatura maxima
gosub soltar ;progrma antirebote de tecla
if tempalta<5 then grabarB ;si la temperatura es <5º vs a subrutina grabarb
tempalta=tempalta-1 ;restar 1 a la temperatura maxima
goto grabar2 ;va a subrutina grabar2
sumar2: ;subrutina sumar a la temperatura maxima
gosub soltar ;va a programa antirebote tecla
if tempalta>60 then grabarB ;si la temperatura maxima es>60 ir a grabarb
tempalta=tempalta+1 ;sumar 1 a la temkperatura maxima
goto grabar2 ;va a subrutina grabar
grabarb: ;subrutina grabar temperatura maxinma
gosub soltar ;programa antirebote de teclas
write 1,tempalta ;grabar la nueva temperatura maxima
lcdout $FE,1,"nueva temperatura"
lcdout $FE,$C0,"programada"
goto inicio ;vuelve al inicio del prgrama
soltar: ;subrutian antirebote teclas
high led
pause 150
low led
soltar2: ;continuacion subrutina antirebote teclas
if botbaja=0 then soltar2 ;si boton sigue pulsado seguir en esta subrutina
if botsube=0 then soltar2 ;si boton sigue pulsado seguir en esta subrutina
if botenter=0 then soltar2 ;si boton sigue pulsado seguir en esta subrutina
pause 100
return ;vuelve a subrutina grabar1a
end
:-/
-
hola saludos a todos, recurro a ustedes porque estoy realizando unas practicas de motores a pasos, ya realice la mayoria de las practicas solamente dos no logro conseguir que me funcionen.
pic16f877a
el puerto b.0-b.3 son para el motor pap unipolar
el puerto d se utiliza como entrada
la primera es poder variar la velocidad de un motor a pasos por medio de 2 pulsadores uno para aumentar la velocidad y otro para reducir la velocidad. segun entiendo declaro una variable "x" y le asigo el valor por ejemplo de 130 este valor seria el pause, al apretar el voton de aumentar la velocidad le reduciria 20 a "X" y de esta manera se reduciria el tiempo y esto aumentaria la velocidad, claro que el minimo de la variable seria de 5 y el maximo de 255. lo he estado escriviendo de diferentes formas pero no logro que funciones, si pueden ayudarme se los agradeceria,
el segundo 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 logro que me quede.
de antemano gracias y estare pendiente de sus respuestas
-
Hola alejandro, coloca el codigo con el que pruebas y te recomiendo abras un hilo para tu consulta, se te podra ayudar mejor
saludos
-
hola amigo y si quiero que cuando presione un boton que esta conectado al puerto RA0 un led conectado a RB0 oscile como hago??
-
A todos los amigos principiantes, por favor lean las REGLAS DEL FORO (http://www.todopic.com.ar/foros/index.php?action=globalAnnouncements;id=1).
Busquen en el foro que hay bastantes ejemplos, si necesitan ayuda posteen algun avance que tengan, no pidan que les hagan la tarea.
Abran un hilo para su consulta si no hay alguno que trate de lo mismo (que es mas seguro que exista), ya que se les podra ayudar de una mejor manera.
saludos a todos. :)
-
Amigos tengo un pequeño problema, vivo en costa rica y tengo como proyecto la elaboracion de una alarma de seguridad! el problema esta en q ya logre hacer funcionar el pic16f877a con el lcd 16x4, logre hacer poner lo que yo deseaba! el problema es que tengo que adjuntarle un teclado y no se como programarlo! he buscado en muchos lados y me salen programaciones pero no logro entenderlas bien... seria de gran ayuda si me adjuntaran una programacion de este! programo en PIC BASIC, utilizo un pic 16f877a un teclado 4x3 y un lcd 16x4... gracias de antemano y ojala puedan ayudarme!!
-
ERROR DE SIMULACION?
buenas noches soy principiante y hace poco comenze con pbp recurro a ustedes porque estoy desconcertado , hice un semaforo con una interrupcion y me anduvo, (en el proteus) , ahora no he cambiado nada y no me habilita la interrupcion, ni el MCLR? no entiendo que es lo que paso desde ya muy bueno el temario , e interesante la pagina gracias.
-
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!!!! ... ((:-)) ((:-)) :-/
-
Buen día señores foristas:
Atentamente me dirijo a ustedes para comentarles algunas inquietudes relacionadas, las cuales tal vez surjan a otros usuarios y visitantes.
Pretendo migrar de programar en assembler a Basic. Para tal efecto, Instalé en mi equipol (Windows 7), el Microcode Studio 4 con Pic Basic Pro 247 y MPASM.
Quiero iniciar con el típico programa de prender y apagar un led con un 16f873A que tengo disponible.
El programa en assembler es:
…
…
…
__CONFIG _XT_OSC & _PWRTE_OFF & _BODEN_OFF & _CP_OFF & _WDT_OFF
…
…
…
PTOB_TRISB EQU 0X06
Inic
bsf PTOB_TRISB,0 ;Led On
call Delay
bcf PTOB_TRISB,0 ;Led off
call Delay
goto Inic
Delay movlw D'6'
movwf COUNTERC
movlw D'19'
movwf COUNTERB
movlw D'173'
movwf COUNTERA
loop decfsz COUNTERA,1
goto loop
decfsz COUNTERB,1
goto loop
decfsz COUNTERC,1
goto loop
retlw 0
end
Programo con PICKIT 2 y lo corre perfectamente. La palabra de configuración que toma el programador es: 2F89, la cual coincide con lo programado.
Intento lo siguiente en BASIC:
@DEVICEPIC16F873A
@DEVICEXT_OSC
@DEVICEWDT_OFF
@DEVICEPWRT_OFF
@DEVICEBOD_OFF
@DEVICELVP_OFF
@DEVICEWCPD_OFF
@DEVICEWRT_OFF
@DEVICEDEBUG_OFF
@DEVICEPROTECT_OFF
DEFINE OSC 4
LED VAR PORTB.0
TRISB=0
Vuelve:
Led = 1
pause 1000
LED = 0
PAUSE 1000
GOTO Vuelve
End
Las primeras líneas las escribí así porque al compilar me genera error. En los tutoriales y ejemplos que he visto, se colocan estos bits en un solo renglón separados por coma.
Al fin lo compila y anuncia que lo ha logrado satisfactoriamente.
Al cargar el programa en PICKIT, noto que la palabra de configuración cambia a: 2FCD, cuya implicación es que deja activado el perro guardián y activa también el BOR.
Aún así programo y como es de esperar no funciona.
Varias dudas puntuales:
¿Por qué no puedo escribir dejando espacios después de @DEVICE?
¿Por qué nopo puedo escribir la palabra de configuración en un solo renglón separando los bits de configuración con comas? (He visto varios ejemplos así).
Es posible entonces cambiar la palabra de configuración desde PICKIT
Agradezco sus sugerencias y comentarios.
-
Yo uso el PICkit 3 v3.10 y si que permite cambiar los bit de configuración, el problema es que no indica los nombres de los bit, indica el registro y el peso del bit, así que hay que buscarlos en el datasheets.
Esa opción la tienes en la pantalla principal, si te fijas veras la palabra "Configuration:" subrayado, a mi me sale en un azul tenue.
El proceder para cambiar los bit a mano es el siguiente:
Primero cargas el Hex y luego seleccionas "Configuration:" y abre la ventana con todos los fuses, pulsando sobre ellos los cambias al opuesto.
Con respecto al lenguaje no te puede orientar porque no uso ese lenguaje.
Por ejemplo; en el lenguaje Basic del PSI y en el lenguaje C de CCS que son los que uso, si que el PICkit 3 se configura correctamente con los fuses de forma automática cuando le cargo el archivo .hex.