| |
 |
 |  | | LED blinken - geändertes Beispielprogramm geht nicht |
|  |
Verfasst am: 10.03.2010, 22:49 |
|
|
|
Hallo!
Ich habe vor kurzem das Board MK2 mit dem USB-Programmer bekommen und habe mit dem LED-Testprogramm (wo alle angesteuert werden) angefangen. Das hat auch alles funtkioniert, alles in Ordnung.
Jetzt hab ich angefangen, das Programm ein bisschen zu verändern. Die Ansteuerung auf Port B gelegt --> ging auch noch. Jetzt wollte ich alles ein bisschen interessanter gestalten und die LEDs blinken lassen mithilfe einer while-Schleife, in der eine HIlfsvariable hochgezählt wird. Aber es passiert nichts. Die LEDs leuchten nach dem flashen nach wie vor.
Habe ich irgendwas falsch gemacht? Irgendwelche Einstellungen vergessen?
Ich programmiere mit AVR Studio 4 und flashe mit dem AVR Prog.
Könnt ihr mir helfen!
Viele Grüße, Johannes |
|
|
|
|
 | |  |
Verfasst am: 11.03.2010, 8:05 |
|
|
| hotline |
|
 |
 |
| Anmeldungsdatum: 10.04.2007 |
| Beiträge: 531 |
|
|
|
 |
 |
 |
|
Hallo Johannes,
ohne dein Programm zu kennen, kann man dir nur schwehr weiterhelfen. Stell es doch einfach mal ins Netz und lass uns dann noch mal darüber reden
Viel spaß noch beim ausprobieren. |
|
|
|
|
Verfasst am: 11.03.2010, 8:53 |
|
|
|
Oh ja, natürlich. Tut mir Leid.
#include <avr/io.h>
#include <avr/wdt.h>
void init (void){
DDRB=0x07; // Set Bits 0, 1 und 2 von PORTB in 1 - "Ausgang"
}
main (void){
int i=0;
init(); // Initialize Peripherals
while (1) // Mainloop
{
wdt_reset();
PORTB=0x07; // auf Port B Bit 0, 1 und 2 LEDs einschalten
while(i<10000) i++;
wdt_reset();
PORTB=0x00; // auf Port B Bit 0, 1 und 2 LEDs ausschalten
}
} |
|
|
|
|
Verfasst am: 11.03.2010, 8:55 |
|
|
|
Ich habe die drei Portpins B0, B1 und B2 mit den drei LED verbunden, da ja auch diese Test-Hex (für Taster, LEDs und Summer) geht. Das hab ich einfach ein bisschen abgewandelt.
Vielen Dank schon mal! |
|
|
|
|
Verfasst am: 11.03.2010, 19:25 |
|
|
| Berecke |
|
 |
 |
| Anmeldungsdatum: 13.11.2008 |
| Beiträge: 170 |
| Wohnort: Berlin |
|
|
 |
 |
 |
|
| Also ich meine, die Verzögungsschleife ist zu klein gewählt. Du müsstest auf ca. 10ms kommen. Also noch eine innere Schleife einfügen. |
|
_________________ Gruß Berecke |
|
|
|
 | |  |
Verfasst am: 11.03.2010, 22:55 |
|
|
| schorschi |
|
|
 |
| Anmeldungsdatum: 10.03.2010 |
| Beiträge: 2 |
| Wohnort: Ingolstadt |
|
|
 |
 |
 |
|
Hi Berecke,
danke für deine Antwort. Ich hab jetzt mal noch eine while-Schleife eingebaut, aber das wars irgendwie auch nicht. Nach dem Programmieren leuchten die LEDs mit halber Intensität, als würden sie wirklich nur 50% angesteuert - aber man sieht kein Flimmern oder Blinken. Es macht den Eindruck, als hätte sich der Controller aufgehängt...
Irgendwie bin ich ein bisschen am Verzweifeln...
| Code: | #include <avr/io.h>
#include <avr/wdt.h>
void init (void){
DDRB=0x07; // Set Bits 0, 1 und 2 als Ausgang
}
main (void){
int i=0;
int j=0;
init(); // Initialize Peripherals
while (1) // Mainloop
{
wdt_reset();
i=0;
PORTB=0x07;
while(i<10000){
i++;
while(j<1000) j++;
j=0;
}
wdt_reset();
PORTB=0x00;
i=0;
while(i<10000){
i++;
while(j<1000) j++;
j=0;
}
}
|
|
|
|
|
|
 | |  |
Verfasst am: 12.03.2010, 17:22 |
|
|
| Diddl |
|
 |
 |
| Anmeldungsdatum: 01.09.2006 |
| Beiträge: 631 |
|
|
|
 |
 |
 |
|
Bitte keine Zeitverzögerungen mit Schleifen machen, das ist sehr unprofessionell!
Dazu gibt es doch bessere Methoden, Timer, Interrupts oder notfalls delay_ms().
+ Die Schleifen sind Taktfrequenz Abhängig
+ Compiler abhängig, eine neue Version oder andere Einstellungen --> anderes verzögerung |
|
|
|
|
 | |  |
Verfasst am: 15.03.2010, 14:44 |
|
|
| Berecke |
|
 |
 |
| Anmeldungsdatum: 13.11.2008 |
| Beiträge: 170 |
| Wohnort: Berlin |
|
|
 |
 |
 |
|
Hallo Diddl,
da gebe ich Dir recht, aber... hier geht es um Grundlagen und erst mal sollte das Progrämmchen laufen... dann könnte man einen Interrupt angehen. Und dann werden wir richtig professionell...
Warum läuft denn nun das Programm nicht?
Code sieht erst mal gut aus. Nimm doch mal die Watchdog-Befehle heraus (wdr). ATmega läuft mit Quarz 3,8...MHz? Die Fuses richtig gesetzt? LEDs richt angeschlossen? Du hast jetzt 10E6-Schleifendurchläufe.. das müsste reichen.
Also ich habe es mal im AVRStudio getestet: Der Compiler optimiert die Schleifen heraus. Ist eben nicht für die Technik gemacht Stell mal unter -O0 statt -Os unter Project ein. |
|
_________________ Gruß Berecke |
|
|
|
 | |  |
Verfasst am: 26.03.2010, 17:56 |
|
|
| schorschi |
|
|
 |
| Anmeldungsdatum: 10.03.2010 |
| Beiträge: 2 |
| Wohnort: Ingolstadt |
|
|
 |
 |
 |
|
Vielen Dank, mit der Herausnahme der Optimierungen gehts jetzt. Das mit den leeren Schleifen war wirklich nur zum Test gedacht.
Wie genau ist denn die Funktion delay_ms() - auch wenn das grad nicht mehr richtig zum Thema gehört? Kann man damit brauchbar arbeiten oder wie realisiert man beim ATmega8 eine brauchbare ms-/µs-Basis?
Danke schon mal für die Hilfe!
Grüße sagt
Johannes |
|
|
|
|
| myAVR.de Foren-Übersicht » myAVR Board MK2 USB |
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1
|
|
|
|
|
|