PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisfrage



Shadow²
30.08.2006, 02:20
Hallo!

Nachdem ich mich nun seit ein paar Tagen in die Materie C-Programmierung mit einem AVR eingelesen habe, bleibt eine Verständnisfrage bestehen, die ich einfach nicht selbst beantworten kann:

Warum muss man die ganzen Ports immer um einen Bit verschieben?

Es gibt dafür ja extra die Funktion SFR_IO8, die __SFR_OFFSET dazu zählt.
Nun stellt sich mir aber die Frage: Warum muss man so umständlich erst etwas dazuzählen, um es hinterher auch immer wieder abzuziehen?

Oder hat das einen tieferen Grund, den ich jetzt einfach nur nicht gesehen habe? Ich würde mich jedenfalls über eine Aufklärung sehr freuen.

SprinterSB
30.08.2006, 09:05
Anhand der Frage vermute ich mal, du wirfst was durcheinander...?

Viele AVR SFRs haben zwei Adressen: Einerseits eine I/O-Adresse (zB für SBI) und andererseits eine RAM-Adresse (zB für STS), die durch Mappen der SFRs in den RAM-Adressbereich entsteht. Diese beiden Adressen unterscheiden sich durch eine feste Differenz. Nun will man nicht für beide Adressen Makros schreiben, sondern für SFRs wie SREG nur eine Adresse definieren. Gleichwohl will man diese Adresse in beiden Klassen von asm-Instruktionen verwenden können. Dazu dient __SFR_OFFSET.

Als "normaler" Programmierer braucht man sich nicht darum zu kümmern, wonach Makros wie SREG im Endeffekt auflösen. Je nach Kontext wird avr-gcc die richtige Adressieung zur gewählten asm-Instruktion erzeugen. Wenn du zB schreibst

PORTB |= 1; dann wird die I/O-Adresse verwendet. Wenn du schreibst
unsigned char volatile * p = & PORTB; dann wird die RAM-Adresse genommen.

Etwas kompliziert wird die Lage dadurch, daß man diese Makros auch im GNU-Assembler (avr-as) verwenden können möchte.

robocat
30.08.2006, 11:45
ich weiß nicht, ob ich die frage richtig verstehe..
meinst du folgendes?

bla=(1<<WGM12);
damit wird eine 1 ins "WGM12ste" Bit geschrieben, beim atmega8 ist das zB das 4te Bit (von rechts). es wird also eine 1 um 3 Stellen nach links geshiftet (1->2->4->8=2^3), genauso könnte man also tippen bla=8; allerdings ist es dann hardcodet und läuft evtl nicht mehr auf anderer hardware.

gruesse

Shadow²
30.08.2006, 12:56
@SprinterSB Ah, vielen Dank. Ich hatte mir schon gedacht, dass das eine die RAM und das andere die IO Adresse ist, ich wollte mich nur noch mal versichern ;)

@robocat Ich meinte generell, warum manche Sachen um __SFR_OFFSET verschoben werden. Trotzdem danke :)