Resultat display

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Har provat ta bort, loop

D.v.s själva *labeln* "loop" ??
Det ända det gör är att eventuella "goto loop" eller "call loop" slutar att
fungera. Och du kommer ett få diverse felmeddelanden redan vid build...

> ...men den kommer aldrig till call kommandot.

Menar du kommandot/raden "call datain" ??
Och *hur* vet du att den inte kommer dit ?

Hur mycket kod är det nu ? Kanske du kan posta den ?
Jag tror att det är något helt annat än det som du misstänker...
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Har provat ta bort, loop och call och låtit koden rulla vidare, har då själv klart remat dom rader som call och goto.
Så inga felmeddelanden kommer upp vid build.


Här är koden.

Kod: Markera allt

 list      p=16f886             ; list directive to define processor
 #include <p16f886.inc>         ; processor specific variable definitions
; 
 __CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
 __CONFIG _CONFIG2, _WRT_OFF & _BOR21V
;
    errorlevel -302 
;
;**********************************************************************
    #define     DLR3416_A0      PORTA, 0
    #define     DLR3416_A1      PORTA, 1
    #define     DLR3416_A2      PORTA, 2
    #define     DLR3416_WR      PORTA, 3
    #define     DLR3416_DATA    PORTB
;**********************************************************************
RESET_VECTOR    CODE    0x000       ; processor reset vector
     goto    start               ; go to beginning of program
INT_VECTOR      CODE    0x004       ; interrupt vector location
        retfie                      ; Ingen interrupt kod...
;        
;**********************************************************************
MAIN	code
start
;
GIE01			
	banksel INTCON
        	clrf            INTCON
	btfsc	INTCON, GIE
	goto	GIE01
                banksel ANSEL               ; Stäng av alla analoga funktioner
                clrf    ANSEL
	clrf    ANSELH
	banksel TRISA               ; Alla pinnar utgångar 
        	clrf    TRISA
        banksel	TRISB	
	clrf    TRISB
	banksel PORTC
        	clrf	PORTC
	banksel	TRISC
	movlw	b'11000000'
	movwf	TRISC
	banksel intcon
	clrf intcon
	banksel pie1
	clrf pie1
	banksel	PIR1
	clrf	PIR1
	banksel	PIR2
	clrf	PIR2
        call        delay_1s
;**********************************************************************
	bsf		DLR3416_wr
	bsf		DLR3416_A2
	bsf		DLR3416_A1
	bsf		DLR3416_A0
	banksel pie2
	bcf	pie2,ccp2ie	;disable ccp2ie
;Sätt en Async Rx
	banksel	PIR1
	bsf	PIR1, TXIF
	banksel	TXSTA
	bcf	TXSTA, TX9	;Sätt 8 bits sändning		
	bsf	TXSTA, TXEN	;Sätt data sändning
	bcf	TXSTA, SYNC	;Async kommunikation
	bcf	TXSTA, BRGH	;Låg klock hastighet
	banksel	SPBRG
	movlw	d'25'		;Sätt Baudrate till 2400, SPBRG value=25
	movwf	SPBRG
	banksel RCSTA		
	bsf 	RCSTA, SPEN	;Starta serial port
	bcf	RCSTA, RX9	;Sätt 8 bits mottagning
	bsf	RCSTA, CREN	;Sätt konstant motaggning
	bcf	RCSTA, FERR	
	banksel	PIE1
	bsf	PIE1, TXIE
	bsf	PIE1, RCIE
	banksel	INTCON
	bsf	INTCON, PEIE
;
	movf	RCREG, w		
	movf	RCREG, w		
	movf	RCREG, w		
	movlw	0
	movwf	txreg		
;
	banksel INTCON
	bsf	INTCON, GIE	;Sätt GIE "Global Interrupt Enable".
;***********************************************************************	
	bcf     dlr3416_A0
loop
	bcf     dlr3416_A1 ;sätt lysdiod låg på ra1
	call	datain		
	call	transmitw
	bsf		DLR3416_wr ;sätt lysdiod hög på ra3
	bsf		DLR3416_A2 ;sätt lysdiod hög på ra2
	bsf		DLR3416_A1 ;sätt lysdiod hög på ra1
	bsf		DLR3416_A0 ;sätt lysdiod hög på ra0
	goto	loop
datain
	bcf     dlr3416_a2 ;sätt lysdiod låg ra2
	btfsc	RCSTA, OERR
	bcf	DLR3416_wr ;sätt lysdiod låg på ra2
	goto	overerror		;om 'overflow error'...
	btfsc	RCSTA, FERR
	goto	frameerror	;om 'framing error'...
uart_ready
	btfss	PIR1, RCIF		;Väntar på att tecken skall tas emot
	goto	datain		;om ej klar,vänta...
;
uart_gotit
	banksel INTCON
	bcf	INTCON, GIE	;Stäng av gie
	btfsc	INTCON, GIE
	goto 	uart_gotit	
;	
	movf	RCREG, w		;återställ data
	bsf	INTCON, GIE	;Sätt GIE "Global Interrupt Enable".
	movwf	txreg  ;skall vara rx_data, skickar direkt tillbaka till datorn.
	return
;
overerror
	banksel INTCON
	bcf	INTCON, GIE	;Stäng av gie
	btfsc	INTCON, GIE
	goto 	overerror	
	banksel RCSTA
	bcf	RCSTA, CREN	;Stäng av pulse cren
	movf	rcreg,w		;Rensa FIFO
	movf	rcreg,w		;är tre steg 
	movf	rcreg,w
	bsf	RCSTA, CREN	;Sätt cren och oerr blir låg.¨
;
	bsf	INTCON, GIE	;Sätt GIE "Global Interrupt Enable".
	goto	datain		;försök igen...
;
frameerror 				
	banksel INTCON
	bcf	INTCON, GIE	;Stäng av gie
	btfsc	INTCON, GIE	
	goto 	frameerror	
	movf	rcreg,w		
	bsf	intcon,gie	
	goto	datain		;Försök igen..
;
transmit
	movlw	a'1'	;copy rx_data to w. Skall vara TX_DATA 
transmitw
;				
	btfss	pir1,txif
	goto	transmitw	;wait for transmitter interrupt flag
gietx	bcf	intcon,gie	;disable interrupts
	btfsc	intcon,gie	;making SURE they are disabled!
	goto	gietx
	movwf	txreg		;load data to be sent... remad för att 
	bsf	intcon,gie	;re-enable interrupts
	return
;**********************************************************************
DLY_VAR      UDATA_SHR
d1           RES 1
d2           RES 1
d3           RES 1
;
DLY_CODE        CODE
;
delay_1s
 movlw 0x08
 movwf d1
 movlw 0x2F
 movwf d2
 movlw 0x03
 movwf d3
Delay_1s_0
 decfsz d1, f
 goto $+2
 decfsz d2, f
 goto $+2
 decfsz d3, f
 goto Delay_1s_0
 goto $+1
 nop
    return
;**********************************************************************
    end
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, jag har inte hunnit kolla allt, men en detalj i alla fall...

Du har kod som sätter och clerar olika xxIE (Interrupt Enable) flaggor.
Men samtidigt så har du ingen ISR (Interrupt Service Routine). Det ända
du har på interrupt-adressen är en RETFIE. Alltså är det helt onödigt (och
*kanske* fel, har inte hunnit fundera på det) att alls sätta xxiE flaggorna = "1".
Lär dom vara "0" hela tiden. xxIF flaggorna sätts i alla fall och du kan kolla
dom och cleara som precis som du gör nu.

Se till att TXIE, RXIE, PEIE och GIE är "0" från början och kommentera bort
alla kommandon som hanterar GIE senare i koden.

Jag säger inte att det läser problemet, det är också lite oklart om dina
tidigare beskrivningar av problemet fortfarande gäller i den senaste versionen
av koden.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Har hämtat delar från denna kod.
http://rodel.se/picuart.asm

Har provat att köra all kod från filen ovan, det var endel jobb med att få till blocken för data bankerna. Men koden stannade på samma ställe.
För att slippa onödig kod, så gick jag tillbaka till den koden som är i inlägg 34.

Rad 83 & 84 Txreg fungerar då det skickas en 0 till datorn, så sänd fungerar.

Kod: Markera allt

movlw	0
movwf	txreg
Skall titta på det du skrev nu.
[/code]
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Aha, Thomas McGahee's fantastiska USART manual ! :-)

Notera bara att den inte är anpassad för de nyare EUSART som sitter
i alla (de flesta) nyare PIC's i dag. Så man måste stämma av mot
databladet i alla fall. En finess med EUSART är att SPBRG även kan vara 16-bitar
för bättre upplösning och mindre fel mot den riktiga baudraten.

Nu ser det ut som om de nya finessernas defaultvärden är bakåtkompatibla
med de äldre USART/AUSART, men jag skulle sätta dom som jag vill ha dom
i alla fall.

> Rad 83 & 84...

???

> Txreg fungerar då det skickas en 0 till datorn, så sänd fungerar.

Inte en "1" ?
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Det fungerade med att sätta TXIE, RCIE, PEIE och GIE är "0" från början.

Notera bara att den inte är anpassad för de nyare EUSART som sitter
i alla (de flesta) nyare PIC's i dag. Så man måste stämma av mot
databladet i alla fall.

Det är också gjort, kollat mot databladet.


>> Rad 83 & 84...
>???
Rad 83 movlw 0
Rad 84 movwf txreg


>> Txreg fungerar då det skickas en 0 till datorn, så sänd fungerar.
>Inte en "1" ?
Jo om man ändrar movlw till 1, så får man en 1 eller 55 om man skriver det.

Skall kolla igenom koden nu och stämma av dom ändringarna som gjordes.

Nu har koden stannat på ett nytt ställe, så nu är det bara att söka vidare i koden.

Tackar så mycket för hjälpen, nu slipper man slita av allt hår (lite kvar).

EDIT:

Fel av mig att inte testa skicka ett tecken från datorn innan jag skrev inlägget.
Det fungerar ett tecken tas emot och skickas tillbaka till datorn 1 gång.
Sen händer inget mer, men det skall kollas nu.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Rad 83 movlw 0
> Rad 84 movwf txreg

OK, jahaja, där i början av koden. Jjag trodde att du menade :

> movlw a'1'

lite längre ner...

:-)
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Så nu är jag klar med koden för mottagning av data.

Fast det är en grej kvar, skall ta emot datat i 7 bits inte 8-bits.
Hur gör man då???????????

Kod: Markera allt

	list      p=16f886             ; list directive to define processor
 #include <p16f886.inc>         ; processor specific variable definitions
; 
 __CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
 __CONFIG _CONFIG2, _WRT_OFF & _BOR21V
;
    errorlevel -302 
;Se till att TXIE, RXIE, PEIE och GIE är "0" från början och kommentera bort 
;alla kommandon som hanterar GIE senare i koden. (tabort dom här två raderna sen)
;
;**********************************************************************
    #define     DLR3416_A0      PORTA, 0
    #define     DLR3416_A1      PORTA, 1
    #define     DLR3416_A2      PORTA, 2
    #define     DLR3416_WR      PORTA, 3
    #define     DLR3416_DATA    PORTB
;**********************************************************************
RESET_VECTOR    CODE    0x000       ; processor reset vector
     goto    start               ; go to beginning of program
INT_VECTOR      CODE    0x004       ; interrupt vector location
        retfie                      ; Ingen interrupt kod...
;        
RS232_VAR		UDATA_SHR       
RX_DATA     	RES 1           ; Mottaget data från RS232 port.
TX_DATA			RES 1           ; Data att skicka till RS232 port.
;**********************************************************************
MAIN	code
start
;
	banksel	PIE1
		bsf	PIE1, TXIE
		bsf	PIE1, RCIE
	banksel	INTCON
		bsf	INTCON, PEIE
GIE01			
	banksel INTCON
        clrf	INTCON
		btfsc	INTCON, GIE
		goto	GIE01
;	
	banksel ANSEL               ; Stäng av alla analoga funktioner
		clrf    ANSEL
		clrf    ANSELH
	banksel TRISA               ; Alla pinnar utgångar 
       	clrf    TRISA
    banksel	TRISB	
		clrf    TRISB
	banksel PORTC
       	clrf	PORTC
	banksel	TRISC
		movlw	b'11000000'
		movwf	TRISC
	banksel intcon
		clrf 	intcon
	banksel pie1
		clrf 	pie1
	banksel	PIR1
		clrf	PIR1
	banksel	PIR2
		clrf	PIR2
        call	delay_1s
;**********************************************************************
	banksel pie2
		bcf	pie2,ccp2ie	;disable ccp2ie
	banksel	PIR1
		bsf	PIR1, TXIF
	banksel	TXSTA
		bcf	TXSTA, TX9	;Sätt 8 bits sändning		
		bsf	TXSTA, TXEN	;Sätt data sändning
		bcf	TXSTA, SYNC	;Async kommunikation
		bcf	TXSTA, BRGH	;Låg klock hastighet
	banksel	SPBRG
		movlw	d'25'		;Sätt Baudrate till 2400, SPBRG value=25
		movwf	SPBRG
	banksel RCSTA		
		bsf 	RCSTA, SPEN	;Starta serial port
		bcf	RCSTA, RX9	;Sätt 8 bits mottagning
		bsf	RCSTA, CREN	;Sätt konstant motaggning
		bcf	RCSTA, FERR	
	banksel	PIE1
		bsf	PIE1, TXIE
		bsf	PIE1, RCIE
	banksel	INTCON
		bsf	INTCON, PEIE
;
		movf	RCREG, w		
		movf	RCREG, w		
		movf	RCREG, w		
		movlw	0
		movwf	txreg		
;
;
;***********************************************************************	
loop
		call	datain
		call	transmitw
		goto	loop
datain
		btfsc	RCSTA, OERR
		goto	overerror		;om 'overflow error'...
		btfsc	RCSTA, FERR
		goto	frameerror		;om 'framing error'...
uart_ready
		btfss	PIR1, RCIF		;Väntar på att tecken skall tas emot
		goto	datain			;om ej klar,vänta...
;
uart_gotit
		movf	RCREG, w		;Ta emot data från UART port.
		movwf	RX_DATA			;Sparar datat i RX_DATA.
		movf	RX_DATA,w		;Tar datat från RX_DATA och skickar till w
		movwf	TX_DATA			;Tar datat från w och skickar till TX_DATA
	return
;
overerror
		banksel RCSTA
		bcf		RCSTA, CREN	;Stäng av pulse cren
		movf	rcreg,w		;Rensa FIFO
		movf	rcreg,w		;är tre steg 
		movf	rcreg,w
		bsf		RCSTA, CREN	;Sätt cren och oerr blir låg.¨
		goto	datain		;försök igen...
;
frameerror 				
		movf	rcreg,w		;Att läsa av RCREG gör att FERR blir låg.
		goto	datain		;Försök igen..
;
transmit
		movf	tx_data,w	;Tar datat från TX_DATA och skickar till w. 
transmitw
;				
		movwf	txreg		;Ta datat från w och skicka till UART port
	return
;**********************************************************************
DLY_VAR		UDATA_SHR
d1			RES 1
d2			RES 1
d3			RES 1
;
DLY_CODE	CODE
;
delay_1s
		movlw 0x08
		movwf d1
		movlw 0x2F
		movwf d2
		movlw 0x03
		movwf d3
Delay_1s_0
		decfsz d1, f
		goto $+2
		decfsz d2, f
		goto $+2
		decfsz d3, f
		goto Delay_1s_0
		goto $+1
		nop
	return
;**********************************************************************
	end

Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Tråden handlar näst intill enbart om (problem med) PIC-programmering,
så jag flyttade tråden hit tills vidare.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Hade tänkt flytta över till projekt, men det går bra här då det handlar mest om PIC programmering.

EDIT:
Det är till en PIC16F886
Senast redigerad av Stewal 4 februari 2008, 22:43:22, redigerad totalt 1 gång.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Har sökt lite på nätet om att ändra usart från 8-bits till 7-bits,men inte hittat något.
Det jag hittade var att man kan använda RX9 till parity.
Följande skall användas för detta projekt, 2400B, 7bits, Parity Even
Någon som har koll på detta?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Hantera paritetsbiten som en 8'de bit och kolla den själv. Om du behöver
det alltså, annars kan du bara nolla den oavsett vad den råkar vara.
Paritet är en mjukvarugrej, inte något som hårdvaran tar hand om
(om man inte ser på *hela* PIC'en som "hårdvara" vill säga... :-) )
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Hantera paritetsbiten som en 8'de bit och kolla den själv.
Var inne på det om man inte kan lägga in den 8 data biten, eftersom man kan lägga in pariteten på den 9 biten enligt databladet. Eftersom jag inte har någon koll på hur man lägger in en extra databit, så behöves lite väg ledning om var man börjar. missänker att det är i samband med RCREG.

Om du behöver "Paritet" alltså, annars kan du bara nolla den oavsett vad den råkar vara.
Om man börjar med att nolla den åttonde databiten, så kan man koppla en tidtagnings klockan och låta PICén skicka vidare data till PC´n. Då kan man analysera datat och se om pariten behöver vara satt.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Kan den här koden nedan vara något?
Nu måste en kabel lödas ihop för att kunna koppla in tidtagningsklockan och pc´n på samma RS232 port, för att sen kunna ta emot data och sen skicka till pc´n.

Kod: Markera allt

RS232_VAR	UDATA_SHR       
ADVALUE		RES 1	; Binärt tal att addera B'00000000'
DATA1		RES 1	; Mottaget tal ex. B'1111111'
RX_DATA     	RES 1        ; Summa av ADVALUE + DATA1 (01111111)
TX_DATA		RES 1        ; Data att skicka till RS232 port.
;**********************************************************************
movf	RCREG, w		;Ta emot data från UART port, spara i w.
movwf	DATA1		;Spara w, i DATA1
movlw	b'00000000'	;Värde att addera, spara i w.
movwf	ADVALUE		;Spara w, i ADVALUE
movf	ADVALUE, w	;Spara ADVALUE, i w
addwf	DATA1, w		;Addera w med DATA1, spara i w	
movwf	RX_DATA		;Spara w, i RX_DATA
movf	RX_DATA,w		;Tar datat från RX_DATA och skickar till w
movwf	TX_DATA		;Tar datat från w och skickar till TX_DATA

Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Så kabeln är färdig och fungerar och data tas emot från klockan och skickas vidare till pc´n.

Men den åttonde databiten kommer inte med utan, det är 7 bitars data som skickas från PIC´n till PC´n.
Skriv svar