UART & PIC12F1572 - Plocka in Manchester problem...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

UART & PIC12F1572 - Plocka in Manchester problem...

Inlägg av Erik M »

PIC12F683

Jag får inte riktigt detta att fungera.

Jag ska fånga en Manchesterkod med bitlängd om 100us.

Se nedan, inlägg nummer sex, för ändrad frågeställning...

Tanken är koden börjar leta efter startbiten, dvs GPIE set.
När sedan GPIF slår till och det även är så att /GP0 & T0IF, dvs signalen på porten är låg och timern slagit över, så inleds arbetet med att samla ihop bitarna till ett ord.

Här slås GPIE av och istället används T0IF, med T0IE set.
TMR0 sätts till att ha 75us kvar, dvs till ungefär mitten av nästa bit's höga mitt.

När T0IF slår till kollas om GP0 är hög, varvid denna bit sätts hög.
(Är GP0 låg är biten låg och sätts ej, dvs fortsätter vara låg.)

Därefter sätts TMR0 till att ha 100us kvar (från mitten av hög till nästa bit's höga tidsposition.
Och igen när T0IF slår till...

...tills alla åtta bitarna samlats och ordet är klart.

Här släpps TMR0 i sin långa ordinarie längd och byte igen till /T0IE & T0IE, i väntan på nästa ord.


Special File Register ser ut såhär :

Kod: Markera allt

; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /			
	BANKSEL	GPIO	; B0 - uuxx xxxx
	CLRF	GPIO	; port A initiated
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /			
	BANKSEL	OPTION_REG	; 1_1_1_1 1_111
	MOVLW	b'01011011'	; WPU & /T0CS & WDT & PS 1:8
	MOVWF	OPTION_REG	
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /			
	BANKSEL	OSCCON	; U_110 R_R_R_0
	MOVLW	b'01111001'	; 8MHz
	MOVWF	OSCCON	
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /			
;	8 MHz / 4 = 2MHz => 500ns & PS 1:8 => timer at 1024us & 4us per step		
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /			
	BANKSEL	TRISIO	; uu11 1111 / all ports input
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /			
	BANKSEL	ANSEL	; U_000 1_1_1_1 / all ports analogue
	MOVLW	b'00000000'	; All ports digital
	MOVWF	ANSEL	
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /			
	BANKSEL	CMCON0	; U_R_U_0 0_000
	MOVLW	b'00000111'	; Comparator disabled
	MOVWF	CMCON0	
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /			
	BANKSEL	WPU	; UU_1_1 U_1_1_1 / all ports w/ weak pullups
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /			
	BANKSEL	IOC	; UU_0_0 u_0_0_0 - None interupt on change
	MOVLW	b'00000001'	; 00 0 0 0 0 0 1 - IOC @ GP0
	MOVWF	IOC	
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /			
	BANKSEL	GPIO	
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /			

Interupt Service Routine ser ut såhär:
(dock utan inledning och anslutning)

Kod: Markera allt

; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /		
At_Port_Interrupt		
	BTFSS	INTCON, GPIE
	GOTO	At_Port_Interrupt
; if port interrupt enabled else jump ahead		
	BTFSC	INTCON, T0IF
	BTFSC	INTCON, GPIF
	GOTO	Exit_Interrupt_Routine
; if T0IF & /GPIF else jump exit		
	MOVLW	0x7
	MOVWF	Bit
	MOVLW	d'237'
	MOVWF	TMR0
	CLRF	Word
; restart bit count, clear word & restart timer at 75us left		
	BCF	INTCON, GPIE
	BSF	INTCON, T0IE
; disable port interrupt & enable timer interrupt		
	GOTO	Exit_Interrupt_Routine
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /		
At_Timer_Interrupt		
	BTFSS	INTCON, T0IE
	GOTO	Exit_Interrupt_Routine
; if timer interrupt enabled else jump exit		
	DECF	Bit, W
	BTFSC	GPIF, 0x1
	BSF	Word, W
; set present bit if port is high		
	DECFSZ	Bit
	GOTO	Get_Next_Bit
; handle word if last bit else find next bit		
		
; /// handle the word when finished routine ///		
		
	BCF	INTCON, T0IE
	BSF	INTCON, GPIE
; disable timer interrupt & enable port interrupt		
	GOTO	Exit_Interrupt_Routine
		
Get_Next_Bit		
	MOVLW	d'231'
	MOVWF	TMR0
; restart timer at 100us left		
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /		
Exit_Interrupt_Routine		
	BCF	INTCON, T0IF
	BCF	INTCON, GPIF
; - - - - - - - - - - - - - - - - - / - - - - - - - - - - - - - - - - - /		
[/s]
Senast redigerad av Erik M 27 februari 2016, 12:44:58, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Plocka in Manchester problem...

Inlägg av Icecap »

Varför inte använda UART'en?
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: Plocka in Manchester problem...

Inlägg av Erik M »

Det funkar det med, om det gör det.
Men först om detta fungerar, eller då snarare varför inte...

Och oavsett det har väl inte denna PIC någon UART...?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Plocka in Manchester problem...

Inlägg av Icecap »

OK, det är sant, ingen UART.

Jag hade vald en annan lösning: Capture.

Jag har gjort liknande i sin tid och det går att t.ex. sätta den till att Capture på en start-flank och under den interrupt-behandling byta flank så att man får interrupt på den motsatta flanken.

På det vis får du ett antal beskrivningar av hur breda pulserna är och behöver inte att hämta bit för bit.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: Plocka in Manchester problem...

Inlägg av Erik M »

När jag dubbelkollade om UART gjorde jag samma iakttagelse. :tumupp:

Det är en fördel att plocka bitarna en å en, i detta fallet.
Det finns byte om både åtta, nio och tolv bitar.
Och inom vardera grupperas olika ord, på olika sätt.

Ja, jag vet att det inte är vad koden ovan tar hand om, men frågan är inte det.
Frågan är hur jag fångar de åtta första bitarna.
(Koden hoppar sedan över eventuellt resterande bitar, så det är lugnt.)
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: UART & PIC12F1572 - Plocka in Manchester problem...

Inlägg av Erik M »

Jag byter till att använda både PIC12F1572 & UART.

Jag ska fånga en Manchesterkod som sänder ord om åtta, nio eller tolv bitar.

Av dessa ord använder jag endast de på nio bitar, och då inte den nionde biten i sig.
Så UART-funktionen på denna PIC blir väldigt bra.
Dvs det ord som fångas skall ha den nionde biten, men inte ord som saknar den eller har fler.

Har jag förstått rätt så blir detta sant om den nionde biten fångas, dvs inget felmeddelande om att den fattas och inget felmeddelande om att direkt påföljande ord inte blir fullt.

Men hur ställer man in detta där:
- startbiten är ett
- bitarna är 100us långa
- ord påbörjas var 7.5ms

Jag tror det (delvis) ser ur såhär...

Nej, detta är som med allt annat när man gör det första gången.
Så om någon kunde hjälpa mig ställa in detta rätt vore jag väldigt glad och tacksam!
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: UART & PIC12F1572 - Plocka in Manchester problem...

Inlägg av Erik M »

OK, jag behöver inte hjälp med vad jag fångar, endast med vad som behöver ställas in på vilket vis.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: UART & PIC12F1572 - Plocka in Manchester problem...

Inlägg av Erik M »

sodjan skrev:Enklast är nog bara att "dyka i" och vifta med armarna om det blir problem... :-)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46963
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: UART & PIC12F1572 - Plocka in Manchester problem...

Inlägg av TomasL »

Om du konfigurerar uarten för 9-bitar data får du framing error om du inte får nionde biten.
Samma sker om du inte får stoppbitarna eller startbitarna, så om din givare eller vad det nu är inte skickar data med korrekt längd, erforderliga start och stoppbitar, så kommer det nog knappast att fungera.

Dvs, din givare måste sända en startbit, 8 eller 9 databitar (beroende på hur du konfigurerar UARTen) samt minst en stoppbit.

Om din givare eller vad det nu är uppfyller dessa krav, så är det ju bara att konfigurera UARTen med korrekt bithastighet, antal stoppbitar och om den skall ta emot en nionde bit.

Därefter är det bara att läsa av RXreg och RX-9 eller vad den nu kan kallas hos din PIC, dock är det så att alla PICar inte har kapabiliteten för 9 bitars kommunikation.

Vanligtvis använder man den nionde biten som adressbit eller som paritetsbit.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: UART & PIC12F1572 - Plocka in Manchester problem...

Inlägg av Magnus_K »

Kan det här hjälpa? -> Microchip TB045
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46963
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: UART & PIC12F1572 - Plocka in Manchester problem...

Inlägg av TomasL »

Men med tanke på att Manchester kodar med tillståndsändringar, tror jag inte du kan få det att fungera med UART.
Lite sökning på nätet bekräftar i princip detta. Du är, utgår jag i från att 8 bitar data blir 16 bitar i manchester,
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: UART & PIC12F1572 - Plocka in Manchester problem...

Inlägg av Erik M »

Tack Magnus. :tumupp:
Iofs inte UART men väl en del matnyttigt i linje med där jag oxå är.
Skriv svar