Hallo, ich schon wieder. Bin nun weiter was den Aufbau und das Programm selber angeht aber irgendwas klappt da nicht richtig.
Erstmal der Code:
Code:
#include "RP6ControlLib.h"
uint8_t rc_input_left, rc_input_right, rc_input_active;
uint8_t rc_left, rc_right, rc_active;
ISR(TIMER0_COMP_vect)
{
//ISR um Pegel der Pins für RC Steuerung abzufragen
/* Empfaenger liefert ein PWM-Signal entsprechend der Steuerung
ISR fragt regelmaessig den Zustand der Pins ab. Ist der Pin
auf 1 wird die Variable erhoeht.
Je laenger das Signal waehrend einer Signalperiode auf 1 ist
umso groesser wird die Zahl
*/
static uint16_t rc_temp_left = 0;
static uint16_t rc_temp_right = 0;
static uint16_t rc_temp_active = 0;
//RC-Steuerung aktivierung ermitteln
if (PINC & 7)
{
rc_temp_active++;
}
else if (rc_temp_active)
{
rc_temp_active=rc_temp_active;
rc_temp_active=0;
}
//Geschwindigkeit links ermitteln
if (PINC & 6)
{
rc_temp_left++;
}
else if (rc_temp_left)
{
rc_input_left = rc_temp_left-1;
rc_temp_left = 0;
}
//Geschwindigkeit rechts ermitteln
if (PINC & 5)
{
rc_temp_right++;
}
else if (rc_temp_right)
{
rc_input_right=rc_temp_right;
rc_temp_right=0;
}
}
int main(void)
{
initRP6Control();
setLEDs(0);
while(1)
{
writeString_P("RC active :");
writeInteger(rc_input_active, 10);
writeString_P(" - ");
writeString_P("RC links :");
writeInteger(rc_input_left, 10);
writeString_P(" - ");
writeString_P("RC rechts :");
writeInteger(rc_input_right, 10);
writeString_P("\n\r");
}
if (rc_input_active > 500)
{
//blablabla
}
mSleep(500);
return 0;
}
Da die ISR bereits in diesem Programm drinne ist hab ich die entsprechende ISR in der RP6ControlLib.h kurzerhand per /* und */ deaktiviert.
Code:
/*
ISR (TIMER0_COMP_vect)
{
// 16bit timer (100µs resolution)
timer++;
// Blocking delay (100µs):
delay_timer++;
// All 1ms based timing stuff
if(ms_timer++ >= 10) { // 10 * 100µs = 1ms
// 16bit Stopwatches:
if(stopwatches.watches & STOPWATCH1)
stopwatches.watch1++;
if(stopwatches.watches & STOPWATCH2)
stopwatches.watch2++;
if(stopwatches.watches & STOPWATCH3)
stopwatches.watch3++;
if(stopwatches.watches & STOPWATCH4)
stopwatches.watch4++;
if(stopwatches.watches & STOPWATCH5)
stopwatches.watch5++;
if(stopwatches.watches & STOPWATCH6)
stopwatches.watch6++;
if(stopwatches.watches & STOPWATCH7)
stopwatches.watch7++;
if(stopwatches.watches & STOPWATCH8)
stopwatches.watch8++;
// Sound generation timing:
if(controlStatus.beep) {
if(sound_timer < 1) { // sound_timer * 1ms
TCCR2 = 0;
controlStatus.beep = false;
}
else
sound_timer--;
}
ms_timer = 0;
}
}
*/
Die Eingänge habe ich auch gesetzt in der RP6Control.h
Code:
#define IO_PC7 (1 << PINC7) // I/O
#define IO_PC6 (1 << PINC6) // I/O
#define IO_PC5 (1 << PINC5) // I/O (Optional JTAG: TDI)
#define IO_PC4 (1 << PINC4) // I/O (JTAG: TDO)
#define IO_PC3 (1 << PINC3) // I/O (JTAG: TMS)
#define IO_PC2 (1 << PINC2) // I/O (JTAG: TCK)
#define SDA (1 << PINC1) // I2C Data (I/O)
#define SCL (1 << PINC0) // I2C Clock (Output as Master, Input as Slave)
// Initial value of port and direction registers.
#define INIT_DDRC 0b00000000
//#define INIT_PRTC 0b11111100
//PC7 PC6 PC5 als Input ohne Pull-up
#define INIT_PRTC 0b00011100
Die Eingänge habe ich auch mal mit internem Pull-up probiert, aber das ergab keine Änderung.
Verwendet habe ich an der I/O Buchse des M32 auch die Pins PC5, PC6 und PC7 anhand der Anschlussbelegung im entsprechenden Manual.
Das ganze Programm soll vorerst nicht mehr machen als die Werte des Empfängers ermitteln und mit im Terminal ausgeben. Aber bisher gibt der mir nur 0er.
Wenn irgendwer ne Idee hat woran das liegen könnte wär das super.
Selbst wenn ich testweise mal die Pins direkt mit einer Drahtbrücke auf VDD lege ändert sich der Wert nicht.
Und selbst wenn der Empfänger oder der Sender defekt wär und nichts mehr machen würde müsste doch spätestens hier sich was tun. Oder nicht?
Ach und kompilieren lässt sich das ganze natürlich ohne Probleme.
Bei bedarf kann ich auch mal das ganze Codeblocks Projekt packen und anhängen.
Lesezeichen