[Tutorial] y manejo de Proton IDE

Holas Chicos... Estoy tratando de hacer Comunicacion Serial, y no logro conectar Proteus con Proton IDE... Me cuando pulso Serial Com, no me aparece nada... Aqui les dejo una captura... Me dice que no esta instalado... Que archivo y donde puedo descargarlo..?

El ejemplo lo saque de internet, es para mi PIc 16F887

PHP:
Device 16F887
Xtal 8
All_Digital true
TRISA=0
PORTA=0

Declare Hserial_Baud 9600
Dim LED As Byte

Inicio:
    HRSOut "Hola",13
    Repeat
        HRSOut "Introduzca numero de led: ", 13
        HRSIn Dec1 LED
        Until LED >= 1 And LED <= 3
        Select LED
        Case 1:
            Toggle PORTA.0
            DelayMS 10
        Case 2:
            Toggle PORTA.1
            DelayMS 10
        Case 3:
            Toggle PORTA.2
            DelayMS 10
        End Select
        DelayMS 10
GoTo Inicio
End

Aqui dejo otra imagen que no me dejo subirla...
 

Adjuntos

  • Sin título.png
    Sin título.png
    23.2 KB · Visitas: 25
  • asdas.png
    asdas.png
    61.7 KB · Visitas: 20
Necesitas instalar puertos serie virtuales.

Edit:
Una mejora al código:
PHP:
Device 16F887

Reminders = False
Config1 INTOSCIO, FCMEN_OFF, WDT_OFF, PWRTE_ON, LVP_OFF
Reminders = True
Xtal 8MHz
All_Digital = True

Declare Hserial_Baud 9600
Dim LED As Byte

Inicio:
    TRISA = 0b11111000
    PORTA = 0
    HRSOut "Hola", 13

Programa:
    While 1 = 1
        HRSOut "Introduzca numero de led: ", 13
        HRSIn Dec1 LED
        If LED >= 1 And LED <= 3 Then
            Select Case LED
                Case 1
                    Toggle PORTAbits_RA0
                Case 2
                    Toggle PORTAbits_RA1
                Case 3
                    Toggle PORTAbits_RA2
            End Select
        End If
    Wend

    End
 
Última edición:
Una pregunta, chicos, es una maquina CNC que me hice hace unos años atras, y voy a meterles 3 pares de sensor de final de carrera de tipo SWITCH como el de click del mouse. El sensor va trabajar con el PIC 16F628A, en el final de carrera, si o si debo meterle una resistencia PULL-DOWN. Al no poner eso sucede algo?... Puede que haca interferencia o algo? O quemarlo ?.... La maquina CNC trabaja una hora por dia.... Si hay otra solucion para no poner resistencia, alguna idea que me puedan dar?

Aca paso el codigo por si la mosca.

PHP:
Device = 16F628A
Config INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,CP_Off,BODEN_OFF,LVP_OFF,MCLRE_OFF
Xtal = 8   
TRISA=%00000000
TRISB=%10111111
PORTB=0

Dim A As Byte

Symbol XPos = PORTB.0
Symbol XNeg = PORTB.1
Symbol YPos = PORTB.2
Symbol YNeg = PORTB.3
Symbol ZPos = PORTB.4
Symbol ZNeg = PORTB.5
Symbol Rele = PORTB.6
Symbol BT   = PORTB.7
Symbol Bocina = PORTA.0


Inicio:
    If XPos=1 Then GoTo Apagado
    If XNeg=1 Then GoTo Apagado
    If YPos=1 Then GoTo Apagado
    If YNeg=1 Then GoTo Apagado
    If ZPos=1 Then GoTo Apagado
    If ZNeg=1 Then GoTo Apagado
GoTo Inicio
        
        
        
Apagado:
    High Rele
    DelayMS 50
    For A=0 To 4
        Bocina = A
        DelayMS 500
    Next A 
GoTo Selecion

Selecion:
    If BT=1 Then
        Low Rele
        GoTo Inicio
    End If
GoTo Selecion
 

Adjuntos

  • FC.jpg
    FC.jpg
    45.1 KB · Visitas: 20
Las resistencias Pull-Up o Pull-Down siempre son necesarias para definir un estado lógico.
El microcontrolador no se dañará, pero no tendrá un estado lógico definido al estar el pin en estado flotante.
Eso provocará falsas lecturas y hará que tu programa no responda adecuadamente.
¿Por qué? Porque las condiciones ambientales y la estática, harán que el pin de entrada cambie de estado de forma errática.
 
Como dice D@rkbytes siempre se debe referenciar una entrada a masa o a al +B según como se utilice la entrada, de igual manera con cualquier dispositivo lógico, compuerta, contador, flip flop, etc etc,
 
Chicos, estoy tratando de programar un Motor paso a paso, que con un boton varie el tiempo, y un boton para cambio de sentido de giro, resulta que cuando pulso el boton de cambio de giro, cambia bruscamente , horario antihorario horario antihorario horario en forma aleatoria, quisiera saber si hay una solucion que cuando pulso, o lo mantengo pulsado que me cambie sin que sea aleatorio el cambio de giro. Me explico? Aqui paso el codigo.

PHP:
Device 16F887
Xtal 8

TRISC=%11110000
PORTC=0

Declare LCD_Type 0
Declare LCD_RSPin PORTD.2
Declare LCD_ENPin PORTD.3
Declare LCD_DTPin PORTD.4
DelayMS 150
Cls 

Dim A As Word

Symbol BT1 PORTC.4   
Symbol BT2 PORTC.5   
Symbol BT3 PORTC.6   

Dim Tiempo As Word
Tiempo = 100



Horario:
    For A=0 To 8
        PORTC=LookUpL A, [8,12,4,6,2,3,1,9]
            Print At 1,1, "Tiempo:", Dec4 Tiempo
            Print At 2,1, " HORARIO            "
        If BT1=1 Then
            Tiempo = Tiempo + 100
        End If
        If BT2=1 Then
            DelayMS 500
            GoTo Antihorario
        End If
    DelayMS Tiempo
    Next A
GoTo Horario

Antihorario:
    For A=8 To 0 Step -1
     PORTC=LookUpL A, [8,12,4,6,2,3,1,9]
            Print At 1,1, "Tiempo:", Dec4 Tiempo
            Print At 2,1, "ANTIHORARIO            "
            If BT1=1 Then
                Tiempo = Tiempo + 100
            End If
            If BT2=1 Then
                DelayMS 500
                GoTo Horario
            End If
        DelayMS Tiempo
    Next A
GoTo Antihorario
 
Resulta que cuando pulso el botón de cambio de giro, cambia bruscamente , horario antihorario, horario antihorario, en forma aleatoria.
Quisiera saber si hay una solución que cuando pulso, o lo mantengo pulsado, que me cambie sin que sea aleatorio el cambio de giro. ¿Me explico?
Existen varias formas de solucionarlo, pero la forma más sencilla es usando un bucle de espera hasta que se suelte el pulsador.

Por ejemplo:
PHP:
    If BT2 = 1 Then
        While BT2 = 1: Wend    ; Esperar hasta que se suelte el pulsador.
        GoTo Antihorario
    End If
 
Buen día chicos, les cuento que he comprado un Display LCD 16x2 con puerto I2C , que lo compré para ahorrarme los puertos, porque tengo un PIC pequeño 16F819, y me hice un mini alarma conectado con una bocina de camión para mi garaje ya que se viene la fiesta quiero asegurar mi casa. He estado buscando solución para este, he encontrado codigo, he leído el manual de Proton IDE, me compila bien, pero no me aparece nada en el Display. Aquí les paso lo que encontré por internet y además de esto le metí algunos códigos de I2C, para ver si lograba, y nada. Aquí les adjunto el código. Ah, y otra cosa, me recibí de Tecnico Superior Mecatronica hace dos días, eso es gracias a ustedes por haberme ayudado un montón con el tema de programación, y agradezco mucho a D ark y a P andaCBA.
Aquí adjunto el código.

Hay comentario en color azul lo que escribí.

PHP:
Device 16F819
Create_Coff true
Xtal = 8
All_Digital true 

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

Declare SDA_Pin PORTB.1   'Es lo que encontré en el manual de 
Declare SCL_Pin PORTB.4   'Proton IDE, así leyendo lo armé así
Declare Slow_Bus On 

Symbol null = 0
Symbol LCDdelay = 5       'Eso lo encontré gooogleando en 
Symbol SSPIF PIR1.3       'una pagina en ingles
Symbol BF SSPSTAT.0 
Symbol R_W SSPSTAT.2 
Symbol D_A SSPSTAT.5 
Symbol CKP SSPCON.4 
Symbol SSPEN SSPCON.5 
Symbol SSPOV SSPCON.6 
Symbol WCOL SSPCON.7 

Dim buff As Byte 

Init: 
SSPADD = 8 
SSPCON = $36 
GoSub Banner
buff = null

Begin: 
Loop:
If SSPIF = 1 Then 
GoSub i2cSlave
EndIf 

SSPOV = 0 
WCOL = 0

If buff != 0 Then ;
Print buff
buff = 0 
EndIf

GoTo Loop 
Stop 

i2cSlave: 
SSPIF = 0 
If R_W = 1 Then i2cTX 
If BF = 0 Then Return 
If D_A = 1 Then i2cRX 
If SSPBUF != 2 Then Return 
Return

i2cRX: 
buff = SSPBUF ;
Return

i2cTX:
SSPBUF = buff 
CKP = 1 
Return

Banner:
Print $fe,1
DelayMS LCDdelay
Print " * i2cLCD101 *"   'Y no me aparece en la pantalla
Print $fe,$c0
Print "LCD Addr:",@SSPADD   
DelayMS 5000
Print $fe,1
DelayMS LCDdelay
Return

End

Y otra cosa el C.I. del I2C es un PCF8574T

Aquí paso el diagrama también, es exactamente lo mismo.
 

Adjuntos

  • i2c connection between lcd and raspberrypi.png
    i2c connection between lcd and raspberrypi.png
    41.6 KB · Visitas: 20
Última edición:
La instrucción "print" es únicamente usada para pantallas que usan el CI Hitachi 44780, el CI Samsung KS0108, o el CI Toshiba T6963
Lo que estás haciendo no sirve de nada, porque "print" no tiene nada que ver con I2C

Lo que necesitas hacer son una serie de rutinas para que por medio del PCF8574 emules el protocolo.
Proton lo permite hacer relativamente sencillo, usando las instrucciones nativas, como:
BStart, BusOut y BStop

El problema será escribir cadenas directamente, así que se tendrá que hacer uso de arreglos (Arrays)
En los PIC18 si se pueden declarar variables del tipo String, pero implementarlas tal vez sea complejo.
 
Hola.

Estoy haciendo un contador de objetos usando el PIC16F628A. Para los segmentos del Display de leds uso el PORTB; el problema es que necesito usar el RB0 para la interrupción externa (entrada de pulsos a contar) ... y pues el programa ocupa el PORTB para los segmentos y así no puedo usar la interrupción.

Como puedo decirle a PROTON que use el PORTB sin usar el RB0? ... osea que empiece desde RB1.

Muchas gracias a quienes puedan ayudarme.
 
Todo tiene solución en lugar de manejar los dígitos uno por uno manejalos en BCD y utiliza un BCD a 7 segmentos externos como por ejemplo el CD 4511, el 7447, 74C47 y varios más solo necesitas 4 líneas
 
Todo tiene solución en lugar de manejar los dígitos uno por uno manejalos en BCD y utiliza un BCD a 7 segmentos externos como por ejemplo el CD 4511, el 7447, 74C47 y varios más solo necesitas 4 líneas

Esa es otra opción, pero me gustaría ahorrar en hardware ... quiero aprovechar al máximo el micro. Gracias.
Mensaje automáticamente combinado:

Rotando 1 bit a la izquierda el valor que se le dará al puerto B.
Como son 7 bits (1 por segmento) el bit 0 del puerto B quedará libre sin afectar el valor.

Probare esa opción a ver que pasa. Gracias D@rkbytes.
 
¡Perfecto! D@rkbytes ... ya se libero el RB0. Fue exactamente como lo mencionaste.

Así quedo...



Select Case DECIMAL

Case 0

DIGITO = 64 << 1

Case 1

DIGITO = 121 << 1

Case 2

DIGITO = 36 << 1

Case 3

DIGITO = 48 << 1

Case 4

DIGITO = 25 << 1

Case 5

DIGITO = 18 << 1

Case 6

DIGITO = 2 << 1

Case 7 continua...

Nuevamente muchas gracias.:salud:
 
Nota: Olvidé quitar esta parte del inicio.
Código:
    Indice = 0
    Display = LookUp Indice,[0x3F, 0x06, 0x5B, 0x4F, 0x66, _
                             0x6D, 0x7D, 0x07, 0x7F, 0x6F]
    PORTB = Display << 1
    DigUni = 1
    DigDec = 1
Todo eso no es necesario. Lo usé como una prueba antes de escribir el resto del programa.
 
Hola a todos, estoy trabajando en un proyecto con el 12f683 y necesito sacar un promedio de las conversiones A/D (para mejorar la resolución de las medidas). Utilizo variables Word para procesar todo, pero cuando grabo el PIC este corre el programa pero muy lento; si quito la rutina del promedio, el programa funciona pero es mas inexacto, porque ya no promedia.

¿Sera que este PIC no puede manejar variables word?

Esta es la parte de la conversión:

Device = 12F683
Reminders = OFF
Config INTOSCIO,FCMEN_OFF,IESO_OFF,BOD_OFF,CPD_OFF,CP_OFF,MCLRE_OFF,PWRTE_ON,WDT_OFF,BOREN_OFF
Reminders = On
Xtal 8

Declare Adin_Res = 10 'Resolución ADC=10 bits

OSCCON = %01110100 ' 8 mhz Osc interno.
OSCTUNE = %00000000
CMCON0 = %00000111 'Comparador apagado
CMCON1 = %00000000
PIE1 = %00000000
TRISIO =%00001011
ANSEL =%00100011 'ADC 1 y 2 activados
ADCON0 =%10000001 'bit 7 vdd-ref
OPTION_REG = %10000111
INTCON = %11100000
IOC = %00000000

Dim ACUMESR As Word 'Acumula medidas del ADC.
Dim CUENTAS As Byte 'Acumula cuentas.
Dim IN As Word ' Para el ADC.

START:
ADCON0.1 = 1
DelayMS 50
If ADCON0.1 = 1 Then GoTo START
IN = ADIn 0
ACUMESR = ACUMESR + IN
CUENTAS = CUENTAS + 1
If CUENTAS = 10 Then
ACUMESR = ACUMESR / 10
IN = ACUMESR
CUENTAS = 0
GoTo COMP
'EndIf
GoTo START

Gracias por la ayuda.
 
Yo miraria el codigo ensamblador generado para verificar que el compilador no esté metiendo operaciones en punto flotante en el medio de las operaciones.
Yo no se que hace el compilador basic al encontrar una division con el operador "/"
 
Atrás
Arriba