TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pibe en 15 de Febrero de 2009, 16:01:20
-
hola gente:
Necesito de vuestra ayudita.
Tengo una rutinita muy cortita en C, pero como yo no conozco ni papa de C (de asembler si) os pido si por favor , alguno que tengais el CSC para ponerle las variables , device y fuses que le faltan para poder compilarlo.
Es para un PIC18F4550. No interesa donde pongais los pines, sólo que me declareis las variables y lo que le haga falta para que se pueda compilar.
El resto ya me encargo yo
Muchísimas gracias :-/
/*
** SPI_Write_Char
*/
void SPI_Write_Char(char spi_data)
{
char temp1,temp2;
temp1 = (spi_data >> 3) | (0b10000000);
temp2 = ((unsigned int)spi_data << 5);
SPI_CS = 1;
SSPBUF = temp1;
while(!SSPIF); //wait until transmitted
SSPIF = 0;
SSPBUF = temp2;
while(!SSPIF);
SSPIF = 0;
SPI_CS = 0;
}
/*
** SPI_Read_Char
*/
char SPI_Read_Char(void)
{
unsigned char temp,temphi,templo;
SPI_CS = 1; //set CS high
SSPBUF = 0x60; //send read command
while(!SSPIF); //wait until transmitted
SSPIF = 0;
temphi = SSPBUF;
SSPBUF = 0; //send dummy value
while(!SSPIF); //wait until transmitted
SSPIF = 0;
templo = SSPBUF; //read data
SPI_CS = 0; // set CS low
status = templo & 0x10; //needs to verify
temp = ( ((unsigned int)temphi) << 3) | (templo >> 5); //shift to make temp = D7-D0
return temp;
}
-
Supongo que lo que te interesa es el listado en ensamblador de las rutinas ¿verdad?. Intentaré compilarlo y sacarlo.
Un saludo
-
Es que estoy mirando internet todo el fin de semana buscando enlaces relacionados a "VNC1L SPI" y "VDIP SPI".
Es un módulo host usb. El mismo puedes ser usado via SPI, FIFO paralelo y UART.
Desgraciadamente y por lo que leo , la mayoría tuvo gravísimos problemas para hacerlo funcionar en SPI. Incluso simulado por software pierde datos . Y sabes lo que respondieron los que fabrican el módulo? Que únicamente testearon el módulo con UART, que las otras dos interfaces confiesan que no fueron probadas! :shock:
Mañana haré la última prueba via SPI y sino desisto. Utilizaré el EUSART, aunque me cueste unos cuantos pines más y que no sé de donde los voy a sacar :P
Si puedes hacerme el favor de compilarme eso, te lo agradecería.
-
Aquí está el listado, es un montón de líneas:
CCS PCH C Compiler, Version 4.084, 36728 15-feb-09 21:02
Filename: main.lst
ROM used: 364 bytes (1%)
Largest free fragment is 32404
RAM used: 6 (0%) at main() level
13 (1%) worst case
Stack: 2 locations
*
0000: GOTO 00F2
.................... #include "C:\Documents and Settings\Jesus\Mis documentos\Proyectos Proteus\Sacar Rutinas\main.h"
.................... #include <18F4550.h>
.................... //////// Standard Header file for the PIC18F4550 device ////////////////
.................... #device PIC18F4550
.................... #list
....................
.................... #device adc=8
....................
.................... #FUSES NOWDT //No Watch Dog Timer
.................... #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
.................... #FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
.................... #FUSES NOPROTECT //Code not protected from reading
.................... #FUSES NOBROWNOUT //No brownout reset
.................... #FUSES BORV20 //Brownout reset at 2.0V
.................... #FUSES NOPUT //No Power Up Timer
.................... #FUSES NOCPD //No EE protection
.................... #FUSES STVREN //Stack full/underflow will cause reset
.................... #FUSES NODEBUG //No Debug mode for ICD
.................... #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
.................... #FUSES NOWRT //Program memory not write protected
.................... #FUSES NOWRTD //Data EEPROM not write protected
.................... #FUSES IESO //Internal External Switch Over mode enabled
.................... #FUSES FCMEN //Fail-safe clock monitor enabled
.................... #FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
.................... #FUSES NOWRTC //configuration not registers write protected
.................... #FUSES NOWRTB //Boot block not write protected
.................... #FUSES NOEBTR //Memory not protected from table reads
.................... #FUSES NOEBTRB //Boot block not protected from table reads
.................... #FUSES NOCPB //No Boot Block code protection
.................... #FUSES MCLR //Master Clear pin enabled
.................... #FUSES LPT1OSC //Timer1 configured for low-power operation
.................... #FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
.................... #FUSES PLL12 //Divide By 12(48MHz oscillator input)
.................... #FUSES CPUDIV4 //System Clock by 4
.................... #FUSES USBDIV //USB clock source comes from PLL divide by 2
.................... #FUSES VREGEN //USB voltage regulator enabled
.................... #FUSES ICPRT //ICPRT enabled
....................
.................... #use delay(clock=20000000)
.................... #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
*
00E8: BTFSS F9E.4
00EA: BRA 00E8
00EC: MOVWF FAD
00EE: GOTO 016A (RETURN)
....................
....................
....................
.................... //#define SPI_CS PIN_C1
....................
.................... #byte status=0xFD8
.................... #byte PORTC=0xF82
.................... #byte SSPBUF=0xFC9
.................... #byte PIR1=0xF9E
.................... #bit SSPIF=PIR1.3
.................... #bit SPI_CS=PORTC.2
....................
.................... void SPI_Write_Char(char spi_data)
.................... {
.................... char temp1,temp2;
....................
.................... temp1 = (spi_data >> 3) | (0b10000000);
*
0042: RRCF 06,W
0044: MOVWF 00
0046: RRCF 00,F
0048: RRCF 00,F
004A: MOVLW 1F
004C: ANDWF 00,F
004E: MOVF 00,W
0050: IORLW 80
0052: MOVWF 07
.................... temp2 = ((unsigned int)spi_data << 5);
0054: SWAPF 06,W
0056: MOVWF 08
0058: RLCF 08,F
005A: MOVLW E0
005C: ANDWF 08,F
....................
.................... // SPI_CS = 1;
.................... output_high(SPI_CS);
005E: MOVLW 00
0060: BTFSC F82.2
0062: MOVLW 01
0064: MOVWF 09
0066: MOVWF 0A
0068: MOVLW 01
006A: MOVWF 0B
006C: MOVLW 0F
006E: MOVWF 0D
0070: MOVLW 89
0072: MOVWF 0C
0074: RCALL 0004
0076: MOVFF 09,0A
007A: CLRF 0B
007C: MOVLW 0F
007E: MOVWF 0D
0080: MOVLW 92
0082: MOVWF 0C
0084: RCALL 0004
....................
.................... SSPBUF = temp1;
0086: MOVFF 07,FC9
.................... while(!SSPIF); //wait until transmitted
008A: BTFSS F9E.3
008C: BRA 008A
.................... SSPIF = 0;
008E: BCF F9E.3
.................... SSPBUF = temp2;
0090: MOVFF 08,FC9
.................... while(!SSPIF);
0094: BTFSS F9E.3
0096: BRA 0094
.................... SSPIF = 0;
0098: BCF F9E.3
.................... SPI_CS = 0;
009A: BCF F82.2
.................... }
009C: GOTO 0162 (RETURN)
.................... /*
.................... ** SPI_Read_Char
.................... */
.................... char SPI_Read_Char(void)
.................... {
.................... unsigned char temp,temphi,templo;
.................... SPI_CS = 1; //set CS high
00A0: BSF F82.2
.................... SSPBUF = 0x60; //send read command
00A2: MOVLW 60
00A4: MOVWF FC9
.................... while(!SSPIF); //wait until transmitted
00A6: BTFSS F9E.3
00A8: BRA 00A6
.................... SSPIF = 0;
00AA: BCF F9E.3
.................... temphi = SSPBUF;
00AC: MOVFF FC9,07
.................... SSPBUF = 0; //send dummy value
00B0: CLRF FC9
.................... while(!SSPIF); //wait until transmitted
00B2: BTFSS F9E.3
00B4: BRA 00B2
.................... SSPIF = 0;
00B6: BCF F9E.3
.................... templo = SSPBUF; //read data
00B8: MOVFF FC9,08
.................... SPI_CS = 0; // set CS low
00BC: BCF F82.2
.................... status = templo & 0x10; //needs to verify
00BE: MOVF 08,W
00C0: ANDLW 10
00C2: MOVWF FD8
.................... temp = ( ((unsigned int)temphi) << 3) | (templo >> 5); //shift to make temp = D7-D0
00C4: RLCF 07,W
00C6: MOVWF 09
00C8: RLCF 09,F
00CA: RLCF 09,F
00CC: MOVLW F8
00CE: ANDWF 09,F
00D0: SWAPF 08,W
00D2: MOVWF 00
00D4: RRCF 00,F
00D6: MOVLW 07
00D8: ANDWF 00,F
00DA: MOVF 00,W
00DC: IORWF 09,W
00DE: MOVWF 06
.................... return temp;
00E0: MOVFF 06,01
.................... }
00E4: GOTO 0164 (RETURN)
....................
.................... void main()
.................... {
*
00F2: CLRF FF8
00F4: BCF FD0.7
00F6: CLRF FEA
00F8: CLRF FE9
00FA: BSF FB8.3
00FC: MOVLW 08
00FE: MOVWF FAF
0100: MOVLW 02
0102: MOVWF FB0
0104: MOVLW A6
0106: MOVWF FAC
0108: MOVLW 90
010A: MOVWF FAB
010C: MOVF FC1,W
010E: ANDLW C0
0110: IORLW 0F
0112: MOVWF FC1
0114: MOVLW 07
0116: MOVWF FB4
....................
.................... setup_adc_ports(NO_ANALOGS|VSS_VDD);
0118: MOVF FC1,W
011A: ANDLW C0
011C: IORLW 0F
011E: MOVWF FC1
.................... setup_adc(ADC_OFF);
0120: BCF FC2.0
.................... setup_psp(PSP_DISABLED);
0122: BCF F96.4
.................... setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
0124: BCF FC6.5
0126: BCF F94.7
0128: BSF F93.0
012A: BCF F93.1
012C: MOVLW 20
012E: MOVWF FC6
0130: MOVLW 00
0132: MOVWF FC7
.................... setup_wdt(WDT_OFF);
0134: BCF FD1.0
.................... setup_timer_0(RTCC_INTERNAL);
0136: MOVLW 80
0138: MOVWF FD5
.................... setup_timer_1(T1_DISABLED);
013A: CLRF FCD
.................... setup_timer_2(T2_DISABLED,0,1);
013C: MOVLW 00
013E: MOVWF FCA
0140: MOVLW 00
0142: MOVWF FCB
.................... setup_comparator(NC_NC_NC_NC);
0144: MOVLW 07
0146: MOVWF FB4
0148: MOVF F92,W
014A: MOVWF F92
014C: MOVLW 10
014E: MOVWF 00
0150: DECFSZ 00,F
0152: BRA 0150
0154: NOP
0156: MOVF FB4,W
0158: BCF FA1.6
.................... setup_vref(FALSE);
015A: CLRF FB5
.................... //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
....................
.................... // TODO: USER CODE!!
.................... SPI_Write_char('a');
015C: MOVLW 61
015E: MOVWF 06
0160: BRA 0042
.................... printf("%c",SPI_Read_char());
0162: BRA 00A0
0164: MOVF 01,W
0166: MOVWF 06
0168: BRA 00E8
....................
.................... }
016A: SLEEP
Configuration Fuses:
Word 1: C03F XT IESO FCMEN PLL12 CPUDIV4 USBDIV
Word 2: 0E39 NOBROWNOUT WDT128 NOWDT BORV20 NOPUT VREGEN
Word 3: 8700 PBADEN CCP2C1 MCLR LPT1OSC
Word 4: 00A1 STVREN NODEBUG NOLVP NOXINST ICPRT
Word 5: C00F NOPROTECT NOCPD NOCPB
Word 6: E00F NOWRT NOWRTD NOWRTC NOWRTB
Word 7: 400F NOEBTR NOEBTRB
Un saludo
-
Muchísimas gracias.
No veas no? 4 lineas chorras en C y que ladrillazo en asm! :D
-
Amigo! hay una utilidad de PIC Compiler (PIC Wizard) en el cual puedes crear un proyecto, seleccionando las configuraciones del mismo y te crea el codigo automaticamente. Te va a ser de utilidad para la proxima!
-
Mira, justamente estoy curioseando eso. Está guapo, no tienes que escribir las opciones a mano :) (A veces pienso en empezar de una vez por todas con C)
-
Mira, justamente estoy curioseando eso. Está guapo, no tienes que escribir las opciones a mano :) (A veces pienso en empezar de una vez por todas con C)
Pues estas perdiendo el tiempo. yo estudie 2 semanas(pura lectura) y una semana de hacer muchos ejemplitos....y ya hago en "C", todo lo que hacia en "ASM":(eeprom, usart, spi, adc, etc).
Imagina, ayer pase un numero binario(3bytes) a ASCII(con todas las cifras ordenaditas), para mostrarlo por el hyperterminal del PC....todo eso en una sola linea de comando :-/ de solo pensar en hacerlo en ASM, me da escalofrios :shock: :shock: y ese es un ejemplito de lo que hace "C" por ti....solo hay que tener tiempo para sentarse a leer, programar, probar, aprender. Yopase esas 3 semanas pegado al PC, ocho horas diarias.
Saludos y ya cambiate a "C".
-
Que si , que si. Pero estoy super liado con un proyecto. Y mi jefe me prometió que cuando acabe este , tengo otro, y luego otro. Así que no sé cuando...
A menos que no duerma :mrgreen: