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
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.
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
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.
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-...?
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
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
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_ta;
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
voidinfrarotempfang(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
intmain(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
return0;
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
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ß
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
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
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
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
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
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?
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
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
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
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_ta;
4
uint8_tinterruptcounter;
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
voidinfrarotempfang(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
intmain(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
return0;
56
}
was meint ihr dazu?
weiß langsam nicht mehr weiter....
mfg andi
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.
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
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
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
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
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
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_ta;
4
uint8_tinterruptcounter;
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
voidinfrarotempfang(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
intmain(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
return0;
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
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.)
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
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
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
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
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
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
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
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
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
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
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
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
// 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_ta;
4
uint8_tinterruptcounter;
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
voidinfrarotempfang(void)
33
{if(PINC&(1<<PC3))
34
{writeString_P("Infrarot empfangen\n");
35
}
36
37
}
38
39
intmain(void)
40
{initRP6Control();
41
42
DDRC&=~(1<<PC3);//PC3 als Eingang
43
44
while(true)
45
{
46
47
infrarotempfang();
48
}
49
return0;
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
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
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_ta;
4
uint8_tinterruptcounter;
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
voidinfrarotempfang(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
intmain(void)
46
{initRP6Control();
47
48
DDRC&=~(1<<PC3);//PC3 als Eingang
49
a=0;
50
51
52
while(true)
53
{
54
infrarotempfang();
55
}
56
return0;
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
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
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
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