Interrupt bei 16f88
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  Interrupt bei 16f88 « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Interrupt bei 16f88  (Gelesen 1364 mal)
 
Herzog
Newbie
*
Offline Offline

Beiträge: 31


Profil anzeigen
« am: Februar 17, 2011, 16:39:18 »

hi
ich hab folgendes Problem...
ich hab ein Programm für den Pic16f88 mit Interrupt geschrieben.
aber wenn ich das ganze durch den compiler schick dann sagt er immer Error[118]  : Overwriting previous address contents (0000)

das kommt immer wenn ich dieses org 4 für den interrupt bzw. org 0 für das hauptprogramm vor die routinen schreib.

woran liegt das?
Gespeichert
oerni
Full Member
***
Offline Offline

Beiträge: 196



Profil anzeigen WWW
« Antworten #1 am: Februar 17, 2011, 20:06:50 »

Nabend,

wie die Fehlermeldung schon sagt, da ist schon mal was auf der Adresse gelandet.
Vermutlich ein Zuweisungsfehler bei der Variablendefinition.

Ein Stückchen Code bitte! Der Knochen ist zu mager.

Tschau Oerni
Gespeichert
Herzog
Newbie
*
Offline Offline

Beiträge: 31


Profil anzeigen
« Antworten #2 am: Februar 17, 2011, 21:57:00 »

das ist das Programm

   
Code:
list p=16f88
;**************************************************************
;*  Pinbelegung
;* ----------------------------------
;* PORTA: 0 Verstärkereingang
;* 1 Verstärkereingang
;* 2 Drehzahlmesser
;* 3 -
;* 4 -
;* 5 -
;*
;*
;* PORTB: 0 Tacho
;* 1 I²C-SDI
;* 2
;* 3
;* 4 I²C-CLK
;* 5
;* 6
;* 7
;*
;*
;*
;**************************************************************
; Prozessor 16F88
;
; Prozessor-Takt 8 MHz intern
;
;
;**************************************************************
; Includedatei für den 16F88 einbinden

list p=16f88
#include "C:\Include_files\P16f88.INC"

__CONFIG _CONFIG1, _CCP1_RB3 & _LVP_OFF & _BODEN_OFF  & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO


;**********************************************************
; Variablen festlegen

;16 Bit Rechenregister
f0 equ 0x24
f1 equ 0x25
Tacho_0 equ 0x34
Tacho_1 equ 0x35
Dreh_H equ 0x36
Dreh_L equ 0x37
w_copy equ 0x38
s_copy equ 0x39
count equ 0x3A
Ver_1_H equ 0x3B
Ver_1_L equ 0x3C
Ver_2_H equ 0x3D
Ver_2_L equ 0x3E


Ini_con Equ B'00000000' ; TMR0 -> Interupt disable
Ini_opt Equ B'10000000' ; pull-up


;********************************************************
; Das Programm beginnt mit der Initialisierung



Init
clrf PORTB ; Sicherheitshalber die
clrf PORTA ; Ports A und B loeschen

bsf     STATUS, RP0 ; Bank 1
movlw   Ini_opt      ; pull-up on
movwf  OPTION_REG

movlw B'01110000' ; 8 Mhz
movwf OSCCON
movlw B'11111111' ; Pins RA0 und RA1 als
movwf TRISB
movlw B'11111111' ; Port B konfigurieren, Bits 1-3
movwf TRISA ; Analog-Pins konfigurieren


movlw B'00011111' ; Pins RA0 und RA1 als
movwf ANSEL ; Analog-Pins konfigurieren

clrf ADCON1 ; int. Referenz, rechtsb
BSF ADCON1, 7 ; Rechtsbündig

bcf     STATUS, RP0 ; Bank 0
clrf PORTB
movlw   Ini_con      ; Interupt disable
movwf   INTCON   

; ADC initialisieren
; ADC einschalten
movlw B'10000001'
movwf ADCON0

bsf INTCON,4 ;RB0 Interrupt
bsf PIE1,SSPIF ;I²C Interrupt
bsf INTCON,GIE ;Interrupt erlaubt

;************************************************************************
;I²C initialisieren !

movlw B'10101010' ;Adresse für diesen Pic
movwf SSPADD

movlw B'01111000' ;bit5 steht dafür das das letzte byte die daten war (0=adresse)
movwf SSPSTAT ;bit4 Stop bit(0=kein stopbit erkennen 1=stop bit am ende verlangt)
;bit3 Start bit
;bit2 W/R aber keine ahnung was das bedeutet
;bit0

bsf SSPCON,SSPEN ;bit5 setzt SDA and SCL als serielen port fest I²C
bcf SSPCON,SSPM3 ;setzt I²C auf 7-bit Adresse ohne start und stop bit interrupt
bSf SSPCON,SSPM2
bsf SSPCON,SSPM1
bcf SSPCON,SSPM0
clrf PORTB
goto Main
;*******************************************************************
;
;Interrupt für I²C und RB0


ORG 4

inter bcf INTCON, GIE ; disable Interupt

movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
movwf s_copy ;



; Intrupt servic routine
Int_serv
btfss PIR1,SSPIF ;kam es vom I²C
goto Signal
bcf PIR1,SSPIF


; auf Master übertragen

movfw Tacho_0
movwf SSPBUF
call i2c_warte

movfw Tacho_1
movwf SSPBUF
call i2c_warte

movfw Dreh_H
movwf SSPBUF
call i2c_warte

movfw Dreh_L
movwf SSPBUF
call i2c_warte
bcf SSPCON,4

goto Int_end



Signal
btfss INTCON,4
goto Int_end
bcf INTCON,4
bcf STATUS,C
incf Tacho_0
btfsc STATUS,C
incf Tacho_1


Int_end swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w


bsf INTCON, GIE ; enable Interupt

retfie
;****************************************************
i2c_warte

        btfss   PIR1, SSPIF     ; fertig?
        goto    i2c_warte       ; nein, noch nicht
        bcf     PIR1, SSPIF     ; ja, alles fertig, nun noch SSPIF zurücksetzen
        return


;**********************************************
Programmablauf

Main
goto Main
Traurig
und hier ist ein teil der list mit den fehlern, so geht das noch die ganze interrupt-routine lang:-(
 Traurig
Zitat
Warning[205]: Found directive in column 1. (ORG)
0004                  00130 ORG     4
                      00131         
Error[118]  : Overwriting previous address contents (0004)
Error[118]  : Overwriting previous address contents (0004)
0004   138B           00132 inter   bcf     INTCON, GIE     ; disable Interupt
                      00133
Error[118]  : Overwriting previous address contents (0005)
Error[118]  : Overwriting previous address contents (0005)
MPASM 03.20.02 Released            88.ASM   2-17-2011  21:10:36         PAGE  4


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

0005   00B8           00134         movwf   w_copy          ; w retten
Error[118]  : Overwriting previous address contents (0006)
Error[118]  : Overwriting previous address contents (0006)
0006   0E03           00135         swapf   STATUS, w       ; STATUS retten
Error[118]  : Overwriting previous address contents (0007)
Error[118]  : Overwriting previous address contents (0007)
0007   00B9           00136         movwf   s_copy          ;
                      00137
                      00138         


Code-Tags verwenden!
Stampede
« Letzte Änderung: Februar 18, 2011, 01:13:40 von Stampede » Gespeichert
oerni
Full Member
***
Offline Offline

Beiträge: 196



Profil anzeigen WWW
« Antworten #3 am: Februar 17, 2011, 22:28:24 »

org 4 mit der Interruptroutine muss zwischen die Variablendeklarationen und Init mit nachfolgendem Main

Code:
Variablendeklarationen
....

 ORG     0x000 ; processor reset vector
 nop
 clrf    PCLATH    ; Page Bits loeschen
 goto    main      ; zum Hauptprogramm

 ORG     0x004    ; Interrupt Vector

Interruptroutine
....
Main
....
Der Compiler fängt an Adresse 0x00 mit dem Beschreiben des Flash an, du machst nämlich dort dein Init. Dann springst du wieder an org 4 (Adresse 0x04), dort steht aber schon was -> Crash.
Mit org wird die nächste zu beschreibende Adresse angegeben. Wichtig zu wissen, wenn man mal eine Tabelle ohne Überschreitung von Pagegrenzen ablegen will.
Tschau Oerni
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.035 Sekunden mit 18 Zugriffen.
 
Top! Top!