hier der Code aus TWI.h:
TWI.cCode:#ifndef TWI_H
#define TWI_H
#include <avr/io.h>
#include <stdint.h>
#define SEND 0
#define READ 1
void TWI_init(uint8_t);
uint8_t TWI_start(uint8_t);
void TWI_sendbyte(uint8_t);
uint8_t TWI_readbyte(void);
void TWI_stop(void);
#endif
sram.hCode:#include "TWI.h"
/* TWI initialisieren */
void TWI_init(uint8_t ownaddr)
{
TWAR = ownaddr;
TWSR &= 0xFC;
TWBR = 0x0;
}
/* Start und Slaveaddresse senden */
uint8_t TWI_start(uint8_t ndevaddr)
{
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
TWDR = ndevaddr;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
}
/* Byte senden */
void TWI_sendbyte(uint8_t nbyte)
{
TWDR = nbyte;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
}
/* Byte lesen */
uint8_t TWI_readbyte(void)
{
TWCR |= (1<<TWINT) | (1<<TWEA);
while(!(TWCR & (1<<TWINT)));
return TWDR;
}
/* Stop senden */
void TWI_stop(void)
{
TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
}
sram.cCode:#ifndef SRAM_H
#define SRAM_H
#include <inttypes.h>
#include <avr/io.h>
#define WE_PIN 0 // WriteEnable
#define WE_PORT PORTB
#define CS_PIN 2 // ChipSelect
#define CS_PORT PORTB
#define LE_PIN 3 // LatchEnable
#define LE_PORT PORTB
#define ADDR PORTA // Addressport
void sram_write_byte(uint16_t, uint8_t);
uint8_t sram_read_byte(uint16_t);
void Latch(uint8_t);
#endif
der Code zum Ansteuern des sram sieht ein wenig komisch aus, weil ich keinen freien Port mehr für die Daten übrig hatte, so habe ich 6Pins vom PortC und 2 Pins vom PortD verwendet, was das ganze komplizierter machtCode:#include "sram.h"
/* Byte in sram speichern */
void sram_write_byte(uint16_t address, uint8_t data)
{
/* Addresse anlegen */
Latch(address & 0x00FF);
ADDR = ((address & 0xFF00) >> 8);
/* Byte anlegen */
DDRC |= 0xFC;
DDRD |= 0x30;
PORTC = (data & 0xFC);
PORTD &= ~0x30;
PORTD |= ((data<<4) & 0x30);
/* Byte speichern */
WE_PORT &= ~(1<<WE_PIN);
delay(2);
WE_PORT |= (1<<WE_PIN);
}
/* Byte aus sram lesen */
uint8_t sram_read_byte(uint16_t address)
{
/* Addresse anlegen */
Latch(address & 0x00FF);
ADDR = ((address & 0xFF00) >> 8);
/* Byte lesen und zurückgeben */
DDRC = 0x0;
DDRD &= ~0x30;
delay(2);
return ((PINC & 0xFC) | ((PIND & 0x30)>>4));
}
void Latch(uint8_t wert)
{
ADDR = wert;
LE_PORT |= (1<<LE_PIN);
delay(2);
LE_PORT &= ~(1<<LE_PIN);
}
ja, das wirst du auch finden, aber es erklärt sich doch von fast selbst: es wird eine Funktion namens sram_write_byte aufgerufen, die ein Byte in den sram schreibt, als Argumente gibts einmal eins vom Typ uint16_t, was die Addresse im Ram sein wird und einen 8 Bit-Wert, in dem die Daten stehenZitat:
da ist dies bestimmt auch drin: sram_write_byte(counter, TWI_readbyte());