- 3D-Druck Einstieg und Tipps         
Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 50

Thema: Befehl: Eingang prüfen (ATtiny13)

  1. #21
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Außerdem bringt die while da unten gar nichts, das Program läuft so nur einmal durch.
    Ich habe ein do...while daraus gemacht, dann ging es in schleife.... Brachte aber nix, weil es mir um den Taster geht

    if(PINB & (1 << PB1))
    Habe ich jetzt auch probiert, es funktioniert einfach nichts...

    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);
    ....

  2. #22
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Zieht dein Taster die Pin auf Masse? Wenn nicht, ist es klar, dass nichts passiert. Überprüfe das mal.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  3. #23
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Pin geht auf den Minuspol der Batterie, also Masse (= GND).

  4. #24
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    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.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  5. #25
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    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?

  6. #26
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    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).

    Poste mal den ganzen Quellcode.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  7. #27
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    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

  8. #28
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    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);
    }
    }
    }
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  9. #29
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Respekt!!

    Ich weiß zwar nicht wie, aber es klappt...

    Es fehlt doch noch ein {} Block, damit man eine bedingte Anweisung hat.
    Zuerst das while (true) { ...} ?? Kann man damit die Schleife unterbrechen, oder warum gehört das so?

    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

  10. #30
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Zuerst das while (true) { ...} ?? Kann man damit die Schleife unterbrechen, oder warum gehört das so?
    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).

    if(...) {...} funktioniert praktisch genau gleich, wenn der Ausdruck in den normalen Klammern true ergibt, wird alles was zwischen den geschweiften Klammern steht ausgeführt.

    Warum das Rufzeichen (Negation)? Kann man stattdessen nicht ein Oder nehmen? Werde das gleich mal probieren...
    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...

    void main ging nicht, er schrieb irgendwas von 'integer benötigt'. Habe das void weggelassen und es ging...
    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).

    Ach ja, und die 500 ms klommen mir vor wie 2sek, aber das ist erstmal nebensächlich...
    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).
    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
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests