desktop

Curso de programación de PIC en PICBasic Pro

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 !!!
 
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 !!!
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... ;)saludosss
 
Buenas noches compañeros del foro, estoy en un proyecto para hacer un termostato con un MAX6675 y un PIC16F628A, la cuestion es que me gustaria saber como hago para visualizar con algun comando los 16 bit que manda el MAX, este conversor tiene que en el bit 2 cuando esta en 0 la termocupla esta conectada, y pone en 1 el bit si esta desconectada, esto seria para generar un aviso que esta mala o desconectadala termocupla, la conexion del MAX al pic la hice con Shiftin, tambien tengo otro problema es que cuando llega a 650 grados se me desborda y vuelve y empieza desde 0°, estoy utilizando una rutina de punto flotante de microchip, dejo el codigo y el archivo de simulacion.

Cordial saludo y de ante mano muchas gracias :apreton:
Juan Camilo Cardona

Código:
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
 

Adjuntos

  • Termostato.rar
    18.6 KB · Visitas: 49
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 [o]
Dato_b VAR bit [1]
Etc etc hasta el bit 16...
 
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.

---------- Actualizado después de 2 horas ----------

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.
Lo que me falta es cómo hacer que no se me reinicie la medición de los grados, ya que cuando va a los 650° empieza nuevamente desde 0° y debería llegar hasta los 1000° aproximadamente.
Yo sé que se está desbordando, ¿pero como podría hacer con esa rutina de Microchip de punto flotante para que no se me desborde y llegue a los 1000°?
PHP:
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
 
Última edición por un moderador:
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...

Lo que queria decir en el ejemplo, es que tenes que normbrar otra variable tipo bit con ditinto nombre

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

o bien, tambien podes hacer este arreglo:

Código:
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

Por ejemplo, el bit 4 de la variable SERIAL2 seria S2_4
 
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

PHP:
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
 

Adjuntos

  • Termostato prot 7.9.rar
    32.1 KB · Visitas: 31
  • Termostato.jpg
    Termostato.jpg
    250.1 KB · Visitas: 39
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

Hola Juan, estoy compilando con 2.5

PRUEBAbit_2.JPG

Te dejo un ejemplo de como empleo los bits que yo quiero:

Código:
'****************************************************************
'*  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
y este es el circuito por si qures ver como se comporta:

PRUEBAbit.JPG

Basicamente, lo que hice en el ejemplo que te escribi, es que arranque un conteo y cuando llega a determinados BITS, se frene y te lo indique, para luego arrancar de nuevo y parar en otro bit que seleccione...



el tema del desborde, tendria que ponerme a leer la hoja de datos del MAX por que no recuerdo como funciona y ver con mas atencion tu programa...pero desde el vamos, sacaria las librerias FP y lo haria con menos lineas...eso hablando a la ligera...tendria que verla con mas tiempo...saludos
 
Última edición:
Consulta. Estoy aprendiendo PICBasic Pro y mi código no mide más que 1,24 voltios en la pantalla lcd.
No sé qué estoy haciendo mal. Es un voltímetro que hago con el PIC16F883
Código:
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
 

Adjuntos

  • Nueva carpeta (6).rar
    14 KB · Visitas: 27
Última edición por un moderador:
igualmente, varias paginas para tras en este mismo topico, hay varios ejemplos similares de los cuales puede usar como ejemplos... Yo antes de consultar, suelo implementar el buscador o bien, pegarle una leida a todo el topico completo :cool:
 
Despues de hace un buen tiempo me tomo la molestia de volver por aca para compartir un pequeño proyecto que se me ocurrido hacer, ya que estoy trabajando en reparacion de plantas de sonidos, se me vino a la mente el tema de la conversion de audio analogico / digital, estuve leyendo que el audio A/D se invierte atraves de un proceso y luego con un DAC decodificas el audio binario para asi obtener un sonido mas limpio por asi decirlo, se me ocurrio usar el PIC16F877A ya que trae un conversor A/D, logre guardar lo que leia como audio por la entrada analogica RA0 y la guardaba en una variable X, luego establecia que el puerto PORTC = X con eso cuando la musica empezaba a correr el PIC enviaba una serie de codigos de 8 bits en binarios por el puerto C, lo hice en fisico y use el fulano conversor DAC0808 para decodificar el sonido y al final el resultado es que no se entendia lo que se estaba escuchando.

La pregunta es, como se puede mejorar ese problema y nos de un audio limpio?
 

Adjuntos

  • Diagrama.rar
    17.6 KB · Visitas: 49
  • Programacion.zip
    20.9 KB · Visitas: 49
Necesitas aumentar la velocidad de muestreo.
Tal vez mejores la calidad del sonido resultante, elevando la frecuencia del oscilador a 20 MHz, que es la frecuencia máxima para ese PIC.
Ésto es para que alcances el tiempo más corto de conversión, unos 100 ns. y con el reloj del conversor en Fosc/2
De esa forma, al hacer la conversión no creo que logres una calidad muy alta, pero posiblemente mejore.

Nunca lo he hecho de esa forma, pero si he realizado muestreos de hasta 44.1 Khz. reproduciendo archivos WAV desde una micro SD y obteniendo el audio por PWM con el oscilador a 48MHz. (Pero todo este proceso es digital)
 
Ya hablamos de esto el año pasado y esta el mismo ejemplo :rolleyes:
Lo que no re uerdo es en que carpeta de la pc tengo lo que mejore :unsure:

Edit1: aca se arranco hablar del tema:
https://www.forosdeelectronica.com/f24/curso-programacion-pic-picbasic-pro-20658/index139.html

Y estoy buscando en la PC la libreria de DT y ejemplo de esto mismo...la unica manera dr sacar esto adelantr sin implementar C o ASM es justamente con la libreria de DT y drmases que armaron en el foro picbasic... Habia un ejemplo con memoria flash y otro instantaneo (adc-pwm)... Sigo buscando
 
Última edición:
:unsure: Tal cual... al parecer esta lenta la captura
Ver el archivo adjunto 142663
¿Cómo se haría para mejorar?
¿Como dijo D@rkbytes con un cristal mayor de 20 Mhz?
La verdad tenía años que no entraba a la pagina, por eso no me había enterado.
Sería interesante si volvieras a subir el programa de cómo lo mejoraste.

---------- Actualizado ----------

¿Por casualidad este sirve como conversor AD?
Lo hice hace años con un 40106, le conectaba un micrófono y con una etapa amplificadora por la salida se escuchaba con claridad.
 

Adjuntos

  • 40106 Audio.rar
    10.7 KB · Visitas: 55
Última edición por un moderador:
Hola amigos.
Como este tema es de PBP, me paso con esta pregunta.
como se interpretan estas instrucciones de programming editor, PICAXE a PBP

symbol PWMpin = 2 , esta instrucción es válida

PWM (0 a 1016), esta da error. Hay que pasarla a una valida e igual en PBP
 
Última edición:
Si quieres definir un pin para la salida de PWM por software, es igual que definir cualquier otro pin.

Por ejemplo:
Symbol PWMpin = PORTX.X

También se puede de ésta forma:
PWMpin Var PORTX.X

En el documento de ayuda de PBP puedes encontrar información sobre PWM por software.
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
 
Atrás
Arriba