PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu Servo ansteuerung von RN-Wissen



der aller dümmste Anfänge
14.12.2009, 22:31
Hallo,
ich bin endlich wieder da. Habe mal 2-3 Jahre ausflug auf einer x86 Architektur gemacht.
Jetzt kann ich C so schon ein Bisschen und so ab jetzt gibts ein rn-Control zu Hl-Abend.
So jetzt zur Frage, ich blick das Code beispiel für den Servo (http://www.rn-wissen.de/index.php/Servo)ansteuerung nicht (also ich weiß, dass einige Konstanten in den fehlenden includes stehen aber die Syntax/Sinn macht mir bei den Zitierten Stellen probleme) im RN-Wissen bereich von hier:


OCR2 = F_CPU/100000; //alle 10µS ein IRQ

Wie komme ich da auf die 10µs die Angegeben sind und bei welcher Frequenz?

Später kommt dann:



#define SERVOPIN 7
#define SERVOPORT PORTD

if(count>servopos)SERVOPORT&=~(1<<SERVOPIN);

Was macht die Tilde (ok ich mach selten was mit Bittweisen Operanten aber ist die Tilde nicht dafür da zum Interviren?) Warum mach ich nicht:


#define SERVOPIN 7
#define SERVOPORT PORTD
volatile unsigned char servopos;
static int count;

if(count>servopos)SERVOPORT&=(0<<SERVOPIN);


Danke für eure Bemühungen schon im Vorraus.

der aller dümmste Anfänge
14.12.2009, 22:48
#define Servopin 7
#define Servoport PORTD
volatile unsinged char seropos;
static int count;
if(count>servopos)SERVOPORT&=~(1<<SERVOPIN); :


#define servopin 7
(1<<servopin) => 10000000

ich aber genau
01111111 brauche muss ich mit der Tilde machen da sonst mit meiner Version dies rauskäme:
00000000 Drinsteht und mit dem Und wurde im Ganzen Port nur 0 anliegen, egal was die Anderen Ports machen.
Stimmt das so?
Und bei:
OCR2=F_CPU/10^5 ganz einfach wenn man mal die Definition von Frequenz anschaut grob gesagt Zyklen pro s. und um auf eine 10µs zu kommen brauch ich halt nur CPU-Frequenz/10^5.
Stimmt das auch?

Jetzt neue Frage was macht:


#define DDRSERVO DDRD
#define SERVOPIN 7
DDRSERVO|=(1<<SERVOPIN);

DDR sind die (ich nenne sie einfachshalber Register kann man das so sagen?) Register die bestimmen welcher Port ein Ein-/Ausgang ist?
Und ich will kein Selbstgespräch führen. und meine doch recht große Anzahl an Beiträgen sind eigentlich blos Zustimmung zu guten Projekten

Hubert.G
15.12.2009, 09:38
Für das DDRSERVO usw. muss es am Anfang des Code ein #define geben, oder es sind Registernamen..
Irgend welche Zeilen herausnehmen macht wenig Sinn. Derjenige des das kommentieren will, muss sich immer den gesamten Code ansehen, oder zumindest einen größeren Teil davon.

der aller dümmste Anfänge
15.12.2009, 16:14
Ok ich habe die Defines dazu geschrieben, aber restlichen Code weggelassen, sonst wird nicht klar wo ich was nicht verstehe, und auserdem hab ich einen Link auf die Entsprechende RN-Wissen Seite gelegt.

Hubert.G
15.12.2009, 21:27
OCR2 = F_CPU/100000; //alle 10µS ein IRQ
Hier wird die CPU wohl 10MHz sein, sonst würde alle 10 Takte ein Interrupt erfolgen.
Register und IO zugriffe siehe hier www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_Register

der aller dümmste Anfänge
15.12.2009, 22:37
Also, sind meine vermutungen die ich anstelle in der 2. Post richtig?

Hubert.G
16.12.2009, 09:58
Ja, ist richtig.
DDRSERVO ist ja gleich DDRD, hast du ja im #define festgelegt.
DDRD ist das Data Direction Register PortD
Mit DDRSERVO|=(1<<SERVOPIN); stelltst du PortD7 auf Ausgang.

der aller dümmste Anfänge
16.12.2009, 19:18
Danke. Wo kann ich das hier als gelöst makieren?

radbruch
16.12.2009, 21:55
Warum willst du den Thread löschen? Weil du die Antworten auf deine Fragen zum großen Teil selbst erarbeit und rausgefunden hast?

der aller dümmste Anfänge
16.12.2009, 22:27
Nicht löschen sondern nur von außen erkenn bar dass er gelöst ist, sehe gerade so schöne Icons nehme den Haken.

radbruch
16.12.2009, 22:36
Oje, ich habe " ...als gelös(ch)t markieren" gelesen, sorry.