Taster und STK500 = Bad?

Gast #1534631
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
Gast #1534640
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?
#1534653
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).
Gast #1534657
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;
     }
}
}
Gast #1534667
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.
Gast #1534682
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
Gast #1534686
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
}
Gast #1534837
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.
Gast #1534954
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren