Programación con MikroC

#81
¿como se configura los fuses para trabajar con el pic 18F2550 en HID?, tengo la version de mikroC 6.0.0
por favor posteen una imagen
 
#82
¿como se configura los fuses para trabajar con el pic 18F2550 en HID?, tengo la versión de mikroC 6.0.0
por favor posteen una imagen
La configuración de fuses para trabajar con el módulo USB depende del cristal que quieras usar.
Ve la hoja de datos para que sepas los cristales que puedes usar para llevar el CPU a 48MHz.
Ahí también encontrarás la forma de hacerlo y conforme a eso configuras los fuses.
 
#83
Gracias por responder, uso cristales de 20MHz. Pero tal vez no fui muy claro en mi pregunta. Adjunto dos imajenes para que alguien me diga la diferencia en la configuracion.
Gracias.
La Primera imagen es del libro
Diseño y simulación de sistemas microcontrolados en lenguaje C




No se puede subri imagenes pero la pag 47 de ese libro es diferente a las opciones de "Edit Project" del MikroC pro for pic version 6.0.0
 
Última edición:
#85
Hola chicos. Estoy viendo el MikroC y es muy interesante IDE, tiene para distintas familias de microcontroladores.
Tiene muy buenas librerías, sin embargo me gustaría saber si éstas librerías se pueden modificar en código.
Las he buscado y no encontré por ninguna parte las librerías en los archivos del Mikroc.
 
Última edición por un moderador:
#86
Las librerías que usa mikroC están compiladas y por lo tanto no se pueden modificar.
Se encuentran en las carpetas "P16", "P16_Enh" y "P18" dentro de la carpeta "Uses" y tienen la extensión *.MCL
 
#87
Amigos, disculpen que les hable del mikroBasic pero es con el que estoy trabajando y creo que la pregunta es válida para los dos compiladores.
Actualmente estoy trabajando con un keypad. Lo que quiero saber, es cómo puedo hacer para poder manipular los valores que entran por el teclado.

Más o menos, esto es lo que llevo:
Código:
if kp="*" then // este es el boton de enter
Lcd_Cmd(_LCD_CLEAR)
lcd_out(1,1,"simulando ro")
lcd_Cmd(_LCD_SECOND_ROW)
Lcd_chr(2,5,ro1)
goto generar
end if
Lcd_Chr_CP(kp) // aquí muestra los numeros que van entrando por el teclado
inc(curx)          // este contador es para el cursor 
if curX=1 then  // esto es lo que trato de hacer para salvar el valor, 
ro1= keypad_key_press()// introducido por el teclado y  poder 
end if                           // hacer algunas operaciones artimeticas para despues mostrarlas otra vez 
if curX=2 then               //por la lcd, mas o menos a una calculadora!
ro2=kp 
end if
if curX=3 then
lcd_cmd(_LCD_MOVE_CURSOR_RIGHT)
ro3=kp
end if
wend
generar:
El problema está en que con eso no puedo obtener el valor real que esta entrando y me sale cualquier disparate cuando trato de mostrar el valor.

Si me pudiesen ayudar, se los agradezco. Bless.
 
Última edición por un moderador:
#88
¿Con Select Case?

Select Case kp
Case 1
' Código o llamada a subrutina.
Case 2
' Código o llamada a subrutina.
Case 3
' Etcétera.
End Select

El valor que retorna Keypad_Key_Click() es del 1 al 16 para un teclado 4x4
También puedes cambiar los valores al ASCII o darles el tipo que quieras.
Código:
Case 1
    kp = 49  ' 1
Case 2
    kp = 50  ' 2
Case 3
    kp = 51  ' 3
Case 4
    kp = 65  ' A
Case 5
    kp = 52  ' 4
Case 6
    kp = 53  ' 5
Case 7
    kp = 54  ' 6
Case 8
    kp = 66  ' B
Case 9
    kp = 55  ' 7
Case 10
    kp = 56  ' 8
Case 11
    kp = 57  ' 9
Case 12
    kp = 67  ' C
Case 13
    kp = 42  ' *
Case 14
    kp = 48  ' 0
Case 15
    kp = 35  ' #
Case 16
    kp = 68  ' D
End Select
Posteriormente y si lo requieres, puedes convertir el valor de kp con: ByteToStr(Input, Output) para mostrar en pantalla la tecla que se presionó.

PD: No utilizo mikroBasic.
 
#89
Estaba escribiendo un pequeño código en lenguaje C, y me surgió la duda de ¿Si es bueno utilizar las librerías del compilador en cuestión de tiempo? Yo utilizo mikroC y escribí estos dos códigos:

Código 1:
Código:
unsigned int valor_adc;
void main () {
ANSEL = 0X01;
ANSELH = 0;
TRISA0_bit = 1;
PORTA = 0;
while(1) {
valor_adc = ADC_Read(0);
}
}
Código 2:
Código:
unsigned int valor_adc;
void main () {
ANSEL = 0X01;
ANSELH = 0;
TRISA0_bit = 1;
ADCON0 = 0X80;
ADCON1 = 0X80;
PORTA = 0;
while(1) {
ADCON0.ADON = 1;
delay_us(20);
ADCON0.GO = 1;
while(ADCON0.GO == 1);
valor_adc = (ADRESH << 8) + ADRESL;
}
}
¿Cuál tarda menos en ejecutarse?
¿Cuál utiliza menos memoria al ejecutarse?
 
#91
Puedes darte una idea importando a MPLAB el archivo .hex que te genera mikroC y ver en la opción "desensamblar". Allí verás cuál de las dos rutinas ocupa más espacio y tiempo de ejecución

Salu2
 
#92
muchas gracias, como escuche un rumorcillo de que utilizar librerias hace que el pic busque los registros y esto hace que tarde un poco más de lo usual, usare el MPLAB para sacarme de dudas :)
 
#93
Yo cambiaria la forma de verlo...

Digamos que el conversor tarda 10ms en hacer el calculo y el pic se lleva 20nS en las instrucciones con la libreria y 30nS con codigo el tiempo total no es muy diferente.
 
#94
No como tal, el "riesgo" de usar librerías es que posiblemente dentro de esas librerías hay funciones que nunca se utilizan dentro del programa pero aún así se graban en el micro y esto ocupa memoria. Pero aclaro, esto depende del desarrollador de la librería; generalmente las librerías del mismo compilador están optimizadas para usar sólo lo que el programador escribe.
 
#95
No como tal, el "riesgo" de usar librerías es que posiblemente dentro de esas librerías hay funciones que nunca se utilizan dentro del programa pero aún así se graban en el micro y esto ocupa memoria. Pero aclaro, esto depende del desarrollador de la librería; generalmente las librerías del mismo compilador están optimizadas para usar sólo lo que el programador escribe.
Así es. Tanto las librerías como el programa principal, se pueden optimizar para que únicamente se compilen las funciones que se requiera usar.
Para eso se emplean las directivas #IFDEF o #IFNDEF
Al establecer definiciones el compilador sólo compilará el código requerido y la parte #ELSE será parte del código pero no será compilada.
 
Última edición:
#96
Hola. Buenas tardes compañeros. Soy nuevo el foro y estoy estudiando programación de PICs.
Tengo un pequeño problema a la hora de interpretar la sintaxis de un código del libro que estoy estudiando.

Se las anexo.
PHP:
PORTE&=(0<<RS|0<<RW|0<<E);

TRISE&=(0<<RS|0<<RW|0<<E);

DB=(1<<DB5)|(1<<DB4)|(1<<NL);

DB=(1<<DB3)|(1<<DSP)|(1<<CUR);
PORTE|=(1<<E);

PORTE&=~((1<<E));
Son algunas partes del código que no puedo comprender, se me dificulta por los operadores a nivel de bit de desplazamiento, no entiendo el por qué poner 0<<RS ¿El cero qué equivale?
El RS tiene un valor de 0.
¿Alguien me puede explicar con peras y manzanas para poder entender a este tipo de operadores nivel bit?

Gracias.
 
#97
El código, corregido, es así:

PHP:
PORTE &= (0 << RS  |  0 << RW  |  0 << E);

TRISE &= (0 << RS  |  0 << RW  |  0 << E);

DB = (1 << DB5) | (1 << DB4) | (1 << NL);

DB = (1 << DB3) | (1 << DSP) | (1 << CUR);

PORTE |=   (1 << E);

PORTE &= ~((1 << E));
El operador '<<' hace un desplazamiento del primer operando, tantos bits hacia la izquierda como lo indique el segundo operando.

Así, por ejemplo, '1 << E' quiere decir que desplazará el valor '1' tantos bits hacia la izquierda como el valor indicado por 'E'.

Si 'E' vale, digamos, 3, entonces el '1' (0b00000001) se desplaza hacia la izquierda tres posiciones, quedando en '8' (0b0001000).

Entonces, '0 << RS', siendo RS = 0; tenemos que '0' (0b00000000) debe desplazarse cero posiciones a la izquierda, así que... no lo desplaza, y el resultado es '0' (0b0000000).
 
#98
Hola a todos. Estoy queriendo simplemente generar una onda cuadrada de aproximadamente 2Khz y realmente no me está funcionando.
Estoy usando el micro "PIC16F887" (programándolo mediante MikroC)

Adjunto el código:
Código:
void interrupt(){
PORTB.B0 = !PORTB.B0;
INTCON.T0IF = 0;               //flag de interrupcion del timer0 puesto en 0
return;
}

void main() {

TRISB = 0x00;                  //todos los pines del puerto B como salida
PORTB = 0;                     //todos los pines del puerto B en 0
INTCON = 0b10100000;           //habilito interrupcion del timer0
OPTION_REG = 0b00000111;      //reloj interno (fosc/4);  prescalador al Timer0; prescalador en 8
OSCCON.SCS = 1;                //fuente de clock interno
while(1)
{
}
}
Depurando, encuentro que el registro TMR0 queda eternamente en 0, por ende jamás llega a ejecutarse la interrupción.
¿Qué puede estar pasando?

Gracias.
 
#99
hola IDMar ! no me acuerdo mucho de la programacion en ASM pero creo que te falta habilitar el bit GIE (interrupciones globales) proba con eso a ver si te funciona, saludos!
 
Gracias por tu consejo ilcapo!! Justamente la habilitación esta hecha con el bit 7 del registro INTCON (INTCON = 0b10100000;) y con el bit 5 habilito la interrupción del timer.