PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GP1A030 Drehgeber - Auswertung mit "C-Programm"



Phoenix2k
05.06.2008, 23:10
Hallo zusammen,

bisher konnte ich alle Fragen zum RN-Control im Wiki oder Forum beantworten, jetz brauch ich aber eure Hilfe, da ich nicht recht weiterkomme.

Den Sensor hab ich jetz nach folgender Anleitung "verlötet":

http://rn-wissen.de/images/7/74/Drehgeber_an_rncontrol.gif

Anschließen würde ich den Ausgang an PD2 und PD3 des µControllers am RN-Control.

Nun aber die Frage, wie ich darauf zugreifen kann. Programmieren tu ich mit AVR-Studio in "C". Das "C-Beispielprogramm" hab ich mir schon angeschaut, bin aber nicht recht schlau geworden, wie ich den Port D auslesen soll.

Ich hoffe ihr könnt mir helfen :)

Gruss
Phoenix2k

oberallgeier
06.06.2008, 00:28
Hallo Phoenix2k,

na ja, so richtig erzählst Du leider nicht, was Du machen willst. Da muss man sich schon was dazudenken. Hoffentlich ists richtig. Leider hast Du auch nicht geschrieben, welche Lichtschranke das ist. Aber bei der Portangabe in Deiner Zeichnung steht ja offensichtlich alles was Du wissen willst. (6) scheint der Signalausgang der Schranke zu sein. Den klemmst Du an einen Pinn vom Microcontroller, der als externer Interrupt extINTx definierbar ist - beim M32/M16 ist das der PD2 oder der PD3. Dort triggerst Du auf eine Flanke - steigende oder fallende - und holst Dir bei jedem Interrupt das Ereignis in der Interrupt-Service-Routine (ISR) ab, indem Du beispielsweise einen Zähler hochzählst. In der Hauptroutine kannst Du dann mit einem Signal von einem Timer die verbrauchte Zeit zwischen zwei Interrupts ausrechnen. Natürlich kannst Du Dir die verbrauchte Zeit auch in der ISR abholen - aber es ist eben gut, diese Routinen so kurz wie möglich zu halten.

Phoenix2k
06.06.2008, 15:34
Hallo oberallgeier,

es handelt sich um eine GP1A030. Ich möchte damit die Drehzahl des Antriebs von meinem Roboter messen.
Interrupt etc. sagt mir im Moment leider noch nicht viel :-k
Da muss ich mich noch schlau machen.

Am liebsten wäre mir ein link zu nem Beispielprogramm in "C" gewesen, damit ich sehe wie man das Ganze programmieren muss.

oberallgeier
06.06.2008, 16:26
Sorry für meine Blindheit, die Typenbezeichnung steht ja im Titel *brrrrrrrr*.


... Interrupt etc. sagt mir im Moment leider noch nicht viel ...Das ist schlecht.

... Da muss ich mich noch schlau machen ... Das klingt gut.

... Am liebsten wäre mir ein link zu nem Beispielprogramm in "C" gewesen, damit ich sehe wie man das Ganze programmieren muss.Das kann ich mir vorstellen :).

Das hier

/* >>
================================================== =================================
Target MCU : M168
Target Hardware : m168D Direktor für R2D03
Target cpu-frequ. : In der Quelle wählbar
================================================== =================================
....
================================================== ============================== */


/* ================================================== ============================ */
/* === Initialisierung fuer EXT_INT0/1 auf Pin 16+17/mega168 =====================
$002 jmp SIG_INTERRUPT0 ; IRQ0 Handler _VECTOR(1)
$004 jmp SIG_INTERRUPT1 ; IRQ1 Handler _VECTOR(2) */
void XTI_0_1_init( void )
{ //Initialisiere beide Interrupts auf rising edge
// d.h. EICRA ISC00,01,10+11 auf 1 (doc,S68)
EICRA |= (1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00);
EIMSK |= (1<<INT1)|(1<<INT0); // und erlaube diese I´s in EIMSK
}
/* ================================================== ============================ */


/* ================================================== ============================ */
/* === Nicht unterbrechbare ISR für EXT_INT1 auf Pin 17/PD3/mega168 =========== */
/* Routine setzt einfach einen Zähler hoch.
Sonst wie ISR für EXT_INT0 für Motor li,re und PWM/Geschw. */
ISR(SIG_INTERRUPT1)
{
Iencdr2 ++; //zähle Counter/encoder2 hoch
Iz_yseci2 = Izeit_1; //Weise Iz_ysec2 dem akt. Timerwert zu
Iz_diff2 = Iz_yseci2-Iz_ysecv2; //Neue Zeit-Differenz2 ausrechnen
Iz_ysecv2 = Iz_yseci2; //der aktuelle Zeitwert wird "Alter"
}
/* ================================================== ============================ */
/* ================================================== ============================ */
ist für (m)einen mega168 und sorgt bei diesem Antrieb (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=344432#344432) für die Messwerterfassung. Die hier genannten Variablen sind wohl alle volatile uint16_t.

Hilft das?