Servus mal wieder.
Ich habe mal wieder eine Frage was das verändern der Library betrifft, da bin ich nämlich absoluter Neuling.
(ich hoff es is ok in dem fred)
Und war bezieht sich das auf diesen Code:
Code:
#include "RP6ControlLib.h" // The RP6 Control Library.
// Always needs to be included!
/*****************************************************************************/
// Variables and procedures:
void configServoTimer (void);
volatile uint16_t servo1, servo2, servo3, p; // Servopositionen und Impulszähler
uint8_t c; // freie variable
/*****************************************************************************/
int main(void)
{
initRP6Control();
showScreenLCD("################", "################");
mSleep(1000);
showScreenLCD("<<Mein Test", "<<LC - DISPLAY>>");
mSleep(2000);
showScreenLCD(" Servo - Test 2 ", " Version 1.00 ");
mSleep(2000);
clearLCD(); // Clear the whole LCD Screen
configServoTimer();
DDRC = IO_PC5 | IO_PC6 |IO_PC7 ; // Servopins auf Ausgang setzen
servo1=servo2=servo3=220; // Servomitte?
setLEDs(0b1001); // und los!
while(1)
{
showScreenLCD("In main", "<<test");
mSleep(2000);
for(c=0;c<6;c++) // 6 mal ein einfaches Demo....
{
setLEDs(1<<c);
servo1=servo2=servo3=220; // mitte
p=50; while(p); // warten bis 50 Impulse gesendet (ca. 1 Sek.)
servo1=servo2=servo3=100; // links
p=50; while(p);
servo1=servo2=servo3=340; // rechts
p=50; while(p);
}
}
return 0;
}
void configServoTimer (void) {
cli();
// Timer 1:
// Clear OC1A when up-counting and set OC1A when down-counting,
// mode 8 (PWM, Phase and Frequency Correct, TOP ICR1), clk/8
TIMSK |= (1 << TOIE1);// Die Timer1 Overflow-ISR zur Servoansteuerung
TCCR1A = (1 << COM1A1)
| (0 << COM1A0)
| (0 << COM1B1)
| (0 << COM1B0)
| (0 << FOC1A)
| (0 << FOC1B)
| (1 << WGM11) //mode10
| (0 << WGM10);//mode10
TCCR1B = (0 << ICNC1)
| (0 << ICES1)
| (1 << WGM13) //mode10
| (0 << WGM12) //mode10
| (0 << CS12) //ohne vorteiler
| (0 << CS11) //ohne vorteiler
| (1 << CS10); //ohne vorteiler
ICR1 = 50; // 8mhz/(2*100) =160 kHz
sei();
return 0;
}
ISR (TIMER1_OVF_vect)
{
static uint16_t servocount=1;
if(servocount > servo1) PORTC &= ~IO_PC5; else PORTC |= IO_PC5; // IO Pin 3
if(servocount > servo2) PORTC &= ~IO_PC6; else PORTC |= IO_PC6; // IO Pin 4
if(servocount > servo3) PORTC &= ~IO_PC7; else PORTC |= IO_PC7; // IO Pin 1
if(servocount < 3200) servocount++;
else {servocount=1; if(p) p--;} // p = 1/50 Sek
}
Wie man sieht hab ich die Konfigurationen vom Timer als ersten schritt mal in eine eigene Procedur gepackt.
Jetzt hab ich mir gedacht ich schreibe diese Prozudur in die Lib rein, damit sie "weg" ist.
Also hab ich die Procedur erstellt und in die rp6control lib.c gepackt und compiliert. Im mainprogramm gibt es jetzt aber das problem dass die procedur wenn ich sie aufruf nicht "erkannt" wird.
Wie gesagt, so wie ich es getan hätte wäre es für mich logisch gewesen, aber ich hab auch noch nie eine Lib verändert, von daher kann ich auch irgendetwas vergessen hab.
PS: GANZ komisch ist, (das hab ich zuerst versucht) dass ich die ISR in die lib packe. komischerweiße wird die while schleife dann überhaupt nicht abgearbeitet. Das main-programm fängt immer wieder von vorne an?!?
Wär super wenn mir jemand Hilfestellung geben könnte
Lesezeichen