public void update(Atmega Main) { // if (UDR == -1) Reload_INC(Main); if (Sleep > 0) { Sleep--; if (Sleep == 0) { } return; } string ADD = ANZ > 1 ? ID.ToString() : ""; // Receiver if (Main.GetBitIOPort(UCSRB, RXEN)) { PIN a = null; // Main.GetTypPin("RXD" + ADD); if (a == null) { goto trans; } // if (Main.Ports[a.PORT].Typ[a.ID][0] != "RXD"+ADD) // { // for (int i = 1; i < Main.Ports[a.PORT].Typ[a.ID].Count; i++) // if (Main.Ports[a.PORT].Typ[a.ID][i] == "RXD"+ADD) // { Main.Ports[a.PORT].Typ[a.ID][i] = Main.Ports[a.PORT].Typ[a.ID][0]; Main.Ports[a.PORT].Typ[a.ID][0] = "RXD"+ADD; break; } //} } trans: // Transmitter if (Main.GetBitIOPort(UCSRB, TXEN)) { PIN a = null; // Main.GetTypPin("TXD" + ADD); if (a == null) { return; } int Bits = DataBits + StopBits + 1 + (Parity ? 1 : 0); Sleep = BAUDRATE == 0 ? 0 : Main.Frequenz / BAUDRATE * Bits; Sleep = DoubleSpeed ? Sleep / 2 : Sleep; } }
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 check_Konfiguration(Atmega Main) { OperationMode = Main.GetBitIOPort(UCSRC, UMSEL) ? 1 : 0; Parity = Main.GetBitIOPort(UCSRC, UPM1) || Main.GetBitIOPort(UCSRC, UPM0) ? true : false; StopBits = Main.GetBitIOPort(UCSRC, USBS) ? 2 : 1; int[] Data = { 5, 6, 7, 8, 0, 0, 0, 9 }; DataBits = Data[(Main.GetBitIOPort(Main.INC.UCSRC, Main.INC.UCSZ0) ? 1 : 0) + (Main.GetBitIOPort(UCSRC, UCSZ1) ? 2 : 0) + (Main.GetBitIOPort(UCSRC, UCSZ2) ? 4 : 0)]; DoubleSpeed = Main.GetBitIOPort(UCSRA, U2X) ? true : false; BAUDRATE = Main.Frequenz / (((Main.LowHigh(Main.Ports[UBRRL].get(), Main.Ports[UBRRH].get()) << 1) >> 1) + 1) * 16; }
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 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 Reset(Atmega Main) { int[] Prescaler = { 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152 }; Max = Prescaler[(Main.GetBitIOPort(Main.INC.WDTCR, Main.INC.WDP0) ? 1 : 0) + (Main.GetBitIOPort(Main.INC.WDTCR, Main.INC.WDP1) ? 2 : 0) + (Main.GetBitIOPort(Main.INC.WDTCR, Main.INC.WDP2) ? 4 : 0)] * (Main.Frequenz / 1000000); }
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); } } }