-         

+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Pinkompatibel zu ATTiny2313 mit mehr Flash?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    672

    Pinkompatibel zu ATTiny2313 mit mehr Flash?

    Anzeige

    Hallo,

    ich habe ein kleines Projekt mit 3 Tasten, 3 Leds und 8 Relais. Der Zustand soll im EEPROM gespeichert werden. Ich habe dazu einen ATTiny 2313 verwendet. Nur leider ist jetzt schon mein Flash-Speicher voll und ich wollte noch eine IR-Bedienung hinzufügen.

    Weiß jemand aus dem Stegreif, ob es einen Pinkompatiblen Chip von Atmel gibt, der mehr Flash Speicher hat?
    Vielen Dank!

    Viele Grüße
    Andreas

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Wüsste so keinen, wird auch keiner erwähnt.
    Aber bei 3 Tastern und 8Relais ist der 2Kb Speicher schon voll?! Vielleicht solltest du deinen Code mal überarbeiten!

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    672
    Ich habe mich selbst gewundert. Aber sooo verschwenderisch ist der Code gar nicht geschrieben. Ich hänge ihn mal hinten an. (Was noch an Info fehlt: Die Relais hängen an einem Schiebe-Register) Sicher könnte man noch einiges optimieren, aber ich habe hier gelesen, dass der Code für den IR-Empfang zwischen 600 und 900 Bytes des Flash inanspruch nimmt. Ich denke soweit kann man den Code dann doch nicht optimieren:

    Code:
    #define AVRGCC 
    #include <avr/io.h> 
    #include <compiler.h>
    #include <avr/eeprom.h>
    /** 
    Der AVR übernimmt die Steuerung der Relais für die Kanalwahl und Phase.
    IO's:
    PB0  OUT  Relais Strobe
    PB1  OUT  Relais Data
    PB2  OUT  Relais CLK
    PB3  OUT  Power-LED
    PB4  OUT  Power-LED
    PB5  SPI
    PB6  SPI
    PB7  SPI
    PD0  IN  Sub1
    PD1  IN  Sub2
    PD2  IN  IR Empfänger
    PD3  IN  Set
    PD4  IN  Power Supply On
    PD5  ---
    PD6  ---
    Speaker-Relais:
    Links =  Sub 1
    Rechts = Sub 2
    **/
     
    U8 ShiftByte = 0;
    U8 PowerState = 255;
    U8 ActiveSub =  1;
    U8 Phase_1L =   0;
    U8 Phase_1R =   0;
    U8 Phase_2L =   0;
    U8 Phase_2R =   0;
    #define RelSigLinks    7
    #define RelSigRechts   6
    #define RelPhaseLinks   5
    #define RelPhaseRechts   4
    #define RelSubLinks    3
    #define RelSubRechts   2
    #define LEDSub1     1
    #define LEDSub2     0
     
    #define RelSigLinks0   ShiftByte = ~(~ShiftByte | (1<<RelSigLinks))
    #define RelSigLinks1   ShiftByte = (ShiftByte | (1<<RelSigLinks))
    #define RelSigRechts0   ShiftByte = ~(~ShiftByte | (1<<RelSigRechts))
    #define RelSigRechts1   ShiftByte = (ShiftByte | (1<<RelSigRechts))
    #define RelPhaseLinks0   ShiftByte = ~(~ShiftByte | (1<<RelPhaseLinks))
    #define RelPhaseLinks1   ShiftByte = (ShiftByte | (1<<RelPhaseLinks))
    #define RelPhaseRechts0   ShiftByte = ~(~ShiftByte | (1<<RelPhaseRechts))
    #define RelPhaseRechts1   ShiftByte = (ShiftByte | (1<<RelPhaseRechts))
    #define RelSubLinks0   ShiftByte = ~(~ShiftByte | (1<<RelSubLinks))
    #define RelSubLinks1   ShiftByte = (ShiftByte | (1<<RelSubLinks))
    #define RelSubRechts0   ShiftByte = ~(~ShiftByte | (1<<RelSubRechts))
    #define RelSubRechts1   ShiftByte = (ShiftByte | (1<<RelSubRechts))
    #define LEDSub1_0    ShiftByte = ~(~ShiftByte | (1<<LEDSub1))
    #define LEDSub1_1    ShiftByte = (ShiftByte | (1<<LEDSub1))
    #define LEDSub2_0    ShiftByte = ~(~ShiftByte | (1<<LEDSub2))
    #define LEDSub2_1    ShiftByte = (ShiftByte | (1<<LEDSub2))
    #define RelaisStrobe0   PORTB = ~(~PORTB | (1<<PB0))
    #define RelaisStrobe1   PORTB = (PORTB | (1<<PB0))
    #define RelaisData0    PORTB = ~(~PORTB | (1<<PB1))
    #define RelaisData1    PORTB = (PORTB | (1<<PB1))
    #define RelaisCLK0    PORTB = ~(~PORTB | (1<<PB2))
    #define RelaisCLK1    PORTB = (PORTB | (1<<PB2))
    #define PowerLED1_0    PORTB = ~(~PORTB | (1<<PB3)) // rot
    #define PowerLED1_1    PORTB = (PORTB | (1<<PB3))
    #define PowerLED2_0    PORTB = ~(~PORTB | (1<<PB4)) // grün
    #define PowerLED2_1    PORTB = (PORTB | (1<<PB4))
    #define TasteSub1               ((PIND & (1<<PD0)) == 0) 
    #define TasteSub2               ((PIND & (1<<PD1)) == 0) 
    #define TasteSet                ((PIND & (1<<PD3)) == 0) 
    #define PowerSupplyOn           ((PIND & (1<<PD4)) == 0) 
     
    #define Wait_Shift    30
     
    void Wait (U16 Time)
    {
     U16 i1;
     for (i1 = 0; i1 < Time; i1++)
      asm volatile ("NOP");
    }
    void ShiftOut (void)
    {
     U8 Temp = ShiftByte;
     U8 i1;
     RelaisStrobe0;
     RelaisCLK1;
     Wait (Wait_Shift);
     for (i1 = 0; i1 < 8;i1++)
     {
      if ((Temp & 1) == 0)
       RelaisData0;
      else
       RelaisData1;
      
      Wait (Wait_Shift);
      RelaisCLK0;
      Wait (Wait_Shift);
      RelaisCLK1;
      Wait (Wait_Shift);
      Temp = (Temp>>1);
     }
     RelaisStrobe1;
    }
     
    void SetOutputs (U8 showPhase)
    {
     switch (ActiveSub)
     {
      case 1: { RelSigLinks0;
         RelSigRechts0;
         if (Phase_1L == 0)
          RelPhaseLinks0;
         else
          RelPhaseLinks1;
         if (Phase_1R == 0)
          RelPhaseRechts0;
         else
          RelPhaseRechts1;
         RelSubLinks0;
         RelSubRechts0;
         LEDSub1_1;
         LEDSub2_0;
         break;
        }
      case 2: { RelSigLinks1;
         RelSigRechts1;
         if (Phase_2L == 0)
          RelPhaseLinks0;
         else
          RelPhaseLinks1;
         if (Phase_2R == 0)
          RelPhaseRechts0;
         else
          RelPhaseRechts1;
         RelSubLinks1;
         RelSubRechts1;
         LEDSub1_0;
         LEDSub2_1;
         break;
        }
     }
     if (showPhase == 1)
     {
      U8 tmpShiftByte = ShiftByte;
      U8 tmpFlashByte;
      LEDSub1_0;
      LEDSub2_0;
      PowerLED1_1;
      PowerLED2_0;
      ShiftOut ();
      Wait (5000);
      switch (ActiveSub)
      {
       case 1: { if (Phase_1L == 1)
           LEDSub1_1;
          if (Phase_1R == 1)
           LEDSub2_1;
          break;
         }
       case 2: { if (Phase_2L == 1)
           LEDSub1_1;
          if (Phase_2R == 1)
           LEDSub2_1;
          break;
         }
      }
      ShiftOut ();
      tmpFlashByte = ShiftByte;
      Wait (1000);
      ShiftByte = tmpShiftByte;
      LEDSub1_0;
      LEDSub2_0;
      ShiftOut ();
      Wait (1000);
      ShiftByte = tmpFlashByte;
      ShiftOut ();
      Wait (5000);
      PowerLED1_0;
      PowerLED2_1;
      ShiftByte = tmpShiftByte;
     }
     ShiftOut ();
    }
     
    void loadSettings (void)
    {
     ActiveSub = eeprom_read_byte (1);
     Phase_1L = eeprom_read_byte (2);
     Phase_1R = eeprom_read_byte (3);
     Phase_2L = eeprom_read_byte (4);
     Phase_2R = eeprom_read_byte (5);
     if (ActiveSub < 1) ActiveSub = 1;
     if (ActiveSub > 2) ActiveSub = 2;
     if (Phase_1L > 1)  Phase_1L =  0;
     if (Phase_1R > 1)  Phase_1R =  0;
     if (Phase_2L > 1)  Phase_2L =  0;
     if (Phase_2R > 1)  Phase_2R =  0;
    }
    void saveSettings (void)
    {
     eeprom_write_byte (1, ActiveSub);
     eeprom_write_byte (2, Phase_1L);
     eeprom_write_byte (3, Phase_1R);
     eeprom_write_byte (4, Phase_2L);
     eeprom_write_byte (5, Phase_2R);
    }
     
    int main(void) 
    { 
     DDRB = 0b00011111;
     PORTB = 0b00000000;
     DDRD = 0b00000000;
     PORTD = 0b00011011;
     RelaisStrobe1;
     RelaisCLK1;
     loadSettings ();
    
     ShiftOut ();
     
    
       while (1)
        {
      if (PowerSupplyOn)
      {
       if (PowerState != 0)
       {
        PowerLED1_0;
        PowerLED2_1;
        PowerState = 1;
        SetOutputs (0);
       }
     
       if (PowerState == 1)
       {
        if (TasteSub1)
        {
         ActiveSub = 1;
         SetOutputs (0);
         saveSettings ();
         Wait (1000);
         while (TasteSub1)
          Wait (1000);
        }
        if (TasteSub2)
        {
         ActiveSub = 2;
         SetOutputs (0);
         saveSettings ();
         Wait (1000);
         while (TasteSub2)
          Wait (1000);
        }
        if (TasteSet)
        {
         switch (ActiveSub)
         {
          case 1: { if (Phase_1L == 0)
             {
              if (Phase_1R == 0)
              {
               Phase_1R = 1;
              }
              else
              {
               Phase_1L = 1;
               Phase_1R = 0;
              }
             }
             else
             {
              if (Phase_1R == 0)
              {
               Phase_1R = 1;
              }
              else
              {
               Phase_1L = 0;
               Phase_1R = 0;
              }
             }
             break;
            }
          case 2: { if (Phase_2L == 0)
             {
              if (Phase_2R == 0)
              {
               Phase_2R = 1;
              }
              else
              {
               Phase_2L = 1;
               Phase_2R = 0;
              }
             }
             else
             {
              if (Phase_2R == 0)
              {
               Phase_2R = 1;
              }
              else
              {
               Phase_2L = 0;
               Phase_2R = 0;
              }
             }
             break;
            }
         }
         SetOutputs (1);
         saveSettings ();
         
         Wait (1000);
         while (TasteSet)
          Wait (1000);
        }
       }
      }
      else
      {
       if (PowerState != 0)
       {
        ShiftByte = 0;
        ShiftOut ();
        PowerLED1_1;
        PowerLED2_0;
        PowerState = 0;
       }
      }
        } 
        return(0); 
    }
    Viele Grüße
    Andreas

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Habs grad mal getestet.
    Ohne optimierung 2006 Bytes, mit Optimierung 1296 Bytes.
    Man müsste nur gucken ob er nichts wichtiges, besonders Pausen, weg optimiert hat.
    Geändert von TobiKa (26.04.2011 um 15:43 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Selbst 1296 Bytes kommen mir für das Programm noch recht viel vor, kann aber Täuschen wegen der vielen #Define.

    Falls es wirklich gebraucht wird, gibt es relativ neu den ATiny4313 als Version mit dem doppelten Speicher.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    672
    Hallo Besserwessi,

    der 4313 ist der richtige Tipp. Danke! Die zwei teilen sich ja mittlerweile sogar das gleiche Datenblatt. Nur ich habe leider keine Bezugsquelle dafür gefunden. (Brauche ja nur einen...)
    Hast du noch einen Tipp, wo man den 4313 kaufen kann?

    Viele Grüße
    Andreas

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Bei dem Code kann man vermutlich noch einiges Optimieren. Es ist aber durch die vielen Defines etwas schlecht zu sehen.

    Ein mögliche Quelle wäre:
    http://www.tme.eu/de/katalog/#idp%3D...rch%3Dtiny4313

    Angeblich haben die jetzt auch eine Niederlassung in Deutschland, also kleine Polnische Mwst. mehr.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Es gibt ihn auch noch bei Farnell, 2,85€ der IC und 7,95€ Versand

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    672
    Hallo,

    ich habe gerade was herausgefunden. Wenn ich die Defines der IO's tausche von

    Code:
    #define RelaisStrobe0   PORTB = ~(~PORTB | (1<<PB0))
    #define RelaisStrobe1   PORTB = (PORTB | (1<<PB0))
    #define RelaisData0    PORTB = ~(~PORTB | (1<<PB1))
    #define RelaisData1    PORTB = (PORTB | (1<<PB1))
    #define RelaisCLK0    PORTB = ~(~PORTB | (1<<PB2))
    #define RelaisCLK1    PORTB = (PORTB | (1<<PB2))
    #define PowerLED1_0    PORTB = ~(~PORTB | (1<<PB3)) // rot
    #define PowerLED1_1    PORTB = (PORTB | (1<<PB3))
    #define PowerLED2_0    PORTB = ~(~PORTB | (1<<PB4)) // grün
    #define PowerLED2_1    PORTB = (PORTB | (1<<PB4))
    zu

    Code:
    #define RelaisStrobe0   asm volatile ("cbi 0x18, 0")
    #define RelaisStrobe1   asm volatile ("sbi 0x18, 0")
    #define RelaisData0    asm volatile ("cbi 0x18, 1")
    #define RelaisData1    asm volatile ("sbi 0x18, 1")
    #define RelaisCLK0    asm volatile ("cbi 0x18, 2")
    #define RelaisCLK1    asm volatile ("sbi 0x18, 2")
    #define PowerLED1_0    asm volatile ("cbi 0x18, 3") // rot
    #define PowerLED1_1    asm volatile ("sbi 0x18, 3")
    #define PowerLED2_0    asm volatile ("cbi 0x18, 4") // grün
    #define PowerLED2_1    asm volatile ("sbi 0x18, 4")
    spart mir das fast 10% Platz im AVR. Ist dies eventuell auch mit den Variablen möglich? Kann man z.B. Eine Variable in C direkt an ein Register binden und dann auch solche Optimierungen mit cbr und sbr durchführen:

    Code:
    U8 ShiftByte = 0;
     
    #define RelSigLinks0   ShiftByte = ~(~ShiftByte | (1<<RelSigLinks))
    #define RelSigLinks1   ShiftByte = (ShiftByte | (1<<RelSigLinks))
    #define RelSigRechts0   ShiftByte = ~(~ShiftByte | (1<<RelSigRechts))
    #define RelSigRechts1   ShiftByte = (ShiftByte | (1<<RelSigRechts))
    #define RelPhaseLinks0   ShiftByte = ~(~ShiftByte | (1<<RelPhaseLinks))
    #define RelPhaseLinks1   ShiftByte = (ShiftByte | (1<<RelPhaseLinks))
    #define RelPhaseRechts0   ShiftByte = ~(~ShiftByte | (1<<RelPhaseRechts))
    #define RelPhaseRechts1   ShiftByte = (ShiftByte | (1<<RelPhaseRechts))
    #define RelSubLinks0   ShiftByte = ~(~ShiftByte | (1<<RelSubLinks))
    #define RelSubLinks1   ShiftByte = (ShiftByte | (1<<RelSubLinks))
    #define RelSubRechts0   ShiftByte = ~(~ShiftByte | (1<<RelSubRechts))
    #define RelSubRechts1   ShiftByte = (ShiftByte | (1<<RelSubRechts))
    #define LEDSub1_0    ShiftByte = ~(~ShiftByte | (1<<LEDSub1))
    #define LEDSub1_1    ShiftByte = (ShiftByte | (1<<LEDSub1))
    #define LEDSub2_0    ShiftByte = ~(~ShiftByte | (1<<LEDSub2))
    #define LEDSub2_1    ShiftByte = (ShiftByte | (1<<LEDSub2))
    Viele Grüße
    Andreas

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    In der Regel ist der Compiler bei der verwendung der Register schon nicht so schlecht - wenn man da was von Hand macht, wird es oft schlecher.

    Was ist denn an Optimierung eingestellt. Ich dachte GCC mach die oben von Hand eingefügte Optimierung auch schon automatisch, wenn man mit -o2 oder -os compiliert.

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 06.05.2012, 19:40
  2. Attiny2313 mit mehr Flash?
    Von Tido im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 6
    Letzter Beitrag: 18.01.2010, 23:00
  3. kein Flash mehr möglich
    Von frank1210 im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 27.12.2009, 03:03
  4. Je mehr ich Lese desto mehr komme ich mit dem durcheinander
    Von becki133 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 05.07.2008, 14:39
  5. page 12 nicht mehr flash-fähig
    Von Weiti im Forum Asuro
    Antworten: 9
    Letzter Beitrag: 04.11.2007, 23:25

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •