PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe beim Anfang mit GCC



Teri
04.02.2009, 13:04
Ich habe angefangen einen Mega32 mit AVR Studio (mit GCC), AVRISP mkII und Pollinboard zu programmieren.

Jetzt möchte ich erstmal eine LED blinken lassen.
Die LED geht an, kurze Zeit später wieder aus und dann passiert nix mehr.

So sieht mein Programm aus:

#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <util/delay.h>

int main (void) {

DDRD = 0x00;
DDRD = (1 << DDD5) | (1 << DDD6) | (1 << DDD7);
PORTD |= (1<<DDD2) | (1 << DDD3) | (1 << DDD4);

PORTD |= (1<<PD5);
_delay_ms(16);


PORTD &= (1<<PD5);
_delay_ms(16);


return 0;
}

Wo ist der fehler?
Sollte es nicht durch das return zurückspringen?
Oder muss ich dafür eine Schleife und einen Timer nehmen?

LG
Teri

CsT
04.02.2009, 13:13
Hi Teri,
das Programm wird bei dem return 0 beendet. Zu dieser Anweisung darf es quasi nie kommen, also baut man immer eine while-Schleife in die main ein.

Um

PORTD |= (1<<PD5);
_delay_ms(16);


PORTD &= (1<<PD5);
_delay_ms(16);


Machst du einfach eine while-Schleife, die immer wahr ist.

Also

while(1)
{
... tue etwas
}

Viele Grüße
CsT

Teri
04.02.2009, 13:38
Danke.
Jetzt sieh es so aus und die LED blinkt:

int main (void) {

DDRD = 0x00;
DDRD = (1 << DDD5) | (1 << DDD6) | (1 << DDD7);
PORTD |= (1<<DDD2) | (1 << DDD3) | (1 << DDD4);

while(1)
{
PORTD |= (1<<PD5);
_delay_ms(16);

PORTD &= ~(1<<PD5);
_delay_ms(16);
}

return 0;
}

Aber ich werde bestimmt noch mehr Probleme und fragen haben.

LG
Teri

Teri
05.02.2009, 12:39
Jetzt möchte ich LED1 mit Taster1 einschalten und mit Taster 2 ausschalten.
Die Taster sind mit Pulldowns an die Pins angeschlossen
(parallel zu den Pulldowns(33K) liegen Kondensatoren(0,33µF) (zur Entprellung)).


#include <avr/io.h>

int main (void) {

DDRD = 0x00; /*PortD 0-7 -> Eingang*/
DDRD = (1 << DDD5) | (1 << DDD6) | (1 << DDD7); /* PortD 5-7 -> Ausgang*/

while(1)
{
if ( PIND & (1<<PIND2) ) { /*Taster1*/
PORTD |= (1<<PD5); /*LED1 einschalten*/
}
if ( PIND & (1<<PIND3) ) { /*Taster2*/
PORTD &= ~(1<<PD5); /*LED2 ausschalten*/
}

}

}

Wo habe ich denn jetzt wieder den Fehler?
Ich habe mich nach dem AVR-GCC-Tutorial bei mikrocontroller.net gerichtet.

LG
Teri

Hubert.G
05.02.2009, 14:34
Hast du das im Simulator probiert?
Bei mir funktioniert es.
Alle Jumper am Board gesetzt?

CsT
05.02.2009, 14:36
Im Programm sehe ich eigentlich auch keinen Fehler, ich kann mir aber gut vorstellen, dass der Taster trotz Kondensator noch prellt ..

Grüße
Tobi

Wsk8
05.02.2009, 14:36
Hallo,
nimm die Pullups, die im Controler schon integriert sind. Den Taster zwischen AVR und Masse.
Versuch mal:

Ein-/Ausgänge definieren(wie du willst)
Pullup z.B. bei portd, pin0 aktivieren
outp (0x01,PORTD); // Pull-Up auf Port D, Pin 0 aktivieren

Auslesen:
/* Pin 0 von Port D abfragen, eine logische 0 heisst 'Taster gedrückt'.
ACHTUNG: Es muss Register PIND abgefragt werden, nicht PORTD */
if (bit_is_clear (PIND, PIND0)) {
tu was.........
}

In C nimmt man normalerweise statt "while(1)" bevorzugt "for (;;)"

mfg

Wsk8
05.02.2009, 14:38
also der smiley sollte eigentlich noch ein ; sein und dahinter ")"

mfg

Teri
05.02.2009, 14:46
Jumper sind alle gesetzt.
Habe es jetzt nochmal genau so geflasht und es geht ohne Probleme.

Prellen würde glaube ich auch nur Probleme machen, wenn man was zählen möchte oder die LED mit einem Taster ein- und wieder ausschalten möchte.

LG
Teri

lowtzow
08.02.2009, 18:34
DDRD = 0x00;
DDRD = (1 << DDD5) | (1 << DDD6) | (1 << DDD7);


die erste zeile könntest du dir sparen.
denn in der zweiten zeile steckt die erste drinnen.

außer du machst es so



DDRD = 0x00;
DDRD |= (1 << DDD5) | (1 << DDD6) | (1 << DDD7);


mfg
low