Hallo Leute, möchte meinen PIC18F458 für erste Tests mit Assembler programmieren. Habe mir die PDF MPASM & MPLINK USER GUIDE geholt und versucht mich einzuarbeiten. Habe folgende Fragen an Euch: 1.) WIe gliedere ich am Besten mein Programm (STATUS REGISTER - INTERRUPT BEREICH - CODE ???) 2.) Wenn ein Interrupt auftritt, springt dieser bei entsprechend gesetzem Priority Bit zur Adresse 0x18 (HighPriority). Wie definiere ich diesen Punkt in meinem Programm. Hab nur soviel Ahnung, das durch org 0x00 das Programm bei 0x00 startet. Jeder weitere Befehl ist 2 Adressen weiter (in Dissassembly List nachgeschaut). Am hilfreichsten wäre ein kleines Demoprogramm. Vielen Dank schon im Vorraus Greetz DaHeik
Hi Wieso willst du unbedingt ASM programmieren bei den PIC18F? Wieso nicht gleich C? Der Compiler wär auch gratis und die PIC18f sind ja für C-Compiler optimiert worden, soweit ich weis. Nunja... aber da du sichtlich gerade beim anfange bist, solltest du dir die Seite von Sprut(www.sprut.de) zu gemüte führen. Weitere Beispielprogramme findest du im Forum: www.fernando-heitor.de und dort sind auch einige Links zu finden für weitere Beispiele. mfg Schoasch
Hab den C18 Compiler, werd auch mit dem weitermachen. Ich möchte die Grundzüge des Assemblerprogrammierens verstehen. Dafür hätt ich nur noch die Info gebraucht, wie ich geeignet auf einen Interrupt reagiere (Sprungmarke im Programm ...) Bisheriger Code: LIST P=18F458 ;der Typ des Prozessors #include c:/proggies/ba/micro/mcc18/mpasm/p18F458.inc ;processor- ;Configuration bits CONFIG OSC = HS ; HS 16 MHz CONFIG PWRT = ON ; power up timer on CONFIG BOR = OFF ; brown out detect off CONFIG WDT = OFF ; watchdog off CONFIG LVP = OFF ; lvp off org 0x00000 Main: bsf INTCON,7 ; GIEH bsf RCON,7 ; IPEN bsf INTCON3,3 ; INT1IE bsf INTCON2,5 ; INTEDG1 bsf INTCON3,6 ; INT1IP clrf TRISD ; All Pins Output clrf PORTD ; Turn off all Pins bsf PORTD,7 ; Vcc to Pin7 Schleife: NOP ; No Operation goto Schleife end Wie du siehst fehlt mir noch die Info, wie ich die Sprungmarke 0x18 setze Gruß Heiko
> 2.) Wenn ein Interrupt auftritt, springt dieser bei entsprechend > gesetzem Priority Bit zur Adresse 0x18 (HighPriority). Wie definiere ich > diesen Punkt in meinem Programm. Laut Datenblatt ist die Adresse für High Priority Interrupt Vector: 0x008 Low Priority Interrupt Vector: 0x018 In Assembler sollte das dann ungefäh so aussehen: ; Inrerruptvektoren org 0x0000 goto Reset org 0x0008 goto ISR_High org 0x0018 goto ISR_Low org 0x0020 Main: ; ; goto Main Reset: ; Mach Init-Kram retfi ISR_Low: ; Mach ISR-Low-Kram retfi ISR_High: ; Mach ISR-High-Kram retfi
> org 0x00000 > >Main: > bsf INTCON,7 ; GIEH > bsf RCON,7 ; IPEN > bsf INTCON3,3 ; INT1IE > bsf INTCON2,5 ; INTEDG1 > bsf INTCON3,6 ; INT1IP > > clrf TRISD ; All Pins Output > clrf PORTD ; Turn off all Pins > > bsf PORTD,7 ; Vcc to Pin7 So geht das nicht. Dein Programm darf nicht bei 0x0000 beginnen, sonst überschreibst Du Dir doch die Interrupt-Vektoren mit Programmcode. (Es sei denn, du verwendest keine Interrupts, was du aber eigentlich möchtest). bei den INT-Vektoren sollten nurgotos auf die ISR's stehen. Die ISR sollten dann mit 'retfi' verlassen werden.
Folgendes Problem: Programm ist in einer Schleife, die eine LED blinken lässt. - Interrupt taucht auf durch anlegen einer Spannung an Int1 - Programm springt zur Adresse 0x18 - Dort wird auf Programmstelle verwiesen - Dort wird einmal NOP durchgeführt und Interrupt SOLL dann mit retfie verlassen werden. PROBLEM: - Das Programm springt zu 0x18 anstatt zu der Adresse, an der Interrupt ausgelöst wurde ???????????????????????????????? Code: CONFIG OSC = HS ; HS 16 MHz CONFIG PWRT = ON ; power up timer on CONFIG BOR = OFF ; brown out detect off CONFIG WDT = OFF ; watchdog off CONFIG LVP = OFF ; lvp off cblock 0x30 Delay1 Delay2 Delay3 endc org 0x00 goto Main org 0x08 goto ISR_Low org 0x18 goto ISR_High ISR_Low; retfie ISR_High; NOP retfie Main: bsf INTCON,7 ; GIEH bsf RCON,7 ; IPEN bsf INTCON3,3 ; INT1IE . . . .
Wenn ein Interrupt aufgetreten ist, musst du in der ISR vor dem 'retfie' erst das entsprechende Interrupt-Flag (PIR Register) wieder löschen, sonst wird sofort wieder der Vektor angesprungen (steht alles im Datenblatt, DS41159E-page 82 oben rechts). Wenn deine ISR angesprungen wurde, solltest du sowieso mithilfe des PIR ersteinmal kontollieren, welcher Interrupt überhaupt aufgetreten ist. Sind mehrere "gleichzeitig" aufgetreten, kannst Du so auch die Reihenfolge der Abarbeitung festlegen.
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.