temp-station bygge
Re: temp-station bygge
I början så kan det underlätta om man skriver ut delar av eller hela databladet för µC och märker med märkpenna dom delar av texten som är av intresse.
Re: temp-station bygge
En bra vana är att ställa varenda satans pinne och slå av/på Peripherals direkt i början av programmet, så slipper man bry sig, gärna i kombination med bra kommentarer.
När man går tillbaka i koden efter ett år, så ser man att man aktivt har ställt in det och slipper fundera över Uc'n's defaults.
Just my 5 cents
När man går tillbaka i koden efter ett år, så ser man att man aktivt har ställt in det och slipper fundera över Uc'n's defaults.
Just my 5 cents
Re: temp-station bygge
Helt rätt.
Samma sak med kod som visas här på forumet.
Sätt prylarna själv, så blir det inga frågor om man har glömt det,
även om default värdet i och för sig kanske fungerar. Det är
bättre att visa att man faktiskt *har* tänkt...
Samma sak med kod som visas här på forumet.
Sätt prylarna själv, så blir det inga frågor om man har glömt det,
även om default värdet i och för sig kanske fungerar. Det är
bättre att visa att man faktiskt *har* tänkt...
Re: temp-station bygge
se, där kom en bra strategi
tackar
(dock på inget sätt kommer detta underminera databladets betydelse i mina ögon)
Jag håller på att tackla ks0108 kommunikation och har precis förstått hur LCD'n vill ha det. Då skulle jag titta på PICen och bestämma
vilka pinnar som ska ta hand om LCD'n. Därav tidigare frågor.
En anna fråga - vad tycker ni är bättre vad gäller mina sensorer.. de är duty-cycle modulerade.
länk till databladet finns i första inlägget.
Jag funderade lite, eftersom sensorn sköter allting själv och jag behöver endast "veta" dess läge under en tid, kan jag antingen sampla mha timer eller
köra interrupt_on_change och ta tiden mellan interrupts.
vilket sätt tycker ni är mest lämpligt (storleken på koden bryr jag mig inte på, är inte ute efter att "göra det lätt" för mig)
interrupt on change borde bjuda på mer precision har jag en svag misstanke om...

tackar

Jag håller på att tackla ks0108 kommunikation och har precis förstått hur LCD'n vill ha det. Då skulle jag titta på PICen och bestämma
vilka pinnar som ska ta hand om LCD'n. Därav tidigare frågor.
En anna fråga - vad tycker ni är bättre vad gäller mina sensorer.. de är duty-cycle modulerade.
länk till databladet finns i första inlägget.
Jag funderade lite, eftersom sensorn sköter allting själv och jag behöver endast "veta" dess läge under en tid, kan jag antingen sampla mha timer eller
köra interrupt_on_change och ta tiden mellan interrupts.
vilket sätt tycker ni är mest lämpligt (storleken på koden bryr jag mig inte på, är inte ute efter att "göra det lätt" för mig)
interrupt on change borde bjuda på mer precision har jag en svag misstanke om...
Re: temp-station bygge
Nu vet jag inte vad det finns för hårdvara i din PIC, men när jag implementerade detta senast på en Renesas R8C använde jag både interrupt och timer.
Första uppgiften är att hitta den positiva flanken (eller den negativa om man vill göra saker bakfram). Detta gjorde jag genom att konfigurera interrupt-on-rising-edge. När detta inträffar, konfigurerar jag om för interrupt-on-both-edges. Då kan jag hålla reda på om jag mäter den positiva eller negativa halvperioden.
För att mäta tiden använde jag en 16 bitars timer, som vid varje edge automatiskt samplade sig sjäv till ett separat timer register (timern hade s.k. dubbel buffering). Detta register läste jag av vid varje interrupt. Sedan var det bara att hålla reda på tiderna och summera över ett antal perioder för att få bra nogrannhet.
Första uppgiften är att hitta den positiva flanken (eller den negativa om man vill göra saker bakfram). Detta gjorde jag genom att konfigurera interrupt-on-rising-edge. När detta inträffar, konfigurerar jag om för interrupt-on-both-edges. Då kan jag hålla reda på om jag mäter den positiva eller negativa halvperioden.
För att mäta tiden använde jag en 16 bitars timer, som vid varje edge automatiskt samplade sig sjäv till ett separat timer register (timern hade s.k. dubbel buffering). Detta register läste jag av vid varje interrupt. Sedan var det bara att hålla reda på tiderna och summera över ett antal perioder för att få bra nogrannhet.
Re: temp-station bygge
Är ingen större skillnad på en PIC i det avsendet.
Man kör en timer i "capture" mode, så vitt jag förstår.
Men å andra sidan så är det bara *ett* sätt att lösa det på,
och det får kanske anpassas till hur de övriga delarna
av applkationen fungerar. Pulserna från givaren kommer
ju kontinuerligt, så man behöver inte mäta pulstiden hela tiden,
det räcker kanske att mäta en puls vid behov. Och då är det
inte säkert att det är smidigast att göra det via interrupt.
Man kör en timer i "capture" mode, så vitt jag förstår.
Men å andra sidan så är det bara *ett* sätt att lösa det på,
och det får kanske anpassas till hur de övriga delarna
av applkationen fungerar. Pulserna från givaren kommer
ju kontinuerligt, så man behöver inte mäta pulstiden hela tiden,
det räcker kanske att mäta en puls vid behov. Och då är det
inte säkert att det är smidigast att göra det via interrupt.
Re: temp-station bygge
Att alla poängterar databladets betydelse är naturligtvis rätt och visst ska det vara så, men vad gör mna när databladet är helkass 
Igår tacklade jag displayen. KS0108 är den jag använder. Databladet (länk i första inlägget) är väldigt minimalistisk och jag fick massvis med problem igår som jag fick lösa genom att göra research på nätet
Hur som helst, en av de saker som databladet saknade var att "clear display" kommandot saknas i KS0108's kommandosamling, detta fick konstiga effekter samt att RAM i uppstartsläget KAN innehålla slumpmässig data gör att jag fick skumma mönster och om de råkade ligga över det jag försökte skriva till displayen så såg jag självklart inget utskrivet... ja ni fattar.
Den rutinen fick man såklart skriva själv och här är gårdagens prestation.
Finns det verkligen inget bättre (och snabbare) sätt att rensa displayen än att skriva 0 till varje y på varje page och i båda kontrollers
Det fungerar nu
så egentligen handlar det bara om min nyfikenhet och ev. optimering (eftersom uppstarten är inte något som händer hela tiden)

Igår tacklade jag displayen. KS0108 är den jag använder. Databladet (länk i första inlägget) är väldigt minimalistisk och jag fick massvis med problem igår som jag fick lösa genom att göra research på nätet

Hur som helst, en av de saker som databladet saknade var att "clear display" kommandot saknas i KS0108's kommandosamling, detta fick konstiga effekter samt att RAM i uppstartsläget KAN innehålla slumpmässig data gör att jag fick skumma mönster och om de råkade ligga över det jag försökte skriva till displayen så såg jag självklart inget utskrivet... ja ni fattar.
Den rutinen fick man såklart skriva själv och här är gårdagens prestation.
Kod: Markera allt
lcd_clear_display
movlw .0
movwf LCD_PAGE ; en variabel
pu call lcd_set_page ; sätter page utan delay
movlw .64
movwf LCD_Y
up decf LCD_Y
call lcd_set_y ; sätter y utan delay
movlw 0
call lcd_write_data ; skriver utan delay
xorwf LCD_Y ; W = 0, gör kontroll om LCD_Y kommit ner till 0 än
btfss STATUS, Z
goto up
incf LCD_PAGE
movlw .8
xorwf LCD_PAGE
btfss STATUS, Z
goto pu
return
Det fungerar nu

Re: temp-station bygge
> Finns det verkligen inget bättre (och snabbare) sätt att rensa displayen
Hur lång tid tar det ? Och är det ett problem ?
Hur ofta tömmer du hela displayen ?
Jag gjorde på ett liknande sätt, se endan. Hojta till om du vill
se hela min KS0108 exempel kod...
Hur lång tid tar det ? Och är det ett problem ?
Hur ofta tömmer du hela displayen ?
Jag gjorde på ett liknande sätt, se endan. Hojta till om du vill
se hela min KS0108 exempel kod...
Kod: Markera allt
;**********************************************************
EW12A00_clear
; clear EW12A00...
; Page : 3 => 0
; Column : 121 => 0
;
movlw d'04'
movwf EW12A00_page_addr
clear_page_loop
decf EW12A00_page_addr, f
movf EW12A00_page_addr, w
call EW12A00_set_page
movlw d'122'
movwf EW12A00_col_addr
clear_col_loop
decf EW12A00_col_addr, f
movf EW12A00_col_addr, w
call EW12A00_set_col
EW12A00_write_data h'00'
tstfsz EW12A00_col_addr
goto clear_col_loop
tstfsz EW12A00_page_addr
goto clear_page_loop
return
;**********************************************************
Re: temp-station bygge
nej nej.. inga problem med det, då det görs så sällan.
Inget annat än en undran om att en sådan åtgärd kanske har andra, bättre lösningar än det primitiva "nolla rad för rad" metoden.
Hur som helst, så är jag på god väg med projektet, mycket tack vare forumet.
Tyvärr så har min kamera gått sönder för någon vecka sedan, har inga trevliga bilder att lägga upp
Men en beskrivning kommer snart.
Inget annat än en undran om att en sådan åtgärd kanske har andra, bättre lösningar än det primitiva "nolla rad för rad" metoden.
Hur som helst, så är jag på god väg med projektet, mycket tack vare forumet.
Tyvärr så har min kamera gått sönder för någon vecka sedan, har inga trevliga bilder att lägga upp

Men en beskrivning kommer snart.
Re: temp-station bygge
då var det färdigt med displayen

KS0108 ville ha mer av mig än databladet för just den displayen hade berättat. Detektivarbetet utfördes i massor, men men...
Det fungerar visst nu
programmet växer, och det är nog dags att börja med pagesel då jag närmar mig 1024 gränsen
anledningen är alla byte mönster som utgör mina fonter, binär data för att rita de stora siffrorna - fy fan vad det tar plats...
en bokstav i 5x8 font tar ju 15 words av programminnet , tre instruktioner per utskriven byte
och det är hårdkodat också...
tur att 16f690 har 4K programminne ... klarar mig kanske precis...
nu ska jag sampla proberna...


KS0108 ville ha mer av mig än databladet för just den displayen hade berättat. Detektivarbetet utfördes i massor, men men...
Det fungerar visst nu

programmet växer, och det är nog dags att börja med pagesel då jag närmar mig 1024 gränsen

anledningen är alla byte mönster som utgör mina fonter, binär data för att rita de stora siffrorna - fy fan vad det tar plats...
en bokstav i 5x8 font tar ju 15 words av programminnet , tre instruktioner per utskriven byte

och det är hårdkodat också...
tur att 16f690 har 4K programminne ... klarar mig kanske precis...
nu ska jag sampla proberna...
-
- Inlägg: 8092
- Blev medlem: 18 januari 2009, 00:48:24
- Ort: Alvesta, Småland
Re: temp-station bygge
> ...med pagesel då jag närmar mig 1024 gränsen
2048 (2Kwords) gränsen.
2048 (2Kwords) gränsen.
Re: temp-station bygge
hmm, det var såklart 2K stora pages på midrange (läste om kapiteln och det stämde).
vet inte var jag fick 1024 ifrån
Du är vaken, du
vet inte var jag fick 1024 ifrån

Du är vaken, du

Re: temp-station bygge
satt ett par timmar med att konstruera en samplingsruting och här är resultatet. Vill gärna ha åsikter
Ingen interrupt, sensorerna samplas vid behov.
t_res är en res 2 register, där första resultatet från Timer1 (16 bit) sparas.
T1 och T2 är enligt detta här:

PICen körs i 4 MHz intern osc.
Timer1 har ingen prescaler = 1 uS tick.
Sensorerna producerar pulser som pendlar mellan 1 och 4 KHz. Vid absolut största bredden på en puls @ 1 KHz (T2 = 1 ms) har Timer1
räknat upp till dec. 1000 vilket är helt acceptabelt och borgar för bra noggrannhet trots små avvikelser som syns i koden.
Rutinen testat sensor pulser på RA3
Ni får stå ut med att mina kommentarer är på engelska, gammal vana

Ingen interrupt, sensorerna samplas vid behov.
t_res är en res 2 register, där första resultatet från Timer1 (16 bit) sparas.
T1 och T2 är enligt detta här:

PICen körs i 4 MHz intern osc.
Timer1 har ingen prescaler = 1 uS tick.
Sensorerna producerar pulser som pendlar mellan 1 och 4 KHz. Vid absolut största bredden på en puls @ 1 KHz (T2 = 1 ms) har Timer1
räknat upp till dec. 1000 vilket är helt acceptabelt och borgar för bra noggrannhet trots små avvikelser som syns i koden.
Rutinen testat sensor pulser på RA3
Ni får stå ut med att mina kommentarer är på engelska, gammal vana

Kod: Markera allt
;if RA3 goes high during any of goto's cycles while testing for state, just before enabling Timer1
;we'll lose some accuracy due to going back(2), testing state again (1) and skipping if condition is met (+1) and taking action(1), all this
;before Timer1 starts ticking. Maximum of 5 instructions cycles = 5 us
sample_sensor1
clrf TMR1L ;nollställ timern (samma bank som PORTx) Timer1 must be off here
clrf TMR1H
again
btfss PORTA, 3 ;test to determine state
goto is_low ;if low, we're ok to start to wait for it to go high and start counting. goto is_low
goto is_high ;if is high, we must wait until next time, wait for it to go low, the come back here. goto is_high
is_high ; here we wait for it to go low and the go back to 'again'
btfsc PORTA, 3
goto is_high
goto again
is_low ; here we wait for it go go high and then start counting
btfss PORTA, 3
goto is_low ;goto takes 2 cycles (losing min 3 and max 5 uS of sampling resolution :-( before timer starts ticking )
;finally it just turned high (maybe, waste one more instruction cycle to reinit TMR1L with 0x03 - 0x05 to compensate for lost cycles ? )
bsf T1CON, 0 ;enable timer1
still_high
btfsc PORTA, 3 ;... and wait for it to go low.. timer is ticking... at 1 uS rate.. no prescaler
goto still_high
;now it's low. (same story here, off by min 2 and max 4 uS)
movf TMR1L, W ;copy tmr1 to t_res. Save L byte first
movwf t_res
movf TMR1H, W ; save H byte
movwf t_res+1
still_low ;wait for the end of cycle that happens when new pulse makes RA3 high again
btfss PORTA, 3
goto still_low
;here we reach end of the cycle when ra3 goes high again
bcf T1CON, 0 ;stop Timer1 now, T1 (high) part of the pulse is in t_res registers and T2 (high+low parts of the pulse) is in the TMR1 L+H registers
return