- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: PIC 18F452 - Zustände im RAM speichern

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.07.2005
    Beiträge
    170

    PIC 18F452 - Zustände im RAM speichern

    Anzeige

    Praxistest und DIY Projekte
    hi,

    ich will ca. 50 zustände oder mehr im RAM abspeichern.
    ich weiss aber nicht wie ich das machen soll.

    ich möcht des nicht irgendwie so machen:
    state1 equ 0x20
    state2 equ 0x21
    .
    .
    .
    state70 equ 0x90
    weil des ein ziemlich umständlicher und blöder weg wäre.

    ich will des am liebsten irgendwie so machen, dass ich in einer speicherzelle die 0x20 speicherzelle speichere und dann immer um eins erhöhe, aber hab keine ahnung wie ich des machen soll.

    movlw 0x20
    movwf state
    .
    .
    .
    saveinram
    movlw '0'
    movwf state <-- aber nicht in die speicherzelle selber sondern in die adresse die in der speicherzelle abgespeichert ist
    return


    wäre sehr dankbar für hilfreiche antworten

    mfg
    pitt

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.08.2004
    Ort
    Winterthur
    Beiträge
    312
    Hallo

    In C nennt sich das Pointer bzw. Array.
    Da das ein häufigeres Problem ist, hat der Hersteller auch beim PIC so was vorgesehen.
    Stichwort: FSR-Register

    In dieses Register schreibt man die Adresse der zu lesenden/schreibenden Variablen/Registers. Danach kann man über das Register 0x00 (IND oder so) auf den Inhalt an dieserAdresse zugreifen.

    Steht ausführlich im Datenblatt. Die 18Fxxx haben da glaub's noch weitere solche FSR-Register, aber das ist die Minimalausstattung, die alle PIC's haben.

    Gruess
    Fritzli

  3. #3
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    72
    Beiträge
    11.077
    Die PIC18Fxxx haben 3 FSR Register 0,1 und 2 und mit denen kann man den ganzen bereich des RAM´s adressieren. Die erste Speicherstelle wird mit dem Befehl lsfr FSRx festgelegt und man kann mit POSTINC/POSTDEC die adresse nach der Ausführung des Befehls automatisch in- decrementieren lassen. Die Speicherstelle wird dann INDFx heissen. Hier ein Beispiel aus meinem Programm:
    MfG
    Code:
    AddCB		lfsr	FSR0,B0			; C+B>C
    		lfsr	FSR1,C0
    		goto	AddReg
    AddDC		lfsr	FSR0,C0			; D+C>D
    		lfsr	FSR1,D0
    AddReg		bcf	_Ferr			; 40 bit, (5 Bytes)
    		bcf	_Fcrp
    		movlw	5
    		movwf	ATemp
    AddRegL	bcf	_Fcra
    		movf	INDF0,0
    		addwf	INDF1,0
    		btfsc	_C
    		bsf	_Fcra
    		daw
    		movwf	INDF1
    		btfsc	_C
    		bsf	_Fcra
    		btfss	_Fcrp
    		goto	AddRegN
    		movlw	1
    		addwf	INDF1,0
    		daw
    		movwf	INDF1
    		btfsc	_C
    		bsf	_Fcra
    AddRegN	bcf	_Fcrp
    		btfsc	_Fcra
    		bsf	_Fcrp
    		movf	POSTDEC0,1
    		movf	POSTDEC1,1
    		decfsz	ATemp,1
    		goto	AddRegL
    		btfsc	_Fcra
    		bsf	_Ferr
    		return

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.07.2005
    Beiträge
    170
    hi,

    jetzt gehts, genau des hab ich gesucht.

    ich hab jetzt den pic 18f452 der hat nen programm speicher von 2kb.

    aber soviel ich jetzt weiss, ist das der memoryspeicher auch nur 8 bittig adressiert ist.
    und da gibt es das BSR, muss ich jetzt damit dann immer umschalten wenn ich 255 zeichen bzw. zustände gespeichert hab?

    hab ich das jetzt so richtig gelesen?

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.07.2005
    Beiträge
    170
    ich hab jetzt den pic 18f452 der hat nen programm speicher von 2kb
    ich meinte nen ram speicher

  6. #6
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    72
    Beiträge
    11.077
    Du brauchst niichts umschalten. Wenn Du mit Indirekter Adressierung programm schreibst, steht für Dich der gesamte RAM ohne irgendwelchen Grenzen zwischen Pages zur Verfügung. Von 0 bis max. Jeder FSR hat zwei Register FSRxH und FSRxL, die können bis 65535 bytes RAM adressieren also mehr als die MC´s haben.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.07.2005
    Beiträge
    170
    hi,

    also irgendwie funktioniert des nicht so ganz wie ich des will.
    was mache ich falsch.

    also es werden jetzt ca. 200 zustände am RC5 eingelesen und am Port RB6 weitergeleitet und im ram abgespeichert.
    wenn alle 200 zustände abgelaufen sind und alles im ram ist soll alles im eeprom gespeichert.

    ausschnitt aus meinem prog:

    ee_addr equ 0x62
    count equ 0x63

    movlw D'200'
    movwf count
    movlw 0x00
    movwf ee_adr
    lfsr FSR0,0x65
    lfsr FSR1,0x65

    main

    btfss PORTC,5
    movlw D'48'
    btfsc PORTC,5
    movlw D'49'
    movwf cablenp6
    call save6

    btfsc PORTB,0
    call soneeprom

    goto main


    save6
    movf cablenp6,0
    btfss cablenp6,0
    bcf PORTB,6
    btfsc cablenp6,0
    bsf PORTB,6
    nop
    btfss PORTB,6
    movlw D'48'
    btfsc PORTB,6
    movlw D'49'
    movwf POSTINC0
    return



    soneeprom
    bcf PIR2,EEIF
    movf ee_adr,0
    movwf EEADR
    movf POSTINC1,0
    movwf EEDATA
    bcf EECON1,EEPGD
    bsf EECON1,WREN

    movlw D'85'
    movwf EECON2
    movlw D'170'
    movwf EECON2
    bsf EECON1,WR
    bcf EECON1,WREN

    wrready1
    nop
    nop
    nop
    nop
    nop
    btfss PIR2,EEIF
    goto wrready1

    incf ee_adr,1

    decfsz count,1
    goto soneeprom
    bsf PORTD,3 ;LED
    return


    mfg
    pitt

  8. #8
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    72
    Beiträge
    11.077
    Hallo Pitt1986!
    Ich analisiere solche Listings nicht genau, weil ich selber beschäftigt bin. Ich habe bloß bemerkt, das ´Du z.B. in save6 vor dem return movwf POSTINC0 hast obwohl du FSR0 nicht determiniert hast ( kein lfsr FSR0,XxXX ). Der Fehler kann schon die Ursache sein. Ich würde Dir empfehlen Dein Programm in kleinsten Schritten zu schreiben und immer jeden Shritt vorm Weiterschreiben zuerst prüfen. Obwohl ich schon einiges programmiert habe, mache ich immer noch so, vor allem bei Fehlersuche. Ich würde lieber Bank 1 statt 0 benutzen, weil am Anfang der Bank 0 FSR´s sind, und ich habe schon erlebt, dass meine gespeicherten Daten geändert wurden. Also lieber lfsr FSRx,1x00 nehmen.
    MfG

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.07.2005
    Beiträge
    170
    hi,
    also des mit der bank0 und bank1 hab ich schon versucht, geht aber auch nicht.
    und des mit dem fsr0 nicht determiniert hab ich schon gemacht, falls du das gleiche meinst wie ich.
    fast ganz oben im prog
    ausschnitt aus meinem prog:

    ee_addr equ 0x62
    count equ 0x63

    movlw D'200'
    movwf count
    movlw 0x00
    movwf ee_adr
    lfsr FSR0,0x65 <-
    lfsr FSR1,0x65 <-

    main
    .
    .
    .

  10. #10
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    72
    Beiträge
    11.077
    Nein, oder ja, je nach dem. Ich habe doch genau geschrieben, dass in deinem Unterprogramm "save6" vor dem "return" ein Befehl " "POSTINC0" steht. Na ja, wenn es nicht geht, sind noch mehr Fehler drin. Die mußt Du dann selber finden und beseitigen. Ich würde Dir empfehlen ein Blockdiagramm (Flowchart) Deines Programms vor dem Programmieren zu erstellen und den Programmablauf auf Fehler zu prüfen. Aus guten lauffägigen Unterprogramen kann man auch fehlerhaften Programm "bauen". Durch Fehlersuche lehrnt man am besten.
    MfG

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests