PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : K6 sagt nix



AppeL
26.08.2007, 19:16
Es ist ja allgemein bekannt, dass das Tastersystem beim Asuro seine Macken hat, so auch bei mir. Das hab ich allerdings schon software-technisch behoben, sodass ich überall stabile und feste Werte bekomme.

Ich bekomme allerdings nie bei K6 einen Wert. (weder bei Selbsttest mit der normalen PollSwitch() funktion noch bei irgendwelchen modifizierten, die ich probiert habe, noch bei der, die in der Lib dabei ist)

Ich hab daraufhin nochmal geguckt, ob alles vernünftig angeschlossen ist und dass alles leitet. Auch das funktioniert...

Ich steh hier im Moment auf dem Schlauch, weil Taster K1-K5 funktionieren einwandfrei mit den richtigen Werten, bei K6 tut sich nichts (eigentlich sollte da ja 1 rauskommen, aber mir wird da nichts ausgegeben, wenn ich mir die Werte an den Transceiver schicken lasse)

=(

harry3
26.08.2007, 20:11
Lass dir mal den Analogwert bei Tastendruck ausgeben!
Die letzen Zeilen der PollSwitch Funktion sehen folgendermaßen aus:



i = ADCL + (ADCH << 8);

SWITCH_OFF;

return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5));
}

Der Analogwert steckt in der unsigned int Variable "i".
Schreib einfach vor das return :
SerWrite(itoa(i),7)

Somit wird dir nun dauernd über die IR Schnittstelle der Analogwert gesendet. Dann siehst du auch ob sich bei Tastendruck von #6 garnichts tut oder ob sich was tut und somit einfach nur die Tastenwerte falsch berechnet werden.
Berichte dann mal über die ausgegebenen Werte bei Tastendruck von #6.

AppeL
26.08.2007, 20:53
so, ich bekomm immer 255, wenn ich nichts drücke, wenn ich dann K6 drücke verändert sichs nicht, bei allen anderen Schaltern schon :[

damaltor
26.08.2007, 21:13
die funktion itoa lässt sich nciht schachteln. sie muss einzeln aufgerufen werden:

itoa(zahlenvariable;stringvariable;zahlensystem);

also zb. itoa (i,text[],10);

AppeL
26.08.2007, 21:27
als ich hab das Return bei pollswitch einfach auf "return (float)i;" geändert und die Funktion dann alle 0.5 Sekunden aufgerufen

damaltor
26.08.2007, 21:31
das geht glaub ich nit, da serwrite nur chars senden kann. die zahl, die zurückgegeben wurde, muss also zuerst in zeichen umgewandelt werden, bevor die gesendet werden können.

ändere das mal zurück, und versuche es dann mit itoa.

AppeL
27.08.2007, 13:12
die pollswitch funktion

unsigned char PollSwitch (void)
{
unsigned int i;
int ec_bak = autoencode; // Sichert aktuellen Zustand

/*
Autoencode-Betrieb vom ADC-Wandler unterbinden.
*/
autoencode = FALSE;

DDRD |= SWITCHES; // Port-Bit SWITCHES als Output
SWITCH_ON; // Port-Bit auf HIGH zur Messung
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
Sleep (10);

ADCSRA |= (1 << ADSC); // Starte AD-Wandlung
while (!(ADCSRA & (1 << ADIF))) // Ende der AD-Wandlung abwarten
;
ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen

i = ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert

SWITCH_OFF; // Port-Bit auf LOW
Sleep (5);

/*
Autoencode-Betrieb vom ADC-Wandler wiederherstellen.
*/
autoencode = ec_bak;

return (long)i;
}

und das Programm:


#include <stdlib.h>
#include "asuro.h"

int main(void)
{
uint8_t t1;
unsigned char text[16];

Init();
SerPrint("\r\nTastsensor Test\r\n");
while (1)
{
t1 = PollSwitch();
itoa(t1, text, 10); /* Tastenwert senden */
SerPrint(text);
Msleep(500);
}
}

funktioniert jetzt so :>

harry3
27.08.2007, 19:22
die funktion itoa lässt sich nciht schachteln. sie muss einzeln aufgerufen werden:

itoa(zahlenvariable;stringvariable;zahlensystem);

also zb. itoa (i,text[],10);

Upps, stimmt, da war ich zu schnell.

@AppeL: Du musst beim Funktionskopf von PollSwitch "int PollSwitch(void)" statt "unsigned char PollSwitch(void)" schreiben.
Außerdem musst du in der asuro.h das selbe tun, auch dort wird bereits definiert, wie PollSwitch aussieht.

Besser wäre es wenn du die IR Sache direkt in die Funktion reinschreibst, also in etwa so(nicht getestet):




unsigned char PollSwitch (void)
{
unsigned int i;
unsigned char text[10]={'\0'};

DDRD |= SWITCHES; // Switches as Output
SWITCH_ON; // Output HIGH for measurement
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
Sleep(10);

ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
i = ADCL + (ADCH << 8);

itoa(i, text, 10);
SerWrite(text,10);

SWITCH_OFF;

return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5));
}


Berichte dann von deinen Werten.

AppeL
28.08.2007, 16:46
soooo

also ich hab normal 1023
es geht halt bei k1-k5 immer runter auf unter 100, also 994 oder 675 oder so
bei K6 tut sich weiterhin nichts, es bleibt auf 1023 :(

harry3
28.08.2007, 17:40
soooo

also ich hab normal 1023
es geht halt bei k1-k5 immer runter auf unter 100, also 994 oder 675 oder so
bei K6 tut sich weiterhin nichts, es bleibt auf 1023 :(

Das hört sich schlecht an, da liegt dann ein Hardwarefehler vor(1023 bedeutet so viel wie "kein Taster gedrückt").
Entweder der Taster ist kaputt(unwahrscheinlich), oder aber es ist irgendwo eine Verbindung wo keine sein sollte, das passiert schnell mal beim Löten der Taster.
Schau dir das also nochmal genauer an(am besten ausgestattet mit einem Multimeter), ich bin mir sicher dass du den Fehler finden wirst!

damaltor
28.08.2007, 18:50
vermutlich ist eher irgendwo KEINE verbindung, denn sonst würde der wert ja dauerhat unter 1023 sein

AppeL
04.09.2007, 20:33
also, folgendes ergebnis:

ich hab den wiederstand R30 überprüft mit nem mulitmeter... alles funktionstüchtig und auch richtiger Ohm Wert, dann hab ich mit nem Kabel den Schalter überbrückt, also an der einen Seite vom Widerstand angeschlossen und an dem Masse Bügel, also simuliert, dass der Schalter dauerthaft geschlossen ist.. Fehlanzeige, er meint der Schalter wäre immer noch net offen -_-

wie wahrscheinlich ist es, dass der fehler irgendwo in der platine liegt, dass da irgeneine leiterbahn unterbrochen ist?
wo kann ich noch suchen?
kann der fehler auch außerhalb von K6 und dem R30 liegen? ~

mein nächster schritt wäre irgendwie zu versuchen die betreffenden teile nochmal neu einzulöten bzw durch irgendwas auszutauschen und dann zu gucken

damaltor
04.09.2007, 20:37
nich einfach dran rumlöten. damit macht man eigentlich eher was kaputt als besser.

verfolge genau die leiterbahnen. überbrücke mal die beiden kontakte des tasters. ist er dann geschlossen?

AppeL
04.09.2007, 21:26
nich einfach dran rumlöten. damit macht man eigentlich eher was kaputt als besser.

verfolge genau die leiterbahnen. überbrücke mal die beiden kontakte des tasters. ist er dann geschlossen?

mhh frage, der is ja an 4 beinchen festgelötet.. welche beiden sind denn die kontakte, die beiden äußeren oder die beiden inneren?

damaltor
04.09.2007, 23:09
oha.. das weiss ich gar nicht. probieren =)

Sternthaler
09.09.2007, 22:36
Hallo AppeL,
nimm am besten die Kontakte, die hinten am Taster liegen.
Wenn du genau hinsiehst, kann du sehen, dass die beiden vorderen 'Kontakte' so ziemlich fest mit dem Metalblech um den Taster herum verbunden sind. Also nur so kleine 'halte mich fest'-Kontakte.

Hinten ist da wo der kleine schwarze Drücker nicht ist ;-)