PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC 18F452 - Zustände im RAM speichern



Pitt1986
26.10.2005, 18:39
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

Fritzli
27.10.2005, 16:26
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

PICture
27.10.2005, 17:15
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


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

Pitt1986
27.10.2005, 18:20
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?

Pitt1986
27.10.2005, 18:21
ich hab jetzt den pic 18f452 der hat nen programm speicher von 2kb
ich meinte nen ram speicher

PICture
27.10.2005, 18:32
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.

Pitt1986
28.10.2005, 20:22
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

PICture
29.10.2005, 00:05
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

Pitt1986
29.10.2005, 00:25
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
.
.
.

PICture
29.10.2005, 00:43
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

Pitt1986
29.10.2005, 01:07
hi,

also ich weiss nicht mehr weiter, jetzt hab ich heut nachmittag so lange rumgespielt an dem programm und dann hab ich des halt irgendwie so oft rumgeschrieben bis fast alles ging, des einzige was nicht ging war dass ich mit indirekter adressierung nichts auf der eeprom speichern konnte, weil vielleicht noch irgendwo ein fehler war.
jedenfalls hab ich das programm zur sicherheit kopiert, bevor ich weitergemacht habe und jetzt hab ich gerade die kopie auf den pic gebrannt und jetzt geht nicht einmal mehr des, obwohl ich nichts verändert hab.

also kann es sein dass es vielleicht nicht mehr am programm sondern an dem eeprom vom pic liegt, dass der eeprom irgendwie kaputt ist?
kann sowas vorkommen bzw. kommt es öfter vor??

mfg
pitt

PICture
29.10.2005, 01:44
Nein, aber Du kannst mit Indirekter Adressierung NUR RAM adressieren. Das EEPROM lässt sich leider nur direkt vom 0 bis FF adressieren. Ich muß ehrlich sagen, dass meistens schreibe ich ein neues Programm schneller als ich ein Fehler finde. Ich habe mir auch ein "Werkzeug" erstellt, um schneller fehlerfreie Programme zu schreiben, enen Terminal dass an 3-pins von MC angeschlossen ist. Er emöglicht 2x8 RAM Zellen eistellen, gewähtes Programm (1 aus 16) starten und ausführen. Er zeigt auf dem LCD bildschirm 6x8 RAM Zellen an. Das Hardware ist in meinem Beitrag "Kein Problem, sondern Nokia Display für MC" in diesem Forum beschrieben. Ich habe die Software noch nicht veroffentlicht, aber arbeite ich selber erfolgreich damit. Wenn Du es gut findest werde ich auch die Software hier publizieren. Vielleicht schreibst Du mir, was würdest Du brauchen. Ich bin leider Umsteiger, habe ich vorher andere Prozessoren programmiert und habe ich leider die Probleme von Anfänger teilweise vergessen.
MfG