Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
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);
             }
         }
     }
 }
Esempio n. 3
0
 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;
 }
Esempio n. 4
0
 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;
     }
 }
Esempio n. 5
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++;
            }
        }
Esempio n. 6
0
 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);
 }
Esempio n. 7
0
        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);
                }
            }
        }