www.mikrocontroller.net

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


Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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')

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.