Forum: Compiler & IDEs AVR-GCC ISR in ASM


von SukApx (Gast)


Lesenswert?

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

von perlbastel (Gast)


Lesenswert?

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
}

von SukApx (Gast)


Lesenswert?

Perfekt !

Besten Dank ;-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.