- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 17

Thema: Atmega32 mit dem AVR-GCC in Assembler programmieren

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    Beiträge
    449
    Das Problem liegt darin wie die SFR namen definiert sind. Für C sind da die Adressen für den Zugriff als Speicher (per LDS / STS und ähnlich) angegeben. Für die Benutzung in ASM mit den Befehlen IN und OUT muss man davon noch 32 abziehen. Eine Erklärung findet sich im File sfr_defs.h.
    Hat jetzt zwar ein bischen gebraucht, aber ich glaub ich habs gecheckt:

    Im Datenblatt steht:
    Code:
    $12 ($32) PORTD PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0 65
    $11 ($31) DDRD DDD7 DDD6 DDD5 DDD4 DDD3 DDD2 DDD1 DDD0 65
    Die $32 und $31 (jeweils zweite Zahl von Links) sind die Adresse, die der GCC benutzt (umgerechnet von Hex nach Dez sind das nämlich 50 und 49 - die sich auch im Quellcode wiederfinden)

    Wenn ich jetzt 50-32 = 18 Rechne, und in 18 und auch 17 (49 - 32) jeweils 255 mit OUT reinschreibe, leuchten die LEDs!

    Und Praktischerweise sind die 12 und 11 im Datenblatt (jeweils erste Zahl) von hex nach dez umgerechnet auch 18 und 17, ich brauch also auch nicht jedesmal mühsam -32 rechnen :-D


    Vielen vielen Dank Besserwessi und Kampi! :-D


    Viele herzliche Grüße
    -schumi-

    [EDIT]
    Hier noch der aktuelle Quellcode:
    Code:
    #include <avr/io.h>                                                    
    .text
    .global main
    main:
        
        LDI r24, 255
        OUT DDRD-32, r24
        LDI r24, 255
        OUT PORTD-32, r24
        
        Hauptschleife:
            rjmp Hauptschleife
    Geändert von -schumi- (02.09.2011 um 17:30 Uhr)

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Deine Erklärung check ich jetzt nicht ganz

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    Beiträge
    449
    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...

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    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

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    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!

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    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^^)

  7. #7
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    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.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    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

  9. #9
    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?

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress