Guten Abend,
ich bräuchte da mal von ein paar Profis hilfe. Ich hab eine Schlatung
für Schrittmotoren aufgebaut die auch einwandfrei funktioniert.
Ich wollte jetzt ein Menü schreiben und auf dem Display die Menüpunkte
ausgeben. Leider ist jetzt die Grenze von 1k Speicher mit dem CC5X
Compieler voll. Kann mir jemand helfen in dem er mir erklärt wie ich
meine Menüpunkte im EEPROM ablegen kann und auch wieder aufrufe um so
mehr Speicher zu bekommen.
Ich hab auch schon versucht mich mit verschiedenen Bänken zu
beschäftigen. Dann könnte ich ja 4k auf den Chip speichern, aber alle
Anleitungen die ich gefunden habe konnte ich nicht umsetzten.
Vielleicht hat jemand von euche eine einfache Anleitung wie ich das
hinbekomme.
Bin für alle Ratschläge und Tips dankbar!
Grüße Marc
Hallo Marc!
Deine konkrete Frage kann ich zwar nicht beantworten. Es gibt aber
einen Weg wie Du 1k-Grenze umgehst:
Im Prinzip geht das so:
1) Du schreibst deine Unterprogramme in eigene Dateien (hier musst Du
allerdings einige wichtige Regeln beachten)
2) Eine eigene Headerdatei (Endung: .H), in der alle
Funktionsprototypen definiert sind, alle externen Variablen und so
3) Mit einer BAT-Datei werden alle C-Dateien (in eine ASM-Datei)
kompeliert
4) Mit der MPLAB-IDE (genauer mit dem Linker) erfolgt nun die
Zusammensetzung des gesammten Projekts.
5) Wenn Du Interrupts auch noch verwendst, musst das lkr- File (in
deinem Fall 16f877.lkr (ist irgendwo dort, wo MPLAB installiert ist)
gemäß dem Handbuch zum CC5X-Compiler anpassen!
Kennst Du die Seit www.cc5x.de ? - Dort ist das so halbwegs
beschrieben.
Ich habe das ganze für die Ansteuerung eines SED1520- Grafik-Displays
benützt und funktioniert ausgezeichnet.
mfg
Stefan B.
Wenn du mit demm CC5X schon mal was größer wie 1k compeliert hast, wärst
du dann so freundlich mir das mal zu schicken oder zu posten? Dass ich
mir mal den Quellcode anschaun kann. Wie das "prinzipiel aufgebaut
werden müsste.
Wär mir echt ne große Hilfe.
Grüße Marc
Hallo Marc!
Na klar!
Bei diesem Projekt handelt es sich um eine PID-Regelung. Ist zwar noch
in Arbeit. Aber darum geht es ja nicht!
Einige Anmerkungen:
1) Die BATCH-Datei (hier pid_demo1.bat) erzeugt aus jeder C-Datei eine
ASM-Datei (mit Hilfe des CC5X-Compilers): Wichtig ist dabei, dass Du
angibst wo sich der CC5X-Compiler befindet:
Der Eintrag zum Uebersetzen der Datei GLCD_BASIS_ROUTINEN.C lautet
daher so:
C:\Programme\bknd\CC5X\CC5X.EXE GLCD_BASIS_ROUTINEN.C
-IC:\Programme\bknd\CC5X\ -u -r -a -r2
Dies musst Du fuer jede C-Datei eingeben.
Wenn in den C-Dateien alles richtig ist (also Syntax und so) werden die
dazugehörigen ASM-Dateien erzeugt. Andernfalls wird die ev. schon
vorhanden ASM-Datei gelöscht. (Die OCC-Datei gibt Auskünft über die
aufgetretenen Fehler)
2) in der MPLAB - IDE müssen nun alle ASM-Dateien eingefügt werden
(nicht die C-Dateien) und die Datei 16f877.lkr Die Datei 16f877.lkr
musst du im MPLAB-Verzeichnis suchen und gemäß CC5x-Handbuch anpassen
oder Du nimmst meine (falls DU den PIC16F877 verwendest)
3) In der MPLAB-IDE Nun mit Project -> Build das Projekt kompelieren.
zunächst wird jede ASM-Datei kompeliert, wobei jede bestätigt werden
muss. Am Ende sollte das ganze etwa so aussehen: (wichtig ist die
letzte Meldung: BUILD SUCCEEDED)
Clean: Deleting intermediary and output files.
Clean: Deleted file "GLCD_BASIS_ROUTINEN.O".
Clean: Deleted file "GLCD_FONT5X7.O".
Clean: Deleted file "GLCD_FONT10X22.O".
Clean: Deleted file "pid_demo.O".
Clean: Deleted file "GLCD_FONT8X14.O".
Clean: Deleted file "PID.O".
Clean: Deleted file
"D:\Stefan\MPLAB_WORK\FUEP4_Dig_PID\PID_Demo1.HEX".
Clean: Deleted file
"D:\Stefan\MPLAB_WORK\FUEP4_Dig_PID\PID_Demo1.mcs".
Clean: Done.
Executing: "C:\Programme\Microchip\MPASM Suite\MPASMWIN.exe"
GLCD_BASIS_ROUTINEN.asm /o+ /e+ /l+ /x- /p16F877 /c+
Executing: "C:\Programme\Microchip\MPASM Suite\MPASMWIN.exe"
GLCD_FONT5X7.asm /o+ /e+ /l+ /x- /p16F877 /c+
Executing: "C:\Programme\Microchip\MPASM Suite\MPASMWIN.exe"
GLCD_FONT10X22.asm /o+ /e+ /l+ /x- /p16F877 /c+
Executing: "C:\Programme\Microchip\MPASM Suite\MPASMWIN.exe"
pid_demo.asm /o+ /e+ /l+ /x- /p16F877 /c+
Executing: "C:\Programme\Microchip\MPASM Suite\MPASMWIN.exe"
GLCD_FONT8X14.asm /o+ /e+ /l+ /x- /p16F877 /c+
Executing: "C:\Programme\Microchip\MPASM Suite\MPASMWIN.exe"
PID.asm /o+ /e+ /l+ /x- /p16F877 /c+
Executing: "C:\Programme\Microchip\MPASM Suite\mplink.exe"
"16f877.lkr"
"D:\Stefan\MPLAB_WORK\FUEP4_Dig_PID\GLCD_BASIS_ROUTINEN.O"
"D:\Stefan\MPLAB_WORK\FUEP4_Dig_PID\GLCD_FONT5X7.O"
"D:\Stefan\MPLAB_WORK\FUEP4_Dig_PID\GLCD_FONT10X22.O"
"D:\Stefan\MPLAB_WORK\FUEP4_Dig_PID\pid_demo.O"
"D:\Stefan\MPLAB_WORK\FUEP4_Dig_PID\GLCD_FONT8X14.O"
"D:\Stefan\MPLAB_WORK\FUEP4_Dig_PID\PID.O" /o "PID_Demo1.HEX"
MPLINK 4.02, Linker
Copyright (c) 2006 Microchip Technology Inc.
Errors : 0
MP2COD 4.02, COFF to COD File Converter
Copyright (c) 2006 Microchip Technology Inc.
Errors : 0
MP2HEX 4.02, COFF to HEX File Converter
Copyright (c) 2006 Microchip Technology Inc.
Errors : 0
Loaded D:\Stefan\MPLAB_WORK\FUEP4_Dig_PID\PID_Demo1.COD.
BUILD SUCCEEDED: Wed May 03 10:30:38 2006
3) wie schon gesagt muss es eine HEADER-Datei geben, wo der Prozessor
definiert ist, alle externen Variablen Unterprogramme usw.
Bei mir heisst Diese Datei immer PROJEKT.H
4) bei dieser modularen Programmierung können als Übergabe- oder
Rückgabewerte der Unterprogramme NUR 8-Bit-Zahlen verwendet werden.
Wenn Du aber 16bit-Werte benötigst, so musst Du diese als externe
Variablen definieren (bei mir heissen diese zB. tmp_uebergabe_uns16
Jede Externe Variable muss nicht nur in der HEADER-Datei definiert
werden, sondern auch in einer (beliebigen) C-Datei.
mfg
Stefan B.
PS.: Es ist geplant, eine etwas übersichtlichere
(Schrit-für-Schritt)-Doku zu diesem Thema zu erstellen, aber zur Zeit
fehlt mir noch die Zeit, ausserdem ist das ganze für mich ebenso noch
etwas Neuland
Erst mal vielen Danke an dich von meiner Seite.
ICh werde das ganze geleich mal Probieren ob es funktioniert. Ich hab
jetzt schon versucht den Compieler zu wechslen aber das ist auch ein
Riesen aufwand das schon fertige Programm um zu schreiben.
Ich hab das jetzt mal versucht. Hat leider net gleich funktioniert. Das
Problem war, dass meine Verzeichnissstruktur zu lange war. Inzwischen
hat es funtioniert. Muss jetzt bloß den Quellcode von dir in meine
Anwendug einbaun und dann hoffe ich dass es alles funktioniert.
Noch eine Frage zu folgender Datei "PROJEKT.h":
Bezüglich der Protbelegung
--------------------------
Muss ich die Prots inder Headerfile deklarieren, damit Sievvon allen
*.c Files benutz werden können?
Bsp.: #pragma bit GLCD_WR @ PORTB.1
Bezüglich der pages
--------------------------
extern page0 void prog1(bank0 unsigned char zeichen);
extern page1 void prog2(void);
Gehe ich richtig in der Annahme dass sich "prog1" in der
Speicherzelle 0 befindet und "prog2" in Speicherzelle 1 befindet.
Meine 4 pages ( Speicherzellen ) bilden dann insgesamt 4k Speicher?
Werd mich jetzt mal ran machen und mein Programm auf verschiedene pages
um strukturieren.
Wenn ich des soweit auf der Reihe habe und meine Klausuren hinter mir.
Wäre ich gerne bereit einen anständige Step by Step Anleitung mit dir
zusammen zu schreiben. Was ich nämlich so im Netz gefunden habe ist
alles net grad der Renner.
Bezüglich der Portbelegung:
In diesem Fall wäre es nicht notwendig die Ports in der PROJEKT.H -
Datei zu deklarieren, sondern direkt in GLCD_BASIS_ROUTINEN.C, da sie
nur hier verwendet werden. (Du kannst es ja probieren!) Der Grund ist,
dass ich diese Unterprogrammme (zur Ansteuerung des Grafik-LC-Displays)
auch bei anderen Projekten verwende, und da kann es schon mal sein, dass
ich das Display an einen anderen Port anschließe. Die C-Dateien möchte
ich nicht jedesmal anpassen. Die PROJEKT.H - Datei ist sowiese bei
jedem Projekt anderes, also warum dann nicht hier auch die
Port-Definitionen. Ausserdem ist es übersichtlicher, wenn bei einem
größeren Projekt, alle Ports an einer Stelle (also im PROJEKT.H)
angepasst werden. - Habe ich mich verständlich ausgedrückt?
Am besten ist hier: einfach ausprobieren, und aus Fehlern lernen!
Durch das umgehen der 1k-Grenze ist man zu solchen maßnahmen gezwungen,
die vielleicht etwas umständlich wirken.
Ich denke schon, dass bei dir Prog1 in der Speicher-PAGE 0 steht und
prog2 in der PAGE1. So richtig kontrolliert habe ich dass noch nicht.
Da es mir auch egal ist, wo etwas steht. Eine Page ist nicht 1k sondern
2k (beim PIC16F877 hast Du 4 Pages zu je 2k also einen gesamten
Programmspeicher von 8k).
Wie schon gesagt: einfach viel ausprobieren und oft hilft auch das
CC5x-Handbuch.
mfg
Stefan B.
PS.: Wenn Du sonst noch Fragen hast frag, aber ich bin auch noch nicht
so ein Profi was den CC5X-Kompiler betrifft!
Hallo Marc!
Nein direkt mit MPLAB habe ich es auch noch nicht hinbekommen. Nachdem
die "umständliche" Methode mit der BAT-Datei funktioniert habe ich
mir darüber auch keine Gedanken mehr gemacht. Aber Du hast schon recht,
wäre um einiges komfortabler.
Heisst das jetzt, dass bei dir die Methode mit der BAT-Datei
funktioniert, auch wenn Du (kleine) Änderungen an den C-Code vornimmst.
Kannst Du es dann kompelieren und eine HEX-Datei erzeugen?
Übrigens: Das Ergebnis der kompelierung kannst Du ja in den .LST-Files
kontrollieren.
Ist dein eigentliches Problem nun gelöst, oder gibt es da noch
schwierigkeiten?
mfg
Stefan B.
(Linz, Österreich)
Ich muss jetzt erst mal noch mein Programm umschreiben und dann kann ich
dir bescheid geben, ob all meine Fragen beantwortet sind. G
Danke dir aber auf jedenfall mal für deine Hilfe.
Grüße Marc
Hallo Marc!
Ich habe mal begonnen meine Erkenntnisse zum CC5X-Compiler (beim
Umgehen der 1k-Grenze) niederzuschreiben. Allerdings nur was die
Programmiertechniken betrifft. Vielleicht hilft Die dass ja weiter
mfg
Stefan B.
(Linz, Österreich)
Muss dich noch mal was Frage.
Wie kann ich Testen ob meine Teilprogramme funktionieren? Muss ich die
einzel Compilieren?
Bekomm immer den Fehler:
-------------------------------------
//Delay1ms(1000);
}
^------
Error[1] L:\SLSProgHead\SLSMain.c 153 : Function 'LCDZeile0' is not
defined
(The application contains a call to a function that is not defined)
Hallo Stephan.
Das mit dem Testen hab ich raus! Einfach die *.bat ausführen und dann
seh ich ob die ASM Files ok sind.
Jetzt brauch ich noch mal deine Hilfe. Ich hab jetzt meine große Datei
unterteil. Hab im ersten Schritt einfach meine pic Initialisierung in
eine Extra Datei geschrieben(TRIS,PORTS,ADCON usw.). Beim erzeugen der
ASM kommen keine Fehler. Wenn ich beide ASM im MPLab linken will kommt
immer ein Fehler.
=====================================================================
Clean: Deleting intermediary and output files.
Clean: Deleted file "INIT.O".
Clean: Deleted file "SLSMain.O".
Clean: Done.
Executing: "C:\Programme\Microchip\MPASM Suite\MPAsmWin.exe"
INIT.asm /o+ /e+ /l+ /x- /p16F877 /c+
Executing: "C:\Programme\Microchip\MPASM Suite\MPAsmWin.exe"
SLSMain.asm /o+ /e+ /l+ /x- /p16F877 /c+
Executing: "C:\Programme\Microchip\MPASM Suite\MPLink.exe"
"16f877.lkr" "L:\SLSProg2\INIT.O" "L:\SLSProg2\SLSMain.O" /o
"SLS.HEX" /kC:\Programme\Microchip\MPASM Suite\LKR
MPLINK 4.02, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - unrecognized input: Suite\LKR
Errors : 1
Link step failed.
BUILD FAILED: Thu May 04 23:25:21 2006
=====================================================================
Ich gehe davon aus, dass die *.lkr irgend wie net stimmt bzw. ich für
meinen Fall etwas ändern muss. Habs probiert und probiert aber es will
net.
Grüße Marc
Habs geschaft ein dummer kleiner Fehler mit großer Auswirkung. Hatte bei
der *.lkr File nen Falschen Pfad im MPLAB.
OK somit hat isch meine Frage geklärt.
DANKE dir. G