PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Register übergeben



Christoph2
22.02.2008, 22:41
Hallo!
Wie kann ich ein ein Register (PIN oder PORT) in ein Unterprogramm übergeben.
Ich weiß dass es mit Pointern geht, aber da brauche ich einen Cast, das will ich vermeiden.

bei den Funktionen:


bit_is_set(PINB, 5)
bit_is_clear(PINC, 2)

Geht das ja auch.

Ich habe nach ihnen in den Include datein gesucht, aber nichts gefunden, was ich verstanden habe, die includedatein schaun gar nicht wie C aus, ich checks überhaupt nicht.

Diese Funktion will ich schreiben (ohne Cast beim Aufruf):


void wait_for_key (uint8_t *inputreg, uint8_t inputbit) // Pin Register über Pointer einlesen
{ do{}
while(bit_is_set(*inputreg, inputbit)); // Auf Tastendruck warten
_delay_ms(50); // Entprellung

do{}
while(bit_is_clear(*inputreg, inputbit)); // Aufs loslassen warten
_delay_ms(50); // Entprellung
}

Aufruf:

int main(void)
{ ...
wait_for_key((uint8_t*)&PINC, 0);
...
}

lg Christoph

zerush
22.02.2008, 23:02
Also,

bei der bit_is_set() wird der WERT des registers übergeben und daraus dann ermittelt, ob das entsprechende Bit gesetzt ist.

Für deine Funktionen reicht das übrigens auch voll aus!
Also einfach uint8_t inputreg verwenden...

uwegw
22.02.2008, 23:11
avr-libc-Doku FAQ Punkt 12.

PS: und zum Entprellen sollte man einen Timer-Interrupt verwenden, statt mit einer Warteschleife den Betrieb aufzuhalten! Warteschleifen sind in den meisten Fällen schlechter Programmierstil. Außerdem ist _delay_ms nur für kurze Verzögerungen gedacht, 50ms sind zb mit 16MHz nicht mehr möglich.

zerush
22.02.2008, 23:22
Oh, ja ich sehe grad, dass zweinmal auf das Register in der Funktion zugegriffen wird, dann würde das nicht klappen, wenn du nur den Wert übergibst. Dann lass es so wie es oben steht und übergebe die Adresse des Ports einfach wie uwegw geschrieben hat.

Also Aufruf mit
wait_for_key(&PINC, 0);