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 stehenda ist dies bestimmt auch drin: sram_write_byte(counter, TWI_readbyte());







Zitieren

Lesezeichen