Taster und STK500 = Bad?

Gast #1534631
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
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?
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
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.
Gast
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
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.
Gast
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
@ 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
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
Gast
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
>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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.