temp-station bygge

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: temp-station bygge

Inlägg av BEEP »

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.
ToPNoTCH
Inlägg: 5158
Blev medlem: 21 december 2009, 17:59:48

Re: temp-station bygge

Inlägg av ToPNoTCH »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: temp-station bygge

Inlägg av sodjan »

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...
diman
EF Sponsor
Inlägg: 192
Blev medlem: 14 februari 2007, 09:58:06
Ort: Löddeköpinge

Re: temp-station bygge

Inlägg av diman »

se, där kom en bra strategi :tumupp:
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...
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: temp-station bygge

Inlägg av mri »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: temp-station bygge

Inlägg av sodjan »

Ä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.
diman
EF Sponsor
Inlägg: 192
Blev medlem: 14 februari 2007, 09:58:06
Ort: Löddeköpinge

Re: temp-station bygge

Inlägg av diman »

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 :doubt:

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
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 :happy: så egentligen handlar det bara om min nyfikenhet och ev. optimering (eftersom uppstarten är inte något som händer hela tiden)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: temp-station bygge

Inlägg av sodjan »

> 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...

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
    
;**********************************************************
diman
EF Sponsor
Inlägg: 192
Blev medlem: 14 februari 2007, 09:58:06
Ort: Löddeköpinge

Re: temp-station bygge

Inlägg av diman »

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.
diman
EF Sponsor
Inlägg: 192
Blev medlem: 14 februari 2007, 09:58:06
Ort: Löddeköpinge

Re: temp-station bygge

Inlägg av diman »

då var det färdigt med displayen :tumupp:
Bild

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 :evil:
och det är hårdkodat också...



tur att 16f690 har 4K programminne ... klarar mig kanske precis...

nu ska jag sampla proberna...
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: temp-station bygge

Inlägg av danielr112 »

Läckert.

Satsa på 1-wire vetja! :D
diman
EF Sponsor
Inlägg: 192
Blev medlem: 14 februari 2007, 09:58:06
Ort: Löddeköpinge

Re: temp-station bygge

Inlägg av diman »

ska bara bli färdig med det här projektet först :-)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: temp-station bygge

Inlägg av sodjan »

> ...med pagesel då jag närmar mig 1024 gränsen

2048 (2Kwords) gränsen.
diman
EF Sponsor
Inlägg: 192
Blev medlem: 14 februari 2007, 09:58:06
Ort: Löddeköpinge

Re: temp-station bygge

Inlägg av diman »

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 :vissla:

Du är vaken, du :)
diman
EF Sponsor
Inlägg: 192
Blev medlem: 14 februari 2007, 09:58:06
Ort: Löddeköpinge

Re: temp-station bygge

Inlägg av diman »

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:
Bild
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

Skriv svar