;****************************************************************************** ;* ;* General Equates ;* ;****************************************************************************** .equ CHR_CR = $0d ;ASCII value for CR .equ CHR_LF = $0a ;ASCII value for LF .equ DELAY_SHIFT = 0x110 .equ DIGIT_COUNT = 6 .equ MSG_PWR_OFF = 3 .equ FIFO1_SIZE = 0x20 .equ FIFO2_SIZE = 0x20 .equ SRAM_BEG = 0x60 .equ FIFO1_BEG = SRAM_BEG ;****************************************************************************** ;* ;* Timing equates for serial communication and timer tick. If the osc ;* changes, these values must also be adjusted ;* ;****************************************************************************** .equ EXT_OSC = 8000000 .equ BAUD19200 = 19200 .equ BAUD250000 = 250000 .equ TIM0_CLK_DIV = 256 .equ TIM0_BIT_LEN = 8 .equ MS1 = 1000 ;(1/.001) 1ms count .equ MS10 = 100 ;(1/.01) 10ms count .equ MS20 = 50 ;(1/.01) 20ms count .equ SEC1 = 1 ; 1 second count .equ CNT_1MS = (EXT_OSC / TIM0_CLK_DIV) / MS1 .equ CNT_10MS = (EXT_OSC / TIM0_CLK_DIV) / MS10 .equ BAUD_VAL19200 = (EXT_OSC / (16 * BAUD19200)) -1 .equ BAUD_VAL250000 = (EXT_OSC / (16 * BAUD250000)) -1 .equ BAUD_VALUE_INIT= BAUD_VAL250000 .equ CNT_1_SEC = MS20 / 1 ;count to equal 1 second ;****************************************************************************** ;* ;* I/O pin equates ;* ;****************************************************************************** ; PORT B .equ LED_ROW = PORTB .equ LED_ROW1_O = PORTB ;port .equ LED_ROW1_B = 0 ;bit position 0 (dig I/O, analog cmp+) .equ LED_ROW1_D = 1 ;default direction: 0=input, 1=output .equ LED_ROW1_T = 1 ;data if output, else 0=float 1=pullup .equ LED_ROW1_I = PINB ;in port .equ LED_ROW2_O = PORTB ;port .equ LED_ROW2_B = 1 ;bit position 1 (dig I/O, analog cmp-) .equ LED_ROW2_D = 1 ;default direction: 0=input, 1=output .equ LED_ROW2_T = 1 ;data if output, else 0=float 1=pullup .equ LED_ROW2_I = PINB ;in port .equ LED_ROW3_O = PORTB ;port .equ LED_ROW3_B = 2 ;bit position 2 (dig I/O) .equ LED_ROW3_D = 1 ;default direction: 0=input, 1=output .equ LED_ROW3_T = 1 ;data if output, else 0=float 1=pullup .equ LED_ROW3_I = PINB ;in port .equ LED_ROW4_O = PORTB ;port .equ LED_ROW4_B = 3 ;bit position 3 (dig I/O, tim 1 comp) .equ LED_ROW4_D = 1 ;default direction: 0=input, 1=output .equ LED_ROW4_T = 1 ;data if output, else 0=float 1=pullup .equ LED_ROW4_I = PINB ;in port .equ LED_ROW5_O = PORTB ;port .equ LED_ROW5_B = 4 ;bit position 4 (dig I/O) .equ LED_ROW5_D = 1 ;default direction: 0=input, 1=output .equ LED_ROW5_T = 1 ;data if output, else 0=float 1=pullup .equ LED_ROW5_I = PINB ;in port .equ LED_ROW6_O = PORTB ;port .equ LED_ROW6_B = 5 ;bit position 5 (dig I/O, MOSI pgm pin) .equ LED_ROW6_D = 1 ;default direction: 0=input, 1=output .equ LED_ROW6_T = 1 ;data if output, else 0=float 1=pullup .equ LED_ROW6_I = PINB ;in port .equ LED_ROW7_O = PORTB ;port .equ LED_ROW7_B = 6 ;bit position 6 (dig I/O, MISO pgm pin) .equ LED_ROW7_D = 1 ;default direction: 0=input, 1=output .equ LED_ROW7_T = 1 ;data if output, else 0=float 1=pullup .equ LED_ROW7_I = PINB ;in port .equ unused_b7_O = PORTB ;port .equ unused_b7_B = 7 ;bit position 7 (dig I/O, SCK pgm pin) .equ unused_b7_D = 0 ;default direction: 0=input, 1=output .equ unused_b7_T = 1 ;data if output, else 0=float 1=pullup .equ unused_b7_I = PINB ;in port ;default direction for port B .set DDRB_INIT = (LED_ROW1_D << LED_ROW1_B) | (LED_ROW2_D << LED_ROW2_B) .set DDRB_INIT = DDRB_INIT | (LED_ROW3_D << LED_ROW3_B) | (LED_ROW4_D << LED_ROW4_B) .set DDRB_INIT = DDRB_INIT | (LED_ROW5_D << LED_ROW5_B) | (LED_ROW6_D << LED_ROW6_B) .set DDRB_INIT = DDRB_INIT | (LED_ROW7_D << LED_ROW7_B) | (unused_b7_D << unused_b7_B) ;default data for port B .set PORTB_INIT = (LED_ROW1_T << LED_ROW1_B) | (LED_ROW2_T << LED_ROW2_B) .set PORTB_INIT = PORTB_INIT | (LED_ROW3_T << LED_ROW3_B) | (LED_ROW4_T << LED_ROW4_B) .set PORTB_INIT = PORTB_INIT | (LED_ROW5_T << LED_ROW5_B) | (LED_ROW6_T << LED_ROW6_B) .set PORTB_INIT = PORTB_INIT | (LED_ROW7_T << LED_ROW7_B) | (unused_b7_T << unused_b7_B) ;PORT D .equ RXD_DATA_O = PORTD ;port .equ RXD_DATA_B = 0 ;bit position 0 (dig I/O, ser RXD) .equ RXD_DATA_D = 0 ;default direction: 0=input, 1=output .equ RXD_DATA_T = 1 ;data if output, else 0=float 1=pullup .equ RXD_DATA_I = PIND ;in port .equ TXD_DATA_O = PORTD ;port .equ TXD_DATA_B = 1 ;bit position 1 (dig I/O, ser TXD) .equ TXD_DATA_D = 0 ;default direction: 0=input, 1=output .equ TXD_DATA_T = 1 ;data if output, else 0=float 1=pullup .equ TXD_DATA_I = PIND ;in port .equ COL_LOAD_O = PORTD ;port .equ COL_LOAD_B = 2 ;bit position 2 (dig I/O, INT0 input) .equ COL_LOAD_D = 1 ;default direction: 0=input, 1=output .equ COL_LOAD_T = 0 ;data if output, else 0=float 1=pullup .equ COL_LOAD_I = PIND ;in port .equ COL_RST_O = PORTD ;port .equ COL_RST_B = 3 ;bit position 3 (dig I/O, INT1 input) .equ COL_RST_D = 1 ;default direction: 0=input, 1=output .equ COL_RST_T = 0 ;data if output, else 0=float 1=pullup .equ COL_RST_I = PIND ;in port .equ COL_CLK_O = PORTD ;port .equ COL_CLK_B = 4 ;bit position 4 (dig I/O, tim 0 input) .equ COL_CLK_D = 1 ;default direction: 0=input, 1=output .equ COL_CLK_T = 0 ;data if output, else 0=float 1=pullup .equ COL_CLK_I = PIND ;in port .equ COL_DAT_O = PORTD ;port .equ COL_DAT_B = 5 ;bit position 5 (dig I/O, tim 1 input) .equ COL_DAT_D = 1 ;default direction: 0=input, 1=output .equ COL_DAT_T = 0 ;data if output, else 0=float 1=pullup .equ COL_DAT_I = PIND ;in port .equ PWR_ENA_O = PORTD ;port .equ PWR_ENA_B = 6 ;bit position 6 (dig I/O, tim1 capture) .equ PWR_ENA_D = 1 ;default direction: 0=input, 1=output .equ PWR_ENA_T = 0 ;data if output, else 0=float 1=pullup .equ PWR_ENA_I = PIND ;in port ;default direction for port D .set DDRD_INIT = (RXD_DATA_D << RXD_DATA_B) | (TXD_DATA_D << TXD_DATA_B) .set DDRD_INIT = DDRD_INIT | (COL_LOAD_D << COL_LOAD_B) | (COL_RST_D << COL_RST_B) .set DDRD_INIT = DDRD_INIT | (COL_CLK_D << COL_CLK_B) | (COL_DAT_D << COL_DAT_B) .set DDRD_INIT = DDRD_INIT | (PWR_ENA_D << PWR_ENA_B) ;default data for port D .set PORTD_INIT = (RXD_DATA_T << RXD_DATA_B) | (TXD_DATA_T << TXD_DATA_B) .set PORTD_INIT = PORTD_INIT | (COL_LOAD_T << COL_LOAD_B) | (COL_RST_T << COL_RST_B) .set PORTD_INIT = PORTD_INIT | (COL_CLK_T << COL_CLK_B) | (COL_DAT_T << COL_DAT_B) .set PORTD_INIT = PORTD_INIT | (PWR_ENA_T << PWR_ENA_B) ;****************************************************************************** ;* ;* Hardware setup equates ;* ;****************************************************************************** ;GIMSK(0x3b) General interrupt mask .equ INT1_D = 0 ;External Interrupt Request 1 Enable .equ INT0_D = 0 ;External Interrupt Request 0 Enable .equ PCIE_D = 0 ;Pin change interrupt Enable .equ GIMSK_MASK = 0b11100000 ;mask for valid bits ;TIMSK(0x39) Timer/Counter Interrupt mask register .equ OCIE0A_D = 0 ;Timer/Counter0 Output Compare Match A Interrupt Ena .equ TOIE0_D = 0 ;Timer/Counter0 Overflow Interrupt Enable .equ OCIE0B_D = 0 ;Timer/Counter0 Output Compare Match B Interrupt Ena .equ ICIE1_D = 0 ;Timer/Counter1 Input Capture Interrupt Ena .equ OCIE1B_D = 0 ;Timer/Counter1 Output Compare Match B Interrupt Ena .equ OCIE1A_D = 0 ;Timer/Counter1 Output Compare Match A Interrupt Ena .equ TOIE1_D = 0 ;Timer/Counter1 Overflow Interrupt Enable .equ TIMSK_MASK = 0b11101111 ;mask for valid bits ;MCUCR(0x35) MCU general control register .equ PUD_D = 0 ;Pull-Up Disable (1 = disabled) .equ SE_D = 0 ;Sleep Enable (allow sleep instruction) .equ SM_D = 0 ;Sleep Mode ; 0 = Idle ; 1 = Power Down ; 2 = Power Down ; 3 = Standby .equ ISC1_D = 0 ;Interrupt Sense Control(INT1) ; 0 = INT1 generates interrupt on level low ; 1 = INT1 generates interrupt on logical change ; 2 = INT1 generates interrupt on falling edge ; 3 = INT1 generates interrupt on rising edge .equ ISC0_D = 0 ;Interrupt Sense Control(INT0) ; 0 = INT0 generates interrupt on level low ; 1 = INT0 generates interrupt on logical change ; 2 = INT0 generates interrupt on falling edge ; 3 = INT0 generates interrupt on rising edge .equ MCUCR_MASK = 0b11111111 ;mask for valid bits ;TCCR0(0x33) Timer/Counter 0 Control register .equ CS0_D = 4 ;Clock select for Timer 0 ; 0 = Timer/Counter 0 is stopped ; 1 = Timer/Counter 0 tied to clock ; 2 = Timer/Counter 0 tied to clock /8 ; 3 = Timer/Counter 0 tied to clock /64 ; 4 = Timer/Counter 0 tied to clock /256 ; 5 = Timer/Counter 0 tied to clock /1024 ; 6 = Timer tied to EXT pin T0 falling edge ; 7 = Timer tied to EXT pin T0 rising edge .equ TCCR0_MASK = 0b00000111 ;mask for valid bits ;TCCR1A(0x2f) Timer/Counter 1 Control Register A .equ COM1A_D = 0 ;Timer 1 Output Compare Mode ; 0 = Timer/Counter 1 not connected to OC1 ; 1 = Toggle the OC1 output pin ; 2 = Clear the OC1 output pin ; 3 = Set the OC1 output pin .equ PWM1_D = 0 ;Pulse Width Modulator Select Bits ; 0 = PWM operation disabled ; 1 = Timer/Counter 1 = 8 bit PWM ; 2 = Timer/Counter 1 = 9 bit PWM ; 3 = Timer/Counter 1 = 10 bit PWM .equ TCCR1A_MASK = 0b11000011 ;mask for valid bits ;TCCR1B(0x2e) Timer/Counter 1 Control Register B .equ ICNC1_D = 0 ;Input Capture1 Noise Canceler .equ ICES1_D = 0 ;Input Capture1 Edge select (1 = rising) .equ CTC1_D = 0 ;Clear Timer/Counter1 on compare match .equ CS1_D = 0 ;Clock select for Timer 1 ; 0 = Timer/Counter 1 is stopped ; 1 = Timer/Counter 1 tied to clock ; 2 = Timer/Counter 1 tied to clock /8 ; 3 = Timer/Counter 1 tied to clock /64 ; 4 = Timer/Counter 1 tied to clock /256 ; 5 = Timer/Counter 1 tied to clock /1024 ; 6 = Timer tied to EXT pin T1 falling edge ; 7 = Timer tied to EXT pin T1 rising edge .equ TCCR1B_MASK = 0b11001111 ;mask for valid bits ;WDTCR(0x21) Watchdog Timer control register .equ WDTOE_D = 0 ;Watchdog Turn-Off Enable .equ WDE_D = 0 ;Watchdog Enable .equ WDP_D = 0 ;Watchdog Timer Pre scaler ; 0 = Timeout Period 16 ms ; 1 = Timeout Period 32 ms ; 2 = Timeout Period 64 ms ; 3 = Timeout Period 128 ms ; 4 = Timeout Period 256 ms ; 5 = Timeout Period 512 ms ; 6 = Timeout Period 1024 ms ; 7 = Timeout Period 2048 ms .equ WDTCR_MASK = 0b00011111 ;mask for valid bits ;UCSRB(0x03) UART control register .equ TXB8_D = 0 ;TX bit 8 data .equ TXEN_D = 0 ;Transmitter Enable .equ RXEN_D = 0 ;Receiver Enable .equ UDRIE_D = 0 ;Data Register Empty Interrupt Enable .equ TXCIE_D = 0 ;TX complete Interrupt Enable .equ RXCIE_D = 0 ;RX complete Interrupt Enable .equ UCSRB_MASK = 0b11111101 ;mask for valid bits ;UCSRC(0x) UART control register .equ UMSEL_D = 0 ;USART select mode ; 0 = Asynchronous mode ; 1 = Synchronous mode .equ UPM_D = 0 ;Parity Mode ; 0 = Disabled ; 1 = Reserved ; 2 = Enabled EVEN ; 3 = Enabled ODD ; 7 = 9 bit .equ USBS_D = 1 ;Stop bits ; 0 = 1 stop bit ; 1 = 2 stop bits .equ UCSZ_D = 3 ;USART bit size ; 0 = 5 bit ; 1 = 6 bit ; 2 = 7 bit ; 3 = 8 bit ; 4 = reserved ; 5 = reserved ; 6 = reserved ; 7 = 9 bit .equ UCSRC_MASK = 0b01111111 ;mask for valid bits ;UBRRL(0x09) UART baud rate register low byte .equ UBRRL_D = (BAUD_VALUE_INIT & 0x00ff) ;see Timing Equates section .equ UBRRL_MASK = 0b11111111 ;mask for valid bits ;UBRRH(0x02) UART baud rate register high byte .equ UBRRH_D = BAUD_VALUE_INIT >> 8;see Timing Equates section .equ UBRRH_MASK = 0b00001111 ;mask for valid bits ;ACSR(0x08) Analog Comparator Control and Status Register .equ ACD_D = 1 ;Analog Comparator Disable (1 = off) .equ ACIE_D = 0 ;Analog Comparator Interrupt Enable .equ ACIC_D = 0 ;Analog Comparator Input Capture Enable .equ ACIS_D = 0 ;Analog Comparator Interrupt Mode Select ; 0 = Comparator Interrupt on Output Toggle ; 1 = Reserved ; 2 = Comparator Interrupt on Falling Edge ; 3 = Comparator Interrupt on Rising Edge .equ ACSR_MASK = 0b10001111 ;mask for valid bits .set GIMSK_DATA = (INT1_D << INT1) | (INT0_D << INT0) .set GIMSK_DATA = GIMSK_DATA | (PCIE_D << PCIE) .set TIMSK_DATA = (OCIE0A_D << OCIE0A) | (TOIE0_D << TOIE0) .set TIMSK_DATA = TIMSK_DATA | (OCIE0B_D << OCIE0B) | (ICIE1_D << ICIE1) .set TIMSK_DATA = TIMSK_DATA | (OCIE1B_D << OCIE1B) | (OCIE1A_D << OCIE1A) .set TIMSK_DATA = TIMSK_DATA | (TOIE1_D << TOIE1) .set MCUCR_DATA = (PUD_D << PUD) | (SE_D << SE) .set MCUCR_DATA = MCUCR_DATA | (ISC1_D << ISC10) | (ISC0_D << ISC00) .set MCUCR_DATA = MCUCR_DATA | ((SM_D & 0x01) << SM0) .set MCUCR_DATA = MCUCR_DATA | (((SM_D >> 1) & 0x01) << SM1) .set TCCR0_DATA = (CS0_D << CS00) .set TCCR1A_DATA = (COM1A_D << COM1A0) | (PWM1_D << PWM10) .set TCCR1B_DATA = (ICNC1_D << ICNC1) | (ICES1_D << ICES1) .set TCCR1B_DATA = TCCR1B_DATA | (CTC1_D << CTC1) | (CS1_D << CS10) .set WDTCR_DATA = (WDTOE_D << WDTOE) | (WDE_D << WDE) .set WDTCR_DATA = WDTCR_DATA | (WDP_D << WDP0) .set UCSRB_DATA = (RXCIE_D << RXCIE) | (TXCIE_D << TXCIE) .set UCSRB_DATA = UCSRB_DATA | (UDRIE_D << UDRIE) | (RXEN_D << RXEN) .set UCSRB_DATA = UCSRB_DATA | (TXEN_D << TXEN) | (TXB8_D << TXB8) .set UCSRB_DATA = UCSRB_DATA | (((UCSZ_D & 0x04) >> 2) << UCSZ2) .set UCSRC_DATA = (UMSEL_D << UMSEL) | (USBS_D << USBS) .set UCSRC_DATA = UCSRC_DATA | (UPM_D << UPM0) | ((UCSZ_D & 0x03) << UCSZ0) .set UBRRL_DATA = UBRRL_D .set UBRRH_DATA = UBRRH_D .set ACSR_DATA = (ACD_D << ACD) | (ACIE_D << ACIE) .set ACSR_DATA = ACSR_DATA | (ACIC_D << ACIC) | (ACIS_D << ACIS0) ;****************************************************************************** ;* ;* Register equates ;* ;****************************************************************************** .def resv1 = r0 ;used by instruction set .def resv2 = r1 ;used by instruction set .def CurRow = r2 ;current selected row .def Loop1 = r3 .def Loop2 = r4 .def DigitCount = r5 .def CurrentChar = r6 .def EEAddr = r7 .def MsgCounter = r8 ;Message Countdown Timer .def Temp = r16 ;temporary register .def Temp2 = r17 ;temporary register .def Flags = r18 ;Flags register .equ TICK_20MS = 0 ; set to indicate 20ms has passed .equ HOST_RX_CR = 1 ; set if CR was sent by host .equ RED_LED_CMP = 2 ; set if RED LED compare enabled .equ NEW_PWM_CYCLE = 3 ; set if start of new PWM cycle .equ DMX_ADDR_G256 = 4 ; set if DMX address > 256 .def ParPass0 = r19 ;used for passing parameters .def ParPass1 = r20 ;used for passing parameters .def ParPass2 = r21 ;used for passing parameters .def ParPass3 = r22 ;used for passing parameters .def TimerHigh = r23 .def TimerLow = r24 ;SRAM equates .equ DISPLAY_RAM = 0x60 .equ SIZE_DISPLAY_RAM = 32 ;4 bytes * 8 rows .equ CHR_FONT_LENGTH = 7 .equ CHR_FONT_WIDTH = 5 .equ NEW_CHR_OFFSET = 2 ;offset into dispaly ram where new ;character will be stored