Прошивка Digispark ATtiny85

Здравствуйте! Помогите пожалуйста прошить ATtiny85 в Arduino IDE. С AVR первый раз сталкиваюсь. Есть готовый проект с Си кодом. Мне необходимо его или скомпилировать в hex или сразу прошить в Arduino IDE. Постоянно ошибки компиляции. С кодом тоже никогда не работал, только в графических средах разработки.

/**
 * Ballast emulator for projectors
 *
 * Emulates "3-wire", Ushio serial [and Osram serial (maybe in the future)] protocols
 *
 * Works with Attiny85 and custom optoisolator board
 *
 * Copyright (C) 2016-2018 Lauri Peltonen
 */

// Run on internal 8 MHz RC oscillator
#define F_CPU 8e6


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

// Echo RX directly to TX
//#define DEBUG_ECHO

// Blink led when data is received
#define DEBUG_LED


/**
 * Attiny85 programming pins
 *  1, /RESET     -- "input"
 *  5, PB0, MOSI  -- input
 *  6, PB1, MISO  -- output
 *  7, PB2, CLK   -- input
 *
 * Data pins used for emulator
 * Projector must be OFF for programming, so that
 * no data flows through optoisolators, since same
 * pins are used for programming and data communication
 *
 *  N  Name Ushio/Osram Flag
 *  5, PB0, RX          DIM   -- input
 *  6, PB1, TX          PWR   -- output
 *  7, PB2, Power flag  Sync  -- input
 *
 */

#define RXPIN		0x01	// Bit 1, PB0, DIM/RXD (in A)
#define TXPIN		0x02	// Bit 2, PB1, FLAG/TXD (out)
#define SYNCPIN		0x04	// Bit 3, PB2, SCI/SYNC (in B)
#define ID0		0x08	// Bit 4, PB3
#define ID1		0x10	// Bit 5, PB4

#define OUTPUTPINS	(TXPIN)
#define INPUTPINS	(RXPIN | SYNCPIN | ID0 | ID1)
#define PULLUPS		(RXPIN | SYNCPIN | ID0 | ID1)

// Timer tick indicator to set operation speed correctly
volatile uint8_t timerTriggered = 0;

// Mode, set by the ID bits
typedef enum {DEAD = 0x00, FLAG = 0x01, OSRAM = 0x02, USHIO = 0x03} mode_t;

typedef enum {IDLE, START, DATA, PARITY, STOP} uartState_t;

// Timeout if complete command is not received
#define UART_RX_TIMEOUT		480			// 480 cycles @  4x2400 baud = 50 ms

// Queries from projector to USHIO ballast, and replies to those
#define USHIO_MAX_COMMAND 	5
#define USHIO_QUERIES		5
typedef struct {
	unsigned char qLength;		// Query length
	unsigned char qData[USHIO_MAX_COMMAND];	// Query data
	unsigned char rLength;		// Reply length
	unsigned char rData[USHIO_MAX_COMMAND];	// Reply data
} ushioQuery_t;
ushioQuery_t ushioQuery[USHIO_QUERIES] = {
	{2, "\x51\x0D", 3, "\x51\x32\x0D"},
	{3, "\x4C\x46\x0D", 2, "\x41\x0D"},
	{2, "\x50\x0D", 3, "\x50\x46\x0D"},
	{2, "\x51\x0D", 3, "\x51\x32\x0D"},
	{3, "\x4C\x45\x0D", 2, "\x41\x0D"},	// TODO: This is probably wrong reply!
	};

// Receive buffer
#define UARTRXMASK		0x0F	// Buffer length = 16 bytes
uint8_t uartRxBuffer[16] = {0};
uint8_t uartRxWrite = 0;		// Write position (write to buffer)
uint8_t uartRxRead = 0;			// Read position (read from buffer)

// Transmit buffer
#define UARTTXMASK		0x0F	// Buffer length = 16 bytes
uint8_t uartTxBuffer[16] = {0x51, 0x32, 0x0D, 0x00, 0x00};
uint8_t uartTxWrite = 0;		// Write position (write to buffer)
uint8_t uartTxRead = 0;			// Read position (read from buffer, write to output)


/**
 * Interrupt handler for timer 1
 * Triggers when timer reaches the compare value
 *
 * Sets the trigger flag to 1, loops wait for this flag
 * This clears the interrupt flag
 */
ISR (TIMER1_COMPA_vect)
{
	timerTriggered = 1;
}

// This routine handles the USHIO serial communication
// USHIO driver uses a 2400 baud serial communication
// with bus idling high (1), then 1 start bit (0),
// 8 data bits (LSB first?), 1 parity bit (if data has odd 1s, then parity is 1),
// and 1 stop bit (1).
// Currently this only handles half-duplex communication, i.e. if data is received during transmit, it is not parsed
void ushioLoop(void)
{
	uint8_t rxLastBit = 0;
	uint8_t rxBit = 0;
	uartState_t uartRxState = IDLE;
	uint8_t rxParity = 0;
	uint8_t rxTick = 0;
	uint8_t readBit = 1;	// Bit number

	uint8_t txBit = 1;	// Bus idles high
	uartState_t uartTxState = IDLE;
	uint8_t txParity = 0;
	uint8_t txTick = 0;
	uint8_t writeBit = 1;	// Bit number

	uint16_t rxTimeout = 0;	// Command timeout / synchronisation

	uint8_t i, j, failed;

	while(1)
	{
		// Wait for timer, everything is done after clock pulse
		while(!timerTriggered);
		timerTriggered = 0;

		// Check status on RXD
		rxLastBit = rxBit;	// Store current bit to detect edges
		rxBit = PINB & RXPIN;

		// Write correct level (or keep existing) to TXD
#ifdef DEBUG_ECHO
		if(rxBit)
			PORTB |= TXPIN;
		else
			PORTB &= ~TXPIN;
#else
		if(txBit)
			PORTB |= TXPIN;
		else
			PORTB &= ~TXPIN;
#endif

		// Timers for read & write
		if(rxTick) rxTick--;
		if(txTick) txTick--;
		if(rxTimeout) rxTimeout--;

		// uart RX is handled only on certain ticks (when rxTick == 0)
		if(!rxTick) {
			// Also check last bit so does not trigger if
			// signal idles low for some reason
			if(uartRxState == IDLE && rxBit == 0 && rxLastBit == 1) {
				// Start bit received
				uartRxState = START;
				rxTick = 1;		// Verify start on next tick
			} else if(uartRxState == START) {
				if(rxBit == 0) {
					// Still zero -> OK, start reading
					rxParity = 0;
					readBit = 1;		// LSB first
					uartRxState = DATA;
					uartRxBuffer[uartRxWrite] = 0;		// Clear byte
					rxTick = 4;		// Read after 1 complete cycle => 2400 baud

					// Set up timeout
					if(!rxTimeout) rxTimeout = UART_RX_TIMEOUT;
				} else {
					// Glitch probably? Back to idle
					uartRxState = IDLE;
					rxTick = 0;
				}
			} else if(uartRxState == DATA) {
				// Handle data bits
				// Turn bit to 1 if data bus was high
				if(rxBit) {
					uartRxBuffer[uartRxWrite] |= readBit;
					rxParity ^= 1;		// Toggle expected parity bit (even parity)
				}
				readBit <<= 1;		// Next bit
				if(!readBit) {
					// Overflow -> last bit was just read
					uartRxState = PARITY;		// Next up is parity bit
					uartRxWrite = (uartRxWrite + 1) & UARTRXMASK;	// Change write position in buffer
				}

				rxTick = 4;			// Schedule next bit
			} else if(uartRxState == PARITY) {
				// Parity bit, currently do not care
				if(rxBit != rxParity) {;}	// TODO: Handle parity error?
				uartRxState = STOP;
				rxTick = 4;
			} else {
				// Stop bit
				if(!rxBit) {;} 		// TODO: If no STOP bit, handle the error?
				uartRxState = IDLE;
				rxTick = 0;		// Next falling edge instantaneously trigs new receive
			}
		}

		// TX is handled similarly, but is a bit simpler
		if(!txTick) {
			txTick = 4;		// Everything happens at the same baud rate

			if(uartTxState == START) {
				txBit = 0;			// Start bit always low
				writeBit = 1;
				txParity = 0;
				uartTxState = DATA;
			} else if(uartTxState == DATA) {
				// Handle data bits
				if(uartTxBuffer[uartTxRead] & writeBit) {
					txBit = 1;
					txParity ^= 1;		// Toggle expected parity bit (even parity)
				} else {
					txBit = 0;
				}
				writeBit <<= 1;		// Next bit
				if(!writeBit) {
					// Overflow -> last bit was just read
					uartTxState = PARITY;		// Next up is parity bit
					uartTxRead = (uartTxRead + 1) & UARTTXMASK;	// Change read position in buffer
				}
			} else if(uartTxState == PARITY) {
				// Send parity bit
				txBit = txParity;
				uartTxState = STOP;
			} else {
				// Stop bit
				txBit = 1;		// Stop bit always high
				uartTxState = IDLE;
			}
		}

		// Get ready to send next byte if in buffer
		if(uartTxState == IDLE) {
			if(uartTxRead < uartTxWrite) {
				// New data in buffer
				uartTxState = START;	// Start sending
			} else {
				// Clear buffer
				uartTxRead = 0;
				uartTxWrite = 0;
			}
		}

		// Check received data and send response if necessary
		if(uartRxState == IDLE && uartRxWrite > 0) {
			// Bytes in buffer and bus is idle
			// Check if any message matches the received data

			failed = 0;
			for(i=0; i<USHIO_QUERIES; i++){
				failed &= 0xFE;		// Clear lowest bit
				if(uartRxWrite >= ushioQuery[i].qLength) {
					// Received enough bytes, check contents
					for(j=0; j<ushioQuery[i].qLength; j++) {
						if(uartRxBuffer[j] != ushioQuery[i].qData[j]){
							failed |= 0x01;		// bit 1 => this data did not match
							break;
						}
					}

					if(!(failed & 0x01)) {
						// All bytes match -> add response to buffer

						// Check that buffer has space
						if(UARTTXMASK > uartTxWrite + ushioQuery[i].rLength) {
							for(j=0; j<ushioQuery[i].rLength; j++) {
								// Append response to buffer
								uartTxBuffer[uartTxWrite++] = ushioQuery[i].rData[j];
							}
						}

						// Clear fail bit to indicate that the message was handled
						// Ie RX buffer can be cleared even though some messages may be longer still
						failed = 0;

						// Break out of the for loop
						break;
					}
				} else {
					failed |= 0x02; // Some messages are longer than what is received so far
				}
			}

			// Messages were checked
			// Clear receive buffer if message was handled or no longer messages are expected
			// Also clear the receive buffer if message has timeout'd
			if(failed == 0 || !(failed & 0x02) || rxTimeout == 0) {
				uartRxWrite = 0;
				uartRxRead = 0;
				rxTimeout = 0;	// Ready for next messages that were not timeout'd before
			}
		}
	}
}



// This routine handles the OSRAM serial communication
// TODO: To be implemented
void osramLoop(void)
{
	while(1)
	{
		;
	}
}

// This routine handles the simple lamp on / dim / flag communication scheme
void flagLoop(void)
{
	uint8_t pin_status = 0;
	uint8_t lamp_on = 0;
	uint8_t dim_on = 0;

	while(1)
	{
		// Wait for timer, just to not run as fast as possible
		while(!timerTriggered);
		timerTriggered = 0;

		pin_status = PINB;

		// Check DIM/RXD; if pin is low, then dim the lamp
		if(!(pin_status & RXPIN))  {
			dim_on = 1;
		} else {
			dim_on = 0;
		}

		// Check SCI/Sync
		// If pin is low, turn lamp ON
		// Flag follows the request to turn on the light immediately
		if(!(pin_status & SYNCPIN))
		{
			lamp_on = 1;
			PORTB |= TXPIN;
		} else {
			lamp_on = 0;
			PORTB &= ~TXPIN;
		}

	}
}

/**
 * Main function
 *
 */
int main(void)
{
	uint8_t modeBits = 0;

	// Default mode
	mode_t operationMode = DEAD;

	// Set clock speed to 8 MHz
	// By default the internal RC is 8 MHz
        CLKPR = (1 << CLKPCE);  	// Enable prescaler change
        CLKPR = 0;      		// Prescale to 1 => 8 MHz

	// Initialize everything as input with pull-ups
	// Internal pull-up on I/Os is 20...50 kOhm
	// So if pulled low with e.g. 4.7 k will result in 0.2 V minimum
	// Must be less than about 1.3 V to read as 0 -> OK
	DDRB = 0;	// All pins as input

	// Enable pull-ups on other pins than TX (input pins)
	// since the input signals idle high
	// This is also needed to ensure USHIO mode if no external resistors on pins
	PORTB = PULLUPS;

	_delay_ms(1);	// Wait 1 ms to ensure pull-ups are stable

	// Read GPIO to determine operation mode
	// ID0 sets the bit 0, ID1 sets bit 1
	modeBits = PINB & (ID0 | ID1);
	operationMode = ((modeBits & ID0) ? 0x01 : 0x00) | ((modeBits & ID1) ? 0x02 : 0x00);

	// If operation mode is DEAD (e.g. for debugging with external
	// hardware in the RX/TX pins, hang here)
	// Also disable the pull-ups just in case
	if(operationMode == DEAD) {
		PORTB = 0x00;	// Disable pull-ups
		while(1);	// Stay, dog
	}

	// Set GPIO outputs on port B
	// 1 = Output, so set only TXPIN
	// PORTB is already 0 so output goes low without glitch
	DDRB = OUTPUTPINS;

	// Configure timer
	// For Osram 9600 baud this is 4 ticks/bit, for Ushio 2400 baud 16 ticks/bit
        TCCR1 = 0;		// Reset timer value
        TCNT1 = 0;		// Preset timer value to 0
        GTCCR = (1 << PSR1);	// Reset the prescaler

	// Select the clock speed
	if(operationMode == OSRAM) {
	        OCR1A = 26;		// 26 us (9600 bps/4) for OSRAM
	        OCR1C = 26;
	} else {
	        OCR1A = 104;		// 104 us (2400 bps/4) for others
	        OCR1C = 104;
	}

        TIMSK = (1 << OCIE1A);	// Enable interrupt on compare 0A match

        // Start the timer in compare output mode
        // PLLCSR = (1 << PLLE) | (1 << PLOCK);
        TCCR1 = (1 << CTC1) | (1 << CS12);   // Prescaler, tick is CLK / 8 = 1 MHz

	// Enable global interrupts
	sei();

	// Select correct operation loop
	switch(operationMode) {
	case USHIO:
		ushioLoop();
		break;
	case OSRAM:
		osramLoop();
		break;
	case FLAG:
		flagLoop();
		break;
	case DEAD:
	default:
		break;
	}

	while(1);	// Loop forever, should not end here

	return 0;
}

https://github.com/zanppa/ballast-emulator?ysclid=m32dywaig0141500283

Arduino IDE 1.8.19 ATtinyCore Micronucleus/DigiSpark компилируется, правда с предупреждениями

а у меня вот это - Arduino: 1.8.19 (Windows 7), Плата:“Digispark (Default - 16.5mhz)”

C:\Users\Aleksey\Documents\Arduino\sketch_nov03a\sketch_nov03a.ino: In function ‘int main()’:

sketch_nov03a:392:52: error: invalid conversion from ‘int’ to ‘mode_t’ [-fpermissive]

operationMode = ((modeBits & ID0) ? 0x01 : 0x00) | ((modeBits & ID1) ? 0x02 : 0x00);

                                                ^

exit status 1

invalid conversion from ‘int’ to ‘mode_t’ [-fpermissive]

Держи, все как в скетче выставлено

:100000000EC028C027C027C025C024C023C022C0DE
:1000100021C020C01FC01EC01DC01CC01BC0112499
:100020001FBECFE5D2E0DEBFCDBF10E0A0E6B0E05E
:10003000E8E5F3E002C005900D92AC3AB107D9F7BC
:1000400020E0ACEAB0E001C01D92A03CB207E1F7AD
:1000500011D080C1D5CF1F920F920FB60F921124ED
:100060008F9381E08093BF008F910F900FBE0F9010
:100070001F90189580E886BD16BC17BA8DE188BB25
:100080008FEC97E00197F1F700C0000086B388710C
:1000900090E0D3E095958795DA95E1F7009711F414
:1000A00018BAFFCF22E027BB10BE1FBC2CBD2AE12F
:1000B0008230910509F028E62EBD2DBD20E429BF30
:1000C00024E820BF78948230910509F42FC103976A
:1000D00051F08091BF008823E1F31092BF00B299E4
:1000E00026C1C19AF6CF90E080E0BB24B39420E013
:1000F000A12CB0E0A0E061E02224239430E0F0E005
:10010000E0E040E09924939482C0C1988DC0E13032
:10011000F10581F4311033C0E091BE00F0E0E2550A
:10012000FF4F1082009741F12224239434E0E2E053
:10013000F0E08EC0E230F105C9F4332049F040917F
:10014000BE0050E042555F4FEA01388132293883C2
:10015000220C34E009F07CC03091BE003F5F3F705C
:100160003093BE0034E0E3E0F0E072C0339739F43E
:1001700034E0E4E0F0E06CC080EE91E0D5CFF0E058
:10018000E0E066C044E021E0139751F42A2D44E0FA
:10019000A4E0B0E07DC0422F262F109709F078C070
:1001A0006091AD005091AC00A1E0B0E0651708F49B
:1001B0006FC01092AD001092AC00B0E0A0E068C03B
:1001C000A12CBB24B39444E0A2E0B0E061C044E0C1
:1001D0005FC0839479C0EB018991BE01052F10E0C7
:1001E000005A1F4FE80188839F5F95C052E00F5F60
:1001F0001F4F645F7F4F0530110509F056C051FF56
:1002000090C0009709F48DC0622F242F432D509188
:10021000BF005523E1F31092BF00C6B3C1703C2E5E
:10022000662309F472CFC19A311131502111215046
:10023000009709F0019731110BC0309709F067CF93
:10024000311006C0342F413019F431E0E1E0F0E024
:100250002111A1CFA130B10509F4B2CFA230B1056F
:1002600009F090CF4091AD00642F70E0605A7F4F4D
:10027000EB0158815B2111F0A92421E0BB0C09F0AE
:10028000A6CF4F5F4F704093AD0044E0A3E0B0E0D5
:10029000309709F0B9CF7090BE00772009F4B4CF41
:1002A00060E770E010E000E050E0EB016880761459
:1002B00008F49CCF5E7FCEEACC2EC0E0DC2E7B0122
:1002C000DFEFED1AFD0A812C681451F0E601499028
:1002D0006E01E70159907E01451409F47ACF51600F
:1002E00050FD85CFF090AC00C8016CE070E021D0EB
:1002F00080599F4FEC01EE806F2D6E0D7727771F91
:100300006F30710574F4C8016CE070E012D0BC016C
:1003100069587F4F90E05F2D590FE9125CCF5093E1
:10032000AC001092BE0090E080E06ECFFFCFC1988D
:10033000D0CE0024552704C0080E591F880F991FDE
:10034000009729F076956795B8F37105B9F7802D78
:08035000952F0895F894FFCFEA
:1003580051320D0000000000000000000000000005
:1003680002510D0000000351320D0000034C460DF0
:10037800000002410D00000002500D000000035073
:10038800460D000002510D0000000351320D00001F
:0C039800034C450D000002410D00000068
:00000001FF
:100000000EC028C027C027C025C024C023C022C0DE
:1000100021C020C01FC01EC01DC01CC01BC0112499
:100020001FBECFE5D2E0DEBFCDBF10E0A0E6B0E05E
:10003000E8E5F3E002C005900D92AC3AB107D9F7BC
:1000400020E0ACEAB0E001C01D92A03CB207E1F7AD
:1000500011D080C1D5CF1F920F920FB60F921124ED
:100060008F9381E08093BF008F910F900FBE0F9010
:100070001F90189580E886BD16BC17BA8DE188BB25
:100080008FEC97E00197F1F700C0000086B388710C
:1000900090E0D3E095958795DA95E1F7009711F414
:1000A00018BAFFCF22E027BB10BE1FBC2CBD2AE12F
:1000B0008230910509F028E62EBD2DBD20E429BF30
:1000C00024E820BF78948230910509F42FC103976A
:1000D00051F08091BF008823E1F31092BF00B299E4
:1000E00026C1C19AF6CF90E080E0BB24B39420E013
:1000F000A12CB0E0A0E061E02224239430E0F0E005
:10010000E0E040E09924939482C0C1988DC0E13032
:10011000F10581F4311033C0E091BE00F0E0E2550A
:10012000FF4F1082009741F12224239434E0E2E053
:10013000F0E08EC0E230F105C9F4332049F040917F
:10014000BE0050E042555F4FEA01388132293883C2
:10015000220C34E009F07CC03091BE003F5F3F705C
:100160003093BE0034E0E3E0F0E072C0339739F43E
:1001700034E0E4E0F0E06CC080EE91E0D5CFF0E058
:10018000E0E066C044E021E0139751F42A2D44E0FA
:10019000A4E0B0E07DC0422F262F109709F078C070
:1001A0006091AD005091AC00A1E0B0E0651708F49B
:1001B0006FC01092AD001092AC00B0E0A0E068C03B
:1001C000A12CBB24B39444E0A2E0B0E061C044E0C1
:1001D0005FC0839479C0EB018991BE01052F10E0C7
:1001E000005A1F4FE80188839F5F95C052E00F5F60
:1001F0001F4F645F7F4F0530110509F056C051FF56
:1002000090C0009709F48DC0622F242F432D509188
:10021000BF005523E1F31092BF00C6B3C1703C2E5E
:10022000662309F472CFC19A311131502111215046
:10023000009709F0019731110BC0309709F067CF93
:10024000311006C0342F413019F431E0E1E0F0E024
:100250002111A1CFA130B10509F4B2CFA230B1056F
:1002600009F090CF4091AD00642F70E0605A7F4F4D
:10027000EB0158815B2111F0A92421E0BB0C09F0AE
:10028000A6CF4F5F4F704093AD0044E0A3E0B0E0D5
:10029000309709F0B9CF7090BE00772009F4B4CF41
:1002A00060E770E010E000E050E0EB016880761459
:1002B00008F49CCF5E7FCEEACC2EC0E0DC2E7B0122
:1002C000DFEFED1AFD0A812C681451F0E601499028
:1002D0006E01E70159907E01451409F47ACF51600F
:1002E00050FD85CFF090AC00C8016CE070E021D0EB
:1002F00080599F4FEC01EE806F2D6E0D7727771F91
:100300006F30710574F4C8016CE070E012D0BC016C
:1003100069587F4F90E05F2D590FE9125CCF5093E1
:10032000AC001092BE0090E080E06ECFFFCFC1988D
:10033000D0CE0024552704C0080E591F880F991FDE
:10034000009729F076956795B8F37105B9F7802D78
:08035000952F0895F894FFCFEA
:1003580051320D0000000000000000000000000005
:1003680002510D0000000351320D0000034C460DF0
:10037800000002410D00000002500D000000035073
:10038800460D000002510D0000000351320D00001F
:0C039800034C450D000002410D00000068
:00000001FF

А Вы не могли бы мне это в hex файле скинуть? а то что то не получается правильно сохранить. и вопрос по фьюзам, что и как выставлять?

а это hex и есть, копируешь и сохрани в hex файл, по фьюзам 8 мегагерц внутренний RC как в скетче прописано, точнее не скажу, я в них не шарю - может так

avrdude.conf -v -pattiny85 -cstk500v1 -PCOM3 -b19200 -e -Uefuse:w:0xFF:m -Uhfuse:w:0b11010111:m -Ulfuse:w:0xE2:m -Uflash:w:D:\packages\ATTinyCore\hardware\avr\1.5.2/bootloaders/empty/empty_all.hex:i 

а почему же у меня не компилируется?

в этом форуме все хрустальный шар используют, а у меня его нет (

Компилируется с первого раза с одним предупреждением даже для 25 тиньки
Скетч использует 928 байт (45%) памяти устройства. Всего доступно 2048 байт.
Глобальные переменные используют 96 байт (75%) динамической памяти, оставляя 32 байт для локальных переменных. Максимум: 128 байт.

Arduino: 1.8.19 (Windows 7), Плата:“Digispark (Default - 16.5mhz)”

C:\Users\Aleksey\Documents\Arduino\sketch_nov03a\sketch_nov03a.ino: In function ‘int main()’:

sketch_nov03a:392:52: error: invalid conversion from ‘int’ to ‘mode_t’ [-fpermissive]

operationMode = ((modeBits & ID0) ? 0x01 : 0x00) | ((modeBits & ID1) ? 0x02 : 0x00);

^

exit status 1

invalid conversion from ‘int’ to ‘mode_t’ [-fpermissive]

Ну так поставьте ядро

и будет вам счастье

1 лайк
Спойлер

Про #4

HEX это уже готовая прошивка , подключаем программатор и вперёд.

Да, частоту выставите, какую надо( это к #12).

Если, всё равно, каким-то чудом не получится, измените немного стр 369

 int/*mode_t */operationMode = DEAD;

Клевета!

На этом форуме запрещены как хрустальные шары, так и хрусталь для их производства.

Запрет относит к древнему хтоническому божеству @Клапауций, которого здесь уже много лет никто не видел и которое стало страшной, леденящей кровь, легендой. Но от этого запреты только крепче.

4 лайка

Это уже не запреты, это табу.

Возникла ошибка при загрузке http://drazzy.com/package_drazzy.com_index.json

Возникла ошибка при загрузке https://drazzy.com/package_drazzy.com_index.json

есть такое дело, сейчас даже если ссылку поправить на https не загрузит поддержку, тогда ручками поддержку докинь, ссылка в настройках должна остаться, нак сайте протухший сертификат - Tue, 22 Oct 2024 17:49:52 GMT

подскажете как?

на Гитхабе ядро лежит тут

там и инструкция, сказать чего-то большего мне нечего:

Manual Installation
Option 1: Download the .zip, extract, and place in the hardware folder inside your sketchbook folder (if there is no hardware folder, create it). You can find/set the location of the sketchbook folder in the Arduino IDE at File > Preferences -> Sketchbook location.

Option 2: Download the github client, and sync this repo to the hardware subfolder of your sketchbook folder.

core installation