Autor Tema: PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)  (Leído 859817 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #435 en: 22 de Junio de 2008, 19:42:42 »
Resumiendo:

Valor máximo del registro PR2 = 255 (periodo de la frecuencia elegida).
Valor máximo del registro CCPR1L+CCP1X:CCP1Y = 1023 (duty cycle elegido).
Prescaler del Timer2 = 1, 4 o 16.

PROGRAMA:

Código: Visual Basic
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. '********************** Placa Entrenadora (PIC EBadic) ***************************************
  5. 'NOMBRE:16F88_Pic_EBasic_LCD_CCP1_PWM_ADC
  6. 'MICRO: PIC16F88/8Mhz reloj interno
  7. 'Fecha/Autor: 6/08, By COS
  8. 'Version: 1.0
  9. 'Uso del modulo CCP1 trabajando en el modo PWM.
  10. '*********************************************************************************************
  11. '-------------------------------------Puertos del LCD-----------------------------------------
  12. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  13. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  14. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  15. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  16. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  17. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  18. Define LCD_EBIT = 6  'se usara el RB6 como E
  19. Define LCD_COMMANDUS = 1000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
  20. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  21. Define LCD_INITMS = 50  '[Tiempo de espera despues de inicializar el Display,
  22.                                                                                         'solo se ejecuta una vez en mseg.]
  23. '*********************************************************************************************
  24. Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms, solo simulacion
  25. '--------------------------------------Reasignacion de nombres--------------------------------
  26. Symbol led_amarillo = PORTA.7  'led amarillo
  27. Symbol led_verde = PORTB.0  'led verde
  28. Symbol luz_lcd = PORTB.3  'iluminacion del lcd
  29. '------------------------------------declaracion de variables---------------------------------
  30. Dim adc As Word  'contendra el valor de la entrada ADC trabajando a 10bit
  31. Dim duty_cycle As Word  'tiempo a On de la señal
  32. Dim calculo As Long  'variable auxiliar para calculos con 32bit
  33. '------------------------------------Definicion de puertos--------------------------------
  34. ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
  35. CMCON = 0x07  'comparador a off
  36. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  37. TRISA = 0x00  'Puerto A como salidas
  38. TRISB = 0x00  'puerto B como salidas
  39. TRISA.4 = 1  'como entrada (RA4, adc)
  40. TRISA.6 = 1  'como entrada (RA6, tecla S1)
  41. TRISA.5 = 1  'como entrada (RA5, tecla S2)
  42. PORTB.3 = 1  'luz lcd a on (RB3) y PWM (CCP1)
  43. PORTA.7 = 1  'led amarillo a off (RA7), negado
  44. PORTB.0 = 1  'led verde a off (RB0), negado
  45. '----------------------Inicializa el Timer2 y el modulo CCP1 en modo PWM-------------------------
  46. PR2 = %11111001  'periodo de la señal para 500Hz
  47. CCPR1L = %00000000  'comienza con valor 0 (RB3=0), maximo duty cycle 1111100111 = 999
  48. CCP1CON.CCP1X = 0
  49. CCP1CON.CCP1Y = 0
  50. CCP1CON.CCP1M3 = 1  'modo pwm
  51. CCP1CON.CCP1M2 = 1  'modo pwm
  52. T2CON.T2CKPS0 = 1  'prescaler, 1x = 1:16
  53. T2CON.T2CKPS1 = 1
  54. T2CON.TMR2ON = 1  'activa el Timer2
  55. '------------------------------------Inicio----------------------------------------------------
  56. Lcdinit  'inicializa el lcd sin cursor
  57. WaitMs 1000  'espera 1Seg
  58. Lcdout "Pruebas con CCP1"  'escribe en el lcd
  59. Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
  60. Lcdout "PWM MODE (CCP1)"  'escribe en el lcd
  61. WaitMs 3000  'espera 3Seg
  62. Lcdcmdout LcdLine1Clear  'borra el display,linea 1
  63. '------------------------------------rutina del Programa--------------------------------------
  64. main:  'comienza el programa principal
  65.         Adcin 4, adc  'lee la entrada analogica RA4 y guarda el valor en la variable adc
  66.         calculo = (adc * 999) / 1023  'calcula el valor del duty segun el valor leido en el adc
  67.         duty_cycle = calculo  'cambia de long a word
  68.         CCP1CON.CCP1X = duty_cycle.1  'carga bits menos significativos del duty
  69.         CCP1CON.CCP1Y = duty_cycle.0  'carga bits menos significativos del duty
  70.         duty_cycle = ShiftRight(duty_cycle, 2)  'desplaza la variable duty_cycle dos bit a la derecha
  71.         CCPR1L = duty_cycle  'carga los bit mas significativos del duty
  72.         calculo = (adc * 100) / 1023  'calcula el duty cycle en %
  73.         duty_cycle = calculo  'pasa de long a word
  74.         Lcdcmdout LcdLine1Home  'pone cursor del LCD al principio de linea
  75.         Lcdout "ADC ", #adc, " ", "DT %", #duty_cycle, "      "  'Inprime datos en el display
  76. Goto main  'impide que termine el programa principal
  77. End  'es conveniente ponerlo siempre segun el manual

PD. Donde decia '--------Inicializa las iterrupciones y el modulo CCP1 en modo comparador ---------
      ahora dice '-----------------Inicializa el Timer2 y el modulo CCP1 en modo PWM--------------------
« Última modificación: 25 de Junio de 2008, 20:00:21 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #436 en: 22 de Junio de 2008, 19:43:44 »
Pendiente las formulas y el video... :mrgreen:
« Última modificación: 06 de Julio de 2008, 07:50:00 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #437 en: 05 de Julio de 2008, 21:19:47 »
Calculo de la frecuencia a generar por el modulo:

PR2 = ((1/Fr) / (4/Fosc * Prs)) -1
PR2 = ((1/500Hz) / (4/8000000Hz * 16)) –1
PR2 = 249 = 11111001Bin

Siendo:

Fr = Frecuencia deseada en Hz, en este caso 500Hz
Fosc = Frecuencia del Reloj del Pic en Hz, en este caso 8Mhz
4/Fosc = Tiempo de ejecución maquina
Prs = Prescaler del Timer2, puede tomar valores entre 1, 4 y 16, en este caso 16
« Última modificación: 06 de Julio de 2008, 07:08:07 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #438 en: 06 de Julio de 2008, 07:06:42 »
Calculo del duty cycle máximo (100%):

PWM Duty Cycle = (1/Fr) / ((1/Fosc) * Prs)
(CCPR1L:CCP1CON<5:4>) = (1/Fr) / ((1/Fosc) * Prs)
(CCPR1L:CCP1CON<5:4>) = (1/500) / ((1/8000000Hz) * 16)
(CCPR1L:CCP1CON<5:4>) = 1000 = 1111101000Bin
Asignando el valor anterior:
CCPR1L = 11111010Bin
CCP1CON.CCP1X = 0Bin
CCP1CON.CCP1Y = 0Bin

Siendo:

Fr = Frecuencia deseada en Hz, en este caso 500Hz
Fosc = Frecuencia del Reloj del Pic en Hz, en este caso 8Mhz
4/Fosc = Tiempo de ejecución maquina
Prs = Prescaler del Timer2, puede tomar valores entre 1, 4 y 16, en este caso 16
(CCPR1L:CCP1CON<5:4>) = PWM Duty Cycle = Tiempo en estado alto de la señal
CCP1CON.5 = CCP1CON.CCP1X
CCP1CON.4 = CCP1CON.CCP1Y
« Última modificación: 06 de Julio de 2008, 07:10:50 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #439 en: 06 de Julio de 2008, 07:29:27 »
Recordar:

Duty Cycle =0, Entonces la salida del modulo siempre estará a estado bajo

Duty Cycle >= 100%, en este caso 1000, Entonces la salida del modulo estará siempre a estado alto

Esto implica que a los valores máximo y mínimo no hay oscilación.
« Última modificación: 06 de Julio de 2008, 07:51:32 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #440 en: 07 de Julio de 2008, 15:14:16 »
Aqui dejo el video del ejemplo anterior:

« Última modificación: 25 de Agosto de 2008, 19:08:10 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #441 en: 07 de Julio de 2008, 15:30:13 »
Y aqui dejo el video de la simulacion, en este caso la simualcion y el hard estan de acuerdo:


Como no se ve muy bien en Youtube, para el que este realmente interesado lo puede descargar de aquí.

http://rapidshare.com/files/127929679/Pic_EBasic_CCP1.avi.html

Saludos desde Granada, España.

Desconectado fede1592

  • PIC10
  • *
  • Mensajes: 2
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #442 en: 17 de Julio de 2008, 23:35:41 »
hola, miren yo tengo un problema con el pic simulator. miren yo hago el codigo en el pic basic todo re bien para manejar un lcd, y lo compilo y todo bien, pero cuando hago la simulacion siempre en el codigo se traba en la linea "lcdinit 1" :? y no se como arreglarlo. por favor si me pueden ayudar. gracias :lol:

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #443 en: 18 de Julio de 2008, 19:00:17 »
Publica tu codigo y te lo adapto para que puedas simularlo.
Saludos desde Granada, España.

Desconectado fede1592

  • PIC10
  • *
  • Mensajes: 2
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #444 en: 19 de Julio de 2008, 13:55:48 »
mi codigo es:

Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 4
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 3
Define LCD_EREG = PORTB
Define LCD_EBIT = 2
Define LCD_RWREG = 0
Define LCD_RWBIT = 0

Lcdinit 1
loop:
Lcdcmdout LcdHome
Lcdout "hola"
Lcdcmdout LcdClear
Lcdcmdout LcdLine2Home
Lcdout "hola"
Lcdcmdout LcdClear
Goto loop

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #445 en: 19 de Julio de 2008, 14:08:12 »
a continuación de las líneas 'Define' que ya tienes, inserta estas:

Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.

en el menú Rate del Simulador selecciona al menos la opción 'Extremetely Fast' o 'Ultimate' si quieres que la simulación vaya más rápido y, claro está, asegúrate de que la configuración del lcd  del simulador se corresponde con la tuya. esto te lo permite 'autoconfigurar'. simplemente cuando abres el lcd te pregunta si quieres usar la definición del programa... le dices ok y listo

un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #446 en: 19 de Julio de 2008, 15:50:04 »
Código: FreeBasic
  1. 'EJEMPLO SOLO SIMULADOR
  2. 'PIC...?
  3.  
  4. Define CLOCK_FREQUENCY = 4
  5.  
  6. Define LCD_BITS = 4
  7. Define LCD_DREG = PORTB
  8. Define LCD_DBIT = 4
  9. Define LCD_RSREG = PORTB
  10. Define LCD_RSBIT = 3
  11. Define LCD_EREG = PORTB
  12. Define LCD_EBIT = 2
  13. 'Define LCD_RWREG = 0
  14. 'Define LCD_RWBIT = 0
  15.  
  16. Define LCD_COMMANDUS = 100  '2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
  17. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  18. Define LCD_INITMS = 2  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  19.  
  20. AllDigital
  21.  
  22. Lcdinit 1
  23.  
  24. loop:
  25.         Lcdcmdout LcdHome
  26.         Lcdout "hola MUNDO"
  27.         Lcdcmdout LcdClear
  28.         Lcdcmdout LcdLine2Home
  29.         Lcdout "hola MUNDO"
  30.         Lcdcmdout LcdClear
  31. Goto loop

Configurar:

Option/Change Ultimate Rate Refresh Interval = 2000 y habilitar Rate/Ultimate
y para hacelerar mas aun deshabilitar Basic Program Tracking
Saludos desde Granada, España.

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #447 en: 06 de Agosto de 2008, 01:32:45 »
Amigo tengo una pregunta, tengo algunos prolemas con a interfaz RS232..

Yo abro el puerto
Hseropen 9600

y me dedico a enviar..
El tema es que cuando recibo, recibo mal..
Mira yo hago esto:

dim dato as byte
dato = 7

hserout #dato, crlf

ahora en la pc, recibo con un programa llamado texter rs232... Ahora este programa tiene la capacidad de recibir en formato Ascii, Hex y Decimal.

Por lo tanto si yo le pongo que reciba en decimal, me tendria que mostrar un 7 , en hexadecimal un 7 y en ascii, el codigo ascii correspondiente..

Pero no es asi,, de la unica manera que muestra el 7 es en ascii..

En codigo Decimal me muestra:

055 010

Y en Hexadecimal me muestra:

37 0A

Que debo hacer ? Que debe estar pasando ?

« Última modificación: 08 de Agosto de 2008, 17:33:51 por facundo_10 »
PICMANIACO!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #448 en: 09 de Agosto de 2008, 16:13:01 »
hserout #dato, crlf

El símbolo # hace que dato sea enviado en códigos ASCII.
por ejemplo si:
dato = 255
hserout #dato, enviaría tres códigos ASCII, cada uno correspondiente a cada digito del 255.

para conseguir lo que quieres solo tienes que suprimir el símbolo #
hserout dato, crlf, de esta forma se enviara el valor real de dato y así podrás configurar el terminal para que lo interprete como más te convenga.
Saludos desde Granada, España.

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #449 en: 11 de Agosto de 2008, 21:17:48 »
Gracias por la pronta respuesta, y aqui traigo otra duda, con respecto a configurar la velocidad del spi..

Se puede esto ??

Es decir lo que necesito es configurar una frecuencia para el clock del modulo spi.
La frecuencia que necesito obtener mas oe menos es de aproximadamente 312Khz.

Sabe alguien si esto es posible en PSI, y sino de que manera se puede hacer?


Necesito usar instrucciones como esta, estas instrucciones son de Mikrobasic.. Son 100% necesarias para llevar a cabo un proyecto que implica el uso de Multimedia Cards (MMC).. Estos comandos se utilizan para configurar el SPI..

MASTER_OSC_DIV16          'Master Clock=Fosc/16

Creo que esta funcion lo que hace es dividir la frecuencia del cristal en 16... Es decir si se tiene un cristal de 8 mhz, nos dara 500khz...

DATA_SAMPLE_MIDDLE       ' Input data sampled in middle of the interval.

Esta funcion no se que hace.

CLK_IDLE_HIGH                 'Asume el reloj en estado alto..

Esta funcion si mal no recuerdo en PSI, se llama SPICLOCK_INVERT, ya que por defecto esta en estado bajo, para ponerlo en estado alto se necesita hacer:

DEFINE SPICLOCK_INVERT = 1

y como ultimo necesito esta funcion:

 LOW_2_HIGH  'Data transmit on low to high edge.

SI alguien sabe como introducir estas funciones en PSI, ya que me lei el manual, y no hay nada al respecto y creo que sin ellas, me es imposible continuar con el proyecto..

Un saludo!
« Última modificación: 11 de Agosto de 2008, 23:05:05 por facundo_10 »
PICMANIACO!


 

anything