www.mikrocontroller.net

Forum: Compiler & IDEs Codevorschlag Lauflicht?


Autor: Maik Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich schreibe gerade an einer Studienarbeit und wollte in selbiger auch 
einen Größenvergleich von kompilierten C bzw. Assembler-Code machen. 'ne 
Blinkschaltung war kein Problem, aber ich wollte noch ein Lauflicht 
haben. Das habe ich als Assembler ohne Probleme hingekriegt, aber 
irgendwie fehlt mir ein Algorithmus-Ansatz unter C.

Ich benutze hier auf einer Testplatine einen AT90S2343 mit intern 
aktivierter Taktung und fünf LEDs an dem PortB.

Falls jemand 'n kleinen Vorschlag hat, wäre ich sehr verbunden, meine 
C-Kenntnisse sind eh nicht so besonders und ich habe momentan keine 
Zeit, mich da tiefer einzuarbeiten.

MfG,
Maik

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

#include <avr/io.h>

void wait(void)
{
   unsigned int i;
   for(i=0;i<50000;i++);
}

void main(void)
{
   DDRB=0xFF;

   PORTB = 1;

   while(1)
   {
     PORTB = (PORTB<<1)|(PORTB>>7);
     wait();
   }
}

Ist ein Q&D 1min Hack. Sollte aber funktionieren für 8LED's an Port B.

Matthias

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenns beim größenvergleich ehrlich sein soll, sollte man die wait 
funktion vielleicht als inline deklarieren. und optimierungen nicht 
vergessen!

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Größenvergleich vergleicht ohnehin Äpfel mit Birnen.  Für
das bißchen Code fällt der Overhead vom C-Laufzeitsystem
einfach zu sehr ins Gewicht.  Da keinerlei Interrupts benötigt
werden, kann man in der Assembler-Implementierung natürlich
auch noch die Vektoren weglassen, während (mit einem nicht
modifizierten gcrt1.o) die C-Version immer alle Vektoren
belegt.

Mit einem ernsthaften Vergleich hat das also kaum was zu tun,
dafür sollte man sich schon eine etwas komplexere Aufgabe
raussuchen, bei der man außerdem noch den Arbeitszeitaufwand
für beide Versionen mit einbeziehen sollte.

Autor: Maik Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, der Vergleich wird vielleicht nicht so gut passen, sehe ich ja 
ein.

Was das kleine Beispielprogramm angeht: kann mir mal irgendwer erklären, 
wie es funktioniert? @_@

Ich meine, ich sehe, daß hier eine Leerstelle läuft, aber aus dem 
Vergleich ((PortB kleiner 1) ODER (PortB größer 4)) werde ich nicht 
schlau (mußte den Wert runtersetzen, ich habe ja nur fünf Ports)

MfG,
Maik

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

PORTB = (PORTB<<1)|(PORTB>>7);

Hier wird das 1 Bit das vorher reingeschrieben habe immer um 1 Stellt 
links rotiert. PortB wird also um 1 Bit nach links geschoben und mit dem 
um 7 Bit nach rechts geschobenen Portb verodert (| bitweises OR, || 
logisches OR) Dadurch rotiert die 1 immer über den Port. Mach dir die 
Ausdrücke einzeln klar dann verstehst du auch die Gesamtfunktion. Wenn 
du nur 5 Stellen willst schreibst du

PORTB = ((PORTB<<1)|(PORTB>>4))&0x1F;

Ungetestet. Sollte aber funktionieren.

Matthias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.