Hallo Leute, ich möchte einen ISR möglichst effektif in ASM abarbeiten lassen. Das restliche Programm ist in C geschrieben. Passieren soll folgendes: pro PIN an 2 Ports zähle ich einen Counter herunter und setze ihn sofern er == 0 ist wieder auf seinen Startwertund toggle den PIN. (Frequenzerzeugung) Ließe sich zwar auch mit dem eingebauten Frequenzgenerator lösen, dabei kann ich zwar größere Frequenzen effektiver nutzen aber nicht gleichzeitig 16+ verschiedene Frequenzen ausgeben. Also kurz: Wie kann ich in einem sonst in C geschriebenen Programm die ISR in ASM schreiben ohne das der avr-gcc etwas davor schiebt. Danke euch ! SukApx
Kopiert aus dem Code vom zabex'schen Tablettenwecker, sollte das Prinzip verdeutlichen.
1 | void __attribute__ ((naked)) TIMER1_COMPA_vect(void){ |
2 | asm("in r0, 0x3f" ); //Status sichern |
3 | asm("inc r3" ); //tic++; |
4 | asm("out 0x3f, r0"); //Status wiederherstellen |
5 | asm("reti "); |
6 | }
|
So in C:
1 | #include <avr/interrupt.h> |
2 | |
3 | ISR (ADC_vect, ISR_NAKED) |
4 | {
|
5 | asm volatile ("reti"); |
6 | }
|
oder direkt in Assenbler:
1 | #include <avr/io.h> |
2 | |
3 | .global TIMER1_COMPA_vect |
4 | .type TIMER1_COMPA_vect, @function |
5 | |
6 | TIMER1_COMPA_vect: |
7 | reti |
8 | |
9 | .size TIMER1_COMPA_vect, .-TIMER1_COMPA_vect |
SukApx schrieb: > ich möchte einen ISR möglichst effektif in ASM abarbeiten lassen. http://www.nongnu.org/avr-libc/user-manual/group__asmdemo.html
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.