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
> 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')
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.