Hallo, ich möcht mich gerne in die PIC-Programmierung mit C einarbeiten. In Assembler habe ich schon erste kleine Erfolge gefeiert. Ich hab ein Experimentier-Board entworfen, das hat bisher auch sehr gut funktioniert. Hab nen Bootloader installiert und den immer schön schnell über die serielle Schnittstelle programmiert. Jetzt hab ich mir den CC5X Compiler runtergeladen und wollte langsam das Online-Tutorial durcharbeiten. Doch schon stoß ich auf erste Probleme. Für den Bootloader brauch ich gleich am Anfang des Quellcodes nen Sprung an Adresse 0x04. In Assembler alles kein Problem: org 0x00 goto start org 0x04 start Aber wie mach ich das in C?? Wenn ich es so mache, mault der Compiler rum: void main(void) // Start des Hauptprogramms { #asm org 0x00 goto start org 0x04 start #endasm TRISB = 0b.0000.0000; PORTB = 0b.0000.0000; } In der Zeile mit dem ersten "org" soll ein Fehler sein: "The expression must be corrected. The marker ^------ shows the approximate position where CC5X gives up. The documentation should be checked if the cause is not obvious." Vielleicht weiß jemand nen Tip wie in C gleich am Anfang nen Sprung an Adresse 0x04 mache? Dankeschön für die Hilfe :-)
Was heisst "ein Sprung an Addresse 0x04"? Ein Sprung wäre das: goto 0x04 Du meinst aber wohl etwas anderes: 'org 0x00' sagt dem Assembler, dass der folgende Befehl (goto start)an Adresse 0x00 stehen soll. In der Assembler-Programmierung bedeutet: org 0x00 goto start org 0x04 start dass beim Einschalten (Power ON) und bei einem Interrupt bei der Adresse 'start' begonnen werden soll. Bei Power ON beginnt der PIC immer bei Adresse 0x00. Steht hier ein 'goto abc', wird dorthin gesprungen. Bei einem Interrupt springt der PIC zur Adresse 0x04. Steht hier ein 'goto xyz' wird dahin gesprungen. In der Regel steht daher am Anfang eines Assembler-Programmes: org 0x00 goto start ; bei Power ON mit Start beginnen org 0x04 goto isr ; bei Interrup zur Interrupt-Service-Routine springen start: : : isr: : : retfi Bei C macht das eigentlich alles der Compiler, d. h. aus deinem void main(void) macht der Compiler: org 0x00 goto main umd erzeugt das Label 'start' an dem der Code beginnt, und aus einem interrupt ; <--- Syntax hängt vom Compiler ab void isr_test(void) ; macht der Compiler org 0x04 goto isr_test und erzeugt das Label 'isr_test' an dem die Interrupt Routine beginnt. Du brauchst also eigentlich überhaupt kein Assembler-Code, der die Einsprungadressen festlegt.
umd erzeugt das Label 'start' an dem der Code beginnt soll heissen und erzeugt das Label 'main' an dem der Code beginnt ^^^^
hm ja klar, aber ich brauch für den funktionierenden bootloader nen quellcode, der auf alle fälle nach 0x04 ausgeführt wird (ob int oder nicht is eigentlich egal)... ich kann natürlich die richtigen zeilen im asm file eintragen und nochmal in mplab compilieren, das is mir aber etwas zu umständlich! kann man das nicht "irgendwie" in c machen?? das muss dann doch auf alle fälle vor 'main' oder???
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.