PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was macht meine hex so groß ???



delaware
20.01.2010, 11:03
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]

sternst
20.01.2010, 11:31
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.

delaware
20.01.2010, 11:39
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

delaware
20.01.2010, 12:03
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

uwegw
20.01.2010, 13:35
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.

askazo
20.01.2010, 14:59
Timer benutzen!
Dafür sind die Dinger doch schließlich da :)

Gruß,
askazo

delaware
21.01.2010, 11:10
Ja, die Timer ...

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

Ceos
21.01.2010, 13:59
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