0% encontró este documento útil (0 votos)
13 vistas

Curso de Programación en C18: Universidad Nacional de Salta Facultad de Ciencias Exactas TEU Daniel Paz

Este documento describe conceptos sobre el manejo de memoria, secciones y atributos en C18. También cubre temas como control de I/O, ADC, LCD, PWM y ejemplos de código.

Cargado por

daniel7766
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PPTX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
13 vistas

Curso de Programación en C18: Universidad Nacional de Salta Facultad de Ciencias Exactas TEU Daniel Paz

Este documento describe conceptos sobre el manejo de memoria, secciones y atributos en C18. También cubre temas como control de I/O, ADC, LCD, PWM y ejemplos de código.

Cargado por

daniel7766
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PPTX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 28

Curso de Programación en C18

Universidad Nacional de Salta


Facultad de Ciencias Exactas
TEU Daniel Paz
Escribiendo aplicaciones en C18
Manejo de memoria

La memoria de un Microcontrolador se representa habitualmente mediante


direcciones expresadas en hexadecimal. Si declaro una variable tipo entera estaría
reservando 2 bytes en memoria.

Se agregan los siguientes nuevos tipos:

near: permite definir un modelo de memoria para usar cualquier posición de la


memoria de programa menor a 64K y el banco virtual de la RAM.

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.

En memoria RAM se puede definir otras dos secciones


•udata : datos sin inicialización
•idata : datos inicializados

Podemos definir sub secciones usando la directiva #pragma.


El attribute-list puede ser del tipo

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.

romdata Los datos se almacenan en la memoria del programa.


udata Datos sin inicializar. Utiliza el espacio del registro de archivo del
PIC18XXXX para las variables estáticas no inicializadas requeridas
en el código fuente.

idata Datos iniciados. Estos datos se pondrán en algún lugar en la


memoria de programa, para luego ser movidos por el compilador a
los archivos de registro antes de que la aplicación comience su
ejecución.

config Define el estado de los Bits de Configuracion PIC18XXXX. Estos


serán generados en el archivo .HEX.
Control I/O
El siguiente programa indica como encender un LED a partir de un pulsador. EL mismo se
encuentra ubicado en el pin RA4 y el led se encuentra en RB0. EL programa se ha configurado
para el PIC 18Fxxx

#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.

#pragma config OSC=XT, FCMEN=OFF, IESO=OFF


#pragma config PWRT=OFF, BOREN=OFF
#pragma config WDT=OFF
#pragma config MCLRE=ON, CCP2MX=PORTC
#pragma config STVREN=ON, LVP=OFF, XINST=OFF

#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

Realice un programa que encienda


secuencialmente los LEDS del puerto B
simulando una rotación.
Caracteres literales
•Se especifican con apostrofes simples (‘)

•Pueden incluir cualquier carácter imprimible

•Caracteres validos: ‘a’ , ‘T’, ‘\n’, ‘5’, ‘ ’.

•Caracteres inválidos: ‘hola’, ’12’.

Strings literales
•Se especifica con doble comilla (“)

•Puede incluir cualquier carácter.

•Usualmente terminan en carácter nulo \0

•Strings validos: “Chau”, ”dani@unsa”,

•String invalido: “hola, “chau””


Los strings literales son un caso especial de arrays. Si no se declara la dimensión, el carácter
nulo indica el final.

char usuario[] = “unsa”;

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

•Seleccionas el canal de entrada A/D

•Seleccionar tiempo de adquisición

•Seleccionar clock de conversión

•Habilitar modulo ADC

•Iniciar la conversión
Registros involucrados

ADCON0
ADCON1
Tiempo de adquisición

Tacq = Tamp + Tc + Tcoff

Tamp = tiempo del amplificador= 2µs

Tc= tiempo de carga = 1,05µs

Tcoff= tiempo asociado a la temperatura


Tcoff=(Temp-25°C). (0,02µs/°C) para Temp>25°C
Tcoff=0 para Temp<25°C
Tcoffmax=1,2µs

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 CloseADC (void): Deshabilita el ADC y ADC por interrupción.

•void ConvertADC(void) : Inicia la conversión.

•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.

putcXLCD: Escribe un byte al LCD.

putsXLCD: Escribe un string al LCD.

putrsXLCD: Escribe un string desde memoria de programa del LCD.

ReadAddrXLCD: Lee la direccion de un byte desde el LCD.

ReadDataXLCD: Lee un byte desde el LCD.


Práctica #2

En el siguiente programa se enviara un mensaje a la


pantalla LCD en la primer línea y en la otra línea se
pondrá su nombre. Usar la librería xlcd
PWM
Registros asociados

EL modulo CCP (Captura/Comparacion/PWM) es el asociado con la modulacion de ancho de


pulso. El PIC 18f46k20 tiene dos modulos CCP. Cada uno contiene un registro de 16 bits. A
continuacion tenemos el registro CCP1CON
EL pin asociado al PWM debe ponerse como salida en el registro TRIS.

El período se especifica escribiendo el registro PR2

PWM perido= (PR2 + 1)*4*Tosc*(TMR2 Prescale value)

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:

Fijar el periodo escribiendo PR2.


Fijar el DC escribiendo CCPRxL y los bits CCPxCON<5:4>
Configurar el pin CCPx como salida borrando el bit del TRIS
Configurar el modulo CCPx para la operación PWM
Práctica #3

Escriba un programa que haga variar la intensidad


luminosa de un LED. Escriba en pantalla las opciones
de incremento y decremento de intensidad
luminosa.
Práctica #4

Realice un programa que active un relé en un


determinado tiempo. Escriba un mensaje a la
pantalla LCD en la primer línea y en la otra línea se
pondrá su nombre.
Curso concluido.

Agradecimiento: Dysel – Diseños y Servicios


eléctricos

También podría gustarte