Hi Dirk,

Zitat von
Dirk
Nebenbei: Die rechts abgebildete Empfängerschaltung (die du hoffentlich nicht verwendest!) dürfte einen dauerhaften LOW-Pegel ausgeben (Rx mit GND verbunden).

nein, den empfänger habe ich nicht verwendet, ich verwende den TSOP (angeschlossen an den drei anschlüssen) ohne zusätzliche bauteile...

Zitat von
Dirk
in dem Schaltplan erfolgt die Ansteuerung invertierend (Port HIGH, LED OFF). Der von dir verwendete Sender-Code geht von einem nicht invertierenden Treiber (Port HIGH, LED ON) aus. Optionen: Treiber ändern ODER Sender-Code ändern.
hier wäre noch die frage ob die invertierung des signals durch eine zweite transistorstufe wieder rückgängig gemacht werden kann, aber das großgeschriebene ODER suggeriert, dass die softwareänderun die einfachere lösung und daher vorzuziehen ist. Also habe ich mir viel zeit genommen und ausgiebig experimentiert
, allerdings ohne den durchschlagenden erfolg:
hier habe ich den anfangszustand der globalen variablen wahlweise geändert:
Code:
// Globale Variablen für den Timer-Interrupt
volatile uint8_t pinZustand = HIGH;
volatile uint8_t sendenAn = false;
hier sehe ich keine möglichkeit für änderungen, es dreht sich alles mehr oder weniger nur um die einstellungen für die 36khz:
(oder sollte der interrupt ausgelöst werden wenn " Stimmen OCR1A und Timer NICHT überein, wird der Interrupt ausgelöst"?)
Code:
void setup()
{
pinMode(8, OUTPUT);
// IRLED ist ein Ausgabe-Pin
pinModeFast(IRLED, OUTPUT);
pinMode(9, OUTPUT);
noInterrupts(); // Jetzt keine Interrupts
TIMSK1 |= (1<<OCIE1A); // Timer 1 Output Compare A Match Interrupt Enable
TCCR1A = 0; // "Normaler" Modus
// WGM12: CTC-Modus einschalten (Clear Timer on Compare match)
// Stimmen OCR1A und Timer überein, wird der Interrupt
// ausgelöst
// Bit CS12 und CS10 setzen = Vorteiler: 8
TCCR1B = (1<<WGM12) | (1<<CS11);
// Frequenz = 16000000 / 8 / 28 = rd. 71,428kHz, da jeweils an- und aus-
// geschaltet wird, ergeben sich rund 36kHz Blinkfrequenz
OCR1A = 28;
interrupts(); // Interrupts wieder erlauben
}
hier habe ich die invertierung des pinzustandes wahlweise zwischen if und else geändert, bzw abgefragt ob gesendet wird "if(sendenAn)":
Code:
ISR(TIMER1_COMPA_vect)
{
noInterrupts();
if(! sendenAn) // = if(sendenAn==false)
{
// IR-LED ausschalten
digitalWriteFast(IRLED, LOW);
// Zustand der IR-LED merken
pinZustand = LOW;
interrupts();
return;
}
else
{
// IR-LED-Pin auf pinZustand schalten
digitalWriteFast(IRLED, pinZustand);
// pinZustand invertieren
pinZustand = (pinZustand == HIGH) ? LOW : HIGH;
}
interrupts();
}
hier in der hauptschleife sehe ich keine sinnvolle änderungsmöglichkeit:
Code:
void loop()
{
// Sender für 5ms ausschalten
sendenAn = false;
delay(5);
//digitalWrite(9, LOW);
// Das komplette Alphabet in Großbuchstaben senden
for(int i='A'; i<='Z'; i++)
//for(int i=1; i<=9; i++)
{
sendIR(i);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
delay(250); // Kann entfallen, hier nur, damit man auf
// dem Empfänger Zeit hat, die Buchstaben
// zu verfolgen
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
}
//digitalWrite(9, HIGH);
}
in dieser sendefunktion könnte man die an- bzw. abschaltung des 36khz signals umkehren zwischen der if und else abfrage:
Code:
void sendIR(uint8_t dataByte)
{
// Start-Bit
sendenAn = false;
delayMicroseconds(550);
sendenAn = true;
delayMicroseconds(230);
// 8 Datenbits
for(int i=0; i<8; i++)
{
// Falls LSB gesetzt...
if(dataByte & B00000001 == 1)
{
// ... 36kHz-Signal aus (Seriell = Invertierte Logik)...
sendenAn = false;
delayMicroseconds(550);
}
else
{ // ... andernfalls 36kHz-Signal an
sendenAn = true;
delayMicroseconds(230);
}
// Das nächste Bit bitte
dataByte >>= 1;
}
// Stopp-Bit
sendenAn = true;
delayMicroseconds(550);
sendenAn = false;
// kurze Pause
delay(2);
}
---------------------------------------
wie bereits oben geschrieben habe ich die verschidensten änderungen (und ihre kombinationen) mit gar keinen bzw. negativen konsequenzen ausprobiert, die einzige "positive" verhaltensänderung war die, dass die IR-LED sendet, blinkt und die "||" zeichen sendet...
bin also wieder mit meinem latein am ende...
Lesezeichen