Hallo Leute, hab mal wieder ein kleines Problem: Ich werd aus dem "org" Befehlt in MPlab nicht so recht schlau. Der Befehl gibt doch an wo genau ich mein Programm ablege, oder? Bei meinem PIC 16F688 hab ich jetzt extra Flashspeicher um mein Programm abzulegen. Wie mach ich das nun dass ich das dort ablege, und wo in meinem Programm schreib ich das hin. In meinem Template steht einfach org 0x00 ganz am Anfang nach der Variablendefinition. Mein compiler meckert aber dann immer. Also wie mach ich das? Danke
????????????? Also wenn ich .org schreib funktioniert ja gar nix mehr. Das erkennt er mir nicht mal mehr als Befehl ;-)
poste mal deinen code... ..das man da ma was sieht, dann kann man dir vllt besser helfen :-)
Ok, hier isser. Aber mit Vorsicht zu genießen, ist mein erste Code überhaupt. list p=16f688 ; list directive to define processor #include <P16F688.inc> ; processor specific variable definitions ;Grundeinstellungen des PIC setzen. Siehe Datenblatt __CONFIG B'000011100001' ;Seite 100 ;Speicheradressen con CONFIG liegen im .INC file org 0x0000 ; Anfangsadresse des Programms goto Start ;***** VARIABLE DEFINITIONS RESULTO equ 0x20 ;Variable für Bit 9 und 10 des A/D Ergebnisses RESULTU equ 0x21 ;Variable für Bits 1 bis 8 des A/D Ergebnisses ;********************************************************************** Start ; Einstellungen für den internen Oszillator vornehmen bsf STATUS,5 ; Bank 1 anwählen um in OSCCON zu schreiben bcf STATUS,6 bcf OSCCON,0 ; Takt durch externen Oszillator bestimmt bsf OSCCON,3 ; Takt durch externen Oszillator bestimmt ;bcf OSCCON,4 ; Damit wurde ein interner Takt von 4 MHZ ausgewähl ;bsf OSCCON,5 ; Ein Takt beträgt somit 1us ;bsf OSCCON,6 ; Nur nötig wenn interner Oszillator genutzt wird ; Einstellungen für I/O Pins und AD Wandler bcf STATUS,5 ; in Bank 0 wechseln um ADCON0 zu beschreiben bcf STATUS,6 bsf ADCON0,0 ; A/D Modul eingeschalten bsf ADCON0,6 ; Vref wird von PIN 12 abgegriffen bsf ADCON0,7 ; 10 Bit Ergebnis auf rechter Seite der ADRESH und ADRESL Register bcf ADCON0,2 ; bsf ADCON0,3 ; Anschluss AN6 als Analoger Eingang ausgewählt (PIN8) ; PIN 8 müsste auch auf Grundeinstellung bereits als Analoger Eingang definiert sein bsf ADCON0,4 ; bsf STATUS,5 ; in Bank 1 wechseln um ADCON1,ANSEL und TRISC zu beschreiben bcf STATUS,6 bsf ANSEL,6 ; Anschluss AN6 auf Analogen Input gestellt (zugehöriger TRIS muss auch als Input gewählt sein!) bsf TRISC,2 ; Pin 8 = RC2 als Input gewählt bsf ADCON1,4 ; bcf ADCON1,5 ; Auswahl des AD Taktes als 1/16 des Arbeitstaktes des Prozessors(Oszillators). Damit beträgt ein A/D Takt ca. 4us. Und der gesamte Umwandlungsprozess der bsf ADCON1,6 ; A/D Wandlung ca. 44us (11 TAD) ;Einstellungen für die EUSART Schnittstelle bsf TRISC,4 ;Eingänge auf PIN 5 und PIN 6 aktiviert bsf TRISC,5 bcf PIE1,4 ;Interrupt ausgeschaltet ;Sende-und Empfangseinstellungen bcf STATUS,5 ;in Bank 0 wechseln bcf STATUS,6 bcf TXSTA,6 ;8-bit transmission ;bsf TXSTA,5 ;Transmit enabled bcf TXSTA,4 ;Asynchronen Modus auswählen bcf TXSTA,2 ;langsame Übertragung einstellen bsf RCSTA,7 ;Serieller Port angeschaltet bcf RCSTA,6 ;8-bit Empfang bsf RCSTA,4 ;Receiver einschalten für asynchronen Modus bcf BAUDCTL,4 ;TX und nicht TX-Quer ausgewählt bcf BAUDCTL,3 ;8-Bit Baudeinstellung bcf BAUDCTL,1 ;RX,DT Edges generieren keine Interrupts bcf BAUDCTL,0 ;Auto-Baud Modus ausgeschaltet movlw B'00011001' ;Laden der Zahl 25 ins SPBRG Register movwf SPBRG ;Damit wird die Baudrate 2400 eingestellt ;***************Hauptprogrammschleife*********************************** *************** ;A/D Wandlung main bcf STATUS,5 ;in Bank 0 wechseln bcf STATUS,6 bsf ADCON0,1 ;A/D Wandlung wird gestartet ADloop ;11.5 us vergehen bevor die Wandlung anfängt btfsc ADCON0,1 ;ist Wandler schon fertig? Wenn 0 in ADCON0,1 steht wird die nächste Zeile übersprungen goto ADloop ;Diese Schleife sollte ca. 44us+11.5us Sekunden benötigen movf ADRESH,w ;obere 2 Bit des A/D Ergebnis in W laden (W=Akku, oder Arbeitsregister) movwf RESULTO ;obere 2 Bit in Variable RESULTO laden bsf STATUS,5 ;In Bank 1 Wechseln bcf STATUS,6 movf ADRESL,W ;untere 8 Bit des A/D Ergebnis in W laden bcf STATUS,5 ;In Bank 0 Wechseln bcf STATUS,6 movwf RESULTU ;untere 8 Bit in Variable RESULTU laden ;ESUART bsf TXSTA,5 ;Transmit enabled movf RESULTU,W ;ersten 8-Bit in Akku laden movwf TXREG ;ersten 8-Bit senden gesendet btfss TXSTA,1 ;nachschauen ob Daten bereits gesendet worden sind goto gesendet ;nein, noch nicht gesendet, nochmal abfragen movf RESULTO,W ;ja, gesendet, die übrigen 2-Bit in den Akku laden movwf TXREG ;die übrigen 2-Bit senden goto main END ; directive 'end of program'
Hallo Paulemann, wie heisst denn die Meckermeldung ? Da der Quellcode in Assembler geschrieben ist, kann ein Compiler damit nichts anfangen. Der MPASM sollte das aber richtig übersetzen können. Übrigens werden je nach Einstellung nicht nur errors sondern auch warnings und messages ausgegeben. Das stört manchmal etwas.
Die org-Direktive hat zur Folge, dass der nachfolgende Code (oder auch Daten) an die angegebene Adresse gesetzt wird. Das hat mit Anfangsadresse des Programms gar nichts zu tun. Diese muß an der Adresse des Reset-Vektors stehen. Da gibt es von der Prozessorfamilie anhängige Methoden: - Der Prozessor fängt an einer festen Adresse (z.B.0000) an - Der Prozessor fängt an der Adresse, die in einer bestimmten Speicherstelle (z.B. FFFE:FFFF) steht, an Zu Warnings und Errors: ich würde immer alle einschalten, denn sie haben schon ihren Sinn. Man sollte versuchen, Code so zu schreiben, dass keine/wenige Warnings erscheinen. dann werden z.B. C-Fallen wie if(c=3) statt if (c==3) gleich als Warning (possible unwanted assignment) angezeigt. Für Anfänger ist es sicher schwer, die gangzen Zusammenhänge zu verstehen, aber Übung macht dem Meister. Wir alle haben mal klein angefangen.
Danke, langsam lichtet sich das Dunkel. Hab auch nochmal in meinem Datenblatt und einigen Beispielprogrammen recherchiert und hab jetzt folgendes: org 0x0000 ;Adresse des Reset Vektors auf 0x0000 goto start nun stand in dem Datenblatt des PIC dass der Programmspeicher wo das Programm abgelegt wird bei 0x0005 anfängt. Deshalb hab ich nach diese beiden Zeilen noch geschrieben org 0x0005 und dann den Programmcode. So hab ich das in einer Vielzahl anderer Beispielprogramme auch gefunden. Mein Compiler meckert auch nicht mehr! Stimmt das jetzt? Danke Paulemann P.s. Ich programmier nicht in C. Ich nehm die MPLAB Software her und schreib das so runter wie oben abgetippt. Ich find das so gar nicht so schlecht und da sich mein Programm eh in Grenzen hält wars auch nicht zu kompliziert.
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.