wenn ich das richtig sehe musst du beim PORTB =5 nicht 5 sondern 4 hinschreiben weil 5 wäre ja 101 und du willst ja eigentlich 001 haben wenn ich das richtig verstehe! So leuchtet die LED an PORTB0 andauernt mit!
Hallo zusammen
Ich habe eigentlich nur ein kleines Problem, dass mich aber bereits mehrere Stunden in Anspruch genommen hat.
Schaltung:
Es sind zwei LED an PortB0 und PortB2 angeschlossen über einen 1kOhm Widerstand gegen Masse.
Hardware: Atmega32 4MHz Quarz, progammed mittels avrdude
Software:
#include "io.h"
#include "iom32.h"
void wait () {
int i;
for (i = 0; i <20000; i++) {
int j;
for(j = 0; j <20000; j++){
}
}
}
int main (void)
{
//DDRB = (1<<DDB2);
DDRB = (1<<DDB0) | (1<<DDB2);
while (1) /* Note [6] */
wait();
PORTB = 1;
wait();
PORTB = 5;
wait();
return (0);
}
Die wait-Funktion verzögert ungefähr eine Sekunde. Wahrscheinlich sogar etwas mehr.
Nun zum Problem: Es funzt gar nicht. Nur dass LED an PortB0 dauernd leuchtet. Was ist falsch? Selbt wen der AVR nicht den externen Quart nehmen würde, sollte dennoch ein blinken stattfinden.
Danke für eure Hilfe
wenn ich das richtig sehe musst du beim PORTB =5 nicht 5 sondern 4 hinschreiben weil 5 wäre ja 101 und du willst ja eigentlich 001 haben wenn ich das richtig verstehe! So leuchtet die LED an PORTB0 andauernt mit!
Wenn etwas klemmt, wende Gewalt an.
Wenn es kaputt geht,
hätte es sowieso erneuert werden müssen.
Wenn ich richtig bin ist das Zeichen beim DDRB | bedeutet das nicht oder?Zitat von semicolon
Müsste da nicht ein & hin? Oder && ! Das weis ich jetzt nicht genau!
Wenn etwas klemmt, wende Gewalt an.
Wenn es kaputt geht,
hätte es sowieso erneuert werden müssen.
Ja, das bedeutet oder.
Will man ein Bit auf 1 setzen, so macht man ein oder. Um es auf 0 zu setzen, muss man es mit und behandeln. 1 oder irgendwas gibt immer 1, 0 und irgendwas gibt immer 0.
Btw, code-Tags wären cool
Code:#include "io.h" #include "iom32.h" void wait () { int i; for (i = 0; i <20000; i++) { int j; for(j = 0; j <20000; j++) { } } } int main (void) { //DDRB = (1<<DDB2); DDRB = (1<<DDB0) | (1<<DDB2); while (1) /* Note [6] */ wait(); PORTB = 1; wait(); PORTB = 5; wait(); return (0); }
Zu Erinnerung mal die korrekte Syntax für das Setzen von Bits in den Registern:
Bit setzen:
PORTB |= (1<<PB4);
(ODER [|] mit der Bitmaske rechts und dem alten Zustand)
Bit löschen:
PORTB &= ~(1<<PB4);
(UND [&] mit der INVERTIERTEN [~] Bitmaske)
Bit toggeln:
PORTB ^= (1<<PB4);
(EXODER [^] mit der Bitmaske)
PS: für die Verzögerung bietet sich auch folgendes an:
Code:#include <avr/delay.h> void warte(uint16_t loop) //loop: wartezeit in ms { uint16_t i; for(i=0;i<loop;i++) _delay_ms(1); }
Moment, hab ich da gerade gesehen
?Code:while (1) /* Note [6] */ wait();
macht das nicht endlos wait?
Ich denke es sollte wohl eher eine { hinter das wait und dann später nochmal.
Also praktisch so:
Code:#include "io.h" #include "iom32.h" void wait () { int i; for (i = 0; i <20000; i++) { int j; for(j = 0; j <20000; j++) { } } } int main (void) { //DDRB = (1<<DDB2); DDRB = (1<<DDB0) | (1<<DDB2); while (1) /* Note [6] */ { wait(); PORTB = 1; wait(); PORTB = 5; } return (0); }
Genau! Der While-Schleife fehlen die Klammern!!!
So ergibt sich für den Compiler eine leere While-Schleife, deren Bedingung immer wahr ist, daher beliebt der AVR für immer in dieser Zeile hängen...
ne aber muss while nicht auch mit geschwiften klammern ein gerückt sein in etwa so:
int main (void)
{
//DDRB = (1<<DDB2);
DDRB = (1<<DDB0) | (1<<DDB2);
while (1) /* Note [6] */
{
wait();
PORTB = 1;
wait();
PORTB = 5;
wait();
}
return (0);
}
Wenn etwas klemmt, wende Gewalt an.
Wenn es kaputt geht,
hätte es sowieso erneuert werden müssen.
Nur Spass... Hat bestimmt jeder schonmal sowas gebautZitat von semicolon
Ich zumindest bin das erste Mal fast verzweifelt, als ich nach einem while() was gelöscht hatte und aber den ; nicht mitgelöscht habe und dann nie was tat.
EDIT:
Das letzte wait() habe ich in meinem Stück Code übrigens auch weggelassen, da ja sonst das wait() ausgeführt wird, dann die Schleife von neuem anfängt, wo dann gleich wieder ein wait() steht. Falls das so geplant war, dann wieder einfügen
Danke für eure Hilfe.
Habe vor lauter Bäume den Wald nicht mehr gesehen.
Tja, was weggelassene {} so alles auswirken können?!
Danke nochmals
Lesezeichen