PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler im Programm..!



RIFMAN
03.04.2007, 14:13
Hallo zusamen!

ich bin ein neuling in der AVR C-programierung,kann mir jemandem vielleicht sagen was ich hier falsch habe ](*,)

#include <avr/io.h>
#include <avr/iom16.h>

int main()
{

DDRD |= 0x60;//PD5 und PD6 als Ausgänge setzen
DDRD &=~(0x0c);//PD2 und PD3 als Eingänge
PORTD |= 0x0c;//die Eingänge auf high

while(1)
{
switch(PIND & 0x0c)
{
case 0x08://wenn Taster1 gedrückt wird..
{
PORTD |= 0x40;//dann LED1 geht an
break;
}
case 0x04://wenn Taster2 gedrückt wird..
{
PORTD |= 0x20;//dann LED2 geht an
break;
}
default:
{
PORTD &= ~(0x60);//sonst LED1 und LED2 gehen aus
}
}
};
return 0;
}

bluebrother
03.04.2007, 16:42
und was genau tut nicht?

RIFMAN
04.04.2007, 08:06
normalerweise sollen die Led1 bzw. Led2 leuchten wenn ich die Taster1 bzw Taster2 drücke.
es tut sich aber gar nichts am Board (ATmega16)!

ogni42
04.04.2007, 08:40
Wie sieht denn Deine Schaltung aus. Die Taster müssen nach GND schalten, sonst passiert mit Deinem Programm nichts.

RIFMAN
04.04.2007, 09:40
und woher soll ich denn das wissen, im Montageanleitung ist jedenfalls nichts darüber!

RIFMAN
04.04.2007, 10:06
du hast recht die Taster sind auf High geschaltet, ich habe mein Programm folgendermaßen geändert es passiert trotzdem nichts!

#include <avr/io.h>
#include <avr/iom16.h>

int main()
{

DDRD |= 0x60;//PD5 und PD6 als Ausgänge setzen
DDRD &= 0xf3;//PD2 und PD3 als Eingänge
PORTD &= 0xf3;//die Eingänge auf low

while(1)
{
switch(PIND | 0x0c)
{
case 0x04://wenn Taster1 gedrückt wird..
{
PORTD |= 0x20;//dann leuchtet die LED1
break;
}
case 0x08://wenn Taster2 gedrückt wird..
{
PORTD |= 0x40;//dann leuchtet die LED2
break;
}
default:
{
PORTD &= 0x9f;//sonst LED1 und LED2 bleiben ausgeschaltet
}
}
}
return 0;
}
kann jemanden bitte mal sagen woran es liegen kann!
wie gesagt, das ist eine Evaluation Board mit Atmega16-Processor.
Danke

Hubert.G
04.04.2007, 10:25
Wenn du auf ein Port eine 1 schreibst das vorher als Eingang definiert wurde, setzt du nur den Internen PullUp sonst ändert sich nichts.
www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Allgemeiner_Zugriff_auf_Register
www.roboternetz.de/wissen/index.php/Avr-gcc

Das sind zwei sehr gute Tutorials, ich würde dir raten die mal durchzuarbeiten.
Hubert

RIFMAN
04.04.2007, 10:38
Wenn du auf ein Port eine 1 schreibst das vorher als Eingang definiert wurde, setzt du nur den Internen PullUp sonst ändert sich nichts.

ich verstehe nicht was du damit meinst, kannst du mal bitte weitereklären!

Hubert.G
04.04.2007, 12:52
Du definierst ein Port als Eingang indem du z.B. DDRD=0x00 für alle 8 Ports schreibst. Schreibst du nun PORTD=0xff sind für alle Eingänge des Port D die internen PullUp aktiv.

RIFMAN
04.04.2007, 12:59
Danke für deine erklärung, aber wo habe Fehler gemacht was Port Definition angeht ?

Hubert.G
04.04.2007, 14:38
In der Portdefinition ist kein Fehler, aber deine Tasten sind nach High geschaltet. Die internen PullUp sind ausgeschaltet ("PORTD &= 0xf3;//die Eingänge auf low" ). "die Eingänge auf low" ist falsch, die Eingänge sind hochohmig. Du musst selbst für einen eindeutigen Pegel sorgen wenn der Taster offen ist, also ein PullDown-Widerstand, etwa 10k nach GND. Dann liegt der Eingang, wenn Taste offen, auf GND und wenn Taste gedrückt dann auf high. Mach dir mal eine Zeichnung von Eingang mit dem internen Widerstand, der Eingang darf nie offen sein da er von sich aus keinen eindeutigen Pegel annimmt.

p_mork
04.04.2007, 15:28
Nur so nebenbei:
in dem Code steht 'switch(PIND | 0x0c)'. PIND|0x0C setzt aber das 2 sowie das dritte bit auf 1. Solle heißen: egal, welchen Wert PIND hat, nach der Operation |0x0C wird das Ergebniss auf keinem fall eine 0x04 bzw eine 0x08 sein, weshalb auch immer die default-Routine ausgefüht wird.
Versuch's mal lieber mit PIND&0x0C.

MfG Mark

RIFMAN
05.04.2007, 08:04
Danke!
ich habe es hinbekommen!