Hallo,
ich versuche mit folgendem Code RC5 mit einem TSOP1736 zu empfangen, die
Fernbedienung sendet RC5.
SIGNAL(SIG_INTERRUPT0)
{
uint8_t foo,i;
//GICR &= ~(1<<INT0); // Externen Interrupt deaktivieren
char wert[30] = "interrupt!!!";
char test[30] = "1";
send_string(wert);
for(i=0;i<=14;i++) {
foo = (PIND && (1<<3));
if(foo==1) {
send_string(test);}
_delay_us(1778);
foo = 0;
}
Das Problem ist, ich bekomme immer 15 Einser, egal welche Taste ich
drücke, eigentlich dürfte ich doch nur soviele Einser bekommen, wie auch
tatsächlich im Code vorkommen?!
CPU ist ein ATMEGA8, 16Mhz.
Gruss
Fragender
Mal davon abgesehen, dass der ganze Ansatz relativ untauglich ist ...
> foo = (PIND && (1<<3));
foo ist hier immer dann 1, wenn irgendein Pin an Port D High ist.
Das hilft mir jetzt leider nicht wirklich weiter.. was ist an dem delay
falsch? Das sollte doch noch im Bereich des Erlaubten sein oder?
Und nach meinem Verständnis wird wird damit der PIND3 eingelesen.
>delay falsch?
Ein Warte_Zeit_X hat in einer ISR NICHTS , aber auch GARNICHTS zu
suchen.
Dort hängt der µC ja sonst fest.
Meiner (persönlichen) Meinung, sind Warteschleifen jeglicher Art (warte
auf irgendein Bit/Zeit,..) ein absolutes No-Go. SOwas realisiert man mit
verschiedenen Task und Schrittketten...
>(PIND && (1<<3)); ... PIND3 eingelesen.
wenn dann so:
Aber ich will ja gerade, dass das Programm dort "festhängt", damit der
RC5 Code gelesen wird und dann kann es ja normal weitergehen, neue
Interrupts in dieser Zeet sind unerwünscht!
Leider bekomme ich als Ergebnis eine ellenlange Zahl, und nicht das
gewünschte :( zumindest die Geräteadresse müsste ja 0 sein. Wär schön
wenn sich jemand den Code mal durchlesen würde, wenn Fragen zum Code da
sind, bitte fragen!
Wenn das erste if zutrifft, trifft auch das zweite automatisch zu (noch
im selben Interrupt), außer "bitnummer" wird durch das erste if größer
als 14.
1
volatileuint16_tgesamt[14];
2
...
3
if(...&&bitnummer<=14&&...){
4
gesamt[bitnummer]=0;
Du schreibst hinter das Ende des Array.
1
for(i=1;i<=14;i++){
2
itoa(ergebnis[i],test,10);
3
send_string(test);
4
}
Wieso "ergebnis", die eingelesenen Bits stehen doch in "gesamt".
Und der Array-Index würde auch hier nicht stimmen.
PS: Das ist nur das, was mir auf die Schnelle aufgefallen ist. Es gibt
vermutlich noch mehr Problemstellen.
Hallo,
hab deine Anmerkungen ausgebessert, hilft aber leider nich twirklich
weiter, ich schaue mir jetzt die adressbits an und die sind leider
meistens 11111 oder es kommt gar nichts. hier der korrigierte code:
> hab deine Anmerkungen ausgebessert
Ich hatte 4 Sachen angemerkt. Zwei sind unverändert, eines hast du
geändert, allerdings das Problem dadurch nicht beseitigt (if-Sache).
Und bei der letzten Sache
9 bis 14 ist für mich auch nicht verständlicher.
"gesamt" auf 16 zu vergrößern, behebt zwar das "hinter das Array
schreiben"-Problem, geht das Problem aber von der falschen Seite her an.
Wieso beschreibst du das Array von 1 bis 14 und nicht von 0 bis 13?
Gibt es da vielleicht bei dir noch Defizite beim Verständnis von
Array-Indexen?
Das if-Problem besteht weiterhin.
Das "if(last_bit == 0)" nützt dir da nichts, da du ja im if-Block vorher
"last_bit = 0;" stehen hast. Eine "if ... else if ..."-Konstruktion
würde hier helfen.
Allerdings ist auch der Ansatz schon falsch. Du kannst bei
Manchester-Codierung die Bits nicht so einfach aus dem Abstand zwischen
zwei steigenden Flanken ermitteln.
Hallo,
hab das mit else if geändert, mit dem 9 bis 14 wollte ich lediglich die
Datenbits auslesen. Wenn es nützlich ist, kann ich den Code nochmal
posten. Warum geht das mit den steigenden Flanken nicht? Wenn ich weiss,
ob das letzte Bit eine 1 oder 0 war, geht das doch?!
Eine einfache Betrachtung zeigt, dass deine Methode so nicht gehen kann:
Du ermittelst zu jeder steigenden Flanke ein Bit, du hast also eine
1:1-Relation von steigenden Flanken und Bits. Jetzt zeichne dir mal den
Manchester-Code zur Bitfolge 010101... auf. Da hast du mehr Bits, als
steigende Flanken. Wie soll dein Algorithmus diese Bitfolge also
rekonstruieren können?
Hallo,
das hast du recht :/. Hast du vielleicht einen Tip, wie ich es sonst
angehen könnte? Ich mag auf keinen Fall einen fertigen Code verwenden,
hab da mittlerweile soviel Zeit reingesteckt, dass ich das einigermssen
in Eigenregie zum Laufen bringen möchte.