Powering Attiny85 Digispark

Hello everyone, if I power the Attiny85 through the Vin @ 20V I assume that the internal regulator will convert to 5V with 14-15mA consumption. Is it correct? How can I calibrate a resistor in order to avoid that the Attiny85 heats up too much? thanks

Which resistor?
Please show your schematic.

In general, powering the chip with nominal voltage 2.5 - 5v with 20v supply is not a good idea

Eh? It uses L78M05 regulator, it will have to dissipate 15V, it turns into heat. Add heatsink or power it with less V

I want to use this sketch and to find the good way to do it:

int DCC_adresse = 12;   // DCC-weichenadresse, ziffer entsprechend der gewuenschten adresse anpassen. weiteres signalbild eine DCC-adresse hoeher.
int ausgang_rot = 0;    // PWM pins: nano 3, 5, 6, 9, 10, 11; Attiny85 0, 1, 4  // 0  4
int ausgang_gruen = 1;                                                          // 1  1
int ausgang_gelb = 4;                                                           // 4  0

/* DCC-einzelweichedekoder (magnetartikeldecoder), hier lichtsignaldecoder fuer dreibegriffige anzeigen ueber zwei aufeinanderfolgende weichenadressen, 
 * z.B. Hp 0, Hp 1, Hp 2 oder: Vr 0, Vr 1, Vr 2 mit gluehlampensimmulation (unterschiedlich weiches ein- und ausblenden). letztes signalbild wird im eeprom 
 * gespeichert und bei einschalten des signals wieder aufgerufen. zu signalbilder siehe
 * http://www.stellwerke.de/signal/deutsch/vor-haupt.html
 * https://de.wikipedia.org/wiki/Eisenbahnsignale_in_der_Schweiz
 * 
 * erste DCC-adresse wird in zeile 1 eingestellt.
 * 
 * !!!ACHTUNG: LED werden in annaehrung an handelsuebliche DCC-dekoder "negativ" angesteuert: kathode -> pin, anode -> +5V (gemeinsamer +pol). 
 * Attiny85: sofern pin4 mit led bestueckt: zum aufspielen des sketches kontakt loesen, da pin4 USB-.
 * 
 * hier vereinfacht fuer einzeldekoder mit fester (in zeile 1 vor hochladen festlegen) adresse.
 * 
 * A.G.-P.
 * 
 * die benoetigte NmraDCC - bibliothek gibt es unter https://downloads.arduino.cc/libraries/github.com/mrrwa/NmraDcc-1.4.2.zip
 * !!! WICHTIG: laeuft nur mit NmraDcc version 1.4.2 Library; ggf. in bibl.-verwaltung entsprechen einstellen!
 * vergleiche: https://github.com/mrrwa/NmraDCC/archive/master.zip
 * siehe auch: https://github.com/mrrwa/NmraDcc
 * bibliothek geschreiben von Alex Shepherd, Wolfgang Kuffer, Geoff Bunza, Martin Pischky, Franz-Peter Mueller, Sven (littleyoda), Hans Tanner
 * infos: https://www.arduino.cc/reference/en/libraries/nmradcc/
 * 
 * EEPROM.h geschrieben von David A. Mellis und Christopher Andrews https://www.arduino.cc/en/Reference/EEPROM
 * ggf. muss fuer das Attiny85 Mini board die bibliothek zusaetzlich in den den digistrumpf libraries ordner kopiert werden.
 * https://digistump.com/board/index.php?topic=1132.0
 * 
 * 
 * hardware:
 * 
 * -  Attiny85 Mini board (Digispark nachbau) mit Digistump/Digispark bootloader 
 *    achtung: je nach bootloader geht das board zunaechst in den programmiermodus (z.B. 5s), wenn es mit spannung versorgt wird.
 *    basis hardware: Karlheinz Marks http://www.robokalle.de/elektronik%20dcc-lichtsignal%20decoder.htm
 *      -- ggf. muss USB-treiber fuer betriebssystem installiert werden https://github.com/digistump/DigistumpArduino/tree/master/tools 
 *         achtung: board hat keinen USB-RS232-wandler, nur virtueller USB, funktioniert nicht mit jedem host! ggf. (alten) USB2-Hub mit 
 *         eigener stromversorgung verwenden https://digistump.com/wiki/digispark/tutorials/connecting
 *         MAC OSX: ~/Library/Arduino15/packages/digistump/hardware/avr/1.6.7/libraries/DigisparkKeyboard/usbconfig.h
 *         ggf. eintrag aendern: #define USB_CFG_VENDOR_ID 0xac, 0x05
 *         vgl.: https://null-byte.wonderhowto.com/how-to/hack-macos-with-digispark-ducky-script-payloads-0198555/
 *      -- Arduino IDE muss fuer Digistump AVR Boards (Digispark 16,5 MHz) ergaenzt werden: 
 *          https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json
 *          erlaeuterung: http://blog.wenzlaff.de/?p=7721
 *          hochladen: board "Digispark (Default - 16.5mhz)"; programmer Micronucleus; OSX: keinen port waehlen; OSX, WIN, LINUX: board erst auf anforderung einstecken
 *          falls micronucleus-1.11-entry-jumper-pb0-upgrade.hex installiert: P0 -> GND zum hochladen. achtung!: led per anode an pin 0 versetzt board bei start in programmiermodus!
 *          led per kathode an pin4 -> hochladen nicht moeglich (USB-).
 *          https://github.com/overfl0/NocInformatykaBoard/tree/master/upgrade/releases
 *          aktuelle firmware: https://github.com/micronucleus/micronucleus/tree/master/firmware
 *          version mit USB2-kontakten auf platine: auf sicheren kontakt achten
 *      -- achtung: bestimmte operationen (z.B. multiplikation) mit Attiny85 nur begrenzt moeglich. 
 *      -- pin2: DCC command; 
 *      -- pin-info: P0: I2C SDA, PWM, pin1: PWM, pin2: I2C SCK, analog in, pin3: analog in, USB+, pin4: PWM, analog in, USB-, pin5: analog in; 
 *         Rev2 / Rev4: eingebaute LED -> pin1. Rev1: eingebaute LED -> pin0 
 *         (this board requires the trace to the LED to be cut (or the LED desoldered) if you'd like to use it with I2C devices)
 *            
 * - alternativ(!): arduino nano 
 *     -- arduino pin 11 & 12 dienen z.B. als ausgang fuer motorboard; pin 2 zwingend DCC command
 *        chinateil je nach version mit "Old Bootloader" (ATmega328p) programmieren; programmer AVRISP mkII
 *     -- mit weiteren motorboards kann der decoder fuer mehrere weichen erweitert werden: pin D3-D12 + A0-A7 ermoeglichen 9 weichen. 
 *        weichenlaternensteuerung ebenfalls durch ergenzung moeglich.
 *     -- spannungsregler LM 1117 MP5,0 ggf. auf eingangsspannung (thermalabschaltung) pruefen bzw. zusätzliche spnnungsregelung vornehmen.
 *     
 *  - netzteil: einweggleichrichtung ohne puffer, ggf. hochfrequenzsiebung. alternativ: brueckengleichrichter, elko 10µF/25V, ggf. sicherung 2A, ggf. vorwiderstand Attiny85 100Ω/2W (47 - 200Ω)
 *  
 *  - vorwiderstand 22kΩ - 27kΩ fuer commandleitung
 *  
 *  - alternative schaltung via optokoppler (6N137) fuer commandleitung
 *     -- Dave Falkenburg: https://abload.de/img/schematic1haslf.png / arcomora: https://www.arcomora.com (diode: 4004)
 *     -- Rudysmodelrailway: https://rudysarduinoprojects.files.wordpress.com/2019/04/dcc-opto.png
 *     -- Philipp Gahtow: http://pgahtow.de/wiki/index.php?title=Datei:DCC_mini_Dekoder_sch.png
 *     -- bezug fertige 24V-optokoppler boards (stand april 2021): https://de.aliexpress.com/item/32914498721.html
 *     
 */

int blendwert1 = 0;
byte signalbild = 1; // 1= rot; 3=gruengelb; 2=gruen

// werte-array fuer exponentielles ausblenden
int blendarray[95] = {0,0,0,0,0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 1,1,1,1,1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
12, 13, 14, 16, 18, 20, 22, 25, 28, 30, 33, 36, 39, 42, 46, 49, 53, 56, 60, 64, 68, 72, 77, 81, 86, 90, 95, 100, 105, 110, 116, 121, 127, 
132, 138, 144, 150, 156, 163, 169, 176, 182, 189, 196, 203, 210, 218, 225, 233, 240, 248, 255};

#include <NmraDcc.h> // nur version 1.4.2
#include <EEPROM.h>

#define DCC_DECODER_VERSION_ID 02 // versions-ID

NmraDcc DCC;

void setup() 
{
   pinMode(ausgang_rot, OUTPUT);     
   pinMode(ausgang_gruen, OUTPUT);
   pinMode(ausgang_gelb, OUTPUT);
   
   DCC.init(MAN_ID_DIY, DCC_DECODER_VERSION_ID, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER,0);
   DCC.pin(0, 2, 1); // DCC-signal an pin2

   signalbild = EEPROM.read(0); // signalbild vor letztem ausschalten laden
   if (signalbild == 1) // rot
   {
     digitalWrite(ausgang_rot, LOW); 
     digitalWrite(ausgang_gruen, HIGH);
     digitalWrite(ausgang_gelb, HIGH);
   }
   else if (signalbild == 2) // gruen
   {
     digitalWrite(ausgang_rot, HIGH); 
     digitalWrite(ausgang_gruen, LOW);
     digitalWrite(ausgang_gelb, HIGH);
   }
   else if (signalbild == 3) // gruengelb
   {
     digitalWrite(ausgang_rot, HIGH); 
     digitalWrite(ausgang_gruen, LOW);
     digitalWrite(ausgang_gelb, LOW);
   }
   else
   {
     EEPROM.write(0, 1); // falls kein signalbild im eeprom: rot
     digitalWrite(ausgang_rot, LOW); 
     digitalWrite(ausgang_gruen, HIGH);
     digitalWrite(ausgang_gelb, HIGH);
    }
}

void loop() 
{   
    DCC.process(); // analyse DCC-signal
}

void notifyDccAccState(uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State)
//wird von DCC.process() aufgerufen, wenn ein weichenstellbefehl empfangen wurde
{        
       if (Addr == DCC_adresse+1) // weiteres signalbild eine DCC-adresse hoeher
        {
           if (OutputAddr & 0x1) 
           {  
                 if (signalbild == 3) // von gruengelb nach rot
                 {
                  signalbild = 1;
                  EEPROM.write(0, signalbild);
                  for (blendwert1 = 0; blendwert1 <= 94; blendwert1++) 
                    {
                      analogWrite(ausgang_gruen, blendarray[blendwert1]);
                      analogWrite(ausgang_gelb, blendarray[blendwert1]);
                      delayMicroseconds (7200);  
                    }
                  delay (10); // dunkeltastung zwischen den signalbildern
                  for (blendwert1 = 255; blendwert1 >= 0; blendwert1--) // einblenden schneller als ausblenden
                    {
                      analogWrite(ausgang_rot, blendwert1);
                      delayMicroseconds (500);
                    }
                  }

                  if (signalbild == 2) // von gruen nach rot
                 {
                  signalbild = 1;
                  EEPROM.write(0, signalbild);
                  for (blendwert1 = 0; blendwert1 <= 94; blendwert1++) 
                    {
                      analogWrite(ausgang_gruen, blendarray[blendwert1]);
                      analogWrite(ausgang_gelb, 255);
                      delayMicroseconds (7200);  
                    }
                  delay (10); // dunkeltastung zwischen den signalbildern
                  for (blendwert1 = 255; blendwert1 >= 0; blendwert1--) // einblenden schneller als ausblenden
                    {
                      analogWrite(ausgang_rot, blendwert1);
                      delayMicroseconds (500);
                    }
                 }         
             }  
                 
            else 
            {  
                if (signalbild == 1) // von rot nach gruengelb
                 {
                  signalbild = 3;
                  EEPROM.write(0, signalbild);
                  for (blendwert1 = 0; blendwert1 <= 94; blendwert1++) 
                    {
                      analogWrite(ausgang_rot, blendarray[blendwert1]);
                      delayMicroseconds (7200);  
                    }
                  delay (10); // dunkeltastung zwischen den signalbildern
                  for (blendwert1 = 255; blendwert1 >= 0; blendwert1--) // einblenden schneller als ausblenden
                    {
                      analogWrite(ausgang_gruen, blendwert1);
                      analogWrite(ausgang_gelb, blendwert1);
                      delayMicroseconds (500);
                    }
                  }
                  
                  if (signalbild == 2) // von gruen nach gruengelb
                 {
                  signalbild = 3;
                  EEPROM.write(0, signalbild);
                      digitalWrite(ausgang_gruen, LOW);
                      //delayMicroseconds (7200);  
                  
                  //delay (10); // dunkeltastung zwischen den signalbildern
                  for (blendwert1 = 255; blendwert1 >= 0; blendwert1--) // einblenden schneller als ausblenden
                    {
                      analogWrite(ausgang_gelb, blendwert1);
                      delayMicroseconds (500);
                    }
                  }       
              }                  
       } 
       
if (Addr == DCC_adresse) // erste adresse
        {
           if (OutputAddr & 0x1) 
           {  
                 if (signalbild == 3) // von gruengelb nach rot
                 {
                  signalbild = 1;
                  EEPROM.write(0, signalbild);
                  for (blendwert1 = 0; blendwert1 <= 94; blendwert1++) 
                    {
                      analogWrite(ausgang_gruen, blendarray[blendwert1]);
                      analogWrite(ausgang_gelb, blendarray[blendwert1]);
                      delayMicroseconds (7200);  
                    }
                  delay (10); // dunkeltastung zwischen den signalbildern
                  for (blendwert1 = 255; blendwert1 >= 0; blendwert1--)// einblenden schneller als ausblenden
                    {
                      analogWrite(ausgang_rot, blendwert1);
                      delayMicroseconds (500);
                    }
                  }
                  if (signalbild == 2) // von gruen nach rot
                 {
                  signalbild = 1;
                  EEPROM.write(0, signalbild);
                  for (blendwert1 = 0; blendwert1 <= 94; blendwert1++) 
                    {
                      analogWrite(ausgang_gruen, blendarray[blendwert1]);
                      analogWrite(ausgang_gelb, 255);
                      delayMicroseconds (7200);  
                    }
                  delay (10); // dunkeltastung zwischen den signalbildern
                  for (blendwert1 = 255; blendwert1 >= 0; blendwert1--) // einblenden schneller als ausblenden
                    {
                      analogWrite(ausgang_rot, blendwert1);
                      delayMicroseconds (500);
                    }
                  }
             }  
                 
            else // von rot nach gruen
            {  
                if (signalbild == 1) 
                 {
                  signalbild = 2;
                  EEPROM.write(0, signalbild);
                  for (blendwert1 = 0; blendwert1 <= 94; blendwert1++) 
                    {
                      analogWrite(ausgang_rot, blendarray[blendwert1]);
                      delayMicroseconds (7200);  
                    }
                  delay (10); // dunkeltastung zwischen den signalbildern
                  for (blendwert1 = 255; blendwert1 >= 0; blendwert1--) // einblenden schneller als ausblenden
                    {
                      analogWrite(ausgang_gruen, blendwert1);
                      analogWrite(ausgang_gelb, 255);
                      delayMicroseconds (500);
                    }
                  }
               
                  if (signalbild == 3) // von gruengelb nach gruen
                 {
                  signalbild = 2;
                  EEPROM.write(0, signalbild);
                  digitalWrite(ausgang_gruen, LOW);
                  for (blendwert1 = 0; blendwert1 <= 94; blendwert1++) 
                    {
                      analogWrite(ausgang_gelb, blendarray[blendwert1]);
                      delayMicroseconds (7200); 
                    }
                  }  
              }    
        }
}     

=> * - netzteil: einweggleichrichtung ohne puffer, ggf. hochfrequenzsiebung. alternativ: brueckengleichrichter, elko 10µF/25V, ggf. sicherung 2A, ggf. vorwiderstand Attiny85 100Ω/2W (47 - 200Ω)
*

    • vorwiderstand 22kΩ - 27kΩ fuer commandleitung

The guy recommends a 100Ω/2W in serie before the VIN

And the schematic could be close to this:

thanks in advance

Sorry but all comments in your code and after it are in the language that unknown to me. Deutsch?

And I am wondering what the code can has to do with the question about powering your board

Yes it is in german and I want to replace the PIC by an attiny85 digispark. To adpat this schematic to the skecth the guy recommends to put a 100Ω/2W before the vin of the digispark. I try to calibrate this at best and my question is how to take the good resistor to avoid arttiny85 heats up too much. Do you think 100Ω/2W is ok to dissipate enough ?

If you want to avoid heats up - why do you power it with 20v supply?

good question. because the power is coming from rails with something close to AC (this is a DCC signal pulsed by a booster). The AC power is 20V and rectified tobe used.

In your case, it is better to use an external voltage converter, lowering 20v to 7-9v, or even better - immediately to 5v and powering the digispark through pin 5v.
It is undesirable to use a resistor for this, although it is possible.

understood.

what kind of converter dou have in mind?

sorry, I don't have any link right now

Are you sure it is ATtiny that heats up and not the regulator?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.