Forum: Mikrocontroller und Digitale Elektronik variablen Portpin setzen ???


von Sven (Gast)


Lesenswert?

hallo Forum,

ich steck im Moment ziemlich fest bei meinem AVR Programm.

Ich habe vor einen Port Pin in Abhängigkeit von einer Variablen an/aus
zu schalten.
Ich habe mittlerweile so ziemlich alles ausprobiert, was mir so
einfällt angefangen
von

sbi(PORTB,(unsigned int) buf[3]);


bis hin zu


void led_portb_on(unsigned int pin)
{
  PORTB|=(1<<pin);
}

int main (void)

unsigned int myint;
char buf[10] ={'\0'};

...

myint = atoi(buf[3]);
led_portb_on(myint);




ich hoffe ihr könnt aus meinem spagetticode erkennen was ich will,
nochmal im Klartext

-> an der 4ten Stelle von buf steht die Ziffer des Portpins, den ich am
Microcontroller setzen möchte.

wäre nett, wenn ihr mir nen tip geben könnte

gruß
Sven

von Rufus T. Firefly (Gast)


Lesenswert?

> myint = atoi(buf[3]);

Das geht in die Hose. atoi() erwartet einen char* als argument und
keinen char.

Somit wird atoi ein vollkommen in den Urwald zeigender Pointer
übergeben.

Besser wäre

myint = buf[3] - '0';

(Vorher sicherstellen, daß '0' <= buf[3] <= '9')

von Sven (Gast)


Lesenswert?

hoppla - diese Syntx ist mir ja völlig neu - werds gleich einmal
ausprobieren und mir mal anschauen, ob dieses - '0' funktioniert und
was es bewirkt.

Sven

von Peter D. (peda)


Lesenswert?

void led_portb_on(unsigned int pin)
{
  PORTB|=(1<<pin);
}

Damit willst Du also nur einen beliebigen Pin von PORTB setzen, aber
nie löschen.

Du weißt schon, was Du da geschrieben hast ?
Wenn nicht, dann solltest Du Dich erstmal näher mit den logischen
Operatoren von C beschäftigen.


Auch sollte man sich bei MCs angewöhnen, immer den kleinsten
ausreichenden Variablentyp zu nehmen. Und da PORTB weniger als 257 Pins
hat, reich also ein "unsigned char pin" dicke aus.


Peter

von Sven (Gast)


Lesenswert?

hallo Peter,

dass ich mit meiner Funktion den Port nur setzen kann ist mir schon
bewusst. Zum ausschalten bzw. toggeln hab ich folgende zwei zusätzliche
Funktionen:

void led_portb_off(unsigned int pin)    //Turn off pin 'pin' on port B
{
  PORTB&=(unsigned char)(~(1<<pin));
}
void led_portb_tog(unsigned int pin)    //Toggle pin 'pin' on port B
{
  PORTB^=(1<<pin);
}

Mein problem dabei ist, das das ganze einfach nicht funktioniert.
Fehler gibts zwar keine im Compiler, aber mein Mikrocontroller sagt zu
dem Code einfach nur: "Nö, mach ich nicht"

Sobald ich aber eine feste ziffer anstelle der Variablen 'pin'
einsetze; also beisp.weise '1', dann leuchtet die LED an Port eins
ordnungsgemäß auf.

Sven

von Peter D. (peda)


Lesenswert?

Das muß beides gehen, schau Dir mal den erzeugten Assembler an.

Du wirst also vermutlich einen falschen Wert (>7) an die Funktion
übergeben.



Bzw. wie wärs denn damit:

void set_clear_PORTB( char set, char clear )
{
  PORTB = PORTB ^ ((clear & PORTB) | (set & ~PORTB));
}

Damit kannst Du alles gleichzeitig.
Z.B.:

set_clear_PORTB( 0x05, 0x03 )

setze PORTB2
lösche PORTB1
toggle PORTB0
unbeeinflußt: PORTB3..PORTB7


Peter

von Sven (Gast)


Lesenswert?

nein, ich bin mir sicher, dass ich keine Ziffern größer 7 übergeben
habe. Wie schon geschrieben habe ich es sowohl mit

led_portb_on(1);

als auch mit

myint = atoi(buf[3]);
uart_putc (buf[3]);           //Rückgabe von buf[3] an den PC => 1
led_portb_on(myint);

ausprobiert, wobei im zweiten Fall sicher eine 1 in buf[3] steht.
Ich tendiere irgendwie zu einem ganz dämlichen Typfehler - Rufus
vermutete in seiner mail ja schon so was in dieser Richtung. Werd mich
jetzt mal echt gleich dran begeben seinen Vorschlag umzusetzen.

Wär klasse wenn noch jemand nen Vorschlag hätte.

Sven

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.