Hi, ich habe heute der ganze Zeit nach ein Fehler im meinem Code gesucht, ich habe nichts gefunden! als Aufgabe muss ich Impulse am Pin 2 des PIC16F630 zählen, wenn der PIC nicht mehr Spannung bekommt dann wird ein Interrupt aktiviert, der speichert die Impulse im EEPROM, wenn der Spannung wieder am Pic liegt dann muss er der gespeicherte Impulsen-Zahl von EEPROM lesen und weiter zählen speicher tut er, der Programmer Software hat es zeigt. aber der zählt nicht weiter. der zählt immer von 0xFF, ich vermute der liest die Daten von der EEPROM nicht. bitte kann mir jemand helfen, diese Aufgabe ist sehr wichtig für Studium. list p=16F630 errorlevel 0 ,-302 ; -302 : #include <P16F630.INC> positionh equ 22 positionl equ 23 counthi equ 24 countlow equ 25 ;; Definitionen ; Port A LED equ 5 ;LED zum testen takthub equ 2 ;Takt zählen sp equ 4 ;Spannungwegfall Registrierung ;; Register S_TEMP equ 0x2B ;Temp-Register für STATUS-Sicherung bei Interrupt W_TEMP equ 0x2C ;Temp-Register für W-Sicherung bei Interrupt ; SPINTR equ 0x2F ;Variable für Spannungsverlustregistrierung ; WAITVAR equ 0x32 ;Variable für Wait-Routinen WAITVAR1 equ 0x33 ;Variable für Wait-Routinen ; counthiadr equ 0x05 ;Hier wird festgelegt in welchen EEPROM-Adressen ; ;die Daten gespeichert und von wo sie gelesen werden countlowadr equ 0x06 ; ; ;;---------------------------------------------------------------------- ---------------------------- ; PAGE __CONFIG _CP_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON & _WDT_OFF & _MCLRE_OFF ; ;;---------------------------------------------------------------------- ---------------------------- ; org 0x00 ;die Startadresse nach Reset ist 0, hier startet der PIC goto Init ;Programm beginnt mit Initialisierung ; ;----------------------------------------------------------------------- --------------------------- ; Interrupt Handling ;----------------------------------------------------------------------- --------------------------- org 0x04 ;Interruptvector ist 0x04, bei Interrupt springt der PIC hierher movwf W_TEMP ;Arbeitsregister sichern swapf STATUS, W ;SWAP-Status ins ArbeitsregisterSTATUS bcf STATUS, RP0 ;Bank 0 movwf S_TEMP ;STATUS sichern auf Bank 0 bsf STATUS,RP0 bcf INTCON, GIE ;Interrupt Disable bcf INTCON, RAIE bcf INTCON, RAIF bcf STATUS, RP0 ;call LEDtest btfsc PORTA, sp ;Auswahl welcher Interrupt goto Interrupt_beenden goto speichern speichern ;call LEDtest bsf STATUS,RP0 bsf EECON1, WREN ;Enable write ;Low teil in EEPROM speichern movfw countlowadr ; MOVWF EEADR ; Adresse von lowTeil in EEPROM movfw countlow ; low Daten speichern call write_EEPROM bcf EECON1, WREN ;Disable write goto Interrupt_beenden write_EEPROM movwf EEDAT movlw 0x55 ;EEPROM-schreiben freigeben movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR ;start Schreibzyklus write_loop btfsc EECON1, WR ;warte bis Schreibzyklus fertig ist goto write_loop return Interrupt_beenden bsf INTCON, GIE bsf INTCON, RAIE swapf S_TEMP, W ;SWAP-Status (wieder richtig) ins Arbeitsregister movwf STATUS ;STATUS vor ISR wiederhergestellt swapf W_TEMP, F ;SWAP-W_TEMP swapf W_TEMP, W ;SWAP-W_TEMP ins Arbeitsregister, SWAP => verändert kein Flag retfie ;; ;;---------------------------------------------------------------------- ---------------------------- ;; Initialisierung ;----------------------------------------------------------------------- --------------------------- Init bcf STATUS, RP0 ;Bank 0 movlw 0xFF ;Comparator abschalten movwf CMCON bsf STATUS, RP0 ;Bank 1 movlw 0x00 ;Oszillator-Kalibrierungswert movwf OSCCAL ;internen Oszillator kalibrieren für genauere Taktfrequenz movlw b'000010111' movwf TRISA ;LED out ; hubtakt in ;Sp in ;Clock in ;Mode in bsf STATUS, RP0 bsf IOCA, 4 ;Interrupt on Change an RA4 Schpannungsabfall bsf INTCON, RAIE ;Interrupt on Change Enable bsf STATUS, RP0 bsf INTCON, GIE ;Global-Interrupt enable bcf STATUS, RP0 bsf PORTA,LED call wait100ms call wait100ms bcf PORTA, LED call wait100ms call wait100ms ; PositionLaden movlw countlowadr ;Low Byte Lesen call read_EEPROM movwf countlow goto Main read_EEPROM movwf EEADR ;EEPROM-Adresse auswählen bsf EECON1, RD ;Enable read movfw EEDATA ;Daten aus EEPROM lesen return Main btfsc PORTA, takthub goto Main incf countlow , 1 bsf PORTA,LED call wait100ms call wait100ms bcf PORTA, LED call wait100ms call wait100ms goto Main ;;---------------------------------------------------------------------- ---------------------------- ;; Wait-Routinen für F_CPU = 4MHz ;;---------------------------------------------------------------------- ---------------------------- ; wait ;Wait Routine mit einstellbarer Variable decfsz WAITVAR, F goto wait return wait25 ;Waitroutine für 25µs movlw 0x05 movwf WAITVAR call wait nop return wait50 ;Waitroutine für 50µs movlw 0x0D movwf WAITVAR call wait nop nop return wait100 ;Waitroutine für 100µs movlw .30 movwf WAITVAR call wait nop return wait500 ;Waitroutine für 500µs movlw .164 movwf WAITVAR call wait return wait1ms ;Waitroutine für 1ms call wait500 call wait500 return wait10ms ;Waitroutine für 10ms movlw .10 movwf WAITVAR1 waitloop call wait1ms decfsz WAITVAR1, 1 goto waitloop return wait100ms ;Waitroutine für 100ms movlw .100 movwf WAITVAR1 waitloop0 call wait1ms decfsz WAITVAR1, 1 goto waitloop0 return end
brauchst du nicht auch die counthiadr um vom EEPROM zu laden/speichern?????
danke die Fehler habe ich gefunden ; PositionLaden movlw countlowadr ;Low Byte Lesen call read_EEPROM movwf countlow goto Main read_EEPROM movwf EEADR ;EEPROM-Adresse auswählen bsf EECON1, RD ;Enable read movfw EEDATA ;Daten aus EEPROM lesen return es muss mowfw countlowadr!
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.