- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 4 von 4

Thema: Verständnisfrage

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    12.01.2006
    Ort
    Braunschweig
    Alter
    33
    Beiträge
    76

    Verständnisfrage

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo!

    Nachdem ich mich nun seit ein paar Tagen in die Materie C-Programmierung mit einem AVR eingelesen habe, bleibt eine Verständnisfrage bestehen, die ich einfach nicht selbst beantworten kann:

    Warum muss man die ganzen Ports immer um einen Bit verschieben?

    Es gibt dafür ja extra die Funktion SFR_IO8, die __SFR_OFFSET dazu zählt.
    Nun stellt sich mir aber die Frage: Warum muss man so umständlich erst etwas dazuzählen, um es hinterher auch immer wieder abzuziehen?

    Oder hat das einen tieferen Grund, den ich jetzt einfach nur nicht gesehen habe? Ich würde mich jedenfalls über eine Aufklärung sehr freuen.
    Mit freundlichen Grüßen,
    Shadow²

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Anhand der Frage vermute ich mal, du wirfst was durcheinander...?

    Viele AVR SFRs haben zwei Adressen: Einerseits eine I/O-Adresse (zB für SBI) und andererseits eine RAM-Adresse (zB für STS), die durch Mappen der SFRs in den RAM-Adressbereich entsteht. Diese beiden Adressen unterscheiden sich durch eine feste Differenz. Nun will man nicht für beide Adressen Makros schreiben, sondern für SFRs wie SREG nur eine Adresse definieren. Gleichwohl will man diese Adresse in beiden Klassen von asm-Instruktionen verwenden können. Dazu dient __SFR_OFFSET.

    Als "normaler" Programmierer braucht man sich nicht darum zu kümmern, wonach Makros wie SREG im Endeffekt auflösen. Je nach Kontext wird avr-gcc die richtige Adressieung zur gewählten asm-Instruktion erzeugen. Wenn du zB schreibst
    Code:
    PORTB |= 1;
    dann wird die I/O-Adresse verwendet. Wenn du schreibst
    Code:
    unsigned char volatile * p = & PORTB;
    dann wird die RAM-Adresse genommen.

    Etwas kompliziert wird die Lage dadurch, daß man diese Makros auch im GNU-Assembler (avr-as) verwenden können möchte.
    Disclaimer: none. Sue me.

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    ich weiß nicht, ob ich die frage richtig verstehe..
    meinst du folgendes?
    Code:
    bla=(1<<WGM12);
    damit wird eine 1 ins "WGM12ste" Bit geschrieben, beim atmega8 ist das zB das 4te Bit (von rechts). es wird also eine 1 um 3 Stellen nach links geshiftet (1->2->4->8=2^3), genauso könnte man also tippen bla=8; allerdings ist es dann hardcodet und läuft evtl nicht mehr auf anderer hardware.

    gruesse

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    12.01.2006
    Ort
    Braunschweig
    Alter
    33
    Beiträge
    76
    @SprinterSB Ah, vielen Dank. Ich hatte mir schon gedacht, dass das eine die RAM und das andere die IO Adresse ist, ich wollte mich nur noch mal versichern

    @robocat Ich meinte generell, warum manche Sachen um __SFR_OFFSET verschoben werden. Trotzdem danke
    Mit freundlichen Grüßen,
    Shadow²

Berechtigungen

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

Labornetzteil AliExpress