Hauptseite   Module   Alphabetische Liste   Datenstrukturen   Datenstruktur-Elemente   Zusätzliche Informationen  

Beispielprojekt: led

Originalboard:
AVR-Ctrl
Der Name dieses Beispieles ist ein wenig irreführend. Das Beispiel soll zeigen, wie mit Hilfe der LED API der hierfür konfigurierte 8 Bit Ausgabeport für einfache Bitausgaben benutzt werden kann (siehe Bild). Hinter dem Treiber IC2 können über die Anschlüsse LAST[7..0] externe Verbraucher, wie Lampen oder Motorwicklungen angeschlossen werden. Je Bit von Port B kann eine separate Last geschaltet werden. Diese sind aufgrund des offenen Kollektors von IC2 bei Ausgabe einer 1 eingeschlatet und bei 0 ausgeschaltet. Auf dem Herkunftsboard AVR-Ctrl sind parallel zu diesen Ausgängen LEDs angeschlossen. Somit kann man auf diesem Board die Zustände der geschalteten Lasten kontrollieren (siehe auch Beispielprojekt: ledband).

led.png

Schaltplan angeschlossener Lasten

Konfiguration der Bibliothek

Die Bibliothek muß intern mit den folgenden Parametern übersetzt werden. Dies kann durch Benutzung der originalen Boardkonfiguration über --enable-board=avrctrl-8535-8mhz erreicht werden:

Verwendung der Bibliothek

Der Quellcode

main.c
Zunächst werden alle notwendigen Headerdateien der AVR HAL Bibliothek eingebunden:
    #include <avrhal/delay.h>
    #include <avrhal/led.h>
Danach werden notwendige globale Definitionen und Deklarationen vorgenommen:
    enum {
            UP,
            DOWN
    } direction;
In der Mainroutine wird vor Eintritt in die Endlosschleife das LED Port initialisiert. Das muß mindestens einmal nach einem Reset und noch vor dem ersten Portzugriff erfolgen:
    int main(void)
    {
            uint8_t led = 0x01;
            led_init();
Nach der erfolgreichen Basisinitialisierung kann die Hauptfunktion in der Endlosschleife ablaufen. In unserem Beispiel wird dazu demonstrativ eine 1 am LED Port alle 100ms hin und her geschoben. Alle angeschlossenen Lasten sollten nacheinander ein- und ausgeschaltet werden:
            while (1)
            {
                    led_put(led);
                    delay_ms(100);
                    /* direction state machine */
                    switch (direction)
                    {
                            case UP:
                                    /* count up means
                                     * shift left */
                                    led <<= 1;
                                    if (!led)
                                    {
                                            /* change direction */
                                            led = 0x80;
                                            direction = DOWN;
                                    }
                                    break;
                            case DOWN:
                                    /* count down means
                                     * shift right */
                                    led >>= 1;
                                    if (!led)
                                    {
                                            /* change direction */
                                            led = 0x01;
                                            direction = UP;
                                    }
                                    break;
                            default:
                                    break;
                    }
            }
    } /* main() */
Der vollständige Quellcode kann der AVR HAL Bibliothek unter doc/examples/led entnommen werden.

Übersetzung

C Quelle zu Objekt compilieren
[avr@host] > avr-gcc -g -O2 -Wall -Wstrict-prototypes -Wa \
                     -mmcu=at90s8535 -DAVRHAL_CONFIG_avrctrl_8535_8mhz \
                     -c -o main.o main.c
    
Objekt zu ELF Datei linken
[avr@host] > avr-gcc -Wl,-Map=led.map,--cref -mmcu=at90s8535 \
                     -o led.out main.o -lavrhal-avrctrl-8535-8mhz
    
ELF Datei in Binärdatei, Intel HEX und Motorola S-Record Format überführen
[avr@host] > avr-objcopy -O binary -R .eeprom led.out led.out-rom.bin
[avr@host] > avr-objcopy -O ihex -R .eeprom led.out led.out-rom.hex
[avr@host] > avr-objcopy -O srec -R .eeprom led.out led.out-rom.s19
    
Zum Beispiel Motorolas S-Record:
S00E00006C65642D726F6D2E73313936
S113000010C02AC029C028C027C026C025C024C0CB
S113001023C022C021C020C01FC01EC01DC01CC0E0
S11300201BC011241FBECFE5D2E0DEBFCDBF10E060
S1130030A0E6B0E0ECEBF0E003C0C89531960D9279
S1130040A036B107D1F710E0A0E6B0E001C01D92E0
S1130050A236B107E1F701C0D3CFCFE5D2E0DEBFCE
S1130060CDBFC1E08FEF87BB01E010E0C8BB84E6E1
S113007090E018D08091600090916100009751F059
S11300800197A1F7C69591F7C1E010926100109213
S11300906000ECCFCC0F51F7C0E8109361000093DF
S11300A06000E4CFE82FF92F309639F0A0EDB7E0E7
S10F00B01197F1F7A8953197C9F708954E
S9030000FC

Optionale Informationen:
[avr@host] > avr-objdump -x led.out > led.inf
[avr@host] > avr-size -d led.out > led.siz
[avr@host] > avr-size -x led.out >> led.siz
    
Zum Beispiel Sekmentgrößen:
   text        data     bss     dec     hex filename
    188       0       2     190      be led.out

   text    data     bss     dec     hex filename
   0xbc     0x0     0x2     190      be led.out


Automatically generated by Doxygen 1.2.18 on 17 Jul 2003.