Dario, podrías explicar brevemente que es el TINY BOOTLOADER ??? Leí la explicación de D@rkbytes y se entiende para que sirve cargar un bootloader...Saludos !!!
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Pues si leiste la explicacin de Darkbytes y la entendiste, no hay mucho que agregar... es un programa que se usa para cargar un pic serialmente onboard, sin necesidad de estar sacando y poniendo el micro de la placa para reprogramarlo. obviamente el micro debe ser cargado con lo que se llama bootloader, que es un firmware que permite la funcion antes descrita... saludosssDario, podrías explicar brevemente que es el TINY BOOTLOADER ??? Leí la explicación de D@rkbytes y se entiende para que sirve cargar un bootloader...Saludos !!!
CLEAR
DEFINE OSC 20
define __16F628A 1
INCLUDE "modedefs.bas"
INCLUDE "fp2032.bas"
CMCON = 7
TRISA = %00100111
TRISB = 0
PORTA = 255
PORTB.0 = 0
PORTB.1 = 0
SERIAL VAR WORD
SERIAL2 VAR BYTE
THC VAR WORD
THC1 VAR WORD
THC2 VAR WORD
ENTERO VAR WORD
DECIMAL VAR WORD
AJUSTE VAR WORD
AJUSTE2 VAR WORD
GRADOS VAR BYTE
DEFINE LCD_BIT 4
DEFINE LCD_LINES 2
DEFINE LCD_DREG PORTB ; configuro la panta LCD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
LCDOUT $FE,$40,$18,$18,$03,$04,$04,$04,$03,$00 ; POSICION 0 vizualiza los °C
INICIO:
GOSUB SERIAL_IN ; llamo la sub-rutina que comunica el MAX con el pic
GOSUB PUNTO_FLOTANTE1 ; llamo la sub-rutina que maneja el punto flotante
LCDOUT $FE,1
LCDOUT $FE,$80, # ENTERO,".", DEC2 DECIMAL,0
LCDOUT $FE,$C0, # THC2;
;GOSUB SERIAL_ALARMA
PAUSE 250
GOTO INICIO
'Cargo la rutina de punto flotante de microchip
PUNTO_FLOTANTE1:
AINT = SERIAL
GOSUB ITOFA
BINT = 16
GOSUB ITOFB
GOSUB FPDIV
BINT = 100
GOSUB ITOFB
GOSUB FPMUL
GOSUB FTOIA
AINT = AINT - 2475
ENTERO = AINT /100
DECIMAL = AINT //100
RETURN
SERIAL_IN:
LOW PORTB.0
SHIFTIN PORTB.1, PORTB.2,0,[SERIAL\16] ; comunicacion SPI
HIGH PORTB.0
RETURN
END
CLEAR
DEFINE OSC 20
define __16F628A 1
INCLUDE "modedefs.bas"
INCLUDE "fp2032.bas"
CMCON = 7
TRISA = %00100111
TRISB = 0
PORTA = 255
PORTB.0 = 0
PORTB.1 = 0
SERIAL VAR WORD
SERIAL_2 VAR SERIAL.BIT13
SERIAL2 VAR BYTE
THC VAR WORD
THC1 VAR WORD
THC2 VAR WORD
ENTERO VAR WORD
DECIMAL VAR WORD
AJUSTE VAR WORD
AJUSTE2 VAR WORD
GRADOS VAR BYTE
DEFINE LCD_BIT 4
DEFINE LCD_LINES 2
DEFINE LCD_DREG PORTB ; configuro la panta LCD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
LCDOUT $FE,$40,$18,$18,$03,$04,$04,$04,$03,$00 ; POSICION 0 vizualiza los °C
INICIO:
GOSUB SERIAL_IN ; llamo la sub-rutina que comunica el MAX con el pic
GOSUB PUNTO_FLOTANTE1 ; llamo la sub-rutina que maneja el punto flotante
LCDOUT $FE,1
LCDOUT $FE,$80, # ENTERO,".", DEC2 DECIMAL,0
LCDOUT $FE,$C0, #SERIAL_2
;GOSUB SERIAL_ALARMA
PAUSE 250
GOTO INICIO
'Cargo la rutina de punto flotante de microchip
PUNTO_FLOTANTE1:
AINT = SERIAL
GOSUB ITOFA
BINT = 16
GOSUB ITOFB
GOSUB FPDIV
BINT = 100
GOSUB ITOFB
GOSUB FPMUL
GOSUB FTOIA
AINT = AINT - 2475
ENTERO = AINT /100
DECIMAL = AINT //100
RETURN
SERIAL_IN:
LOW PORTB.0
SHIFTIN PORTB.1, PORTB.2,0,[SERIAL\16] ; comunicacion SPI
HIGH PORTB.0
IF SERIAL_2 = 1 THEN SERIAL_ALARMA
RETURN
SERIAL_ALARMA:
LCDOUT $FE,1
LCDOUT $FE,$80, # ENTERO,".", DEC2 DECIMAL,0
LCDOUT $FE,$C0, "TERMOCUPLA OPEN"
PAUSE 100
IF SERIAL_2 = 0 THEN GOTO INICIO
GOTO SERIAL_ALARMA
END
Hola torres. Muchas gracias por responder.
No entiendo cómo hacerlo porque al crear las arrays me dice que están duplicadas y la verdad no veo como hacerlo con el ejemplo que me das.
Cordial saludo. .
Hola Juan, estoy escribiendo del telefono y se me complica esctibirte un ejenplo completo, pero basicamente 1ero creas la variable tipo word (16bits) y despues, la deglosas asi...
Dato_w VAR word [16]
Dato_b VAR bit [0]
Dato_b VAR bit [1]
Etc etc hasta el bit 16...
Hola compañeros, hola torres.
Bueno, ya pude entrar al bit que sensa la termocupla, lo hice creando una variable y llamando el bit serial_2 var serial.bit13 y así me muestra la alerta.
Código:SERIAL_2 VAR SERIAL.BIT13 SERIAL2 VAR BYTE
SERIAL2 VAR WORD
S2_0 VAR SERIAL2.0
S2_1 VAR SERIAL2.1
S2_2 VAR SERIAL2.2
S2_3 VAR SERIAL2.3
S2_4 VAR SERIAL2.4
S2_5 VAR SERIAL2.5
S2_6 VAR SERIAL2.6
S2_7 VAR SERIAL2.7
S2_8 VAR SERIAL2.8
S2_9 VAR SERIAL2.9
etc etc...
S2_16 VAR SERIAL2.16
CLEAR
DEFINE OSC 20
define __16F628A 1
INCLUDE "modedefs.bas"
INCLUDE "fp2032.bas"
;include "fp4032.bas"
CMCON = 7
TRISA = %00100111
TRISB = 0
PORTA = 255
PORTB.0 = 0
PORTB.1 = 0
SERIAL VAR WORD
'SERIAL_15 VAR SERIAL.BIT0
'SERIAL_14 VAR SERIAL.BIT1
'SERIAL_13 VAR SERIAL.BIT2
'SERIAL_12 VAR SERIAL.BIT3
'SERIAL_11 VAR SERIAL.BIT4
'SERIAL_10 VAR SERIAL.BIT5
'SERIAL_9 VAR SERIAL.BIT6
'SERIAL_8 VAR SERIAL.BIT7
'SERIAL_7 VAR SERIAL.BIT8
'SERIAL_6 VAR SERIAL.BIT9
'SERIAL_5 VAR SERIAL.BIT10
'SERIAL_4 VAR SERIAL.BIT11
'SERIAL_3 VAR SERIAL.BIT12
SERIAL_2 VAR SERIAL.13
'SERIAL_1 VAR SERIAL.BIT14
'SERIAL_0 VAR SERIAL.BIT15
ENTERO VAR WORD
DECIMAL VAR WORD
DEFINE LCD_BIT 4
DEFINE LCD_LINES 2
DEFINE LCD_DREG PORTB ; configuro la panta LCD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
LCDOUT $FE,$40,$18,$18,$03,$04,$04,$04,$03,$00 ; POSICION 0 vizualiza los °C
INICIO:
GOSUB SERIAL_IN ; llamo la sub-rutina que comunica el MAX con el pic
GOSUB PUNTO_FLOTANTE1 ; llamo la sub-rutina que maneja el punto flotante
LCDOUT $FE,1
LCDOUT $FE,$80, # ENTERO,".", DEC2 DECIMAL,0
LCDOUT $FE,$C0,#serial_2," BIT DE ALARMA" ;
PAUSE 250
GOTO INICIO
'Cargo la rutina de punto flotante de microchip
PUNTO_FLOTANTE1:
AINT = SERIAL
GOSUB ITOFA
BINT = 4
GOSUB ITOFB
GOSUB FPDIV
BINT = 100
GOSUB ITOFB
GOSUB FPMUL
GOSUB FTOIA
AINT = AINT - 2475
ENTERO = AINT /100
DECIMAL = AINT //100
RETURN
'PUNTO_FLOTANTE2:
' AINT = AJUSTE
' GOSUB ITOFA
' BINT = 100
' GOSUB ITOFB
' GOSUB FPMUL
' GOSUB FTOIA
' AINT = AINT - 2475
' ENTERO = AINT /100
' DECIMAL = AINT //100
' RETURN
PUNTO_FLOTANTE3:
SERIAL_IN:
LOW PORTB.0
SHIFTIN PORTB.1, PORTB.2,0,[SERIAL\14] ; comunicacion SPI
HIGH PORTB.0
IF SERIAL_2 = 1 THEN SERIAL_ALARMA
RETURN
SERIAL_ALARMA:
LCDOUT $FE,1
LCDOUT $FE,$80, # ENTERO,".", DEC2 DECIMAL,0
LCDOUT $FE,$C0, "TERMOCUPLA OPEN"
PAUSE 100
IF SERIAL_2 = 0 THEN GOTO INICIO
GOTO SERIAL_ALARMA
END
Buenas noches compañeros.
torres te cuento que me fue muy bn, pude entrar a bit que me da la alarma de desconexion ó daño de la termocupla, no he podido solucionar lo del desborde de la variable, solo me mide hasta 650° de los 1023° que da, estoy pensando migrar a un pic 18F que se pueda crear una variable tipo long, hasta ahora no se cual, tengo un 18F2550 pero pbp 2.60 no reconoce ese tipo de variables.
Monto la simulacion en proteus 7.9 y el codigo.
Cordial saludo.
Juancaca
'****************************************************************
'* Name : PRUEBAbit.pbp *
'* Author : [ - prof.martintorres@educ.ar - ] *
'* Notice : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 29/03/2016 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
DEFINE OSC 4
define LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 2
X VAR BYTE
SERIAL VAR WORD[16]
SERIAL_0 VAR SERIAL.BIT0
SERIAL_1 VAR SERIAL.BIT1
SERIAL_2 VAR SERIAL.BIT2
SERIAL_3 VAR SERIAL.BIT3
SERIAL_4 VAR SERIAL.BIT4
SERIAL_5 VAR SERIAL.BIT5
SERIAL_6 VAR SERIAL.BIT6
SERIAL_7 VAR SERIAL.BIT7
SERIAL_8 VAR SERIAL.BIT8
SERIAL_9 VAR SERIAL.BIT9
SERIAL_10 VAR SERIAL.BIT10
SERIAL_11 VAR SERIAL.BIT11
SERIAL_12 VAR SERIAL.BIT12
SERIAL_13 VAR SERIAL.BIT13
SERIAL_14 VAR SERIAL.BIT14
SERIAL_15 VAR SERIAL.BIT15
MENU:
PAUSE 10
BIT_02:
SERIAL=0
LCDOUT $FE,1
FOR SERIAL = 1 TO 1023
LCDOUT $FE,$80,"bit0:",DEC SERIAL_0," BIT2:",DEC SERIAL_15
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 50
IF SERIAL_2 = 1 THEN
LCDOUT $FE,1
LCDOUT $FE,$80,"BIT2=",#SERIAL_2," -FIN-"
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 1500
GOTO BIT_05
ENDIF
NEXT
BIT_05:
SERIAL=0
LCDOUT $FE,1
FOR SERIAL = 1 TO 1023
LCDOUT $FE,$80,"bit0:",DEC SERIAL_0," BIT5:",DEC SERIAL_5
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 50
IF SERIAL_5 = 1 THEN
LCDOUT $FE,1
LCDOUT $FE,$80,"BIT5=",#SERIAL_5," -FIN-"
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 1500
GOTO BIT_08
ENDIF
NEXT
BIT_08:
SERIAL=0
LCDOUT $FE,1
FOR SERIAL = 1 TO 1023
LCDOUT $FE,$80,"bit0:",DEC SERIAL_0," BIT8:",DEC SERIAL_8
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 50
IF SERIAL_8 = 1 THEN
LCDOUT $FE,1
LCDOUT $FE,$80,"BIT8=",#SERIAL_8," -FIN-"
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 1500
GOTO BIT_12
ENDIF
NEXT
BIT_12:
SERIAL=0
LCDOUT $FE,1
FOR SERIAL = 1 TO 1023
LCDOUT $FE,$80,"bit0:",DEC SERIAL_0," BIT12:",DEC SERIAL_12
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 50
IF SERIAL_12 = 1 THEN
LCDOUT $FE,1
LCDOUT $FE,$80,"BIT12=",#SERIAL_12," -FIN-"
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 1500
GOTO BIT_15
ENDIF
NEXT
BIT_15:
SERIAL=0
LCDOUT $FE,1
FOR SERIAL = 1 TO 1023
LCDOUT $FE,$80,"bit0:",DEC SERIAL_0," BIT15:",DEC SERIAL_15
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 50
IF SERIAL_15 = 1 THEN
LCDOUT $FE,1
LCDOUT $FE,$80,"BIT7=",#SERIAL_15," -FIN-"
LCDOUT $fe,$C0,#SERIAL_0,#SERIAL_1,#SERIAL_2,#SERIAL_3,#SERIAL_4,#SERIAL_5,#SERIAL_6,#SERIAL_7,#SERIAL_8,#SERIAL_9,#SERIAL_10,#SERIAL_11,#SERIAL_12,#SERIAL_13,#SERIAL_14,#SERIAL_15
PAUSE 2500
ENDIF
NEXT
LCDOUT $FE,1
LCDOUT $FE,$80,"fin del"
LCDOUT $fe,$C0,"ejemplo"
PAUSE 2500
GOTO MENU
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2
define intosc 8
DEFINE ADC_BITS 8
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
trisa = 1
trisb = 0
ADCON0 = %11000001
ADCON1 = %00000000
ANSEL = %00000001
ANSELH = %00000000
;Variables para guardar los valores leidos
LECTURA VAR word
RESULTADO VAR word
;Dar una pausa antes de iniciar para alistar la LCD
LCDOUT $FE, 1 ;Limpiar la LCD
LECTURA_DE_DATOS: ;Bloque de inicio del programa
ADCIN 0, LECTURA ;Leer por PORTA.0 y guardar en LECTURA
RESULTADO = (LECTURA */ 500)>>2;Guardar en RESULTADO la conversion
LCDOUT $FE, 1 ; Limpiar la LCD
LCDOUT $FE, 2, DEC (RESULTADO/100),".",dec2 resultado, "v" ;Mostrar el resultado en la LCD
PAUSE 100 ;Pausa de 100 milisegundos
GOTO LECTURA_DE_DATOS ;Volver al inicio para leer datos
END ;Fin
RESULTADO = (LECTURA */ 500)>>2;Guardar en RESULTADO la conversion
[/code]
¿Cómo se haría para mejorar?Tal cual... al parecer esta lenta la captura
Ver el archivo adjunto 142663
La ayuda de PBP dijo:PWM Pin,Duty,Cycle
Outputs a pulse width modulated pulse train on Pin. Each cycle of PWM consists of 256 steps.
The Duty cycle for each PWM cycle ranges from 0 (0%) to 255 (100%)
This PWM cycle is repeated Cycle times. Pin may be a constant, 0 - 15, or a variable that contains a number 0 - 15 (e.g. B0) or a pin name (e.g. PORTA.0)
The Cycle time of PWM is dependent upon the oscillator frequency.
If a 4MHz oscillator is used, each Cycle would be about 5ms long.
If a 20MHz oscillator is used, each Cycle would be about 1ms in length. Defining an OSC value has no effect on PWM.
The Cycle time always changes with the actual oscillator speed.
Pin is made an output just prior to pulse generation and reverts to an input after generation stops.
The PWM output on a pin looks like so much garbage, not a beautiful series of square waves.
A filter of some sort is necessary to turn the signal into something useful.
An RC circuit can be used as a simple D/A converter.
Example
PWM PORTB.7,127,100 ' Send a 50% duty cycle PWM signal out Pin7 for 100 cycles