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

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #630 en: 06 de Abril de 2010, 17:56:41 »
Este sencillo ejemplo corre en la EBasic con oscilador interno a 8Mhz:

Código: FreeBasic
  1. Define CONFIG1L = 0x00
  2. Define CONFIG1H = 0x08
  3. Define CONFIG2L = 0x0e
  4. Define CONFIG2H = 0x00
  5. Define CONFIG3L = 0x00
  6. Define CONFIG3H = 0x00
  7. Define CONFIG4L = 0x80
  8. Define CONFIG4H = 0x00
  9. Define CONFIG5L = 0x03
  10. Define CONFIG5H = 0xc0
  11. Define CONFIG6L = 0x03
  12. Define CONFIG6H = 0xe0
  13. Define CONFIG7L = 0x03
  14. Define CONFIG7H = 0x40
  15. Define CLOCK_FREQUENCY = 8
  16. 'NOMBRE:18F1320_PicEBasic_LCD
  17. 'MICRO: PIC18F1320/8Mhz reloj interno
  18. 'Escribe hola en el display con parpadeo.
  19. 'Uso del LCD con bus de datos a 4Bit y sin pin de RW
  20. '************************************************************************************************
  21. '-------------------------------------Puertos del LCD---------------------------------------------
  22. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  23. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  24. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  25. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  26. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  27. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  28. Define LCD_EBIT = 6  'se usara el RB6 como E
  29. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  30. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  31. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
  32. '------------------------------------------------------------------------------------------------------
  33. 'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  34. '------------------------------------Definicion de puertos------------------------------------------
  35. ADCON1 = 0xff  'Los pin I/O digitales
  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. '------------------------------------Inicio------------------------------------------------------------
  40. Lcdinit  'Inicializa el lcd sin cursor
  41. WaitMs 500  'Pausa para estabilizar
  42. main:  'Comienza el programa principal
  43.         Lcdcmdout LcdClear  'Borra el display
  44.         WaitMs 1000  'Hace una pausa de 1Seg.
  45.         Lcdout "HOLA"  'Escribe "HOLA" en el display
  46.         WaitMs 1000  'Hace una pausa de 1Seg.
  47. Goto main  'Impide que termine el programa principal
  48. End
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #631 en: 06 de Abril de 2010, 19:32:52 »
Arrrrrrggg!!, ya he descubierto el problema, faltaba la comilla  en el    " Define SIMULATION_WAITMS_VALUE = 1  " a la hora de compilar.
Ahora curiosamente me respeta los tiempos.


Bueno, solucionado el tema, paso a la siguiente pregunta

Tengo un "potenciometro" realizado a partir de un sensor magnetico y un iman instalado en un gatillo, al apretar el gatillo, este se acerca al sensor y varia la tension.
Mediante una lectura del ADC, con ADCIN, y un preescalado que he determinado anteriormente, (vgat(n)) determino la "posicion" del gatillo.
Una vez hecha la lectura del gatillo y determinada la posicion muestro los valores de "gat" lectura del ADC, y el valor "dlcd" en el LCD, pues bien me encuentro con que si aprieto mut rapidamente a fondo el gatillo la lectura del valor del ADC (gat) y el valor "dlcd" son incongruentes. El gatillo a tope da como valor en el ADC un valor entre 2 y 4 (el sensor da menos tension a medida que se acerca el gatillo), y en cambio el valor de "dlcd" puede ser 20, o 10 o 40 ( segun los intentos) que corresponderian a valores del ADC de 400, 500 o 300.

Entonces mi pregunta es ante una variacion muy rapida del gatillo ,¿ es posible que el adc de un valor antes de finalizar la lectura y el programa vaya avanzando? y por eso me da datos incongruentes

Os muestro el codigo en cuestion.  Hoy voy a realizar la prueva de hacer la lectura del ADC manualmente  con el bucle while adc0.go=1   wend

Código: [Seleccionar]
dlcd = 0

Adcin 2, gat

Select Case gat

Case > vgat(63)
dlcd = 0

Case > vgat(62)  
dlcd = 1

Case > vgat(61)  
dlcd = 2

Case > vgat(60)
dlcd = 3

Case > vgat(59)  
dlcd = 4

                                ...

        Case > vgat(0)  
dlcd = 63

EndSelect


Lcdinit  'Inicializa el lcd sin cursor
WaitMs 500  'Pausa para estabilizar
Lcdcmdout LcdClear  'borra el display
WaitMs 1000  'hace una pausa de 1Seg.
Lcdout "Adc ", #gat, " ", #dlcd  'escribe el caracter "A" en el display
Lcdcmdout LcdLine2Clear  'borra la segunda linea y cursor al principio
WaitMs 1000
Lcdout "P1 ", #vgat(63), "  " #vgat(62)  'muestra los dato
WaitMs 1000  'hace una pausa de 1Seg.




Saludos








« Última modificación: 07 de Abril de 2010, 06:42:58 por 21CURIOSOS »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #632 en: 07 de Abril de 2010, 05:51:54 »
Precisamente la comilla hay que ponerla o suprimir esa línea si trabajamos sobre la realidad. Y por supuesto, compilar de nuevo para que nos implemente las nuevas modificaciones. :mrgreen:
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #633 en: 07 de Abril de 2010, 06:22:35 »
No he llegado a tiempo, me has contestado mientras añadia otro tema en el mensaje anterior, pero me contesto a mi mismo con el bucle while adc0.go=1   wend funciona correctamente, con lo cual entiendo que debe dar valores el adc antes de finalizar la lectura.

Saludos
« Última modificación: 07 de Abril de 2010, 06:44:26 por 21CURIOSOS »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #634 en: 07 de Abril de 2010, 08:40:15 »
La función ADCIN es una función muy lenta, puedes mejorar el rendimiento del modulo ADC programando los registros a mano.
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #635 en: 09 de Abril de 2010, 06:14:14 »
No se que estoy haciendo mal, pero no me funciona el adc manualmente

si yo pongo (gat es una variable del tipo word)
 
  adcin 2,gat
    While ADCON0.GO = 1
   Wend

me da un resultado correcto

en cambio
        ADCON0.CHS3 = 0
   ADCON0.CHS2 = 0
   ADCON0.CHS1 = 1  'Seleccion canal 2
   ADCON0.CHS0 = 0
   ADCON2.ADFM = 1  'Seleccion 10 bits
   While ADCON0.GO = 1
   Wend
   gat.HB = ADRESH
   gat.LB = ADRESL

no me da ningun resultado.

Alguna idea de donde cometo el error

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #636 en: 11 de Abril de 2010, 18:02:13 »
A ver si puedes trabajar a partir de aqui:

Código: Visual Basic
  1. Define CONFIG1L = 0x00
  2. Define CONFIG1H = 0x08
  3. Define CONFIG2L = 0x0e
  4. Define CONFIG2H = 0x00
  5. Define CONFIG3L = 0x00
  6. Define CONFIG3H = 0x00
  7. Define CONFIG4L = 0x80
  8. Define CONFIG4H = 0x00
  9. Define CONFIG5L = 0x03
  10. Define CONFIG5H = 0xc0
  11. Define CONFIG6L = 0x03
  12. Define CONFIG6H = 0xe0
  13. Define CONFIG7L = 0x03
  14. Define CONFIG7H = 0x40
  15. Define CLOCK_FREQUENCY = 8
  16. 'NOMBRE:18F1320_PicEBasic_LCD_ADC
  17. 'MICRO: PIC18F1320/8Mhz reloj interno
  18. 'Uso del LCD con bus de datos a 4Bit y sin pin de RW
  19. 'Configuracion del modulo ADC
  20. '************************************************************************************************
  21. '-------------------------------------Puertos del LCD---------------------------------------------
  22. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  23. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  24. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  25. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  26. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  27. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  28. Define LCD_EBIT = 6  'se usara el RB6 como E
  29. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  30. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  31. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
  32. '------------------------------------------------------------------------------------------------------
  33. 'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  34. '------------------------------------Definicion de puertos------------------------------------------
  35. ADCON1 = %1101111  'Configuracion pin, 1= digitales, 0 = analogicos (AN4)
  36. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  37. TRISA = 0x00  'Configuracion puerto A
  38. TRISB = %00000001  'Puerto B como salidas, AN4 input
  39. ADCON0 = %00010001  'Vref = AVdd y AVss, CH4, ADC ON
  40. ADCON2 = %10101101  '10Bit, 11Tad, Fosc/16 (8Mhz=1Tad=2uSeg.)
  41. 'ADCON2 = %10101110  '10Bit, 11Tad, Fosc/64 (20Mhz=1Tad=3.2uSeg.)
  42. 'Variables globales
  43. Dim _getadc As Word
  44. '------------------------------------Inicio------------------------------------------------------------
  45. Lcdinit  'Inicializa el lcd sin cursor
  46. WaitMs 500  'Pausa para estabilizar
  47. main:  'Comienza el programa principal
  48.         ADCON0.GO = 1
  49.         While ADCON0.GO = 1  'Espera que termine la lectura del módulo ADC
  50.         Wend
  51.         _getadc.HB = ADRESH
  52.         _getadc.LB = ADRESL
  53.         Lcdcmdout LcdLine1Home
  54.         Lcdout "ADC AN4: ", #_getadc, "   "
  55. Goto main  'Impide que termine el programa principal
  56. End
« Última modificación: 02 de Mayo de 2010, 07:52:21 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #637 en: 11 de Abril de 2010, 18:49:57 »
Y aquí con tu programa:

Código: Visual Basic
  1. Define CONFIG1L = 0x00
  2. Define CONFIG1H = 0x08
  3. Define CONFIG2L = 0x0e
  4. Define CONFIG2H = 0x00
  5. Define CONFIG3L = 0x00
  6. Define CONFIG3H = 0x00
  7. Define CONFIG4L = 0x80
  8. Define CONFIG4H = 0x00
  9. Define CONFIG5L = 0x03
  10. Define CONFIG5H = 0xc0
  11. Define CONFIG6L = 0x03
  12. Define CONFIG6H = 0xe0
  13. Define CONFIG7L = 0x03
  14. Define CONFIG7H = 0x40
  15. Define CLOCK_FREQUENCY = 8
  16. 'NOMBRE:18F1320_PicEBasic_LCD
  17. 'MICRO: PIC18F1320/8Mhz reloj interno
  18. 'Uso del LCD con bus de datos a 4Bit y sin pin de RW
  19. 'Configuracion del modulo ADC
  20. '************************************************************************************************
  21. '-------------------------------------Puertos del LCD---------------------------------------------
  22. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  23. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  24. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  25. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  26. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  27. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  28. Define LCD_EBIT = 6  'se usara el RB6 como E
  29. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  30. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  31. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
  32. '------------------------------------------------------------------------------------------------------
  33. 'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  34. '------------------------------------Definicion de puertos------------------------------------------
  35. ADCON1 = %1101111  'Configuracion pin, 1= digitales, 0 = analogicos (AN4)
  36. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  37. TRISA = 0x00  'Configuracion puerto A
  38. TRISB = %00000001  'Puerto B como salidas, AN4 input
  39. ADCON0 = %00010001  'Vref = AVdd y AVss, CH4, ADC ON
  40. ADCON2 = %10101001  '10Bit, 11Tad, Fosc/8 (8Mhz=1Tad=1.6uSeg.)
  41. 'ADCON2 = %10101010  '10Bit, 11Tad, Fosc/32 (20Mhz=1Tad=1.6uSeg.)
  42. 'Variables
  43. Dim _getadc As Word
  44. Dim gat As Word
  45. '------------------------------------Inicio------------------------------------------------------------
  46. Lcdinit  'Inicializa el lcd sin cursor
  47. WaitMs 500  'Pausa para estabilizar
  48. main:  'Comienza el programa principal
  49.  
  50.         'ADCON0.chs3 = 0 'Este micro no tiene CHS3
  51.         ADCON0.CHS2 = 1
  52.         ADCON0.CHS1 = 0  'Seleccion canal 4
  53.         ADCON0.CHS0 = 0
  54.         ADCON2.ADFM = 1  'Seleccion 10 bits
  55.         'WaitUs 10  'Aquí normalmente, en la serie 16F, hace falta hacer una pausa de unos pocos uSegundos
  56.         'para dar tiempo a que se configure el ADC con los nuevos datos, sin embargo en este micro
  57.         'trabajando a 8Mhz no he observado que fuera necesario
  58.  
  59.         ADCON0.GO = 1
  60.         While ADCON0.GO = 1  'Espera que termine la lectura del módulo ADC
  61.         Wend
  62.         gat.HB = ADRESH
  63.         gat.LB = ADRESL
  64.  
  65.         Lcdcmdout LcdLine1Home
  66.         Lcdout "ADC AN4: ", #gat, "   "
  67.  
  68. Goto main  'Impide que termine el programa principal
  69. End

PD: No me he podido leer con detalle la parte del datasheets que explica el funcionamiento del ADC de este micro. Lo unico que puedeo decir es que sobre la EBasic funcionan los dos ejemplos.
PD: Hay que recordar configurar los pin como entrada (reg. TRISx) y analogico mediante el registro ADCON1.

Nota: Después de un repaso al datasheet del micro de los dos ejemplos, indica que 1Tad=2uSeg. para 10Bit, y el cuadro resuelto para varios cristales que nos da el data el cálculo es para 1.6uSeg.=1Tad para 10Bit. Si tomamos este último dato como correcto la línea de configuración que da de la siguiente manera:
ADCON2 = %10101001  '10Bit, 11Tad, Fosc/8 (8Mhz=1Tad=1.6uSeg.)
ADCON2 = %10101010  '10Bit, 11Tad, Fosc/32 (20Mhz=1Tad=1.6uSeg.)
« Última modificación: 02 de Mayo de 2010, 08:12:01 por dogflu66 »
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #638 en: 12 de Abril de 2010, 19:39:43 »
Bueno, ya consegui el manual en español.

El ADCON1 se configura, no directamente, sino con una tabla donde ves, segun los ADC a utilizar, el codigo correspondiente.

Pruebo el codigo y lo comento.

Tambien tengo otro problema que no se si sera electronica o forma de trabajar con el soft.
Tengo el ADC principal que va haciendo lecturas continuas, y si activo otro adc a continuacion, o un pulsador, la lectura del adc principal me varia.
¿Por que motivo puede ser ?

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #639 en: 12 de Abril de 2010, 19:55:08 »
Cuando dices que cambias de ADC: ¿Te refieres que ese micro tiene dos módulos ADC?, o que, ¿cambias de canal de entrada del modulo ADC?. Seguramente lo más fácil de comprobar es el hard, mide los voltajes y comprueba que no varíen. También puede ser una fuente con filtrado pobre.
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #640 en: 13 de Abril de 2010, 18:38:54 »
El tema de los voltajes fue lo primero que comprobe.
El ADC son cambios de canal, pero tambien me sucede al pulsar un pulsador que tengo en una entrada digital.
Tambien desconecte el LCD por si consumia mucho.
Filtrado, hay me pierdo , tengo puesto lo siguiente y con el siguiente orden.

Condensador 100 nf
Conden. Elec. 47 uf
Conden. Elec. 47 uf
Conden. Elec. 47 uf
7805
Conden. Elec. 47 uf
Condensador 100 nf

Por otro lado el tema del adc manual ya me funciona. No activaba el ADCON0.ADON
Lo que no acabo de comprender es como configurar ADCS0-2 y ACQT0-2 del registro ADCON2.
Nota: me refiero a los criterios a utilizar en la seleccion de una configuracion u otra

Código: [Seleccionar]
REGISTRO 21-3: ADCON2: REGISTRO DE CONTROL A/D 2
BIT 7     BIT 6   BIT 5    BIT 4     BIT 3    BIT 2    BIT 1    BIT 0
ADFM        -     ACQT2    ACQT1    ACQT0    ADCS2    ADCS1    ADCS0
R/W-0     U-0     R/W-0    R/W-0     R/W-0      R/W-0    R/W-0      R/W-0
BIT 7 ADFM: Bit selecto del formato A/D del resultado
1 = derecho justificado
0 = izquierdo justificado
BIT 5-3 ACQT2:ACQT0: Bits selectores del tiempo de adquisición
111 = 20 TAD
110 = 16 TAD
101 = 12 TAD
100 = 8 TAD
011 = 6 TAD
010 = 4 TAD
001 = 2 TAD
000 = 0 TAD
(1)
BIT 2-0 ADCS2:ADCS0: Bits selectores del reloj de conversión
111= FRC (reloj A/D derivado del oscilador RC)(1)
110= FOSC/64
101= FOSC/16
100= FOSC/4
011= FRC (reloj A/D derivado del oscilador RC)(1)
010= FOSC/32
001= FOSC/8
000= FOSC/2
« Última modificación: 15 de Abril de 2010, 04:36:19 por 21CURIOSOS »

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #641 en: 14 de Abril de 2010, 07:15:46 »
Mas dudas, tengo un encoder instalado en RB0 (canal A) RB1 ( Canal B), y un pulsador en RB3, pues bien intento ejecutar el siguiente control de interrupciones y me en cuentro que en el simulador funciona totalmente, pero no en la placa.

Si pulso el boton, me funciona, pero si muevo el Encoder no, y he comprobado las tensiones de entrada al pic cuando muevo el encoder y llegan correctamente tanto del canal A como del B

La funcion de este Encoder seria moverse a traves de un menu para poder seleccionar y modificar parametros

Código: [Seleccionar]
Define CLOCK_FREQUENCY = 20
Define CONFIG1L = %00100100  '0x24 %00100100 USBDIV =1 ;CPUDIV1:CPUDIV0 = 00 Postcaler del sistema no se divide ; PLLDIV2:PLLDIV0 =100 Se divide por 5
Define CONFIG1H = %00001100  '0x0c %00001100 IESO=0 ;FCMEN=0; _ _ ;FOC3:FOSC0=1100  Oscilador HS
Define CONFIG2L = %00111110  '0x3e %00111110 VREGEN=1 ;BORV1:BORV0 =11 ; BOREN1:BOREN0=11; PWRTEN= 0
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = %10000001  '0x83 %10000011 MCLRE=1;_ _ _ _ ;LPT1OSC= 0 ; PBADEN = 0;CCP2MX= 1 "CCP2 en RC1"
Define CONFIG4L = %10000000  '0x80 %10000000
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40


'Configuracion LCD

'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTB  'el bus de datos sera el puerto B
Define LCD_DBIT = 4  'el bus de datos seran los 4 bit mas significativos del puerto B
Define LCD_RSREG = PORTC  'el bit de control RS sera del puerto C
Define LCD_RSBIT = 6  'se usara el RC6 como RS
Define LCD_EREG = PORTC  'el bit de control E sera del puerto C
Define LCD_EBIT = 7  'se usara el RC7 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand 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., trucado para simulacion
'------------------------------------------------------------------------------------------------------

Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
'------------------------------------Definicion de puertos------------------------------------------

AllDigital
ADCON1 = %00001010  'Seleccion de AN0 - AN4
CMCON = 0x07  'comparador a off
TRISA = %00101111  'Puerto A como E/S
TRISB = %00000111  'Puerto B como E/S
TRISC = %00000000  'Puerto C como salidas

Define ADC_CLOCK = 3
Define ADC_SAMPLEUS = 30

'--------------------------------------------------------------------------------------------------



'Variables menus
Dim linea1 As Byte
Dim linea2 As Byte
Dim menu1 As Byte  'Gestion de menus 1
Dim menu2 As Byte  'Gestion de menus 2
Dim boton As Bit
Dim encoder As Byte

'Variables para calculos
Dim va As Word
Dim vi As Byte
Dim valor As Word
Dim j As Byte
Dim e As Byte
Dim g As Byte
Dim h As Byte
Dim b As Byte
Dim ai As Byte
Dim af As Byte
Dim mem As Byte
Dim i As Byte

'------------------Interrupciones-----
RCON.IPEN = 1  'interrupciones con prioridad
INTCON.GIE = 1
INTCON.INT0IE = 1  'activo interrupcion INT0
INTCON3.INT1IE = 1  'activo interrupcion INT1
INTCON3.INT1IP = 1  'activo prioridad INT1
INTCON3.INT2IE = 1  'activo interrupcion int2
INTCON3.INT2IP = 1  'activo prioridad INT2


'------------------------------------------------------------------------------------------------------

PORTA = 0x00
PORTC.1 = 0
PORTC.2 = 0
PORTB.0 = 0
PORTB.1 = 0
PORTB.2 = 0


'------------------------------------Inicio------------------------------------------------------------
Break
Lcdinit  'inicializa el lcd sin cursor
WaitMs 500  'pausa para estabilizar

linea1 = 2
linea2 = 2
Gosub lcd
WaitMs 2000
linea1 = 1
linea2 = 1
Gosub lcd



'----------------------------------------- INICIO DEL MAIN
main:



If encoder = 1 Then linea1 = 4
If encoder = 2 Then linea1 = 5
If boton = 1 Then linea1 = 3

Gosub lcd
encoder = 0
boton = 0

Goto main


End                                               

'**************************************Subrrutinas**********************************************
'_
'Control de interrupciones

On High Interrupt
Save System
PWMduty 1, 0
PWMduty 2, 0
INTCON.GIE = 0  'Desactivo interrupciones

If INTCON.INT0IF = 1 Then encoder = 1
If INTCON3.INT1IF = 1 Then encoder = 2
If INTCON3.INT2IF = 1 Then linea1 = 3

INTCON.INT0IF = 0  'Desactivo flag interrupcion INT0
INTCON3.INT1IF = 0  'Desactivo flag interrupcion INT1
INTCON3.INT2IF = 0  'Desactivo flag interrupcion int2
INTCON3.INT1IP = 1  'activo prioridad INT1
INTCON3.INT2IP = 1  'activo prioridad INT2
RCON.IPEN = 1  'interrupciones con prioridad
INTCON.GIE = 1  'activo interrupcions

Resume                                           

'**************************************Subrrutinas**********************************************
menus:  'Rutina de seleciones y modificacion de parametros


Return                                           



lcd:
Lcdcmdout LcdClear  'borra el display
WaitMs 10  'hace una pausa
Select Case linea1
Case 1
Lcdout "Menu 1"
Case 2
Lcdout "Memu 2"
Case 3
Lcdout "Boton pulsado"
Case 4
Lcdout "Encoder A"
Case 5
Lcdout "Encoder B"

Case > 5
Lcdout "No disponible"

EndSelect

Lcdcmdout LcdLine2Clear  'borra la segunda linea y cursor al principio
WaitMs 10
Select Case linea2
Case 1
Lcdout "Linea 2.1"
Case 2
Lcdout "Linea 2.2"
Case > 3
Lcdout "Linea 3.3"

EndSelect

WaitMs 200

Return                                           

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #642 en: 18 de Abril de 2010, 17:47:08 »
Me contesto al ultimo post, he puesto dos pulsadores, en vez del encoder, y entonces ya me funcionan las interrupciones.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #643 en: 01 de Mayo de 2010, 19:58:33 »
El tema de los voltajes fue lo primero que comprobe.
El ADC son cambios de canal, pero tambien me sucede al pulsar un pulsador que tengo en una entrada digital.
Tambien desconecte el LCD por si consumia mucho.
Filtrado, hay me pierdo , tengo puesto lo siguiente y con el siguiente orden.

Condensador 100 nf
Conden. Elec. 47 uf
Conden. Elec. 47 uf
Conden. Elec. 47 uf
7805
Conden. Elec. 47 uf
Condensador 100 nf

Por otro lado el tema del adc manual ya me funciona. No activaba el ADCON0.ADON
Lo que no acabo de comprender es como configurar ADCS0-2 y ACQT0-2 del registro ADCON2.
Nota: me refiero a los criterios a utilizar en la seleccion de una configuracion u otra

Código: [Seleccionar]
REGISTRO 21-3: ADCON2: REGISTRO DE CONTROL A/D 2
BIT 7     BIT 6   BIT 5    BIT 4     BIT 3    BIT 2    BIT 1    BIT 0
ADFM        -     ACQT2    ACQT1    ACQT0    ADCS2    ADCS1    ADCS0
R/W-0     U-0     R/W-0    R/W-0     R/W-0      R/W-0    R/W-0      R/W-0
BIT 7 ADFM: Bit selecto del formato A/D del resultado
1 = derecho justificado
0 = izquierdo justificado
BIT 5-3 ACQT2:ACQT0: Bits selectores del tiempo de adquisición
111 = 20 TAD
110 = 16 TAD
101 = 12 TAD
100 = 8 TAD
011 = 6 TAD
010 = 4 TAD
001 = 2 TAD
000 = 0 TAD
(1)
BIT 2-0 ADCS2:ADCS0: Bits selectores del reloj de conversión
111= FRC (reloj A/D derivado del oscilador RC)(1)
110= FOSC/64
101= FOSC/16
100= FOSC/4
011= FRC (reloj A/D derivado del oscilador RC)(1)
010= FOSC/32
001= FOSC/8
000= FOSC/2

Trabajando el ADC a 10Bit:

BIT 5-3 ACQT2:ACQT0: Bits selectores del tiempo de adquisición:

Con estos bit se selecciona el tiempo de adquisición del modulo ADC, y este dato nos lo da el datasheet del Pic, en mi caso del Pic 18F1320, para el modulo ADC que tiene este micro son 11Tad para 10bit. Sabido esto nos queda configurar estos bits según la tabla, esta tabla no tiene la opción de 11Tad, por lo que según el data del uC elegiremos el inmediato superior (101 = 12 Tad). Se supone que un Tad es igual a un ciclo de reloj cuyo ancho depende de la rapidez del modulo ADC, esto último el datasheet del uC no lo indica.

BIT 2-0 ADCS2:ADCS0: Bits selectores del reloj de conversión:

Para poder configurar estos bit necesitamos un dato de tiempo y este dato nos lo vuelve a dar el data del micro, y es que un Tad=2uSeg. Sabido esto elegimos la fuente del reloj y el divisor a aplicar. Por lo tanto trabajando a 8Mhz elegimos la opción 101 = FOSC/16, porque (8Mhz/16) = 2uSeg. Y en el caso de no obtener el valor exacto el data indica que se seleccione el inmediato superior o coloquemos un cristal con una frecuencia especial, pero esto lleva valorar el perjuicio que puede conllevar a otros módulos como por ejemplo las velocidades del modulo UART.

Nota: 8Mhz/16=0.5Mhz => 1/0.5Mhz = 2uSeg., 11Tad*2uSeg.=22uSeg. Conversión completa 10bit.

Nota: Es posible que configurando otros valores inferiores a los recomendados el modulo funcione correctamente, pero nos arriesgamos que al programar otro micro igual no funcione bien, ya que este ultimo micro puede ser menos tolerante en su configuración (esto último es una mala costumbre que tengo que corregir).

Aquí queda, si hay que corregir o añadir algo, ya sabeis, a postear...
« Última modificación: 02 de Mayo de 2010, 04:43:07 por dogflu66 »
Saludos desde Granada, España.

Desconectado messi1980

  • PIC10
  • *
  • Mensajes: 7
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #644 en: 06 de Mayo de 2010, 12:09:16 »


hola amigos estoy programando el pic12f675 para controlar la potencia de un lampara de 230 v 0%      a  100% con un potenciometro que esta conectado a la pata 1 del micro12f675 ...cruce por zero pata2    pata0 conectada al optotriac despues del optotriac tenemos triac entonces jugamos del desparo del traic


Define ADC_CLOCK = 3  'Set clock source (3=rc)
Define ADC_SAMPLEUS = 50  'Set sampling time in uS

TRISIO = %00000110
ADCON0 = 0x0e
TRISIO.1 = 1
TRISIO.2 = 1
TRISIO.0 = 0
Dim t2400 As Word
Const con = 396
Dim adval As Byte
Dim voltatge As Word
Dim angle2 As Word
Dim k As Byte
Symbol triac = GP0
ADCON0.7 = 1
ANSEL = %00000010
CMCON = 7

inici: Adcin 1, adval
voltatge = (adval * 500) / 1023  'Equates to: (adval * 500)/1024

If GP2 = 1 And voltatge = 50 Then
GP0 = 1
Endif

   


            Select Case 32

angle2 = angle2 - 960
If angle2 < 0 Then
angle2 = 0
Endif
   
               Select Case 33

angle2 = angle2 + 960
If angle2 > 9000 Then
angle2 = 9000
Endif



Goto inici

End                                               


 

anything