public void update(Atmega Main, Def INC) { if (Main.GetBitIOPort(INC.WDTCR, INC.WDE)) { if (Sleep < Max) { Sleep++; } if (Sleep >= Max) { // Zuende Reset(Main); Main.ExecuteInterrupt("RESET"); } } else { Sleep = 0; } }
public void Receive(Atmega Main, int Text) { if (Main.GetBitIOPort(UCSRB, RXEN)) { Main.SetBitIOPort(UCSRA, RXC, true); Main.Ports[Main.INC.UDR].set((Byte)Text); // in UDR laden if (DataBits == 9) { Main.SetBitIOPort(UCSRB, RXB8, true); // 9tes bit setzen } // Event abfragen if (Main.GetBitIOPort(UCSRB, RXCIE) && Main.GetBitIOPort(Main.INC.SREG, Main.INC.I) && Main.GetBitIOPort(UCSRA, RXC)) { if (Main.ExecuteInterrupt("URXCaddr")) { Main.SetBitIOPort(Main.INC.SREG, Main.INC.I, false); Main.SetBitIOPort(UCSRA, RXC, false); } } } }
public void update(Atmega Main, Def INC) { if (Sleep > 0) { Sleep--; if (Sleep == 0) { Main.SetBitIOPort(INC.EECR, INC.EEWE, false); if (Main.GetBitIOPort(INC.EECR, INC.EERIE) && Main.GetBitIOPort(INC.SREG, INC.I)) { if (Main.ExecuteInterrupt("ERDYaddr")) { Main.SetBitIOPort(INC.SREG, INC.I, false); } } } } // Schreiben if (Main.GetBitIOPort(INC.EECR, INC.EEMWE) && Main.GetBitIOPort(INC.EECR, INC.EEWE)) { Main.SetBitIOPort(INC.EECR, INC.EEMWE, false); SPEICHER[Main.LowHigh(Main.Ports[INC.EEARL].get(), Main.Ports[INC.EEARH].get())] = Main.Ports[INC.EEDR].get(); Sleep = 8448 * (Main.Frequenz / 1000000); Main.Sleep += 2; Anz_Write++; } // Lesen if (Main.GetBitIOPort(INC.EECR, INC.EERE) && !(Main.GetBitIOPort(INC.EECR, INC.EEMWE) || Main.GetBitIOPort(INC.EECR, INC.EEWE))) { Main.Ports[INC.EEDR].set(SPEICHER[Main.LowHigh(Main.Ports[INC.EEARL].get(), Main.Ports[INC.EEARH].get())]); Main.Sleep += 4; Main.SetBitIOPort(INC.EECR, INC.EERE, false); Anz_Read++; } }
public void update(Atmega Main, Def INC) { if (Sleep > 0) { Sleep--; return; } if (Typ == 0) { if ((Main.Ports[TCCR].get() & PRESC_MASKE) == 0) { return; } int a = TCNT; // Overflow prüfen if (Main.GetBitIOPort(INC.TIFR, TOV) && Main.GetBitIOPort(INC.TIMSK, TOIE) && (Main.SREG & SREGI) > 0) { if (Main.ExecuteInterrupt("OVF" + ID + "addr")) { Main.SetBitIOPort(INC.TIFR, TOV, false); //Main.SetBitIOPort(INC.SREG, INC.I, false); Main.SREG = (Byte)(Main.SREG & SREGNOI); } } // Compare Prüfen if (Main.GetBitIOPort(INC.TIFR, OCF) && Main.GetBitIOPort(INC.TIMSK, OCIE) && (Main.SREG & SREGI) > 0) { if (Main.ExecuteInterrupt("OC" + ID + "Aaddr")) { Main.SetBitIOPort(INC.TIFR, OCF, false); //Main.SetBitIOPort(INC.SREG, INC.I, false); Main.SREG = (Byte)(Main.SREG & SREGNOI); Main.Ports[a].set(0); } } // Test ob Aktiv int presc = Prescaler[Main.Ports[TCCR].get() & PRESC_MASKE]; // Counter erhöhen int res = Main.Ports[a].get(); bool Over = false; res++; Main.Ports[a].set(Help.Low(res)); if (Main.Ports[a].get() == 0) { Over = true; // Overflow eingetreten } Sleep = presc - 1; // Compare prüfen int c = OCR; if (Over) {// Overflow Treffer Main.SetBitIOPort(INC.TIFR, TOV, true); } // Compare if (res == Main.Ports[c].get()) {// Treffer Main.SetBitIOPort(INC.TIFR, OCF, true); } } else if (Typ == 1) { if ((Main.Ports[TCCRB].get() & PRESC_MASKE) == 0) { return; } int a = TCNTL; int b = TCNTH; // Overflow prüfen if (Main.GetBitIOPort(INC.TIFR, TOV) && Main.GetBitIOPort(INC.TIMSK, TOIE) && (Main.SREG & SREGI) > 0) { if (Main.ExecuteInterrupt("OVF" + ID + "addr")) { Main.SetBitIOPort(INC.TIFR, TOV, false); //Main.SetBitIOPort(INC.SREG, INC.I, false); Main.SREG = (Byte)(Main.SREG & SREGNOI); } } // Compare A Prüfen if (Main.GetBitIOPort(INC.TIFR, OCFA) && Main.GetBitIOPort(INC.TIMSK, OCIEA) && (Main.SREG & SREGI) > 0) { if (Main.ExecuteInterrupt("OC" + ID + "Aaddr")) { Main.SetBitIOPort(INC.TIFR, OCFA, false); //Main.SetBitIOPort(INC.SREG, INC.I, false); Main.SREG = (Byte)(Main.SREG & SREGNOI); Main.Ports[a].set(0); Main.Ports[b].set(0); } } // Compare B Prüfen if (Main.GetBitIOPort(INC.TIFR, OCFB) && Main.GetBitIOPort(INC.TIMSK, OCIEB) && (Main.SREG & SREGI) > 0) { if (Main.ExecuteInterrupt("OC1Baddr")) { Main.SetBitIOPort(INC.TIFR, OCFB, false); // Main.SetBitIOPort(INC.SREG, INC.I, false); Main.SREG = (Byte)(Main.SREG & SREGNOI); Main.Ports[a].set(0); Main.Ports[b].set(0); } } // Test ob Aktiv int presc = Prescaler[Main.Ports[TCCRB].get() & PRESC_MASKE]; // Counter erhöhen int res = Main.LowHigh(Main.Ports[a].get(), Main.Ports[b].get()); bool Over = false; res++; Main.Ports[a].set(Help.Low(res)); Main.Ports[b].set(Help.High(res)); if (Main.Ports[a].get() == 0 && Main.Ports[b].get() == 0) { Over = true; // Overflow eingetreten } Sleep = presc - 1; // Compare prüfen if (Over) { // Overflow Treffer Main.SetBitIOPort(INC.TIFR, TOV, true); } // A Compare if (res == Main.LowHigh(Main.Ports[OCRAL].get(), Main.Ports[OCRAH].get())) { // A Treffer Main.SetBitIOPort(INC.TIFR, OCFA, true); } // B Compare if (res == Main.LowHigh(Main.Ports[OCRBL].get(), Main.Ports[OCRBH].get())) { // B Treffer Main.SetBitIOPort(INC.TIFR, OCFB, true); } } }