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++NOatmega128111B15F.elfc++\0-Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefaultYESMakefileatmega1284111B15F.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++NOatmega128111B15F.elfc++\0-Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefaultYESMakefileatmega1284111B15F.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