Hi!
So, jetzt passiert endlich mal was.
Letzte Woche sind die Bauteile für die Fernbedienung angekommen, habe dann gleich eine Platine geätzt und bestückt.
Nach 3 Stunden probieren wusste ich dann auch, dass der Kondensator an Reset zum Programmieren weg muss 
Dann lief erstmal alles gut, Ansteuerung für Dualshock war schnell geschrieben, Kommunikation zum PC läuft auch ohne Probleme und das Funkmodul scheint auch zu funktionieren.
Xmegas sind echt toll.
Jedenfalls habe ich jetzt doch ein Problem, dass ich mir einfach nicht erklären kann.
In meinem Programm sende ich dem Xbee 3 Plus Zeichen um es in den Command Mode zu versetzen, danach soll es ein "OK<CR>" zur Bestätigung senden.
Das kommt auch definitiv an.
Jedenfalls möchte ich die Zeichen, die das Xbee sendet in einer Interrupt Routine in ein Char Array schreiben, das später durch die Debug() Funktion an den PC übertragen werden soll.
In der Funktion gebe ich auch die Zählvariable ISRCounter aus, die in der Interrupt Routine hochgezählt werden soll.
Außerdem Toggle ich in der ISR das untere Nibble von PORTB, dadurch sehe ich an den LEDs, dass die ISR auch ausgeführt wird.
Das Problem ist, dass der ISRCounter immer seinen Ursprungswert behält, in dem Fall 0, ich habe es aber auch mal oben mit 1 definiert, auch dabei bleibt der Wert 1.
Ich kann mir das einfach nicht erklären, der Wert ist auch volatil und global, aber er ändert sich einfach nicht.
Hier das Hauptprogramm:
Code:
#include "Dualshock.h"
volatile char USARTdata[20];
volatile uint8_t ISRCounter = 0;
void DebugOut()
{
while(!(USARTD0.STATUS & USART_DREIF_bm));
USARTD0.DATA = ISRCounter;
for(uint8_t i = 0; ((USARTdata[i - 1] != 13) && (i < 20));i++)
{
if(USARTdata[i] != 0x00)
{
while(!(USARTD0.STATUS & USART_DREIF_bm));
USARTD0.DATA = i;
while(!(USARTD0.STATUS & USART_DREIF_bm));
USARTD0.DATA = USARTdata[i];
}
}
}
int main(void)
{
Init::Clock_Init();
Init::USART_Init();
PMIC.CTRL |= PMIC_HILVLEN_bm; //High Level Interrupts freigeben
sei();
PORTB.DIR = 0xFF;
PORTB.OUT = 0x00;
Dualshock::init();
while (!(Dualshock::SetAnalogMode() == 0x73)); //Versuchen in Analog Mode zu wechseln, bis es funktioniert
_delay_ms(1000); //Funkmodul in Command Mode
while(!(USARTC0.STATUS & USART_DREIF_bm));
USARTC0.DATA = '+';
while(!(USARTC0.STATUS & USART_DREIF_bm));
USARTC0.DATA = '+';
while(!(USARTC0.STATUS & USART_DREIF_bm));
USARTC0.DATA = '+';
_delay_ms(1000);
DebugOut();
while(1)
{
Dualshock::getBytes();
//while (!( USARTD0.STATUS & USART_DREIF_bm));
//USARTD0.DATA = Dualshock::RightY;
//while (!( USARTD0.STATUS & USART_DREIF_bm));
//USARTD0.DATA = Dualshock::RightX;
//PORTB.OUT = (Dualshock::RightX & 0x0F);
}
}
ISR (USARTC0_RXC_vect)
{
USARTdata[ISRCounter] = USARTC0.DATA;
PORTB.OUTTGL = 0x0F;
//if(USARTdata[ISRCounter] == 13)
//ISRCounter = 0;
//else
ISRCounter ++;
}
Kann sich das jemand erklären?
Ich habe mal darauf verzichtet, die Klassen zu Posten, die Funktionen sollten soweit selbsterklärend sein.
Falls jemand Interesse hat kann ich natürlich die Dualshock Klasse hochladen.
Edit:
Habe das Problem jetzt gelöst bekommen.
Problem war einfach nur, dass das Xbee etwas mehr als eine Sekunde braucht um nach dem empfangen der "+++" Zeichenfolge das OK zurückzuschicken.
Deshalb wurde zu dem Zeitpunkt, wo die Debug Funktion aufgerufen wird noch kein einziges mal die ISR ausgeführt.
Echt mies, dass ich erst jetzt drauf gekommen bin, naja egal, jetzt läuft alles bestens.
Hoffe, dass der Kram aus China bald ankommt, langsam wird es langweilig mit der Fernbedienung.
mfg
Olaf
Lesezeichen