Witam
Otóż mam mały problem. Pisze sobie szybkie przerwanie dla timera na Atmega644, to co mi kompilator z C przetłumaczył na assembler wrzuciłem do wstawki assemblerowej a przerwanie zadeklarowałem z argumentem ISR_NAKED, rejestry używane w przerwaniu zarezerwowałem przez:
aby nie było potrzeby odkładać i zdejmować ze stosu, bo to dużo czasu trwa przy obsłudze przerwania. I mam problem bo w C mi to śmiga ale już w asmie nie, kod poniżej, rozumiem wszystko oprócz zaznaczonego strzałkami, jak procesor odnajduje właściwą komórkę pamięci tablicy signal[] po zmiennej licznik, skąd te dwie liczby ?? Po uruchomieniu przerwania licznika, procesor się blokuje :-\ N to stała równa 1000 w hex 0x3E8. Wiem co robią poszczególne instrukcje chodzi mi o sposób wskazywania właściwej komórki w tablicy, może jakoś we wstawce assemblerowej można inaczej wskazać na początek tablicy??
Tablica jest zadeklarowana tak: volatile uint8_t signal[N];
Jak chciałem zrobić tak
To był błąd
Kod:
Otóż mam mały problem. Pisze sobie szybkie przerwanie dla timera na Atmega644, to co mi kompilator z C przetłumaczył na assembler wrzuciłem do wstawki assemblerowej a przerwanie zadeklarowałem z argumentem ISR_NAKED, rejestry używane w przerwaniu zarezerwowałem przez:
register uint16_t licznik asm("r30");
register uint16_t temp asm("r24");
register uint16_t temp1 asm("r26");
register uint8_t temp2 asm("r18");
register uint8_t skok asm("r2"); aby nie było potrzeby odkładać i zdejmować ze stosu, bo to dużo czasu trwa przy obsłudze przerwania. I mam problem bo w C mi to śmiga ale już w asmie nie, kod poniżej, rozumiem wszystko oprócz zaznaczonego strzałkami, jak procesor odnajduje właściwą komórkę pamięci tablicy signal[] po zmiennej licznik, skąd te dwie liczby ?? Po uruchomieniu przerwania licznika, procesor się blokuje :-\ N to stała równa 1000 w hex 0x3E8. Wiem co robią poszczególne instrukcje chodzi mi o sposób wskazywania właściwej komórki w tablicy, może jakoś we wstawce assemblerowej można inaczej wskazać na początek tablicy??
Tablica jest zadeklarowana tak: volatile uint8_t signal[N];
Jak chciałem zrobić tak
"LDI R26,(signal) \n\t"
"LDI R27,high(signal) \n\t"
To był błąd
Kod:
//SIGNAL(TIMER1_COMPA_vect)
ISR(TIMER1_COMPA_vect, ISR_NAKED)
{
asm volatile("IN R18,0x3F \n\t"
"PUSH R18 \n\t"
"CLR R18 \n\t"
// wyjscie = signal[licznik];
"MOVW R24,R30 \n\t"
"MOVW R26,R30 \n\t"
"SUBI R26,0x89 \n\t" < - TO
"SBCI R27,0xFD \n\t" < - I TO
"LD R18,X \n\t"
"OUT 0x02,R18 \n\t"
// licznik += skok;
"ADD R24,R2 \n\t"
"ADC R25,R18 \n\t"
"MOVW R30,R24 \n\t"
// if(licznik >= N) licznik = 0;
"SUBI R24,0xE8 \n\t"
"SBCI R25,0x03 \n\t"
"BRCS tu \n\t"
"CLR R30 \n\t"
"CLR R31 \n\t"
"tu: \n\t"
"OUT 0x3F,R18 \n\t"
"POP R18 \n\t"
"RETI \n\t"
::);
}