variablen Portpin setzen ???

Gast #130332
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
Gast #130333
> 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')
Gast #130334
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
#130335
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
Gast #130336
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
#130337
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
Gast #130338
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.