PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PORTx per Parameter an Funktion übergeben



Jaecko
05.01.2012, 16:05
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?



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

PicNick
05.01.2012, 16:26
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/Atmel_Controller_Mega16_und_Mega32#Adressen_Mappin g

Jaecko
05.01.2012, 17:04
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.

PicNick
05.01.2012, 18:07
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

sternst
06.01.2012, 00:32
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.

PicNick
06.01.2012, 08:31
Na, endlich einer mit Durchblick, Der kann es sich auch leisten, auch ein bisschen pampig zu werden.