PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Erste Schritte in C -> Taster abfragen



Olle_Filzlaus
04.11.2007, 18:36
Hallo,

ich habe bis jetzt in Bascom programmiert und möchte jetzt auf C umsteigen.

Das erste Programm war einfach eine LED zum leuchten zu bringen. Das ging einfach :-)

Jetzt möchte ich gern einen Taster benutzten. Und das versuche ich jetzt seit zwei Tagen. Ich verwende AVR Studio und das Atmega Board von Pollin.



/* LED Test für Pollin Board */

#include <avr/io.h>
#include <stdint.h>

#ifndef F_CPU
#define F_CPU 8000000
#endif

int main (void)
{

//************ LED **********************************************

/*DDRD = 0xff; /* Alle Pins des Portes werden zu Ausgängen */
DDRD |= (1<<PD6) | (1<<PD5); /* Pin D6 und D5 als Ausgang */

//************ Taster *******************************************

DDRD &= ~ (1<<PD2); /* Pin D2 als Eingang */
// PORTD |= (1<<PD2); /* Pull Up von PIN D2 aktivieren */

PORTD |= (1<<PD6); /* LED PD6 zum testen */


if ( PIND & ( 1<<PIND2 ) ); /* mache was wenn PinD2 High ist */
{

PORTD |= (1<<PD5); /* Setzt Pin D5 auf High */

}

PORTD &= ~ (1<<PD5); /* Setzt Pin D5 wieder auf low */

return 0;

}


Die Lampe an Port D6 geht Problemlos. Aber die LED an D5 reagiert nicht auf einen Tastendruck. Sie leuchtet aber komischerweise ganz schwach.

Achja, die Taster geben in gedrückten Zustand ein High Signal ab.

Ich vermute mal das ich irgendwo einen Fehler habe. Könnt ihr mir bitte helfen. Mit Hilfe eines Bascom Programmes konnte ich die Hardware testen, sie ist IO.

Thx Arno

CsT
04.11.2007, 19:00
Hi, bei dir fehlt die Endlosschleife. Dein Programm wird quasi nur einmal ausgeführt und danach nicht mehr.
So dürfte es funktionieren:


/* LED Test für Pollin Board */

#include <avr/io.h>
#include <stdint.h>

#ifndef F_CPU
#define F_CPU 8000000
#endif

int main (void)
{

//************ LED **********************************************

/*DDRD = 0xff; /* Alle Pins des Portes werden zu Ausgängen */
DDRD |= (1<<PD6) | (1<<PD5); /* Pin D6 und D5 als Ausgang */

//************ Taster *******************************************

DDRD &= ~ (1<<PD2); /* Pin D2 als Eingang */
// PORTD |= (1<<PD2); /* Pull Up von PIN D2 aktivieren */

PORTD |= (1<<PD6); /* LED PD6 zum testen */

while(1)
{
if ( PIND & ( 1<<PIND2 ) ); /* mache was wenn PinD2 High ist */
{
PORTD |= (1<<PD5); /* Setzt Pin D5 auf High */
//_delay_ms(20);
}

PORTD &= ~ (1<<PD5); /* Setzt Pin D5 wieder auf low */
}
return 0;

}

Allerdings wird dieser Code wohl auch nur so halb funktionieren, für eine richtige Funktion des Tasters musst du diesen noch Entprellen. Wie das funktioniert wird in verschiedenen Tutorials beschrieben. Viele Grüße CsT

PS: Wenn das Programm so nicht funktioniert, dann kommentiere die Zeile mit dem _delay_ms aus

Olle_Filzlaus
04.11.2007, 19:33
danke für deine Atwort,

aber es geht leider immer noch nicht.

Das mit dem Entprellen weiß ich, aber es müsste ja erstmal die LED angehen oder aus. Aber die leuchtet halt ganz schwach ohne das ich einen Taster berühre. Und wenn ich ihn drücke, dann passiert nichts.

thx Arno

Hubert.G
04.11.2007, 20:45
Nach der Klammer der if-Schleife gehört der ; weg sonst ist die Abfrage sinnlos.
Das _delay_ms(20) ist zu wenig, da flimmert die Led nur schwach.

CsT
04.11.2007, 20:50
Oh mein Gott .. das ; hab ich ja komplett übersehen. Das _delay_ms hab ich erstmal nur reingenommen, damit überhaupt was flimmert .. aber bitte keine (viel) größeren Werte nehmen, da _delay_ms nur bis zu einer bestimmten Zeit gewartet werden kann .. wenn dann eine for-Schleife drumherum. So z.B.


for(uint8_t i=0; i<20; i++)
{
_delay_ms(20);
}

Viele Grüße
CsT

linux_80
04.11.2007, 21:39
Hallo,

hier gehört durchaus auch noch ein else hinein, sonst schaltet der sofort wieder um, falls es mal high sein sollte !


while(1)
{
if ( PIND & ( 1<<PIND2 ) ) /* mache was wenn PinD2 High ist */
{
PORTD |= (1<<PD5); /* Setzt Pin D5 auf High */
}
else {
PORTD &= ~ (1<<PD5); /* Setzt Pin D5 wieder auf low */
}
//_delay_ms(20); // wenn delay, dann hier, damit beide Anzeigen zu erkennen sind !
}
return 0;

}

Olle_Filzlaus
05.11.2007, 16:34
Hallo,

danke für eure zahlreichen Antworten.

Das mit dem Else werde ich dann zu hause gleich mal testen.

Mit dem Delay habe ich noch Verständissprobleme. Habe mir gestern mal ein kleines Blinklicht pogrammiert. Und dort leuchtet die LED dauerhaft. Habe das Delay auf 250 gesetzt (habe´gelesen das ich den Wert nicht über 266 legen darf ?!).

Werde dazu heute nocchmal in der Wiki schauen.

thx Arno

HF SHOOTER
05.11.2007, 18:22
Mal eine Frage:

in der Datei delay.h steht
The maximal possible delay is 262.14 ms / F_CPU in MHz.

Heißt das jetzt das ich pro 1 MHz eine Pause von ~260ms machen kann, also nutze ich einen 16 MHz Quarz, dann kann ich max. ~4160ms Pause machen, betreibe ich hingegen nur 1 MHz, gehen nur ~260ms?

mfg
Benny

Hubert.G
05.11.2007, 18:48
Nein, umgekehrt. Mit 1MHz Quarz gehen 262.14ms und mit 16MHz Quarz sind es 16.38ms. Das wird mit Schleifen gemacht, mit einem schnelleren Quarz sind sie schneller durchlaufen.
Lies dir das über Timer/Counter: www.roboternetz.de/wissen/index.php/Timer/Counter_%28Avr%29
www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Timer.2FCounter_des_AVR

Olle_Filzlaus
06.11.2007, 08:14
Hallo,

danke für eure Hilfe. Das Programmm funktioniert jetzt super.

Das lag echt an dem vergessenen Else und an dem ; hinter dem While und dem If.

Und durch diese Tips habe ich auch mein LED Blinklicht Programm hinbekommmen.

danke für eure Hilfe

cu Arno