mikrocontroller.net

Forum: Compiler & IDEs _SFR_IO_ADDR() ATMEGA2560


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich möchte gern dies tun

set_loop:
sbic _SFR_IO_ADDR(PORTH),PH2
rjmp set_loop
out  _SFR_IO_ADDR(PORTA), 24
ret

es lässt sich aber nur so
set_loop:
sbic _SFR_IO_ADDR(PORTA - PORTG),PH2
rjmp set_loop
out  _SFR_IO_ADDR(PORTA - PORTG), 24
ret

kompilieren. PORTH und für PORTS aufwärts funktioniert es nicht

es kommt die meldung

switch.S:13: Error: number must be less than 32

Wo liegt mein Problem??? Schonmal Danke !!!!




Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Problem liegt darin, dass der sbic-Befehl nur für die unteren 32 
I/O-Register funktioniert (Register-Adressen bis 0x1F bzw. RAM-Adressen 
bis 0x3F). in/out gehen mit den unteren 64 I/O-Registern. Darüberhinaus 
(extended I/O-Space, Register mit RAM-Adressen ab 0x60) nur mit lds/sts. 
Schau Dir bitte im Instruction Set Manual die Bereiche für die Parameter 
der einzelnen Befehle an.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Schnelle Antwort


Also muss ich erst aus dem I/O Register die Werte auslesen und dananch 
ein Compare machen. Sehe ich das richtig.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph wrote:
> Danke für die Schnelle Antwort
>
>
> Also muss ich erst aus dem I/O Register die Werte auslesen und dananch
> ein Compare machen. Sehe ich das richtig.
Genau. Die Portregister für Port A-G liegen alle bei Adressen kleiner 
als 0x1F, weshalb mit denen alle Bitoperationen direkt (also über die 
Assembler-Befehle wie z.B. sbic) durchführbar sind. Die Register von 
Port H-L liegen allesamt im extended I/O Space und müssen erst mit lds 
in ein Rechenregister geholt werden, bevor irgendwelche Vergleiche oder 
Änderungen vorgenommen werden können.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, du kannst danach auch sbrs/sbrc benutzen, das sind die
Äquivalente zu sbis/sbic.  Aber das Prinzip bleibt, du musst
die Werte erst einmal vom Port in Register lesen.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok danke für Eure Hilfe !!!

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kurze Frage noch wieso geht das nicht ?

workreg = 16
.global set_fast_j4
.func set_fast_j4
set_fast_j4:
          lds workreg,_SFR_IO_ADDR(PINH)
    sbrc workreg,PH2
    rjmp set_fast_j4
    out _SFR_IO_ADDR(PORTG), 24
    ret
.endfunc

Danke

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
out _SFR_IO_ADDR(PORTG), 24

ist ein Synonym für

out _SFR_IO_ADDR(PORTG), r24

und damit vermutlich nicht das, was du willst.

Folgendes Stück C-Code:
#include <avr/io.h>

void set_fast_j4(void)
{
        while (PINH & _BV(PH2))
                ;
        PORTG = 24;
}

übersetzt der Compiler zu:
.global set_fast_j4
        .type   set_fast_j4, @function
set_fast_j4:
/* prologue: frame size=0 */
/* prologue end (size=0) */
.L3:
        lds r24,256
        sbrc r24,2
        rjmp .L3
        ldi r24,lo8(24)
        out 52-0x20,r24
/* epilogue: frame size=0 */
        ret
/* epilogue end (size=1) */

Ich verstehe gar nicht, warum du das unbedingt zu Fuss in Assembler
hacken willst...

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

ich möchte es nicht unbedingt zu Fuß machen ich muss mir aber sicher 
sein wie lange der Controller benötigt um zu Pollen deswegen wollte ich 
die Geschichte in Assembler schreiben. Es geht für diese Anwendung 
tatsächlich im Bereich von ns. Leider steht mir bei der Karte keine 
Interruptleitung zur Verfügung. Mein Gedanke war folgender

- in C -Wert per UART übergeben berechnen und übergeben an 
Assemblerfunktion
- Zeit bis hierhin muss ich als Offset herausbekommen(Messen)
- übergeben aus dem C-Code extern void set_fast(uint8_t value); an ASM

- im Assemblerfile Pollen(PH3 bzw. PH2 für ret ) und den übergebenen 
Wert(value) so schnell wie möglich an den Port schreiben( 6 Cycles ) 
müssten es dann sein.
Deswegen mache ich mir solche Mühe mit der Sache. Meinst du kürzer als 
der Compiler würde man es eh nicht schaffen ? Dann lass ich es gern mit 
Assembler! Bin für jede Möglichkeit offen Zeit zu sparen

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph wrote:

> Meinst du kürzer als
> der Compiler würde man es eh nicht schaffen ?

Siehe oben: ja.  Ist mit -Os compiliert, aber das sollte egal sein,
solange du überhaupt irgendeine Optimierung hast.

Autor: katzeklo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> sbic _SFR_IO_ADDR(PORTH),PH2

Was ist das denn für ein Syntax? Geht es nicht mehr mit

sbic    PORTH, PH2

?

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Geht es nicht mehr mit
>  sbic  PORTH, PH2

nicht im _inline_-Assembler des (AVR-)GCC :(
hth. Jörg

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.