Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!


#include <avr/io.h>
#include <avr/sfr_defs.h>
#include <compat/ina90.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <avr/sleep.h>
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
volatile int bit_counter=0;
volatile int byte_counter=0;
volatile int half=0;
unsigned char data_card[5][8] = {{0xFF,0xC5,0x38,0x2D,0x19,0xD1,0xC9,0x5A}, //test
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, // other cards
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}};
unsigned char data[8];
void delay_ms(int ms) { // 1.000 MHz
int i;
for (i=0; i < ms; i++) {
TCNT0=0;
while (TCNT0 < 125);
}
}
ISR(SIG_OUTPUT_COMPARE1A){
TCNT1=0;
// if(byte_counter==0) sbi(PORTB,PD1);
// else cbi(PORTB,PD1);
if (((data[byte_counter] << bit_counter)&0x80)==0x00) {
if (half==0) cbi(PORTB,PB1);
if (half==1) sbi(PORTB,PB1);
}
else {
if (half==0) sbi(PORTB,PB1);
if (half==1) cbi(PORTB,PB1);
}
half++;
if (half==2) {
half=0;
bit_counter++;
if (bit_counter==8) {
bit_counter=0;
byte_counter=(byte_counter+1)%8;
}
}
}
int main(void) {
int i;
DDRB=0xFF;
DDRC=0x00;
DDRD=0x00;
PORTC=0x00;
TCCR0 = 2; // timer0 clock/8
// TCCR1B = 2; // timer1 clock/8
TCCR1B = 3;
// OCR1A = 254;
// OCR1A = 32; //32
unsigned char sel = (PINC >> 1) & 0x07;
OCR1A = 30 + sel;
// for (i=0;i<8;i++) data[i]=data_card[sel][i];
for (i=0;i<8;i++) data[i]=data_card[0][i];
sbi(TIMSK, OCIE1A); // timer1 Output Compare A match
sei();
while (1) {
}
return 0;
}
MCU=atmega8
CC=avr-gcc
OBJCOPY=avr-objcopy
PROJECT=rfid
CFLAGS=-g -mmcu=$(MCU) -Wstrict-prototypes -Os -mcall-prologues -Wall
#-------------------
all: $(PROJECT).hex
#-------------------
$(PROJECT).hex : $(PROJECT).out
$(OBJCOPY) -R .eeprom -O ihex $(PROJECT).out $(PROJECT).hex
$(PROJECT).out : $(PROJECT).o
$(CC) $(CFLAGS) -o $(PROJECT).out -Wl,-Map,$(PROJECT).map $(PROJECT).o
$(PROJECT).o : $(PROJECT).c
$(CC) $(CFLAGS) -Os -c $(PROJECT).c
asm : $(PROJECT).c
$(CC) $(CFLAGS) -O -S $(PROJECT).c
# you need to erase first before loading the program.
# load (program) the software into the EEPROM:
load: $(PROJECT).hex
avrdude -c butterfly -P /dev/ttyUSB0 -b 115200 -p m8 -U flash\:w\:$(PROJECT).hex\:a
# uisp --erase --upload --verify if=$(PROJECT).hex -dprog=avr910 -dserial=/dev/ttyUSB0 -dspeed=115200 -dpart=auto -v=3 --hash=12
#-------------------
# different programmers and fuse programming if necessary
# uisp -dserial=/dev/ttyUSB0 -dspeed=115200 --erase --upload --verify if=$(PROJECT).hex -dprog=avr910 -v=3 --hash=12 -dpart=auto
# uisp --erase --upload --verify if=$(PROJECT).hex -dprog=dapa -v=3 --hash=12
# uisp -dprog=dapa --wr_fuse_l=0x5f --wr_fuse_h=0xd9 -v=3
#-------------------
clean:
rm -f *.o *.map *.out *.hex
#-------------------





Тоже собирал в далёком 2016, но забыл об этом отписаться. Недавно выкопал, чтобы переделать на чтение дампов с МИДИ-клавиатуры с флоповодом, и решил таки да :-)

(прикрутил еще усилитель для наушников)
К сожалению, очень много треков в моей библиотеке не смогли нормально воспроизводиться, будучи прибитыми гвоздями к кадровой развертке (с шагом 20мс)
Arduino ZX Spectrum AY Player