Forum: Mikrocontroller und Digitale Elektronik EEPROM lesen geht nicht PIC


von Sabine F. (sabine)


Lesenswert?

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

von chris (Gast)


Lesenswert?

brauchst du nicht auch die counthiadr um vom EEPROM zu 
laden/speichern?????

von Sabine F. (sabine)


Lesenswert?

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!

von Christoph K. (klemze)


Lesenswert?

Nur so ne Frage aber warum programmiert ihr das ganze nicht in C?

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
Noch kein Account? Hier anmelden.