Hallo thewulf00!
Code:
register uint8_t cnt asm("r3");
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:
do
{
global_cam_pic[cnt]=ADCH;
}while (cnt--);
Hier wird 81 mal eingelesen und nicht 80.
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.
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?
Mein eigener Vorschlag wäre sowas hier:
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);
}
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.
MfG Mark
Lesezeichen