www.mikrocontroller.net

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


Autor: JTR (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <stdint.h>

int main(void)
{
 DDRB = 0xff;    // Port B wird als Ausgang definiert
 DDRC = 0x00;

for(;;)
{
   if ((PINB == 0x01))
       {PORTB=0xff;}
}
}

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

MFG

Autor: Peter N. (Gast)
Datum:

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

Autor: G4st (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hängen die LEDs an Portb oder C ?

Autor: JTR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>
#include <stdint.h>

int main(void)
{
 DDRB = 0xff;    // Port B wird als Ausgang definiert
 DDRC = 0x00;

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


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

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo JTR,

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

Oli

Autor: G4st (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sind die Taster am STK500 geschaltet? Pulllup od. Pulldown?

Autor: JTR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JA sry!
Wurde ausgebessert :D!

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: 1.8T-Passat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Lang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
     }
}
}

Autor: JTR (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: JTR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1.8T-Passat schrieb:
> PORTB = PINC;

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

Autor: 1.8T-Passat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gastofatz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: 1.8T-Passat (Gast)
Datum:

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

for(;;)
{
   PORTB = PINC;
}

Autor: JTR (Gast)
Datum:

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

Hab ich natürlich so gemacht.

Autor: JTR (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeichne mal einen Schaltplan welchen Pin vom Atmega du wo beim STK500 
angeschlossen hast.

Autor: JTR (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: JTR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier die korrekte Abfrage:
#include <avr/io.h>
#include <stdint.h>

int main(void)
{
 DDRB = 0xff;    // Port B wird als Ausgang definiert
 DDRD = 0x00;

for(;;)
{
   if ((PIND == 0xfe))  //Muss so abgefragt werden da alle andren Ports    
                          ja "High" sind --> 0b1111110
     {
     PORTB=0xff;
     }
}
}

Autor: Gastofatz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kasperle (Gast)
Datum:

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

Autor: Kasperle (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Schaltung

Autor: Gastofatz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.