PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Control Taster abfragen



CsT
09.02.2007, 17:49
Hallo,
ich halte hier gerade mein erstes Controllerboard in der Hand und habe schon ein paar Schwierigkeiten ..
LED´s ansteuern und Motor steuern klappt schon, allerdings komme ich nicht mit den 5 verbauten Tastern zurecht.
Ich weiß, dass die analog auf A7 zu finden sind. Allerdings habe ich keine Ahnung, wie ich nun feststelle, welcher Taster gedrückt wurde. Je nach Tasterdruck möchte ich eine andere LED ansteuern, dass bekomme ich ja dann selber hin ..
Kann jemand bitte einen Beispielcode zu dem ADC und den Tasten posten? Alles, was ich bis jetzt zusammengekratzt habe, hat nicht so funktioniert, wie ich wollte ..
[php:1:628026f8b3]// AVR-Includes
#include <avr/io.h>
// Funktionen

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;
DDRA = 0x00;
DDRC = 0xff;
PORTC = 0xff;

while (1)
{

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

if ((taste > 350)&&(taste<375))
{
PORTC &= ~(1 << 7);
taste = 0;
}

else if ((taste > 374)&&(taste<400))
{
PORTC &= ~(1 << 6);
taste = 0;
}

else if ((taste > 399)&&(taste<425))
{
PORTC &= ~(1 << 5);
taste = 0;
}

else if ((taste > 424)&&(taste<450))
{
PORTC &= ~(1 << 4);
taste = 0;
}

else if ((taste > 449)&&(taste<475))
{
PORTC &= ~(1 << 3);
taste = 0;
}

else if ((taste > 474)&&(taste<500))
{
PORTC &= ~(1 << 4);
taste = 0;
}

else if ((taste > 499)&&(taste<525))
{
PORTC &= ~(1 << 5);
taste = 0;
}

else if ((taste > 524)&&(taste<550))
{
PORTC &= ~(1 << 6);
taste = 0;
}

else if ((taste > 3000)&&(taste<4000))
{
PORTC &= ~(1 << 7);
taste = 0;
}

else if ((taste > 4000)&&(taste<5000))
{
PORTC &= ~(1 << 6);
taste = 0;
}

else if ((taste > 500)&&(taste<1000))
{
PORTC &= ~(1 << 5);
taste = 0;
}

else
{
PORTC = 0xff;
taste = 0;
}

}
}
[/php:1:628026f8b3]

Das habe ich mir bis jetzt zusammenkopiert .. bei Tastern 4 und 5 wird ein Motor angesteuert, bei den restlichen passiert nichts .. was mache ich falsch?

Grüße und vielen Dank schonmal
CsT

robo junior
09.02.2007, 19:32
Hallo

ich weiß jetzt nicht, wie deine Taster angeschlossen sind, bzw. wie du das mit dem ADC machst. Aber in deinen if Anweisungen löschst du ja immer Bits. Ist das beabsichtigt oder willst du nicht eigentlich Bits setzen (|= (1<<n) ), weil du ja LED anschalten willst.

bL1nK
09.02.2007, 22:12
kleiner tip: mach statt den vielen else if halt ein switch ;) ist übersichtlicher.

CsT
09.02.2007, 22:43
Hallo,
erstmal danke für eure Antworten ..
@robo junior
Ich hab LED´s die im low-Zustand leuchten, also muss ich doch die Bits löschen, oder?

@bL1nK
switch funktioniert hier nicht, da es Bereiche sind, die ich Abfrage und nicht nur ein einzelner Wert.

@all
Habe auf der CD noch ein kleines C-Programm gefunden, komischerweise mit der Endung .bas ?!?
Jedenfalls wird da die Tasterabfrage geklärt, ich teste das dann gleich morgen mal. Wenn das auch nicht klappt meld ich mich nochmal.
Achja, falls hier jemand ist, der die CD´s zusammenstellt .. im Programm fehlt folgende Zeile:
#define ADHSM 4
Und
zaehler = SYSCLK / 5000;
kann durch
zaehler = F_CPU / 5000;
ersetzt werden .. dadurch entfällt oben ein define

Grüße CsT .. und nochmals besten Dank für eure Antworten

teran42
10.02.2007, 18:18
Hi,
wenn Du das Board von robotik Hardware bzogen hast war da 'ne CD dabei. Scha mal unter x:\Anleitungen_Projekte und Boards\rn-control\c_beispiel , da gib es eine Datei die fälschlich tastenled.bas heisst (ist aber C). Da ist dein Szenario implementiert.

Ansosten steht hier noch ganz viel:
https://www.roboternetz.de/wissen/index.php/Taster-Abfrage_in_C

CsT
11.02.2007, 16:32
Hi,
wie ich ja oben schon geschrieben habe, habe ich dieses Programm auch noch gefunden. Mit dem Wiki habe ich mich ebenfalls beschäftigt, aber da gehts ja um digitale Eingangswerte.
Hab das Beispiel von der CD noch ein bisschen umgeändert, jetzt funktioniert auch die Erkennung, ob eine Taste lang gedrückt wurde oder nur kurz. Falls es jemand haben will, einfach per PN / Mail (tf11@gmx.de) melden.

Grüße CsT und vielen Dank nochmal für deine Antwort!