avr-gcc
Nagy Endre
gumo at lucifer.kgt.bme.hu
Sun May 4 15:46:21 CEST 2003
Elkezdtem en is hasznalni az avr-gcc-t, es tenyleg nagyon konnyen lehet
benne programozni :) A multkori port kerdesre a helyes valasz:
if(PINC & _BV(PINC0) == 0) {...}, mivel PINC0 fixen 0-nak van definialva,
csak a bit sorszamat jeloli, PINC viszont a korrektul MMIO-val mappelt
PINC regiszter makroja, tehat hasznalhato inb() nelkul is.
Egyetlen dolog zavarta most meg a nyugalmamat. Akartam irni egy
ezredmasodperces felbontasu keslelteto fuggvenyt a timertol fuggetlenul.
Kezenfekvo a megoldas, az orajeltol fuggoen vegrehajtunk N db ures
ciklust (elvileg N kb. CLK/4000, ha 4 orajel hosszu ciklust csinalunk).
A CLK/4000 tul gyors lett (hibasan!), ezert mindenfele ertekeket
probalgattam. Alant lathato az illeto fuggveny es a gcc altal generalt
assembly forras ket valtozata.
A belso ciklusban van a lenyeg: CLK/160-nal pontosan azt teszi, amit C-ben
irtam, azaz egyesevel csokkenti az i-t. CLK/320-nal viszont mar 25-osevel
csokkenti az i-t! Honnan veszi a 25-ot...?
Most akkor egybol irjam is a bugreportot, vagy van valami esszeru
magyarazat a tortentekre?
Gumo
========================================
#define CLK 8000000
...
void delay(uint16_t ms) {ˇ
uint16_t i;ˇ
for(;ms;ms--) {ˇ
for(i=CLK/160;i;i--) {ˇ
}ˇ
}ˇ
}ˇ
========================================
.LM3:ˇ
ldi r18,lo8(-15536)ˇ
ldi r19,hi8(-15536)ˇ
.L10:ˇ
subi r18,lo8(-(-1))ˇ
sbci r19,hi8(-(-1))ˇ
brne .L10ˇ
.stabn 68,0,68,.LM4-delay
.LM4:ˇ
sbiw r24,1ˇ
brne .L11ˇ
========================================
#define CLK 8000000
...
void delay(uint16_t ms) {ˇ
uint16_t i;ˇ
for(;ms;ms--) {ˇ
for(i=CLK/320;i;i--) {ˇ
}ˇ
}ˇ
}ˇ
========================================
.LM3:ˇ
ldi r18,lo8(25000)ˇ
ldi r19,hi8(25000)ˇ
.L10:ˇ
subi r18,lo8(-(-25))ˇ
sbci r19,hi8(-(-25))ˇ
brne .L10ˇ
.stabn 68,0,68,.LM4-delay
.LM4:ˇ
sbiw r24,1ˇ
brne .L11ˇ
========================================
More information about the Elektro
mailing list