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


von andi (Gast)


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

von andi (Gast)


Lesenswert?

ach ja bevor ich es vergesse. die taktfrequenz meines mikrocontrollers 
liegt bei 16 MHZ.

von andi (Gast)


Lesenswert?

controller ist ein atmega 32

von STK500-Besitzer (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

Da kam dein Post meinem in die Quere...

von Flo (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

>OCR1A = 444;

Ich komme auf 221.

MfG Spess

von andi (Gast)


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?

von Johannes (Gast)


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.

von spess53 (Gast)


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

von andi (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Bei mir S.99

MfG Spess

von andi (Gast)


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.

von andi (Gast)


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-...?

von spess53 (Gast)


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

von andi (Gast)


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

von spess53 (Gast)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

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

Ja.

MfG Spess

von andi (Gast)


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:
1
#include "RP6ControlLib.h"
2
3
uint8_t a;
4
5
ISR(TIMER1_COMPA_vect) 
6
  {
7
  PORTD ^= (1<<PD5);
8
writeString_P("\Interrupt Timer1 Compare");
9
10
11
}
12
13
14
15
16
17
18
void infrarotempfang(void)
19
{if (PINC & (1<<PC3))
20
{
21
a++;}
22
23
if (a >100)
24
  {writeString_P("\Infrarot empfangen");
25
  startStopwatch1();}
26
  
27
if (getStopwatch1() >1000)
28
  {setStopwatch1(0);}
29
}
30
31
int main(void)
32
{initRP6Control();
33
34
DDRD |= (1<<PD5);  //PD5 als Ausgang
35
36
DDRC &=~ (1<<PC3);    //PC3 als Eingang
37
38
while(true)
39
{
40
41
infrarotempfang();
42
}
43
return 0;
44
}

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

von andi (Gast)


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ß

von spess53 (Gast)


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

von andi (Gast)


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

von spess53 (Gast)


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

von andi (Gast)


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

von spess53 (Gast)


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

von andi (Gast)


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?
1
#include "RP6ControlLib.h"
2
3
uint8_t a;
4
uint8_t interruptcounter;
5
ISR(TIMER1_COMPA_vect) 
6
  
7
  {interruptcounter++;
8
  
9
if(interruptcounter <51)
10
  {PORTD ^= (1<<PD5);
11
  writeString_P("\Interrupt Timer1 Compare\n");}
12
13
if(interruptcounter > 50)
14
  {writeString_P("\Interrupt Pause\n");}
15
16
if(interruptcounter > 80)
17
  {interruptcounter =0;}
18
  
19
20
21
}
22
23
24
25
26
27
28
void infrarotempfang(void)
29
{if (PINC & (1<<PC3))
30
{
31
a++;
32
}
33
34
if (a >100)
35
  {writeString_P("\Infrarot empfangen\n");
36
  startStopwatch1();}
37
  
38
if (getStopwatch1() >1000)
39
  {setStopwatch1(0);}
40
}
41
42
int main(void)
43
{initRP6Control();
44
45
DDRD |= (1<<PD5);  //PD5 als Ausgang
46
47
DDRC &=~ (1<<PC3);    //PC3 als Eingang
48
49
while(true)
50
{
51
52
infrarotempfang();
53
}
54
return 0;
55
}

mfg andi

von andi (Gast)


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

von F. V. (coors)


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

von andi (Gast)


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

von andi (Gast)


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:
1
//     Timer 1 erweiterung
2
3
4
5
   TCCR1B =  (0 << ICNC1)
6
         | (0 << ICES1)
7
         | (0 << WGM13)
8
         | (1 << WGM12)
9
         | (0 << CS12)
10
         | (0 << CS11)
11
         | (1 << CS10);
12
13
   OCR1A = 221; 
14
  
15
16
17
  // Timer 2 - used for beeper:
18
  TCCR2 =  0; 
19
  OCR2  = 0xFF; 
20
21
  // Enable timer interrupts:
22
  TIMSK =   (1 << OCIE0)|(1<<OCIE1A);
23
  sei();

mein programm:
1
#include "RP6ControlLib.h"
2
3
uint8_t a;
4
uint8_t interruptcounter;
5
6
7
ISR(TIMER1_COMPA_vect) 
8
  
9
  {interruptcounter++;
10
  
11
if(interruptcounter <50)
12
  {PORTD ^= (1<<PD5);
13
  writeString_P("Interrupt Timer1 Compare\n");}
14
15
if(interruptcounter > 50 && interruptcounter <101)
16
  {writeString_P("Interrupt Pause\n");}
17
18
if(interruptcounter > 100)
19
  {interruptcounter =0;}
20
  
21
22
23
}
24
25
26
27
28
29
void infrarotempfang(void)
30
{if (PINC & (1<<PC3))
31
{
32
a++;
33
}
34
35
if (a >100)
36
  {writeString_P("Infrarot empfangen\n");
37
  startStopwatch1();}
38
  
39
if (getStopwatch1() >1000)
40
  {setStopwatch1(0);}
41
}
42
43
int main(void)
44
{initRP6Control();
45
46
DDRD |= (1<<PD5);  //PD5 als Ausgang
47
48
DDRC &=~ (1<<PC3);    //PC3 als Eingang
49
50
while(true)
51
{
52
53
infrarotempfang();
54
}
55
return 0;
56
}

was meint ihr dazu?

weiß langsam nicht mehr weiter....

mfg andi

von andi (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

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

Was hast du denn gemessen? Eine volle Periode?

MfG Spess

von andi (Gast)


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.

von andi (Gast)


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

von spess53 (Gast)


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

von andi (Gast)


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

von spess53 (Gast)


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

von andi (Gast)


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

von spess53 (Gast)


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

von andi (Gast)


Lesenswert?

danke spess für deine hilfe,

jetzt hab ich mein programm auf die puls bzw. pausendauer abgeändert:
1
#include "RP6ControlLib.h"
2
3
uint8_t a;
4
uint8_t interruptcounter;
5
6
7
ISR(TIMER1_COMPA_vect) 
8
  
9
  {interruptcounter++;
10
  
11
if(interruptcounter <21)
12
  {PORTD ^= (1<<PD5);
13
  writeString_P("Interrupt Timer1 Compare\n");}
14
15
if(interruptcounter > 20 && interruptcounter <41)
16
  {writeString_P("Interrupt Pause\n");}
17
18
if(interruptcounter == 41)
19
  {interruptcounter =0;}
20
  
21
22
23
}
24
25
26
27
28
29
void infrarotempfang(void)
30
{if (PINC & (1<<PC3))
31
{
32
a++;
33
}
34
35
if (a >100)
36
  {writeString_P("Infrarot empfangen\n");
37
  startStopwatch1();}
38
  
39
if (getStopwatch1() >1000)
40
  {setStopwatch1(0);}
41
}
42
43
int main(void)
44
{initRP6Control();
45
46
DDRD |= (1<<PD5);  //PD5 als Ausgang
47
48
DDRC &=~ (1<<PC3);    //PC3 als Eingang
49
50
while(true)
51
{
52
53
infrarotempfang();
54
}
55
return 0;
56
}

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

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von Christian T. (shuzz)


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.)

von andi (Gast)


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

von Christian T. (shuzz)


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

von andi (Gast)


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

von andi (Gast)


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:
1
TCCR1B =  (0 << ICNC1)
2
         | (0 << ICES1)
3
         | (0 << WGM13)
4
         | (1 << WGM12)
5
         | (0 << CS12)
6
         | (0 << CS11)
7
         | (1 << CS10);
8
9
    OCR1A = 221;
10
    TIMSK = (1<< OCIE1A);
11
  
12
  // Timer 2 - used for beeper:
13
  TCCR2 =  0; 
14
  OCR2  = 0xFF; 
15
16
  // Enable timer interrupts:
17
  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

von andi (Gast)


Lesenswert?

........................................................................ 
........................................................................ 
....

von spess53 (Gast)


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

von andi (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von andi (Gast)


Lesenswert?

jetzt hab ich die timerinitialisierung so abgeändert wie du gesagt hast:
1
TCCR1B =  (0 << ICNC1)
2
         | (0 << ICES1)
3
         | (0 << WGM13)
4
         | (1 << WGM12)
5
         | (0 << CS12)
6
         | (0 << CS11)
7
         | (1 << CS10);
8
9
    OCR1A = 221;
10
    TIMSK = (1<< OCIE1A);
11
   sei();
12
  // Timer 2 - used for beeper:
13
  TCCR2 =  0; 
14
  OCR2  = 0xFF; 
15
16
  // Enable timer interrupts:
17
  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

von andi (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von andi (Gast)


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

von spess53 (Gast)


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

von spess53 (Gast)


Angehängte Dateien:

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

von andi (Gast)


Lesenswert?

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

mfg

von spess53 (Gast)


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

von andi (Gast)


Lesenswert?

ja das ist meine aktuelle isr. wieso?

mfg

von spess53 (Gast)


Lesenswert?

Hi

>ja das ist meine aktuelle isr. wieso?

Weil ich das Ein- und Ausschalten vermisse.

MfG Spess

von andi (Gast)


Lesenswert?

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

mfg

von spess53 (Gast)


Lesenswert?

Hi

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

Letzteres.

MfG Spess

von andi (Gast)


Lesenswert?

das versteh ich aber dann nicht wirklich.
1
ISR(TIMER1_COMPA_vect) 
2
  
3
  {interruptcounter++;
4
  
5
if(interruptcounter <21)
6
  {PORTD ^= (1<<PD5);
7
  writeString_P("Interrupt Timer1 Compare\n");}
8
9
if(interruptcounter > 20 && interruptcounter <41)
10
  {writeString_P("Interrupt Pause\n");}
11
12
if(interruptcounter == 41)
13
  {interruptcounter =0;}
14
  
15
16
17
}

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

von spess53 (Gast)


Lesenswert?

Hi

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

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

MfG Spess

von andi (Gast)


Lesenswert?

ich hab jetzt mal nochmal das datenblatt des atmega 32 angeschaut.

heißt das dann, dass ich die timerinitialisierung folgendermaßen ändern 
muss?
1
TCCR1A =  (0<<COM1A1)
2
         | (1<< COM1A0);
3
4
5
TCCR1B =  (0 << ICNC1)
6
         | (0 << ICES1)
7
         | (0 << WGM13)
8
         | (1 << WGM12)
9
         | (0 << CS12)
10
         | (0 << CS11)
11
         | (1 << CS10);
12
13
    OCR1A = 221;
14
    TIMSK = (1<< OCIE1A);
15
   sei();
16
  // Timer 2 - used for beeper:
17
  TCCR2 =  0; 
18
  OCR2  = 0xFF; 
19
20
  // Enable timer interrupts:
21
  TIMSK |=   (1 << OCIE0);

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

mfg
mfg

von andi (Gast)


Lesenswert?

........................................................................ 
...........

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von andi (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von andi (Gast)


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

von andi (Gast)


Lesenswert?

also, jetzt hab ich die änderungen getestet.

das ist meine gesamte timerinitialisierung:
1
void initRP6Control(void)
2
{
3
  portInit();    // Setup port directions and initial values.
4
          // This is the most important step!
5
6
  cli();      // Disable global interrupts.
7
8
  // UART:
9
  UBRRH = UBRR_BAUD_LOW >> 8;  // Setup UART: Baud is Low Speed
10
  UBRRL = (uint8_t) UBRR_BAUD_LOW;
11
  UCSRA = 0x00;
12
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
13
    UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
14
  
15
  // Initialize ADC:
16
  ADMUX = 0; //external reference 
17
  ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
18
  SFIOR = 0;
19
20
  // Initialize External interrupts - all disabled:
21
  MCUCR = (1 << ISC11) | (1 << ISC10) | (1 << ISC01) | (1 << ISC00);
22
  GICR = (0 << INT2) | (0 << INT1) | (0 << INT0);
23
  MCUCSR = (0 << ISC2);
24
  
25
  
26
  // 10kHz Timer 0:
27
  TCCR0 =   (0 << WGM00) 
28
      | (1 << WGM01) 
29
      | (0 << COM00) 
30
      | (0 << COM01) 
31
      | (0 << CS02)  
32
      | (1 << CS01) 
33
      | (0 << CS00);
34
  OCR0  = 199;
35
  
36
/*
37
  Timer 1 is free for your application!
38
*/
39
TCCR1A =  (1<< COM1A0);
40
41
TCCR1B =  (0 << ICNC1)
42
         | (0 << ICES1)
43
         | (0 << WGM13)
44
         | (1 << WGM12)
45
         | (0 << CS12)
46
         | (0 << CS11)
47
         | (1 << CS10);
48
49
    OCR1A = 221;
50
    TIMSK = (1<< OCIE1A);
51
   sei();
52
  // Timer 2 - used for beeper:
53
  TCCR2 =  0; 
54
  OCR2  = 0xFF; 
55
56
  // Enable timer interrupts:
57
  TIMSK |=   (1 << OCIE0);
58
59
  // SPI Master (SPI Mode 0, SCK Frequency is F_CPU/2, which means it is 8MHz 
60
  // on the RP6 CONTROL M32...):
61
  SPCR =    (0<<SPIE) 
62
      | (1<<SPE) 
63
      | (1<<MSTR) 
64
      | (0<<SPR0) 
65
      | (0<<SPR1) 
66
      | (0<<CPOL) 
67
      | (0<<CPHA);  
68
  SPSR = (1<<SPI2X);
69
  
70
  sei(); // Enable Global Interrupts
71
}

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.
1
#include "RP6ControlLib.h"
2
3
uint8_t a;
4
uint8_t interruptcounter;
5
6
7
ISR(TIMER1_COMPA_vect) 
8
  
9
  {interruptcounter++;
10
  
11
if(interruptcounter <21)
12
  {
13
DDRD |= (1<<PD5);  //PD5 als Ausgang
14
  PORTD ^= (1<<PD5);
15
writeString_P("toggle PD5\n");}
16
17
if(interruptcounter > 20 && interruptcounter <41)
18
  {DDRD &=~ (1<<PD5);
19
writeString_P("toggle PD5 aus\n");}
20
21
if(interruptcounter == 41)
22
  {interruptcounter =0;}
23
  
24
25
26
}
27
28
29
30
31
32
void infrarotempfang(void)
33
{if (PINC & (1<<PC3))
34
{writeString_P("Infrarot empfangen\n");
35
}
36
37
}
38
39
int main(void)
40
{initRP6Control();
41
42
DDRC &=~ (1<<PC3);    //PC3 als Eingang
43
44
while(true)
45
{
46
47
infrarotempfang();
48
}
49
return 0;
50
}

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

von spess53 (Gast)


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

von andi (Gast)


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:
1
 #include "RP6ControlLib.h"
2
3
uint8_t a;
4
uint8_t interruptcounter;
5
6
7
ISR(TIMER1_COMPA_vect) 
8
  
9
  {interruptcounter++;
10
  
11
if(interruptcounter <21)
12
  {
13
DDRD |= (1<<PD5);  //PD5 als Ausgang
14
  PORTD ^= (1<<PD5);
15
}
16
17
if(interruptcounter > 20 && interruptcounter <41)
18
  {DDRD &=~ (1<<PD5);
19
}
20
21
if(interruptcounter == 41)
22
  {interruptcounter =0;}
23
  
24
25
26
}
27
28
29
30
31
32
void infrarotempfang(void)
33
{if (PINC & (1<<PC3))
34
{a++;
35
}
36
if (a<10)
37
{writeString_P("wenig Infrarot empfangen\n");}
38
if (a>10)
39
{writeString_P("Infrarot empfangen\n");}
40
41
if( a>20)
42
{a=0;}
43
}
44
45
int main(void)
46
{initRP6Control();
47
48
DDRC &=~ (1<<PC3);    //PC3 als Eingang
49
a=0;
50
51
52
while(true)
53
{
54
infrarotempfang();
55
}
56
return 0;
57
}

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

von spess53 (Gast)


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

von andi (Gast)


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

von andi (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.