Ytterligare en HD44780 tråd.....
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Ytterligare en HD44780 tråd.....
Hmmm... jag måste nog dit med en drös med "Global" och "Extern" kommandon.
Det låter väl ganska troligt?
MVH Peter F
Det låter väl ganska troligt?
MVH Peter F
Re: Ytterligare en HD44780 tråd.....
Jag tror att jag ser vad det är...
Alltså, en ASM fil har en del olika delar. Först kommer en del där
man har lite definitioner (EQU o.s.v), __CONFIG, macron och liknande.
Sedan kommer koden. Det är därför du får meddelande 151 och 152.
Du försöker definiera saker på fel plats.
"152: Executable code and data must be defined in an appropriate section"
Alltså kod måste ligga efter ett CODE direktiv, o.s.v...
Notera att onewire.inc innehåller både definitioner av macron och
kod (subrutiner), alltså kan den inte ligga där du lägger den.
*Jag* skulle dela onewire.inc i två delar, en med allt
under "Dallas Semiconductor 1-Wire MACROS", och en med allt
under "Dallas Semiconductor 1-Wire ROUTINES".
Sen kan man göra det hela snyggare genom att låta Dallas *koden*
separat-asembleras (alltså inte gör include på den alls), men det
kan du ta en anna gång...
Macrona behöver nog includeras som nu.
Alltså, en ASM fil har en del olika delar. Först kommer en del där
man har lite definitioner (EQU o.s.v), __CONFIG, macron och liknande.
Sedan kommer koden. Det är därför du får meddelande 151 och 152.
Du försöker definiera saker på fel plats.
"152: Executable code and data must be defined in an appropriate section"
Alltså kod måste ligga efter ett CODE direktiv, o.s.v...
Notera att onewire.inc innehåller både definitioner av macron och
kod (subrutiner), alltså kan den inte ligga där du lägger den.
*Jag* skulle dela onewire.inc i två delar, en med allt
under "Dallas Semiconductor 1-Wire MACROS", och en med allt
under "Dallas Semiconductor 1-Wire ROUTINES".
Sen kan man göra det hela snyggare genom att låta Dallas *koden*
separat-asembleras (alltså inte gör include på den alls), men det
kan du ta en anna gång...

Macrona behöver nog includeras som nu.
Re: Ytterligare en HD44780 tråd.....
Dessa två filer bygger "rent". De gör inget vettigt just nu, men det
går antagligen att bygga vidare med dom...
går antagligen att bygga vidare med dom...
Kod: Markera allt
; Huvud-program
;**********************************************************************
list p=16F628A ; list directive to define processor
#include <p16F628A.inc> ; processor specific variable definitions
; #include <onewire.inc>
errorlevel -302 ; suppress message 302 from list file
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT
; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.
extern OW_RESET ;definieras i Dallas filen...
extern DSRXBYTE ;definieras i Dallas filen...
extern DSTXBYTE ;definieras i Dallas filen...
global IOBYTE
;***** VARIABLE DEFINITIONS (examples)
My_VAR UDATA_SHR
IOBYTE RES 1
; example of using Shared Uninitialized Data Section
INT_VAR UDATA_SHR
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving
;**********************************************************************
RESET_VECTOR CODE 0x0000 ; processor reset vector
goto START ; go to beginning of program
INT_VECTOR CODE 0x0004 ; interrupt vector location
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
MAIN_PROG CODE
START
call ow_reset
; remaining code goes here
goto $ ; loop forever
; initialize eeprom locations
EE CODE 0x2100
DE 0x00, 0x01, 0x02, 0x03
END ; directive 'end of program'
Kod: Markera allt
; *******************************************************
;
; Dallas 1-Wire Support for PIC16F628
;
; Processor has 4MHz clock and 1µs per instruction cycle.
;
; *******************************************************
#include <p16F628A.inc>
global OW_RESET
global DSRXBYTE
global DSTXBYTE
extern IOBYTE
DQ EQU 1
My_VAR UDATA_SHR
TMP0 RES 1
PDBYTE RES 1
COUNT RES 1
; Använder PORT A
; *******************************************************
; Dallas Semiconductor 1-Wire MACROS
; *******************************************************
OW_HIZ:MACRO
BSF STATUS,RP0 ; Select Bank 1 of data memory
BSF TRISA, DQ ; Make DQ pin High Z
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
OW_LO:MACRO
BCF STATUS,RP0 ; Select Bank 0 of data memory
BCF PORTA, DQ ; Clear the DQ bit
BSF STATUS,RP0 ; Select Bank 1 of data memory
BCF TRISA, DQ ; Make DQ pin an output
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
WAIT:MACRO TIME
;Delay for TIME µs.
;Variable time must be in multiples of 5µs.
MOVLW (TIME/5)-1 ;1µs
MOVWF TMP0 ;1µs
CALL WAIT5U ;2µs
ENDM
; *******************************************************
; Dallas Semiconductor 1-Wire ROUTINES
; *******************************************************
onewire_code code
WAIT5U:
;This takes 5µS to complete
NOP ;1µs
NOP ;1µs
DECFSZ TMP0,F ;1µs or 2µs
GOTO WAIT5U ;2µs
RETLW 0 ;2µs
; --------------------------------------------------------
OW_RESET:
OW_HIZ ; Start with the line high
CLRF PDBYTE ; Clear the PD byte
OW_LO
WAIT .500 ; Drive Low for 500µs
OW_HIZ
WAIT .70 ; Release line and wait 70µs for PD Pulse
BTFSS PORTA,DQ ; Read for a PD Pulse
INCF PDBYTE,F ; Set PDBYTE to 1 if get a PD Pulse
WAIT .400 ; Wait 400µs after PD Pulse
RETLW 0
; --------------------------------------------------------
DSRXBYTE: ; Byte read is stored in IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSRXLP:
OW_LO
NOP
NOP
NOP
NOP
NOP
NOP ; Bring DQ low for 6µs
OW_HIZ
NOP
NOP
NOP
NOP ; Change to HiZ and Wait 4µs
MOVF PORTA,W ; Read DQ
ANDLW 1<<DQ ; Mask off the DQ bit
ADDLW .255 ; C=1 if DQ=1: C=0 if DQ=0
RRF IOBYTE,F ; Shift C into IOBYTE
WAIT .50 ; Wait 50µs to end of time slot
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSRXLP
RETLW 0
; --------------------------------------------------------
DSTXBYTE: ; Byte to send starts in W
MOVWF IOBYTE ; We send it from IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSTXLP:
OW_LO
NOP
NOP
NOP ; Drive the line low for 3µs
RRF IOBYTE,F
BSF STATUS,RP0 ; Select Bank 1 of data memory
BTFSC STATUS,C ; Check the LSB of IOBYTE for 1 or 0
BSF TRISA,DQ ; HiZ the line if LSB is 1
BCF STATUS,RP0 ; Select Bank 0 of data memory
WAIT .60 ; Continue driving line for 60µs
OW_HIZ ; Release the line for pullup
NOP
NOP ; Recovery time of 2µs
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSTXLP
RETLW 0
; --------------------------------------------------------
end
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Ytterligare en HD44780 tråd.....
Nu kom svärmor på besök så jag kan inte testa just nu...
Men tuuuusen tack, hoppas att du har löst det, ska titta på det senare. Är riktigt sugen på att komma igång att använda 1-wire sensorer.
Håller en tumme att det fungerar.
Återkommer med rapport om hur det gått.
MVH Peter F
Men tuuuusen tack, hoppas att du har löst det, ska titta på det senare. Är riktigt sugen på att komma igång att använda 1-wire sensorer.
Håller en tumme att det fungerar.
Återkommer med rapport om hur det gått.
MVH Peter F
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Ytterligare en HD44780 tråd.....
Tusen tack Sodjan...
Ngick det mycket bättre. Jag kopierade stycket där du gör definitionerna i ditt exempel och la in i mitt kodexempel och detta resulterade i att majoriteten av alla error meddelandena försvann.
Jag hade alltså glömt Extern och Global kommandona OCH jag tror att jag även glömt "INT_VAR UDATA_SHR " raden.
Tack för hjälpen med det problemet.
Tyvärr får jag dock ett nytt errormeddelande och ett nytt meddelande.
Det är alltså i Object filen som den får error angående IOBYTE, varför får den inte det redan i ASM filen då? Innan den genererat Objectfilen?
As usual, all input are welcome.
MVH Peter F
Från "onewiretesto.asm"
Från "onewire.inc" filen.
Ngick det mycket bättre. Jag kopierade stycket där du gör definitionerna i ditt exempel och la in i mitt kodexempel och detta resulterade i att majoriteten av alla error meddelandena försvann.
Jag hade alltså glömt Extern och Global kommandona OCH jag tror att jag även glömt "INT_VAR UDATA_SHR " raden.
Tack för hjälpen med det problemet.
Tyvärr får jag dock ett nytt errormeddelande och ett nytt meddelande.
Kod: Markera allt
Message[310] C:\MICROCHIP\MPASM SUITE\P16F628A.INC 490 : Superseding current maximum RAM and RAM map.
Och
Error - could not find definition of symbol 'IOBYTE' in file './onewiretesto.o'.
As usual, all input are welcome.

MVH Peter F
Från "onewiretesto.asm"
Kod: Markera allt
; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.
extern OW_RESET ;definieras i Dallas filen...
extern DSRXBYTE ;definieras i Dallas filen...
extern DSTXBYTE ;definieras i Dallas filen...
global IOBYTE
;***** VARIABLE DEFINITIONS (examples)
; example of using Shared Uninitialized Data Section
INT_VAR UDATA_SHR
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving
IOBYTE RES 1
Från "onewire.inc" filen.
Kod: Markera allt
global OW_RESET
global DSRXBYTE
global DSTXBYTE
;global IOBYTE
extern IOBYTE
DQ EQU 1
My_VAR UDATA_SHR
TMP0 RES 1
PDBYTE RES 1
COUNT RES 1
Re: Ytterligare en HD44780 tråd.....
"Superseding current maximum RAM and RAM map" borde ju betyda att RAM är fyllt, för många variabler definierade.
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Ytterligare en HD44780 tråd.....
Jo så kan det förståss vara. Men det känns inte som om det är så många.
Det är precis en sådan sak som jag inte satt mig in i än för jag har helatiden tänkt att jag gör så små saker än.
Jag tycker också att det är underligt att det bara är ett "Message" alltså inte ett "Error". Jag tycker att den borde sparka bakut mer om det jag verkligen överskridit PICens utrymme.
Får kolla på det dock.
MVH Peter F
Det är precis en sådan sak som jag inte satt mig in i än för jag har helatiden tänkt att jag gör så små saker än.
Jag tycker också att det är underligt att det bara är ett "Message" alltså inte ett "Error". Jag tycker att den borde sparka bakut mer om det jag verkligen överskridit PICens utrymme.
Får kolla på det dock.
MVH Peter F
Re: Ytterligare en HD44780 tråd.....
Nu gissar jag mest.
Prova att skapa ett projekt av sodjans filer. Kolla sedan hur mycket RAM som används, det finns nämligen en funktion (som jag tror hör till simulatorn) för det. Det är som en rund analog mätare, eller ett cirkeldiagram, har jag för mig. Om det projektet är nära max är det kanske troligt att ditt är över max.
Prova att skapa ett projekt av sodjans filer. Kolla sedan hur mycket RAM som används, det finns nämligen en funktion (som jag tror hör till simulatorn) för det. Det är som en rund analog mätare, eller ett cirkeldiagram, har jag för mig. Om det projektet är nära max är det kanske troligt att ditt är över max.
Re: Ytterligare en HD44780 tråd.....
> Jag hade alltså glömt Extern och Global kommandona...
Nja, glömt och glömt...
Så som *du* hade gjort (d.v.s med #include av 1wire-filen) så är det ju bara *en*
ASM fil som assembleras och det blir bara *en* objekt (O) fil, och då behövs
inte extern/global. Det var andra fel som skulle ha kunnat fixas, men inte med
just extern/global...
I *mitt* exempel så gör jag inte #include utan jag (lite över-pedagogiskt kanske)
ville visa hur man kan köra med separat-assemblerade filer som sedan "länkas"
ihop av MPLINK. Det blir alltså *två* O filer och då måste man ha extern/global
ifall den ena O filen använder en symbol (extern) som definieras i den andra (global).
Sen, angående Max RAM, så gissar jag att du överskrider vad som finns tillgängligt
som "shared RAM", alltså 16 byte på en 628A. Om det är så att du har fler variabler
än 16 byte så behöver du läsa på lite om RES och allokering av variabler. Skillnaden
mellan UDATA och UDATA_SHR o.s.v.
Att du får "could not find definition of symbol 'IOBYTE' in file" gissar jag beror på att
det är just IOBYTE som inte kan definieras. Hur det är med det kan du se i MAP
filen, vilket är en jäkla bra fil att bekanta sig med ändå. MAP filen gar mycket information
om hur mycket program och data minne man använder, storleken på olika code-segment,
hur de olika variablerna har allokerats o.s.v.
Nja, glömt och glömt...

Så som *du* hade gjort (d.v.s med #include av 1wire-filen) så är det ju bara *en*
ASM fil som assembleras och det blir bara *en* objekt (O) fil, och då behövs
inte extern/global. Det var andra fel som skulle ha kunnat fixas, men inte med
just extern/global...

I *mitt* exempel så gör jag inte #include utan jag (lite över-pedagogiskt kanske)
ville visa hur man kan köra med separat-assemblerade filer som sedan "länkas"
ihop av MPLINK. Det blir alltså *två* O filer och då måste man ha extern/global
ifall den ena O filen använder en symbol (extern) som definieras i den andra (global).
Sen, angående Max RAM, så gissar jag att du överskrider vad som finns tillgängligt
som "shared RAM", alltså 16 byte på en 628A. Om det är så att du har fler variabler
än 16 byte så behöver du läsa på lite om RES och allokering av variabler. Skillnaden
mellan UDATA och UDATA_SHR o.s.v.
Att du får "could not find definition of symbol 'IOBYTE' in file" gissar jag beror på att
det är just IOBYTE som inte kan definieras. Hur det är med det kan du se i MAP
filen, vilket är en jäkla bra fil att bekanta sig med ändå. MAP filen gar mycket information
om hur mycket program och data minne man använder, storleken på olika code-segment,
hur de olika variablerna har allokerats o.s.v.
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Ytterligare en HD44780 tråd.....
Oj nu blev det mycket att tänka på. Jag försöker att strukturera med siffror, hänvisa gärna till dem när/om ni svarar.
Frågeställning 1
Använder dock bara 6 Bytes:
Från koden här över:
Frågeställning 2
Ahaaa, så ditt exempel Sodjan var alltså inte en ASM fil och en INC fil utan två ASM filer. Jag ser nu att du satt ett ";" före include kommandot, det var svårt att upptäcka när det inte blir grönt här inanför code taggarna som det blir i MPLAB.
Är det rätt att du hade två ASM filer?
Frågeställning 3
Menar du filen som heter som mitt projekt och med ändelsen .map?
Detta är hela den filen:
Som det serut i första och andra stycket så har den (MPLAB linkern?) slutat efter att den stött på ett error. Har jag fattat det rätt. Jag ska läsa lite i ELMER 160, har för mig att jag såg något om MAP filen där i kapittlet om Relocatable mode. Stod i alla fall definitivt en del om UDATA och UDATA_SHR som Sodjan tyckte att jag skulle läsa.
MVH Peter F
Frågeställning 1
Använder dock bara 6 Bytes:
Från koden här över:
Kod: Markera allt
------------- asm filen-----------------
INT_VAR UDATA_SHR
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving
IOBYTE RES 1
------------- inc filen ------------------
My_VAR UDATA_SHR
TMP0 RES 1
PDBYTE RES 1
COUNT RES 1
Ahaaa, så ditt exempel Sodjan var alltså inte en ASM fil och en INC fil utan två ASM filer. Jag ser nu att du satt ett ";" före include kommandot, det var svårt att upptäcka när det inte blir grönt här inanför code taggarna som det blir i MPLAB.
Är det rätt att du hade två ASM filer?
Frågeställning 3
Menar du filen som heter som mitt projekt och med ändelsen .map?
Detta är hela den filen:
Kod: Markera allt
MPLINK 4.30.01, Linker
Linker Error Map File - Created Tue May 12 22:40:06 2009
*Warning* - This is only a partial map file due to a link time error.
Only sections which were allocated prior to the error are shown below.
CODEPAGES:
Memory Start End Section Address Size(Bytes)
--------- --------- --------- --------- --------- ---------
page 0x0000 0x07ff
.idlocs 0x2000 0x2003
.device_id 0x2006 0x2006
.config 0x2007 0x2007
eedata 0x2100 0x217f
SHAREBANKS:
Memory Start End Section Address Size(Bytes)
--------- --------- --------- --------- --------- ---------
gprnobnk0 0x0070 0x007e
gprnobnk0 0x00f0 0x00fe
gprnobnk0 0x0170 0x017e
gprnobnk0 0x01f0 0x01fe
gprnobnk1 0x007f 0x007f
gprnobnk1 0x00ff 0x00ff
gprnobnk1 0x017f 0x017f
DATABANKS:
Memory Start End Section Address Size(Bytes)
--------- --------- --------- --------- --------- ---------
sfr0 0x0000 0x001f
sfr1 0x0080 0x009f
sfr2 0x0100 0x010b
sfr3 0x0180 0x018f
gpr0 0x0020 0x006f
gpr1 0x00a0 0x00ef
gpr2 0x0120 0x014f
testreg 0x01ff 0x01ff
ACCESSBANKS:
MVH Peter F
Re: Ytterligare en HD44780 tråd.....
> Använder dock bara 6 Bytes:
OK, då är det inte det. Jag skulle först prova med att flytta definitionerna av
macrona i 1wire filen *före* RES direktiven. Det kan vara så att UDATA-prylarna
krockar på något sätt med macro definitionerna som kommer efteråt nu...
> Är det rätt att du hade två ASM filer?
Ja, men det hade du också (men kallade en för .INC).
Alltså, #include gör att all text/kod från den "andra" filen kopieras in där
#include står *innan* MPASM assemblerar koden. Alltså, MPASM upplever
det hela som att det bara finns en ASM fil.
I mitt fall körs varje ASM fil separat till en egen O fil som sedan MPLINK
"länkar" ihop till en HEX fil. Som jag tror att jag sa tidigare, MPASM/MPLINK
manualen har bra beskrivninar och bilder som visar det hela.
> Menar du filen som heter som mitt projekt och med ändelsen .map?
Ja. Men som du säger så har det gått så fel så den ser lite konstig ut.
Vi/du måste fixa filen först. Börja med att flytta UDATA sektionen så att
den ligger mellan macro-definitionerna och CODE sektionen...
OK, då är det inte det. Jag skulle först prova med att flytta definitionerna av
macrona i 1wire filen *före* RES direktiven. Det kan vara så att UDATA-prylarna
krockar på något sätt med macro definitionerna som kommer efteråt nu...
> Är det rätt att du hade två ASM filer?
Ja, men det hade du också (men kallade en för .INC).
Alltså, #include gör att all text/kod från den "andra" filen kopieras in där
#include står *innan* MPASM assemblerar koden. Alltså, MPASM upplever
det hela som att det bara finns en ASM fil.
I mitt fall körs varje ASM fil separat till en egen O fil som sedan MPLINK
"länkar" ihop till en HEX fil. Som jag tror att jag sa tidigare, MPASM/MPLINK
manualen har bra beskrivninar och bilder som visar det hela.
> Menar du filen som heter som mitt projekt och med ändelsen .map?
Ja. Men som du säger så har det gått så fel så den ser lite konstig ut.
Vi/du måste fixa filen först. Börja med att flytta UDATA sektionen så att
den ligger mellan macro-definitionerna och CODE sektionen...
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Ytterligare en HD44780 tråd.....
>> Jag skulle först prova med att flytta definitionerna av macrona i 1wire filen *före* RES direktiven.
Testat det nu och det blev tyvärr ingen skillnad.
Blev heller ingen skillnad när jag tog bort hela MACRO sektionen och satte ";" före alla rader som anropar de borttagna macrona. Fick precis samma felmeddelande, meddelandet om "Superseding current maximum RAM and RAM" och "Error - could not find definition of symbol 'IOBYTE' in file './onewiretesto.o'."
-------------------
|| Eureka!! ||
-------------------
Medan jag skrev detta meddelande så satt jag och testade lite. Bland annat så döpte jag om min onewire.inc till onewire.asm, tog bort onewire.inc i "project" och la till "onewire.asm".
BUILD ALL -> BUILD CLEAN!
Jag kan inte säga att jag förstår exakt vad det är för skillnad osv men är glad att det fungerar.
Kommer att sova gott inatt med vetskapen att det fixade sig.
Tack för al hjälp.
Jag kan dock tänka mig att jag imorgon kommer att ha nya frågor angående 1-Wire kommunikation med en tempsensor. Framförallt det unika idnummret, kommer att ha tre sensorer, känner jag att jag inte har fått koll på.
Men men, får börja med en och se om man kan komma igång.
Än en gång tusen tack för all hjälp.
MVH Peter F
Testat det nu och det blev tyvärr ingen skillnad.

Blev heller ingen skillnad när jag tog bort hela MACRO sektionen och satte ";" före alla rader som anropar de borttagna macrona. Fick precis samma felmeddelande, meddelandet om "Superseding current maximum RAM and RAM" och "Error - could not find definition of symbol 'IOBYTE' in file './onewiretesto.o'."
-------------------
|| Eureka!! ||
-------------------
Medan jag skrev detta meddelande så satt jag och testade lite. Bland annat så döpte jag om min onewire.inc till onewire.asm, tog bort onewire.inc i "project" och la till "onewire.asm".
BUILD ALL -> BUILD CLEAN!
Jag kan inte säga att jag förstår exakt vad det är för skillnad osv men är glad att det fungerar.
Kommer att sova gott inatt med vetskapen att det fixade sig.

Tack för al hjälp.
Jag kan dock tänka mig att jag imorgon kommer att ha nya frågor angående 1-Wire kommunikation med en tempsensor. Framförallt det unika idnummret, kommer att ha tre sensorer, känner jag att jag inte har fått koll på.
Men men, får börja med en och se om man kan komma igång.
Än en gång tusen tack för all hjälp.
MVH Peter F
Re: Ytterligare en HD44780 tråd.....
Aha, OK. Jag hade båda filerna som .ASM, glömde att påminna om det...
MPLAB kollar på filtyperna och bestämmer utifrån det vad som ska göras.
En ASM fil assembleras med MPASM, en C fil kommer att kompileras med
den C-kompilator som är installerad/vald o.s.v. Sedan länkar MPLINK
ihop alla O filer oavsett om de var ASM eller C från början. INC är nog
ingen filtyp som byggs separat, det förväntas att man gör #include
på den (och då behövs den inte anges separat i projektet heller).
MPLAB kollar på filtyperna och bestämmer utifrån det vad som ska göras.
En ASM fil assembleras med MPASM, en C fil kommer att kompileras med
den C-kompilator som är installerad/vald o.s.v. Sedan länkar MPLINK
ihop alla O filer oavsett om de var ASM eller C från början. INC är nog
ingen filtyp som byggs separat, det förväntas att man gör #include
på den (och då behövs den inte anges separat i projektet heller).
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Ytterligare en HD44780 tråd.....
Ja då har jag suttit större delen av dagen och försökt att förstå 1-wire komunikationen med temp sensorn men det går inte riktigt som jag vill.
Alltså. Som tråden tidigare visar har jag till sist lyckats att få en kod som "bygger rent" med två asm filer där den ena är 1-wire General Macros och General Rutines. Jag har sedan det förra inlägget utökat huvudkoden så att jag nu kan skriva till en HD44780 display. Nu är mitt problem alltså att använda dessa Macron och rutiner på rätt sätt för att visa tempen på displayen.
Jag ska försöka specificera vad som är oklart.
På denna sida http://www.maxim-ic.com/appnotes.cfm/an_pk/2420 där de generella Macrona och rutinerna kommer finns det även ett kodexempel som ska vara komplett för att prata med någon typ av Lipo-monitor. Denna kod använder de macron som jag har i min fil.
I huvudkoden på det exemplet så står det så här.
Här används alltså macrona för att prata med 1-wire slaven. Det är dock en del som jag inte får klämpå.
NUmmer ett, vad är de olika talen som de skickar. Alltså den som motsvarar SKIP ROM (SKPROM) har jag lite koll på (Anropa alla slavar på linan) men de som är i siffror vet jag inte vad de gör.
Tempsensorn jag har DS18S20+ skickar, som jag har förstått det, tillbaka en Byte. Alltså behövs inte två register med Mest - Minst viktiga bitar. Min fråga är vart hamnar informationen när jag väl fått igång kommunikationen. Är det i IOBYTE?
Sista och den mest diffusa fråga, hur 17gubbar fungerar SearchRom/MatchRom. Jag kan inte ställa den nå mycket mer tydlig än så tyvärr. Exempel på saker som snurrar i huvudet. Behöver jag 8 olika register (64bits) för att ha idnummret till varje slav på linan?
(Jag är ganska säker på att så inte är fallet men jag kan inte se hur jag annars ska kunna hålla koll på 64bitars idnummer)
Det är tre dokument som jag har försökt läsa:
http://www.maxim-ic.com/appnotes.cfm/an_pk/2420 Maxim guide för 1-wire tillsammans med en pic
http://datasheets.maxim-ic.com/en/ds/DS18S20.pdf Databladet för Tempsensorn.
http://www.newark.thinkhost.com/brands/ ... 01199a.pdf MicrochipGuide för 1-wire tilsammans med Pic.
Jag är alldeles övertygad om att svaret på alla mina frågor finns i dessa tre dokument men jag får inte kläm på det.
Som vanligt: Tacksam för alla hjälp jag kan få.
MVH Peter F
Än en gång så har jag alltså kommit med ett gäng diffusa frågor, tyvärr.
Alltså. Som tråden tidigare visar har jag till sist lyckats att få en kod som "bygger rent" med två asm filer där den ena är 1-wire General Macros och General Rutines. Jag har sedan det förra inlägget utökat huvudkoden så att jag nu kan skriva till en HD44780 display. Nu är mitt problem alltså att använda dessa Macron och rutiner på rätt sätt för att visa tempen på displayen.
Jag ska försöka specificera vad som är oklart.
På denna sida http://www.maxim-ic.com/appnotes.cfm/an_pk/2420 där de generella Macrona och rutinerna kommer finns det även ett kodexempel som ska vara komplett för att prata med någon typ av Lipo-monitor. Denna kod använder de macron som jag har i min fil.
I huvudkoden på det exemplet så står det så här.
Kod: Markera allt
;---------------------------------------------------------
GET_TEMP:
CALL OW_RESET ; Send Reset Pulse and read for Presence Detect Pulse
BTFSS PDBYTE,0 ; 1 = Presence Detect Detected
GOTO NOPDPULSE
MOVLW SKPROM
CALL DSTXBYTE ; Send Skip ROM Command (0xCC)
MOVLW 0x69
CALL DSTXBYTE ; Send Read Data Command (0x69)
MOVLW 0x0E
CALL DSTXBYTE ; Send the DS2761 Current Register MSB address (0x0E)
CALL DSRXBYTE ; Read the DS2761 Current Register MSB
MOVF IOBYTE,W
MOVWF PICMSB ; Put the Current MSB into file PICMSB
CALL DSRXBYTE ; Read the DS2761 Current Register LSB
MOVF IOBYTE,W
MOVWF PICLSB ; Put the Current LSB into file PICLSB
CALL OW_RESET
NOPDPULSE: ; Add some error processing here!
SLEEP ; Put PIC to sleep
;---------------------------------------------------------
end
NUmmer ett, vad är de olika talen som de skickar. Alltså den som motsvarar SKIP ROM (SKPROM) har jag lite koll på (Anropa alla slavar på linan) men de som är i siffror vet jag inte vad de gör.
Tempsensorn jag har DS18S20+ skickar, som jag har förstått det, tillbaka en Byte. Alltså behövs inte två register med Mest - Minst viktiga bitar. Min fråga är vart hamnar informationen när jag väl fått igång kommunikationen. Är det i IOBYTE?
Sista och den mest diffusa fråga, hur 17gubbar fungerar SearchRom/MatchRom. Jag kan inte ställa den nå mycket mer tydlig än så tyvärr. Exempel på saker som snurrar i huvudet. Behöver jag 8 olika register (64bits) för att ha idnummret till varje slav på linan?

Det är tre dokument som jag har försökt läsa:
http://www.maxim-ic.com/appnotes.cfm/an_pk/2420 Maxim guide för 1-wire tillsammans med en pic
http://datasheets.maxim-ic.com/en/ds/DS18S20.pdf Databladet för Tempsensorn.
http://www.newark.thinkhost.com/brands/ ... 01199a.pdf MicrochipGuide för 1-wire tilsammans med Pic.
Jag är alldeles övertygad om att svaret på alla mina frågor finns i dessa tre dokument men jag får inte kläm på det.
Som vanligt: Tacksam för alla hjälp jag kan få.
MVH Peter F
Än en gång så har jag alltså kommit med ett gäng diffusa frågor, tyvärr.
Re: Ytterligare en HD44780 tråd.....
Ja, 1-Wire kommunikation är ju ett helt eget kapitel så att säga. 
Ganska komplext innan man har passerat ett par aha-upplevelser.
> Alltså den som motsvarar SKIP ROM (SKPROM) har jag lite koll på (Anropa alla slavar på linan)
> men de som är i siffror vet jag inte vad de gör.
Du menar alltså "SKPROM", "0x69" och "0x0E" ?
För det första så är ju SKPROM bara en symbol som definieras med "constant SKPROM=0xCC"
så just det skulle även kunna ha skrivits "MOVLW 0xCC". Det var lite oklart om
det var just det som du hakade upp dig på (generellt kan du vara lite tydligare
på vad som är oklart så blir det inte så mycket gissningar). Man skulle ju även
kunna ha "constant" definitioner för "0x69" och "0x0E" om man tycker att koden
blir tydligare så (vilket jag kan tycka).
Vad du olika kommandona gör framgår (och beror på) det aktuella databladet
för just den 1-wire pryl som de kör mot i exemplet (en DS2761). Om du använder
något annat, t.ex en DS18S20, så får du kolla vad *det* databladet säger.
> Tempsensorn jag har DS18S20+ skickar, som jag har förstått det, tillbaka en Byte...
Jag hade för mig att det var ett 12-bitars värde eller liknande. Vad säger databladet ?
Jag kollade och det är alltså 2 byte varav 8 bitar är ett värde och de andra "sign"...
Jag har aldrig kört någon 1-wire pryl, men databladet för DS18S20 är ju väldigt
tydligt på vilka sekvenser som ska köras. T.ex "DS18S20 OPERATION EXAMPLE 3"
på sidan 19 verkar vara nästan eakt det du vill göra.
> Alltså behövs inte två register med Mest - Minst viktiga bitar.
Som jag har förstått det så läser man alltid hela "Scratchpad" från DS18S20
plus en extra CRC (kontrollsumma), totalt 9 bytes. Alltså (som jag förstår det)
så får DSRXBYTE anropas 9 gånger och IOBYTE får sparas undan i en egen
kopia av Scratchpad efter varje anrop. Allokeras t.ex med "Scrachpad RES 9".
Sen kan man bara anropa DSRXBYTE och lägga under IOBYTE efter hand :
CALL DSRXBYTE
MOVW IOBYTE, W
MOVWF Scratchpad
CALL DSRXBYTE
MOVW IOBYTE, W
MOVWF Scratchpad + 1
CALL DSRXBYTE
MOVW IOBYTE, W
MOVWF Scratchpad +2
...
...
CALL DSRXBYTE
MOVW IOBYTE, W
MOVWF Scratchpad + 9
eller något i den stilen...
Först måste man naturligstvuis göra anropen för "Convert T",
"Skip ROM" och "Read Scratchpad", så klart...
Och, ja addresen är 64-bitar, men om man bara har en 1-wire enhet
så kan man hoppas över det just "Skip ROM". Om man har 2 eller fler
enheter så måste man använda "Match ROM" (tillsammans med en
64-bitars adress) för att "peka ut" en av dom.

Ganska komplext innan man har passerat ett par aha-upplevelser.
> Alltså den som motsvarar SKIP ROM (SKPROM) har jag lite koll på (Anropa alla slavar på linan)
> men de som är i siffror vet jag inte vad de gör.
Du menar alltså "SKPROM", "0x69" och "0x0E" ?
För det första så är ju SKPROM bara en symbol som definieras med "constant SKPROM=0xCC"
så just det skulle även kunna ha skrivits "MOVLW 0xCC". Det var lite oklart om
det var just det som du hakade upp dig på (generellt kan du vara lite tydligare
på vad som är oklart så blir det inte så mycket gissningar). Man skulle ju även
kunna ha "constant" definitioner för "0x69" och "0x0E" om man tycker att koden
blir tydligare så (vilket jag kan tycka).
Vad du olika kommandona gör framgår (och beror på) det aktuella databladet
för just den 1-wire pryl som de kör mot i exemplet (en DS2761). Om du använder
något annat, t.ex en DS18S20, så får du kolla vad *det* databladet säger.
> Tempsensorn jag har DS18S20+ skickar, som jag har förstått det, tillbaka en Byte...
Jag hade för mig att det var ett 12-bitars värde eller liknande. Vad säger databladet ?
Jag kollade och det är alltså 2 byte varav 8 bitar är ett värde och de andra "sign"...
Jag har aldrig kört någon 1-wire pryl, men databladet för DS18S20 är ju väldigt
tydligt på vilka sekvenser som ska köras. T.ex "DS18S20 OPERATION EXAMPLE 3"
på sidan 19 verkar vara nästan eakt det du vill göra.
> Alltså behövs inte två register med Mest - Minst viktiga bitar.
Som jag har förstått det så läser man alltid hela "Scratchpad" från DS18S20
plus en extra CRC (kontrollsumma), totalt 9 bytes. Alltså (som jag förstår det)
så får DSRXBYTE anropas 9 gånger och IOBYTE får sparas undan i en egen
kopia av Scratchpad efter varje anrop. Allokeras t.ex med "Scrachpad RES 9".
Sen kan man bara anropa DSRXBYTE och lägga under IOBYTE efter hand :
CALL DSRXBYTE
MOVW IOBYTE, W
MOVWF Scratchpad
CALL DSRXBYTE
MOVW IOBYTE, W
MOVWF Scratchpad + 1
CALL DSRXBYTE
MOVW IOBYTE, W
MOVWF Scratchpad +2
...
...
CALL DSRXBYTE
MOVW IOBYTE, W
MOVWF Scratchpad + 9
eller något i den stilen...
Först måste man naturligstvuis göra anropen för "Convert T",
"Skip ROM" och "Read Scratchpad", så klart...
Och, ja addresen är 64-bitar, men om man bara har en 1-wire enhet
så kan man hoppas över det just "Skip ROM". Om man har 2 eller fler
enheter så måste man använda "Match ROM" (tillsammans med en
64-bitars adress) för att "peka ut" en av dom.