Zieht dein Taster die Pin auf Masse? Wenn nicht, ist es klar, dass nichts passiert. Überprüfe das mal.
Ich habe ein do...while daraus gemacht, dann ging es in schleife.... Brachte aber nix, weil es mir um den Taster gehtAußerdem bringt die while da unten gar nichts, das Program läuft so nur einmal durch.
Habe ich jetzt auch probiert, es funktioniert einfach nichts...if(PINB & (1 << PB1))
Habe es in das oben gepostete Programm eingeschrieben,
nix passiert.... Wie immer...
Also
main () // Hauptprogramm, startet bei Power ON und Reset
{
DDRB=3; // 2 Ausgänge definieren
PORTB=0b00001000; // Pull-up Widerstand an PB4 auf ein
if (PINB&(1<<PB3)) // <- irgendwie agiert die Funktion so, als ob es hieße, if (true)
{
PORTB=PORTB|(1<<PB0);
waitMs(500);
....
Zieht dein Taster die Pin auf Masse? Wenn nicht, ist es klar, dass nichts passiert. Überprüfe das mal.
Pin geht auf den Minuspol der Batterie, also Masse (= GND).
Also ich mache das in meinen Programmen auch so:
Erst mal Pullup einstellen: z.B. PORTC |= (1 << PC4);
Dann abfragen mit: if(!(PINC & (1 << PC4)))
Mach auch mal ein Ausrufezeichen davor.
Irgendwie geht es trotzdem nicht...
Kann das daran liegen, dass ich nur 3,6 V (eventuell sogar schon deutlich weniger) verwende, und dass diese den Pull-up nicht überwinden können?
Ich glaube nicht, dass es daran liegt, entweder der µC läuft nicht oder er läuft. Du kannst aber zur Sicherheit mal 4.5V nehmen (also 3 AA-Baterien).Kann das daran liegen, dass ich nur 3,6 V (eventuell sogar schon deutlich weniger) verwende, und dass diese den Pull-up nicht überwinden können?
Poste mal den ganzen Quellcode.
main ()
{
DDRB=00000011;
PORTB = PORTB|(1 << PB3);
if(!(PINB & (1 << PB3)))
do
{
PORTB=PORTB|(1<<PB0);
waitMs(500);
PORTB=0b00001000;
}
while (true);
Eine Blockbatterie muss ich mir erst besorgen, könnte vorerst aber auch einfach eine dritte 1,5 Voltbatterie dazuschließen
Ein Wunder, dass es sich überhaupt compilieren lässt, was soll denn die if bewirken? Es fehlt doch noch ein {} Block, damit man eine bedingte Anweisung hat. Außerdem, es fehlt eine abschließende } und was gibt main() zurück? Wenn nichts, dann muss man trotzdem void dazu schreiben.
Probiere mal das:
void main ()
{
DDRB=0b00000011; //0b weil es eine Binärzahl ist. besser wäre DDRB = 0x03;
PORTB = 0x08; //Pullup aktivieren (PB3)
while(true)
{
if(!(PINB & (1 << PB3)))
{
PORTB=PORTB|(1<<PB0); //PB0 setzen, besser wäre PORTB |= (1 << PB0);
waitMs(500);
PORTB=0b00001000; //PB0 löschen, besser wäre PORTB &= ~(1 << PB0);
}
}
}
Respekt!!
Ich weiß zwar nicht wie, aber es klappt...
Zuerst das while (true) { ...} ?? Kann man damit die Schleife unterbrechen, oder warum gehört das so?Es fehlt doch noch ein {} Block, damit man eine bedingte Anweisung hat.
Darin das if?
Warum das Rufzeichen (Negation)? Kann man stattdessen nicht ein Oder nehmen? Werde das gleich mal probieren...
PS: void main ging nicht, er schrieb irgendwas von 'integer benötigt'. Habe das void weggelassen und es ging...
Ach ja, und die 500 ms klommen mir vor wie 2sek, aber das ist erstmal nebensächlich...
Mfg
while(true) {...} ist eine Endlosschleife, alles was im {...}-Block ist, wird endlos wiederholt. Wenn der Ausdruck in den normalen Klammern (Abbruchbedingung) false ist wird die Schleife abgebrochen (was bei true natürlich nie der Fall sein wird).Zuerst das while (true) { ...} ?? Kann man damit die Schleife unterbrechen, oder warum gehört das so?
if(...) {...} funktioniert praktisch genau gleich, wenn der Ausdruck in den normalen Klammern true ergibt, wird alles was zwischen den geschweiften Klammern steht ausgeführt.
Wenn du das ! weglässt, ist das mit der Taste genau umgekehrt, alles was im if-Block steht, wird ausgeführt, wenn sie nicht gedrückt ist. Also negiert man den Ausdruck, um den Block nur auszuführen, wen die Taste gedrückt ist. Nein man kann hier kein Oder nehmen...Warum das Rufzeichen (Negation)? Kann man stattdessen nicht ein Oder nehmen? Werde das gleich mal probieren...
Was für einen Compiler benutzt du, eigentlich muss void gehen, sonst kannst du int main() schreiben und dann musst du vor die letzte geschweifte Klammer noch return 0; schreiben (dadurch gibt die Funktion eine Integer Null zurück, was soviel bedeutet, wie alles fehlerfrei ausgeführt (obwohl die Stelle durch die Endlosschleife nie erreicht wird). nur main() ist auf jeden Fall ein ganz schlechter Programmierstil (selbst wenn es geht).void main ging nicht, er schrieb irgendwas von 'integer benötigt'. Habe das void weggelassen und es ging...
Das liegt wahrscheinlich daran, dass dein Programm die Frequenz, mit der der µC läuft nicht kennt, binde mal util\delay.h ein (#include <util\delay.h> in die erste Zeile schreiben). In der nächsten Zeile definierst du dann F_CPU mit dem Takt deines µCs (bei 4MHz schreibst du z.B. #define F_CPU 4000000UL).Ach ja, und die 500 ms klommen mir vor wie 2sek, aber das ist erstmal nebensächlich...
Jetzt kannst du statt WaitMs() die Funktion _delay_ms(x) benutzen (x steht für dei Anzahl ms, die gewartet werden soll). Das müsste eigentlich funktionieren.
mfg
Lesezeichen