Servus,
Im Zuge meines aktuellen Projekts ist bei mir ein seltsames Problem aufgetaucht:
Um mit dem Tiny ein IR NEC Code dekodiren zu können habe ich nachfolgendes Programm geschrieben.
Zum Debuggen usw. habe ich das mit meim IR-Empfänger und Arduino getestet (wegen Serial ...), wo es auch gut funktioniert.
Das Problem ist nun, das es auf meinem Tiny45 (interner 8MHz Oszi mit Vorteiler 8) überhaupt nicht funktioniert.
Ich hab ne LED an den Pin über welchen die Debug-Funktion läuft angeschlossen und das Ganze laufen lassen,
mir ist aufgefallen, dass er bereits beim ersten Bit die Funktion (getNecCode()) abbricht und das immer egal bei welcher Taste.
Weiß jemand zufällig wo das Problem sitzt, das einzige was mir noch in den Kopf kommt ist, dass der Ram aufgebraucht ist
das kann ich mir aber nicht vorstellen o_O:
#define PIN_DATA 4
#define PIN_CHAN_POW 1
#define PIN_CHAN_CDD 0
#define NEC_START_MIN 8500
#define NEC_START_MAX 9500
#define NEC_PAUSE_MIN 4000
#define NEC_PAUSE_MAX 5000
#define NEC_BRUST_MIN 480
#define NEC_BRUST_MAX 640
#define NEC_ONE_MIN 480
#define NEC_ONE_MAX 640
#define NEC_ZERO_MIN 1610
#define NEC_ZERO_MAX 1770
#define CODE_ON 0x4DB242FF
#define CODE_OFF 0x4CB342FF
#define CODE_CD 0x4FB042FF
boolean error;
void setup()
{
pinMode(PIN_DATA, INPUT);
pinMode(PIN_CHAN_POW, OUTPUT);
pinMode(PIN_CHAN_CDD, OUTPUT);
}
void loop()
{
if(isNecCode() == true)
{
unsigned long res = getNecCode();
if(error == false)
{
if(res == CODE_ON)
turnOn();
else if(res == CODE_OFF)
turnOff();
else if(res == CODE_CD)
cdOpenClose();
debug(3);
}
else
{
error = false;
}
}
}
//Stellt fest ob es ein NecCode ist
boolean isNecCode()
{
unsigned long startTime = micros();
while(digitalRead(PIN_DATA) == LOW);
startTime = micros() - startTime;
if(startTime > NEC_START_MIN && startTime < NEC_START_MAX)
{
startTime = micros();
while(digitalRead(PIN_DATA) == HIGH);
startTime = micros() - startTime;
if(startTime > NEC_PAUSE_MIN && startTime < NEC_PAUSE_MAX)
return true;
else
return false;
}
return false;
}
//Entschlüsselt ein einzelnes Bit
unsigned long getBit()
{
unsigned long startTime = micros();
while(digitalRead(PIN_DATA) == LOW);
startTime = micros() - startTime;
if(startTime > NEC_BRUST_MIN && startTime < NEC_BRUST_MAX)
{
startTime = micros();
while(digitalRead(PIN_DATA) == HIGH)
{
if(micros() - startTime > NEC_ZERO_MAX) break;
}
startTime = micros() - startTime;
if(startTime > NEC_ONE_MIN && startTime < NEC_ONE_MAX)
return 1;
else if(startTime > NEC_ZERO_MIN && startTime < NEC_ZERO_MAX)
return 0;
else
return startTime;
}
return startTime;
}
//Gibt den NEC Code zurrück
unsigned long getNecCode()
{
unsigned long result = 0;
for(int i = 0; i < 32; i++)
{
unsigned long tempBit = getBit();
if(tempBit == 1) {
result |= (1UL << i);
} else if(tempBit == 0) {
} else if(tempBit != 0) {
if(result > 10)
debug(2);
else
debug(1);
error = true;
break;
}
}
return result;
}
//Schaltet die Konsole an
void turnOn()
{
digitalWrite(PIN_CHAN_POW, HIGH);
delay(100);
digitalWrite(PIN_CHAN_POW, LOW);
}
//Schaltet die Konsole aus
void turnOff()
{
digitalWrite(PIN_CHAN_POW, HIGH);
delay(3000);
digitalWrite(PIN_CHAN_POW, LOW);
}
//CD-Laufwerk auf/zu
void cdOpenClose()
{
digitalWrite(PIN_CHAN_CDD, HIGH);
delay(100);
digitalWrite(PIN_CHAN_CDD, LOW);
}
void debug(int num)
{
for(int i = 0; i < num; i++)
{
digitalWrite(PIN_CHAN_CDD, HIGH);
delay(1000);
digitalWrite(PIN_CHAN_CDD, LOW);
delay(1000);
}
}