- Labornetzteil AliExpress         
Ergebnis 1 bis 8 von 8

Thema: Was macht meine hex so groß ???

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    20.01.2010
    Ort
    Oldenburg
    Alter
    52
    Beiträge
    18

    Was macht meine hex so groß ???

    Anzeige

    Powerstation Test
    Hallo,

    ich beschäftige mich seit letzter Woche mit der Prog. von Atmel´s.
    Zuerst mit Assembler und seit gestern mit C.

    Habe jetzt erst mal verschiedene Lauflichter programmiert.

    Mit folgenden Abfragen kann ich die LED´s auf dem STK500 invertieren ist nur ein Ausschnitt des ganzen Programms)

    if (!(PINB & (1<<PINB0))) (d=0xff); //für die Invertierung von c/PORTD
    if (!(PINB & (1<<PINB1))) (d=0x00); //für die Invertierung von c/PORTD



    c ^= d; //c invertieren

    PORTD = c; // c in PORTD ausgeben


    ------------------------------
    Wobei c der Zähler(a) ist welcher durchgereicht wird c=(a<<=1)
    Der Hex Code ist dann ca. 162byte lang.

    Wenn ich folgende Zeile hinzufüge :

    if (!(PINB & (1<<PINB2))) (t=5); //Geschwindigkeit des Lauflichtes

    wird der hex Code 3766 bytes lang !!!



    Warum denn das ?

    christoph

    [/scroll]
    Angehängte Dateien Angehängte Dateien
    • Dateityp: c cprg.c (1,3 KB, 9x aufgerufen)

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Warum denn das ?
    Weil du _delay_ms nur mit einer Konstanten aufrufen darfst. Ansonsten muss die Umrechnung Zeit->Cycles zur Laufzeit gemacht werden, was die Floating-Point-Lib mit rein zieht.

    Ohne die Zeile ist t konstant 10. Der Compiler ersetzt daher das "_delay_ms(t)" direkt durch "_delay_ms(10)". Mit der Zeile ist t nicht mehr konstant, und es macht Bumm.
    MfG
    Stefan

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    20.01.2010
    Ort
    Oldenburg
    Alter
    52
    Beiträge
    18
    Verstehe ich. Wie müsste ich denn sowas machen damit es nicht "Bumm" macht.

    Wäre es besser das delay in eine Schleife zu setzen und mit t die Anzahl
    der Schleifen durchläufe zu ändern ?

    Probier ich mal.

    christoph

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    20.01.2010
    Ort
    Oldenburg
    Alter
    52
    Beiträge
    18
    Ja, ist gut 194 bytes.

    ------------------------------------------
    while (z<t)
    {
    _delay_ms (20); // t ms warten
    z++;
    //PORTD = z;
    }
    z=0;
    -------------------------------------------------------

    Was kann ich denn machen, damit die Taster ständig abgefragt werden.
    Es dauert doch bei einem langen Delay etwas bis eine Tasten Abfrage ausgeführt wird (was ja eigentlich klar ist delay dauert halt).

    christoph

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    4.255
    Eine vernünftige Programmstruktur nehmen, die ohne längere delays auskommt.

    Zum Beispiel: die Hauptschleife (bitte ohne goto!!!) wartet in jedem Durchlauf eine Milisekunde. Außerdem wird eine Variable (nennen wir sie cnt) hochgezählt. Nur wenn nun cnt>t geworden ist, wird das Lauflicht einen Schritt weitergeschaltet, und cnt auf Null gesetzt.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    Timer benutzen!
    Dafür sind die Dinger doch schließlich da

    Gruß,
    askazo

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    20.01.2010
    Ort
    Oldenburg
    Alter
    52
    Beiträge
    18
    Ja, die Timer ...

    die habe ich noch nicht so ganz in mich integriert !.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    kommt noch mit der zeit, statt C funktionen zu vergewaltigen, würde ich dir sowieso vorschlagen ein wenig mehr mit dem datenblatt zu arbeiten, einfach kapitelweise abarbeiten und jede funktion einmal durchprobieren, soweit möglich

    wenn du die peripherie beherrschst, umgehst du zumeist probleme die durch umständliche softwarefunktionen entstehen

    in deinem falle mal in die timer einarbeiten ^^

    und deine Lauflichtfunktion benutzt du als ausgabe

    PS: wenn du mit interrupts arbeitest, das "sei()" nicht vergessen um global die interrupts zu aktivieren, standardmäßig sie die aus bei programmstart

Berechtigungen

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

Labornetzteil AliExpress