TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jeremylf en 30 de Noviembre de 2011, 07:28:05
-
He estado peleando con este PIC horas para hacerlo función que me lleno de alegría por haberlo conseguido :mrgreen: Les cuento:
El PIC que tengo es un PIC12LF1822, cuando mi padre lo pidio, hace como un año atras, ya no habia en stock en digikey el PIC12F1822. Bueno, primero, me quite un peso de encima al saber que el susodicho PIC era en formato DIP8; pues pensé que era SOIC y me daba flojera tener que hacerle una PCB para poder ponerlo en el protoboard, soldar, etc. Luego, no me gustaba mucho la idea de que fuera LF, ya saben...
Entonces, manos a la obra, el PIC al protoboard, vss y vdd con su 104, un led para test (blink) y conectado directamente el pickit2. Ya me habia asegurado que mi programador (el pickit2) podia programar este PIC (en su version LF no se olviden =D); que, porcierto, solo lo soporta con su propio programa (Pickit 2 Programmer.exe o como quieran llamarle), ya que el MPALB dice que no lo soporta (mas info: AQUI (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en027813))
Luego, con mi CCS v4.112 creo mi programa muy basico (blink ya saben) con su datasheet siempre a la mano. Configurando fusibles y demas... Compilo, todo bien, el pickit2 lo reconoce, programo, ok. Pero no funciona :D He pasado mas de 5 horas (toda la madrugada) busncaod en google, el foro de CCS, el foro de Microchip, bajando .hex, .asm y compilandolos y leyendo y fumando y NADA! Intento cambiar el programador (pues pensé que tal vez por ahí había alguna falla) al ICD2 que también tengo, pero que para que el ICD2 lo programe se necesita un circuito externo... Posteriormente, reviso conexión y aparentemente todo esta bien... Ya alfinal de todo el bendito problema fue que el PUTO cable que le daba vss (GND, tierra, masa) al PIC estaba defectuoso.. ARGGG!!!
Solucione esto y compilo y todo y: "OHH!! el LED prendio!!!. Pero que pasa? Yo puse que haga toggle cada 100ms... PORQUE NO PARPADEAS BENDITO LED!!!" :mrgreen: Pues, verán, ese problema ya es del compilador CCS; si, es un bug (Quien lo diría?). Entonces, como tenia otra versión mas actual instalada (la v4.124), compile ahí y, hasta ahora, todo OK!
Así que, sin aburrirlos mas, dejo todo el proyecto. Quise en un principio simular en el proteus pero en su versión 7.8 SP2 (muy actual) no lo soporta.
Por si se les paso algo:
PIC: 12LF1822 @ 32Mhz: http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en544839
Compilador: CCS v4.124
Programador: Pickit 2 (Con su propio software programador, pues desde el MPLAB no se puede)
Codigo:
#INCLUDE <12LF1822.h>
#FUSES INTRC_IO
#FUSES NOWDT
#FUSES PUT
#FUSES NOMCLR
#FUSES PROTECT
#FUSES NOCPD
#FUSES NOBROWNOUT
#FUSES NOCLKOUT
#FUSES NOIESO
#FUSES NOFCMEN
#FUSES NOWRT
#FUSES PLL_SW
#FUSES STVREN
#FUSES BORV25
#FUSES NODEBUG
#FUSES NOLVP
#USE Delay (Clock = 32 000 000)
#USE FAST_IO(A)
#DEFINE PIN_TEST PIN_A2
void Main (void)
{
setup_oscillator(OSC_8MHZ | OSC_NORMAL | OSC_PLL_ON);
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_dac(DAC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(T0_internal);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC);
set_tris_a(0b001000);
output_a(0);
while (true)
{
output_toggle(PIN_TEST);
delay_ms(100);
}
}
El esquema no es nada del otro mundo: El PIC mismo conectado a vss y vdd con su 104. En RA2 va una R de 220ohm conectada al anodo del LED y pues el catodo a vdd (3.3V eso si ah! suministrado amablemente de mi Pickit2 :mrgreen:). Eso es todo.
Espero no olvidarme de nada más. Ahora si, a dormir :P
-
Hola Jeremy, chevere ver que sigues en los micros, solo una duda, LF significa que funciona a 3.3v? o exactamente a que refiere las siglas? es que me pedi unos samples del 18F4550 pero ya no habia y le chunte al pic18LF4550 y cuando queria ver de que trataba me mandaba el mismo datasheet de la serie F. Ilustrame maestro! :-/
-
Asi es, no puedes trabajar a 5V como comunmente se hace: aique ser mas cauteloso.
-
Asi es, no puedes trabajar a 5V como comunmente se hace: aique ser mas cauteloso.
noooooooooooooooooooooooooooo :shock:
menos mal son samples :o
-
Hahah, si menos mal =D
Bueno, yo sigo probando este PIC. Esta vez con su ESUART:
#INCLUDE <12LF1822.h>
#FUSES INTRC_IO
#FUSES NOWDT
#FUSES PUT
#FUSES NOMCLR
#FUSES PROTECT
#FUSES NOCPD
#FUSES NOBROWNOUT
#FUSES NOCLKOUT
#FUSES NOIESO
#FUSES NOFCMEN
#FUSES NOWRT
#FUSES PLL_SW
#FUSES STVREN
#FUSES BORV25
#FUSES NODEBUG
#FUSES NOLVP
#USE Delay (Clock = 32 000 000)
#USE RS232 (Baud = 115200, UART1)
#USE FAST_IO(A)
#BYTE APFCON = 0x11D
#BIT TXCKSEL = APFCON.2
#BIT RXDTSEL = APFCON.7
#DEFINE PIN_TEST PIN_A2
int1 LLegoDato;
int8 Dato;
void Main (void)
{
setup_oscillator(OSC_8MHZ | OSC_NORMAL | OSC_PLL_ON);
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_dac(DAC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(T0_internal);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC);
TXCKSEL = 1; // Cambia el hardware TX del eusart del RA0 al RA4.
RXDTSEL = 1; // Cambia el hardware RX del eusart del RA1 al RA5.
set_tris_a(0b101000);
output_a(0);
getc(); // Para limpiar el buffer rx.
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while (true)
{
if (LlegoDato == true)
{
printf("%c", Dato);
LlegoDato = false;
}
}
}
#INT_RDA
void RX_Int (void)
{
Dato = getc();
LlegoDato = true;
}
Al max232 tambien lo alimento con 3.3v (proporcionado por el pickit2) para que en mi entrada rx del pic tenga ese voltaje tambien.
TX -> RA4
RX -> RA5
Estos pines los he configurado de su estado default (RA0 (TX) y RA1 (RX)) a travez del registro APFCON.
Saludos!
-
Asi es, no puedes trabajar a 5V como comunmente se hace: aique ser mas cauteloso.
noooooooooooooooooooooooooooo :shock:
menos mal son samples :o
y dime esos LF soportan tensiones de 5V como entrada en los pines de lectura digital? si tienes la referencia me podrias alcanzar el link? gracias!
-
Aguanten... tengo pic18LF4620 y el datasheet dice:
PIC18F2525/2620(1), PIC18F4525/4620(1),
PIC18F2525/2620T(2), PIC18F4525/4620T(2);
VDD range 4.2V to 5.5V
PIC18LF2525/2620(1), PIC18LF4525/4620(1),
PIC18LF2525/2620T(2), PIC18LF4525/4620T(2);
VDD range 2.0V to 5.5V
Para los pics de jeremylf:
PIC12F1822(1), PIC16F1823(1), PIC12F1822T(2),
PIC16F1823T(2);
VDD range 1.8V to 5.5V
PIC12LF1822(1), PIC16LF1823(1), PIC12LF1822T(2),
PIC16LF1823T(2);
VDD range 1.8V to 3.6V
Y para micro_cadaver
PIC18F2455/2550(1), PIC18F4455/4550(1),
PIC18F2455/2550T(2), PIC18F4455/4550T(2);
VDD range 4.2V to 5.5V
PIC18LF2455/2550(1), PIC18LF4455/4550(1),
PIC18LF2455/2550T(2), PIC18LF4455/4550T(2);
VDD range 2.0V to 5.5V
Asi que a mirar el datasheet
saludos
-
Y para micro_cadaver
PIC18F2455/2550(1), PIC18F4455/4550(1),
PIC18F2455/2550T(2), PIC18F4455/4550T(2);
VDD range 4.2V to 5.5V
PIC18LF2455/2550(1), PIC18LF4455/4550(1),
PIC18LF2455/2550T(2), PIC18LF4455/4550T(2);
VDD range 2.0V to 5.5V
Asi que a mirar el datasheet
saludos
Mire el datashhet y encontre en la página 358 - figura 28-2 una grafica que indica que si uso el pic 18LF4550 a 48MHz, debo usar 5V de alimentacion. Bueno eso quiere decir que el chip lo podre usar con 5V de manera normal.
-
Ah mira tu! No sabia eso, gracias.
Al menos, en el PIC12LF1822 es como te mencioné: vdd 3.3v y en sus pines lo mismo. Aqui se ve mejor:
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=36893.0;attach=17267)
-
Bueno y ahora a lo que queria llegar, usar su DAC (Digital to Analog Converter):
#INCLUDE <12LF1822.h>
#FUSES INTRC_IO
#FUSES NOWDT
#FUSES PUT
#FUSES NOMCLR
#FUSES PROTECT
#FUSES NOCPD
#FUSES NOBROWNOUT
#FUSES NOCLKOUT
#FUSES NOIESO
#FUSES NOFCMEN
#FUSES NOWRT
#FUSES PLL_SW
#FUSES STVREN
#FUSES BORV25
#FUSES NODEBUG
#FUSES NOLVP
#USE Delay (Clock = 32 000 000)
#USE RS232 (Baud = 115200, UART1)
#USE FAST_IO(A)
#BYTE APFCON = 0x11D
#BIT TXCKSEL = APFCON.2
#BIT RXDTSEL = APFCON.7
#DEFINE PIN_TEST PIN_A2
int1 LLegoDato, subiendo;
int8 Dato, i;
int16 Tiempo_us;
#ZERO_RAM
void Main (void)
{
setup_oscillator(OSC_8MHZ | OSC_NORMAL | OSC_PLL_ON);
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
//setup_dac(DAC_OFF);
setup_dac(DAC_VSS_VDD | DAC_OUTPUT);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(T0_internal);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC);
TXCKSEL = 1; // Cambia el hardware TX del eusart del RA0 al RA4.
RXDTSEL = 1; // Cambia el hardware RX del eusart del RA1 al RA5.
set_tris_a(0b101000);
output_a(0);
getc(); // Para limpiar el buffer rx.
subiendo = true;
Tiempo_us = 107;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while (true)
{
dac_write(i);
delay_us(Tiempo_us);
if (Subiendo == true)
{
i++;
if (i == 31)
{
Subiendo = false;
}
}
else
{
i--;
if (i == 0)
{
Subiendo = true;
}
}
}
}
#INT_RDA
void RX_Int (void)
{
Dato = getc();
if (Dato == '+') Tiempo_us++;
else if (Dato == '-') Tiempo_us--;
output_toggle(PIN_TEST);
printf("%Lu ", Tiempo_us);
}
Imagen (Onda triangular):
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=36893.0;attach=17269)
VOLTS/DIV: 5V
TIME/DIV:5ms
Este PIC tiene una sola salida para el DAC (por el pin RA0, por eso mutiplexe el eusart), siendo este de 5bits de resolucion (0->31).
Funcionamiento del programa: El PIC empieza emitiendo la señal triangular a una frecuencia de 100hz. A travez del puerto serie, al escribir el simbolo "+" o "-" (sin las comillas), aumentamos o disminuimos, respectivamente, el periodo de esta onda.
-
no manyo, esa señal triangular la genera el pic?
-
Asi es, tiene DAC ese PIC.
-
tienes que probar el:
mTouch™ Sensing oscillator module:
- Up to 4 input channels
-
tienes que probar el:
mTouch™ Sensing oscillator module:
- Up to 4 input channels
Si ya lo hice, solo que todo en protoboard...
-
Bueno ahi va con el mTouch.
Mi dedo debe chocar con el pin RA2 para que detecte... Pero bueno, será por el protoboard. Ya en su momento hare las pruebas con su PCB correspondiente :P
#INCLUDE <12LF1822.h>
#FUSES INTRC_IO
#FUSES NOWDT
#FUSES PUT
#FUSES NOMCLR
#FUSES PROTECT
#FUSES NOCPD
#FUSES NOBROWNOUT
#FUSES NOCLKOUT
#FUSES NOIESO
#FUSES NOFCMEN
#FUSES NOWRT
#FUSES PLL_SW
#FUSES STVREN
#FUSES BORV25
#FUSES NODEBUG
#FUSES NOLVP
#USE DELAY (CLOCK = 32 000 000)
#USE TOUCHPAD (PIN_A2 = 'A')
#USE FAST_IO(A)
#DEFINE PIN_TEST PIN_A4
char Touch_tecla;
#ZERO_RAM
void Main (void)
{
setup_oscillator(OSC_8MHZ | OSC_NORMAL | OSC_PLL_ON);
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_dac(DAC_OFF);
//setup_dac(DAC_VSS_VDD | DAC_OUTPUT);
setup_spi(SPI_SS_DISABLED);
//setup_timer_0(T0_internal);
//setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC);
set_tris_a(0b001100);
output_a(0);
TOUCHPAD_STATE(1); //calibrates, then enters normal state
enable_interrupts(GLOBAL);
while (true)
{
if (touchpad_hit() == true)
{
Touch_tecla = TOUCHPAD_GETC(); //will wait until a pin is detected
if (Touch_tecla == 'A')
output_toggle(PIN_TEST);
}
}
}
Saludos!
-
Jejeje! :D te me adelantaste!!! :P muy bueno tu trabajo con el pequeñin eso es sacarle todo el jugo a un pic. Yo tambien tengo ese pic pero aun no le encontre funcion , solo lo use para un pequeño panel tactil.
De nuevo felicitaciones!!!! ;-)
-
Haha, muchas gracias samshiel_pic :P
-
hola jeremy interesante tu proyecto , justamente estoy tratando de hacer un interruptor tactil para un trabajo, pero no c x donde empezar , y si no fuera mucha molestia podrias poner el programa en asm..
gracias de antemano
-
ajj enserio? :mrgreen:
Bueno, de asm lo unico que tengo es esto:
CCS PCM C Compiler, Version 4.124, 15004 02-Dic-11 21:31
Filename: C:\Jeremy\Probando_PIC12LF1822_CCSv4_124\Prob.lst
ROM used: 255 words (12%)
Largest free fragment is 1792
RAM used: 19 (15%) at main() level
34 (27%) worst case
Stack: 2 worst case (0 in main + 2 for interrupts)
*
0000: MOVLP 00
0001: GOTO 08D
0002: NOP
*
0004: CLRF 03
0005: CLRF 0A
0006: MOVLB 00
0007: MOVF 20,W
0008: MOVWF 24
0009: MOVF 21,W
000A: MOVWF 25
000B: MOVF 22,W
000C: MOVWF 26
000D: MOVF 23,W
000E: MOVWF 27
000F: BTFSS 0B.5
0010: GOTO 013
0011: BTFSC 0B.2
0012: GOTO 023
0013: MOVF 24,W
0014: MOVWF 20
0015: MOVF 25,W
0016: MOVWF 21
0017: MOVF 26,W
0018: MOVWF 22
0019: MOVF 27,W
001A: MOVWF 23
001B: RETFIE
....................
.................... #INCLUDE <12LF1822.h>
.................... //////// Standard Header file for the PIC12LF1822 device ////////////////
*
008A: BCF 0B.2
008B: MOVLP 00
008C: GOTO 013
.................... #device PIC12LF1822
.................... #list
....................
....................
.................... #FUSES INTRC_IO
.................... #FUSES NOWDT
.................... #FUSES PUT
.................... #FUSES NOMCLR
.................... #FUSES PROTECT
.................... #FUSES NOCPD
.................... #FUSES NOBROWNOUT
.................... #FUSES NOCLKOUT
.................... #FUSES NOIESO
.................... #FUSES NOFCMEN
.................... #FUSES NOWRT
.................... #FUSES PLL_SW
.................... #FUSES STVREN
.................... #FUSES BORV25
.................... #FUSES NODEBUG
.................... #FUSES NOLVP
....................
.................... #USE DELAY (CLOCK = 32 000 000)
....................
.................... #USE TOUCHPAD (PIN_A2 = 'A')
....................
.................... #USE FAST_IO(A)
....................
.................... #DEFINE PIN_TEST PIN_A4
....................
.................... char Touch_tecla;
....................
.................... #ZERO_RAM
.................... void Main (void)
.................... {
*
008D: MOVLW 5E
008E: MOVWF 20
008F: MOVLW 21
0090: MOVWF 04
0091: MOVLW 00
0092: MOVWF 05
0093: CLRF 00
0094: INCF 04,F
0095: DECFSZ 20,F
0096: GOTO 093
0097: MOVLW 20
0098: MOVWF 20
0099: MOVLW A0
009A: MOVWF 04
009B: MOVLW 00
009C: MOVWF 05
009D: CLRF 00
009E: INCF 04,F
009F: DECFSZ 20,F
00A0: GOTO 09D
00A1: CLRF 20
00A2: CLRF 05
00A3: CLRF 04
00A4: MOVLW 1F
00A5: ANDWF 03,F
00A6: MOVLW F0
00A7: MOVLB 01
00A8: MOVWF 19
00A9: MOVLW 03
00AA: MOVLB 00
00AB: MOVWF 29
00AC: CLRF 28
00AD: MOVLB 01
00AE: MOVF 15,W
00AF: ANDLW C0
00B0: IORLW 07
00B1: MOVWF 15
00B2: MOVLW C5
00B3: MOVLB 00
00B4: MOVWF 18
00B5: MOVLW 81
00B6: MOVWF 19
00B7: MOVLW 8D
00B8: MOVWF 1E
00B9: MOVLW 02
00BA: MOVWF 1F
00BB: BSF 0B.5
00BC: MOVLB 03
00BD: CLRF 0C
00BE: MOVLB 02
00BF: CLRF 12
00C0: CLRF 11
.................... setup_oscillator(OSC_8MHZ | OSC_NORMAL | OSC_PLL_ON);
00C1: MOVLW F0
00C2: MOVLB 01
00C3: MOVWF 19
....................
.................... setup_adc_ports(NO_ANALOGS|VSS_VDD);
00C4: BCF 1E.0
00C5: BCF 1E.1
00C6: MOVLW 00
00C7: MOVLB 03
00C8: MOVWF 0C
00C9: MOVWF 0E
.................... setup_adc(ADC_OFF);
00CA: MOVLB 01
00CB: BCF 1D.0
.................... setup_dac(DAC_OFF);
00CC: MOVLB 02
00CD: CLRF 18
.................... //setup_dac(DAC_VSS_VDD | DAC_OUTPUT);
.................... setup_spi(SPI_SS_DISABLED);
00CE: BCF 1D.5
00CF: BCF 1D.6
00D0: MOVLB 04
00D1: BCF 15.5
00D2: MOVLW 01
00D3: MOVWF 15
00D4: MOVLW 00
00D5: MOVWF 14
.................... //setup_timer_0(T0_internal);
.................... //setup_timer_1(T1_DISABLED);
.................... setup_timer_2(T2_DISABLED,0,1);
00D6: MOVLB 00
00D7: MOVWF 21
00D8: MOVWF 1C
00D9: MOVLW 00
00DA: MOVWF 1B
.................... setup_ccp1(CCP_OFF);
00DB: MOVLB 05
00DC: CLRF 13
00DD: CLRF 14
00DE: CLRF 15
00DF: BCF 1E.0
00E0: BCF 1E.1
.................... setup_comparator(NC_NC);
00E1: MOVLB 02
00E2: CLRF 12
00E3: CLRF 11
....................
.................... set_tris_a(0b001100);
00E4: MOVLW 0C
00E5: MOVLB 01
00E6: MOVWF 0C
.................... output_a(0);
00E7: MOVLB 02
00E8: CLRF 0C
....................
.................... TOUCHPAD_STATE(1); //calibrates, then enters normal state
00E9: MOVLW 02
00EA: MOVLB 00
00EB: MOVWF 29
....................
.................... enable_interrupts(GLOBAL);
00EC: MOVLW C0
00ED: IORWF 0B,F
....................
.................... while (true)
.................... {
.................... if (touchpad_hit() == true)
00EE: MOVF 28,W
00EF: BTFSC 03.2
00F0: GOTO 0FE
.................... {
.................... Touch_tecla = TOUCHPAD_GETC(); //will wait until a pin is detected
00F1: MOVF 28,W
00F2: BTFSC 03.2
00F3: GOTO 0F1
00F4: CLRF 28
00F5: MOVWF 30
....................
.................... if (Touch_tecla == 'A')
00F6: MOVF 30,W
00F7: SUBLW 41
00F8: BTFSS 03.2
00F9: GOTO 0FE
.................... output_toggle(PIN_TEST);
00FA: MOVLW 10
00FB: MOVLB 02
00FC: XORWF 0C,F
00FD: MOVLB 00
.................... }
.................... }
00FE: GOTO 0EE
.................... }
00FF: SLEEP
Yo te recomiendo que trabajes en C, pero bueno. Exitos!