Gleichzeitig geht bei einem ATMEGA Controller nichts, aber schnell hintereinander schon.

Du könntest die beiden Geberabfragen in einen Interrupt verpacken und Auswertung im Hauptprogramm machen lassen.

Beispiel:
Ein Bumper wurde aktiv. Der "Bumper" Interrupt wir ausgelöst und schaltet die Motoren deines Bots ab. Im Interrupt wird dann noch festgestellt welcher Bumper aktiv war und ein entsprechendes Flag ( Bitvariable ) wird gesetzt.
Dann wird der Interrupt verlassen.

Im Hauptprogramm werden ständig diese Flags ( Bitvariablen ) abgefragt und entsprechend darauf reagiert.

Die Hall Sensoren ( Drehzahlmessung ?? ) lösen dann ebenfalls einen Interrupt aus und geben die ermittelten Werte in entsprechende Pufferspeicher. Zusätzlich kann man da noch ein Flag einbauen, das es neue Werte gibt, die dann im Hauptprogramm nach Verarbeitung wieder gelöscht werden.

Im Hauptprogramm werden dann diese Pufferspeicher ausgelesen und die benötigten Werte berechnet, sowie die Flags gelöscht.

Wichtig ist, das die Interruptroutinen möglichst kurz sind.
Zeitschleifen oder umfangreiche Recheoperationen ( Multiplikationen, Divisionen ) sollte man vermeiden.

Währende eines laufenden Interrupts kann kein weiterer Interrupt ausgeführt werden ( Es geht doch, aber nur mit Tricks ).

Ein anstehender Interrupt geht aber trotzdem nicht verloren, weil das entsprechende Flag Register ja aktiviert wurde.
2 gleichzeitig anstehende Interrupts werden einfach nacheinander abgearbeitet.