Webcampista.com

mucho más que un foro

PIC 18f4550 y CCS compiler

navegante 420

la nave nodriza
Bueno empecemos con un repertorio de cagadas habituales al programar este poderoso pic.

En primer lugar, Oscar pedirte disculpas por abusar de ti tan vilmente. Pero es que el profe que tengo, ayer, aludiendo que el no conocia este pic, se lavo las manos y sutilmente dijo que nos buscasemos la vida, y en ello estoy, he ido a la libreria y estoy a la espera que me llege un libro que me ayude, pero mientras haber si me puedes ayudar con este esquema y programa.


esquema inicial.jpg

me encuentro con que el led rojo que se encuentra en RA4, El led verde de RA6 y el bit 3 del dysplay 2 que esta en RE3 no consigo que se encienda.

Te agradeceria que le hecharas si puedes un vistazo, nosotros pensamos que son fuses que no hemos puesto, pero no se.

#include <18f4550.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,BROWNOUT,NOMCLR,NOLVP

#include <float.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#use delay(clock=8000000)


void main()
{

setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator(OSC_8MHZ|OSC_TIMER1|OSC_31250|OSC_PLL_OFF);

// TODO: USER CODE!!
output_high(PIN_D0);
output_low(PIN_D1);
output_high(PIN_D2);
output_low(PIN_D3);
output_low(PIN_D4);
output_high(PIN_D5);
output_low(PIN_D6);
output_low(PIN_D7);

output_high(PIN_E0);
output_low(PIN_E1);
output_low(PIN_E2);
output_low(PIN_E3);
output_high(PIN_A0);
output_low(PIN_A1);
output_low(PIN_B3);
output_low(PIN_B2);

output_high(PIN_C0);
delay_ms(1000);
output_high(PIN_A4);
delay_ms(1000);
output_high(PIN_C4);
delay_ms(1000);
output_high(PIN_C5);
delay_ms(1000);
output_high(PIN_C6);
delay_ms(1000);

output_low(PIN_C0);
output_low(PIN_A4);
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_high(PIN_A6);
}

muchas gracias
 
No puedo entretenerme mucho en el código, pero todo me suena a configuración de los bits necesarios para que estos pines funcionen como entrada/salida digital, y es que RA4 y RA6 se usan para varias cosas, que se deben configurar para que funcione bien, RE3 por ejemplo se puede gastar como entrada de reset, si en algún registro (que no recuerdo) no pones nada, se usa para este fin, no para salida.

Esto que te digo es independiente del registro TRISX, primero configuras el pin para que se use como Digital I/O y después con el TRIS configuras si entrada o salida.

Revisad el datasheet y una sugerencia, si no vas a usar nada, mejor "ni lo menciones" veo que tienes muchos "disable", quitalos todos y añádelos solo si tienes problemas, me parece que solo es obligado el de los convertidores A/D, pero hasta eso creo que no hace falta. Te lo digo porque estas funciones hacen cosas que interfieren con otras y puede que sea eso lo que te está pasando.

Resumiendo, para lo que quieres hacer, quita todas las funciones y deja solo los output_bit() a medida que vayas haciendo cosas, añades funciones, pero por defecto, todo viene "quitado", no hace falta que los quites tu.

Veo también un "TODO" (para hacer) eso puede ser porque has generado el código anterior con el wizard que trae el CCS, pero eso solo lo genera si le dices "esto no, esto tampoco", mientras que si no le dices nada, pues no pone nada, con lo cual lo deja todo en "entrada/salida digital", que es lo que buscas.

Edito, el bit RE3 se configura con los "Configuration bits", quizá tengas que poner algo de código para ello, o se pueda configurar aparte, tratándose del CCS, seguramente lo hará con código.
 
Pues para no poderte entretener, ya me has dedicado mas tiempo que el que dice ser mi profe de sist. micro-programables y electrónica de sistemas.... hay que joerse....

ok, empezare de 0 sin usar el wizard, haber si soy capaz. Porque voy un poco justo de tiempo y no creo que me de tiempo de leerme el libro que me ha llegado, como deberia, "Copilador C CCs y simulador proteus para microcontroladores PIC" de la editorial marcombo. si no lo tienes y quieres hecharle un vistazo dimelo que te paso un pdf. A mi me ha gustado mucho y creo que gracias a él no te machacaré tanto. :;
 
No hace falta que empieces de cero, o que no uses el wizard, simplemente, no marques nada que no vayas a usar, es decir, si no vas a usar el SPI, ni entres en esa ventana, y lo mismo con los otros dispositivos.

RE3 si tienes que cambiarlo, porque si no, lo toma como reset y no podrás usarlo ni como salida, ni como entrada.

El programa lo puedes dejar como está, borrar o comentar todas las funciones y añadir lo relativo a RE3.
 
¡¡¡ Dios existe!!! .....

¡¡¡ Siempre hay una luz al final del tunel!!!


ETC, ETC.....

Para que RE3 no actue de reset y lo configuremos como Entreda (esta mal el grafico que nos dice como E/S) hay que modificar manualmente el registro CONFIG3H y poner a 0 el bit MCLRE.

La duda que me queda es porque RC4 y 5 me funcionaban si segun en data solo pueden actuar como entradas. (otra cosa que esta mal en el gráfico)

Creo que con el data completo que encontré, el pdf que encontre y me pasastes de la UPV más el libro que te dige que me hiba a comprar, al final seré capaz de conseguir que este potentisimo pic empiece a hacer lo que yo quiero, y no lo que a él le de gana. Aunque el programa duele a la vista, combinando parte en ensamblador y partes en C, jejejejeje



PD. Cuando puedas vaciate un poco el buzón que lo tienes a rebentar, jejejeje
 
Ya, ya oscar, pero era para contestarte el tuyo.

Porcierto solo me falta RC0 por configar... Si esta tarde me dejan y no me molestan los compis, creo que ta podré empecezar a encender los 2 display dobles y la secuencia de leds.

Y ponerme de una vez con los dos comparadores, las interrupciones de RB4-7, y la comunicación I2C, Casi na, jejejeje
 
Poquito a poco, las interrupciones, y más en los PIC, son un pelín peliagudas, hasta que le coges el truco, que básicamente consiste en salvar todo el estado de la maquina, esto es para ensamblador, sabes que cuando se produce una interrupción, el procesador deja lo que está haciendo y pasa a atender otra cosa, pero a lo mejor estabas sumando, con lo cual no puedes usar el acumulador, porque lo borras, así que tienes que salvarlo primero, para recuperarlo después, en el PIC esto no es algo intuitivo... por eso digo que cuesta, lo mismo debes hacer para cualquier registro que quieras conservar, o que vayas a modificar, cuando acabes de hacer lo que toque, recuperas lo que hayas que grabado y vuelves a donde estabas, si era la suma, pues sigues sumando.

Si lo haces en C es mucho más fácil, ya que el compilador se encarga de salvar todo lo importante, salvo las variables de usuario, pero esas son fáciles de ver. En este caso el truco es averiguar como leches se le indica al compilador que es una rutina de interrupción, y de qué interrupción en concreto se trata (serie, externa,...) recuerdo que en el CCS no era muy difícil.

Y por ultimo, esto ya para aplicaciones críticas en el tiempo, averiguar que partes del código del programa principal se pueden interrumpir y cuales no, por ejemplo, calculas lo que tienes que poner en el display de cuatro dígitos, antes era "10" y ahora "9", primero calculas uno de los y después el otro, si a medias te interrumpen y en la interrupción es donde lo escribes, puede que ponga "19" o "0", esto se evita haciendo que en ese trozo de código no se pueda interrumpir, y acordándose de volver a activar las interrupciones al acabar...

Esto suele ser lo que más cuesta, averiguar los trozos de código que se pueden y cuales no, por que no siempre se ve a simple vista.
 
Leches, no habia caido en ese pequeño detalle de evitar las interupciones cuando escribo, gracias.

Como has podido ir viendo mi problema ahora mismo no es de programación sino de configuración, Pasar del 16f84 al 18f4550 esta siendo un suicidio, y más cuando el profe (con el argumento de "a mi me han bajado el sueldo" como diciendo me pe pregunteis nada que no sea del temario) no es que me ayude demasiado, sino mas bien pone trabas pues esta muy negativo.

Ahora te preparo un word con el asunto y te lo paso haber si me puedes ayudar con la cabecera para configurar el pic.
 
Miraré las configuraciones, pero ya te digo que no cambies nada que no utilices, por ejemplo, por defecto todo son entradas digitales (salvo la del reset), las patas que uses así, no las toques.

El CCS tiene un asistente (wizard) que te ayuda a configurarlo todo ¿está disponible para ese PIC?

Como ultima opción (o primera) puedes pasarte al MCC18, de microchip, gratuito para educacional, programas desde el MPLAB, que ya conoces, con su simulador y tal.

Si el CCS tiene el asistente para ese PIC puedes configurar por ejemplo el reloj, y que te ponga las instrucciones en ensamblador, luego las copias al otro y ya lo tienes.

Para usar el USB posteriormente te hace falta un oscilador interno, tenlo en cuenta por si es más fácil empezar ya con él.

Para funcionar con 8 Mhz interno, por ejemplo, estas instrucciones funcionarían en el MCC18, es decir, estos bits los que debes configurar de la manera necesaria en el CCS.

#pragma config FOSC = INTOSC_EC // Frecuencia con oscilador interno, alta velocidad
#pragma config PLLDIV = 2 // dividido por 2 (8Mhz) (Sería para USB, pero con el cristal de 8Mhz externo)
#pragma config CPUDIV = OSC1_PLL2 // interno /1 y el PLL x2
 
Ya he usado el wizard, pero tres que he hecho, tres que me ha hecho cabezeras diferentes, y claro lo que me mosquea, es que no se donde ver lo que modifica, o escribe.

eso de no controlar yo el pic bit a bit, lo llevo muy mal, y claro, manejar un 18 bit a bit creo que puede ser una locura.
 
Hace tiempo que no lo gasto, pero ¿no hay un botón donde puedes ver lo que va a poner antes de que lo ponga? a mi me suena que si, así lo hacía yo...

Ahh, una cosa, se puede integrar el CCS en el MPLAB, y allí ya sabes usar el simulador, es lo que yo hacía cuando lo gastaba, el wizard para lo básico, lo copiaba al otro y a funcionar...
 
Eso de intregrar el ccs en el mplab me lo tienes que explicar un dia como hacerlo, que estoy hasta los guews del comparador y del i2c, no no ver donde falla.
 
Thanks, Thanks y muchas gracias, siendo un ejecutable, supongo que teniendo los dos programas instalados lo ejecuto y ya ta., no????
 
Supongo que si, aunque recuerdo que según la versión que utilizabas de MPLAB y/o de CCS había que cambiar también la ruta del compilador en la pestaña Projet-> Set Languaje Toolsuite, allí debes seleccionar el CCS y donde está.

También recuerdo que a veces dan problemas algunas librerías y tal, es más raro, pasa sobre todo cuando no has tenido cuidado en poner la ruta del proyecto correcta, entonces la situación de los directorios se dice en Project-> Build Options-> Project -> Directories allí decides el lugar donde están las librerías que vas a usar, que pueden ser del propio proyecto (tipo user.h) o del compilador (tipo stdio.h)
Esto ultimo cuando más problemas da es cuando estas trabajando con varias versiones del mismo programa, si el compilador coge la librería del proyecto anterior, ya tienes el lío, por eso es importante tener el proyecto "limpio" desde el principio, colocando todo lo necesario en un solo lugar, y dejando los comunes siempre en el mismo sitio.

Con el tiempo puedes tener tus propias librerías, por ejemplo para controlar un LCD, lo puedes colocar dentro del directorio del compilador "para siempre" y no tienes que moverlo de un sitio para otro, pero esto ya es cuando ya has trabajado tanto con esa librería que la controlas 100% y sabes que funciona también al 100%
 
Pues haciendo caso a tus recomendaciones. empeze paso a paso con este potentisimo pic.

1º configurar los puertos de salida. ok
2º configurar y probar las interrupciones de RB4-RB7 ok
3º Configuarar comunicacion I2C con saa 1064. TRas volverme loco con el proteus de los "collons" resulta que lo estaba haciendo bien. Era el proteus el que no lo simula
4º configuara el comparador analogico, que me volvi loco pero al final lo consegui. Tambien gracias el proteus, y un poco a mi error de confindir conparacion analogica con digital, y que supuse erroneamente que tenia que configurar el puerto como entradas analogicas para hacer la conversion.

Aqui te dejo un video de pruebras con el saa1064


 
Un saludo, hacia dias que no miraba esto, vaya nivel!
Me hareis mirar estos escarabajos mas de cerca jaja

Aunolose, no se si navegante ha reparado los enlaces, pero en este momento si veo dos youtubes incrustados del saa1064.

Voy a ver si me pongo a rueda estudiando estos hilos :) , tengo el tema muy abandonado desde hace años.

Saludos
 
Cagon to lo que se menea, Ahora que tenia todo funcionando por separado, al probarlo todo junto, resulta que las interrupciones de funcionan, si que llega bien la señal a los puertos, pero no me activa ninguna,

Sabeis si por un casual si, cuando se activan 2 o mas interrupciones hay que hacer algo mas que declararlas????, no se como darles prioridades, o ordenarlas..... no se algo?????

muchas gracias.
 
De mientras aparece algun MAESTRO he leido :) que el bit GIE en el INTCON.7 se deshabilita en el reset en la gama del 16FXXX, es supone que hay que forzar la activacion.

Del tema pic no tengo ni idea, pero por lo que leo...tendras que insertar Enable_Interrupts GLOBAL que te va a poner GIE y PEIE a 1, el PEIE es la habilitacion de int's de perifericos, o sea INTCON se cargara con C0h, no estaria de mas que verificaras si en el codigo en asm lo esta haciendo realmente.

Supongo que es un Global Interrup Enable y hace falta que dentro del codigo se fuerce la activacion de las int's, no se si ya lo tenias controlado.
Cuando indicas 'declarar' entiendo que solo es pseucodigo para el C, eso no es realmente ninguna ejecucion.
 
En main ademas de habilitar las int's hay que añadir ext_int_edge xxx correspondiente segun el tipo de flanco a detectar.

Algunas dudas en voz alta respecto al compilador Ccs:

GIE se inhabilita ante la respuesta a una int para evitar responder a nuevas int's, supongo que el codigo C se encarga de restaurar GIE al salir igual que el resetero del flag correspondiente a la int activa ¿?

No veo prioridades por hard o programables de int's, supongo que tienen una prioridad secuencial todas al mismo nivel .

Al salir de una sbr de la int, respeta o borra los flags de llamadas de otras int's ocurridas durante el proceso de la anterior sbr ? esto hace referencia al tema de 'coincidencia de int's '

Me extraña que no haya un reg de prioridades ¿?

Dentro de la #INT_RB habra que descubrir que pin ha desencadenado la INT de entre todos ellos ?
 
mirando un poco mas en el data sheet del 16f4550....hay dos niveles de prioridad, el superior 'pisa' al inferior en ejecucion (normal !)
Vectores de prioridad sup en 8h y la prioridad inf en 18h, habra que mirar el ccs como se lo monta para gestionar los niveles de prioridad.
 
Joe, entro ahora que me tengo que marchar.

En el 4550 hay dos niveles, como dice Gerard, pero dentro de esos dos niveles no hay prioridad como tal, ahora lo explico. Hasta que domines el tema te sugiero que mandes las interrupciones a la misma rutina, aunque sea con una llamada desde otra.
En esa rutina es donde le darás prioridad a las interrupciones que quieras ¿como? tan sencillo como mirar primero las más prioritarias, es decir lo que quieres es que sea la del puerto serie la primera, pones un "if (es la serie)" primero, y así con todas, recuerda que algunas flags de interrupción se deben desactivar "a mano", en la rutina, para evitar problemas yo lo suelo hacer en todas, si no lo haces, esa interrupción se produce cada vez que salgas de la interrupción, entrando en un bucle infinito.

quedaría algo así:
if (la que quiero primero)
{
...
}

if (la que quiero después)
{
...
}

if (la siguiente)
{
...
}

if (la ultima)
{
...
}

Fíjate que no son if-else, pues podría ser entonces que alguna no se atendiera nunca.

Puesto que las de mayor nivel interrumpen a las de bajo nivel, puede ser que dentro de la rutina llegue una interrupción más prioritaria, así que mientras controlas el tema, lo mejor es desactivarlas todas al entrar en ella y volverlas a activar todas después. Ahora no estoy seguro de que si no tocas nada, todas tienen el mismo nivel, pero me parece que si, así que no creo que esto sea prioritario pero haciéndolo pierdes muy pocos ciclos de reloj y puedes evitar problemas.

Una vez tengas claro cual debe ir la primera y cual la ultima es cuando pasas unas al de más prioridad y otras las dejas en el de menos, recuerda que en este caso una de más prioridad puede saltar cuando estés atendiendo una de menos prioridad.

Lo que no pasa es que estando tratando una de un nivel, te interrumpa una del mismo nivel, aunque si dentro de los if que pongas, se produce la ultima a medias, se tratará cuando acabe la anterior y todos felices, si es al revés, pues se espera a que acabe y después vuelve a entrar. Esto ya es lo ultimo a mirar.

Lo de gerard lo he leído muy por encima, creo que en algunas cosas decimos lo mismo.
 
Arriba
© 2004-2024 Webcampista.com