leluno schrieb:
> Das Hauptprogramm macht während des Füllens des Buffers nichts und
> wartet nur ab.
Das ist dann aber ein Argument dafür, nicht über Interrupts zu gehen.
Denn den bewussten Pin, der sonst den Interrupt auslösen würde, per
Polling auf Flankenwechsel abzufragen, geht schneller als wenn die
Flanke einen Interrupt auslöst, woraufhin der µC erst mal einen Jump in
den Interruptvektor und dort dann durch die Push/Pop Orgie einer ISR
samt anschliessenden Return muss.
Denn sowas
1 | if(!vsync)while(!vsync);
|
2 | while(vsync);
|
wird auf einem AVR dank Bitoperationen, die direkt am Port arbeiten,
recht effizient umgesetzt. Was sich hier in C recht langatmig
präsentiert sind auf Maschinencodeebene gerade mal (wenn ich mich im
Kopf nicht verzählt habe) 4 Instruktionen.
Und dasselbe kannst du auch mit deinem (jetzt noch) Interrupt
auslösenden Pin machen.
Nebeneffekt:
Dadurch ermöglichst du dann auch dem Compiler, hier
1 | buffer[i]=((PIND&0xf)>>4)|((PINA&6)<<3)|((PINB&12)<<4);
|
2 | i++;
|
in der Optimierung zuzuschlagen, weil er das i nicht mehr laufend im
SRAM sichern bzw. sich holen muss, sondern ganz bequem die Operation
mehr oder weniger komplett in der Schleife in den Registern abwickeln
kann. Wobei ich dann sogar erwarten würde, dass er das i komplett
rauswirft, sich die Adresse von buffer in den Z-Pointer holt und dann
mit einem STS++ arbeitet.
Unter diesen Voraussetzungen sehe ich dann auch für die 350kHz nicht
mehr schwarz. 350kHz sind bei 16Mhz 45 Takte von einer Flanke zur
nächste. Ohne das jetzt kompiliert zu haben, sollte das locker
ausreichen um
1 | while( href )
|
2 | {
|
3 | while( !(PINx & (1<<TRIGGER) )
|
4 | ;
|
5 | while( (PINx & (1<<TRIGGER) )
|
6 | ;
|
7 |
|
8 | buffer[i]=((PIND&0xf)>>4)|((PINA&6)<<3)|((PINB&12)<<4);
|
9 | i++;
|
10 | }
|
mit 350kHz Triggerfrequenz durchzubringen.
(Ich weiss jetzt nicht, auf welchem Pin beim 1284 der INT0 Eingang
liegt, daher hab ich PINx geschrieben. Auch weiss ich nicht, ob du die
fallende oder die steigende Flanke brauchst - gegebenenfalls anpassen)