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:
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).
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.
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;
}
}
}
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.
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.
@ 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
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
>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.
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.