Ytterligare en HD44780 tråd.....

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Ytterligare en HD44780 tråd.....

Inlägg av v-g »

Börja med det enklaste och sen trappa upp är en bra approach. Själv kodade jag till sensorn på datorn så jag visste vad den skulle svara och sen fick jag det att fungera på PIC:en efter typ tre dygn :razz:

Var noga med resettpulsen den är extremt viktig och håll sen timingen på sänd/mottagnings-tidsluckorna så kommer det att fungera när buggarna är borta.

Ett oscilloskop är enormt bra hjälpmedel för detta samtidigt som man kör loopen gång på gång då kan man läsa ut tempen på osc.skärmen om det hela är rätt. Dra av en triggpuls precis innan du börjar så får du med allt, precis så gjorde jag när det började "fungera".
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Ytterligare en HD44780 tråd.....

Inlägg av vfr »

sodjan skrev:Vilket är i princip samma sak som :

Kod: Markera allt

Definition:

Buffert res     8
TempH   set     Buffert + 0
TempL   set     Buffert + 1
Addr    set     Buffert + 2

Användning:

        movfw   TempH
Vilket kanske blir lite renare/snyggare i själva koden...
Ja, det blir snyggare om den "structen" bara skall användas på den positionen (med "Buffert"). Det håller jag med om. Skall den däremot göras som en generell definition att använda på flera ställen så blir min variant "renare" och man slipper ha samma definition på två ställen. Ungefär som att man i en databas inte skall lagra redundant data utan hellre länka till det ställe där den datan finns första gången. Det handlar ju om att minimera risken för fel vid ändringar. I det fallet om att vara tvungen att ändra på flera ställen när det är en definition som är ändrad.

Du (Janne) är säkert med på vad jag menar, och jag förstår självklart att det blir tydligare i ett enkelt fall med den varianten. Det fina är att det ena utesluter inte det andra. Man kan börja med den enklare varianten för att sedan fortsätta med den andra när man får kommer till det behovet.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Ytterligare en HD44780 tråd.....

Inlägg av sodjan »

Ja visst, det finns ju många sätt att lösa det på. Mycket handlar det
om "tycke och smak". Om man har flera sensorer med var sin buffert
kan man t.ex göra så här:

Kod: Markera allt

TempH_diff      EQU     0
TempL_diff      EQU     1
Addr_diff       EQU     2

Sensor_buffers  UDATA

Sensor1         RES     8
Sensor1_TempH   SET     Sensor1 + TempH_diff
Sensor1_TempL   SET     Sensor1 + TempL_diff 
Sensor1_Addr    SET     Sensor1 + Addr_diff

Sensor2         RES     8
Sensor2_TempH   SET     Sensor2 + TempH_diff
Sensor2_TempL   SET     Sensor2 + TempL_diff 
Sensor2_Addr    SET     Sensor2 + Addr_diff
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Ytterligare en HD44780 tråd.....

Inlägg av PopUnoNkoK »

Sodjan & Vfr: Era exempel ser strålande ut. Det är ju så här man ska göra för att få uttömmande svar. Försöka hitta en fråga som ni proffs kan börja diskutera sinsemellan och sedan bara sitta och "tjuv lyssna". :)

Har läst mycket nu, eller samma sak om och om igen och tror mig nu kunna ställa väldigt konkreta frågor. :)

Subrutinen för att ta emot data, tex efter att ha utfört ReadScratchPad har en räknare som håller koll på att man tar emot 8 Bitar. När dessa 8Bitar är mottagna så är subrutinen färdig. Men då har jag bara läst 1 Byte av de totalt 9 Byte som jag är ute efter.
Hur gör jag för att fortsätta att läsa de resterande 8Bytesen? Om jag utför ReadScratchPad igen, kommer andra Byten då eller kommer bara första Byten igen?

Sodjan & VFR, ska implementera nåt av era exempel senare. Nu har jag bara två register reserverade, ett för MSB och ett för LSB för att läsa av temperaturen, resten av bytesen kommer jag att förkasta i början.

MVH Peter F
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Ytterligare en HD44780 tråd.....

Inlägg av sodjan »

PÅ något sätt måste man anropa mottagningsrutinen så många gånger som man behöver
för att läsa det man vill läsa in. Så att säga. För scratchpad är det väl 8+1 bytes, så
9 anropt till läsrutinen borde det bli. Det *borde* vara så att läs-rutinen inte
gör någon "reset" på 1-wire linjen, utan kan fortsätta läsa där den slutade senast.
Mellan anropen får man naturligstvis spara unden IOBYTE (eller vad den ny kallades)
så att man inte skriver över föregående värde. Eller räkna tills man kommer till
rätt byte i scratchpad och spara IOBYTE då. Behöver man inte värderna innan
så behöver de väll inte sparas heller (ungefär som du skrev, för övrigt...).
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Ytterligare en HD44780 tråd.....

Inlägg av PopUnoNkoK »

Alltså för att använda V-G:s Pseudokod borde det bli något sånt här:

Kod: Markera allt

RESET-->Skip rom-->Start conversion--> wait for conversion -->
RESET -->Skip rom -->Read scrathpad --->
Skip rom -->Read scrathpad --->
Skip rom -->Read scrathpad --->
Skip rom -->Read scrathpad --->... osv tills man läst alla Bytes.
Låter det vettigt?

Anledningen att jag ställer så många frågor innan jag egentligen har kommit igång att testa är att jag inte har nåt Scope som kan kolla signalerna och ingen möjlighet till att In Circuit Debugga. Därför vill jag ha så bra koll som möjligt innan jag börjar testa så jag vet vad jag gör "rätt" och vad om kan vara fel.

MVH Peter F
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Ytterligare en HD44780 tråd.....

Inlägg av sodjan »

Rent spontant låter det ungefär som jag tror att man ska göra.
Men jag vet inte säkert, har aldrig kört någon 1-Wire själv...
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Ytterligare en HD44780 tråd.....

Inlägg av PopUnoNkoK »

Sodjan. I ditt näst sista inlägg skrev du 8+1 bytes. Menade du då att "+1" var CRC Byten? Är det vanligt att man benämner CRC Byten så eller var det bara "spontant"?

MVH Peter F
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Ytterligare en HD44780 tråd.....

Inlägg av sodjan »

> Menade du då att "+1" var CRC Byten?

Ja. Kunde ha skrivit 9. Eller är det 8 inkl CRC'n ?
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Ytterligare en HD44780 tråd.....

Inlägg av PopUnoNkoK »

Nix, du hade helt rätt från början, det blir 9bytes inklusive CRC byten.

Kan meddela att jag har kommit igång med prata med DS1820:an. Nu gäller det bara att skriva lite kod så att jag får ut det i decimaltal på displayen. Just nu visar displayen "/" vilket motsvarar b'00101111' i HD44780:s teckentabell vilket motsvarar 47, och varje steg är värt 0,5 grader vilket resulterar i 23,5grader! :) Inte så användarvänligt än så länge helt enkelt. :)

Återkommer med mer rapporter efter lite kodning.

Tack för all hjälp.

MVH Peter F
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Ytterligare en HD44780 tråd.....

Inlägg av v-g »

Alla bytes kommer efter varandra tills man struntar att ta emot dem bara så att alla förstår detta ;)

För att omvandla superenkelt så kör du bara med en rotateright (dvs dela med två) då har du ½grads noggrannhet direkt.

När man vill se i "klartext" vad en byte innebär så prova sök efter en binary to decimal conversion på PIClist tex. Sen skriver du ut detta som 1-5 tecken (ett är punkten ;) )


Själv sitter man i onewireträsket så just nu är vi(jag&1wire) som ler och långhalm. Jag önskar att allt vore så lätt som när man bara var på ena sidan. Nu ska man vara både master och slave och det är inte så lätt som man kan tro. Slaven är faktist den som gör jobbet :mrgreen:
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Ytterligare en HD44780 tråd.....

Inlägg av PopUnoNkoK »

V-G: Först en direkt fråga. Räcker det med en SkipRom?
Så här ser min kod ut idag. Om man bara läser kommentarerna så är det en typ av Pseudo kod.

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          START
      MOVLW         SKPROM
      CALL          DSTXBYTE                    ; Send Skip ROM Command (0xCC)
      MOVLW         0x44						
      CALL          DSTXBYTE                    ; Send convert T
	CALL		delay_1s
      CALL          OW_RESET                    ; Send Reset Pulse and read for Presence Detect Pulse
      BTFSS         PDBYTE,0                    ; 1 = Presence Detect Detected
      GOTO          START
      MOVLW         SKPROM
      CALL          DSTXBYTE                    ; Send Skip ROM Command (0xCC)
      MOVLW         0xBE						
      CALL          DSTXBYTE                    ; Send Read Scrachpad
      CALL          DSRXBYTE                    ; Readscrachpad
	movfw		IOBYTE
	movwf		temp_least
Räcker det med att fortsätta att bara köra "Call DSRXBYTE", alltså read scrachpad, eller måste jag skicka både "DSTXBYTE & DSRXBYTE"? Eller är det rent så att jag måste använda de tre sista kommandona, alltså "Skiprom, DSTXBYTE & DSRXBYTE"?
Jag vet att jag även måste spara undan IOBYTEN i olika register under tiden. Ska testa att ge mig på "Scrachpad RES 9" som diskuterats tidigare i tråden.
Med koden här ovanför fungerar termometern perfekt förutom att den inte skulle fungera i minusgrader eftersom jag inte tar rätt på den andra byten. :?

Då jag fick till koden så att den visade tempen i klartext så gjorde jag så att jag har en loop som lägger till 5 i ett register och tar bort ett från temp_least för varje Cykel. Detta gör att jag har ett värde (två register) som är temperaturen ggr tio. Sedan sätter jag bara en punkt på rätt ställe. När jag skrev den koden i torsdags så kände jag inte till instruktionen Rotateright, har dock läst massor i helgen och lärt mig och den, även testat lite kod.

Hursom helst, så var det nog lika bra att jag inte kunde den för då fick jag lära mig att använda två register till ett värde. Första gången jag gjorde det. Så här ser min loop ut ifall någon är intresserad.

Kod: Markera allt

temperatur_loop						;Denna loop ger Temperaturen gånger 10
		bcf		STATUS, C
		banksel	L_byte
		movlw	.5					;5an pga att varje steg från sensorn motsvarar 0.5 grader
		addwf	L_byte				;Lägger till den låga Byten
		btfsc	STATUS, C
		incf	H_byte				;När Låga Byten är 255 lägger vi till en i den höga byten
		decfsz	temp_least			;Räkna ner från Temperatur värdet, Temp_least motsvarar Byte0 i ScrachPad
		goto	temperatur_loop
		nop
Har skrivit koden från Scrach så jag kan tänka mig att den inte är "Vacker".

MVH Peter F

EDIT: La till "Har skrivit koden från Scrach så jag kan tänka mig att den inte är "Vacker"."
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Ytterligare en HD44780 tråd.....

Inlägg av v-g »

För att bara få tempen med ½grad duger shift right mycket bra. Decimalen får du i Carry ;)

Vill man bara skriva ut positiva temperaturer så räcker det således med att bara ta emot det första tecknet. För +/- måste man ta emot de första två.

Man skickar skip rom sen convert temperature. Därefter väntar man på "conversion done" dvs att signalen stiger till hög nivå (ds1820 håller den låg medan den räknar ut tempen) därefter ny reset, skip rom och sedan read scrachpad.

Allt står ganska bra i databladet men det krävs att man läser noga. Det finns tre exempel om jag inte minns fel ett av dessa är ganska bra att börja med.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Ytterligare en HD44780 tråd.....

Inlägg av PopUnoNkoK »

Jo jag har upptäckt att shift right skulle varit enklare. :) Men varför göra det lätt. :)

Jag har nu lyckats ta emot alla bytes. Även skrivit en "funktion" som skriver ut ett binärt tal på LCD skärmen med hjälp av shift left. Fungerar superbra och är juh toppen för lite debugging när det blev en så enkel liten kodsnutt. Det var så jag fick reda på att jag lyckats ta emot den andra byten. Jag visade tempen i "vanliga siffror" och så visade jag andra byten som binär serie och så kastade jag in sensorn i frysen. När den passerade nollan så ändrades den andra byten från 00000000 till 11111111.

Jag hade tänkt koda stt jag får högre upplösning är 0,5grader men när jag läste din tråd så verkade det lite bökigare än vad jag trodde. :)

Kanske nöjer mig med att ha 0,5graders upplösning, ändrar så att jag använder shiftright metoden istället för ggr10 och så koda till med "comf" så att den klarar minusgrader.

Tack för alla svar.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Ytterligare en HD44780 tråd.....

Inlägg av sodjan »

> När den passerade nollan så ändrades den andra byten från 00000000 till 11111111.

Du menar så som "Table 1" i databladet visar ?
Var inte det förväntat ?
Skriv svar