Experiment med 1-wire och Pic-processorer

Berätta om dina pågående projekt.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Experiment med 1-wire och Pic-processorer

Inlägg av PHermansson »

Dags så för ett nytt litet projekt. Tanken är att koppla Pic-processorer till ett 1-wire-nät, bland annat för att styra RGB-lysdioder. Projektet blir i experimentform, där det utvecklas efterhand.
Det första steget är nu klart. En 16F628 kombineras med en DS2406 och en RGB-diod, 1-wirenätet ska kunna användas för att ändra färg på dioden. I dagsläget finns en enkel kod där det enbart växlas mellan de tre grundfärgerna, detta är tänkt att utvecklas med fler färger.
Schema:

Bild

Detta skulle kunna förenklas genom att använda en mindre Pic som tex 12F629. Ytterligare en förenkling hårdvarumässigt vore att implementera 1-wire-slav-kod i processorn, något som ska vara möjligt med en AVR-processor. Det finns även utvecklingsmöjligheter för styrningen, eftersom en dator kontrollerar 1-wire nätet finns möjligheter som tex att låta diodens färg bero på utetemperaturen. En tänkt fortsättning är även att komplettera med tre mosfet så att större diodarrangemang kan styras (tex en RGB-list).

Kod för Mplab:

Kod: Markera allt

;---------------------------------------------------------------------------------------------

;       HEADER:

;---------------------------------------------------------------------------------------------

              LIST        P=16f628a

              RADIX       DEC 

              INCLUDE     "p16f628a.inc" 

;Program Configuration 

    __CONFIG   _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 

;---------------------------------------------------------------------------------------------

;       EQUATES:

;---------------------------------------------------------------------------------------------

#define    Clock_Freq  8000000

#include "wait.mac"



#define     REDLED        PortAShadow, 0

#define     BLUELED       PortAShadow, 1

#define     GREENLED      PortAShadow, 2

#define		redled		  PortAShadow, 4 



STARTOFRAM    equ           0x20              ;First Usable RAM Location for 16f628

ENDOFBANK0    equ           0x6F              ;Last Usable RAM Location for 16f628

FIXEDAREA     equ           0x70              ;Start of shared memory between banks

BANK1RAM      equ           0xA0              ;Start of Bank 1 RAM

ENDOFBANK1    equ           0xEF              ;End of Bank 1 RAM





              cblock STARTOFRAM



;

; Application specific variables

;



DutyRed                                       ;Duty cycle of Red LED

DutyGreen                                     ;  

DutyBlue

DutyCount                                     ;Counter that indicates which time unit of period we are on

RedDelta

GreenDelta

BlueDelta

PortAShadow

tempone

temptwo

cnt		;counter

pclval	;lookup table offset

            endc







            cblock FIXEDAREA

;

; ISR Register Save Areas

;



INT_FLAGS

W_TEMP

STATUS_TEMP

FSR_TEMP

PCLATH_TEMP



            endc

			

			



;---------------------------------------------------------------------------------------------

;       START:

;---------------------------------------------------------------------------------------------

        org         0x000

            goto        Start



;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

        org         0x004

; Interrupt handler right here

        movwf       W_TEMP              ;Save everything               

        swapf       STATUS, W

        movwf       STATUS_TEMP

        movfw       FSR

        movwf       FSR_TEMP

        movfw       PCLATH

        movwf       PCLATH_TEMP             

        bcf         STATUS, RP0         ;Back to Bank 0 to make sure otherwise we clobber OPTION reg when reloading TMR0



		;Timer2 interrupt?

        btfsc       PIR1, TMR2IF        ;Is it a TMR2 interrupt

        goto       	TMR2Int             ; Yes

            

		;RB0 change?

		BTFSC		INTCON, INTF

		goto 		intRB0



		;No legal interrupt, exit

		goto        IntExit



;-----------------------------------------------------------------------------

;

; ISR routines

;

;-----------------------------------------------------------------------------



intRB0

		bcf     	PIE1 & 0x07F, TMR2IE    ;  Turn off TMR2 ints

		bcf			INTCON, INTE			;disable RB0 interrupt

		bsf			redled					;Indicate RB0 int

											;cnt = 0001	1	4

		incf		cnt		;Increase counter	;      0010 2	0101	5	1000 8  1011	11

		incf		cnt		;Increase counter 	;	   0011	3	0110	6	1001 9  1100    12

		incf		cnt		;Increase counter	;	   0100 4 	0111	7	1010 10 1101    13



		movlw		b'00001010'

		xorwf		cnt, W					;Check counter value		

		btfss		STATUS, Z

		goto 		cont

		clrf 		cnt

		incf 		cnt

cont

		bcf			INTCON, INTF			;clear mismatch

		bsf			INTCON, INTE			;enable RB0 interrupt

		bsf     	PIE1 & 0x07F, TMR2IE    ;Turn on TMR2 ints

		goto    	IntExit



;------------------------------------------------------

; 

; Timer 2 used for PWM duty cycle

;

;   There are 256 time units in a full period.  Thus the duty cycle has 256 possible

;   settings from 0 to 100%.  Each time unit is 50uS long thus a full period is 12.8mS.  This gives

;   a refresh rate of about 80Hz (78.12)

;

TMR2Int

		incf        DutyCount, F        ; gives 256 levels of intensity

        movfw       DutyRed

        subwf       DutyCount, W

        btfsc       STATUS, C

        goto       _RedOff

_RedOn

        bsf         REDLED

        goto        _ckgreen

_RedOff

        bcf         REDLED

; fall thru ok

_ckgreen               

        movfw       DutyGreen

        subwf       DutyCount, W

        btfsc       STATUS, C

        goto       _GreenOff

_GreenOn

        bsf         GREENLED

        goto        _ckblue

_GreenOff

        bcf         GREENLED

; fall thru ok

_ckblue 

        movfw       DutyBlue

        subwf       DutyCount, W

        btfsc       STATUS, C

        goto       _BlueOff

_BlueOn

        bsf         BLUELED

        goto        _ckdone

_BlueOff

        bcf         BLUELED

_ckdone

        movfw       PortAShadow

        movwf       PORTA

        bcf         PIR1, TMR2IF        ; clear the interrupt flag



;  FALL THRU TO INTEXIT            goto        IntExit



IntExit

        movfw       PCLATH_TEMP

        movwf       PCLATH

        movfw       FSR_TEMP

        movwf       FSR

        swapf       STATUS_TEMP, W

        movwf       STATUS

        swapf       W_TEMP, F

        swapf       W_TEMP, W

        retfie



;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

;

;

;  Main level code begins here

;

;



Start         

		bsf       	STATUS, RP0         ;Switch to Bank 1

        movlw     	b'00100001'         ;Define I/O on Port B, RB0=in/int

        movwf     	TRISB & 0x7F

		bcf			OPTION_REG, NOT_RBPU 	;Activate soft pull-up

		bcf			OPTION_REG, INTEDG		;RB0/int interrupt on falling edge

		bsf			INTCON, INTE			;RB0/int interrupt enable

		movlw		b'00000000'

		movwf     	TRISA	            

        bcf       	STATUS, RP0         ;Back to Bank 0        

        clrf      	PORTA               	;Initialize PORTA              

        clrf      	PORTB               	;Initialize PORTB



		;Reset variables

        clrf      	DutyRed

        clrf      	DutyGreen

        clrf      	DutyBlue

        clrf      	DutyCount

        clrf      	PortAShadow              

		

		;Init timer2, used for PWM

        call      	TMR2Init



		bsf	 		INTCON, PEIE 	; Enable peripheral interrupts

		bsf	 		INTCON, GIE     ; Turn on GLOBAL Interrupts



; Start off with LED off and not doing anything



        movlw       d'0'              ; 

        movwf       RedDelta

        movlw       d'0'              ;

        movwf       GreenDelta

        movlw       d'0'              ;

        movwf       BlueDelta



        movlw       d'0'              ; con 5

        movwf       DutyRed

        movlw       d'0'              ; con 7

        movwf       DutyGreen

        movlw       d'0'              ; con 6

        movwf       DutyBlue



		clrf		cnt		;Reset counter

		incf		cnt		;and add 1





loop

		;Fetch color values that depends on counter

		;Each button press creates an interrupt which increases tre counter

		movf	cnt,w               ; Put counter to look up into w.

		movwf	pclval	

    	CALL 	Lookup                ; Call the table. 

    	MOVWF 	DutyRed

		;Next value

		incf	pclval

		movf	pclval,w               ; Put number to look up into w.

    	CALL 	Lookup                ; Call the table. 

    	MOVWF 	DutyGreen

		;Third value

		incf	pclval

		movf	pclval,w               ; Put number to look up into w.

    	CALL 	Lookup                ; Call the table. 

    	MOVWF 	DutyBlue

		;Loop

		 goto 	loop



;

;---------------------------------------------------------------------------------------------

;



TMR2Init

        

; Setup of TMR2 (Based on 8Mhz clock)

;   (8 Mhz clock)



; Fill in T2CON

        movlw   b'00000001'             ; TMR2 timer stopped, prescale /4, no post scale

;                 |||||||+-------------- T2CKPS0    

;                 ||||||+--------------- T2CKPS1

;                 |||||+---------------- TMR2ON

;                 ||||+----------------- TOUTPS0

;                 |||+------------------ TOUTPS1

;                 ||+------------------- TOUTPS2

;                 |+-------------------- TOUTPS3

;                 +--------------------- Unused

        movwf   T2CON

                

; Clear the interrupt flag        

        bcf     PIR1, TMR2IF



; Enable Peripheral interrupts

;        bsf     INTCON, PEIE



; Set Period and turn on the interrupts

        bsf     STATUS, RP0             ; Select BANK 1

        movlw   d'24'                  ; Set period to 12.5mS

        movwf   PR2 & 0x07F 

        bsf     PIE1 & 0x07F, TMR2IE    ;  Turn on TMR2 ints

        bcf     STATUS, RP0             ; Select BANK 0



; Enable the timer

        clrf    TMR2

        bsf     T2CON, TMR2ON           ; Start counting

        return



Lookup	ADDWF PCL                  ; Jump to entry spec'd by w.

            

        RETLW d'0'	;dummy

        RETLW d'255'

        RETLW d'000'               ; 4, 5, 6

        RETLW d'000'

        RETLW d'000'

        RETLW d'000'                 ; 7, 8, 9

        RETLW d'255'

 		RETLW d'0'                ; 0, 1, 2, 3

        RETLW d'255'

        RETLW d'0'

        



        end

Blev inte direkt snyggt när jag klistrade in koden, men men...
Användarvisningsbild
4kTRB
Inlägg: 20667
Blev medlem: 16 augusti 2009, 19:04:48

Re: Experiment med 1-wire och Pic-processorer

Inlägg av 4kTRB »

Går det att multiplexa 1-wire?
Användarvisningsbild
JimmyAndersson
Inlägg: 26571
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Experiment med 1-wire och Pic-processorer

Inlägg av JimmyAndersson »

Hur menar du?
T.ex Ansluta en 1wire-slav och sedan multiplexa till flera 1wire-masters?
Isåfall kan det blir problem när flera master-enheter vill prata med 1wire-slaven.
Allt går iofs att lösa, frågan är bara hur jobbigt det är. :)


PHermansson:
"Ytterligare en förenkling hårdvarumässigt vore att implementera 1-wire-slav-kod i processorn, något som ska vara möjligt med en AVR-processor."

Det går ju med PIC också. V-g's pannövervakning är ett exempel på det. :)
Användarvisningsbild
4kTRB
Inlägg: 20667
Blev medlem: 16 augusti 2009, 19:04:48

Re: Experiment med 1-wire och Pic-processorer

Inlägg av 4kTRB »

Ja och processorn pratar enbart när rätt wire är inkopplad.
Det blir väl trådprogrammering som kan lösa sånt.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Experiment med 1-wire och Pic-processorer

Inlägg av PHermansson »

Jimmy, du menar i den här tråden? http://elektronikforumet.com/forum/view ... f=3&t=3043
Läste inte hela nu, men där är väl Pic'en Master? Tanken här var att den ska vara en Slave.
Alltså en PC med en DS9490 som kontrollerar ett helt vanligt 1-wire nät. En av noderna utgörs dock av en MCU som simulerar en 1-wire slav, vilket ger en del intressanta möjligheter.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Experiment med 1-wire och Pic-processorer

Inlägg av PHermansson »

Koden har nu utökats till 5 färger och lite bättre kommentarer. Har dessutom skrivit ett litet Bash-script som via OWFS ser till att dioden byter färg varje sekund:

Kod: Markera allt

while [  1 ]; do
		echo 0 >  /mnt/owfs/12.DB7936000000/PIO.A;echo 1 >  /mnt/owfs/12.DB7936000000/PIO.A	
		sleep 1
done
Edit: Tog bort ett hjärnsläpp i koden.
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 15467
Blev medlem: 16 april 2006, 17:04:10

Re: Experiment med 1-wire och Pic-processorer

Inlägg av mrfrenzy »

Här är två exempel på 1-wire slaves under AVR. Den ena i Bascom och den andra i ASM fast med tjeckiska kommentarer....
http://bascom.at.ua/publ/1-1-0-1
http://www.alpov.net/elektronika/owslave.html

Det finns också en implementation i PIC men där fanns ingen källkod och jag hittar inte bokmärket just nu.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Experiment med 1-wire och Pic-processorer

Inlägg av PHermansson »

Det var ungefär det jag kom fram till när jag kollade på att använda MCU som slave. Google Translate gör ett hyfsat jobb med den tjeckiska sidan, även om det bitvis blir lite komiskt med befälhavare och grundstötning :)

http://translate.google.se/translate?js ... l=cs&tl=sv
Användarvisningsbild
JimmyAndersson
Inlägg: 26571
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Experiment med 1-wire och Pic-processorer

Inlägg av JimmyAndersson »

"Jimmy, du menar i den här tråden? http://elektronikforumet.com/forum/view ... f=3&t=3043 "

Inte riktigt. :wink:
Den här däremot: http://elektronikforumet.com/forum/view ... =3&t=30435

Lusläste lite nu och det verkar som v-g använde PIC-kretsen som master.
Jag reflekterade bara över att du först använder PIC och sedan skriver att man kan göra en 1wire-slav med AVR.
Det går ju lika bra att göra en 1wire-slav av PIC som AVR. Möjligen att det är lättare att hitta färdig kod för det till AVR, men det är ju en annan sak. :)
Allra lättast är nog ändå t.ex en DS2405, som du använder.


Hur som helst så är det ett intressant projekt.
Jag är själv ganska "såld" på 1wire, så det här kommer följas med stort intresse. :)


4kTRB:
Jag höll på att fylla ett badkar när jag skrev förra inlägget, så koncentrationen var inte på topp. :)
Håller man bara koll (i koden) så att inte flera 1wire-enheter pratar i munnen på varandra så är det inga problem.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Experiment med 1-wire och Pic-processorer

Inlägg av v-g »

Jimmy:Har PIC både som master och slave (det är två st PIC:ar) ;)

Slaven var 5x komplexiteten att få till :?
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Experiment med 1-wire och Pic-processorer

Inlägg av PHermansson »

Hoppsan, föll visst bort en siffra i min länk :)

Men ändå... frågan är ju hur v-g:s kod skulle fungera med en DS9490 som master? Tror att jag ska testa den tjeckiska koden, skulle det fungera med säg en tiny25 så kan man ju bygga riktigt billiga 1-wirenoder.

Annars funderar jag på vad man skulle kunna ha det här till. Med en 2405 kan man skicka ett antal pulser, som kan sätta MCU'n i olika mode's. Då kan man byta färg på en RGB-diod som ovan.

-Koppla ett analogt visarinstrument till processorn. Genom att reglera pulslängden på processorns utgång kan läget på visarnålen ändras.

-MCU'n kan styra ett servo.

-Använda en DS2406/2413. Då skulle en PIO kunna fungera som clock, den andra som data för att skicka data seriellt från dator till MCU.

-DS2408. 8 bitar parallellt kan överföras.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Experiment med 1-wire och Pic-processorer

Inlägg av v-g »

PHermansson:Det är svårt att säga, men det följer ju 1-wire protokollet iaf. Det som _kan_ hända med min är att den (av någon anledning) inte hinner med sig och missar en runda men då indikeras ju detta iom CRC checken. Tittar jag på överföringen med oscilloskop så ser den likadan ut som för en DS1820.

Det borde således fungera tycker jag.

Det knivigaste är att ALLTID i koden kunna detektera en resettpuls det är det som är det svåra. I min slav kör jag med ett interupt som startar en timer när så denna slår runt (utan att ha stängts av) så betyder det att en resettpuls har detekterats och koden sätter sig direkt i mottagningslägets initialskede.

Synd att koden ser ut som ett as annars kunde jag postat den. Det är faktist fortfarande ett pågående arbete som så mycket annat och som vanligt med många simultana projekt så ligger denna just nu på is, det sitter liksom fortfarande på labbdäcket :mrgreen:

Det väsentliga i koden är dock resetpulsdetekteringen som är beskrivet ovan, låter enkelt men var ett a-hål att komma på. Resterande med att kolla adress osv är enkelt det är bara att jämföra siffror och om det inte stämmer så vips tillbaka till vänteläge.

Användningen är ju ja kanske inte så stor det var mest en test och TROLIGEN kommer denna slav att falla bort och istället kommer mastern att hämta infon via RS485 men det ligger på framtiden och har inget med funktionaliteten att göra. Det kan faktist gå veckor utan att jag gör annat än kollar på datat (för att kolla pannan).
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Experiment med 1-wire och Pic-processorer

Inlägg av PHermansson »

Frågan är om det är värt det? Ska lura på om jag ska testa någon PIC/AVR-lösning senare.

Nu har jag i alla fall kopplat in en ytmonterad DS2406 med två PIO-pinnar. Den ena används som data, den andra som klocka. Genom att först sätta datapinnen och sedan skicka en puls på klockpinnen så kan jag latcha in data i Pic'en, blir som ett shiftregister. Poängen med detta? Låt datorn skicka säg åtta bitar på detta vis via 1-wirenätet och låt Pic'en visa resultatet. Det kan tex bli en analog termometer, eller så kan värdet styra läget på ett servo.
Skriv svar