Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.
Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.
const byte BlizzardPin = 7;
// typy impulsów w Blizzard
#define impSynchro 2
#define impOne 1
#define impZero 0
// typy bloków w Blizzard
#define blkSynchro 0
#define blkName 1
#define blkData 2
volatile uint8_t last_pulse_type;
volatile uint8_t actual_block_type;
volatile uint8_t last_block_type;
volatile uint16_t number_of_synchro_pulses = 0;
volatile uint8_t actual_start_bit = 0;
volatile uint16_t byte_number = 0;
volatile uint8_t byte_mask = 1;
volatile unsigned long actual_micros;
volatile unsigned long last_micros;
volatile uint16_t pulse_width;
volatile byte Blizzard_file_name[20];
void setup() {
// debug:
Serial.begin(115200);
Serial.println("Start programu.");
pinMode(BlizzardPin, INPUT_PULLUP);
PCICR |= B00000100;
PCMSK2 |= B10000000;
}
void loop() {
}
ISR (PCINT2_vect)
{
if (digitalRead(BlizzardPin) == LOW) {
actual_micros = micros();
pulse_width = actual_micros - last_micros;
if (pulse_width > 599)
// czas impulsu dłuższy niż 600us (w Blizzardzie będą to zakłócenia)
{
}
else if (pulse_width > 374)
// czas impulsu między 375us a 600us (w Blizzardzie będzie to impuls synchro)
{
if (number_of_synchro_pulses == 0) {
for(int i = 0; i < 20; ++i) {
Serial.print((char)Blizzard_file_name[i]);
}
Serial.println();
}
byte_mask = 128;
byte_number = 0;
Blizzard_file_name[0] = 0;
last_pulse_type = impSynchro;
number_of_synchro_pulses = number_of_synchro_pulses + 1;
}
else if (pulse_width > 207)
// czas impulsu między 375us a 208us (w Blizzardzie będzie to impuls "1")
{
if (byte_number < 20) {
Blizzard_file_name[byte_number] |= byte_mask;
byte_mask >>= 1;
if (byte_mask == 0) {
byte_number++;
Blizzard_file_name[byte_number] = 0;
byte_mask = 128;
}
}
last_pulse_type = impOne;
}
else if (pulse_width > 121)
// czas impulsu między 208us a 122us (w Blizzardzie będzie to impuls "0")
{
if (last_pulse_type == impSynchro)
{
if (number_of_synchro_pulses > 2048)
{
// czyli jesteśmy w bloku Synchro
actual_block_type = blkSynchro;
} else {
// czyli jesteśmy w bloku innym niż Synchro
if (actual_block_type == blkSynchro)
{
actual_block_type = blkName;
} else {
actual_block_type = blkData;
}
}
number_of_synchro_pulses = 0;
actual_start_bit = 1;
} else {
// czyli poprzedni impuls nie był impulsem synchro
if (actual_start_bit == 1)
{
actual_start_bit = 2;
} else {
// czyli skończyły się dwa bity startowe
actual_start_bit = 255;
if (byte_number < 20) {
byte_mask >>= 1;
if (byte_mask == 0) {
byte_number++;
Blizzard_file_name[byte_number] = 0;
byte_mask = 128;
}
}
}
}
last_pulse_type = impZero;
}
else
// czas impulsu krótszy niż 122us
{
}
last_micros = actual_micros;
}
}
const byte ledPin = 13;
const byte InputPin = 7;
volatile unsigned long actual_micros;
volatile unsigned long last_micros;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(InputPin, INPUT_PULLUP);
pinMode(testPin, OUTPUT);
PCICR |= B00000100;
PCMSK2 |= B10000000;
}
void loop() {
}
ISR (PCINT2_vect)
{
uint16_t pulse_length;
if (digitalRead(InputPin) == LOW) {
actual_micros = micros();
pulse_length = actual_micros - last_micros;
if (pulse_length > 300)
// czas impulsu dłuższy niż 300us (w Normalu będą to zakłócenia)
{
digitalWrite(LED_BUILTIN, LOW);
}
else if (pulse_length > 209)
// czas impulsu między 210us a 300us (w Normalu będą to impulsy składające się na "0")
{
digitalWrite(LED_BUILTIN, HIGH);
}
else if (pulse_length > 150)
// czas impulsu między 150us a 210us (w Normalu będą to impulsy składające się na "1"
// albo impulsy pilota)
{
digitalWrite(LED_BUILTIN, LOW);
}
else
// czas impulsu krótszy niż 150us
{
digitalWrite(LED_BUILTIN, LOW);
}
last_micros = actual_micros;
}
}
const byte ledPin = 13;
const byte InputPin = 7;
const byte OutputPin = 4;
// typy impulsów w Normal
#define impSpace 0
#define impMark 1
#define impNone 2
volatile unsigned long actual_micros;
volatile unsigned long last_micros;
volatile uint8_t last_pulse_type = impNone;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(OutputPin, OUTPUT);
pinMode(InputPin, INPUT_PULLUP);
PCICR |= B00000100;
PCMSK2 |= B10000000;
}
void loop() {
}
ISR (PCINT2_vect)
{
uint16_t pulse_length;
if (digitalRead(InputPin) == LOW) {
actual_micros = micros();
pulse_length = actual_micros - last_micros;
if (pulse_length > 300)
// czas impulsu dłuższy niż 300us (w Normalu będą to zakłócenia)
{
digitalWrite(LED_BUILTIN, LOW);
last_pulse_type = impNone;
}
else if (pulse_length > 209)
// czas impulsu między 210us a 300us (w Normalu będą to impulsy składające się na "0")
{
digitalWrite(LED_BUILTIN, HIGH);
if (last_pulse_type == impSpace) {
digitalWrite(OutputPin, LOW);
}
last_pulse_type = impSpace;
}
else if (pulse_length > 150)
// czas impulsu między 150us a 210us (w Normalu będą to impulsy składające się na "1"
// albo impulsy pilota)
{
digitalWrite(LED_BUILTIN, LOW);
if (last_pulse_type == impMark) {
digitalWrite(OutputPin, HIGH);
}
last_pulse_type = impMark;
}
else
// czas impulsu krótszy niż 150us
{
digitalWrite(LED_BUILTIN, LOW);
last_pulse_type = impNone;
}
last_micros = actual_micros;
}
}
const byte ledPin = 13;
const byte InputPin = 7;
const byte OutputPin = 4;
volatile unsigned long actual_micros;
volatile unsigned long last_micros;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(OutputPin, OUTPUT);
pinMode(InputPin, INPUT_PULLUP);
PCICR |= B00000100;
PCMSK2 |= B10000000;
}
void loop() {
}
ISR (PCINT2_vect)
{
uint16_t pulse_length;
if (digitalRead(InputPin) == LOW) {
actual_micros = micros();
pulse_length = actual_micros - last_micros;
if (pulse_length > 300)
// czas impulsu dłuższy niż 300us (w Normalu będą to zakłócenia)
{
digitalWrite(LED_BUILTIN, LOW);
}
else if (pulse_length > 209)
// czas impulsu między 210us a 300us (w Normalu będą to impulsy składające się na "0")
{
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(OutputPin, LOW);
}
else if (pulse_length > 150)
// czas impulsu między 150us a 210us (w Normalu będą to impulsy składające się na "1"
// albo impulsy pilota)
{
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(OutputPin, HIGH);
}
else
// czas impulsu krótszy niż 150us
{
digitalWrite(LED_BUILTIN, LOW);
}
last_micros = actual_micros;
}
}
const byte InputPin = 7;
const byte OutputPin = 4;
volatile unsigned long actual_micros;
volatile unsigned long last_micros;
volatile bool actual_DataIn = true;
void setup() {
pinMode(OutputPin, OUTPUT);
pinMode(InputPin, INPUT_PULLUP);
PCICR |= B00000100;
PCMSK2 |= B10000000;
}
void loop() {
}
ISR (PCINT2_vect)
{
uint16_t pulse_length;
// w Injektorze przełączenie wyścia następuje przy długim impulsie górnym bądź dolnym
// czyli łapiemy oba zbocza w przerwaniu PIN-Change
actual_micros = micros();
pulse_length = actual_micros - last_micros;
if (pulse_length > 186)
// czas impulsu między 187us a 325us (w Injektorze będą to impulsy długie)
{
// długi impuls w Injektorze oznacza zmianę stanu wyjścia na przeciwny
actual_DataIn = ! actual_DataIn;
digitalWrite(OutputPin, actual_DataIn);
}
last_micros = actual_micros;
}
const byte InputPin = 7;
const byte OutputPin = 4;
volatile unsigned long actual_micros;
volatile unsigned long last_micros;
volatile bool input_state;
void setup() {
pinMode(OutputPin, OUTPUT);
pinMode(InputPin, INPUT_PULLUP);
PCICR |= B00000100;
PCMSK2 |= B10000000;
}
void loop() {
}
ISR (PCINT2_vect)
{ // we catch both edges in the PIN-Change interrupt
uint16_t pulse_length;
input_state = digitalRead(InputPin);
actual_micros = micros();
pulse_length = actual_micros - last_micros;
if (pulse_length > 325)
{ // pulse time above (in the Injektor these will be random signals)
digitalWrite(OutputPin, HIGH);
}
else if (pulse_length > 186)
{ // pulse time above 187us a 325us (in the Injektor these will be long pulses)
if (input_state == LOW) {
// long impulse ended with a falling edge
digitalWrite(OutputPin, LOW);
} else {
// long pulse ended in a raising edge
digitalWrite(OutputPin, HIGH);
}
}
last_micros = actual_micros;
}
CLC ; ESPACIO
LDA 20 ; ENTRE 600
ADC #120 ; Y 4K
WAITFOR4000
CMP 20
BNE WAITFOR4000
BRATE = $02EE
CALCULORAM
SEI
LDA #$00
STA $D40E
STA $D400
STA BRATE
STA BRATE+1
LDA $D20F
AND #$10
STA $0316
STARTBIT
LDA $D20F
AND #$10
CMP $0316
BEQ STARTBIT
STA $0316
LDY #$0A
BAUDRATE
INC BRATE
LDA $D20F
AND #$10
CMP $0316
BEQ BAUDRATE
STA $0316
DEY
BNE BAUDRATE
LDY #$09
BITSDEMAS
LDA $D20F
AND #$10
CMP $0316
BEQ BITSDEMAS
STA $0316
DEY
BNE BITSDEMAS
CLC
LDA BRATE
ADC #$04
STA BRATE