Perifèrics I2C

De El raconet d'en Jordi

Dreceres ràpides: navegació, cerca

Els PICAXE més potents (PICAXE-18X, PICAXE-28X, PICAXE-40X) permeten la connexió directa de perifèrics I2C a les podes SDA i SCL. Només hem de connectar aquestes línies a un bus I2C amb resistències de pull-up de 4,7 kΩ. Podem connectar més de 100 dispositius slave (esclaus) en aquest bus, on el nostre PICAXE és el master (amo). Naturalment, cal que els diferents dispositius slave tinguin adreces diferents (moltes vegades es pot configurar una part de l'adreça del dispositiu.)

Alguns dels dispositius disponibles amb aquesta interfície són:

DS1307 Rellotge en temps real (RTC)
24LC256 Memòria EEPROM de 64 kB. Altres capacitats amb referències 24LCxxx
SPE030 Mòdul sintetitzador de veu
CMPS03 Brúixola digital
LCD02 S310118 display LCD amb teclat opcional
AXE033 display LCD amb RTC opcional
uM-FPU-V2 Coprocessador matemàtic amb coma flotant
PCF8570P Memòria RAM 256 bytes
SRF08 Sonar
AD5245 Potenciòmetre digital
PCF8574 Ampliació E/S: 8 línies
MCP23016 Ampliació E/S: 16 línies
GPIO14 Ampliació E/S: 14 línies, 5 ADC, 1 PWM
MAX6953 Control de fins a 4 displays en matrius de 5x7 LEDs
TPA81 Sensor tèrmic orientable amb servo
RLY08 Mòdul amb 8 relés


L'interpret BASIC dels PICAXE incorpora les ordres i2cslave, writei2c, readi2c per treballar amb aquest bus.

Trobareu més informació al document i2c Tutorial, axe110_i2c.pdf (disponible a la web de PICAXE únicament en llengua anglesa) i el manual de BASIC (disponible en castellà).

A continuació veiem uns exemples de programes utilitzant aquest bus. Els programes són obra de Carles Araguz i formen part del treball de recerca que li vaig tutoritzar Estació meteorològica controlada per un PICAXE, publicat amb llicència Creative Commons by-nc-sa.

El primer programa borra un display LCD (LCD02 S310118) i hi imprimeix “Lletres” dues vegades una darrera de l’altra, després torna a començar.

'Control d'un display LCD I2C
'Autor: Carles Araguz
    b0 = 0                                          'defineix variable
main:
    i2cslave 0XC6, i2cfast, i2cbyte           'configura i2c
    writei2c b0, (12,"Lletres")               'envia valor al LCD
    writei2c b0, (76,108,101,116,114,101,115) 'envia valor al LCD
    goto main                                 'bucle

El següent programa llegeix la temperatura d'un DS18B20 i escriu el seu valor al display LCD:

'Mostra temperatura en un display LCD I2C
'Autor: Carles Araguz
    b0 = 0
lectura_temp:
    readtemp 0, b1                 'llegeix pin I/O 0 (i el desa a b1)
    b2 = b1 / 10                   'conversió a decimal (part entera)
    b3 = b1 // 10                  'conversió a decimal (la resta)
    b2 = b2 + 48                   'conversió a ASCII
    b3 = b3 + 48                      'conversió a ASCII
    i2cslave 0XC6, i2cfast, i2cbyte   'configura i2c
    writei2c b0, (1,4,b2,b3)          'borra pantalla i cursor, escriu b2 b3
    pause 2000                        'espera 2s
    debug b1                          'debug de b1 (i de tots els registres)
    goto lectura_temp                 'bucle

Finalment aquest programa desa 10 valors de la temperatura en una memòria EEPROM 24LC16B i quan termina els llegeix i els mostra per el display LCD.

'Enregistra temperatura en una EEPROM I2C
'Autor: Carles Araguz
main:
   b0=0
   for b6=1 to 10
    readtemp 0, b1             'llegeix la temperatura del sensor DS18B20
    b2 = b1 / 10               'conversió a decimal (part entera)
    b3 = b1 // 10              'conversió a decimal (part restant)
    b4 = b2 + 48               'conversió de la primera xifra a ASCII
    b5 = b3 + 48               'conversió de la segona xifra a ASCII
    i2cslave %10100000,i2cfast,i2cbyte             'configura I2C EEPROM
    writei2c b6, (b1)          'guarda valors readtemp
    pause 10
    i2cslave 0XC6, i2cfast, i2cbyte                'configura I2C LCD
    writei2c b0, (12,"Temp:",13,b4,b5,"C")         'envia al LCD
    next b6
    for b6=1 to 10
    i2cslave %10100000,i2cfast,i2cbyte             'configura I2C
    readi2c b6, (b1)
    b2 = b1 / 10                 'conversió a decimal (part entera)
    b3 = b1 // 10                'conversió a decimal (part restant)
    b4 = b2 + 48                 'conversió de la primera xifra a ASCII
    b5 = b3 + 48                  'conversió de la segona xifra a ASCII
    i2cslave 0XC6, i2cfast, i2cbyte                'configura I2C LCD
    writei2c b0, (b4,b5,"C",32,32)                 'envia al LCD
    pause 100
    next b6
   pause 3000                                      'espera 3 s.
   goto main



Tornar a l'índex