- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: ATtiny13 - Wie Sleep beenden ohne externes Signal

  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.678

    ATtiny13 - Wie Sleep beenden ohne externes Signal

    Anzeige

    Powerstation Test
    Bitte um Hilfe.
    Aufgabe: Aufwecken eines tiny13 aus dem idle- oder einem sonstigen sleep ohne externes Signal.

    Hintergrund.
    Tiny85/sleep :
    Mein Pacer läuft auf nem tiny85 mit internem Oszillator und mit nem 9V-Block seit Monaten. Hier der Schaltplan und die Bestückung (Board) auf Lochplatte. Zur bequemen Bedienung sind zwei Tasten ausreichend.

    Tiny85 - Aufgabe/Nutzung: mehrmals wöchentlich wird jeweils mehrere Minuten der Blinkrhythmus bei Fitnessübungen benutzt.
    Beim ersten Bestromen geht der Pacer sofort in den sleep, ebenso bei geeignetem Tastendruck (TAB länger als 2 sec). Durch Tastendruck (TAB, PB1) länger als 2 sec wird er aus dem Sleep geweckt, das gewünschte Blinkprogramm wird mit den Tasten gewählt, läuft einmal ab und endet mit sleep (siehe Code). So ein Ablauf dauert zwei bzw. fünfundzwanzig (25) Minuten; danach geht der Pacer wieder in den sleep.
    Fazit: das Ding läuft und läuft (wie seit Jahren) und der popelige 9V-Block hält ca. 6 Monate !
    Code:
    // ===============================================================================
    // ===  Ruhemodus fuer tiny85 ===============   // entnommen 28Nov2021 aus Datei
    //      D:\D_pro-fils\compu_MC\C2\PCR_80\alter_code
    //      \PCR80_x64_statsquo_Stand-13-Okt-2010\PCR_80_tmr_x64.c
    //              x64 14Mai10 1930 PWM - dabei blinkt grünLED gaaanz kurz
    //      > > > > A B E R :   PCINT von 2 auf 1 (PB1) gesetzt
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      void SLEEP1 (void)            // Ruhemodus ein, wake up durch PCINT1 auf PIN PB1
    //      war: void schlafPC2 (void)          // Controller in Ruhemodus schalten
    //      Ende des Ruhemodus durch PCINT1 auf PIN1/TAB
    //      Start "normal" mit "Resetblink", danach warten auf Tastendruck ohne LEDs,
    //      nach Tastendruck nochmal Resetblink und dann einschlafen. 
    //      Dies zur Messung des Strombedarfs ausserhalb und im Schlafmodus.
    // - - - - - - - - - - - - - - - -
      {                             //
      GIMSK   |=  (1<<PCIE);        // PinChangeInterrupt enable              doc S  53
      PCMSK   |=  (1<<PCINT1);      // PinChangeInterrupt auf Pin PB1/PCINT1  doc S  54
      MCUCR   |=  (1<<SM1)|(1<<SE); // SM1: Power Down, SE: Sleep enable
                                    //
    // - - - - - - - - - - - - - - - -
      sei();                        //
      asm volatile ("sleep");       // Inline-Assembler
    //      Möglich statt "asm volatile ("sleep");.." auch die folgenden zwei Befehle
    //  sleep_mode ( ); sleep_disable ( ); //
                                    //
      MCUCR   &= ~(1<<SM1)|(1<<SE); // Folgende 3 Zeilen: alten Zustand / zurücksetzen
      GIMSK   &= ~(1<<PCIE);        // PinChangeInterrupt disable
      PCMSK   &= ~(1<<PCINT1);      // PinChangeInterrupt disable Pin PCINT2  doc S  54
    //sei();                        //
    // - - - - - - - - - - - - - - - -
      return;                          
      }                     // Ende void SLEEP1 (void)   -- Ruhemodus ein, wake up dur
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // ============================================================================= =
    Mein Problem:
    Tiny13 :
    Meine Weihnachtsbeleuchtung hat einige kurze Lichterketten die durch je eine minimalistischen Schaltung mit nem tiny13 und einer 3xAA-Batteriebox sieben Stunden eingeschaltet werden. Ausschalten erfolgt nach Ablauf der Zeit durch return 0; Einschalten nach dem ersten Bestromen bzw. durch den /RESET; da ist also IMMER händische Aktion erforderlich. Die schnelle Lösung erfolgte so - Ende durch return 0; - weil mir eine geeignete Lösung mit sleep nicht gelang.
    Zur Stromersparnis in den Ruhephasen wird der interne 128kHz-Oszillator genutzt, schneller ist bei der einfachen, zeitunkritischen Arbeitsweise nicht nötig, langsamer ist - ohne externen Quarz nicht möglich (? - klick mal).

    Nun Suche ich DOCH nach einer Lösung mit dem internen sleep um mir das tägliche wieder-Einschalten zu ersparen.
    Schwierig.
    Allenfalls möglich finde ich eine dummy-ADC-Wandlung die mir den Controller aufweckt. Durch ne entsprechende Anzahl von Weckwiederholungen kann eine geeignete Schleife die gewünschte Dunkelphase von ca. vierzehn Stunden erreichen. Dumm nur dass die sleep-Pausen durch den ADC ziemlich kurz sind, siehe Auszug/Zitat:

    Zitat aus ATtiny13_doc2535J 08/10
    ... A normal conversion takes 13 ADC clock cycles. The first conversion after the ADC is switched on (ADEN in ADCSRA is set) takes 25 ADC clock cycles in order to initialize the analog circuitry, as shown in Figure 14-4 below ...

    Selbst der popelige 8-Bit-Timer könnte das in einer maximal langen Schleife über zehn Mal langsamer - und entsprechend stromsparender. Aber - es gibt nach dem eben genannten Arbeitsblatt keine Möglichkeit - oder doch ? Oder gibt es Quarze oder ähnliche Bauteile zur energiesparenden (energielosen) Takterzeugung?

    Frage:
    Gibt es vielleicht doch ne Möglichkeit - wie auch immer? Nur Energie sollte sie nicht zusätzlich benötigen.

    Danke im Voraus
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.12.2018
    Beiträge
    459
    Ich hab zwar dein Problem nicht wirklich verstanden, aber wenn du was nach Zeitvorgaben steuern willst, dann hast du mindestens diese zwei Möglichkeiten.

    Entweder den Tiny immer in den Sleep Modus schicken und nach der maximalen Sleep-Timer-Zeit (ich glaube 4 Sekunden - je nach Modell) aufwachen lassen, dann einen Zähler hochzählen und damit kannst du bestimmen, wie lange er "nichts" macht und wann er wieder die LEDs schaltet oder sowas.

    Oder du hängst eine Real Time Clock daran (DS3231 ist wohl derzeit das zu empfehlende Modell) und programmierst dort die entsprechenden Alarmzeiten mit denen du den Tiny per Interrupt aus dem Tiefschlaf wecken kannst.

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.678
    .. hast du mindestens diese zwei Möglichkeiten .. Tiny immer in den Sleep Modus schicken und .. aufwachen lassen .. Oder .. eine Real Time Clock ..
    GENAU dieses "Entweder" ist meine Absicht - eine INTERNE Wake up Quelle. Die externe Quelle RTC brauchts dann ja nicht.

    Der Teufel steckt wie immer im Detail, denn ich will ja, siehe oben, dass der Controller OHNE externen Eingriff wieder aus dem sleep Modus kommt. Dumm, denn welcher Sleep Modus des tiny13 kann das? (GENAU DAS versteh ich nicht).

    Zur Verfügung stehen beim tiny13 die Wake-up Sources (siehe Datenblatt) :

    ......Bild hier  

    INT0 oder Pin Change...- nur von EXTERN, ich will aber eine interne Aktion
    EEPROM Ready............- beim EEPROM-lesen schafft der Controller doch ! ?
    ADC . . . . . . . . . . . . .- im Eingangspost erwähnt, ist zu kurz für Ersparungen (und beim Wandeln benötigt der µC Strom!?)
    Other I/O . . . . . . . . ..- sind auch EXTERN, ich benötige eine interne Aktion
    Watchdog . . . . . . . . .- ? ? ? gibt nen Systemstart <=> alles wird zurückgesetzt, auch die Zählschleife . . .

    Daher die Bitte:
    a) Welcher sleep Modus macht mir das OHNE Zurücksetzen des Controllers UND ohne externe Quelle?
    b) Wie bitte sieht dann der geänderte Code aus (siehe funktionierende Sequenz oben).
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo,
    das müßte schon mit dem Watchdog gehen. Der läßt sich anscheinend nicht nur auf Reset sondern auch auf Watchdog Interrupt konfigurieren und wenn es sein muß sogar auf Beides damit in einer ISR vor Reset gesichert werden kann.

    Der Watchdog Timer läuft wohl mit 128kHz. Die maximale Laufzeit ist 8 Sekunden. Also alle 8 Sekunden raus aus dem sleep, in der ISR nachsehen, ob es schon Zeit ist oder eine Variable inkrementieren und dann wieder in den sleep.

    Das ist die Idee. Mal sehen, ob ich auch die Programmzeilen dazu zusammen bekomme.

    Könnte aber was dauern. zZ kämpfe ich noch mit einem Breadboardset, das so ein Powermodul für Input 6,5 bis 12V und Output 5V und 3,3V hat. Auf dem Ding scheint es gefälschte AMS1117 Spannungswandler verbaut zu haben. Es sollten LDOs sein. Droput Voltage ist beim 5V Wandler aber fast zwei Volt anstatt maximal 1,3V. Und 'ne normale, keine Schottky Verpolschutzdiode. Mein 7V Steckernetzteil, das ich immer verwende reicht da also nicht aus. ... Für 3,50€ incl. Steckbrett und 'ner ganzen Menge Steckkabel ... Was soll man machen?

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.12.2018
    Beiträge
    459
    Im Datenblatt DS40002307A Kapitel 8.4 kannst du nachlesen, dass man zwischen Interrupt Mode und Reset Mode umschalten kann. Dafür ist das WDTIE-Flag zuständig. Damit müsste das lösbar sein. In Kapitel 8.5.2 findest du noch was zu den Registern und Flags.
    Wenn ich das richtig sehe, muss WDE = 0 und WDTIE = 1 sein, damit der Interrupt ausgelöst wird.
    Geändert von Gnom67 (13.01.2022 um 20:54 Uhr)

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von Andre_S
    Registriert seit
    26.06.2005
    Beiträge
    360
    Hallo,

    ist zwar nicht taufrisch, aber im Prinzip wie hier im Tread schon beschrieben:
    https://arduino-projekte.webnode.at/...ecken-mit-wdt/


    Gruß André

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo,

    ich habe ein Bascom Demo Programm gemacht. Leider bin ich in C nicht so fit, daß ich das schnell hinbekomme. Habe aber versucht, möglichst gut zu kommentieren. Programm ist auf Tiny44 getestet. Auf Tiny13 heißen, so meine ich, nur zwei relevante Bits anders. Ist im Programm kommentiert.

    Gruß
    Searcher

    Code:
    '###################################################
    '
    'ATtiny44
    '
    'WATCHDOG DEMO
    '
    'IMPORTANT prerequisite:
    'WDTON fuse is default (unprogrammed = 1, watchdog timer interrupt function is enabled)
    '
    'three LEDs are used to visually monitor the success of sleep mode pauses
    '  1. after start of program (or a reset) all three leds lit for one second
    '  2. 8 seconds wdt pause
    '  3. wdt led flash, life led flash
    '  4. 8 seconds pause
    '  5. wdt led flash, life led flash
    '  6. 8 seconds pause
    '  7. wdt led flash, life led flash
    '  8. directly after 7. action led flash
    '  9  5 seconds pause in action sub, another action led flash
    ' 10. continue step 2. with 8 sconds pause
    '
    '  control overall sleep duration by value in watchdog_ovf
    '
    '#######################################################
    $regfile = "attiny44.dat"
    $framesize = 24
    $swstack = 24
    $hwstack = 38
    $crystal = 8000000                                          'internal oscillator
    
    Config Portb.0 = Output                                     'WDT LED, switched in watchdog isr (200ms flash)
    Config Porta.3 = Output                                     'Action LED indicates action after watchdog controlled sleep
    Config Porta.7 = Output                                     'Life LED, monitor wether sleep mode ist entered
    
    Rem : all LEDs for 1 second ON (check for program begin and/or µC reset)
    portb.0 = 1
    porta.3 = 1
    porta.7 = 1
    wait 1
    portb.0 = 0
    porta.3 = 0
    porta.7 = 0
    Rem : check end for program begin and/or µC reset
    
    dim watchdog_action_flag as byte                            'set in watchdog interrupt, indicates end of sleep pause
    dim watchdog_ovf as word                                    'counts watchdog timer overflows before action
    
    set mcucr.sm1                                               'prepare sleepmode as power down, SM1 Bit in MCUcR
    on wdt isr_watchdog                                         'watchdog interrupt vector to watchdog isr
    
    wdtcsr = bits(wdp0 , wdp3)                                  'set wdp0,wdp3 bits, watchdog prescaler to 8 seconds
    
    Rem : ### !wdr                                                        'asm instruction "wdr" resets the watchdog timer
    
    set WDTCSR.wdie                                             'watchdog interrupt enable
    Rem attiny13 : set WDTCSR.wdtie                                             'watchdog interrupt enable
    enable interrupts                                           'global interrupt enable (sei)
    
    
    Rem : ###############################################################################
    Rem : ### main loop
    Do
      set mcucr.se                                              'enable following sleep command, SE Bit in MCUCR
      !sleep                                                    'asm sleep command. enters sleepmode which is prepared in MCUCR by SM bits
      reset mcucr.se                                            'disable sleep commands: recomended in datasheet
    
      porta.7 = 1                                               'Life LED ON
      waitms 200                                                '200ms flash, monitor sleep state
      porta.7 = 0                                               'Life LED OFF
    Rem : ### if sleepmode ist not entered , Life LED OFF is not noticable (to fast, LED appears continiously on exept during action)
    
      if watchdog_action_flag = 1 then
        gosub sub_watchdog_action
        watchdog_action_flag = 0
      end if
    Loop
    Rem : main loop end
    Rem : ###############################################################################
    
    
    
    Rem : ###############################################################################
    Rem : ### in subroutine do whatever to be done after watchdog controlled long sleep break
    sub_watchdog_action:
      porta.3 = 1                                               'Action LED ON
      waitms 200                                                '200ms flash
      porta.3 = 0                                               'Action LED OFF
      wait 5                                                    '5 seconds do nothing, just wait
      porta.3 = 1                                               'Action LED ON
      waitms 200                                                '200ms flash
      porta.3 = 0                                               'Action LED OFF
    
    Rem : ### !wdr                                                        'asm instruction "wdr" resets the watchdog timer
      set WDTCSR.wdif                                           'clear eventually set interrupt flag before enabling wdt interrupt
      set WDTCSR.wdie                                           'watchdog interrupt enable
    Rem attiny13 :  set WDTCSR.WDTIF                                           'clear eventually set interrupt flag before enabling wdt interrupt
    Rem attiny13 :  set WDTCSR.WDTIE                                           'watchdog interrupt enable
    return
    Rem : ###############################################################################
    
    
    isr_watchdog:                                               'controls invoking of "sub_watchdog_action"
      portb.0 = 1
      waitms 200                                                '200ms flash - monitor watchdog interrupt
      portb.0 = 0
      watchdog_ovf = watchdog_ovf + 1                           'count wdt timer overflows/interrupts
      if watchdog_ovf >= 3 then
        reset WDTCSR.wdie                                       'watchdog interrupt disable
    Rem attiny13 : reset WDTCSR.wdtie                                       'watchdog interrupt disable
        watchdog_action_flag = 1                                'flag will be processed in main loop
        watchdog_ovf = 0
      end if
    return
    
    end                                                         'end program
    Geändert von Searcher (14.01.2022 um 11:03 Uhr) Grund: Kommentare im PRG berichtigt
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.678
    Danke Euch für die konstruktiven Hinweise.
    m Datenblatt DS40002307A Kapitel 8.4 kannst du nachlesen . . .
    Danke Gnom67 - jaaa, das ist DER Hinweis! .. steht auf den an die zwanzig Seiten Datenblatt die ich (noch) nie gelesen, nicht mal überflogen hatte. Sprich: bins selber schuld. Ich geh die nächsten Tage dran (jetzt erstmal an die Kletterwand - in der Halle - weils draussen deutlich unter Null ist *brrrr* aber der Himmel ist uni bayerisch-blau)

    @André : ach jee, und die Arduinohilfen gehören auch nicht zu meiner üblichen Literatur. Schade wie ich sehe!

    @Searcher : danke für Deine Mühe. PS: haste im Postfach nachgesehen?

    Danke nochmal für Eure Hilfen. Ich werde berichten.
    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.678
    Es geht weiter? Ja, blos funktionieren tuts nicht :-/ Da muss ich mal (noch) gründlich (..er) drüberschauen.

    Code:
    // ============================================================================= =
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    //  N E U    Basis "alter" SLEEP1, Adaption aus searcher´s tiny44_WDT_Demo-in-BAS
    // ============================================================================= =
    //  Dok D:\D_pro-fi...blätter\atmel-controller_Datenblätter_App-Notes
    //      \ATtiny13_doc2535J_08-10-akt-neueste-13-13V_13neu_13-13Vneu_13-13Vneu.pdf
    // ============================================================================= =
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      void SLP0init (void)          // Ruhemodus vorbereiten / initialisieren
      {                             //
    // __watchdog_reset();
    //  Siehe https://arduino-projekte.webnode.at
    //              /meine-projekte/attiny-im-schlafmodus/wecken-mit-wdt/
    //      Setzen des Registers fuer Watchdog Time-out Interrupt
        cli();
        wdt_reset();                // Reset Watchdog Timer
        MCUSR  &=  ~(1 << WDRF);    //Ruecksetzen des Watchdog System Reset Flag
        MCUCR  |=   (1 << SM1);     // SM1: Power Down                              46
    /* Set new prescaler(time-out) */
        WDTCR  |=   (1<<WDE) | (1<<WDCE) | (1<<WDP3);
    //  WDTCR  |=   (1 << WDTIE);   // Watchdog Timer Interrupt Enable              41
        WDTCR  |=   (1 << WDTE);   // Watchdog Timer Interrupt Enable setzen        41
      //  sei();
    
        return;                          
      }                     // Ende void SLEEP1 (void)   -- Ruhemodus ein, wake up dur
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // ============================================================================= =
    
    
    
    // ============================================================================= =
    //  Dok D:\D_pro-fi...blätter\atmel-controller_Datenblätter_App-Notes
    //      \ATtiny13_doc2535J_08-10-akt-neueste-13-13V_13neu_13-13Vneu_13-13Vneu.pdf
    //  Dann - neu: D:\D_pro-fi...blätter\atmel-controller_Datenblätter_App-Notes
    //      \ATtiny13A-Data-Sheet-DS40002307A-2021_neu-Microchip
    // ============================================================================= =
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      void SLEEP0 (void)            // Ruhemodus SLEEP0 starten
      {                             //
        MCUCR |= (1<<SM1)|(1<<SE);  // SM1: Power Down, SE: Sleep enable            46
        sei();                      //
        asm volatile ("sleep");     // Inline-Assembler
        MCUCR   &= ~(1<<SM1)|(1<<SE);       // => alten Zustand / zurücksetzen
        
        WDTCR &=   ~(1<<WDE);       // Watchdog Timer Interrupt   D I S able        41
        WDTCR |=    (1<<WDTIE);     // Watchdog Timer Interrupt Enable              41
    
    // - - - - - - - - - - - - - - - -
        return;                          
      }                     // Ende void SLEEP1 (void)   -- Ruhemodus ein, wake up dur
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // ============================================================================= =
    Wird im main aufgerufen :
    Code:
    ..
      SetBit (PORTB, kLED); wms (    5 );   // Port für/mit PB0/rLED
      SLP0init ( );         // Ruhemodus SLEEP0 vorbereiten / initialisieren
      ClrBit (PORTB, kLED); wms (    5 );   // Port für/mit PB0/rLED
    
      while ( 1 )           // Hier folgt das eigentliche Hauptprogramm
      {                     //
        SetBit (PORTB, kLED); wms (   10 );
                            //
        SLEEP0 ( );         // Ruhemodus SLEEP0
                            //
        ClrBit (PORTB, kLED); wms (   10 );       // LED aus
                            //
    //  SLEEP0 ( );         // Ruhemodus SLEEP0
                            //
      }             // Ende while ( 1 )
    ..
    *grübel*
    Ciao sagt der JoeamBerg

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo,

    ich finde keine Interrupt Routine. Springt der µC ins Leere?

    Die Zeile "WDTCR &= ~(1<<WDE); // Watchdog Timer Interrupt D I S able 41" ist unnötig und wird vermutlich auch nicht ausgeführt.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 14
    Letzter Beitrag: 16.09.2008, 18:27
  2. Externes PWM-Signal einlesen und Auswerten
    Von Caligula im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 21.08.2008, 20:27
  3. ADC-Wert ohne Signal
    Von pacer_one im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 03.03.2008, 20:45
  4. Interruptroutine durch externes Signal starten...
    Von Spartakaktus im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 19.05.2006, 14:27
  5. Prozess beenden
    Von Jimmy C im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 10.01.2005, 20:53

Berechtigungen

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

Labornetzteil AliExpress