Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich wollte "mal wieder" etwas Assembler in meinen XC8 Code bringen,
dafür wollte ich aber keinen neuen Thread öffnen, daher führe ich das mal hier weiter:
Der XC8 inline Assembler scheint irgendwie überhaupt nicht mit dem XC8-Compiler zu harmonieren.
Ich kann weder auf Variablen noch auf Konstanten zugreifen, es gibt ständig nur Fehlermeldungen.
Hier mal ein Auschnitt des Screenshoots: ich hab mal den Fehlermeldungen daneben geschrieben
Anhang 33294
Hier ein Ausschnitt des inline Codes:
Code:
#define LED_COUNT 24
unsigned char LedArray[LED_COUNT];
unsigned char byteCount;
unsigned char bitCount;
void LedShiftOut(void)
{
asm("BANKSEL LedArray");
asm("LFSR FSR0,LedArray");
asm("BANKSELECT byteCount");
asm("movlw LED_COUNT");
asm("movwf byteCount");
asm("ByteLoop:");
asm("movlw 8");
asm("movwf bitCount");
asm("movwi fsr0++");
asm("BitLoop:");
asm("RRF WREG,F");
asm("btfss STATUS,Z");
asm("goto isOne");
asm("isZero:");
asm("bcf LATA,5");
asm("NOP");
asm("NOP");
asm("goto BitLoop");
asm("isOne:");
asm("bsf LATA,5");
asm("NOP");
asm("NOP");
asm("decfsz bitCount,F");
asm("goto BitLoop");
asm("decfsz byteCount,F");
asm("goto ByteLoop");
// 50us Pause
}
was mache ich denn falsch ?, das kann doch nicht so kompliziert sein.....
Es wird mir wieder Mal nix anderes übrig bleiben als den gesamten Code in Assembler zu programmieren.:(
[edit]
auf dei Variablen kann ich evtl. zugreifen wenn ich einen Unterstrich benutze, zumindest meckert der Compiler dann nicht.
Es bleiben aber noch genug Probleme übrig...:)
Liste der Anhänge anzeigen (Anzahl: 1)
Ich lach mich kaputt.....
Du hast ja sowas von recht Witkatz
Oh Mann, das tut ja weh :p, vielen Dank für die Info
--------------------------------------------------
Ich habe jetzt einen laufenden Code, fast ausschließlich in "C" , basierend auf der Funktion von Klebwax(dessen Code ich geklaut habe).
Code:
// so viele LEDs sollen angesteuert werden:
#define LED_COUNT 3
/* Jede LED hat 3 Bytes insgesamt also 24 Bits */
typedef struct // __pack weil wir keinen Speicher verschwenden wollen ????
{
U8 green; /* 8 Bit fuer die Helligkeit */
U8 red; /* 8 Bit fuer die Helligkeit */
U8 blue; /* 8 Bit fuer die Helligkeit */
} TLed; /* Type Bezeichner ist TLed */
TLed LedArray[LED_COUNT];
void LedShiftOut(U8* leds, U8 count)
{
U8 one_byte;
U8 bit_count;
count *=3; // 3 Bytes pro Led RGB
while (count) {
one_byte = *leds++; // next Byte
for (bit_count = 0; bit_count < 8; bit_count++)
{
if (one_byte & 0x01) // lowest Bit
{
LATA5 = 1;
asm("NOP");
asm("NOP");
asm("NOP");
LATA5 = 0;
} else
{
LATA5 = 1;
asm("NOP");
LATA5 = 0;
}
one_byte >>= 1;
}
count--;
}
Delay_ms(1);
}
Das Timing stimmt eigentlich nicht, aber das scheint wesentlich unkritischer zu sein als das Datenblatt vorgibt.
Die Low Phasen dürfen nämlich viel länger sein, das scheint nicht zu stören. Die sind bei mir alle so ca. 2us.
Die High-Phasen müssen lediglich stimmen, dann ist die Welt in Ordnung.
Ich habe zwischen den Bytes sogar 5us Pause, das stellt kein Problem dar.
Anhang 33295
Nochmal einen DANK an alle Die mir hilfreiche Informationen gegeben haben (beonders Witkatz + Klebwax)