Sida 1 av 1
Fråga om #define i h-filen till ATMega48
Postat: 28 september 2010, 16:33:36
av StRob
Hur gör jag för att skriva till en BIT i ett register, i detta fall INTF0 i EIFR?
Det jag är ute efter är alltså att kunna skriva INTF0 = 1; (för att cleara flaggan manuellt.) men det köper inte AVR GCC.
i iom48p.h (som är included) står det:
#define EIFR _SFR_IO8(0x1C)
#define INTF0 0
#define INTF1 1
Betyder inte bara det att när du skriver INTF0 så blir det bara värdet 0?
Jag vill även att det ska fundera med:
i = PIND3; //Förutsatt att i är deklarerat som en bit.
Och det sistnämnda har jag haft fungerande förut i annan µC och annan compilator (annan h-fil) (minns inte vilka).
Hur gör jag?
Jag antar att det är h-filen som skall ändras för att få det att funka. Hur har författaren av h-filen tänkt sig att man skall skriva för att använda:
#define PIND _SFR_IO8(0x09)
#define PIND0 0
#define PIND1 1
#define PIND2 2
#define PIND3 3
#define PIND4 4
#define PIND5 5
#define PIND6 6
#define PIND7 7
tex?
Re: Fråga om #define i h-filen till ATMega48
Postat: 28 september 2010, 16:44:02
av eqlazer
EIFR |= (1<<INTF0);
Re: Fråga om #define i h-filen till ATMega48
Postat: 28 september 2010, 16:44:55
av sodjan
Re: Fråga om #define i h-filen till ATMega48
Postat: 29 september 2010, 10:07:00
av StRob
EIFR |= 1<<INTF0; Fungerar ju fint, men trodde inte det skulle behöva vara så "jobbigt". och det är ju så himla lättläst med direkt adressering.
Det var nog för PIC och CC5X som jag bara kunde skriva PB7=1 eller liknande. Minns inte exakt, men det vara bara att adressera direkt iaf.. Saknar det
EIFR.INTF0 = 1; Fungerar inte. "error: expected identifier before numeric constant" Vad är identifier?
Om man ska använda macros (som beskrivs i den översta länken som Sodjan tipsade om), var skriver man dem? I sin C-fil eller i någon H-fil?
Har ni något bra tips om någon bra lista med "programmeringsregler" för C om vad som anses praxis och kutym vad gäller upplägg pådeklarationer, variabler, exempel på "försnacket" till rutiner ska se ut, är det ok att använda goto (har fått uppfattningen att det är en delad skola hurvida det är ok eller inte) osv?
Re: Fråga om #define i h-filen till ATMega48
Postat: 29 september 2010, 10:47:15
av mri
Angående prxis och kutym kan du kanske hitta nåt i comp.lang.c Frequently Asked Questions.
http://c-faq.com/
Angående goto tycker jag att man kan använda goto om det gör koden elegantare och enklare att förstå. Undvik dock att använda goto på samma sätt som i BASIC, dvs överallt.
Re: Fråga om #define i h-filen till ATMega48
Postat: 29 september 2010, 11:14:12
av sodjan
Re: Fråga om #define i h-filen till ATMega48
Postat: 7 oktober 2010, 15:43:34
av StRob
Väcker lite liv i den här tråden igen då jag måste förtydliga det lite..
Varför är iom48p.h skriven på detta sätt:
Kod: Markera allt
#define PORTB _SFR_IO8(0x05)
#define PORTB0 0
#define PORTB1 1
#define PORTB2 2
#define PORTB3 3
#define PORTB4 4
#define PORTB5 5
#define PORTB6 6
#define PORTB7 7
istället för:
Kod: Markera allt
#define PORTB _SFR_IO8(0x05)
#define PORTB0 1
#define PORTB1 2
#define PORTB2 4
#define PORTB3 8
#define PORTB4 16
#define PORTB5 32
#define PORTB6 64
#define PORTB7 128
Och istället för att skriva PORTB |= (1<<RORTB5) då skriva PORTB |= PORTB5 för att sätta bit 5, och PORTB &= ~(1<<PORTB5) skriva PORTB &= ~PORTB5 för att cleara bit 5?
Jag antar att det finns en bra anledning?
Re: Fråga om #define i h-filen till ATMega48
Postat: 7 oktober 2010, 16:25:55
av Micke_s
Tror det mest beror på om man vill skriva inline assembler alt stora delar i gas (gnu assembler). det är samma headerfil man använder.
T.ex. sätta en pinne heter sbi i assembler
den har formatet sbi PORT, pin där pin är mellan 0 och 7.
Re: Fråga om #define i h-filen till ATMega48
Postat: 7 oktober 2010, 16:55:35
av Johanb
EIFR.INTF0 = 1; betyder väl att INTF0 skulle vara en medlem av structen EIFR vilken mig veterligen inte finns i avr-libc?