PIC16F1824 - ex 11-1: DATA EEPROM READ
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
TomasL - hur tänkte du packa dem då - 256 byte i EEPROM som data att tillgå i program memory?
Så som du skriver det behövs det endast fyra row.
Medans jag menar det behövs åtta.
Så som du skriver det behövs det endast fyra row.
Medans jag menar det behövs åtta.
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
Tja skall du få plats med 32 14-bitars ord i 56 byte, så måste du packa ihop dem, annars så tar det 64 byte.
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
OK, fullständigt OT, men ändå...
TomasL - hur får du 32 * 14 till att bli 64 * 8 …?
TomasL - hur får du 32 * 14 till att bli 64 * 8 …?
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
därför att minsta lagringsenheten är 8 bitar och därför tar 14 bitar i realiteten 16 bitar, såvida du inte packar ihop dem.
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
Men säg det då, säg inte att det är word om 14 bit. Duh!
Tillbaka till ämnet.
Problemställning:
Jag har data i EEPROM som jag vill lagra och nå enkelt i program memory.
Hur gör jag det?
Jag hävdar att det smidigaste torde vara att göra en Flash write i formen RETLW [byte EEPROM data] i HEX-format.
Vilket med 256 byte EEPROM går jämnt upp med åtta row instruction word i program memory.
Problem uppstår dock vid denna skrivning, enligt vad Icecap och TomasL anger, då RETLW k är 14 bit och program memory inte är anpassat till denna form, utan envisas med att vara i [8 bit] byte format.
Vid skrivning till program memory blir det alltså ett evinnerligt mixtrande med nibbles, för att få till hela byte.
Dvs det krävs fyra instructions [OPCODE + k] för att gå jämnt ut i hela bytes.
Fördelen med detta bökande är att man sedan når datan med BRW etc.
Sedan får man givetvis ser till att anpassa var man lägger datan så att BRW fungerar som tänkt.
Korrekt?
Tillbaka till ämnet.
Problemställning:
Jag har data i EEPROM som jag vill lagra och nå enkelt i program memory.
Hur gör jag det?
Jag hävdar att det smidigaste torde vara att göra en Flash write i formen RETLW [byte EEPROM data] i HEX-format.
Vilket med 256 byte EEPROM går jämnt upp med åtta row instruction word i program memory.
Problem uppstår dock vid denna skrivning, enligt vad Icecap och TomasL anger, då RETLW k är 14 bit och program memory inte är anpassat till denna form, utan envisas med att vara i [8 bit] byte format.
Vid skrivning till program memory blir det alltså ett evinnerligt mixtrande med nibbles, för att få till hela byte.
Dvs det krävs fyra instructions [OPCODE + k] för att gå jämnt ut i hela bytes.
Fördelen med detta bökande är att man sedan når datan med BRW etc.
Sedan får man givetvis ser till att anpassa var man lägger datan så att BRW fungerar som tänkt.
Korrekt?
Senast redigerad av Erik M 7 oktober 2016, 11:40:57, redigerad totalt 1 gång.
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
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.
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
OK, låt oss ta något enklare.
Eftersom MicroChip delar upp adresser på det vis de gör - hur tilldelar man sig GPR's utanför bank 0, och då menar jag inte användandet av 070h - 07Fh, utan GPR-adresserna 0A0h - 0EFh & 120h - 16Fh i bankerna 1 & 2.
Om mönstret är det samma som för både SFR och GPR så måste jag ge dem adress-värdet i bank 0 som motsvarar positionen i dess egentliga bank.
Alltså [GPR] 0A0h ges värdet 020h etc
Och för att komma åt dem måste man befinna sig i dess bank.
Korrekt?
Onekligen praktiskt då det i dessa banker finns SFR's för bland annat ADC, DAC, CM.
Tråkigt att de inte gjort sammaledes i banker där det verkligen skulle göra nytta, som exempelvis för EE, CCP, PWM och IOC...
Eftersom MicroChip delar upp adresser på det vis de gör - hur tilldelar man sig GPR's utanför bank 0, och då menar jag inte användandet av 070h - 07Fh, utan GPR-adresserna 0A0h - 0EFh & 120h - 16Fh i bankerna 1 & 2.
Om mönstret är det samma som för både SFR och GPR så måste jag ge dem adress-värdet i bank 0 som motsvarar positionen i dess egentliga bank.
Alltså [GPR] 0A0h ges värdet 020h etc
Och för att komma åt dem måste man befinna sig i dess bank.
Korrekt?
Onekligen praktiskt då det i dessa banker finns SFR's för bland annat ADC, DAC, CM.
Tråkigt att de inte gjort sammaledes i banker där det verkligen skulle göra nytta, som exempelvis för EE, CCP, PWM och IOC...
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
Det går inte att använda tabelluppslag på eepromet, alla bytes man vill accessa måste läsas in i ram.
Förstår dock inte ett skvatt vad du menar med de delar upp adresser?
Förstår dock inte ett skvatt vad du menar med de delar upp adresser?
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
Jo, såhär TomasL, för att nå ett register måste du stå i den bank registret finns i.
Som exempel finns CM1CON0 på adress 111h, men för att nås måste du stå i dess bank [2] och i denna bank på adress 011h.
Dvs i positionen för PIR1 .
Med följd, bland annat, att om du står i bank 2 och letar efter PIR1 - så får du CM1CON0.
Om jag nu ska ha en GPR i bank 2, vilket ska gå [enligt databladet], så blir frågan hur jag gör för att definiera den.
Låt säga GPR Comparator_Result_Summary.
Och i bank 0 har jag GPR Collected_Comparator_Result.
I initieringsfasen blir det [exempelvis]:
cblock 0x0020
Collected_Comparator_Result
endc
Men hur blir det för att ge Comparator_Result_Summary en adress?
Det naturliga vore:
cblock 0x0120
Comparator_Result_Summary
endc
Men då adresser inte kan läsas i så enkla format, utan endast i adresser om 7 bit, så blir frågan hur man fixar detta.
Som exempel finns CM1CON0 på adress 111h, men för att nås måste du stå i dess bank [2] och i denna bank på adress 011h.
Dvs i positionen för PIR1 .
Med följd, bland annat, att om du står i bank 2 och letar efter PIR1 - så får du CM1CON0.
Om jag nu ska ha en GPR i bank 2, vilket ska gå [enligt databladet], så blir frågan hur jag gör för att definiera den.
Låt säga GPR Comparator_Result_Summary.
Och i bank 0 har jag GPR Collected_Comparator_Result.
I initieringsfasen blir det [exempelvis]:
cblock 0x0020
Collected_Comparator_Result
endc
Men hur blir det för att ge Comparator_Result_Summary en adress?
Det naturliga vore:
cblock 0x0120
Comparator_Result_Summary
endc
Men då adresser inte kan läsas i så enkla format, utan endast i adresser om 7 bit, så blir frågan hur man fixar detta.
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
Hu har ett minnessegment 0x070 till 0x07f, dvs 16 bytes vilka är gemensamma för samtliga banker, de övriga 80-byten per bank når du efter bankswitchning.
Du har inte funderat på att välja en annan processor, exempelvis en 18F som är lite enklare att hantera minnesmässigt.
Du har inte funderat på att välja en annan processor, exempelvis en 18F som är lite enklare att hantera minnesmässigt.
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
OK, då tar vi det igen...
Eftersom MicroChip delar upp adresser på det vis de gör - hur tilldelar man sig GPR's utanför bank 0, och då menar jag inte användandet av 070h - 07Fh, utan GPR-adresserna 0A0h - 0EFh & 120h - 16Fh i bankerna 1 & 2.
Absolut överväger jag att byta till PIC18F - när jag hittar någon som är mindre än 18 ben och inte kostar dubbelt så mycket.
Ungefär samma skäl som ATMEL's AVR, så slipper lillahuset säga något. Slipper, får göra det, får han givetvis.
Eftersom MicroChip delar upp adresser på det vis de gör - hur tilldelar man sig GPR's utanför bank 0, och då menar jag inte användandet av 070h - 07Fh, utan GPR-adresserna 0A0h - 0EFh & 120h - 16Fh i bankerna 1 & 2.
Absolut överväger jag att byta till PIC18F - när jag hittar någon som är mindre än 18 ben och inte kostar dubbelt så mycket.
Ungefär samma skäl som ATMEL's AVR, så slipper lillahuset säga något. Slipper, får göra det, får han givetvis.
Senast redigerad av Erik M 8 oktober 2016, 18:56:52, redigerad totalt 1 gång.
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
Menar du hur du skriver i assembler för att skapa en variabel på valfri adress?
Tja, det står i din handledning till assemblern.
När du väl har definierat dina variabler så är det väl "banksel variabelnamn" som gäller.
Tja, det står i din handledning till assemblern.
När du väl har definierat dina variabler så är det väl "banksel variabelnamn" som gäller.
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
I PIC 18 mfl modernare PICar, finns inga bankar, där är adressutrymmet linjärt, inklusive SFR, vilka ligger inom samma minnesrymd som dataminnet.Erik M skrev:Eftersom MicroChip delar upp adresser på det vis de gör
Re: PIC16F1824 - ex 11-1: DATA EEPROM READ
Nej, hur jag nyttjar att det ska gå ha GPR's för bank 1 och bank 2, på samma vis som allihop [utom 070h - 07Fh då alltså] i bank 0.
De i bank 0 ges sina adresser via [GPRn] equ 0020h etc.
Men hur ger man de som ska agera inom bank 1 respektive 2 sina minnesadresser?
Problemet med "modernare PIC" är att det står inte på utsidan av dem.
Som vi alla vet finns det ingen koppling mellan funktion och benämning på PIC'r.
De i bank 0 ges sina adresser via [GPRn] equ 0020h etc.
Men hur ger man de som ska agera inom bank 1 respektive 2 sina minnesadresser?
Problemet med "modernare PIC" är att det står inte på utsidan av dem.
Som vi alla vet finns det ingen koppling mellan funktion och benämning på PIC'r.