diff --git a/B15F.aps b/B15F.aps
index d38d48c..1790901 100644
--- a/B15F.aps
+++ b/B15F.aps
@@ -1 +1 @@
-B15F22-Mar-2019 14:29:5422-Mar-2019 16:03:17241022-Mar-2019 14:29:5444, 19, 0, 730AVR GCCB15F.elfF:\JTAGICE mkIIATmega1284.xmlfalseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000spi.cppmain.cppMakefilespi.hdefault\B15F.lssdefault\B15F.mapc++NOatmega12811
B15F.elfc++\0-Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefaultYESMakefileatmega128411
B15F.elfdefault\1C:\avr8-gnu-toolchain-win32_x86\avr\include\C:\avr8-gnu-toolchain-win32_x86\avr\lib\libc.a-Wall -gdwarf-2 -DF_CPU=20000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault0C:\avr8-gnu-toolchain-win32_x86\bin\avr-g++.exeC:\WinAVR-20100110\utils\bin\make.exeF:\spi.hF:\spi.cppF:\main.cppF:\Makefile00000spi.h100001main.cpp100002Makefile100003spi.cpp1
+B15F22-Mar-2019 14:29:5425-Mar-2019 12:57:42241022-Mar-2019 14:29:5444, 19, 0, 730AVR GCCB15F.elfF:\JTAGICE mkIIATmega1284.xmlfalseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000spi.cppmain.cppMakefilemcp23s17.cppspi.hmcp23s17.hdefault\B15F.lssdefault\B15F.mapc++NOatmega12811
B15F.elfc++\0-Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefaultYESMakefileatmega128411
B15F.elfdefault\1C:\avr8-gnu-toolchain-win32_x86\avr\include\C:\avr8-gnu-toolchain-win32_x86\avr\lib\libc.a-Wall -gdwarf-2 -DF_CPU=20000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault0C:\avr8-gnu-toolchain-win32_x86\bin\avr-g++.exeC:\WinAVR-20100110\utils\bin\make.exeF:\spi.hF:\mcp23s17.hF:\spi.cppF:\main.cppF:\MakefileF:\mcp23s17.cpp00000main.cpp100001Makefile100002spi.h100003spi.cpp100004mcp23s17.h100005mcp23s17.cpp1
diff --git a/B15F.elf b/B15F.elf
index 6ff0cc6..209942f 100644
Binary files a/B15F.elf and b/B15F.elf differ
diff --git a/B15F.hex b/B15F.hex
index 572b950..edb805b 100644
--- a/B15F.hex
+++ b/B15F.hex
@@ -1,14 +1,24 @@
-:100000000C9446000C9450000C9450000C9450003A
-:100010000C9450000C9450000C9450000C94500020
-:100020000C9450000C9450000C9450000C94500010
-:100030000C9450000C9450000C9450000C94500000
-:100040000C9450000C9450000C9450000C945000F0
-:100050000C9450000C9450000C9450000C945000E0
-:100060000C9450000C9450000C9450000C945000D0
-:100070000C9450000C9450000C9450000C945000C0
-:100080000C9450000C9450000C94500011241FBE8E
-:10009000CFEFD0E4DEBFCDBF0E9457000C946600C6
-:1000A0000C9400000895259A2698279A0895CF93D6
-:1000B000DF931F92CDB7DEB7CE0101960E945200AA
-:1000C00080E090E00F90DF91CF910895F894FFCFFA
+:100000000C9447000C9464000C9464000C946400FD
+:100010000C9464000C9464000C9464000C946400D0
+:100020000C9464000C9464000C9464000C946400C0
+:100030000C9464000C9464000C9464000C946400B0
+:100040000C9464000C9464000C9464000C946400A0
+:100050000C9464000C9464000C9464000C94640090
+:100060000C9464000C9464000C9464000C94640080
+:100070000C9464000C9464000C9464000C94640070
+:100080000C9464000C9464000C9464009F00112490
+:100090001FBECFEFD0E4DEBFCDBF21E0A0E0B1E0D6
+:1000A00001C01D92A430B207E1F710E0C7E4D0E030
+:1000B00004C02197FE010E94AA00C634D107C9F7E7
+:1000C0000E9495000C94B3000C9400000895259AAA
+:1000D0002698279A529A539A549A80EB84B980E5CD
+:1000E0008CBD81E08DBD08955A985B985C9860FD49
+:1000F0005A9A61FD5B9A62FD5C9A08956EBD0DB4DB
+:1001000007FEFDCF87E893E10197F1F700C00000FB
+:100110008EB50895FC01718360834283089560E485
+:10012000FC01808191810C947E0083E091E00E942B
+:10013000670088E08EBD0DB407FEFDCFFBCF83E0E6
+:1001400091E00E94660042E063E071E080E091E0AF
+:100150000C948A00EE0FFF1F0024001C0BBE0790BA
+:0A016000F691E02D0994F894FFCF0A
:00000001FF
diff --git a/Makefile b/Makefile
index fba4697..a146f0b 100644
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,7 @@ OUTPUT = B15F.elf
HEX = B15F.hex
CFLAGS = -std=c++14 -O3 -mmcu=atmega1284 -DF_CPU=20000000 -DPIO_DISABLE_I2C
LDFLAGS =
-OBJECTS = main.o spi.o
+OBJECTS = main.o spi.o mcp23s17.o
COMPILE = $(COMPILER_PATH) $(CFLAGS)
diff --git a/main.cpp b/main.cpp
index a7fc66d..def26d2 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,7 +1,21 @@
#include
-#include "spi.h"
+#include
+#include
+#include "mcp23s17.h"
+
+
+SPI spi;
+MCP23S17 beba0(spi, SPIADR::BEBA0);
int main() {
- SPI spi_master;
+ spi.init();
+
+ while(1) {
+
+ SPDR = 8;
+ while(!(SPSR & _BV(SPIF)));
+ //spi.pushByte(8);
+ }
+
return 0;
}
diff --git a/main.hex b/main.hex
new file mode 100644
index 0000000..d91cc8e
--- /dev/null
+++ b/main.hex
@@ -0,0 +1,20 @@
+:100000000C9446000C9450000C9450000C9450003A
+:100010000C9450000C9450000C9450000C94500020
+:100020000C9450000C9450000C9450000C94500010
+:100030000C9450000C9450000C9450000C94500000
+:100040000C9450000C9450000C9450000C945000F0
+:100050000C9450000C9450000C9450000C945000E0
+:100060000C9450000C9450000C9450000C945000D0
+:100070000C9450000C9450000C9450000C945000C0
+:100080000C9450000C9450000C94500011241FBE8E
+:10009000CFEFD0E4DEBFCDBF0E9486000C9490006D
+:1000A0000C940000CF93DF93CDB7DEB784E290E0ED
+:1000B00024E230E0F9012081206BFC0120838CE4F4
+:1000C00090E021E5FC0120830000DF91CF910895AD
+:1000D000CF93DF931F92CDB7DEB789838EE490E094
+:1000E0002981FC0120838DE490E0FC0180818095D2
+:1000F000881F8827881F882309F0F5CF8EE490E0B9
+:10010000FC0180810F90DF91CF910895CF93DF9311
+:10011000CDB7DEB70E94520080E00E946800FCCF9D
+:04012000F894FFCF81
+:00000001FF
diff --git a/mcp23s17.cpp b/mcp23s17.cpp
new file mode 100644
index 0000000..9597ba9
--- /dev/null
+++ b/mcp23s17.cpp
@@ -0,0 +1,34 @@
+#include "mcp23s17.h"
+
+MCP23S17::MCP23S17(SPI& spi, uint8_t adr) : spi(spi), adr(adr)
+{
+
+}
+
+
+void MCP23S17::setPort(uint8_t port) const
+{
+
+ spi.pushByte(0x40);
+ /*
+
+ spi.setAdr(0);
+ _delay_ms(1);
+ spi.setAdr(adr);
+ spi.pushByte(0x40); //
+ spi.pushByte(0x00); // DIR A
+ spi.pushByte(0x00); // alle ausgang
+
+ spi.setAdr(0);
+ _delay_ms(1);
+ spi.setAdr(adr);
+ spi.pushByte(0x40);
+ spi.pushByte(0x12);
+ spi.pushByte(0xF0);
+ spi.setAdr(0);
+
+ /*while(1) {
+ PORTB ^= _BV(PB7);
+ _delay_ms(1);
+ }*/
+}
diff --git a/mcp23s17.h b/mcp23s17.h
new file mode 100644
index 0000000..d087c3a
--- /dev/null
+++ b/mcp23s17.h
@@ -0,0 +1,17 @@
+#ifndef MCP23S17_H
+#define MCP23S17_H
+
+#include "spi.h"
+
+class MCP23S17
+{
+public:
+ MCP23S17(SPI&, uint8_t);
+ void setPort(uint8_t) const;
+
+private:
+ SPI& spi;
+ const uint8_t adr;
+};
+
+#endif // MCP23S17_H
diff --git a/spi.cpp b/spi.cpp
index fd4b7cf..625912d 100644
--- a/spi.cpp
+++ b/spi.cpp
@@ -6,7 +6,49 @@ SPI::SPI(void)
void SPI::init(void) const
{
+
+ // Konfiguriere SPI DDRs
dMode(MOSI, OUT);
dMode(MISO, IN);
dMode(SCLK, OUT);
+
+ // Konfiguriere DMUX DDRs
+ dMode(DMUX1, OUT);
+ dMode(DMUX2, OUT);
+ dMode(DMUX3, OUT);
+
+ DDRB = 0xB0;
+
+ // aktiviere SPI, Master Modus, SPI Modus 0
+ // F_SPI = F_CPU / 2 (prescaler 2)
+ SPCR = _BV(SPE) | _BV(MSTR);
+ SPSR = _BV(SPI2X);
+
+}
+
+/*void SPI::setFreq(uint32_t freq) const
+{
+
+}*/
+
+void SPI::setAdr(uint8_t adr) const
+{
+ dWrite(DMUX1, 0);
+ dWrite(DMUX2, 0);
+ dWrite(DMUX3, 0);
+
+ if(adr & 0x01)
+ dWrite(DMUX1, 1);
+ if(adr & 0x02)
+ dWrite(DMUX2, 1);
+ if(adr & 0x04)
+ dWrite(DMUX3, 1);
+}
+
+uint8_t SPI::pushByte(uint8_t b) const
+{
+ SPDR = b;
+ while(!(SPSR & _BV(SPIF)));
+ _delay_ms(1);
+ return SPDR;
}
diff --git a/spi.h b/spi.h
index e180b00..d5e83ae 100644
--- a/spi.h
+++ b/spi.h
@@ -1,18 +1,32 @@
-#ifndef SPI_MASTER_H
-#define SPI_MASTER_H
+#ifndef SPI_H
+#define SPI_H
#include
+#include
#include "pio.h"
#define MOSI B5
#define MISO B6
#define SCLK B7
-class SPI {
+#define DMUX1 D2
+#define DMUX2 D3
+#define DMUX3 D4
+
+enum SPIADR {
+ BEBA0 = 2,
+ BEBA1 = 3,
+};
+
+class SPI
+{
public:
SPI(void);
void init(void) const;
+ //void setFreq(uint32_t) const;
+ void setAdr(uint8_t) const;
+ uint8_t pushByte(uint8_t) const;
};
-#endif
+#endif // SPI_H