[Tutorial] y manejo de Proton IDE

La simulación y la compilación de Protón subida dice 18F4520 y funciona perfectamente.

Cambiando el micro por el susodicho 18F2550, agregando los fusibles que me parecieron correctos( no se si esto es así ya que nunca trabaje/estudie la serie 18) no funciona la comunicación serie(al menos en la recepción.

Realice al vuelo unas modificaciones a lo subido para probar si era problemas de puerto serie y efectivamente solo recibe "0"
Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2021 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 24/11/2021                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

        Device = 18F2550
        Xtal = 4
        

Config_Start
PLLDIV = 1 ;No prescale (4 MHz oscillator input drives PLL directly)
CPUDIV = OSC4_PLL6 ;[Primary Oscillator Src: /1][96 MHz PLL Src: /2]
USBDIV = 1 ;USB clock source comes directly from the primary oscillator block with no postscale
FOSC = HS  ;HS oscillator (HS) XT_XT
FCMEN = OFF ;Fail-Safe Clock Monitor disabled
IESO = OFF ;Oscillator Switchover mode disabled
PWRT = OFF ;PWRT disabled
BOR = OFF ;Brown-out Reset disabled in hardware and software
VREGEN = OFF ;USB voltage regulator disabled
WDT = OFF ;WDT disabled (control is placed on the SWDTEN bit)
PBADEN = OFF ;PORTB<4:0> pins are configured as digital I/O on Reset
LPT1OSC = OFF ;Timer1 configured for higher power operation
MCLRE = OFF ;RE3 input pin enabled; MCLR pin disabled
STVREN = OFF ;Stack full/underflow will not cause Reset
LVP = OFF ;Single-Supply ICSP disabled
XINST = OFF ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
Debug = OFF ;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End

 All_Digital = true 
        
            


Declare Hserial_Baud = 9600 ' velocidad del puerto serie
Declare Hserial_RCSTA 144
Declare Hserial_TXSTA 36
Declare Hserial_Clear = On           

Declare LCD_Type = 0       
Declare    LCD_DTPin        PORTB.0
Declare    LCD_RSPin        PORTB.4
Declare    LCD_ENPin        PORTB.5
Declare LCD_Lines        2
Declare LCD_Interface    4

TRISB = 0

Dim latitud As String *8
Dim longitud As String *9
Dim valido As String *1
Dim tes As Byte

Cls
DelayMS 10

    inicio:
    
    'Cls
    DelayMS 100
    Print At 1,3,"    buscado"
    Print At 2,1,"    satelite"
    HSerIn 100,[ tes ]'[Wait( "$GPGGA" ),skip 37 ,Str valido]
    Toggle PORTB.7
   ' If Val(valido,Dec)<>1 Then GoTo inicio
      
    programa:
  
    DelayMS 100
    'Espera hasta Recibir $GPGGA lo que venga detras es guardado en las variables: latitud,longitud
      
   ' HSerIn [Wait( "$GPGGA" ),skip 12 ,Str latitud,skip 3 ,Str longitud]
    
        
    Print At 1,1, Dec tes'valido'Str latitud,"  Latitud"
    Print At 2,1,Str longitud," Longitud"
    DelayMS 100       
    
    'GoTo programa
   GoTo inicio

Como para verificar que pasa por la instrucción de recepción y lo que "recibe" lo pone en linea 1, posición 1 e invariablemente muestra "0"

Hay algo en la configuración del puerto/fusibles, etc que se me escapa.
 

D@rkbytes

Moderador
Hay algo en la configuración del puerto/fusibles, etc que se me escapa.
Los fuses no son correctos para FOsc = 4 Mhz. (Usa cristal)
Bad_Config.jpg
Yo usaría esta para 4 MHz usando el oscilador interno, aunque preferiría usar los 8 MHz.
Código:
Config_Start
    PLLDIV = 1, CPUDIV = OSC1_PLL2, USBDIV = 1
    FOSC = INTOSC_XT
    FCMEN = OFF, IESO = OFF, PWRT = On
    VREGEN = OFF, WDT = OFF, PBADEN = OFF, LVP = OFF
Config_End
4MHz IntOsc.jpg
 
Gracias por responder.

D@rkibytes , tienes razón el archivo .rar no corresponde con el nombre del micro(18f4520), fue un error al ponerle el nombre.

En el código del 18f4520 no hizo falta la configuración para poder simularlo y funciona bien.

En el código del 18f2550 si no lo configuro NO funciona ni la lcd, use tu configuración y tampoco funciona.



Ricbevi , tienes razón, yo creo también que es problema de configuración( me tiene loco del todo el 18f2550).

Saludos y gracias.
 
Creo que deberías de empezar por algo muy simple para verificar detalles del programador, etc e ir descartando.
Conforme empiecen las cosas a funcionar vas añadiendo cosas.
 
Es lo que hice Scooter

E l programa original es extremadamente simple, imprime leyenda en pantalla, espera entrada por el puerto serie de una cierta cadena de caracteres que usa como referencia, salta una serie de posiciones en la cadena recibida, extrae el dato y lo muestras en las líneas del LCD.

Reforme el programa para que en un lazo cerrado solo reciba un byte del puerto serie y lo muestre en la primera linea del display sin esperar ninguna cadena en especial de caracteres y siempre muestra "0" por lo que deduje que el problema esta en el puerto serie.

La configuración básica del emisor y el receptor esta bien en cuanto a la velocidad, etc (de echo con el otro modelo de PIC funciona correctamente), el problema se plantea al seleccionar este modelo.

Dada esta circunstancia me inclinaba por pensar que la falla proviene de la configuración de algún fusible del PIC o la UART o falla directamente el modelo simularle en Ares.

Acabo de probar y con los pic mas grandes funciona perfectamente con la configuración por defecto de los fusibles del PIC en Proton (Ej:18F4550, 18F46K20 ) pero con la misma familia 18F4455,18F2455 y 18F2250 ni siquiera arranca el programa si no se programa los fusibles.
 
Bueno, de momento dejare este proyecto parado hasta que consiga los gps, luego vere en real lo que ocurra.
En estos dias estube haciendo lo mismo(18f2550) en mikroc(el codigo no es mio, solo modifique algunas cosas) y simularlo en proteus.
Lo dejo por si alguno lo quiere ver.

Saludos a todos
 

Adjuntos

  • gps_2550.rar
    214.5 KB · Visitas: 4
Hola miembro,
Encontré este código en este foro, estoy interesado en usarlo para mi protector de altavoces.
Lo que necesito, una vez que este voltaje de entrada sea superior a 2 V, entonces el LED estará alto o alto, pero necesito que antes de que el LED esté alto (arriba), parpadee unos segundos y luego permanezca alto, y una vez que el voltaje de entrada sea más bajo entonces el led debe ir hacia abajo.
Intenté esto para agregar un poco de retraso, funciona bien, pero el problema es que cuando le doy un voltaje más bajo, el LED sigue subiendo.
Así que por favor ayuda.

Gracias,
Lahmun.
Código:
;*******************************************************************************
; Programa: Main.bas
; Versión: 1.0
; Autor: D@rkbytes
; Compañia: Digitek
; Correo: 
; Notas: Comparación de resultado Float
;*******************************************************************************
Device = 12F683
Reminders = Off
Config INTOSCIO, FCMEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF
Reminders = On
Xtal 8MHz

Declare Create_Coff On

Inicio:
    Symbol LED = GPIO.2         ; Pin de salida para un LED
    Dim Volt As Word
    Dim VoltUp As Float
   
    ADCON0bits_ADFM = 1         ; Justificación a la derecha en la conversión AD
    ANSEL = 0b01110001          ; Osc. interno para el ADC y selección de sAN0
   
    SerOut GPIO.5, 84, [0x00]   ; Iniciar RS-232 por software
    DelayMS 100

Programa:
    While 1 = 1
        Volt = ADIn 0
        VoltUp = (Volt * 5.0) / 1023
       
        If VoltUp < 2.0 Then
             
            GoSub StandBy
        Else
            GoSub PowerOn
           
        End If
        ; Descomentar para depuración:
        SerOut GPIO.5, 84, [#VoltUp, 13, 10]
        DelayMS 250
    Wend
   
 
   
StandBy:
    Low LED
    Return

PowerOn:
    High LED
    DelayMS 250
    Low LED
    DelayMS 250
    High LED
    DelayMS 250
    Low LED
    DelayMS 250
    High LED
    DelayMS 250
    Low LED
    DelayMS 250
    High LED
    DelayMS 250
    Low LED
    DelayMS 250
    High LED
    'Return
 
   End
 

D@rkbytes

Moderador
el problema es que cuando le doy un voltaje más bajo, el LED sigue subiendo.
Eso se resuelve usando una bandera.

Ejemplo:
Código:
Device = 12F683
Reminders = Off
Config INTOSCIO, FCMEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF
Reminders = On
Xtal 8MHz

Declare Create_Coff On

Inicio:
    Dim ADC_In As Word          ; Variable para almacenar el valor del ADC
    Dim b As Byte
    Dim Flag_High As Bit        ; Bandera de estado alto.
    Clear Flag_High             ; Iniciar en 0
    ; Descomentar si se usará depuración RS-232
    ;Symbol Tx_Pin = GPIO.5      ; Pin de salida serial RS-232
    
    Symbol LED = GPIO.2         ; Pin de salida para el LED
  
    ADCON0bits_ADFM = 1         ; Justificación a la derecha en la conversión AD
    ANSEL = 0b01110001          ; Osc. interno para el ADC y selección de sAN0
    
    ; Descomentar si se usará depuración RS-232
    ;SerOut Tx_Pin, 84, [0x00]   ; Iniciar RS-232 por software @ 9600 Bps.
    DelayMS 100
    

Programa:
    While 1 = 1
        ADC_In = ADIn 0
        ; (ADC_In / VRef) * Resolución ADC
        ; (2.0 / 5.0) * 1023 = 409.2
        If ADC_In > 409 Then
            If Flag_High = 0 Then
                Flag_High = 1
                GoSub PowerOn
            End If
        Else
            Flag_High = 0
            GoSub StandBy
        End If
        ; Descomentar si se usará depuración RS-232
        ;SerOut Tx_Pin, 84, [#ADC_In, 13, 10]
        ;DelayMS 250
    Wend
  
 
StandBy:
    Low LED
    
    Return

PowerOn:
    For b = 1 To 4
        High LED
        DelayMS 250
        Low LED
        DelayMS 250
    Next
    
    High LED
    
    Return
 
    End
 

Adjuntos

  • 12F683 ADC 2V.rar
    16.9 KB · Visitas: 3
Eso se resuelve usando una bandera.

Ejemplo:
Código:
Device = 12F683
Reminders = Off
Config INTOSCIO, FCMEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF
Reminders = On
Xtal 8MHz

Declare Create_Coff On

Inicio:
    Dim ADC_In As Word          ; Variable para almacenar el valor del ADC
    Dim b As Byte
    Dim Flag_High As Bit        ; Bandera de estado alto.
    Clear Flag_High             ; Iniciar en 0
    ; Descomentar si se usará depuración RS-232
    ;Symbol Tx_Pin = GPIO.5      ; Pin de salida serial RS-232
    
    Symbol LED = GPIO.2         ; Pin de salida para el LED
  
    ADCON0bits_ADFM = 1         ; Justificación a la derecha en la conversión AD
    ANSEL = 0b01110001          ; Osc. interno para el ADC y selección de sAN0
    
    ; Descomentar si se usará depuración RS-232
    ;SerOut Tx_Pin, 84, [0x00]   ; Iniciar RS-232 por software @ 9600 Bps.
    DelayMS 100
    

Programa:
    While 1 = 1
        ADC_In = ADIn 0
        ; (ADC_In / VRef) * Resolución ADC
        ; (2.0 / 5.0) * 1023 = 409.2
        If ADC_In > 409 Then
            If Flag_High = 0 Then
                Flag_High = 1
                GoSub PowerOn
            End If
        Else
            Flag_High = 0
            GoSub StandBy
        End If
        ; Descomentar si se usará depuración RS-232
        ;SerOut Tx_Pin, 84, [#ADC_In, 13, 10]
        ;DelayMS 250
    Wend
  
 
StandBy:
    Low LED
    
    Return

PowerOn:
    For b = 1 To 4
        High LED
        DelayMS 250
        Low LED
        DelayMS 250
    Next
    
    High LED
    
    Return
 
    End

Hola D@rkbytes
Probé su código en mi simulador, wow, funcionó perfectamente, así como esperaba.
Muchas gracias.


Gracias,
Lahmun.
 
Hola D@rkbytes
Probé su código en mi simulador, wow, funcionó perfectamente, así como esperaba.
Muchas gracias.


Gracias,
Lahmun.
Eso se resuelve usando una bandera.

Ejemplo:
Código:
Device = 12F683
Reminders = Off
Config INTOSCIO, FCMEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF
Reminders = On
Xtal 8MHz

Declare Create_Coff On

Inicio:
    Dim ADC_In As Word          ; Variable para almacenar el valor del ADC
    Dim b As Byte
    Dim Flag_High As Bit        ; Bandera de estado alto.
    Clear Flag_High             ; Iniciar en 0
    ; Descomentar si se usará depuración RS-232
    ;Symbol Tx_Pin = GPIO.5      ; Pin de salida serial RS-232
   
    Symbol LED = GPIO.2         ; Pin de salida para el LED
 
    ADCON0bits_ADFM = 1         ; Justificación a la derecha en la conversión AD
    ANSEL = 0b01110001          ; Osc. interno para el ADC y selección de sAN0
   
    ; Descomentar si se usará depuración RS-232
    ;SerOut Tx_Pin, 84, [0x00]   ; Iniciar RS-232 por software @ 9600 Bps.
    DelayMS 100
   

Programa:
    While 1 = 1
        ADC_In = ADIn 0
        ; (ADC_In / VRef) * Resolución ADC
        ; (2.0 / 5.0) * 1023 = 409.2
        If ADC_In > 409 Then
            If Flag_High = 0 Then
                Flag_High = 1
                GoSub PowerOn
            End If
        Else
            Flag_High = 0
            GoSub StandBy
        End If
        ; Descomentar si se usará depuración RS-232
        ;SerOut Tx_Pin, 84, [#ADC_In, 13, 10]
        ;DelayMS 250
    Wend
 
 
StandBy:
    Low LED
   
    Return

PowerOn:
    For b = 1 To 4
        High LED
        DelayMS 250
        Low LED
        DelayMS 250
    Next
   
    High LED
   
    Return
 
    End
Hola D@rkbytes ,
Que tu código funcione bien para mí.
Hice un poco para aumentar el led para que esté encendido, una vez que el led principal está encendido.
Así que agrego 3 pines más (3-5-6) como pin de salida.
Mi plan es, si el pin 2 está alto (yo mido es 3,86 voltios) luego de parpadear unos segundos, el pin 2 y 3-5-6 están altos) entonces si el pin 2 se vuelve de voltaje más bajo (dilo en la medida 1,7 Vdc o menos que, el pin 3-5-6 también se apaga)

Código:
    Symbol LED = GPIO.2         'Output pin for the LED
    Symbol BOARD_LED = GPIO.1      'Output pin for mainboard
    Symbol RELAY = GPIO.4                'Output pin for the RELAY
    Symbol TRANSISTOR = GPIO.5     'Output pin for the TRANSISTOR

Código:
 '(ADC_In / VRef) * Resolution of ADC
         '(1.7 / 5.0) * 1023 = 347,8    = This calculate for 1.7 Volt Input
         '(2.0 / 5.0) * 1023 = 409.2    = This calculate for 2 Volt Input
         '(3.0 / 5.0) * 1023 = 613.8    = This calculate for 3 Volt Input
         '(3.9 / 5.0) * 1023 = 797.4    = This calculate for 3.9 Volt Input 
         '(4.0 / 5.0) * 1023 = 818.4    = This calculate for 4 Volt Input
        
        'If ADC_In > 409 Then        'If Input Voltage 2 Volt (409) then
        If ADC_In > 797 Then        'If Input Voltage 3.93 Volt (799.4) then

Código:
PowerOn:
    For b = 1 To 4
        High LED
      '' DelayMS 250
      ''Low LED
      '' DelayMS 250
        
    Next
    'Low LED
    'DelayMS 50
    High BOARD_LED
    'High LED
    DelayMS 50
    High RELAY
    DelayMS 50
    High TRANSISTOR
    Return
    End
Lo que quiero decir es cuando
Código:
 Symbol LED = GPIO.2         ; Pin de salida para el LED
Es alto moverse alrededor de 3.0 voltios luego otro led
Código:
 Symbol BOARD_LED = GPIO.1      'Output pin for mainboard
 Symbol RELAY = GPIO.4          'Output pin for the RELAY
 Symbol TRANSISTOR = GPIO.5     'Output pin for the TRANSISTOR
Llegar alto, pero si led
Código:
Symbol LED = GPIO.2         ; Pin de salida para el LED
Se vuelve baja o digamos obtener 1.7 Vdc, entonces toda la led
Código:
Symbol BOARD_LED = GPIO.1      'Output pin for mainboard
Symbol RELAY = GPIO.4          'Output pin for the RELAY
Symbol TRANSISTOR = GPIO.5     'Output pin for the TRANSISTOR
También volverse bajo o standby

Lo intenté varias veces pero no funciona, 3 led no es el led principal que siempre sube una vez que el led principal GPIO.2 se vuelve más bajo.

Gracias,
Lahmun
 
Arriba