Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend,
erstmal Danke für euro Infos.
@shedepe
Bei dem XC8 Compiler muss man "eigentlich" nichts extra einstellen, hab mir das nochmal genau angesehen.
@witkatz
so wollte ich das eigentlich haben, dann habe ich irgendwo gelesen, dass man jede Zeile separat als asm (" "); schreiben soll.
ich habe jetzt deine Variante probiert: siehe Screenshoot:
Anhang 32410
irgendwie mag er das nicht:
unable to resolve identifier movlw
unable to resolve identifier movwf
unable to resolve identifier delay_a unexpected token
unable to resolve identifier decfsz
unable to resolve identifier delay_a
unable to resolve identifier nop
unexpected token }
Jetzt das erstaunliche, er hat trotzdem ein Compilat erstellt.....
ich glaub ich muss die ganze IDE neu installieren, da ist doch was faul.
Habe komplett neu installiert. IDE und Compiler.
Das ändert aber nichts. Sehr merkwürdig.
Aber der Hinweis mit dem __delay_us habe ich grad ausprobiert.
Man muss nur ein define _XTAL_FREQ definieren und dann erzeugt der Compiler selbst den Code für die Warteschleife.
Supi, das wuste ich noch nicht. Ist ja auch viel übersichtlicher. Danke Dir witkatz
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat von
Siro
Die eigentliche Frage mit den Statusbits abfragen bei der asm("xxx") Abfrage bleibt aber eigentlich noch offen.
Bei mir funktionierte es mit
Code:
asm("btfss STATUS,2");
... weil in dem zu dem PIC dazugehörenden Header pic16fxxx.h der STATUS Register dem inline Assembler per asm("STATUS equ 03h") definiert wird. Dieser Header wird über die xc.h eingebunden und dadrin sind die SFR für den Inline Assembler definiert - aber nicht die Bits. Bei MPASM sind die SFR und die einzelnen Bits in der p16fxxx.inc definiert. Man kann die Definition der Bits für den Inline Assembler ergänzen, dann funktioniert die Zeroflag Abrage auch symbolisch
Code:
asm("Z EQU 0x0002");
//...
asm(" btfss STATUS,Z ");
Nachtrag:
Zitat:
Zitat von
Siro
Eine definierte Laufzeit, das geht nicht in "C" sondern nur in Assembler...
Darauf sollte man sich im Inline Assembler nicht verlassen, der vom XC8 compiliert und - wenn man es ihm nicht verbietet - optimiert wird. Ich wollte mal interessenhalber deine erste Delay-Routine als separates ASM Modul einbinden s.Bild und schwups wird die DECF BTFSS Sequenz zu DECFSZ optimiert. Ich habe mich nur gewundert, warum eine ASM Routine, die vorher mit asm() Anweisungen in C genau 1ms gebraucht hat (Simulation für PIC16F88 ), als ASM Modul um 25% schneller läuft. Gut zu wissen, dass XC8 auch innerhalb von ASM optimiert, aber für deterministische Laufzeiten ist das nicht so gut.
Anhang 32415
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)
Liste der Anhänge anzeigen (Anzahl: 1)
Das mit den delay muss ich mir nochmal anschauen.
Danke für die Info Witkatz:
Das mit dem Video macht sich garnicht gut, man erkennt nicht annähernd die schönen Farben, das sieht immer weiss aus...
Ich hab es aber mal im Dunkeln gefilmt, nicht schön, besser wie nix.
https://www.dropbox.com/s/mr6gkga5mxkh98k/RGB.MOV?dl=0
hier noch die komplexe1 Schaltung: :)
Anhang 33302
rot Plus
blau Minus
grün Datenleitung zu den Leds2
Siro