Curso de programación de PIC en PICBasic Pro

No estas exediendo el limite de memoria de programa lo que pasa es que no te ha de salir por que no te compila eso sale cuando la compilacion fue hecha correctamente, lo mas seguro es que tengas mal algo en el codigo del archivo .PBP, mas si estas usando sentencias con ASM.

Sube el Programa en PBP para checarlo correctamente por que con el EXE no se puede.:unsure:
 
te anexé el codigo en .pbp comprimido en .rar avisame si lo puedes ver....

gracias por tu ayuda----

ahi te va amigo ...el .pbp
 

Adjuntos

  • Untitled.rar
    1.7 KB · Visitas: 92
Última edición:
Un poco de orden en la estructura no estaria mal jejejeje :LOL: ya cheque tu programa estaban mal unas etiquetas las de INICIAR3 y 2 utilizas 3 IF para sensar los 3 botones entonces es un ciclo:

sensa1 =IF THEN 1
sensa2 =IF THEN 2
sensa3 =IF THEN 3


si se aplana 1 entonces GOSUB es una instruccion que brinca a la etiqueta INICIAR ahi hace la secuencia de puertos prende pausar apagar etc. cuando acaba se encuentra con RETURN que es una instruccion que te ayuda a regresar al programa principal en este caso al segundo IF THEN y asi ocurre para los demas OK.

Ademas una recomendacion si estas enviando directamente los datos a los puertos no uses tantos ALIAS por que en mi experiencia he notado que el PBP como que se amensa con muchos ALIAS.

De todos modos queda un error de Logica para que corrigas:

ERROR!: (mandas datos de 7 bits al puertoB del pic pero recuerda que utilizas 3 bits para sensar los botones RB0 RB1 RB2 cuando salgan los datos del PUERTO B solo veraz los datos apartir de RB3-RB4).

eso ya te toca a ti corregirlo Sugerencia puedes poner los botones en el PUERTO E.
y todos los demas para las secuencias.:unsure:
 

Adjuntos

  • Untiled Review.rar
    102.1 KB · Visitas: 108
Aqui les dejo un pequenio ejemplo que hice gracias a la ayuda de este foro y de AUTOTRONICO
esta en sus origenes, pero creo que a alguien le puede servir
es el control de posicion de un servomotor que tiene acoplado un encoder incremental
estoy utilizando el timmer1 como contador y la nstruccion HPWM para controlar la velocidad del motor. Voy a cmbiar el timmer1 por el ccp1 en modo captura por que pierdo pulsos del encoder
gracias denuevo autotronico por que con tu ejemplo entendi "un poco creo" a utilizar este
temporizador.
el programa solo tiene gravado dos posiciones pero cuado deje de perder pulsos del encoder sigue implementarle el PID al control y la comunicacion serial para desde la computadora mandarle la posicion y despues la comunicacion I2C para comunicarse con otros driver

aqui les dejo el codigo y el ejemplo en proteus...

Código:
DEFINE OSC 8
DEFINE LCD_DREG PORTD 
DEFINE LCD_DBIT 4     
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 2    
DEFINE LCD_EREG PORTD 
DEFINE LCD_EBIT 3 

DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
DEFINE CCP2_REG PORTC
DEFINE CCP2_BIT 1
   '
TMR1 VAR WORD              'variable de captura del timer1
VTMR1 VAR WORD             'variable para acumular captura del timer1
SENTIDO VAR BIT            'sentido de giro
FRENADO VAR BIT
FPWM VAR WORD              'frecuencia del pwm 
VEL VAR BYTE               'velocidad de gigo del motor 0-255
SP1 VAR WORD               'set point

symbol B1=PORTC.6
symbol B2=PORTC.7
LCDOUT $FE, 1
LCDOUT "SERVO DRIVER AUC"
PAUSE 500
 TMR1=0
 VTMR1=0
 SENTIDO=1
 SP1=350                   '350 pulsos del encoder
 FRENADO=0
 FPWM=320
TRISC = %11100001

CCP1CON = %00000101  'captura cada transicion de subida (primeros 4 bit)
                     'bit 5 y 6 solo se usan en PWM
T1CON = %00000011    'bit0=1 enable timmer1 TMR1ON, bit1=1 reloj externo
                     'sincroniza reloj externo, apaga oscilador, 1:1 preescaler
PORTC.3 = 1          'Enable del motor

VEL=255
PORTC.4=0
HPWM 2, VEL,FPWM        'por RC1 sale el PWM con un duty=Vel, frecuencia FPWM
TMR1H = 0
TMR1L = 0
Inicio:
    IF B1=1 THEN GOTO CAM_POS  'si presiono B1 cambio la posicion a la que
    TMR1H = 0                   'se debe mover el servo, cambia el sentido
    TMR1L = 0
    T1CON.0 = 1                 'activamos el timer1 por 1 mS para capturar
    PAUSE 1                     'informacion
    if portc.4=0 then           'Si el RC4 No esta Activo gira en un sentido
        SENTIDO=1
    ELSE                        'si esta activo gira en sentido contrario
        SENTIDO=0
    ENDIF
    T1CON.0 = 0                 'se apaga el timer1 para tomar la informacion
    TMR1.BYTE0 = TMR1L
    TMR1.BYTE1 = TMR1H

    if sentido=1 then
        VTMR1=VTMR1+TMR1    'acumula el conteo
    else
        VTMR1=VTMR1-TMR1    'resta el conteo
    endif
    LCDOUT $FE, 1, " POS = ",DEC VTMR1   'se manda al LCD
    pause 1
    IF vTMR1 = SP1 then  'si llegaste al set point PWM=0 y frena el motor 
        VEL=0
        goto Frenar
    ENDIF

GOTO Inicio

Frenar:
    hpwm 2,0,FPWM    'pwm=0
    PORTD.0=1        'si RD0 y RD1 estan en 1 se frena el motor 
    PORTD.1=1
    portc.4=0        'se desenergiza el relevador de cambio de giro
    VEL = 0
    GOTO Inicio
CAM_POS:
    if B1=1 THEN GOTO CAM_POS
    IF SP1 = 350 THEN       'si esta en la posicion 350, cambia el sentido
        SP1=50              'y se va  a la posicion 50
        PORTD.0=0
        PORTD.1=0
        PORTC.4=1
        vel=30              'a una velocidad muy lenta
        HPWM 2,VEL,FPWM
    ELSE                     'si esta en la posicion 50 cambia el sentido
        vel=255              'y se va a la posicion 350
        SP1=350              'a maxima velocidad
        PORTD.0=0
        PORTD.1=0 
        PORTC.4=0
        HPWM 2,VEL,FPWM
    ENDIF
    GOTO Inicio
END
 

Adjuntos

  • driverServoAUC.rar
    27.5 KB · Visitas: 159
  • driverservoV1_1.JPG
    driverservoV1_1.JPG
    135.2 KB · Visitas: 137
Última edición:
muchisimas gracias amigo "snakewater" por tu ayuda y por la corrección que me hicistes en mi programa tomare muy encuenta tus comentarios, como te habras dado cuenta soy muy novato en esto pero me gusta la electronica y efecto de luces y pues este proyecto que estoy aciendo es para el termino de mis estudios....

te estare comentando como voy avanzando

muchisimas gracias de nuevo...

umm una pregunta en la subrutina como le ago para que me repita la misma rutina indefinidamente ya que como me la escribiste me regresa a la condición "IF"....

saludos amigo....
 
contador 0 -99
que tal amigos estoy haciendo un contador de 0-99 en micro code studio y hay un error creo que de tiempos si me pudieran ayudar .. gracias hay dejo la programacion y el circuito en proteus

TRISA=0
TRISB=0
CONTA VAR BYTE
UNIDAD VAR BYTE
DECENA VAR BYTE
DECE VAR BYTE

UNIDAD=0
DECE=0


INCREMENTAR:
PORTA=1
FOR CONTA= 1 TO 10
LOOKUP CONTA,[8,0,1,2,3,4,5,6,7,8,9],UNIDAD
PORTB=UNIDAD
PAUSE 150
NEXT
GOSUB DECENAS

DECENAS:
PORTB=DECENA
PORTA=2
IF DECENA=10 THEN INCREMENTAR
DECENA=DECENA+1
PAUSE 100
GOSUB INCREMENTAR

END
 
muchisimas gracias amigo "snakewater" por tu ayuda y por la corrección que me hicistes en mi programa tomare muy encuenta tus comentarios, como te habras dado cuenta soy muy novato en esto pero me gusta la electronica y efecto de luces y pues este proyecto que estoy aciendo es para el termino de mis estudios....

te estare comentando como voy avanzando

muchisimas gracias de nuevo...

umm una pregunta en la subrutina como le ago para que me repita la misma rutina indefinidamente ya que como me la escribiste me regresa a la condición "IF"....

saludos amigo....


Mira Te puse esto:

CONDICION: IF (PULSADOR=1) THEN gosub INICIAR

IF (PULSADOR2=1) THEN gosub INICIAR2

IF (pulsador3=1) then gosub INICIAR3

GOTO CONDICION


Al correr tu programa configura todo lo de los puertos y alias que pusiste arriba de este codigo que te muestro bueno, despues llega a la etiqueta CONDICION: ahi sensa PULSADOR=1 (supongamos que es 0), se salta a PULSADOR2=1 (tambien es 0), se salta a pulsador3=1 tambien es 0 entonces se salta a GOTO CONDICION aqui se regresa a etiqueta CONDICION:

Bueno esta vez supongamos que PULSADOR2=1 si es 1 entonces salta hasta la etiqueta INICIAR2 donde hace toda la secuencia de luces cuando termina se encuentra con RETURN
que regresa al programa principal despues de IF (PULSADOR2=1) THEN gosub INICIAR2, lo que sigue es sensar pulsador3=1, supongamos que es 0 sigue con GOTO CONDICION y asi indefinidamente se esta sensando que botones se aplanan para brincar a la subrutina correspondiente y despues regresar para volver a sensar infinitamente;)
 
Última edición:
contador 0 -99
que tal amigos estoy haciendo un contador de 0-99 en micro code studio y hay un error creo que de tiempos si me pudieran ayudar .. gracias hay dejo la programacion y el circuito en proteus

TRISA=0
TRISB=0
CONTA VAR BYTE
UNIDAD VAR BYTE
DECENA VAR BYTE
DECE VAR BYTE

UNIDAD=0
DECE=0


INCREMENTAR:
PORTA=1
FOR CONTA= 1 TO 10
LOOKUP CONTA,[8,0,1,2,3,4,5,6,7,8,9],UNIDAD
PORTB=UNIDAD
PAUSE 150
NEXT
GOSUB DECENAS

DECENAS:
PORTB=DECENA
PORTA=2
IF DECENA=10 THEN INCREMENTAR
DECENA=DECENA+1
PAUSE 100
GOSUB INCREMENTAR

END

no haz subido la simulacion del proteus cuelgala ahi haber si te puedo hechar una mano aunque en este mismo hilo en paginas anteriores ya postearon uno que corre bien buscalo
 
mira lo unico que se me ocurre por el momento es que hagas una tabla de verdad y juegues con los binarios por ejemplo para mostra el nuemro 8 en 4 displays debes mostrar el 184 en binario porque si te pones a analizar este numero en binario

10111000 es el 184 sino me equivoco

1011 van a activar los transistores

y los demas bits mas bajos van al deco para mostrar el 8 es decir 1000

ademas el problema que encontre el tu programa es que haces el multiplexado en el mismo lazo de la
visualizacion del numero deberias hacerlo aparte es decir que deberias generar un contador con una variable X con la que comparandolo si es par muestres las unidades y si es par las decenas ojo que la multiplexacion no debe ser mayor a 5 ms para dar la apariencia de encendido de los displays.
si no estas de apuro dejame resuelvo unos asuntos de la U que me tienen loco y analizo mejor tu problema espero te haya ayudado un poquito por lo menos
 
Que tal autotronic! Quería hacerte una pregunta nada mas para que me des una idea, como haría para medir distancias por infrarrojo, yo tengo ya la configuración para poner el pic a mandar señales de 38Khz a través de IR, pero como hago para poder calcular distancias? es que pienso hacer un robot y que dependiendo de la distancia que se encuentre de los objetos el regule la velocidad de los motores. Lo de los motores es lo de menos esa parte si tengo una idea de como hacerlo, bueno lo digo para ahorrarte molestias. :cool:

Amigo mira aqui:

http://www.rentron.com/PicBasic/infrared_object_detection.htm

esta en ingles pero especifican como realizar lo que necesitas

arturouc como piensas realizar el control pid para tu proyecto te aconsejo un a rutina de selet case, deja a ver como podemos potencializar el código que posteaste para que no hall perdida de pulsos.

arturouc El Programa que posteo sirve para mantener un motor en una posición con el comando HPWM, no hay perdida de señal de pulso.
Código:
CLEAR  
DEFINE OSC 20 

' Definicion de pines para el LCD 
DEFINE LCD_DREG PORTD 
DEFINE LCD_DBIT 4 
DEFINE LCD_BITS 4 
DEFINE LCD_RSREG PORTE 
DEFINE LCD_RSBIT 0 
DEFINE LCD_EREG PORTE 
DEFINE LCD_EBIT 1 
LOW PORTE.2 
DEFINE LCD_LINES 2 
DEFINE LCD_COMMANDUS 2000 


DEFINE LCD_DATAUS 50 
DEFINE ADC_BITS 8 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50 
DEFINE CCP2_REG PORTC 
DEFINE CCP2_BIT 1 
CCP1CON = %00111111 
TRISA = %00011111 
LATA = %00000000 
TRISB = %00000000 
LATB = %00000000 
TRISC = %00000000 
TRISD = %00000000 
ANSEL0 = %00000001 
ANSEL1 = %00000000 
QEICON = %10001000 
INTCON = %00000000 
INTCON2.7 = 0 

' Creacion de variables

POSICION VAR WORD 
MOTPWR VAR BYTE 

'Definicion de pines para manejo de motor 
PORTC.0 = 0 
PORTC.1 = 0 
PORTC.3 = 1 
PAUSE 500 ; 
LCDOUT $FE, $01, "PUESTA EN MARCHA" 
PAUSE 100 
POSCNTH = 127 
POSCNTL = 0 

' PROGRAMA PRINCIPAL
LOOP: 
POSICION = 256*POSCNTH + POSCNTL 
SELECT CASE POSICION 
CASE IS = 32512 
MOTPWR = 0 
PORTD.3 = 0 
CASE IS < 32512 
PORTC.3 = 0
PORTD.2 = 1 
PORTD.3 = 1 
MOTPWR = 18 

CASE IS > 32512 
PORTC.3 = 1 
PORTD.2 = 0 
PORTD.3 = 1 
MOTPWR = 18 
CASE ELSE 
END SELECT 
HPWM 2, MOTPWR, 20000

LCDOUT $FE, $80, "PORTC=",BIN4 PORTC,"GANANCIA=",DEC3 MOTPWR

LCDOUT $FE, $C0, "POSICION =",DEC5 POSICION 

GOTO LOOP 
END
 
Última edición:
arturouc como piensas realizar el control pid para tu proyecto te aconsejo un a rutina de selet case, deja a ver como podemos potencializar el código que posteaste para que no hall perdida de pulsos.

arturouc El Programa que posteo sirve para mantener un motor en una posición con el comando HPWM, no hay perdida de señal de pulso.

Que tal autotronico
el PWM trabaja muy bien
Lo del PID todavia no lo empiezo, hasta que ya no pierda pulsos del encoder, no del PWM,
los del encoder son los pulsos que estoy perdiendo, ayer me di cuenta de el codigo que subi que si desconecto la entrada RC0 donde "se supone que esta contando los pulsos" sigue contando....esto quiere decir que el timer1 algo le falta para contar los flancos de subida en esa patita del pic. esta capturando solo valoresdel conteo del TMR1

lo que necesito es que el contador este capturando todos los flancos de subida que se presenten en la patita del pic y preguntarle cada cierto tiempo como va el conteo sin que pierda pulsos, asi como trabaja el HPWM el pic puede realizar otras tareas

Este es el codigo y el sentido de giro lo determino con un FF 374, ahora son los dos canales A y B del encoder con la Xor... es el mismo codigo anterior, solo cambia la manera de determnar el sentido de giro. antes era con la patita RC4 que es una salida y ahora es con la RC5 que es una entrada conectada a la salida del FF 374
 

Adjuntos

  • driverServoAUC_V1_5.rar
    29.6 KB · Visitas: 111
Última edición:
Hola amigos del foro....

Me podrian decirme cuales son o donde puedo encontrar las especificaciones tecnicas de los leds como:
Voltage Minimo (V):
Voltage Maximo(V):
Corriente Minima(I):
Corriente Maxima(I):

etc...

lo que pasa es que si e encontrado especificaciones como por ejemplo:

LED de 5 mm, color rojo difuso
Características técnicas

- Voltaje: 2,1 Vcc
- Potencia: 31,5 mW
- Luminosidad: 80 mcd
- Corriente: 15 mA
- Diámetro: 5 mm


pero en estas especificaciones no me especifica los voltages maximos y minimos asi como tanpoco las corrientes...

ya que no se si mi rango de trabajo esta correcto....

espero me puedan ayudar....

saludos
 
Gracias por tu ayuda atricio el dato q me diste es para un voltaje constante.
Pero quiero que el incremento del voltaje se automatico intente con la funcion if - then pero no me sale.
Sale error es para encender un led q vaya incrementando su luz hasta su punto mas alto
 
ola amigos....

me podrian decir que amperaje consume el PIC16F877A, para colocarle su resistencia a una fuente de 9V...

espero me puedan ayudar...
 
gracias por tu ayuda atricio el dato q me diste es para un voltaje constante.
Pero quiero que el incremento del voltaje se automatico intente con la funcion if - then pero no me sale.
Sale error es para encender un led q vaya incrementando su luz hasta su punto mas alto

incremento var byte
incremento=0
inicio:
Pwm portc.1, incremento, 1
if incremento < 255 then incremento=incremento+5
pause 100
goto inicio
 
el incremento es muy rapido se nota como un encendido normal en los datos q m diste varie los ciclos y remplace 255 en 5.
q vaya subiendo d 1 segundo en segundo el encendido del led
 
el incremento es muy rapido se nota como un encendido normal en los datos q m diste varie los ciclos y remplace 255 en 5.
q vaya subiendo d 1 segundo en segundo el encendido del led

se te apaga el led en la espera de 1 segundo?
puedes incrementar los ciclos....en la instruccion pwm
que micro estas usando hay una instruccion hpwm
 
Atrás
Arriba