00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "attiny2313.h"
00027
00028 #include "hardware.h"
00029 #include "irqsystem.h"
00030 #include "hwport.h"
00031 #include "hwstack.h"
00032 #include "hweeprom.h"
00033 #include "hwwado.h"
00034 #include "hwsreg.h"
00035 #include "flashprog.h"
00036
00037 #include "avrfactory.h"
00038
00039 AVR_REGISTER(attiny2313, AvrDevice_attiny2313);
00040
00041 AvrDevice_attiny2313::~AvrDevice_attiny2313() {
00042 delete timer1;
00043 delete inputCapture1;
00044 delete timer0;
00045 delete timer01irq;
00046 delete usart;
00047 delete pcmsk_reg;
00048 delete mcucr_reg;
00049 delete eifr_reg;
00050 delete gimsk_reg;
00051 delete gpior2_reg;
00052 delete gpior1_reg;
00053 delete gpior0_reg;
00054 delete prescaler01;
00055 delete gtccr_reg;
00056 delete spmRegister;
00057 delete portd;
00058 delete portb;
00059 delete porta;
00060 delete stack;
00061 delete eeprom;
00062 delete irqSystem;
00063 }
00064
00065 AvrDevice_attiny2313::AvrDevice_attiny2313():
00066 AvrDevice(64 ,
00067 128,
00068 0,
00069 2 * 1024)
00070 {
00071 flagJMPInstructions = false;
00072 flagMULInstructions = false;
00073 irqSystem = new HWIrqSystem(this, 2, 19);
00074 eeprom = new HWEeprom(this, irqSystem, 128, 17, HWEeprom::DEVMODE_EXTENDED);
00075 stack = new HWStackSram(this, 8);
00076 porta = new HWPort(this, "A", true, 3);
00077 portb = new HWPort(this, "B", true);
00078 portd = new HWPort(this, "D", true, 7);
00079
00080 spmRegister = new FlashProgramming(this, 16, 0, FlashProgramming::SPM_TINY_MODE);
00081
00082 gtccr_reg = new IOSpecialReg(&coreTraceGroup, "GTCCR");
00083 prescaler01 = new HWPrescaler(this, "01", gtccr_reg, 0);
00084
00085 gpior0_reg = new GPIORegister(this, &coreTraceGroup, "GPIOR0");
00086 gpior1_reg = new GPIORegister(this, &coreTraceGroup, "GPIOR1");
00087 gpior2_reg = new GPIORegister(this, &coreTraceGroup, "GPIOR2");
00088
00089 gimsk_reg = new IOSpecialReg(&coreTraceGroup, "GIMSK");
00090 eifr_reg = new IOSpecialReg(&coreTraceGroup, "EIFR");
00091 mcucr_reg = new IOSpecialReg(&coreTraceGroup, "MCUCR");
00092 pcmsk_reg = new IOSpecialReg(&coreTraceGroup, "PCMSK");
00093 extirq = new ExternalIRQHandler(this, irqSystem, gimsk_reg, eifr_reg);
00094 extirq->registerIrq(1, 6, new ExternalIRQSingle(mcucr_reg, 0, 2, GetPin("D2")));
00095 extirq->registerIrq(2, 7, new ExternalIRQSingle(mcucr_reg, 2, 2, GetPin("D3")));
00096 extirq->registerIrq(11, 5, new ExternalIRQPort(pcmsk_reg, portb));
00097
00098
00099
00100 usart = new HWUsart(this, irqSystem,
00101 PinAtPort(portd,1), PinAtPort(portd,0), PinAtPort(portd, 2),
00102 7, 8, 9,
00103 0, false);
00104
00105 timer01irq = new TimerIRQRegister(this, irqSystem);
00106 timer01irq->registerLine(0, new IRQLine("OCF0A", 13));
00107 timer01irq->registerLine(1, new IRQLine("TOV0", 6));
00108 timer01irq->registerLine(2, new IRQLine("OCF0B", 14));
00109 timer01irq->registerLine(3, new IRQLine("ICF1", 3));
00110 timer01irq->registerLine(5, new IRQLine("OCF1B", 12));
00111 timer01irq->registerLine(6, new IRQLine("OCF1A", 4));
00112 timer01irq->registerLine(7, new IRQLine("TOV1", 5));
00113
00114 timer0 = new HWTimer8_2C(this,
00115 new PrescalerMultiplexerExt(prescaler01, PinAtPort(portd, 4)),
00116 0,
00117 timer01irq->getLine("TOV0"),
00118 timer01irq->getLine("OCF0A"),
00119 new PinAtPort(portb, 2),
00120 timer01irq->getLine("OCF0B"),
00121 new PinAtPort(portd, 5));
00122 inputCapture1 = new ICaptureSource(PinAtPort(portd, 6));
00123 timer1 = new HWTimer16_2C3(this,
00124 new PrescalerMultiplexerExt(prescaler01, PinAtPort(portd, 5)),
00125 1,
00126 timer01irq->getLine("TOV1"),
00127 timer01irq->getLine("OCF1A"),
00128 new PinAtPort(portb, 3),
00129 timer01irq->getLine("OCF1B"),
00130 new PinAtPort(portb, 4),
00131 timer01irq->getLine("ICF1"),
00132 inputCapture1);
00133
00134 rw[0x5f]= statusRegister;
00135 rw[0x5e]= & ((HWStackSram *)stack)->sph_reg;
00136 rw[0x5d]= & ((HWStackSram *)stack)->spl_reg;
00137 rw[0x5c]= & timer0->ocrb_reg;
00138 rw[0x5b]= gimsk_reg;
00139 rw[0x5a]= eifr_reg;
00140 rw[0x59]= & timer01irq->timsk_reg;
00141 rw[0x58]= & timer01irq->tifr_reg;
00142 rw[0x57]= & spmRegister->spmcr_reg;
00143 rw[0x56]= & timer0->ocra_reg;
00144 rw[0x55]= mcucr_reg;
00145
00146 rw[0x53]= & timer0->tccrb_reg;
00147 rw[0x52]= & timer0->tcnt_reg;
00148
00149 rw[0x50]= & timer0->tccra_reg;
00150 rw[0x4f]= & timer1->tccra_reg;
00151 rw[0x4e]= & timer1->tccrb_reg;
00152 rw[0x4d]= & timer1->tcnt_h_reg;
00153 rw[0x4c]= & timer1->tcnt_l_reg;
00154 rw[0x4b]= & timer1->ocra_h_reg;
00155 rw[0x4a]= & timer1->ocra_l_reg;
00156 rw[0x49]= & timer1->ocrb_h_reg;
00157 rw[0x48]= & timer1->ocrb_l_reg;
00158
00159
00160 rw[0x45]= & timer1->icr_h_reg;
00161 rw[0x44]= & timer1->icr_l_reg;
00162 rw[0x43]= gtccr_reg;
00163 rw[0x42]= & timer1->tccrc_reg;
00164
00165 rw[0x40]= pcmsk_reg;
00166
00167 rw[0x3e]= & eeprom->eearl_reg;
00168 rw[0x3d]= & eeprom->eedr_reg;
00169 rw[0x3c]= & eeprom->eecr_reg;
00170 rw[0x3b]= & porta->port_reg;
00171 rw[0x3a]= & porta->ddr_reg;
00172 rw[0x39]= & porta->pin_reg;
00173 rw[0x38]= & portb->port_reg;
00174 rw[0x37]= & portb->ddr_reg;
00175 rw[0x36]= & portb->pin_reg;
00176 rw[0x35]= gpior2_reg;
00177 rw[0x34]= gpior1_reg;
00178 rw[0x33]= gpior0_reg;
00179 rw[0x32]= & portd->port_reg;
00180 rw[0x31]= & portd->ddr_reg;
00181 rw[0x30]= & portd->pin_reg;
00182
00183
00184
00185 rw[0x2c]= & usart->udr_reg;
00186 rw[0x2b]= & usart->ucsra_reg;
00187 rw[0x2a]= & usart->ucsrb_reg;
00188 rw[0x29]= & usart->ubrr_reg;
00189
00190
00191
00192
00193
00194 rw[0x23]= & usart->ucsrc_reg;
00195 rw[0x22]= & usart->ubrrh_reg;
00196
00197
00198
00199 Reset();
00200 }
00201
00202