Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe beim Anfang mit GCC
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
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
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
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, 15:34
Hast du das im Simulator probiert?
Bei mir funktioniert es.
Alle Jumper am Board gesetzt?
Im Programm sehe ich eigentlich auch keinen Fehler, ich kann mir aber gut vorstellen, dass der Taster trotz Kondensator noch prellt ..
Grüße
Tobi
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
also der smiley sollte eigentlich noch ein ; sein und dahinter ")"
mfg
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.