https://aliexpress.ru/item/1005007088208938.html
https://aliexpress.ru/item/32668119796.html
Ну это в принципе понятно. Тогда вопрос развернутый более: Вот сейчас я пишу программу для 84-й тини. Можно ли с таким кодом заехать в ту же Студио, естественно прописав необходимые моменты в хедере и убрав ардуиновские Setup и Loop? Понятно, что Setup в Avr Studio вообще не будет, это по сути просто то, что однократно выполнится при запуске контроллера, а дальше основной циклт ипа While(1){} Который в ардуино иде заменен на функцию Loop(). Пример кода ниже, здесь чарлиплексинг 12-ти светодиодов на Port A и опрос 1 кнопки на Port B. Все крутится на прерывании Таймера 1, цикл Loop() не используется, это пока только заготовка, хотя код в железе работает отлично и без нареканий:OKF писал(а):Свой, тебе удобный ввод/вывод пишется отдельно, в хедере. И оформляется в виде define или online. Тогда исходный текст будет один и тот же, что в Ардуино, что в Студии. И просто переносится на другие платформы, тот же ПИК хотя бы, без какого либо изменения в исходнике.
Код: Выделить всё
byte blue_dat[6] = { 0x02, 0x02, 0x01, 0x04, 0x02, 0x01 };
byte green_dat[6] = { 0x01, 0x04, 0x04, 0x08, 0x08, 0x08 };
byte led_mask[12] = { 0x03, 0x06, 0x05, 0x0C, 0x0a, 0x09, 0x03, 0x06, 0x05, 0x0C, 0x0a, 0x09 };
byte ledbuff[12];
byte maskbuff[12];
volatile byte time_val = 1;
volatile byte led_clk = 0;
volatile byte buff_step = 0;
volatile byte keylock = 0;
volatile byte deb_tmr = 0;
void setup() {
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 124;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
sei();
}
ISR(TIMER1_COMPA_vect) {
PORTA &= 0xF0;
DDRA &= 0xF0;
PORTA |= ledbuff[buff_step];
DDRA |= led_mask[buff_step];
buff_step += 1;
if (buff_step >= 12) {
buff_step = 0;
for (byte i = 0; i < time_val; i++) {
ledbuff[i] = blue_dat[i];
}
for (byte i = time_val; i < 6; i++) {
ledbuff[i] = 0x00;
}
for (byte i = 6; i < 6 + time_val; i++) {
ledbuff[i] = 0x00;
}
for (byte i = time_val + 6; i < 12; i++) {
ledbuff[i] = green_dat[i - 6];
}
if ((PINB & 0x04) == 0) {
if (deb_tmr <= 9) {
deb_tmr += 1;
}
}
if ((PINB & 0x04) != 0) {
deb_tmr = 0;
keylock = 0;
}
if (deb_tmr >= 9 && keylock != 0x01) {
keylock = 0x03;
}
if (keylock == 0x03) {
time_val += 1;
keylock = 0x01;
if (time_val > 6) {
time_val = 1;
}
}
}
}
void loop() {
}Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
void setup() {
// тут твой сетап
}
void loop() {
// тут твой луп
}
int main(void) {
setup();
while(true)
loop();
}
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(TIM0_OVF_vect) {
PORTB ^= _BV(LED_PIN); // toggle LED pin
}
int main(void) {
DDRB = 0b00000001; // set LED pin as OUTPUT
PORTB = 0b00000000; // set all pins to LOW
TCCR0B |= _BV(CS02) | _BV(CS00); // set prescaler to 1024 (CLK = 1200000Hz / 1024 / 256 = 4Hz, 0.25s)
TIMSK0 |= _BV(TOIE0); // enable Timer Overflow interrupt
sei();
while (1);
}Код: Выделить всё
int main(void) {
pinMode(LED_BUILTIN, OUTPUT);
while (1) {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
}Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
byte blue_dat[7] = { 0x02, 0x02, 0x01, 0x04, 0x02, 0x01 };
byte green_dat[6] = { 0x01, 0x04, 0x04, 0x08, 0x08, 0x08 };
byte led_mask[12] = { 0x03, 0x06, 0x05, 0x0C, 0x0a, 0x09, 0x03, 0x06, 0x05, 0x0C, 0x0a, 0x09 };
byte ledbuff[12];
byte maskbuff[12];
volatile byte time_val = 1;
volatile byte led_clk = 0;
volatile byte buff_step = 0;
volatile byte keylock = 0;
volatile byte deb_tmr = 0;
ISR(TIMER1_COMPA_vect) {
PORTA &= 0xF0;
DDRA &= 0xF0;
PORTA |= ledbuff[buff_step];
DDRA |= led_mask[buff_step];
buff_step += 1;
if (buff_step >= 12) {
buff_step = 0;
for (byte i = 0; i < time_val; i++) {
ledbuff[i] = blue_dat[i];
}
for (byte i = time_val; i < 6; i++) {
ledbuff[i] = 0x00;
}
for (byte i = 6; i < 6 + time_val; i++) {
ledbuff[i] = 0x00;
}
for (byte i = time_val + 6; i < 12; i++) {
ledbuff[i] = green_dat[i - 6];
}
if ((PINB & 0x04) == 0) {
if (deb_tmr <= 100) {
deb_tmr += 1;
}
}
if (deb_tmr >= 5 && deb_tmr < 100 && ((PINB & 0x04) != 0)) {
keylock = 0x01;
}
if (deb_tmr >= 100 && keylock == 0x00) {
keylock = 0x02;
}
if (keylock == 0x01) {
time_val += 1;
if (time_val > 6) {
time_val = 1;
}
}
if (keylock == 0x02) {
time_val -= 1;
keylock = 0x03;
if (time_val < 1) {
time_val = 6;
}
}
if ((PINB & 0x04) != 0) {
deb_tmr = 0;
keylock = 0;
}
}
}
int main(void) {
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 124;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
sei();
while (1)
;
}