Buenas, Soy Carlos, nuevo aquí.
He leido mucho y me ha ayudado mucho esta web en mi iniciación con el mundo de los PIC, pero sigo siendo un novato en el tema.
Estoy programando un 18F2550 con C18 para realizar el control de mi proyecto de fin de carrera, el problema es que me he encontrado con la dificultad de no tener suficientes salidas digitales.
Navengando por la red encontre que existe la posibilidad de ampliar el numerpo de pines I/O mediante expansores. En este caso el que quiero utilizar es un MCP23017 mediante comunicación I2C. Ambas cosas son nuevas para mí y de ahí mi incompetencia en el asunto.
Todo lo que he encontrado ha sido enfocado para arduino o paraPIC pero con otros lenguajes de programación. En principio mi intención previa para ir aprendiendo es encender varios leds con este expansor, una vez que consiga esto, me fijare nuevas metas. Alguien podría ayudarme??
Mi código es este:
/* File: Expansión de salidas
* Author: Carlos Santamaria Garcia
*
* Created on 10 de Septiembre de 2011, 9:47
*/
#include <p18f2550.h>
#include <delays.h>
#include <i2c.h>
#include <stdio.h>
#pragma config PLLDIV = 1, CPUDIV = OSC1_PLL2, FOSC = XT_XT
#pragma config FCMEN = OFF, IESO = OFF, PWRT = OFF, BOR = OFF, BORV = 1
#pragma config VREGEN = OFF, WDT = OFF, WDTPS = 1, CCP2MX = OFF, PBADEN = OFF
#pragma config LPT1OSC = OFF, MCLRE = OFF, STVREN = OFF, LVP = OFF, XINST = OFF
#pragma config DEBUG = OFF, CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
#pragma config CPB = OFF, CPD = OFF, WRT0 = OFF, WRT1 = OFF, WRT2 = OFF
#pragma config WRT3 = OFF, WRTC = OFF, WRTB = OFF, WRTD = OFF, EBTR0 = OFF
#pragma config EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF, EBTRB = OFF
////////////////////////////////////////////////
// Prototipos de las funciones //
// //
/////////////////////////////////////////////
void main (void)
{
TRISB = 0x00;
PORTB = 0x00;
OpenI2C(MASTER, SLEW_OFF);
SSPADD = 0x27;
StartI2C();
IdleI2C(); //El módulo está activo?
WriteI2C(0x20);
IdleI2C();
WriteI2C(0x00); //Elijo el registro IODIRA que es donde se encuentra la configuración de I/O como entrada o salida
IdleI2C();
WriteI2C(0x00); // Pongo a cero para que sea salida el banco 0
IdleI2C();
WriteI2C(0x00); // Pongo a cero para que sea salida el banco 1
IdleI2C();
StopI2C();
/*Escribimos la configuracion de los puertos que queremos*/
StartI2C();
IdleI2C(); //El módulo está activo?
WriteI2C(0x20);
IdleI2C();
WriteI2C(0x12); //Elijo el registro IODIRA que es donde se encuentra la configuración de I/O como entrada o salida
IdleI2C();
WriteI2C(0x88); // Pongo el banco cero con esta configuracion binaria de leds encendidos
// 10001000 b = 0x88 h
IdleI2C();
StopI2C();
}
Muchas Gracias