PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Control Tastenabfrage => Rückgabewerte überlappen sich



Chattychan
20.12.2006, 18:05
Hallo,

ich habe den folgenden C-Code aus der Forumsuche zusammengebastelt.
Klappt auch soweit. Ich compiliere es mit WinAVR, schicks mit Ponyprog hoch und
schau es mit im Bascom Terminal an.
Wenn ich allerdings jetzt eine der 5 Tasten drücke dann bekomme ich einen
Rückgabewert der Tastenabfrage() Funktion die sich nicht genau auf eine
bestimmte Taste beziehen lässt. Also zb Taste 1 zwischen 375 und 500 je nach
dem wie lange ich die Taste drücke und zudem schwankend aber bei Taste 2 etc genauso bzw ähnlich.
Nicht ganz genauso, einen kleinen Unterschied kann man sehen. Aber minimal.
Ich nehm an das ganze lässt sich mit einem Prescaler lösen, zumindest wird
das im BASCOM Beispiel so gemacht. Nur hab ich keine Ahnung wie ich das
machen soll. Bin noch Anfänger in C und den Microcontrollern.
Die IF Abfragen in der Main Methode hab ich selbst geschrieben um eine
sinnvolle Fallunterscheidung machen zu können. Leider mit o.g. Problem.

Wäre super wenn mir jemand erklären könnte wie ich jetzt weiterkomme
oder kurz meinen Code ergänzt so dass es klappt.





// AVR-Includes
#include <avr/io.h>

// Defines
#define F_CPU 16000000 // Hier die Taktfrequenz in Hz eingeben
#define UART_BAUD_RATE 9600 // Hier die gewnschte Baudrate
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16L)-1)


// Funktionen
// -=> UART initialisieren <=-
void UART_init(void){
UBRRL |= (uint8_t) UART_BAUD_SELECT;
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

// -=> Byte Transmit <=-
void UART_transmit(uint8_t c){
while(!(UCSRA & (1<<UDRE)));
UDR = c;
}

// -=> String Transmit <=-
void UART_transmit_string(uint8_t *string){
while(!(UCSRA & (1<<UDRE)));
while( *string){ UART_transmit (*string++); }
}

unsigned int Tastenabfrage (void)
{
unsigned char i;
unsigned char Tasternr = 0;
unsigned int Tasteradc = 0;
PORTA |= (1<<PA7); /* internen Pull-Up an PA7 aktivieren */

ADCSRA = (1<<ADEN) | (1<<ADPS2)| (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler hier: 128



ADMUX = (0<<MUX4) |(0<<MUX3) |(1<<MUX2) | (1<<MUX1) | (1<<MUX0);

ADMUX &= (0<<ADLAR); // Standard Ausrichtung
ADMUX &= (0<<REFS1) & (0<<REFS0); // Referenzspannung an AREF nutzen

ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten


for(i=0;i<4;i++)
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten
Tasteradc += ADCW; // Wandlungsergebnisse aufaddieren

}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
Tasteradc /= 4; // Summe durch vier teilen = arithm. Mittelwert

return Tasteradc;
}



int main (void)
{
char c;
unsigned int taste = 0;

UART_init(); // UART-Init Funktion ausfhren

UART_transmit_string("Hurra, es funktioniert!!!");

while(1){

while(taste == 0) {
taste = Tastenabfrage();
}

if((taste > 350)&&(taste<375)) {
UART_transmit_string("350 - 375 ");
taste = 0;
}

if((taste > 374)&&(taste<400)) {
UART_transmit_string("374 - 400 ");
taste = 0;
}

if((taste > 399)&&(taste<425)) {
UART_transmit_string("399 - 425 ");
taste = 0;
}

if((taste > 424)&&(taste<450)) {
UART_transmit_string("424 - 450 ");
taste = 0;
}

if((taste > 449)&&(taste<475)) {
UART_transmit_string("449 - 475 ");
taste = 0;
}

if((taste > 474)&&(taste<500)) {
UART_transmit_string("474 - 500 ");
taste = 0;
}

if((taste > 499)&&(taste<525)) {
UART_transmit_string("499 - 525 ");
taste = 0;
}

if((taste > 524)&&(taste<550)) {
UART_transmit_string("524 - 550 ");
taste = 0;
}

if((taste > 3000)&&(taste<4000)) {
UART_transmit_string("300 - 400 ");
taste = 0;
}

if((taste > 4000)&&(taste<5000)) {
UART_transmit_string("400 - 500");
taste = 0;
}

if((taste > 500)&&(taste<1000)) {
//UART_transmit_string("Nix gedruckt ");
taste = 0;
}

}
}

Vielen Dank im voraus

LG
Thomas

Hubert.G
20.12.2006, 18:36
Wie sieht die Schaltung aus, es könnte auch ein Problem der Stromversorung sein, läuft noch etwas anderes parallel, wie sehen die Tasten aus, sind die Kontakte so gut das sie ihren Widerstand nicht ändern, es gibt also genug Fehlermöglichkeiten.
Hubert

Hubert.G
20.12.2006, 18:52
Gerade gesehen, zum messen aktiviert man den Pull-Up nicht

Hubert.G
20.12.2006, 21:49
Ich habe versucht das mal nachzustellen, der UART funktioniert bei mir aber nicht, man müsste die Werte mal einzeln ausgeben um zu sehen welcher davonläuft.
Ganz OK ist der Code auch nicht, was ist mit dem Wert 0-349 und 1000 bis 1023

Chattychan
21.12.2006, 10:48
Hallo Hubert,

also ich hab das RN-Control Board von
www.robotikhardware.de bestellt. Das war auch schon fertig gelötet als es ankam.
Mit dem Bascom Programm läuft es einwandfrei.

Ich weiss der Code ist ja auch nur testweise geschrieben.
Wenn der Rückgabewert mal unter 350 fällt dann stürzt der Controller ab.
Wollt einfach erstmal
eine vernünftige Fallunterscheidung hinbekommen und die dafür notwendigen
Werte ermitteln. Aber die Werte sind halt nicht diskret, daher das Problem.
Die Rückgabemengen der 5 Tasten überschneiden sich.
Ich bekomme auch nicht nur einen Wert pro Tastendruck sondern eine
dauerhafte Messung zurückgeliefert. Sprich wenn ich die Taste halte
schreibt der weiterhin die Rückgabewerte (die sich manchmal bei der gleichen Taste um bis zu 100 unterscheiden) in den Terminal. Aber das
ändert doch nichts daran dass die so schwanken ?!

UART geht auf dem RN-Control super. Hab N81 und 9600 Baud eingestellt im Terminal.

Ich werd gleich mal die Bereiche 0 - 349 und 1000 - 1023 hinzufügen.

LG
Thomas

Funky
21.12.2006, 13:15
Hallo Chattychan,

hab den Code nur mal schnell überflogen. Wenn ich das richtig sehe willst du 5 Taster die jeweils eine bestimmte Spannung erzeugen(Spannungsteiler, Tastermatrix) über einen A/D-Wandler einlesen und die erzeugten Werte den jeweiligen Tastern zuordnen. Richtig?

Da die erzeugten Werte so stark variieren ist irgendetwas Faul.

1. So wie ich das gesehen habe ist der A/D-Wandler im
Datenrichtungsregister nicht als Eingang deklariert. (Kann mich auch irren,
hab den Code nur schnell überflogen)

2. Könnte ein Massefehler sein. Hast du die Masse des
Spannungsteilers/Tastermatrix mit der des Boards verbunden?

Chattychan
21.12.2006, 13:41
Hallo,

also Hardwaremässig müsste alles in Ordnung sein, da
ich das Board fertig aufgebaut von www.robotikhardware.de
geliefert bekommen habe und ausserdem eine derartige Fallunterscheidung
in dem BASCOM Beispielcode funktioniert. Quasi das Programm mit dem
das RN-Control ausgeliefert wurde.

LG
Thomas