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 "atmega16_32.h"
00027
00028 #include "hardware.h"
00029 #include "irqsystem.h"
00030 #include "hwport.h"
00031 #include "hwstack.h"
00032 #include "hwspi.h"
00033 #include "hweeprom.h"
00034 #include "hwwado.h"
00035 #include "hwsreg.h"
00036 #include "flashprog.h"
00037
00038 #include "avrfactory.h"
00039
00040 AVR_REGISTER(atmega16, AvrDevice_atmega16);
00041 AVR_REGISTER(atmega32, AvrDevice_atmega32);
00042
00043 AvrDevice_atmega16_32::~AvrDevice_atmega16_32() {
00044 delete timer2;
00045 delete timer1;
00046 delete inputCapture1;
00047 delete timer0;
00048 delete usart;
00049 delete wado;
00050 delete prescaler2;
00051 delete prescaler01;
00052 delete assr_reg;
00053 delete sfior_reg;
00054 delete extirq;
00055 delete mcucsr_reg;
00056 delete mcucr_reg;
00057 delete gifr_reg;
00058 delete gicr_reg;
00059 delete spi;
00060 delete ad;
00061 delete admux;
00062 delete spmRegister;
00063 delete portd;
00064 delete portc;
00065 delete portb;
00066 delete porta;
00067 delete stack;
00068 delete eeprom;
00069 delete irqSystem;
00070 }
00071
00072 AvrDevice_atmega16_32::AvrDevice_atmega16_32(unsigned ram_bytes,
00073 unsigned flash_bytes,
00074 unsigned ee_bytes,
00075 unsigned nrww_start,
00076 bool atmega16):
00077 AvrDevice(64 ,
00078 ram_bytes,
00079 0,
00080 flash_bytes),
00081 aref()
00082 {
00083 irqSystem = new HWIrqSystem(this, 4, 21);
00084 eeprom = new HWEeprom(this, irqSystem, ee_bytes, atmega16 ? 15 : 17);
00085 stack = new HWStackSram(this, atmega16 ? 11 : 12);
00086 porta = new HWPort(this, "A");
00087 portb = new HWPort(this, "B");
00088 portc = new HWPort(this, "C");
00089 portd = new HWPort(this, "D");
00090
00091 spmRegister = new FlashProgramming(this, 64, nrww_start, FlashProgramming::SPM_MEGA_MODE);
00092
00093
00094
00095
00096
00097 RegisterPin("AREF", &aref);
00098
00099 admux = new HWAdmux(this,
00100 &porta->GetPin(0), &porta->GetPin(1), &porta->GetPin(2),
00101 &porta->GetPin(3), &porta->GetPin(4), &porta->GetPin(5),
00102 &porta->GetPin(6), &porta->GetPin(7));
00103
00104 ad = new HWAd(this, admux, irqSystem, aref, atmega16 ? 14 : 16);
00105
00106 spi = new HWSpi(this, irqSystem,
00107 PinAtPort(portb, 5), PinAtPort(portb, 6), PinAtPort(portb, 7),
00108 PinAtPort(portb, 4), atmega16 ? 10 : 12, true);
00109
00110 gicr_reg = new IOSpecialReg(&coreTraceGroup, "GICR");
00111 gifr_reg = new IOSpecialReg(&coreTraceGroup, "GIFR");
00112 mcucr_reg = new IOSpecialReg(&coreTraceGroup, "MCUCR");
00113 mcucsr_reg = new IOSpecialReg(&coreTraceGroup, "MCUCSR");
00114 extirq = new ExternalIRQHandler(this, irqSystem, gicr_reg, gifr_reg);
00115 extirq->registerIrq(1, 6, new ExternalIRQSingle(mcucr_reg, 0, 2, GetPin("D2")));
00116 extirq->registerIrq(2, 7, new ExternalIRQSingle(mcucr_reg, 2, 2, GetPin("D3")));
00117 extirq->registerIrq(atmega16 ? 18 : 3, 5, new ExternalIRQSingle(mcucsr_reg, 6, 1, GetPin("B2")));
00118
00119 sfior_reg = new IOSpecialReg(&coreTraceGroup, "SFIOR");
00120 assr_reg = new IOSpecialReg(&coreTraceGroup, "ASSR");
00121 prescaler01 = new HWPrescaler(this, "01", sfior_reg, 0);
00122 prescaler2 = new HWPrescalerAsync(this, "2", PinAtPort(portc, 6),
00123 assr_reg, 3, sfior_reg, 1);
00124
00125 wado = new HWWado(this);
00126
00127 usart = new HWUsart(this, irqSystem,
00128 PinAtPort(portd,1), PinAtPort(portd,0), PinAtPort(portb, 0),
00129 atmega16 ? 11 : 13, atmega16 ? 12 : 14, atmega16 ? 13 : 15);
00130
00131 timer012irq = new TimerIRQRegister(this, irqSystem);
00132 timer012irq->registerLine(0, new IRQLine("TOV0", atmega16 ? 9 : 11));
00133 timer012irq->registerLine(1, new IRQLine("OCF0", atmega16 ? 19 : 10));
00134 timer012irq->registerLine(2, new IRQLine("TOV1", atmega16 ? 8 : 9));
00135 timer012irq->registerLine(3, new IRQLine("OCF1B", atmega16 ? 7 : 8));
00136 timer012irq->registerLine(4, new IRQLine("OCF1A", atmega16 ? 6 : 7));
00137 timer012irq->registerLine(5, new IRQLine("ICF1", atmega16 ? 5 : 6));
00138 timer012irq->registerLine(6, new IRQLine("TOV2", atmega16 ? 4 : 5));
00139 timer012irq->registerLine(7, new IRQLine("OCF2", atmega16 ? 3 : 4));
00140
00141 timer0 = new HWTimer8_1C(this,
00142 new PrescalerMultiplexerExt(prescaler01, PinAtPort(portb, 0)),
00143 0,
00144 timer012irq->getLine("TOV0"),
00145 timer012irq->getLine("OCF0"),
00146 new PinAtPort(portb, 3));
00147 inputCapture1 = new ICaptureSource(PinAtPort(portd, 6));
00148 timer1 = new HWTimer16_2C2(this,
00149 new PrescalerMultiplexerExt(prescaler01, PinAtPort(portb, 1)),
00150 1,
00151 timer012irq->getLine("TOV1"),
00152 timer012irq->getLine("OCF1A"),
00153 new PinAtPort(portd, 5),
00154 timer012irq->getLine("OCF1B"),
00155 new PinAtPort(portd, 4),
00156 timer012irq->getLine("ICF1"),
00157 inputCapture1,
00158 false);
00159 timer2 = new HWTimer8_1C(this,
00160 new PrescalerMultiplexer(prescaler2),
00161 2,
00162 timer012irq->getLine("TOV2"),
00163 timer012irq->getLine("OCF2"),
00164 new PinAtPort(portd, 7));
00165
00166 rw[0x5f]= statusRegister;
00167 rw[0x5e]= & ((HWStackSram *)stack)->sph_reg;
00168 rw[0x5d]= & ((HWStackSram *)stack)->spl_reg;
00169 rw[0x5c]= & timer0->ocra_reg;
00170 rw[0x5b]= gicr_reg;
00171 rw[0x5a]= gifr_reg;
00172 rw[0x59]= & timer012irq->timsk_reg;
00173 rw[0x58]= & timer012irq->tifr_reg;
00174 rw[0x57]= & spmRegister->spmcr_reg;
00175
00176 rw[0x55] = mcucr_reg;
00177 rw[0x54] = mcucsr_reg;
00178 rw[0x53]= & timer0->tccr_reg;
00179 rw[0x52]= & timer0->tcnt_reg;
00180
00181 rw[0x50]= sfior_reg;
00182 rw[0x4f]= & timer1->tccra_reg;
00183 rw[0x4e]= & timer1->tccrb_reg;
00184 rw[0x4d]= & timer1->tcnt_h_reg;
00185 rw[0x4c]= & timer1->tcnt_l_reg;
00186 rw[0x4b]= & timer1->ocra_h_reg;
00187 rw[0x4a]= & timer1->ocra_l_reg;
00188 rw[0x49]= & timer1->ocrb_h_reg;
00189 rw[0x48]= & timer1->ocrb_l_reg;
00190 rw[0x47]= & timer1->icr_h_reg;
00191 rw[0x46]= & timer1->icr_l_reg;
00192 rw[0x45]= & timer2->tccr_reg;
00193 rw[0x44]= & timer2->tcnt_reg;
00194 rw[0x43]= & timer2->ocra_reg;
00195 rw[0x42]= assr_reg;
00196 rw[0x41]= & wado->wdtcr_reg;
00197 rw[0x40]= & usart->ucsrc_ubrrh_reg;
00198 rw[0x3f]= & eeprom->eearh_reg;
00199 rw[0x3e]= & eeprom->eearl_reg;
00200 rw[0x3d]= & eeprom->eedr_reg;
00201 rw[0x3c]= & eeprom->eecr_reg;
00202 rw[0x3b]= & porta->port_reg;
00203 rw[0x3a]= & porta->ddr_reg;
00204 rw[0x39]= & porta->pin_reg;
00205 rw[0x38]= & portb->port_reg;
00206 rw[0x37]= & portb->ddr_reg;
00207 rw[0x36]= & portb->pin_reg;
00208 rw[0x35]= & portc->port_reg;
00209 rw[0x34]= & portc->ddr_reg;
00210 rw[0x33]= & portc->pin_reg;
00211 rw[0x32]= & portd->port_reg;
00212 rw[0x31]= & portd->ddr_reg;
00213 rw[0x30]= & portd->pin_reg;
00214 rw[0x2f]= & spi->spdr_reg;
00215 rw[0x2e]= & spi->spsr_reg;
00216 rw[0x2d]= & spi->spcr_reg;
00217 rw[0x2c]= & usart->udr_reg;
00218 rw[0x2b]= & usart->ucsra_reg;
00219 rw[0x2a]= & usart->ucsrb_reg;
00220 rw[0x29]= & usart->ubrr_reg;
00221
00222 rw[0x27]= & admux->admux_reg;
00223 rw[0x26]= & ad->adcsr_reg;
00224 rw[0x25]= & ad->adch_reg;
00225 rw[0x24]= & ad->adcl_reg;
00226
00227
00228
00229
00230
00231 Reset();
00232 }
00233
00234