Forum: Mikrocontroller und Digitale Elektronik Taster und STK500 = Bad?


von JTR (Gast)


Lesenswert?

Hallo,

ich bin recht neu wenn es um darum geht ATMEGA µC zu programmieren. In 
der Schule habe ich jedoch viel Erfahrung mit dem 80c51. Jedenfalls bin 
ich in dem Jahr in dem ich eine Diplomarbeit schreiben muss. Dafür 
brauch ich einen ATMEGA8, nun bin ich gerade dabei mich ein zu arbeiten. 
Ich arbeite mit dem STK500, dem AVR-GCC-Tutorial, AVR Studio 4.13, 
WinAVR-Compiler und dem Datenblatt des ATMEGA8.
Bis jetzt hab ich so ziemlich alle Spielereien mit den LEDs gemacht die 
man sich nur vorstellen kann. Aber sowie ich zu den Tastern gekommen bin 
steh ich an.

Aufgabe:
Wenn Taster gedrückt, dann alle LEDS ausschalten.

Hier ist der Code:
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
int main(void)
5
{
6
 DDRB = 0xff;    // Port B wird als Ausgang definiert
7
 DDRC = 0x00;
8
9
for(;;)
10
{
11
   if ((PINB == 0x01))
12
       {PORTB=0xff;}
13
}
14
}

Was mach ich falsch? Es rührt sich nix :(.

MFG

von Peter N. (Gast)


Lesenswert?

if ((PINC == 0x01))
       {PORTB=0xff;}

von G4st (Gast)


Lesenswert?

Hängen die LEDs an Portb oder C ?

von JTR (Gast)


Lesenswert?

1
#include <avr/io.h>
2
#include <stdint.h>
3
4
int main(void)
5
{
6
 DDRB = 0xff;    // Port B wird als Ausgang definiert
7
 DDRC = 0x00;
8
9
for(;;)
10
{
11
   if ((PINC == 0x01))
12
          {
13
     PORTB=0xff;
14
     }
15
}
16
}


Dass ist natürlich der richtige Code.
Trotzdem keine Veränderung. Mach ich einen Denkfehler?

von Oli (Gast)


Lesenswert?

Hallo JTR,

LED`s aind also an PORTB? Wieso fragst Du dann PINB ab?

Oli

von G4st (Gast)


Lesenswert?

Wie sind die Taster am STK500 geschaltet? Pulllup od. Pulldown?

von JTR (Gast)


Lesenswert?

JA sry!
Wurde ausgebessert :D!

von Christopher G. (cbg)


Lesenswert?

Wie sind denn beim STK500 die Taster beschaltet? Normalerweise macht man 
das ja so, dass der Taster nach GND schaltet und man die internen 
Pull-Ups des Atmegas verwendet um einen definierten Pegel zu haben. Wenn 
eine Taste gedrückt ist, dann ist das entsprechende Bit eine 0, sonst 
eine 1 (wegen Pull-Ups).

von 1.8T-Passat (Gast)


Lesenswert?

Schreib doch mal folgenden Befehl:

PORTB = PINC;


Dann sollte jeder Tastendruck eine andere LED zum Leuchten bringen. 
Vorausgesetzt, dass die Taster an PORT C hängen, und die LEDs an PORT B.

von Andreas Lang (Gast)


Lesenswert?

ich würde das eher so schreiben

[code]
#include <avr/io.h>
#include <stdint.h>

int main(void)
{
 DDRB = 0xff;    // Port B wird als Ausgang definiert
 DDRC = 0x00;
 PORTC|=1;
  /*Pullup auf PORTC.0 einschalten, wir bekommen also logisch 1,
    wenn der Taster nicht gedrückt ist */

for(;;)
{
   if ((PINC&0x01)==0) //die taster auf dem STK500 schalten nach masse
          {
     PORTB=0xff;
     }
}
}

von JTR (Gast)


Angehängte Dateien:

Lesenswert?

G4st schrieb:
> Wie sind die Taster am STK500 geschaltet? Pulllup od. Pulldown?


http://www.pic-upload.de/view-4081152/Unbenannt.jpg.html

So ist sieht das Bild in der Bschreibung aus.

von JTR (Gast)


Lesenswert?

1.8T-Passat schrieb:
> PORTB = PINC;

Genialer Vorschlag, aber hier leuchtet (dauerhaft) leider nur LED5.

von 1.8T-Passat (Gast)


Lesenswert?

Also "PORTB=0xff;" sorgt beim STK500 dafür, dass die LEDs aus sind. Das 
ist eben die besch... verkehrte Logik beim STK500. PORT auf "0" Led an, 
Port auf "1" Led aus...

Ist leider so.

von Gastofatz (Gast)


Lesenswert?

Ist doch verständlich. Mit DDRC = 0x00 werden die Pins auf Eingang 
geschaltet. Allerdings wird der Pullup nicht enabled und es gibt auch 
sonst nix, was die Pins auf definierten Pegel bringt ==> sie floaten. 
Über PINC werden zufällige Werte eingelesen, und da dies mit sehr hoher 
Frequenz geschieht, dauert es nicht lange, bis der Wert 0x01 getroffen 
wird. Dann greift der Vergleich und PORTB wird auf 0xFF geschaltet, wo 
er für alle Zeit bleibt, weil es keine Zeile gibt, die ihn auf 
irgendeinen anderen Wert setzt.

von 1.8T-Passat (Gast)


Lesenswert?

Habe vergessen zu erwähnen, dass das erstmal der einzige befehl in der 
Endlosschleife sein sollte. Also in der Art:

for(;;)
{
   PORTB = PINC;
}

von JTR (Gast)


Lesenswert?

1.8T-Passat schrieb:
> for(;;)
> {
>    PORTB = PINC;
> }

Hab ich natürlich so gemacht.

von JTR (Gast)


Lesenswert?

@ Gastofatz

Hab das Programm von 1.8T-Passat ein mal mit DDRC=0x00 und DDRC=0xff,
kein Unterschied.



Langsam gehen mir die Ideen aus. Kann sein, dass etwas kaputt ist?
Wenn ja, kann ich, das durch messen herausfinden?

MFG

von Christopher G. (cbg)


Lesenswert?

Zeichne mal einen Schaltplan welchen Pin vom Atmega du wo beim STK500 
angeschlossen hast.

von JTR (Gast)


Lesenswert?

PEINLICH!

Sry, dass ich eure Zeit verschwendet habe :(.
Meine Verbindung hing die ganze Zeit am PORTD....

Jaja, dass passiert wenn man bei schlechtem Licht arbeitet xD!

Danke @ alle

von JTR (Gast)


Lesenswert?

Hier die korrekte Abfrage:
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
int main(void)
5
{
6
 DDRB = 0xff;    // Port B wird als Ausgang definiert
7
 DDRD = 0x00;
8
9
for(;;)
10
{
11
   if ((PIND == 0xfe))  //Muss so abgefragt werden da alle andren Ports    
12
                          ja "High" sind --> 0b1111110
13
     {
14
     PORTB=0xff;
15
     }
16
}
17
}

von Gastofatz (Gast)


Lesenswert?

>Langsam gehen mir die Ideen aus.

Du aktivierst immer noch nicht die Pullups an den Eingängen.

>Kann sein, dass etwas kaputt ist?

Ja, das kann sein, aber es ist selten die Ursache. Es liegt praktisch 
immer an der Software. Nur Anfänger vermuten Defekte an der Hardware, 
wenn ihr Programm nicht funktioniert.

von Kasperle (Gast)


Lesenswert?

Wenn man die Taster vom STK500 benutzt braucht man keine int. PullUps.
Schaut euch die Beschaltung der Taster im Plan an.

von Kasperle (Gast)


Angehängte Dateien:

Lesenswert?

Schaltung

von Gastofatz (Gast)


Lesenswert?

Ahja, die sind gepullupped. Dann funktioniert es, vorausgesetzt die 
Taste hängt am richtigen Port (D). Es würde allerdings nicht mehr 
funzen, wenn er stattdessen eine externe Taste ohne sonstige Beschaltung 
anschließt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.