Home

Awesome

<div align = center>

Attiny Serial Out

Minimal bit-bang send serial. 115200 baud for 1/8/16 MHz ATtiny clock.<br/>

Badge License: GPLv3     Badge Version     Badge Commits since latest     Badge Build Status     Badge Hit Counter <br/> <br/> Stand With Ukraine

Available as Arduino library "ATtinySerialOut".

Button Install     Button Changelog

</div>

If you find this library useful, please give it a star.

🌎 Google Translate

<br/>

Features

<br/>

Serial functions provided (linefeed is \n instead of \r\n):

    void print(const __FlashStringHelper *aStringPtr);
    void print(const char *aStringPtr);
    void print(char aChar);
    void print(uint8_t aByte, uint8_t aBase = 10);
    void print(int16_t, uint8_t aBase = 10);
    void print(uint16_t aInteger, uint8_t aBase = 10);
    void print(uint32_t aLong, uint8_t aBase = 10);
    void print(uint32_t aLong, uint8_t aBase = 10);
    void print(double aFloat, uint8_t aDigits = 2);

    void printHex(uint8_t aByte); // with 0x prefix

    void println(const __FlashStringHelper *aStringPtr);
    void println(char aChar);
    void println(uint8_t aByte, uint8_t aBase = 10);
    void println(int16_t aInteger, uint8_t aBase = 10);
    void println(uint16_t aInteger, uint8_t aBase = 10);
    void println(int32_t aLong, uint8_t aBase = 10);
    void println(uint32_t aLong, uint8_t aBase = 10);
    void println(double aFloat, uint8_t aDigits = 2);

    void println(void);
<br/>

Example

#include <Arduino.h>

#if defined(__AVR_ATtiny87__) || defined(__AVR_ATtiny167__)
#define TX_PIN PIN_PA1 // (package pin 2 / TXD on Tiny167) - can use one of PIN_PA0 to PIN_PA7 here
#else
#define TX_PIN PIN_PB2 // (package pin 7 on Tiny85) - can use one of PIN_PB0 to PIN_PB4 (+PIN_PB5) here
#endif

void setup(void) {
    initTXPin();
    Serial.println(F("START " __FILE__ " from " __DATE__ "\r\nUsing library version " VERSION_ATTINY_SERIAL_OUT));
    writeString("OSCCAL=");
    writeUnsignedByteHexWithPrefix(OSCCAL);
}
void loop() {
}

Using the new *.hpp files

In order to support compile options more easily, the line #include <ATtinySerialOut.h> must be changed to #include <ATtinySerialOut.hpp> in your main program (aka *.ino file with setup() and loop()).

In all other files you must use #include <ATtinySerialOut.h>, to prevent multiple definitions linker errors:

If you forget to include ATtinySerialOut.hpp, you will see errors like ATtinySerialOutExample.cpp:38: undefined reference to initTXPin()`.

<br/>

Compile options / macros for this library

To customize the library to different requirements, there are some compile options / macros available.<br/> These macros must be defined in your program before the line #include <TinySerialOut.hpp> to take effect.<br/> Modify them by enabling / disabling them, or change the values if applicable.

NameDefault valueDescription
TX_PINPIN_PB2 (PIN_PA1 for ATtiny87/167)The pin to use for transmitting bit bang serial. These pin names are valid for ATTinyCore and may be different in other cores.
TINY_SERIAL_DO_NOT_USE_115200BAUDdisabledTo force using other baud rates. The rates are 38400 baud at 1 MHz (which has smaller code size) or 230400 baud at 8/16 MHz.
TINY_SERIAL_INHERIT_FROM_PRINTdisabledIf defined, you can use this class as a replacement for standard Serial as a print class e.g. for functions like void prinInfo(Print *aSerial). Increases program size.
<br/>

OpenWindowAlarm example

This example issues an alarm if the chip sensor detect a falling teperarure and is fully documented here

<br/>

Troubleshooting

Error call of overloaded 'println(fstr_t*)' is ambiguous

Please use the new Digistump core. Since version 1.2.0, the library is no longer compatible with the old cores supplied by digistump.

Error type 'TinySerialOut' is not a base type for type 'TwoWire' using Print::write;

Reason: Another class, e.g. ATTinyCore class TwoWire : public Stream uses the Print class or a Print method, but Print is normally redefined by ATtinySerialOut. You must define TINY_SERIAL_INHERIT_FROM_PRINT before including ATtinySerialOut.hpp, to avoid this error.

<br/>

Revision History

Version 2.3.0

Version 2.2.1

Version 2.2.0

Version 2.1.1

Version 2.1.0

Version 2.0.0 - 09/2021

Version 1.2.2 - 03/2021

Version 1.2.1 - 10/2020

Version 1.2.0 - 7/2020

Version 1.1.0 - 5/2020

Version 1.0.5 - 3/2020

Version 1.0.4 - 1/2020

Version 1.0.3

Version 1.0.2

Version 1.0.1

Version 1.0.0

Initial Arduino library version.

Remark

C version of serial code is included for better understanding, but assembler version is used. This is because for the C code the timing depends on compiler optimisation switches. You should get the right timing if you compile the C code it with Arduino standard settings or:

avr-g++ -I"C:\arduino\hardware\arduino\avr\cores\arduino" -I"C:\arduino\hardware\arduino\avr\variants\standard" -c -g -w -Os -ffunction-sections -fdata-sections -mmcu=attiny85 -DF_CPU=1000000UL -MMD -o "TinySerialOut.o" "TinySerialOut.cpp"