-         

Ergebnis 1 bis 6 von 6

Thema: PORTx per Parameter an Funktion übergeben

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987

    PORTx per Parameter an Funktion übergeben

    Anzeige

    Moin.

    An einem Projekt hab ich grad das Problem, dass 3 Geräte am SPI nicht richtig wollen.
    Ein MCP2515 (CAN, 5V) und ein W5100 (Ethernet, Vcc = 3.3V, Pins sind 5V-kompatibel) laufen; hängt man noch ne SD-Karte
    hin (bidirektionaler Pegelwandler 3.3V <=> 5V) geht nix mehr. Die SD-Karte kann nicht initialisiert werden, die LAN-Kommunikation bricht ab.
    Da ich im Moment weder mit nem Oszi noch mit nem Logikanalyzer was find, "hoffe" ich, dass sich irgendwo ein Softwarefehler eingeschlichen hat. Eine der in Frage kommenden Quellen wäre die untere Funktion.
    Sollte doch theoretisch so klappen?

    Code:
    void MyFunc1(volatile ui8_t *port, ui8_t pin)
    {
      *port |= (1 << pin);
    }
    void MyFunc2(volatile ui8_t *port, ui8_t pin)
    {
      *port &=~ (1 << pin);
    }
    
    // Aufruf:
    MyFunc1(&PORTA, 4);
    ...
    MyFunc2(&PORTA, 4);
    mfG
    #ifndef MfG
    #define MfG

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Du musst aufpassen, wie (beim funktionsaufruf) PORTA definiert ist.
    Beim AVR haben die IO-Register gewissermasse zwei adressen: die für die IO-Registerbefehle und die das allgemeine Adress-mapping

    Für letzteres (also z.B für deine zwei Funktionen) muss als adresse ein Wert + 0x020 angegeben werden.
    http://www.rn-wissen.de/index.php/At...ressen_Mapping
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Das ist ja ne gemeine Falle.
    Aber wenn ich das richtig sehe, dürfte das beim M2650 mit PORTA passen.
    In der iomxx0_1.h (included über die iom2560.h) ist PORTA so definiert:
    #define PORTA _SFR_IO8(0X02)

    _SFR_IO8(x) addiert in der sfr_defs.h 0x20 dazu, wenn __AVR_ARCH__ < 100 ist; und wenn mich der AVR Simulator nicht reingelegt hat, müsste __AVR_ARCH__ für den M2560 = 6 sein.
    Also sollte PORTA schon die korrekte Adresse + 0x20 behinhalten.
    #ifndef MfG
    #define MfG

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Schlimmstenfalls nimmst du das Datenblatt --> register summary und definierst dir den Wert selber.
    dann:
    #define MY_PORTA 0x03B

    // Aufruf:
    MyFunc1(MY_PORTA, 4);

    Kein "&", denn "my_porta" ist ja schon die adresse
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von PicNick Beitrag anzeigen
    Du musst aufpassen, wie (beim funktionsaufruf) PORTA definiert ist.
    Beim AVR haben die IO-Register gewissermasse zwei adressen: die für die IO-Registerbefehle und die das allgemeine Adress-mapping

    Für letzteres (also z.B für deine zwei Funktionen) muss als adresse ein Wert + 0x020 angegeben werden.
    Sorry, aber das ist Kokolores. "&PORTA" ist völlig in Ordnung und ausreichend, um den Rest kümmert sich der Compiler.
    MfG
    Stefan

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Na, endlich einer mit Durchblick, Der kann es sich auch leisten, auch ein bisschen pampig zu werden.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Ähnliche Themen

  1. Port oder Alias an Funktion als Parameter?
    Von luvat im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 30.12.2009, 19:15
  2. Register an Funktion übergeben
    Von EDatabaseError im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 02.11.2008, 15:10
  3. Referenzen, Parameter für TWI-Funktion
    Von Minifriese im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 11.01.2008, 21:54
  4. Datenregister an Funktion übergeben
    Von ach-feld im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 21.03.2006, 09:11
  5. Variable in Funktion übergeben!?
    Von BASTIUniversal im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 04.03.2006, 17:19

Berechtigungen

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