400 likes | 540 Vues
Sistemas Microcontrolados e Programação em C Aula 12 – IO + I2C PICmicro. Prof Afonso Ferreira Miguel. IO em C com IAR - PICmicro. putchar e getchar Todas as funções de IO de caracteres ( gets , puts , printf , etc...) são baseadas nestas funções básicas;
E N D
Sistemas Microcontrolados e Programação em CAula 12 – IO + I2C PICmicro Prof Afonso Ferreira Miguel
IO em C com IAR - PICmicro • putchar e getchar • Todas as funções de IO de caracteres (gets, puts, printf, etc...) são baseadas nestas funções básicas; • A biblioteca padrão “stdio.h” implementa estas funções sem código nenhum; • Ver getchar.c e putchar.c (\PICmicro\src\lib\)
IO em C com IAR - PICmicro • Para redirecionar as entradas e saídas, reescrever / adaptar as funções getchar() e putchar(), para enviar os dados ao display, porta serial, porta paralela, etc... • Com isto, funções como puts(), gets(), printf(), etc. passam a enviar os dados para o dispositivo configurado; • Não esquecer de configurar o dispositivo redirecionado antes de utilizar as funções acima;
IO em C com IAR - PICmicro • A função getchar() implementada já permite a “bufferização” dos dados de entrada, necessitando apenas refazer a função _low_level_get() apenas definida no mesmo arquivo; • Também, por limitações de memória RAM, é recomendável diminuir a variável LINE_LENGTH para não mais que 10;
IO em C com IAR - PICmicro • O documento PICmicro C Compiler Programming Guideorienta como redefinir estas bibliotecas; • Para um projeto simples, basta adicionar os arquivos modificados ao projeto, criar novos arquivos .h e recompilá-los; • O ICCPIC recompila-os adotando estas funções em detrimento das originais; • Adicionar os arquivos PIC_IO.c e PIC_IO.h ao projeto e modificá-los.
Barramento I2C • I2C = Inter-Integrated Circuit • 1980's - Philips Semiconductors; • Peripheral devices in embedded systems are often connected to the MCU as memory-mapped I/O devices, using the microcontroller's parallel address and data bus; • This results in lots of wiring on the PCB's to route the address and data lines, not to mention a number of address decoders and glue logic to connect everything;
Barramento I2C • This bus is called the Inter-IC or I2C-bus; • All I2C-bus compatible devices incorporate an on-chip interface which allows them to communicate directly with each other via the I2C-bus. • This design concept solves the many interfacing problems encountered when designing digital control circuits. • I2C has become a de facto world standard that is now implemented in over 1000 different ICs and is licensed to more than 50 companies.
The I2C Bus Protocol • The I2C bus physically consists of 2 active wires and a ground connection. The active wires, called SDA and SCL, are both bi-directional. SDA is the Serial DAta line, and SCL is the Serial CLock line.
The I2C Bus Protocol • Every device hooked up to the bus has its own unique address, no matter whether it is an MCU, LCD driver, memory, or ASIC. Each of these chips can act as a receiver and/or transmitter, depending on the functionality.
The I2C Bus Protocol • The I2C bus is a multi-master bus. This means that more than one IC capable of initiating a data transfer can be connected to it. • The I2C protocol specification states that the IC that initiates a data transfer on the bus is considered the Bus Master. Consequently, at that time, all the other ICs are regarded to be Bus Slaves.
The I2C Bus Protocol • Passos para conexão • First, the MCU will issue a START condition. This acts as an 'Attention' signal to all of the connected devices. • All ICs on the bus will listen to the bus for incoming data.
The I2C Bus Protocol • Passos para conexão • Then the MCU sends the ADDRESS of the device it wants to access, along with an indication whether the access is a Read or Write operation (Write in our example). • Having received the address, all IC's will compare it with their own address.
The I2C Bus Protocol • Passos para conexão • If it doesn't match, they simply wait until the bus is released by the stop condition (see below). • If the address matches, however, the chip will produce a response called the ACKNOWLEDGE signal. • Once the MCU receives the acknowledge, it can start transmitting or receiving DATA.
The I2C Bus Protocol • Receiving a byte from a slave • All the master has to do is generate a rising edge on the SCL line (2), read the level on SDA (3) and generate a falling edge on the SCL line (4). • The slave will not change the data during the time that SCL is high. (Otherwise a Start or Stop condition might inadvertently be generated.) • During (1) and (5), the slave may change the state of the SDA line.
The I2C Bus Protocol • Passos para conexão • In our case, the MCU will transmit data. • When all is done, the MCU will issue the STOP condition. • This is a signal that the bus has been released and that the connected ICs may expect another transmission to start any moment.
The I2C Bus Protocol • Passos para conexão • Once the MCU receives the acknowledge, it can start transmitting or receiving DATA.
The I2C Bus Hardware Structure • The bus interface is built around an input buffer and an open drain or open collector transistor. • When the bus is IDLE, the bus lines are in the logic HIGH state (note that external pull-up resistors are necessary for this which is easily forgotten). • To put a signal on the bus, the chip drives its output transistor, thus pulling the bus to a LOW level. • The "pull-up resistor" in the devices as seen in the figure is actually a small current source or even non-existent.
Recomendações para Implementação • Criar as seguintes definições: • Conectando: • SDA = RB0 • SCL = RB1
Recomendações para Implementação • Criar uma função de inicialização “void I2C_Config()” que: • OPTION = 0 (liga os resistores de pull-up de PORTB); • SDA = 0 (configurada como entrada) • SCL = 0 (configurada como saída)
Recomendações para Implementação • Criar uma função “I2C_Start()” que: • Seleciona SDA como saída (DATA_OUT); • Gere o sinal:
Recomendações para Implementação • Criar uma função “void I2C_Stop()” que: • Selecione SDA como saída (DATA_OUT); • Gere o sinal:
Recomendações para Implementação • Criar uma função “void I2C_SendHigh()” para “enviar um bit 1” que: • Selecione SDA como saída (DATA_OUT); • Gere o sinal:
Recomendações para Implementação • Criar uma função “I2C_SendLow()” para “enviar um bit 0” que: • Selecione SDA como saída (DATA_OUT); • Gere o sinal:
Recomendações para Implementação • Criar uma função “unsigned char I2C_GetBit()” que faça: • Selecione SDA como entrada (DATA_IN); • Gere o sinal: Ler a entrada SDA AQUI !
Recomendações para Implementação • Utilizando as funções “I2C_SendHight()“ e “I2C_SendLow()”, criar uma função chamada “void I2C_SendByte(unsigned char byte)”; • Esta função deve enviar o byte todo, iniciando pelo bit mais significativo;
Recomendações para Implementação • Utilizando a função “I2C_GetBit()“, criar uma função chamada “unsigned char I2C_GetByte()”; • Esta função deve receber um byte todo, iniciando pelo mais significativo;
I2C – EEPROM – AT24C02 WP 0-Habilita Escrita 1-Desabilita Escrita Device Address
I2C – EEPROM – AT24C02 • Device Address (Address Slave) R/W = 1 Leitura R/W = 0 Escrita
I2C_Start I2C_Start I2C_SendByte I2C_SendByte I2C_SendByte I2C_GetBit I2C_GetBit I2C_GetBit I2C – EEPROM – AT24C02 • Byte Write
I2C – EEPROM – AT24C02 • Page Write
I2C_GetByte I2C – EEPROM – AT24C02 • Current Address Read
I2C_GetByte I2C – EEPROM – AT24C02 • Random Read
I2C – EEPROM – AT24C02 • Temporização
I2C – EEPROM – AT24C02 • Temporização
I2C – EEPROM – AT24C02 • Temporização • Para gerar os tempos entre as transições de sinais, sugiro:
I2C – EEPROM – AT24C02 • Atividade 17 – Memória EEPROM – I2C • Implementar um circuito que leia o conteúdo de uma memória I2C, exibindo-o no Hyperterminal; • Cada memória possui uma seqüência de caracteres terminando com 0xFF;
I2C – EEPROM – AT24C02 • Atividade 17 – Memória EEPROM – I2C • A memória a ser utilizada é a AT24C02 de apenas 256 bytes, montada em uma pequena placa avulsa; • A placa deve ser fixada pelo conector inferior nos bits RB0 e RB1.