PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Tasterschaltung



Tuxist
02.05.2012, 12:08
Moin,

ich bin an einer einfachen 2 Tasterschaltung zugange mein erstes Avr projekt, leider will das Programm noch nicht ganz
ich bekomme das mit den Eingängen nicht ganz hin. Die Leds habe ich vorher mit einem einfachen Led Testprogramm überprüft.

Die schalter senden ein HIGH level Signal dazu habe ich 10KOhm widerstände verwendet



#define F_CPU 10000000UL
#include <avr/io.h>
#include <util/delay.h>


void PowerOn(){
/**********Start Powerleds*******************/
DDRB |= 1<<PB0; /* set PB0 to output */
DDRB |= 1<<PB1; /* set PB1 to output */
PORTB |= (1 << PB0); /* LED0 on */
PORTB |= (1 << PB1); /* LED1 on */
/********************************************/
}


void setPins(){
/**************Input*************************/
DDRB &= ~(1 << PB2); /* set PB2 to input*/
PORTB |= (1 << PB2);
DDRB &= ~(1 << PB3); /* set PB3 to input*/
PORTB |= (1 << PB5);
/********************************************/

/**************Ouput*************************/
DDRD |= 1<<PD6; /* set PB6 to output */
DDRD |= 1<<PD7; /* set PB7 to output */
PORTD &= ~(1<<PD6); /* PD6 off */
PORTD &= ~(1<<PD7); /* PD7 off */
/********************************************/
}


void eventhandler(){
/**********Read Input PB2 and PB3*************/
if( !(PINB & (1 << PB2)) ) {
PORTD |= 1<<PD6; /* LED on */
}else {
PORTD &= ~(1<<PD6); /* LED off */
}
if(!(PINB & (1 << PB3)) ){
PORTD |= 1<<PD7; /* LED on */
}else{
PORTD &= ~(1<<PD7); /* LED off */
}
}


int main(void) {
setPins();
PowerOn();
while(1) {
// eventhandler();
}
return 0;
}

sast
02.05.2012, 13:22
Und wenn der Taster nicht gedrückt ist, auf welchem Potential liegen die Eingänge dann?

Es ist immer wichtig, die Eingänge auf definiertem Potential zu haben. Wenn der Taster gegen High schaltet, muss der Eingang sonst auf Low gezogen werden.

Tuxist
02.05.2012, 14:16
Die Taster sind direkt 5 VCC angeschlossen und an z.B. PB2 angeschlossen und an einem 10KOhm widerstand welcher an Masse angeschlossen ist.
22277

sast
02.05.2012, 14:53
Kannst du das Verhalten kurz beschreiben. Sind die LEDs immer aus wenn du den Taster gedrückt hältst? Sind die Taster hardwareseitig entprellt?

Tuxist
02.05.2012, 15:07
Die Taster sind nicht entprellt das wollte ich später machen. Wenn ich die Bedingung auf "if((PINB & (1 << PB2)) )" setzte leuchten sie immer. Auf die Taster folgt keine Reaktion.

Tuxist
02.05.2012, 15:16
Die Testplatine
22278

sternst
02.05.2012, 15:22
Du aktivierst die internen Pull-Ups und hast externe Pull-Downs.
Welchen Pegel soll das denn dann ergeben bei nicht gedrückter Taste?

Tuxist
02.05.2012, 15:27
habe ich wieder rausgenommen: PORTB |= (1 << PB2);wollte sehen ob vllt irgendwas mit den Widerständen nicht passt, habe ich aber gerade gerade nach gemessen sind in Ordnung.

sast
02.05.2012, 15:59
Wäre in dem Fall

DDRB &= ~(1 << PB3); /* set PB3 to input*/ PORTB |= (1 << PB5);

aber sowieso egal.

Hast du den ISP Adapter immer angesteckt?
Würde ich mal ohne testen. Ansonsten mal den Pegel an den Pins messen.

Tuxist
02.05.2012, 16:13
Habe den ISP Adapter abgesteckt leider ohne erfolg. Habe den Code nochmal über arbeitet und bereinigt.


#define F_CPU 10000000UL
#include <avr/io.h>
#include <util/delay.h>


void PowerOn(){
/**********Start Powerleds*******************/
DDRB |= 1<<PB0; /* set PB0 to output */
DDRB |= 1<<PB1; /* set PB1 to output */
PORTB |= (1 << PB0); /* LED0 on */
PORTB |= (1 << PB1); /* LED1 on */
/********************************************/
}


void setPins(){
/**************Input*************************/
DDRB &= ~(1 << PB2); /* set PB2 to input*/
DDRB &= ~(1 << PB3); /* set PB3 to input*/
/********************************************/

/**************Ouput*************************/
DDRD |= 1<<PD6; /* set PB6 to output */
DDRD |= 1<<PD7; /* set PB7 to output */
PORTD &= ~(1<<PD6); /* PD6 off */
PORTD &= ~(1<<PD7); /* PD7 off */
/********************************************/
}


void eventhandler(){
/**********Read Input PB2 and PB3*************/
if(!(PINB & (1 << PB2)) ) {
PORTD |= 1<<PD6; /* LED on */
}else {
PORTD &= ~(1<<PD6); /* LED off */
}
if(!(PINB & (1 << PB3)) ){
PORTD |= 1<<PD7; /* LED on */
}else{
PORTD &= ~(1<<PD7); /* LED off */
}
}


int main(void) {
setPins();
PowerOn();
while(1) {
eventhandler();
}
return 0;
}

sast
02.05.2012, 16:25
Wie ist denn das Verhalten? Das Programm sagt mir nur, wie du es gern möchtest, aber nicht, was es bei dir macht.

Tuxist
02.05.2012, 16:46
Eigentlich soll wenn man den Taster die jeweilige led leuchten. Nur leider passiert nichts die Pegel beim AVR liegen bei 5 volt. Habe mittlerweile die Taster im verdacht, wenn ich den Taster drücke habe ich keinen Widerstand wenn ich den Taster nicht drücke habe ich auch keinen. Hatte aus der Tüte noch nen paar über.
Eigentlich muss ich doch nen Riesen widerstand habe wenn ich ihn nicht drücke und wenn ich ihn drücke nen Maginal kleinen ?

Tuxist
02.05.2012, 16:52
ich habe glaube ich habs taster waren anders gepolt als beschrieben :(

Tuxist
02.05.2012, 18:45
Es geht die Taster waren es unglaublich

Tuxist
02.05.2012, 18:59
so den code habe ich auch dar wo ich ihn hin haben möchte:


#define F_CPU 10000000UL
#include <avr/io.h>
#include <util/delay.h>


int channel0;
int channel1;


void PowerOn(){
/**********Start Powerleds*******************/
DDRB |= 1<<PB0; /* set PB0 to output */
DDRB |= 1<<PB1; /* set PB1 to output */
PORTB |= (1 << PB0); /* LED0 on */
PORTB |= (1 << PB1); /* LED1 on */
/********************************************/
}


void setPins(){
/**************Input*************************/
DDRB &= ~(1 << PB2); /* set PB2 to input*/
DDRB &= ~(1 << PB3); /* set PB3 to input*/
/********************************************/

/**************Ouput*************************/
DDRD |= 1<<PD6; /* set PB6 to output */
DDRD |= 1<<PD7; /* set PB7 to output */
PORTD &= ~(1<<PD6); /* PD6 off */
PORTD &= ~(1<<PD7); /* PD7 off */
/********************************************/
}


void eventhandler(){
/**********Read Input PB2 and PB3*************/
if((PINB & (1 << PB2)) ) {
channel0=1;
channel1=0;
}

if((PINB & (1 << PB3)) ){
channel1=1;
channel0=0;
}

if(channel0==1){
PORTD |= 1<<PD6; /* LED on */
PORTD &= ~(1<<PD7); /* LED off */
}else if(channel1==1){
PORTD |= 1<<PD7; /* LED on */
PORTD &= ~(1<<PD6); /* LED off */
}
}


int main(void) {
setPins();
PowerOn();
channel0=1;
while(1) {
eventhandler();
}
return 0;
}

sast
02.05.2012, 22:49
ich würde mal sagen, nicht die Taster sind schuld, wenn sie nicht richtig angeschlossen sind.
Aber trotzdem schön, wenn es jetzt klappt.

Gute Nacht
sast

MisterMou
12.05.2012, 20:32
Es ist schön festzustellen, dass sich immer mehr für AVRs begeistern können.
Das wird ja fast zum Volkssport :D

Du machst einige unnötige Dinge in Deinem Code.

Dein Programm startet ja in der main(), zu diesem Zeitpunkt ist DDRB= 0000.0000 (binär).
In der setPins() setzt du dann die B2 und B3 0, obwohl sie es schon sind, tut also nicht not :)
Das selbe Spiel am Ende der setPins(), PORTD ist bereits 0000.0000 und muss nicht extra genullt werden. ;)

Außerdem kannst Du Dir die beiden Variablen sparen:)


void eventhandler()
{
if((PINB & (1 << PB2)) ) {
PORTD |= 1<<PD6; /* LED on */
PORTD &= ~(1<<PD7); /* LED off */
}

if((PINB & (1 << PB3)) ){
PORTD &= ~(1<<PD6); /* LED off */
PORTD |= 1<<PD7; /* LED on */

}

}

Ein kleiner Tipp am Rande, diese schönen Kästchen im Code sind gruselig.
Fang am besten jetzt schon mit einem sauberen Schreibstiel an;)

Calis007
13.05.2012, 06:48
Ein paar ueberfluessige Klammern gabs da noch, und ich empfehle auch immer, die geschwungenen Block-Klammern genauso einzuruecken wie den Block selbst. Findet man dann viel leichter, wo eine fehlt - ist aber Geschmackssache :)



void eventhandler()
{
if (PINB & (1 << PB2))
{
PORTD |= 1<<PD6; /* LED on */
PORTD &= ~(1<<PD7); /* LED off */
}

if (PINB & (1 << PB3))
{
PORTD &= ~(1<<PD6); /* LED off */
PORTD |= 1<<PD7; /* LED on */
}
}