www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 36khz für ir- kollisionssystem


Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, bin gerade dabei ein 36khz signal zu programmieren. ich brauche 
es zur ansteuerung meiner ir- sendedioden.

jetzt will ich erst mal nur wissen ob ich es so machen kann bzw. so die 
richtige frequenz erzeugen kann:

 TCCR1B =  (0 << ICNC1)
         | (0 << ICES1)
         | (0 << WGM13)
         | (1 << WGM12)
         | (0 << CS12)
         | (0 << CS11)
         | (1 << CS10);

   OCR1A = 444;


  TIMSK |= (1 << OCIE1A);


  sei();



ISR(TIMER1_COMPA_vect)
  {DDRX |= (1 << x);
  PORTX ^= (1<<x);
}

mfg andi

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja bevor ich es vergesse. die taktfrequenz meines mikrocontrollers 
liegt bei 16 MHZ.

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
controller ist ein atmega 32

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Zusammenhang mit Timern ist es gelegentlich interessant, mit welcher 
Frequenz der Controller betrieben wird...

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da kam dein Post meinem in die Quere...

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
16 MHz direkt als Takt fürn Timer
mit nem Teilfaktor von 444 ergibts sich 36 kHz.
müsste passen

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>OCR1A = 444;

Ich komme auf 221.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich habe ja einen prescaler von 1.
und wenn ich 16000000 durch 444 teile komme ich auf 36000 .

kann man das so ausrechnen?

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Interrupt-Routine muss aber mit 72000 Hz aufgerufen werden. Spess 
hat schon recht. Es wird ja nur der Zustand der LED umgeschaltet - das 
muss zweimal gemacht werden für einen vollständigen Puls.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>also ich habe ja einen prescaler von 1.
>und wenn ich 16000000 durch 444 teile komme ich auf 36000 .

>kann man das so ausrechnen?

Schon mal die Formel im Datenblatt umgestellt?

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein die formel hab ich noch nicht umgestellt. auf welcher seite im 
datenblatt finde ich die formel?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Bei mir S.99

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank. jetzt komm ich auch auf 221. aber warum kommt da nicht 222 
raus?
denn mit 222 komme ich eigentlich doch am nähesten an die 72000 khz 
heran, wenn ich mit dem taschenrechner rechne.

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann habe ich noch ne andere frage. ich habe ja hier das toggle ^= 
verwendet. was macht eigentlich das ^=? schaltet es nur einen ausgang 
ständig high-low-high-low-...?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Warum lässt du eigentlich das OCR-Pin nicht automatisch 'toggeln'? Im 
CTC-Modus mit COM1A[1:0] = 01 kannst du dir die ISR sparen.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gute frage. ich bin noch nicht so erfahren mit pwm und so. mir drum auch 
ein paar programmfetzen woanders geklaut.
außerdem find ich es mit ISR verständlicher und vor allem flexibler für 
erweiterungen.

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>gute frage. ich bin noch nicht so erfahren mit pwm und so.

Das ist CTC nicht PWM.

>ein paar programmfetzen woanders geklaut.
>außerdem find ich es mit ISR verständlicher und vor allem flexibler für
>erweiterungen.

Das übernimmt doch nur das Umschalten des Pins. Wenn du zu dem Zeitpunkt 
noch etwas anderes machen willst, kannst natürlich die ISR benutzen.

MfG Spess

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also man kann beides gleichzeitig benutzen. Die ISR für anderen 
Krimskrams und im Hintergrund den Pin schalten lassen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Also man kann beides gleichzeitig benutzen. Die ISR für anderen
>Krimskrams und im Hintergrund den Pin schalten lassen.

Ja.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also,
 jetzt habe ich mal alles wie oben geschrieben getestet.
 jetzt ist es nur so, dass ich mir nicht sicher bin ob wirklich ein 
interrupt ausgelöst wird. die spannung an der ir led beträgt beim 
betrieb 0,6V aber es wird keine textausgabe Interrupt Timer1 Compare 
ausgegeben.

zudem kommt, dass mein ir- empfänger scheinbar bisher keine ir- signale 
empfängt.


hier mein ausschnitt aus der funktionsbibliothek:
[c

   TCCR1B =  (0 << ICNC1)
         | (0 << ICES1)
         | (0 << WGM13)
         | (1 << WGM12)
         | (0 << CS12)
         | (0 << CS11)
         | (1 << CS10);

   OCR1A = 221;



  // Timer 2 - used for beeper:
  TCCR2 =  0;
  OCR2  = 0xFF;

  // Enable timer interrupts:
  TIMSK =   (1 << OCIE0)|(1<<OCIE1A);
  sei();
[/c]
und hier mein programm:
#include "RP6ControlLib.h"

uint8_t a;

ISR(TIMER1_COMPA_vect) 
  {
  PORTD ^= (1<<PD5);
writeString_P("\Interrupt Timer1 Compare");


}






void infrarotempfang(void)
{if (PINC & (1<<PC3))
{
a++;}

if (a >100)
  {writeString_P("\Infrarot empfangen");
  startStopwatch1();}
  
if (getStopwatch1() >1000)
  {setStopwatch1(0);}
}

int main(void)
{initRP6Control();

DDRD |= (1<<PD5);  //PD5 als Ausgang

DDRC &=~ (1<<PC3);    //PC3 als Eingang

while(true)
{

infrarotempfang();
}
return 0;
}


also vorwiderstand für den ir sender (einen ld 271) habe ich einen 100 
ohm widerstand verwendet. der ir empfänger ist ein TSOP34836. also 
vorwiderstand beim TSOP... habe ich einen 500 ohm widerstand verwendet.

wer kann mir sagen, was ich falsch gemacht habe?

gruß andi

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das programm hier wo den code inplementiert ist ja super. meine 
textausgaben sind ja falsch programmiert.

jetzt habe ich sie nochmal korrigiert. nun kann ich sehen, dass der 
interrupt funktioniert. nur besteht immer noch das problem, dass mein 
ir- empfänger keine ir- signale empfängt. an was kann das liegen?

gruß

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>nur besteht immer noch das problem, dass mein
>ir- empfänger keine ir- signale empfängt. an was kann das liegen?

Der TSOP ist nicht für Dauerbetrieb (kontinuierliche Carrierfreuenz) 
ausgelegt. Nach einer bestimmten Anzahl von Eingangsimpulsen muss eine 
Pause eingelegt werden. Näheres siehe Datenblatt.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja gut, aber wie gesagt, es ist ja nur ein kollissionserkennungssystem 
für meinen roboter.
d.h. er erkennt ja nicht ständig hindernisse.

darum denke ich, wird das mit den pausen bei den pulsen des ir- senders 
nicht nötig sein, oder?

andi

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>darum denke ich, wird das mit den pausen bei den pulsen des ir- senders
>nicht nötig sein, oder?

Ich schon. Ohne die Pausen macht nämlich die AGC des TSOP dicht.

Mfg Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke spess53, für deine wichtigen informationen.
jetzt hab ich das datenblatt mal genauer angeschaut.

aber irgendwie verwirrt mich das hier:

After each burst of length
a minimum gap time is required of
10 to 70 cycles
≥ 10 cycles

Maximum number of continuous short bursts/second 1800

Bedeutet das jetzt, dass ich 1800:36=50 interrupts machen soll und 
danach 10 bis 70 interrupts den ausgang nicht mehr togglen soll?

du scheinst ja schon viel erfahrung mit diesem ir- empfänger gemacht zu 
haben.

gruß andi

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Bedeutet das jetzt, dass ich 1800:36=50 interrupts machen soll und
>danach 10 bis 70 interrupts den ausgang nicht mehr togglen soll?

Ja.

>du scheinst ja schon viel erfahrung mit diesem ir- empfänger gemacht zu
>haben.

Den hatte ich bis jetzt noch nicht in den Fingern. Nur den TSOP1738. 
Sind aber ähnlich. Du bist aber nicht der erste, der hier Fragen zu den 
Teilen gestellt hat. Und das nehme ich dann auch mal zum Anlass mir die 
Datenblätter etwas intensiver zur Brust zu nehmen.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo spess53,
jetzt habe ich mein programm nochmal überarbeitet und nun die toggle 
pausen in den interrupt eingebaut.

kannst du vielleicht mir sagen, ob ich es so programmieren darf?
#include "RP6ControlLib.h"

uint8_t a;
uint8_t interruptcounter;
ISR(TIMER1_COMPA_vect) 
  
  {interruptcounter++;
  
if(interruptcounter <51)
  {PORTD ^= (1<<PD5);
  writeString_P("\Interrupt Timer1 Compare\n");}

if(interruptcounter > 50)
  {writeString_P("\Interrupt Pause\n");}

if(interruptcounter > 80)
  {interruptcounter =0;}
  


}






void infrarotempfang(void)
{if (PINC & (1<<PC3))
{
a++;
}

if (a >100)
  {writeString_P("\Infrarot empfangen\n");
  startStopwatch1();}
  
if (getStopwatch1() >1000)
  {setStopwatch1(0);}
}

int main(void)
{initRP6Control();

DDRD |= (1<<PD5);  //PD5 als Ausgang

DDRC &=~ (1<<PC3);    //PC3 als Eingang

while(true)
{

infrarotempfang();
}
return 0;
}

mfg andi

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also jetzt habe ich mein programm mal getestet aber mein ir empfänger 
erkennt immer noch keine ir- strahlung.

wer kann mir sagen was an meinem programm bzw an meiner timereinstellung 
nicht ok ist?

mfg andi

Autor: F. V. (coors)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab das vor ner Weile auch mal so probiert und fand es recht nervig. 
Entweder nen USB-Oszi dranhaengen oder nen kleinen Zaehler mit nem 
Attiny bauen hilft da schnell und einfach weiter...

Felix

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gestern hab ich schon n oszi drangehängt aber irgendwie misst des bei 
mir ne total falsche frequenz von 72 khz (beim programm ohne die 
pulspausen).

leider ist das oszi ziemlich alt und ich hab es erst seit gestern. drum 
bin ich mir auch nicht ganz sicher ob es korrekt misst.

für den fall dass es richtig misst, würde es ja heißen, dass mein timer 
nicht richtig eingestellt ist.

mfg

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so, nach weitereim rumtüfteln bin ich nun zu dem entschluss gekommen, 
dass irgendetwas an meiner timereinstellung nicht passen kann.

bei folgendem programm müsste die ir- pulspause nach meiner berechnung 
690µs betragen. wenn ich das programm aber teste beträgt sie geschätzt 
nur etwa 0,1s.

hier die timereinstellung:
//     Timer 1 erweiterung



   TCCR1B =  (0 << ICNC1)
         | (0 << ICES1)
         | (0 << WGM13)
         | (1 << WGM12)
         | (0 << CS12)
         | (0 << CS11)
         | (1 << CS10);

   OCR1A = 221; 
  


  // Timer 2 - used for beeper:
  TCCR2 =  0; 
  OCR2  = 0xFF; 

  // Enable timer interrupts:
  TIMSK =   (1 << OCIE0)|(1<<OCIE1A);
  sei();

mein programm:

#include "RP6ControlLib.h"

uint8_t a;
uint8_t interruptcounter;


ISR(TIMER1_COMPA_vect) 
  
  {interruptcounter++;
  
if(interruptcounter <50)
  {PORTD ^= (1<<PD5);
  writeString_P("Interrupt Timer1 Compare\n");}

if(interruptcounter > 50 && interruptcounter <101)
  {writeString_P("Interrupt Pause\n");}

if(interruptcounter > 100)
  {interruptcounter =0;}
  


}





void infrarotempfang(void)
{if (PINC & (1<<PC3))
{
a++;
}

if (a >100)
  {writeString_P("Infrarot empfangen\n");
  startStopwatch1();}
  
if (getStopwatch1() >1000)
  {setStopwatch1(0);}
}

int main(void)
{initRP6Control();

DDRD |= (1<<PD5);  //PD5 als Ausgang

DDRC &=~ (1<<PC3);    //PC3 als Eingang

while(true)
{

infrarotempfang();
}
return 0;
}





was meint ihr dazu?

weiß langsam nicht mehr weiter....

mfg andi

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
evtl hat mein oszi mit den 72 Hz ja doch richtig gemessen...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>evtl hat mein oszi mit den 72 Hz ja doch richtig gemessen...

Was hast du denn gemessen? Eine volle Periode?

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, ich glaube ich habe eine halbe periode gemessen.

aber selbst mit einem messfehler wäre die frequenz ja nur um die hälfte 
und nicht um den faktor 1000 falsch.

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so, jetzt habe ich mich nochmal richtig schlau gemacht. der timertakt 
müssste eingentlich passen.

nun bin ich auf diese seitet gestoßen:
http://www.sprut.de/electronic/ir/rc5.htm#1

wenn ich das jetzt richtig verstanden habe, muss ich 6,994µs lang senden 
und anschließend eine sendepause von 20,8332µs einlegen.

das wären dann 0,5 interrupts für die 6,994µs. und ca. 1,5 interrupts 
für die 20,8332µs.

liege ich richtig mit dieser annahme? bzw. wie ließe sich dies genau 
realisieren?


ein gutes neues jahr gleich mal im voraus.

mfg andi

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>wenn ich das jetzt richtig verstanden habe, muss ich 6,994µs lang senden
>und anschließend eine sendepause von 20,8332µs einlegen.

Willst du jetzt eine RC5-Fernbedienung bauen?

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, das will ich nicht. aber ich weiß, dass mein ir- empfänger auch 
RC5 signale empfangen kann. drum hab ich gedacht, kann ich mir die die 
impulspausenlängen vom RC5 code abschauen.

was allerdings noch einfacher wäre, wäre, wenn mir hier jemand eine 
geeignete pulspausenlänge vorschlagen kann.

du hast mir ja mal erzählt, dass der ir- empfänger nicht dauerhaft ir- 
signale empfangen kann, weil sonst seine agc zu macht.

mfg andi

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>was allerdings noch einfacher wäre, wäre, wenn mir hier jemand eine
>geeignete pulspausenlänge vorschlagen kann.

Dem TSOP reicht ein Puls/Pause-Verhältnis von 1:1.

>du hast mir ja mal erzählt, dass der ir- empfänger nicht dauerhaft ir-
>signale empfangen kann, weil sonst seine agc zu macht.

Das bezieht sich auf die Anzahl der Impulse. Nach, wenn ich das 
Datenblatt richtig in Erinnerung habe, 10...70 Impulsen muss eine Pause 
von 10 Impulsen kommen.

MfG spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab jetzt grad meinen roboter nicht zur hand, drum kann ich es 
gerade nicht testen, aber wenn ich dich jetzt richtig verstanden habe 
reicht es, wenn ich 10 interrupts lang pulse und anschließend 10 
interrupts lang pause mache.
oder muss ich wegen dem (72khz interrupt) 20 interrupts lang pulsen und 
anschließend 20 interrupts lang pause machen?

mfg andi

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>...oder muss ich wegen dem (72khz interrupt) 20 interrupts lang pulsen und
>anschließend 20 interrupts lang pause machen?

Besser 20x.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke spess für deine hilfe,

jetzt hab ich mein programm auf die puls bzw. pausendauer abgeändert:
#include "RP6ControlLib.h"

uint8_t a;
uint8_t interruptcounter;


ISR(TIMER1_COMPA_vect) 
  
  {interruptcounter++;
  
if(interruptcounter <21)
  {PORTD ^= (1<<PD5);
  writeString_P("Interrupt Timer1 Compare\n");}

if(interruptcounter > 20 && interruptcounter <41)
  {writeString_P("Interrupt Pause\n");}

if(interruptcounter == 41)
  {interruptcounter =0;}
  


}





void infrarotempfang(void)
{if (PINC & (1<<PC3))
{
a++;
}

if (a >100)
  {writeString_P("Infrarot empfangen\n");
  startStopwatch1();}
  
if (getStopwatch1() >1000)
  {setStopwatch1(0);}
}

int main(void)
{initRP6Control();

DDRD |= (1<<PD5);  //PD5 als Ausgang

DDRC &=~ (1<<PC3);    //PC3 als Eingang

while(true)
{

infrarotempfang();
}
return 0;
}

leider empfängt der ir- empfänger immer noch keine ir- signale, obwohl 
ich die ir- sendediode mit meiner handykamera blinken sehen kann.
um einen hardware-anschluss-fehler auszuschließen hier mein genauer 
anschluss:

die ir- sendediode habe ich über einen 100 ohm vorwiderstand an den 
ausgang PD5 meines µc angeschlossen.

den Vs anschluss des tsop... habe ich über einen 500 ohm vorwiderstand 
an +5 volt angeschossen. den GND an minus. zwischen Vs und GND habe ich 
einen 100µF kondensator geschalten.

den OUT anschluss habe direkt an den PC3 meines µc angeschlossen.
so weit alles richtig?

anschließend habe ich alle anschlüsse mit einem multimeter überprüft.

dabei konnte ich feststellen, dass an dem 500ohm vorwiderstand des 
tsop... 0,54 Volt abfallen.

- am OUT ausgang des tsop... mess ich mit dem multimeter dauerhaft 4,7 
Volt (egal ob ein objekt erkannt wird oder nicht)

nun ist es ja so, dass der OUT gegen Masse schaltet, wenn er ir- signale 
empfängt. das könnte aber auch an meinem zu trägen multimeter liegen, 
dass ich da keine spannungsänderung messen kann.

ich hoffe mit diesen informationen kannst du mir weiterhelfen.

danke schon mal im voraus.

mfg andi

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Hast du den TSOP schon mal mit einer normalen Fernbedienung getestet?

MfG Spess

Autor: Christian T. (shuzz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab meine TSOPs bisher ohne Vorwiderstand direkt an +5V gehängt, 
zwischen +5V und GND direkt an den Beinchen noch nen 100nF Kerko.
(Du hast da 100µF, also Faktor 1000 mehr. Evtl. ein bissl viel?)

Die 4,7V am Ausgang sind so schon richtig, der Ausgang vom TSOP geht low 
wenn ein Signal empfangen wurde (sagtest Du ja bereits). Wenn Dein 
Multimeter kein TRMS kann wirst Du da auch nicht viel sehen, besser mit 
nem Oszi rangehen.

Die IR-Sendediode würde ich an Deiner Stelle lieber über nen kleinen 
Transistor ansteuern. Wenn ich mich recht erinnere ziehen die ziemlich 
viel Strom (glaube 100mA), da könnte auf die Dauer Dein µC schlapp 
machen. Sind zwar nur kurze Pulse, aber trotzdem...
(z.B. BC338 als Emitterfolger vor die Diode hängen und den µC-Pin direkt 
an die Basis, fertig.)

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian T. schrieb:
> Die IR-Sendediode würde ich an Deiner Stelle lieber über nen kleinen
>
> Transistor ansteuern. Wenn ich mich recht erinnere ziehen die ziemlich
>
> viel Strom (glaube 100mA), da könnte auf die Dauer Dein µC schlapp
>
> machen. Sind zwar nur kurze Pulse, aber trotzdem...

genau deswegen habe ich ja den 100 ohm vorwiderstand vor der ir led. 
daurch kann der strom schon gar nicht so hoch werden. hast du 
wahrscheinlich überlesen...

spess53 schrieb:
> Hast du den TSOP schon mal mit einer normalen Fernbedienung getestet?

gerade eben habe ich es mal ausprobiert. aber der tsop... empfängt auch 
hier keine ir- signale.
drum deutet nun einiges auf einen nicht korrekten anschluss des tsop 
hin.

so jetzt habe ich gerade nochmal ins datenblatt geschaut und dabei einen 
empfohlenen anschlussplan entdeckt. in diesem wird der tsop... an Vs 
über einen 100 ohm vorwiderstand angeschlossen. der empfohlene 
kondensator zwischen Vs und GND hat eine kapazität von 4,7µF.

heute abend werde ich meine schaltung mal entsprechend umbauen und 
testen.
dann melde ich mich wieder.

mfg andi

Autor: Christian T. (shuzz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
andi schrieb:
> Christian T. schrieb:
>> Die IR-Sendediode würde ich an Deiner Stelle lieber über nen kleinen
>>
>> Transistor ansteuern. Wenn ich mich recht erinnere ziehen die ziemlich
>>
>> viel Strom (glaube 100mA), da könnte auf die Dauer Dein µC schlapp
>>
>> machen. Sind zwar nur kurze Pulse, aber trotzdem...
>
> genau deswegen habe ich ja den 100 ohm vorwiderstand vor der ir led.
> daurch kann der strom schon gar nicht so hoch werden. hast du
> wahrscheinlich überlesen...

Hab ich schon gelesen, aber nicht nachgerechnet... ;-)
Aber wenn dann nur noch 35mA ((5V - 1,5V) / 100Ohm) statt 100mA fliessen 
kommt vllt. einfach nicht mehr genug "hinten" raus?
Davon mal abgesehen würde ich auch keine 35mA dauerhaft aus nem µC-Pin 
ziehen...

> spess53 schrieb:
>> Hast du den TSOP schon mal mit einer normalen Fernbedienung getestet?
>
> gerade eben habe ich es mal ausprobiert. aber der tsop... empfängt auch
> hier keine ir- signale.
> drum deutet nun einiges auf einen nicht korrekten anschluss des tsop
> hin.
>
> so jetzt habe ich gerade nochmal ins datenblatt geschaut und dabei einen
> empfohlenen anschlussplan entdeckt. in diesem wird der tsop... an Vs
> über einen 100 ohm vorwiderstand angeschlossen. der empfohlene
> kondensator zwischen Vs und GND hat eine kapazität von 4,7µF.

Wie gesagt: Bei mir laufen die TSOPs ohne Vorwiderstand problemlos.

Du kannst an den TSOP-Ausgang auch eine LowCurrent-LED hängen, dann 
kannst Du direkt sehen wenn etwas ankommt. Ein Oszilloskop dranhängen 
wäre wie gesagt die beste Lösung, aber Du hast anscheinend keines...
(Achtung, den Ausgang kannst Du max. mit 5mA belasten wenn ich mich 
richtig erinnere. Für ne LC-LED reicht's, für ne normale brauchst 
nochmal nen Transistor.)


Grüße,

Christian

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so, da bin ich wieder. also gestern hab ich die schaltung nochmal 
komplett umgebaut. also jetzt ohne vorwiderstand und mit 4,7µF 
kondensator zwischen Vs und GND.
leider immer noch das gleiche Ergebnis. auch wenn ich ihn mit einer ir- 
fernbedienung bestrahle erkennnt er keine ir- signale.

jetzt wollt ich vorher einen neuen ir- empfänger auf einem steckbrett 
testen. dabei ist mir aufgefallen, dass auf der verpackung tsop1836 = 
4836 steht.
zu erst dachte ich mir, dass vielleicht hier das problem liegt.

dann habe ich die anschlüsse im datenblatt verglichen. aber laut 
datenblatt werden sie beide gleich angeschlossen.

wie bei mir: von vorne gesehen. links OUT, mitte GND und rechts Vs.

nachher werd ich mal den neuen auf einem steckbrett mit einer ir- 
fernbedieung testen.

wenn mein programm richtig ist, sollt ja dann der µc Infrarot empfangen 
melden.

mfg andi

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so, nach einer tagelangen fehlersuche bin ich heut endlich 
weitergekommen.

also mal vorne weg:
der ir- empfänger funktioniert. ich habe ihn gerade mit einer 
fernbedienung getestet und den high- low- wechsel am eingang über den µc 
kontrolliert.

warum das programm also so nicht funktioniert hat, hat auch einen für 
mich bisher unerklärlichen hintergrund:

- vor ein paar tagen habe ich bemerkt, dass egal ob ich auf den eingang 
+5volt oder GND brücke, das programm keine textmeldung ausgibt. nach 
ewig langem suchen und ausprobieren bin ich nun auf die lösung gekommen.

meine timerinitialisierung in meiner funktionsbibliothek war schuld. 
anscheinend muss man die interrupts von timer 1 und 0 getrennt 
initialisieren.

seit ich den timer nun so initialisiert habe, erkennt mein programm auf 
jeden fall schon mal den eingang und gibt textmeldungen raus:
TCCR1B =  (0 << ICNC1)
         | (0 << ICES1)
         | (0 << WGM13)
         | (1 << WGM12)
         | (0 << CS12)
         | (0 << CS11)
         | (1 << CS10);

    OCR1A = 221;
    TIMSK = (1<< OCIE1A);
  
  // Timer 2 - used for beeper:
  TCCR2 =  0; 
  OCR2  = 0xFF; 

  // Enable timer interrupts:
  TIMSK =   (1 << OCIE0);

allerings führt mein in einem vorherigen post gepostetes programm jetzt 
keinen interrupt mehr aus. wer kann mir sagen, was ich an meinem 
programm noch ändern muss, damit es wieder einen interrupt ausführt?

an der timerinitialisierung sollte wahrscheinlich nichts mehr geändert 
werden, da mein programm sonst wie oben beschrieben gar nichts macht.

mfg andi

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
........................................................................ 
........................................................................ 
....

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>meine timerinitialisierung in meiner funktionsbibliothek war schuld.
>anscheinend muss man die interrupts von timer 1 und 0 getrennt
>initialisieren.

Nein. Geht auch gemeinsam.

>// Enable timer interrupts:
>  TIMSK =   (1 << OCIE0);

Damit schaltest du OCIE1A wieder ab.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst du mir das bitte mal genauer (ausführlicher) erklären? am besten 
gleich mit einem vorschlag, was ich genau abändern muss.

mfg andi

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

 TIMSK =   (1 << OCIE0);  -> TIMSK |=  (1 << OCIE0);

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt hab ich die timerinitialisierung so abgeändert wie du gesagt hast:
TCCR1B =  (0 << ICNC1)
         | (0 << ICES1)
         | (0 << WGM13)
         | (1 << WGM12)
         | (0 << CS12)
         | (0 << CS11)
         | (1 << CS10);

    OCR1A = 221;
    TIMSK = (1<< OCIE1A);
   sei();
  // Timer 2 - used for beeper:
  TCCR2 =  0; 
  OCR2  = 0xFF; 

  // Enable timer interrupts:
  TIMSK |=   (1 << OCIE0);


jetzt ist es aber so, dass jetzt der interrupt wieder ausgelöst wird, 
jetzt aber nun wieder kein eingang abgefragt wird.

mfg

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich weiß jetzt nicht ob das wichtig ist, aber am ende der gesamten timer 
initialisierung steht sei();.
heißt das, dass ich das sei(); unter TIMSK = (1<< OCIE1A); weglassen 
muss?

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Vielleicht solltest du mal du LCD-Ausgaben aus der Interruptroutine 
schmeissen.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also das ist ja mal echt komisch. jetzt hab ich mal deinen rat befolgt 
und die textausgaben aus der isr geschmissen. die folge ist das jetzt 
die isr nicht mehr geht, jedoch jetzt wieder der eingang abgefragt wird.

wirklich sehr komisch aber ich habe es mit meiner handykamera getestet. 
mit textausgaben in der isr seh ich die ir led flackern. ohne 
textausgaben leuchtet sie nur einfach ständig und wird nicht gepulst.

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>also das ist ja mal echt komisch. jetzt hab ich mal deinen rat befolgt
>und die textausgaben aus der isr geschmissen. die folge ist das jetzt
>die isr nicht mehr geht, jedoch jetzt wieder der eingang abgefragt wird.

Da der Interrupt etwa alle 27,75 µs kommt, wurde dein Timing allein 
durch die LCD-Ausgaben bestimmt. Dadurch war es so langsam, das du das 
mit der Kamera beobachten konntest. Wenn das Timing jetzt stimmt, kannst 
du die Pausen wahrscheinlich mit der Kamera nicht mehr erkennen.

MfG Spess

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich habe das mal schnell ausprobiert. Das ASM-Programm mach genau das 
was du willst. Mit C kann ich leider nicht dienen.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schade. das ich mich mit assembler gar nicht auskenn. dann werd ich wohl 
mal weiter ausprobieren müssen.

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>schade. das ich mich mit assembler gar nicht auskenn. dann werd ich wohl
>mal weiter ausprobieren müssen.

Aber die IO-Register sind z.B. die gleichen.

>if(interruptcounter <21)
>  {PORTD ^= (1<<PD5);
>  writeString_P("Interrupt Timer1 Compare\n");}

>if(interruptcounter > 20 && interruptcounter <41)
>  {writeString_P("Interrupt Pause\n");}

>if(interruptcounter == 41)
>  {interruptcounter =0;}

Ist das, abgesehen von den LCD-Ausgaben, deine aktuelle 
Interruptroutine?

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das ist meine aktuelle isr. wieso?

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>ja das ist meine aktuelle isr. wieso?

Weil ich das Ein- und Ausschalten vermisse.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was meinst du genau mit ein- und ausschalten? den interrupt oder das 
pulsen der ir- led?

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>was meinst du genau mit ein- und ausschalten? den interrupt oder das
>pulsen der ir- led?

Letzteres.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das versteh ich aber dann nicht wirklich.
ISR(TIMER1_COMPA_vect) 
  
  {interruptcounter++;
  
if(interruptcounter <21)
  {PORTD ^= (1<<PD5);
  writeString_P("Interrupt Timer1 Compare\n");}

if(interruptcounter > 20 && interruptcounter <41)
  {writeString_P("Interrupt Pause\n");}

if(interruptcounter == 41)
  {interruptcounter =0;}
  


}



ich habe es doch so programmiert, dass von 0-20 interrupts PD5 gepulst 
wird. danach folgt eine pause von 20 interrupts wo nicht gepulst wird.

was meinst du fehlt da genau?

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>{PORTD ^= (1<<PD5);

Diese Zeile ist wirkungslos. Wenn COM1:0 <>00 ist, kannst du auf den 
Port nicht mehr zugreifen.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab jetzt mal nochmal das datenblatt des atmega 32 angeschaut.

heißt das dann, dass ich die timerinitialisierung folgendermaßen ändern 
muss?
TCCR1A =  (0<<COM1A1)
         | (1<< COM1A0);


TCCR1B =  (0 << ICNC1)
         | (0 << ICES1)
         | (0 << WGM13)
         | (1 << WGM12)
         | (0 << CS12)
         | (0 << CS11)
         | (1 << CS10);

    OCR1A = 221;
    TIMSK = (1<< OCIE1A);
   sei();
  // Timer 2 - used for beeper:
  TCCR2 =  0; 
  OCR2  = 0xFF; 

  // Enable timer interrupts:
  TIMSK |=   (1 << OCIE0);










die änderung stützt sich jetzt auf die tabelle 44 im datenblatt auf 
seite 105.

mfg
mfg

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
........................................................................ 
...........

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wenn du dir mein Programm mal angesehen hättest, wärst du schon am 9.1. 
soweit gewesen.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
heißt das dann, dass ich meine timerinitialisierung so abändern muss, 
wie ich es in meinem vorigen post gepostet habe?

ich hab mir dein programm schon angeschaut. nur ist das für einen der 
nur c gewohnt ist nicht so einfach verständlich. aber wenn ich es 
richtig entziffert habe, muss ich in nur das TCCR1A =  (1<< COM1A0); 
abändern.



mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ja. Und in der Interruptroutine schaltest du das OCR-Pin für die Pause 
einfach auf Eingang.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, ich bedanke mich wieder mal für deine hilfe. leider kann ich es erst 
am freitag dann testen, weil ich erst dann wieder nach hause komme.
ich geb dann auf jeden fall rückmeldung, hoffentlich positive^^.

mfg

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also, jetzt hab ich die änderungen getestet.

das ist meine gesamte timerinitialisierung:
void initRP6Control(void)
{
  portInit();    // Setup port directions and initial values.
          // This is the most important step!

  cli();      // Disable global interrupts.

  // UART:
  UBRRH = UBRR_BAUD_LOW >> 8;  // Setup UART: Baud is Low Speed
  UBRRL = (uint8_t) UBRR_BAUD_LOW;
  UCSRA = 0x00;
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
  
  // Initialize ADC:
  ADMUX = 0; //external reference 
  ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
  SFIOR = 0;

  // Initialize External interrupts - all disabled:
  MCUCR = (1 << ISC11) | (1 << ISC10) | (1 << ISC01) | (1 << ISC00);
  GICR = (0 << INT2) | (0 << INT1) | (0 << INT0);
  MCUCSR = (0 << ISC2);
  
  
  // 10kHz Timer 0:
  TCCR0 =   (0 << WGM00) 
      | (1 << WGM01) 
      | (0 << COM00) 
      | (0 << COM01) 
      | (0 << CS02)  
      | (1 << CS01) 
      | (0 << CS00);
  OCR0  = 199;
  
/*
  Timer 1 is free for your application!
*/
TCCR1A =  (1<< COM1A0);

TCCR1B =  (0 << ICNC1)
         | (0 << ICES1)
         | (0 << WGM13)
         | (1 << WGM12)
         | (0 << CS12)
         | (0 << CS11)
         | (1 << CS10);

    OCR1A = 221;
    TIMSK = (1<< OCIE1A);
   sei();
  // Timer 2 - used for beeper:
  TCCR2 =  0; 
  OCR2  = 0xFF; 

  // Enable timer interrupts:
  TIMSK |=   (1 << OCIE0);

  // SPI Master (SPI Mode 0, SCK Frequency is F_CPU/2, which means it is 8MHz 
  // on the RP6 CONTROL M32...):
  SPCR =    (0<<SPIE) 
      | (1<<SPE) 
      | (1<<MSTR) 
      | (0<<SPR0) 
      | (0<<SPR1) 
      | (0<<CPOL) 
      | (0<<CPHA);  
  SPSR = (1<<SPI2X);
  
  sei(); // Enable Global Interrupts
}


bei folgendem programm geschieht nun folgendes: die ir-led wird 
getogglet (kann sie mit der handykamera blinken sehen), allerdings wird 
der eingang nach wie vor nicht abgefragt.
#include "RP6ControlLib.h"

uint8_t a;
uint8_t interruptcounter;


ISR(TIMER1_COMPA_vect) 
  
  {interruptcounter++;
  
if(interruptcounter <21)
  {
DDRD |= (1<<PD5);  //PD5 als Ausgang
  PORTD ^= (1<<PD5);
writeString_P("toggle PD5\n");}

if(interruptcounter > 20 && interruptcounter <41)
  {DDRD &=~ (1<<PD5);
writeString_P("toggle PD5 aus\n");}

if(interruptcounter == 41)
  {interruptcounter =0;}
  


}





void infrarotempfang(void)
{if (PINC & (1<<PC3))
{writeString_P("Infrarot empfangen\n");
}

}

int main(void)
{initRP6Control();

DDRC &=~ (1<<PC3);    //PC3 als Eingang

while(true)
{

infrarotempfang();
}
return 0;
}


wenn ich aber dann die textmeldungen aus der ISR nehme, wird die ir- led 
nicht mehr gepulst, sondern leuchtet dauernd. der eingang wird aber dann 
abgefragt und meldet die ganze zeit "infrarotempfang".

mir gehen langsam echt die ideen aus, was ich noch ändern soll. immer 
das selbe problem...

vielleicht fällt ja dir noch was ein.

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Was sollen denn schon wieder die LCD-Ausgaben in der Interruptroutine. 
Der Interrupt wird etwa alle 13,9µs aufgerufen. Die Ausgabe eines 
Zeichens dauert mindestens 38µs. Den Rest kannst du dir ja ausrechnen. 
Und für diese Zeit wird kein anderer Interrupt angenommen.

>wenn ich aber dann die textmeldungen aus der ISR nehme, wird die ir- led
>nicht mehr gepulst, sondern leuchtet dauernd. der eingang wird aber dann
>abgefragt und meldet die ganze zeit "infrarotempfang".

Dann funktioniert es doch. Das Pulsen kannst du nicht sehen, weil es für 
dein Auge bzw. deine Kamera viel zu schnell ist. Das sichtbare Pulsen 
(mit den Textausgaben) wird durch die Textausgaben erzeugt, nicht durch 
den korrekten Programmablauf.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Das Pulsen kannst du nicht sehen, weil es für
> dein Auge bzw. deine Kamera viel zu schnell ist.

bist du dir sicher? also wenn ich die ir led meiner fernbedienung sehe 
ich nämlich mit der kamera auch blinken.

für den fall das du recht hast, habe ich jetzt das ganze nochmal mit 
abgeändertem programm getestet:
 #include "RP6ControlLib.h"

uint8_t a;
uint8_t interruptcounter;


ISR(TIMER1_COMPA_vect) 
  
  {interruptcounter++;
  
if(interruptcounter <21)
  {
DDRD |= (1<<PD5);  //PD5 als Ausgang
  PORTD ^= (1<<PD5);
}

if(interruptcounter > 20 && interruptcounter <41)
  {DDRD &=~ (1<<PD5);
}

if(interruptcounter == 41)
  {interruptcounter =0;}
  


}





void infrarotempfang(void)
{if (PINC & (1<<PC3))
{a++;
}
if (a<10)
{writeString_P("wenig Infrarot empfangen\n");}
if (a>10)
{writeString_P("Infrarot empfangen\n");}

if( a>20)
{a=0;}
}

int main(void)
{initRP6Control();

DDRC &=~ (1<<PC3);    //PC3 als Eingang
a=0;


while(true)
{
infrarotempfang();
}
return 0;
}

jetzt ist es so, dass der ständig abwechselnd "wenig infrarot empfangen" 
und "infrarot empfangen" abwechseln. und das auch wenn sich gar kein 
objekt in der nähe (<1 meter) der ir- led befindet, welches die ir- 
strahlen refklektieren könnte.

darum ist meine vermutung, dass bei jedem while schleifen durchlauf, da 
ja PC 3 wenn kein ir licht erkennt wird high ist, a++ um +1 erhöht wird. 
und das natürlich auch unabhängig von erfasster ir- strahlung.

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>bist du dir sicher? also wenn ich die ir led meiner fernbedienung sehe
>ich nämlich mit der kamera auch blinken.

Dort sind die Pausen auch wesentlich grösser -> Repeatfunktion. Wenn 
dein Programm richtig läuft kommen die Impulse mit 3,6 kHz. Das zu 
erkennen ist etwa wie 200kHz zu hören.

>jetzt ist es so, dass der ständig abwechselnd "wenig infrarot empfangen"
>und "infrarot empfangen" abwechseln. und das auch wenn sich gar kein
>objekt in der nähe (<1 meter) der ir- led befindet, welches die ir-
>strahlen refklektieren könnte.

Hör doch mal mit dem LCD auf. Das ist viel zu langsam. Hänge einfach mal 
an einen freien Pin eine Led mit Vorwiderstand und schalte das Pin auf 
Ausgang. In deiner 'infrarotempfang' kopierst du den Zustand des 
Eingangspins auf das Ausgangspin. Damit kannst du einfach erkennen ob 
der TSOP etwas empfängt.

MfG Spess

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tut mir leid, dass ich mich so lange nicht mehr gemeldet habe, aber ich 
stand in den letzten doch wochen doch ziemlich im prüfungsstress mit 
meinem studium (1.semester elektrotechnik).
das heißt aber jetzt auch, dass ich nun in meinen semesterferien (6 
wochen) zeit habe zum programmieren.

ich werde jetzt dann gleich mal ausprobieren, was du mir gepostet hast 
und mich dann wieder mit ergebnissen melden.

mfg andi

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also, das ir empfang funktioniert einwandfrei. hab es gerade gerade mit 
deiner programmiervariante getestet. jetzt muss ich mich nur noch eine 
möglichkeit finden, das ganze in einem programm nutzbar zu machen.

vielen dank auf jeden fall für deine hilfe spess53

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.