Hallo thewulf00!
Ich bin mir da zwar nicht 100% sicher, aber ich glaube dass das voll nach hinten losgeht, weil cnt dann wirklich als Variable vorhanden sein muss. 'register' sollte man generell nicht benutzen, es sei denn man weiss genau was man tut.Code:register uint8_t cnt asm("r3");
Hier wird 81 mal eingelesen und nicht 80.Code:do { global_cam_pic[cnt]=ADCH; }while (cnt--);
Um den Wert aus dem Array zu laden, werden intern sowieso Pointer verwendet, insoweit wundert es micht, dass es länger dauert. Kannst Du bitte den genauen Code posten?Ich hatte auch schon ein paar Alternativen probiert, z.B. mit Pointern, aber die sind ja gleich alle 16bit und deshalb dauert es dann wesentlich länger.
Mein eigener Vorschlag wäre sowas hier:
Wenn es vom Compiler so übersetzt wird wie man es als Mensch machen würde, würde man pro Pixel nur 7 Takte benötigen.Code:define MAX_X 80 volatile uint8_t global_cam_pic[MAX_X]; static inline void read_cam_line() { PORTD |= _BV(PD0); uint8_t *p = global_cam_pic + MAX_X; do { *--p = ADCH; }while (p > global_cam_pic); PORTD &= ~_BV(PD0); }
MfG Mark







Zitieren

Lesezeichen