Det här är första gången jag är inne i just denna tråden.
> ° Exempelvis Icecap, sodjan, Swech och TomasL.
> Det finns fler, men dessa är de som vanligen poppar upp [som popcorn, dvs studsar runt utan kontroll och blåser upp sig själva när det hettar till].
> Om dessa använde sin, uppenbart djupa och breda, kunskap att hjälpa andra när dessa råkar i problem eller har frågor så vore det helt suveränt och beundransvärt.
Det vore ju väldigt enkelt att bara be dig dra åt helvete, men det kan kanske
i alla fall hjälpa någon annan att rätta till några saker ur tråden i alla fall.
Först så håller jag helt med om att tjatat om PIC18 är helt onödigt. Bättre
att besvara och rätta felaktigheterna och missförstånden i tråden. Det är
även fel att PIC18 saknar banker, BANKSEL kan användas även där. De
nyare PIC16F1xxx har även linjär adressering som underlättar i vissa fall.
Erik M> A - det går skriva om programmets kod via EEPROM-funktionen?
Ja. EEPGD biten i EECON1 styr om det är EEPROM eller flash som avses.
Så det är ingen specifik "EEPROM-funktion", den används både till EEPROM och till flash.
Erik M> B - det som skrivs till program memory är tillgängligt direkt, exempelvis med RETLW?
*Om* man skriver till flash, ja.
Och *om* man skriver just en RETLW instruktion med datat inbakat.
Och *om* man sedan har en funktion för att köra just den delen av flash.
Inget av detta är den naturliga metoden på en PIC16F1xxx.
danwi> B. Nej, MOVLW är bara till för att ladda in en konstant ("Literal") till Working-registret ("MOVe Literal to Working"). Varken EEPROM eller flash går att läsa direkt...
Här får man vara lite försiktig...

Självklart läser MOVLW från flash, konstanten ligger ju i själva instruktionen.
Om man tidigare har skrivit ditt en MOVLW till flash så kommer konstanten att "läses" då MOVLW exekveras.
Erik M> Och denna skillnad är av intresse, speciellt som det i mitt fall är intressant att kunna lagra flera olika
Erik M> uppsättningar block av data
och ladda det av dessa som ska användas till just för
Erik M> tillfället till EEPROM. Där det [minnets innehåll] modifieras under programmets gång och sedan lagras
Erik M> på sin plats i flashminnet vid programmets anslutning.
Ja, om du har tid med det. Notera att varje skrivning till EEPROM tar (upp till) 5 sek och t.ex. hela
EEPROM minner tar alltså över en 1 hel sekund att skriva. Har du kollat på att hålla blocket i RAM
(GPR) istället?
TomasL> Jo men eeprommet är i stort sett alltid för litet för att hålla en hel flash-sida, vilket är nödvändigt om man skall programmera om flashminnet.
Det där är ju en väldigt onödig kommentar och bidrar enbart till att röra till det i tråden...
Sidstorleken i flash på PIC16F1824 är 32 st. 14-bytes ord. EEPROM är 256 bytes. Fungerar utmärkt...
> Men angående RETLW och flashminnet - om det ligger inom programminnet så måste ju RETLW fungera för att hämta data där?
Självklart! RETLW hämtar det data som ligger lagrat i själva RETLW instruktionen! Man inget annat data...
Erik M> Så med EEPROM om 256 bytes [@ 8 bit] behövs det 8 rader av 32 words @ 14 bit programminne när det ska sparas [för långt senare bruk]?
Notera att om du ska lagra "data" i flash för att senare läsa det som "tabeller" t.ex. via tabellregistren, så
kan du i alla fall enbart läsa *en* byte i varje 14-bitars ord. Du kan alltså inte använda alla 14 bitarna
för att lagra valfri "data" om du vill kunna läsa det på ett praktiskt sätt. Se kapitel 3.5.3 i databladet.
TomasL> Tja skall du packa dem så får du stora problem, med att dela upp det sedan.
Största problemet är att det är bökigt att komma år de högsta 6 bitarna! Man kan inte använda
indexeringsregistren utan måste gå via EEPROM/flash funktionerna.
Erik M> Jag har data i EEPROM som jag vill lagra och nå enkelt i program memory.
Erik M> Hur gör jag det?
Du skriver det till flash, men du använder bara de lägsta 8 bitarna i varje 14-bitars ord!
Så 256 byte EEPROM skrivs i 256 word flash, simple as that...
Icacap> Beroende på vilken PIC man använder finns det tabelluppslag så att man anger en byte-adress och sedan läser den byte från programminnet.
Ja, men enbart de lägsta 8 bitarna kan läsas (via tabelluppslagningen).
TomasL> Hu har ett minnessegment 0x070 till 0x07f, dvs 16 bytes vilka är gemensamma för samtliga banker,
TomasL> de övriga 80-byten per bank når du efter bankswitchning.
Det där är enbart delvis sant. Kanske bättre att läsa på lite innan man försöker svara och hjälpa (?) till?
PIC16F1xxx har något som kallas "linear data memory" där hela GPR har en linjär och kontinuerlig
adressrymd. Så det går att hantera tabeller större än 80 byte direkt utan bankbyten eller annat.
TomasL> I PIC 18 mfl modernare PICar, finns inga bankar...
Det där stämmer inte, i alla fall inte senast jag kollade i en PIC18. Från ett aktuellt datablad:
"The data memory in PIC18 devices is implemented as static RAM. Each register in the data
memory has a 12-bit address, allowing up to 4096 bytes of data memory. The memory space
is divided into as many as 16 banks that contain 256 bytes each. Figures 5-5 through 5-7 show
the data memory organization for the PIC18F2XK20/4XK20 devices."
Erik M> De i bank 0 ges sina adresser via [GPRn] equ 0020h etc.
Erik M> Men hur ger man de som ska agera inom bank 1 respektive 2 sina minnesadresser?
Figur 3-9 på sidan 45 beskriver det översiktligt och enkelt. De sju lägsta bitarna hämtas från
själva instruktionen och de 5 högsta (som bestämmer banken) hämtas från BSR0-4 bitarna
BSR registret. (Bilden är lite felritad, det ser ut som 4 BSR bitar där...)
TomasL> Bank 1 equ 0x0A0
TomasL> Bank 2 equ 0x120
TomasL> osv.
Det där förstår jag inte ett smack av. Vad gör de där konstanterna? Hur ska de användas?
Erik M> Så till vida - är det tänkt använda FSR, och ha allting ta dubbelt så lång tid?
Dubbel så lång tid som vadå?
Erik M> Förutom då att "linear memory access" endast gäller GPR - inte där det gör nytta, med SFR.
Där har du så klart tokfel. Det skulle inte göra någon större nytta alls för SFR.
TomasL> På modernare prollar såsom PIC18F ligger allt i samma adressrymd, SFR , GPR osv. På dessa är bankswitchning onödig och ett minne blott.
Bara nyfiken... Har du ett exempel på en PIC18 där det är så?
Swech> Kan ju alltid peta i myrstacken och föreslå att du byter till AVR
Swech> Dessa har inte samma bankproblem som pic16...
Nej, men andra problem. Minnet är (till skillnad från PIC16) uppdelar i flera olika
delar med helt olika egenskaper och metoder för access. Det finns några "register"
som kan användas på ett sett, sedan några register till som inte kan användas på
samma sätt. Sedan "RAM" som i princip bara kan läsas/skrivas. Och sedan "I/O"
som har sina egna unika instruktioner. Allt detta motsvaras as *en* adressrymd
där allt hanteras på exakt samma sätt och med samma instruktioner i en PIC16.