Sida 5 av 26
Postat: 3 februari 2008, 23:48:38
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...
Postat: 4 februari 2008, 09:31:20
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
Postat: 4 februari 2008, 10:05:34
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.
Postat: 4 februari 2008, 11:30:25
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.
Skall titta på det du skrev nu.
[/code]
Postat: 4 februari 2008, 11:46:00
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" ?
Postat: 4 februari 2008, 12:11:50
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.
Postat: 4 februari 2008, 15:32:13
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...

Postat: 4 februari 2008, 15:46:24
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
Postat: 4 februari 2008, 21:15:35
av JimmyAndersson
Tråden handlar näst intill enbart om (problem med) PIC-programmering,
så jag flyttade tråden hit tills vidare.
Postat: 4 februari 2008, 22:15:24
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
Postat: 4 februari 2008, 22:31:01
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?
Postat: 5 februari 2008, 00:21:27
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...

)
Postat: 5 februari 2008, 09:12:57
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.
Postat: 5 februari 2008, 10:26:44
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
Postat: 5 februari 2008, 11:09:52
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.