TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: sonicTH en 07 de Mayo de 2010, 18:50:09
-
Hola que tal.
Estoy realizando este programa en BASIC con PICBasic Pro en microcode studio. El asunto es que en el proteus funciona como siempre a las mil maravillas. Será pq omite cosas que se dan por hecho o no sé, sin embargo a la hora de lo físico pues si influyen mucho.
En fin, el programa es este:
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 18/03/2010 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
'INCLUDE "bs1defs.bas"
seleccion var byte
'led = 5
'let b0=5
'let led=5
'symbol led=2
'B0=2
inicio:
' PicBasic program to demonstrate operation of an LCD in 4-bit mode
'
' LCD should be connected as follows:
' LCD PIC
' DB4 PortA.0
' DB5 PortA.1
' DB6 PortA.2
' DB7 PortA.3
' RS PortA.4 (add 4.7K pullup resistor to 5 volts)
' E PortB.3
' RW Ground
' Vdd 5 volts
' Vss Ground
' Vo 20K potentiometer (or ground)
' DB0-3 No connect
' DEFINE LCD_BITS 4
' Set number of lines on LCD
@ DEVICE pic16f628a, INTRC_OSC_NOCLKOUT 'Reloj interno solo
@ DEVICE pic16f628a, WDT_OFF ' Watchdog Timer desconectado
@ DEVICE pic16f628a, PWRT_ON ' Power-On Timer conectado
@ DEVICE pic16f628a, BOD_ON ' Brown-Out Detect conectado
'@ DEVICE pic16f628a, MCLR_OFF ' Master Clear Externo desconectado
@ DEVICE pic16f628a, LVP_OFF ' Low-Voltage Programming desconectado
@ DEVICE pic16f628a, CPD_OFF ' Data Memory Code Protect desconectado
DEFINE LCD_DREG PORTB ; LCD bits de comunicacion al LCD
DEFINE LCD_DBIT 0 ; Coneccion puerto B (RB0,RB1,RB2,RB3)
DEFINE LCD_RSREG PORTB ; LCD bit RS conectado a PORTB
DEFINE LCD_RSBIT 4 ; LCD bit RS conectado a puerto B (RB4)
DEFINE LCD_EREG PORTB ; LCD bit E conectado a PORTB
DEFINE LCD_EBIT 5 ; LCD bit E conectado a puerto B (Rb5)
DEFINE LCD_BITS 4 ; LCD comunicado 4Bits
DEFINE LCD_LINES 2 ; LCD de 2 lineas
Pause 500 ' Wait for LCD to startup
loop: Lcdout $fe, 1 ' Clear LCD screen
'pause 500
Lcdout " Probador de " ' Display Hello
LCDOUT $FE, $C0
lcdout " ECM's "
Pause 3000 ' Wait .5 second
Lcdout $fe, 1 ' Clear LCD screen
'pause 500
Lcdout "Seleccione Marca:"
LCDOUT $FE, $C0
LCDOUT " <- ->"
Pause 500 ' Wait .5 second
'pause 5000
'Goto loop ' Do it forever
again:
IF PortA.2 = 1 THEN
seleccion=1
goto menu
endif
IF PortA.3 = 1 THEN
seleccion=2
goto menu
endif
IF PortA.4 = 1 THEN
seleccion=3
goto menu
else
goto again
endif
menu:
SELECT CASE seleccion
CASE 1
HIgh PORTA.0
pause 2000
low PORTA.0
CASE 2
HIgh PORTA.1
pause 2000
low PORTA.1
CASE 3
HIGH PORTA.6
pause 2000
low PORTA.6
'CASE IS > 5
'y = 100
CASE ELSE
high PORTA.7
pause 2000
low PORTA.7
END SELECT
seleccion = 0
goto again
end
Basicamente el programa enciende una de las salidas del puerto A en base a una entrada del puerto A. Tal vez ese es el problema?¿?¿ :? Estuve leyendo por ahí de una instrucción CONM o algo así que es lo que permitía utilizar el puerto A puramente digital, pero esa instruccion al parecer no está incluida en el microcode. Espero le hechen un vistazo y me hechen la mano. Thanks.
PD: Al montarlo solo me enciende la salida RA6 pero las demás no las respeta.
PD2: Parecera que no tiene sentido el lcd con lo que hace el programa pero solo es parte de algo mas grande que ehmm.... en CCS nomas no me kiso salir :? y lamentablemente nadie me supo decir porqué :(
(O será que era obvio y les da weba :D) See ya.
-
Basicamente el programa enciende una de las salidas del puerto A en base a una entrada del puerto A. Tal vez ese es el
problema?¿?¿
No es el problema ;si puedes leer y escribir en el mismo puerto
Estuve leyendo por ahí de una instrucción CONM o algo así que es lo que permitía utilizar el puerto A puramente digital,
De momento no lo recuerdo pero si es algo así considera que algunos pic cuentan con módulos adicionales comparadores, convertidores etc. que generalmente comparten un mismo pin por lo cual para poder utilizar un puerto como digital hay que deshabilitar los módulos que compartan algún pin del puerto
pero esa instruccion al parecer no está incluida en el microcode. Espero le hechen un vistazo y me hechen la mano. Thanks.
Pues claro que no algunas veces tendrás que actuar directamente sobre los registros del pic algo así como conm=000011111 :mrgreen: :mrgreen:
y lamentablemente nadie me supo decir porqué
(O será que era obvio y les da weba ) See ya.
seeeeeeeeee :D :D :D :D :D
-
Hola muchachos,
No puedes leer y escribir en el mismo puerto
Si se puede; puedes manejar el puerto bit a bit o todo en conjunto.
Estuve leyendo por ahí de una instrucción CONM o algo así que es lo que permitía utilizar el puerto A puramente digital,
De momento no lo recuerdo pero si es algo así considera que algunos pic cuentan con módulos adicionales comparadores, convertidores etc. que generalmente comparten un mismo pin por lo cual para poder utilizar un puerto como digital hay que deshabilitar los módulos que compartan algún pin del puerto
pero esa instruccion al parecer no está incluida en el microcode. Espero le hechen un vistazo y me hechen la mano. Thanks.
Pues claro que no algunas veces tendrás que actuar directamente sobre los registros del pic algo así como conm=000011111 :mrgreen: :mrgreen:
Tiene razon el pic 16f628 tiene modulos comparadores que comparten pines con el puertoA, debes setear los pines como digitales, mira el datasheet y cheka que registro debes modificar para lograrlo.
saludos.
-
Hola. Por que no pruebas con esto:
alldigital ' Todas las entradas digitales
TRISA = %00011100 ' 1 Entadas, 0 salidas
PORTA=0 ' Poner a cero el puerto A
Debes declarar al comienzo. También puedes darte un paseo por el manual de Picbasic, de onda, ami me ayudo bastante.
Saludos.-
-
Hola. Por que no pruebas con esto:
alldigital ' Todas las entradas digitales
TRISA = %00011100 ' 1 Entadas, 0 salidas
PORTA=0 ' Poner a cero el puerto A
Debes declarar al comienzo. También puedes darte un paseo por el manual de Picbasic, de onda, ami me ayudo bastante.
Saludos.-
mmm, Gracias a dios contestaron ;-)
jeje, ke bueno ke contestaron pq ultimamente me habían estado kedando mal; o nuevamente mis preguntas no eran muy inteligentes :D en fin.
Gracias por sus respuestas. Les cuento:
De momento deje el programa como estaba por 'default', es decir manipulando el LCD con el puerto A (y solo RB3). De está forma extrañamente (para mí) si me ha salido bien aunque obviamente no es la versión final del programa así que espero sigan echandome la mano :mrgreen: . Y bueno, me preocupa que mis .hex están pesando mucho. Sé ke el 16f628 tiene 2K de memory pero como han visto no soy un experto así que no sé hasta que punto el programa va a caber en el pic ya que estan pesando mas que solo 2K. En fin.
PD: el winpic me está tildando el 'error de escritura en dirección 0x00000' etc. No es la proxima pregunta pq sé que ni me van a responder cosas tan lógicas; aunque eso fué el motivo para que desistiera de aprender ensamblador :D y pues dejé moverle a los pics. En fin, eso ya es conversación poco interesante vdd?
PD2: Gracias por sus respuestas y sorry por el choro mareador;-)
-
mmm, Gracias a dios contestaron ;-)
jeje, ke bueno ke contestaron pq ultimamente me habían estado kedando mal
Disculpame sonic si no te quede bien, pero es que tu debes aprender a hacer las cosas, con lo que te dije y una misera busqueda en el foro encontrabas la solucion. Sí, este tema ha sido tratado muchas veces, pero creo que no quieres "perder tu tiempo" (como si nosotros si tuvieramos el suficiente como para responderte) debes aprender a buscar las cosas y no pensar en que te den la tarea resuelta.
Mis mas sinceras disculpas.
saludos.
-
sorry KALLITOS, no fué personal la pedrada :oops: jeje :P al contrario, gracias a todos por su ayuda y valioso tiempo, si te fijas reconocí varias veces que tal vez no me respondían por ser cosas simples y lógicas, así que 'don't worry' ;-)
PD: A decir vdd si he progresado en mi programa por mi cuenta pq nomas no supe pq no jaló en CCS :? a eso me refería con lo de 'me han kedado mal' ya que pregunté y nomas nada; por eso cambié a BASIC. Así que hasta ahorita voy bien y me siento orgulloso 8) aunque se que es un insignificante pasó para ustedes (sabios entre sabios) pero un gran salto para 'markitos' (osea yo) :mrgreen: jeje
En fin, perdón pq ya parece sala de chat vdd?
Gracias.
-
Hola,
Comentarles que el programa ya kedó :mrgreen: gracias a todos y cada uno.
Lo que ahora me trae es un error al usar ADCIN del PBP; en realidad estoy pasando el código de PICAXE a PBP y tengo los siguientes problemas al compilar:
' 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
El código completo es:
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 18/05/2010 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
'INCLUDE "bs1defs.bas"
'INCLUDE "bs2defs.bas"
'DEFINE ADC_BITS 8 ' Set number of bits in result
'DEFINE ADC_CLOCK 3 ' Set clock source (rc = 3)
'DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds
'TRISA = 255 ' Set PORTA to all input
'ADCON1 = 4 ' PORTA is analog
'TRISB=%11110000
' 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
pins var byte
b0 var byte
b1 VAR byte
b2 var byte
w4 var word
w5 var word
w6 var word
ckp con 0
cmp con 1
ref con 0
sync con 1
pip con 2
symbol cont = b1 ; Variable del ciclo de repeticion
symbol tiempo = b0 ; Tiempo del estado ya sea alto o bajo
symbol t2 = w6
symbol aux = b2
'symbol ckp = 0 ; Pin de salida
'symbol cmp = 1 ; Pin de salida
symbol t3 = w4
symbol t4 = w5
'symbol ref = 0
'symbol sync = 1
'symbol pip = 2
;************* MENU DE SEÑALES ******************
inicio:
select case pins
case 2
goto ford
case 1
goto chevrolet
case 3
goto sbec2_5
case 128
goto sbec_y_pcm3_0
case 130
goto sbec3_3
case 129
goto sbec3_9
case 131
goto sbec4_0
case 64
goto sbec5_2_y_5_9
case 66
goto pcm2_4
case 65
goto pcm2_5
case 67
goto pcm3_3
case 192
goto GA16DE
case 194
goto GA16DNE
case 193
goto vw1_6
case 195
goto vw1_8
case else
end select
goto inicio
;*********** SEÑAL DE CHRYSLER 2.4L *******************
;*******************************************************
pcm2_4: adcin 2,tiempo
portB = 2
t2 = tiempo*6
pause t2
aux = 4
gosub reloj
pause t2
high ckp
t2 = tiempo*3
pause t2
low cmp
t2 = tiempo*2
pause t2
gosub reloj
t2 = tiempo*5
pause t2
high cmp
t2 = tiempo*6
pause t2
gosub reloj
pause tiempo
pause tiempo
low cmp
t2 = tiempo*4
pause t2
high ckp
t2 = tiempo*5
pause t2
gosub reloj
pause t2
goto pcm2_4
;************** SUBRUTINA
reloj: for cont = 1 to aux
high 0
pause tiempo
low 0
pause tiempo
next cont
return
;*********** SEÑAL DE CHRYSLER 2.5L 6 Cilindros *******************
;*******************************************************************
pcm2_5:
portB = 0
ini: adcin 2,tiempo
toggle cmp
t2 = tiempo * 12
pause t2
t2 = tiempo * 8
for cont = 1 to 4
high ckp
pause tiempo
low ckp
pause t2
next cont
t2 = tiempo * 4
pause t2
goto ini
;*********** SEÑAL DE CHRYSLER 2.5L 4 Cilindros *******************
;*******************************************************************
sbec2_5:
adcin 2,tiempo
portB = 3
pause tiempo
low ckp
pause tiempo
high ckp
pause tiempo
t3 = tiempo * 3
t4 = tiempo * 4
for cont = 1 to 3
portB = 0
pause t4
portB = 3
if cont = 2 then
pause tiempo
low cmp
pause tiempo
high cmp
pause tiempo
goto aqui
else
endif
pause t3
aqui: next cont
portB = 0
pause t3
goto sbec2_5
;*********** SEÑAL DE CHRYSLER 3.3L 6 Cilindros *******************
;**************************************
sbec3_3: portB = 2
for cont = 1 to 119
adcin 2,tiempo
pause tiempo
select case t2
case 4,7,10,13,24,27,30,33,48,51,54,57,65,69,72,75,86,89,92,95,107,110,113,116
high ckp
case 5,8,11,14,25,28,31,34,49,52,55,58,66,70,73,76,87,90,93,96,108,111,114,117
low ckp
case 16,20,36,40,44,60,78,82
high cmp
case 2,18,22,38,42,46,62,80,84
low cmp
case else
end select
next cont
goto sbec3_3
;*********** SEÑAL DE NISSAN GA16DE *******************
;*******************************************************************
GA16DE: portB = 3
ga: for t3 = 1 to 360
adcin 2,tiempo
high ref
pause tiempo
low ref
pause tiempo
select case t3
case 90,180,270,360
high sync
case 92,182,272,8
low sync
case else
end select
next t3
goto GA
;*********** SEÑAL DE NISSAN GA16DNE *******************
;*******************************************************************
GA16DNE: adcin 2,tiempo
t4 = tiempo * 5
t3 = tiempo * 7
high ref
pause t4
low ref
pause tiempo
high ref
pause tiempo
low ref
pause t4
for cont = 1 to 3
high ref
pause t4
low ref
pause t3
next cont
goto GA16DNE
;*********** SEÑAL DE FORD MERCURY 4.6L 8 Cilindros *******************
;*******************************************************************
ford: adcin 2,tiempo
high pip
pause tiempo
low pip
pause tiempo
goto ford
;*********** SEÑAL DE CHEVROLET TBI 5.7L 8 Cilindros *******************
;*******************************************************************
chevrolet:
adcin 2,tiempo
t2=tiempo*3
high ref
pause tiempo
low ref
pause t2
goto chevrolet
sbec_y_pcm3_0:
sbec3_9:
sbec4_0:
sbec5_2_y_5_9:
pcm3_3:
vw1_6:
vw1_8:
end
:? No puedo copiar los errores del compilador pero dicen:
ERROR Picaxe.ASM 66: (255) undefined symbol 'adcon1'
ERROR C:/pbp/pbppic14.lib 5865 undefined symbol 'ADRESH'
ERROR C:/pbp/pbppic14.lib 5858 undefined symbol 'ADCON0'
ERROR C:/pbp/pbppic14.lib 5858 undefined symbol 'GO_DONE'
y así se repiten.
Espero me orienten de como sustituir el comando READADC o bien utilizar bien el comando ADCIN del PBP, Gacias totales ;-)
-
disculpa este progama es para 16f628, si es asi te cuento que este pic no tiene convertidores analogico digitales, lo que tiene es comparadores. y por eso te saca esos
errores
-
disculpa este progama es para 16f628, si es asi te cuento que este pic no tiene convertidores analogico digitales, lo que tiene es comparadores. y por eso te saca esos
errores
Hola que tal.
Pues si tiene entradas analógicas no? Estas son: RA0/AN0, RA1/AN1, RA2/AN2, que serían 17,18 y 1 respectivamente. Es decir, en picaxe es fácil leer la señal proveniente por ejemplo de un potenciometro usado como divisor de voltaje y ya el pic lo interpreta con una escala de 8 bits. Pues bien, el picaxe 18X es precisamente el 16F628 así que debería ser posible, no???
Gracias.
-
disculpa este progama es para 16f628, si es asi te cuento que este pic no tiene convertidores analogico digitales, lo que tiene es comparadores. y por eso te saca esos
errores
Hola que tal.
Pues si tiene entradas analógicas no? Estas son: RA0/AN0, RA1/AN1, RA2/AN2, que serían 17,18 y 1 respectivamente. Es decir, en picaxe es fácil leer la señal proveniente por ejemplo de un potenciometro usado como divisor de voltaje y ya el pic lo interpreta con una escala de 8 bits. Pues bien, el picaxe 18X es precisamente el 16F628 así que debería ser posible, no???
Gracias.
Ehmm, citandome a mi mismo :P
Efectivamente no tiene ADC, el PIC que debo usar es el 16F88 :mrgreen: ya lo cambié en el Microcode studio y me lo compiló sin problemas, solo me falta calarlo en físico y antes en simulación ;-) Muchas gracias.