Curso de programación de PIC en PICBasic Pro

mmmmm, por puerto serial o paralelo me parece que vamos al horno che... Por lo que lei, el gamepad, cuando es conectado a la PC y lo reconoce win, se abre un software y desde ese software se configura las funciones de cada pulsador del gamepad, incluido los dos ejes.... Si vos lo haces por puerto serial, como saben los dos software que hay en el sistema conectado el circuito que mostras? Ademas, me resulta raro que conecten dos potes sin antes acondicionar la señal con un ADC....parece mas fake que otra cosa ese circuito jajaja
Tengo que ver algunos topicos sobre el tema que aparecen en google y te comento si serviria lo que tengo en mente... La idea es hacerlo en PBP; Ya que hay muchos proyectos en C
 
Última edición:
mmmmm, por puerto serial o paralelo me parece que vamos al horno che... Por lo que lei, el gamepad, cuando es conectado a la PC y lo reconoce win, se abre un software y desde ese software se configura las funciones de cada pulsador del gamepad, incluido los dos ejes.... Si vos lo haces por puerto serial, como saben los dos software que hay en el sistema conectado el circuito que mostras? Ademas, me resulta raro que conecten dos potes sin antes acondicionar la señal con un ADC....parece mas fake que otra cosa ese circuito jajaja
Tengo que ver algunos topicos sobre el tema que aparecen en google y te comento si serviria lo que tengo en mente... La idea es hacerlo en PBP; Ya que hay muchos proyectos en C

el puerto al que se refiere Dario no es el serial es el puerto de Juegos, el programa al que te refieres para configurar las funciones puede ser el xPadder bascandolo en la web seguro lo encontraras, el puerto de juegos es analogo y digital por eso no se necesita acondicionar la señal con un adc, y el circuito es factible.

para hacer un gamepad con pic necesitas un pic con modulo USB (18f2550/4550 etc)y generar los archivos correspondientes con el HID y despues solo cambiar el archivo de los descriptores. en realidad es muy sencillo y si hay un proyecto de PBP en la web.

para modificar los descriptores busca el descriptor tool.
 
Última edición:
...el puerto al que se refiere Dario no es el serial es el puerto de Juegos...
:eek: disculpame por mi ignorancia pero :confused: ... no sabia que en mi PC tenia un puerto de juegos; Yo solo pense que tenia un puerto serial y un puerto paralelo... Vos decis que el yo empleo para programar con el JDM, es un puerto de juegos? :unsure:
Me suena nuevo lo que decis, la verdad, desconocia esto ultimo y me suena raro... Como puedo verificar esto que me decis?



torres.electronico dijo:
:eek: disculpame por mi ignorancia pero :confused: ... no sabia que en mi PC tenia un puerto de juegos; Yo solo pense que tenia un puerto serial y un puerto paralelo... Vos decis que el yo empleo para programar con el JDM, es un puerto de juegos? :unsure:
Me suena nuevo lo que decis, la verdad, desconocia esto ultimo y me suena raro... Como puedo verificar esto que me decis?
aaaaaaa, noooo, ya entendi, ya entendi :rolleyes: que burro de mi parte :D
San Google me acaba de iluminar(y) http://es.wikipedia.org/wiki/Puerto_de_juegos
Yo entendia que la PC ya venia con un puerto de juegos jajaja, ahora si, ya entendi lo que me comentas....
Igualmente, me parece que lo mas economico seria la implementacion del pic 18FXXXX ya que este se podria amoldar a los gustos de uno... Recordas el link al topico que trata del tema en PBP? Muchas gracias por tu aporte ;)
 
Última edición:
hola reyvilla!

:apreton: gracias por tu respuesta, ya lo arregle y me funcionan los botones, pero el reloj llega a un tiempo determinado y se bloquea, ya le he mirado el código una y otra vez:confused:, pero no he encontrado el error... q sugerencia me das??

exitos!
 
hola reyvilla!

:apreton: gracias por tu respuesta, ya lo arregle y me funcionan los botones, pero el reloj llega a un tiempo determinado y se bloquea, ya le he mirado el código una y otra vez:confused:, pero no he encontrado el error... q sugerencia me das??

exitos!

Hola, en que momento, en el seteo, o cuando ya esta en marcha el reloj?
A mi me funciono, seteandolo no tuve problema, recuerda que es un reloj 24 horas, por lo tanto llega hasta 23 y de allí salta a 00, y los minutos van de 00 a 59.
 
hola, es cuando el reloj esta en marcha lo dejo funcionando x ahi 5 o 10 min o ahi veces q desde el inicio de la simulacion ocurre el error, muestra en la lcd muchos ceros y no se deja configurar para volverlo a la normalidad, y en el proteus sale el siguiente error "[HD44780] Controller received data whilst busy ; source LCD2"

anexo imagen en proteus con una mejora que le estoy realizando para transmitir los datos (RS232) a otro pic para q se visualice en una LCD 4*20.


gracias!!
 

Adjuntos

  • error.JPG
    error.JPG
    233.4 KB · Visitas: 61
Ok ese error me ha dado en varias ocaciones con el proteus, lo he resuelto con estas lineas de comando y datos del lcd:

Código:
DEFINE LCD_COMANDUS 2000 
DEFINE LCD_DATAUS 150

Donde el retardo lo incremente hasta 150 microsegundos y me funciono perfecto, tanto en la simulación como en la practica no tuve ningún tipo de problema, prueba y me avisas.

PD: Me fije de algo importante también, te recomendaría conectar el lcd en el puerto b, ya que el puerto a en pin 4 es colector abierto y eso puede causarte problemas también...saludosss
 
Última edición:
La verdad es que no sabia ese tip´s... ahi lo corrobore en dos proyectos y se resolvio...es mas, parece estar mas agil proteus en esta babosa (especie de caracol sin caparazon) que tengo como maquina ...
 
Hola reyvilla gracias por tus sugerencias, ya cambie la LCD al puerto y coloco las dos lineas que me sugeriste, pero me toco aumentarle el retardo de microsegundos ya que con 150 salia el mismo error entonces lo subi hasta 600 y me salen letras en donde debe indicar las horas.

anexo imagen

saludos!!
 

Adjuntos

  • Dibujo.JPG
    Dibujo.JPG
    203.7 KB · Visitas: 52
Última edición por un moderador:
Hola reyvilla gracias por tus sugerencias, ya cambie la LCD al puerto y coloco las dos lineas q me sugeriste, pero me toko aumentarle el retardo de microsegundos ya que con 150 salia el mismo error entons lo subi hasta 600 y me salen letras en donde debe indicar las horas.

anexo imagen

saludos!!

coloca el nuevo codigo pero esta vez no lo adjuntes, solo encierralo en las etiquetas [ code ] tu codigo[ code ] y listo para ver que mas puede tener...saludosss
 
SALUDOS!!
Ok, te dejo el codigo...:confused:

gracias :apreton:

Código:
;Programa para escribir y leer un RTC DS1307
include "modedefs.bas"        

;OPTION_REG.7=1  

Define LCD_DREG PORTB     ;usamos puertoB como salida de datos
Define LCD_DBIT 4           
Define LCD_RSREG PORTB   ;RS va conectado a puertoB
Define LCD_RSBIT 2               ; RS a Rb5
Define LCD_EREG PORTB     ; E va conectado a puertoB
Define LCD_EBIT   3
DEFINE LCD_COMANDUS 2000 
DEFINE LCD_DATAUS 600


CPIN  Var PortA.3                 ;pin señal de reloj I2C
DPIN  Var PortA.4                 ;pin de datos I2C
UP    VAR PORTA.0
DOWN_MODE  VAR PORTA.1
SET   VAR PORTA.2
TX VAR PORTB.1
POS   VAR BYTE

X VAR BYTE
FLAG VAR BIT
TIMEX VAR BYTE

LIMIT VAR BYTE

segu    var byte   ;definir tamaño de variable segundos 1 a 255
minu    var byte                    ;variable para los minutos
hora    var byte                    ;variable para las horas
diaS    var byte                    ;variable día de la semana 
diaF    var byte                    ;variable día fecha del mes
mes     var byte                    ;variable mes 
anio    var byte                    ;variable año de 2 dígitos
XTEMP VAR BYTE
TEMP1 VAR BYTE

dato    VAR BYTE                 ;variable para almacenar dato leído
actualizado VAR BIT              ;variable para almacenar un 1 o 0

EEPROM 0,[0]        ;memoria 0 con el valor inicial 0 , sirve para
                        ;indicar que nunca ha corrido este programa
READ 0,actualizado    ;carga el valor de la memoria EEPROM dirección 0

IF actualizado =0 THEN grabarRTC   ;si es la 1ra vez que corre ir a grabar RTC
                                   ;caso contrario solo leer el RTC
INICIO:   
    I2CREAD DPIN,CPIN,%11010000,0,[segu]   ;leer los datos de mem. 0,            
    I2CREAD DPIN,CPIN,%11010000,1,[minu]   ;1,2,..y guardarlos en sus
    I2CREAD DPIN,CPIN,%11010000,2,[hora]   ;respectivas variables
    I2CREAD DPIN,CPIN,%11010000,3,[diaS] 
    I2CREAD DPIN,CPIN,%11010000,4,[diaF]             
    ;hora=((hora DIG 1)*16)+(hora DIG 0)
    ;minu=((minu DIG 1)*16)+(minu DIG 0)

   ;lcdout $fe,1,DEC2 hora,":",DEC2 minu,":",hex2 segu       
    lcdout $fe,1,HEX2 hora,":",HEX2 minu,":",HEX2 segu;, " ",DEC2 TEMP1   ;mostrar la
                          ;hora minuto y segundos en 2 dígitos (HEX2)
 
PAUSE 300                            ;esperar 0,3 segundo
    
GOSUB TECLAS    
goto inicio                         ;volver a leer los datos

; ************************ subrutina grabar *********************
grabarRTC:
      
    I2CWRITE DPIN,CPIN,%11010000,0,[$00]   ;setear 00 segundos
        Pause 10                     ;retardo para finalizar grabación
    I2CWRITE DPIN,CPIN,%11010000,1,[$39]   ;setear 39 minutos
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,2,[$23]    ;setear las 23 horas
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,3,[$5]    ;setear día lunes ,D=1,L=2
        Pause 10                              ;M=3 , M=4, J=5, V=6, S=7
    I2CWRITE DPIN,CPIN,%11010000,4,[$06]    ;setear día 27 del mes
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,5,[$8]    ;setear mes agosto
        Pause 50  
    I2CWRITE DPIN,CPIN,%11010000,7,[$10]   ;control %00010000 para
        Pause 10                           ;encender el led cada 1 seg.
    
    
    WRITE 0,1       ;escribe en la memoria 0 el valor de 1 para que no    
                    ;se vuelva a grabar otra vez estos datos en el RTC
    
    goto inicio                 ;ir a presentar los datos en el LCD
end

'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ANTIRREBOTE%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TECLAS:
    FLAG=0
    FOR X = 1 TO 200
    if DOWN_MODE == 1 THEN CNFG_ALARM
    if SET == 1 then      
         PAUSE 200
         IF SET == 1 THEN GOTO SET_TIME
    ENDIF
    FLAG=1                     ;bandera de tecla; evita que cuente + de 1 vez
    NEXT
RETURN
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

SET_TIME: 

    POS=$80
    LIMIT=36
    TIMEX=HORA
    GOSUB CHD
    I2CWRITE DPIN,CPIN,%11010000,2,[TIMEX]
       PAUSE 10
    
    POS=$83
    TIMEX=MINU
    LIMIT=90
    GOSUB CHD
    I2CWRITE DPIN,CPIN,%11010000,1,[TIMEX]
       PAUSE 10
       
    POS=$C0
    TIMEX=diaS
    LIMIT=8
    GOSUB CHD
    I2CWRITE DPIN,CPIN,%11010000,3,[TIMEX]
       PAUSE 10
    
    POS=$C4
    TIMEX=diaf
    LIMIT=50
    GOSUB CHD
    I2CWRITE DPIN,CPIN,%11010000,4,[TIMEX]
       PAUSE 10
    
    POS=$Ce
    TIMEX=anio
    LIMIT=50
    GOSUB CHD
    I2CWRITE DPIN,CPIN,%11010000,6,[TIMEX]
       PAUSE 10
         
IF SET == 1 THEN GOTO INICIO
    
CHD:

    REPEAT
        TEMP1=TIMEX
        IF UP == 1 THEN
           if (TEMP1 == $39) OR (TEMP1 == $49) or (TEMP1 == $9) THEN
              TIMEX=TIMEX+7
           ELSE
               TIMEX=TIMEX+1
           ENDIF       
           if (TEMP1 == $19) OR (TEMP1 == $29) THEN TIMEX=TIMEX+7 
        ENDIF
        
        IF TIMEX == LIMIT THEN TIMEX = 0
           
        IF DOWN_MODE == 1 THEN
           if (TEMP1 == $30) OR (TEMP1 == $40) THEN
                     TIMEX=TIMEX-7
              ELSE
                    if TEMP1>0 then TIMEX=TIMEX-1
           ENDIF
          
           if (TEMP1 == $10) OR (TEMP1 == $20) THEN TIMEX=TIMEX-7 
        ENDIF
        
 
        lcdout $fe,POS, "__ "
        PAUSE 200
        lcdout $fe,POS, HEX2 TIMEX;," "
        PAUSE 200
    UNTIL SET == 1
    
    PAUSE 100
RETURN

CNFG_ALARM:
           if FLAG = 0 then return      ;bandera de tecla
           FLAG = 0                     ;bandera de tecla, cuando ya ha sido pulsada
           lcdout $fe,1,"ALARMA"
           PAUSE 3000
           RETURN
 
Estoy sorprendido que la cosa aun este tan asi :eek:, pero, vamos de nuevo por parte, las definiciones de lcd normalmente se refieren a direcciones de memorias y funciones a esas direcciones a las cuales cargamos un dato y luego según el comando lcdout envía el carácter alfanumérico, todo eso lo hace en segundo plano el PBP. Por lo cual no lo percibimos, ahora, debemos tomar en cuenta que esos comando no configuran los puertos ni los pines, como entrada o salida, por regla general ya sea en pbp, asm, etc... Hay que configurar los pines. Entonces, eso se realiza con los registros TRISA, TRISB, TRISX, dependiendo de la cantidad de puertos que tenga el microcontrolador. Si vamos a configurar solo un pin, digamos el pin 0 "cero" del puerto A seria:
Cualquiera hace lo mismo.
Código:
TRISA.0 = %0 'En binario
TRISA.0 = $0  'En exadecimal
TRISA.0 = 0    'En decimal

Por costumbre, siempre se utiliza en binario o hexadecimal

Ahora si queremos ahorrar lineas de código podemos configurar todos lo pines de una sola vez. Digamos del puerto A, los pines del 7 al 4 son entradas y del 3 al 0 son salidas, entonces quedaria asi:


Código:
TRISA = %11110000 'Uno se refiere a entrada en ingles "In" y cero a salida en ingles "out"


Luego de configurar los pines como entradas y salidas, entonces ya podemos cargar un dato y sabemos que al pasarlo de las direcciones de propósito general donde se guarda la información que va a ser transmitida a la lcd, se cargue en el pin, el pín va a reflejarlo.

Otro dato importante, los fuses aunque no son todos obligatorios, hay unos que pueden afectarnos según sea su función. Ejemplo: el fuse del MCLR, si no se va utilizar debe indicarse de lo contrario hay que colocar un sistema que permita la puesta en marcha y el reset del microcontrolador. Pongamos que no indicamos nada para el fuse del MCLR, y programamos el microcontrolador y ese pin lo utilizamos como otro pin mas de entrada de proposito general, que va a suceder, el pic se va a estar reset siempre:eek:hno: o en determinados momentos no va a funcionar adecuadamente, por eso es importante definirlos de una vez ya que para luego es tarde.

Una manera efectiva de hacerlo es con la hoja de datos ya que en ella aparecen todos bien detallados, y para ayudarnos, contamos con el archivo .INC, el cual se encuentra en la carpeta del PBP, alli hay una carpeta llamada INC, la abrimos con microcode o bloc de notas, y vamos a ver todo lo relacionado al microcontrolador, fuses, registros especiales, etc... Entonces copiamos los fuses y los pegamos en el codigo que estamos haciendo y alli ya esta, empezamos a configurar y definir los fuses. Para el caso del 16F84A seria:

localizamos el archivo INC, para el 16F84A, es "M16F8X.INC", se llama asi por que no solo se trata del 16F84A, y también el 16F84 Y 16F83.

Esto es lo que copias del archivo INC, y lo modificas.

Código:
PIC16F83        equ     50010400h       ; 14-Bit, 512 Code, 64 EE, ID = 0
PIC16F84        equ     50020401h       ; 14-Bit,  1K Code, 64 EE, ID = 1
PIC16F84A       equ     50020401h       ; 14-Bit,  1K Code, 64 EE, ID = 1

					; *** DEVICE Fuses Definitions
RC_OSC          equ     3FFC0003h       ; XX XXXX XXXX XX11
HS_OSC          equ     3FFC0002h       ; XX XXXX XXXX XX10
XT_OSC          equ     3FFC0001h       ; XX XXXX XXXX XX01
LP_OSC          equ     3FFC0000h       ; XX XXXX XXXX XX00
WDT_ON          equ     3FFB0004h       ; XX XXXX XXXX X1XX
WDT_OFF         equ     3FFB0000h       ; XX XXXX XXXX X0XX
PWRT_OFF        equ     3FF70008h       ; XX XXXX XXXX 1XXX
PWRT_ON         equ     3FF70000h       ; XX XXXX XXXX 0XXX
PROTECT_OFF    equ     000FFFF0h       ; 11 1111 1111 XXXX
PROTECT_ON      equ     000F0000h       ; 00 0000 0000 XXXX

Y quedaría algo así según sea cada caso se modifica.

Código:
@ DEVICE PIC16F84A    	       
@ DEVICE XT_OSC                  
@ DEVICE WDT_OFF        
@ DEVICE PWRT_OFF       
@ DEVICE PROTECT_OFF

Unas ves configurados los fuses, lo que sigue es la definicion de frecuencia del OSC, hay que tomar en cuenta que segun manual, debe escribirse "OSC" todo en mayuscula y no "Osc" o derivados ya que puede que el PBP no lo tome.

quedaria asi:

Código:
DEFINE OSC 4

Aparte de eso que otra cosa puede afectarnos el funcionamiento del microcontrolador, bueno hay ciertas caracteristicas y registros especiales que trae cada microcontrolador, según sea el caso siempre es mejor leer la datasheet para estar seguro de lo que estamos haciendo. Los mas criticos son los ADC y comparadores ADC, lo que sucede es que hay y repito no se aplica en todos, ciertos microcontroladores a los cuales hay que desactivarle los ADC y/o los comparadaores ADC, estoy se hace con los comandos definidos para cada registro y como saber que nombre tiene el regstro en el PBP, pues en el mismo archivo INC, encontramos los renombres para cada registro.

Para el 16F84/16F84A/16F83 estan dispuesto asi:

Código:
INDF            equ     00h             ; Indirect Data
TMR0            equ     01h             ; Real Time Clock/Counter
PCL             equ     02h             ; Program Counter (LSB)
STATUS          equ     03h             ; Status Flags
FSR             equ     04h             ; File Select Register
PORTA           equ     05h             ; Port A Data
RA              equ     05h
PORTB           equ     06h             ; Port B Data
RB              equ     06h
EEDATA          equ     08h             ; EEPROM Data
EEADR           equ     09h             ; EEPROM Address
PCLATH          equ     0Ah             ; Program Counter (MSB)
INTCON          equ     0Bh             ; Interrupt Control
OPTION_REG      equ     81h             ; OPTION Register
TRISA           equ     85h             ; Port A Tristate Control
TRISB           equ     86h             ; Port B Tristate Control
EECON1          equ     88h             ; EEPROM Control 1
EECON2          equ     89h             ; EEPROM Control 2

					; *** STATUS Bits
C               equ     0               ; Carry
DC              equ     1               ; Digit (Half) Carry
Z               equ     2               ; Zero
PD              equ     3               ; Power Down
TO              equ     4               ; Time Out
RP0             equ     5               ; Direct Data Page Select 0
RP1             equ     6               ; Direct Data Page Select 1
IRP             equ     7               ; Indirect Data Page Select

					; *** INTCON Bits
RBIF            equ     0               ; PORTB[4..7] Change Interrupt Flag
INTF            equ     1               ; RB0/INT Interrupt Flag
T0IF            equ     2               ; Timer0 Overflow Interrupt Flag
RBIE            equ     3               ; PORTB[4..7] Change Interrupt Enable
INTE            equ     4               ; RB0/INT Interrupt Enable
T0IE            equ     5               ; Timer0 Overflow Interrupt Enable
EEIE            equ     6               ; EEPROM Interrupt Enable
GIE             equ     7               ; Global Interrupt Enable

					; *** OPTION_REG Bits
PS0             equ     0               ; Prescaler Divisor Select (3 Bits)
PS1             equ     1
PS2             equ     2
PSA             equ     3               ; Prescaler Assignment
T0SE            equ     4               ; Timer0 Source Edge Select
T0CS            equ     5               ; Timer0 Clock Source Select
INTEDG          equ     6               ; RB0/INT Edge Select
RBPU            equ     7               ; Port B Weak Pull-Up Enable

					; *** EECON1 Bits
RD              equ     0               ; EEPROM Read Control
WR              equ     1               ; EEPROM Write Control
WREN            equ     2               ; EEPROM Write Enable
WRERR           equ     3               ; EEPROM Write Error Flag
EEIF            equ     4               ; EEPROM Interrupt Flag

Este archivo es muy útil y siempre lo busco para estar seguro, fijjence como fue renombrado el registro de la dirección 06h, que pertenece al PORTB, tiene dos reenombres que cualquiera puede ser usado, uno es el PORTB y el otro es RB. Como prefiero estar seguro pues siempre busco este archivo y comparo con la datasheet y hasta ahora siempre tiene coincidencia.

Como se observa no tiene ni comparador ni modulo ADC, eso se ve mejor en el datasheet, lo que si tiene que vi tratates de configurar, son resistencias para la colocación de 1 lógico, o PULL UP, están resistencias se configuran en este caso del 16F84A, solo para el puerto B, y se hace a través del registro especial llamado OPTION_REG, el bit 7, si esta en 1 desabilita y si esta en 0 habilitas las pull up.

Para ir terminando un poco, las definiciones de la LCD, dejo las características de cada uno:

Código:
Define LCD_DREG PORTB	 ' LCD data pin port, Se elige por que puerto del pic van a salir los datos del registro de datos de la LCD.
Define LCD_DBIT 0	         ' LCD data pin bit ' Se elige a partir de que pin empieza (0 - 4)
se refiere a que si vamos a trabajar la lcd cpn 4 lineas de datos y que esos datos 
van a salir por el puerto B, a partir de que pin empiezan los pines del registro de datos
como lo mínimo de pines de datos son 4, entonces lo máximo puede ser a partir del pin 4 del puerto.
Y quedaría pin 4 del pic con el PIN 4 de datos de la lcd, y luego el 5 del pic con el  5 de datos de la lcd y asi sucesivamente. Y si fuese a apartir del pin0 del pic, seria pin 0 del pic pin 4 del lcd.
Define LCD_RSREG PORTB  ' LCD register select pin port ' Se elige por que puerto del pic va a salir los datos del registro reset de la LCD. 
Define LCD_RSBIT 4           ' LCD register select pin bit, se elige el pin del puerto, para el reset de la lcd.
Define LCD_EREG PORTB	 ' LCD enable pin port, Se elige por que puerto del pic va a salir los datos del registro enable de la LCD.
Define LCD_EBIT 5	         ' LCD enable pin bit, se elige el pin del puerto, para el enable de la lcd.
Define LCD_BITS 4	         ' LCD number of data bits, se elige el modo de control de la lcd, 4 o 8 bits.
Define LCD_LINES 2           ' LCD number of lines, se elige de cuantas lineas va hacer la lcd.

Hasta aquí por ahora

Bueno cualquier duda, me avisan ...saludoss:apreton:
 
Última edición:
Hola amigos del foro, vengo con una duda del microcode y el 18f4550, espero me puedan ayudar.

Estoy trabajando con el control de un ultrasonico, si si se esta a 15 o menos se enciende un led, pero si es mas de 15 cm, se enciende otro led, este programa lo he hecho correr a la perfeccion en un 16f628a, pero al momento de modificarlo para el 18f4550 no funciona en el protoboard, el led se pone a parpadear como loco y no detecta (ya cheque con el multimetro todo lo posible) , este es todo mi codigo:

Código:
define osc 12

cmcon = 7

wDist VAR Word         'Almacenar medida
SALIDA VAR porta.0
LEER VAR porta.1

main:
GOSUB sr_sonar
PAUSE 200
GOTO main

sr_sonar:
pause 10 
salida = 0
PULSOUT SALIDA,5 ' pulso de inicio de10us   trigger
PULSIN LEER,1,wDist ' mide echo
wDist=wDist/6 ' a cm      entre 6
PAUSE 10

IF wDist<15 then
high portb.7
low portb.6
else
low portb.7
high portb.6
endif

RETURN

END

y otro problema es que cuando lo compilo y cargo el hex al pickit me aparece en amarillo: "Warning: Some configuration words not in hex file", aun asi lo graba a la perfeccion en el pic

Me gustaria saber si me pueden ayudar a resolver este problema que llevo un buen rato intentandole y no funciona, y el programa es similar al del 16f628a
 
Esa advertencia es porque no defines los Fuses y eso puede ser factor para que no funcione.

Que no se supone que para eso esta el microcode y el pbp?? los fuses vienen configurados por defecto en el pbp en el 18f4550.inc o hay que volver a configurarlos desde el microcode??

Si pudieran ayudarme con este procedimiento o dandome ideas sobre cual podria ser el problema se los agradecer mucho :)
 
Que no se supone que para eso esta el microcode y el pbp??
Falso, el microcode es una interfaz (editor de Texto), El PBP es un compilador que genera a partir de un codigo basic a uno en ensamblador, y despues de ensambador a lenguaje nativo de PICs (hex) por eso el basic se llama lenguaje de Alto nivel.

los fuses vienen configurados por defecto en el pbp en el 18f4550.inc o hay que volver a configurarlos desde el microcode??
Falso, en el archivo 18f4550.inc estan ligadas las direcciones de los registros del pic a palabras clave. y como dije no lo utiliza el microcode lo utiliza el PBP

Si pudieran ayudarme con este procedimiento o dandome ideas sobre cual podria ser el problema se los agradecer mucho

Para recibir ayuda debes hacer preguntas concretas de otra manera es imposible o muy dificil, o esperar que alguien te pida que subas el proyecto y lo haga por ti.
 
Última edición:
Para recibir ayuda debes hacer preguntas concretas de otra manera es imposible o muy dificil, o esperar que alguien te pida que subas el proyecto y lo haga por ti.

A lo que me referia es que como se hace para configurar los fuses desde microcode studio o como puedo saber la configuracion de bits para hacerlo directo desde el pickit.

Y he probado un programa sencillo para hacer parpadear unos leds para ver si funciona el pic, para leer el dato de un sensor qrd1114 , y por lo menos eso si puede hacer.
 
Última edición:
Para hacerlo desde el software se pone algo parecido a esto:

Código:
@ DEVICE PIC16F84A    	       
@ DEVICE XT_OSC                  
@ DEVICE WDT_OFF        
@ DEVICE PWRT_OFF       
@ DEVICE PROTECT_OFF

pero los propios para el pic18f4550 que son unos cuantos mas. yo no tengo el pickit y desconozco si esos fuses se pueden configurar desde su interfaz.
 
A lo que me referia es que como se hace para configurar los fuses desde microcode studio
Saludos quevon24
Para determinar exactamente que bits de configuración se requieren para cada proyecto,
debes empezar a leer desde la página 288 de la hoja de datos del 18F4550.
Ahora, como lo que quieres es saber como se hace esto desde MCS, aquí adjunto un ejemplo.
Las instrucciones están comentadas dentro del código.

Suerte.
 

Adjuntos

  • 18F4550 Fuses Sample.rar
    28.4 KB · Visitas: 170
Atrás
Arriba