- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Atmega32 mit dem AVR-GCC in Assembler programmieren

  1. #11
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    30
    Beiträge
    449
    Anzeige

    Powerstation Test
    Der GCC benutzt DDRD. Aus irgend einem Grund, den ich noch nicht kenne, ist aber die Adresse, die sich hinter "DDRD" verbirgt für "OUT" und "IN" um 32 zu groß. -> 32 abziehen und passt.

    Und im Datenblatt is die Adresse eben zweimal angegeben, erst ohne Klammern, so wie sie für "OUT" und "IN" passt und dann nochmal mit klammern, so wie sie sich hinter "DDRD", "PORTD" usw. verbirgt...

    Was das jetzt alles auf sich hat -> Ich weis es (noch) nicht... Aber damit funktioniert es zumindest schonmal so weit...

  2. #12
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    30
    Beiträge
    449
    Ok, hab mir jetzt mal die sfr_defs.h angeschaut, oben steht:
    The \c <avr/sfr_defs.h> file is included by all of the \c <avr/ioXXXX.h>
    files, which use macros defined here to make the special function register
    definitions look like C variables or simple constants, depending on the
    <tt>_SFR_ASM_COMPAT</tt> define. Some examples from \c <avr/iocanxx.h> to
    show how to define such macros:


    \code
    #define PORTA _SFR_IO8(0x02)
    #define EEAR _SFR_IO16(0x21)
    #define UDR0 _SFR_MEM8(0xC6)
    #define TCNT3 _SFR_MEM16(0x94)
    #define CANIDT _SFR_MEM32(0xF0)
    \endcode


    If \c _SFR_ASM_COMPAT is not defined, C programs can use names like
    <tt>PORTA</tt> directly in C expressions (also on the left side of
    assignment operators) and GCC will do the right thing (use short I/O
    instructions if possible). The \c __SFR_OFFSET definition is not used in
    any way in this case.


    Define \c _SFR_ASM_COMPAT as 1 to make these names work as simple constants
    (addresses of the I/O registers). This is necessary when included in
    preprocessed assembler (*.S) source files, so it is done automatically if
    \c __ASSEMBLER__ is defined. By default, all addresses are defined as if
    they were memory addresses (used in \c lds/sts instructions). To use these
    addresses in \c in/out instructions, you must subtract 0x20 from them.


    For more backwards compatibility, insert the following at the start of your
    old assembler source file:


    \code
    #define __SFR_OFFSET 0
    \endcode
    Und es funktioniert sogar :-D

    Code:
    #include <avr/io.h>        
    #define _SFR_ASM_COMPAT 1
    #define __SFR_OFFSET 0                                    
    .text
    .global main
    main:
        
        LDI r24, 255
        OUT DDRD, r24
        
        LDI r24, 255
        OUT PORTD, r24
            
        Hauptschleife:
            rjmp Hauptschleife

  3. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ich find das voll clever wie du das anpackst.

    /* Port D */
    #define PIND _SFR_IO8(0x10)
    #define DDRD _SFR_IO8(0x11)
    #define PORTD _SFR_IO8(0x12)

    Das findet man in der Datei iom32.h die von io.h eingebunden wird. Find ich eh ziemlich "unsportlich":

    #include <avr/io.h>

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #14
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    30
    Beiträge
    449
    Ich find das voll clever wie du das anpackst.
    Vielen Dank! :-D

    /* Port D */
    #define PIND _SFR_IO8(0x10)
    #define DDRD _SFR_IO8(0x11)
    #define PORTD _SFR_IO8(0x12)

    Das findet man in der Datei iom32.h die von io.h eingebunden wird. Find ich eh ziemlich "unsportlich":

    #include <avr/io.h>
    Du meinst also, ich sollte am Anfang meiner main.S anstatt #include <avr/io.h> die defines du du eben genannt hast verwenden?

    Ich müsste das dann aber für alle Register machen, also für alle Ports und was halt noch so zusammenkommt... Da nutze ich lieber die Vorteile die der AVR-GCC bietet und schummle ein bischen :-D

    (Hab auch schon versucht die delay.h für Wartezeiten zu benutzen, aber der schmeisst schon beim #include <avr/delay.h> Fehler ohne Ende^^)

  5. #15
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Ach komm stell dich nicht so an
    Timer in ASM sind doch leicht. Musst nur 1x die richtigen Bits in die Register schieben und das war es schon. Das einziger schwere ist wieder die ISR wegen Registerinhalte retten usw. aber das ist bei jeder ISR so.

  6. #16
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    30
    Beiträge
    449
    Ich hab jetzt ein Programm geschrieben, das folgendes macht: Normal leuchtet LED1 und solang man Taster1 drückt leuchtet LED2

    Code:
    Code:
    #define PIND    0x10
    #define DDRD    0x11
    #define PORTD   0x12
    
    
    #define PINB    0x16
    #define DDRB    0x17
    #define PORTB   0x18
                                
    .text
    .global main
    main:
        
        LDI r24, 255
        OUT DDRD, r24
        
        LDI r24, 0
        OUT DDRB, r24
            
        Hauptschleife:
            SBIC PINB, 1
            LDI r24, 0b00100000
            SBIS PINB, 1
            LDI r24, 0b01000000
            OUT PORTD, r24
            rjmp Hauptschleife
    Und funzt auch... :-D

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    13.11.2011
    Beiträge
    29
    Ich habe mal eine abweichende Frage dazu und zwar ist es mit dem GCC auch möglich die AT&T Syntax zu benutzen?

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Frage zum Programmieren im Assembler
    Von Toni224 im Forum PIC Controller
    Antworten: 11
    Letzter Beitrag: 12.02.2010, 18:13
  2. IRQ Programmieren in Assembler
    Von cmc im Forum Assembler-Programmierung
    Antworten: 6
    Letzter Beitrag: 08.03.2007, 11:12
  3. ASURO in Assembler programmieren!
    Von Ronny10 im Forum Asuro
    Antworten: 0
    Letzter Beitrag: 06.01.2007, 13:30
  4. Wie in Assembler programmieren?
    Von Jens im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 5
    Letzter Beitrag: 22.04.2006, 16:34
  5. Voyage 200 in Assembler programmieren?
    Von Murus im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 11
    Letzter Beitrag: 04.10.2005, 19:10

Berechtigungen

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

Solar Speicher und Akkus Tests