; I2C test for controlling the I2C servoswitch ; based on Testboard hardware ; converts 3 bytes from serial connection and sends it to TWI ; ; author: Achim Walther, www.voidpointer.de ; version 1.01, 11.05.2005 .include "m8def.inc" ;**************************************************************************** ; TWI State codes ;****************************************************************************/ ; General TWI Master staus codes .equ TWI_START = 0x08 ; START has been transmitted .equ TWI_REP_START = 0x10 ; Repeated START has been transmitted .equ TWI_ARB_LOST = 0x38 ; Arbitration lost ; TWI Master Transmitter staus codes .equ TWI_MTX_ADR_ACK = 0x18 ; SLA+W has been tramsmitted and ACK received .equ TWI_MTX_ADR_NACK = 0x20 ; SLA+W has been tramsmitted and NACK received .equ TWI_MTX_DATA_ACK = 0x28 ; Data byte has been tramsmitted and ACK received .equ TWI_MTX_DATA_NACK = 0x30 ; Data byte has been tramsmitted and NACK received ; TWI Master Receiver staus codes .equ TWI_MRX_ADR_ACK = 0x40 ; SLA+R has been tramsmitted and ACK received .equ TWI_MRX_ADR_NACK = 0x48 ; SLA+R has been tramsmitted and NACK received .equ TWI_MRX_DATA_ACK = 0x50 ; Data byte has been received and ACK tramsmitted .equ TWI_MRX_DATA_NACK = 0x58 ; Data byte has been received and NACK tramsmitted ; TWI Slave Transmitter staus codes .equ TWI_STX_ADR_ACK = 0xA8 ; Own SLA+R has been received; ACK has been returned .equ TWI_STX_ADR_ACK_M_ARB_LOST = 0xB0 ; Arbitration lost in SLA+R/W as Master; own SLA+R has been received; ACK has been returned .equ TWI_STX_DATA_ACK = 0xB8 ; Data byte in TWDR has been transmitted; ACK has been received .equ TWI_STX_DATA_NACK = 0xC0 ; Data byte in TWDR has been transmitted; NOT ACK has been received .equ TWI_STX_DATA_ACK_LAST_BYTE = 0xC8 ; Last data byte in TWDR has been transmitted (TWEA = '0'); ACK has been received ; TWI Slave Receiver staus codes .equ TWI_SRX_ADR_ACK = 0x60 ; Own SLA+W has been received ACK has been returned .equ TWI_SRX_ADR_ACK_M_ARB_LOST = 0x68 ; Arbitration lost in SLA+R/W as Master; own SLA+W has been received; ACK has been returned .equ TWI_SRX_GEN_ACK = 0x70 ; General call address has been received; ACK has been returned .equ TWI_SRX_GEN_ACK_M_ARB_LOST = 0x78 ; Arbitration lost in SLA+R/W as Master; General call address has been received; ACK has been returned .equ TWI_SRX_ADR_DATA_ACK = 0x80 ; Previously addressed with own SLA+W; data has been received; ACK has been returned .equ TWI_SRX_ADR_DATA_NACK = 0x88 ; Previously addressed with own SLA+W; data has been received; NOT ACK has been returned .equ TWI_SRX_GEN_DATA_ACK = 0x90 ; Previously addressed with general call; data has been received; ACK has been returned .equ TWI_SRX_GEN_DATA_NACK = 0x98 ; Previously addressed with general call; data has been received; NOT ACK has been returned .equ TWI_SRX_STOP_RESTART = 0xA0 ; A STOP condition or repeated START condition has been received while still addressed as Slave ; TWI Miscellaneous status codes .equ TWI_NO_STATE = 0xF8 ; No relevant state information available; TWINT = '0' .equ TWI_BUS_ERROR = 0x00 ; Bus error due to an illegal START or STOP condition ;***************************************************************************************** .def char0 = R12 .def charA = R13 .def save = R14 .def regs = R15 .def temp = R16 .def data = R17 .def flag = R19 .equ ram = 0x100 ; temporary space for keeping UART commands ;.equ CLOCK = 8000000 .equ CLOCK = 4000000 .equ BAUD = 9600 .equ UBRRVAL = CLOCK/(BAUD*16)-1 .equ SERVOSW_W = 0b11000000 intvect: rjmp init ; RESET reti ; INT0 reti ; INT1 reti ; T2 Compare reti ; T2 Overflow reti ; T1 Capture reti ; T1 Compare A reti ; T1 Compare B reti ; T1 Overflow reti ; T0 Overflow reti ; SPI Transfer complete rjmp int_rxc ; UART RX Complete reti ; UDR Empty reti ; UART TX Complete reti ; ADC complete reti ; EEPROM Ready reti ; Analog Comparator reti ; TWM reti ; SPM_RDY init: ; init stack pointer ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ; LED debugging ldi temp, 0b00000001 out DDRC, temp ; configure PinC 0-3 for output ldi temp, 0b00000001 out PORTC, temp ; switch all LEDs off ldi flag, 0 ; init registers for hexout ldi temp, '0' mov char0, temp ldi temp, 'A'-10 mov charA, temp ; init TWI ;ldi temp, 32 ; TWI clock 100kHz at 8 MHz ldi temp, 12 ; TWI clock 100kHz at 4 MHz out TWBR, temp ldi temp, 0xFF out TWDR, temp ; Default content = SDA released ldi temp, (1<