/*************************************************************************** * Copyright (C) 04/2013 by Olaf Rempel * * razzor@kopf-tisch.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; version 2 of the License, * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #define F_CPU 11059200 #include /* * attiny2313 * lfuse: 0xff (ext. crystal, slow rising power, max startup time) * hfuse: 0xdb (2.7V BOD) * efuse: 0xff (self Prog enabled) * * PB0 -> NC * PB1 -> reset-out * PB2 -> /WR SRAM * PB3 -> SRCK (shift register clock) * PB4 -> SER (shift register input) * PB5 -> CCK (counter clock) * PB6 -> RCK (counter and shift register store clock) * PB7 -> /OE (output enable counter, shift register, reset-out, A16) * PD0 <- RXD * PD1 -> TXD * PD2 <- /PowerFail * PD3 -> A16 * PD4 -> /LED_GN * PD5 -> /LED_RT * PD6 -> /OE (output enable RAM and address buffer, counter clear) */ #define RESET_OUT PORTB1 #define nRAM_WR PORTB2 #define SREG_CLK PORTB3 #define SREG_DAT PORTB4 #define CNT_CLK PORTB5 #define REG_STORE PORTB6 #define nEMU_EN PORTB7 #define RXD PORTD0 #define TXD PORTD1 #define nPOWERFAIL PORTD2 #define EMU_A16 PORTD3 #define nLED_GN PORTD4 #define nLED_RT PORTD5 #define nTARGET_EN PORTD6 #define BAUDRATE 115200 #define UART_CALC_BAUDRATE(baudRate) (((uint32_t)F_CPU) / (((uint32_t)baudRate)*16) -1) struct _globdata { uint8_t address_mask; uint8_t reset_polarity; }; static struct _globdata gdata = { 0 }; /* ************************************************************************* * send one byte to UART * ************************************************************************* */ static void ser_send(uint8_t data) { loop_until_bit_is_set(UCSRA, UDRIE); UDR = data; } /* ser_send */ /* ************************************************************************* * receive one byte from UART * ************************************************************************* */ static uint8_t ser_recv(void) { loop_until_bit_is_set(UCSRA, RXC); return UDR; } /* ser_recv */ /* ************************************************************************* * shift one byte out to register (LSB first) * ************************************************************************* */ static void shift_data(uint8_t data) { uint8_t mask; for (mask = 0x01; mask != 0; mask <<= 1) { if (data & mask) { PORTB |= (1< 0xFFFF) { PORTD |= (1<>8) & 0xFF; UBRRL = (UART_CALC_BAUDRATE(BAUDRATE) & 0xFF); UCSRC = (1<