Curso de Programación en C18: Universidad Nacional de Salta Facultad de Ciencias Exactas TEU Daniel Paz
Curso de Programación en C18: Universidad Nacional de Salta Facultad de Ciencias Exactas TEU Daniel Paz
far: permite definir un modelo de memoria para usar cualquier posición de memoria
de programa y de la RAM.
Secciones
Las secciones son las diversas áreas en la memoria del PIC18XXXX incluyendo la memoria de
programa y memoria de datos RAM.
La memoria de programa se extiende desde 0x0000 a 0x7FFF. Dentro de este espacio se puede
definir dos secciones
•code : contiene instrucciones.
•romdata : contiene variables y constantes.
access : Este atributo le indica al compilador que debe incluir la sección en el espacio definido
por el modo de acceso a datos acces bank sin necesidad de modificar el banco actual de la ram.
Ejemplo:
#pragma udata access my_access
/*acceso sin bancos*/
near unsigned char contador, temporal;
overlay : Este atributo permite que otras secciones se sitúen en las mismas posiciones físicas.
Esto permite conservar memoria , siempre que las variables no se activen simultáneamente.
Ejemplo
rom int ri;
rom char rc = 'A'; Objeto Sección Localización
int ui; ri romdata memoria de
char uc; programa, área de
int ii = 0; datos
char ic = 'A';
void foobar (void) rc romdata memoria de
programa, área de
{ datos
} ui udata memoria de datos
void foo (void) sin inicializar
{ uc udata memoria de datos
sin inicializar
}
void bar (void) ii idata memoria de datos
{ ic idata memoria de datos
bar code memoria de
} programa
foobar code memoria de
programa
foo code memoria de
programa
Directiva Uso
code Instrucciones de memoria de programa. Se compila todas las
instrucciones subsecuentes en la sección de memoria de programa
del PIC18XXXX.
#include <p18fxxx.h>
#pragma config OSC=XT
# pragma config PWRT=OFF
# pragma config WDT=OFF
# pragma config LVP=OFF
void main(void)
{
TRISA=0XFF; //PORTA como entrada
TRISB=0; //PORTB como salida
while(1) //bucle infinito
{
if(PORTA & 0x10) PORTB=1;
else PORTB=0;
}
}
Parpadeo
En el siguiente código se vera como hacer titilar un led con un tiempo de apagado y encendido
determinado.
#include <p18f46k20>
#include <delays.h>
void main(void)
{
TRISB=0b01111111; // RB7 es salida
while(1)
{
LATBbits.LATB7=~ LATBbits.LATB7; //complemento el bit
Delay1KTCYx(200); //demora 200ms
}
}
Práctica #1
Strings literales
•Se especifica con doble comilla (“)
Se almacena como:
usuario[0] = ‘u’
usuario[1] = ‘n’
usuario[2] = ‘s’
usuario[3] = ‘a’
usuario[4] = ‘\0’
ADC
Inicialización del ADC
•Configure pines analógicos, voltaje de referencia y pines digitales
•Iniciar la conversión
Registros involucrados
ADCON0
ADCON1
Tiempo de adquisición
Tacq= 4,2µs
Funciones de librería
•#include <adc.h>
•char BusyADC (void) : Se fija si el conversor esta procesando una conversión. Retorna 1 si está
ocupado.
•void OpenADC (unsigned char config, unsigned char config2) : Usado para configurar el ADC.
Los valores del argumento ´pueden variar según el dispositivo.
•int Read ADC(void) : Lee el resultado del conversor, retorna un valor de 16 bits con signo
•void SetChanADC (unsigned char channel) : selecciona el pin usado pasa entrada del ADC
Librería xlcd
BusyXLCD : se fija si esta ocupado el LCD.
OpenXLCD : configura las lineas I/O usadas para controlar el LCD e inicializarlo.
Cuando TMR2 es igual a PR2, ocurre que TMR2 se borra, se activa el pin CCPx y el DC de PWM se
asigna de CCPRxL a CCPRxH.
DC= (CCPRxL:CCPxCON<5:4>)*Tosc*(TMR2)
Configuramos el PWM: