een ding snap ik nog goed
de interupt routine van de uart
hoe moet ik deze schrijven in asm ?
een ding snap ik nog goed
de interupt routine van de uart
hoe moet ik deze schrijven in asm ?
je zet de bits van de intterupts goed in de desbetreffende registers, asl er een interupt wordt gegenereerd trapt de software de pic direct naar Org 004h(das de interupt vector), daar zet jij een GOTO commando naar je interuptroutine(ik ga er van uit dat je met je normale programma op 005h begint),
aan het einde van je interuptroutine zet je RETFIE(RETurn From Interupt en de E weet ik niet) en hij gaat weer verder met zijn programma
oke bedankt voor de uitleg
in de interupt
gewoon waar hij met bezig is weg zetten in een file
dan de file legen van de ontvangst weg zetten in file ,
terug alles laden waar hij mee bezig was
en terug weg programma gaan overlopen
ik denk dat ik je snap maar zal het nog een keer zeggen hoe ik het interperteer:
je gaat naar de interrupt terwijl er iets(wat dan ook) in Work-register staat je slaat dit op in File1.
dan het Receive-File-register van je usart uitlezen en opslaan in het receive-File1
de RETFIE commando uit laten voeren
en weer File1 uitlezen zodat je verder kan gaan
met die 1 er achter bedoel ik dus door jou aangemaakte F-registers
begrijp ik je zo goed?
dan si mijn antwoord ja zo zou ik het doen
ik denkdat ik het helemaal snap wat je bedoelt
Ik ga een nieuw stuk ontvangst schrijven
want dit vind ik persies wat te omslagtich
de vorige geposte code
daarom de vraag hoe je juist werkt
bedankt timmie
graag gedaan
snap nog wel sommige dingen niet van de code voor wat dat ze staan
maar dat is voor later nu eerst de uart
zo men eerste dtik progje als iemand dit eens even wil na kijken
code:
__CONFIG _CP_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC & _LVP_OFF
list P=16F628A
#INCLUDE <P16F628a.INC>
#DEFINE OUT1 PORTA,1 ;RA0 pin17
#DEFINE OUT2 PORTA,2 ;RA1 pin18
#DEFINE OUT3 PORTA,3 ;RA2 pin1
#DEFINE OUT4 PORTA,4 ;RA3 pin2
;de geheugen plaatsen
Reg1 EQU 021h
Reg2 EQU 022h
Reg3 EQU 023h
Reg4 EQU 024h
INT1 EQU 25H
INT2 EQU 26H
ORG 00h
GOTO INIT ;Initialize PIC
ORG 04h ;START VAN DE INTERUPT
GOTO INTERUPT
INIT
movlw 0x07
movwf CMCON ;zet alles digitaal
CLRF PORTA ;maak porta laag
CLRF PORTB ;maak portb laag
BSF STATUS,RP0 ;Select Bank1
MOVLW B'00000000' ;maak van poort A uitgangen
MOVWF TRISA
MOVLW b'00000010' ;maak van poort B uitgangen met uitzondering de uart ingang pin 7
MOVWF TRISB
MOVLW 04h ;de waarde is 4 voor het instellen van de snelheid van de uart
MOVWF SPBRG ;snelheid instellen 250 Kbaut weg zetten van info
BSF TXSTA,BRGH ;high speed
BCF TXSTA,SYNC ;Async connection
CLRF PIE1 ;clear other interrupts
BSF PIE1,RCIE ;Set recieve interrupt (zet de ontvang interupt aan)
BCF STATUS,RP0 ;ga terug naar bank 0
BSF RCSTA,RX9 ;set de 9bit data ontvanging
MOVF RCREG,W ;clear RCREG FIFO
MOVF RCREG,W
MOVF RCREG,W
BSF RCSTA,CREN ;Enable recieve
BSF RCSTA,SPEN ;Enable UART
BSF INTCON,PEIE ;Enable interrupts
BSF INTCON,GIE
CLRF Reg1 ;alles clearen
CLRF Reg2
CLRF Reg3
CLRF Reg4
CLRF D_ADDR ;set our dmx adress to 0
goto prog
INTERUPT
MOVWF INT1 ;zet wat er in w staat in de file
START
BTFSC PIR1,RCIF ; kijk of er een echte interupt is
GOTO INTERUPT ; zo niet terug naar interupt
START
BTFSS RCSTA,2 ;FRAMING ERROR
GOTO START
BTFSS RCSTA,0 ;kijk of er 9 bit is zo ja
MOVFW RCREG ; zet het rcreg in map
MOVWF REG1
RETFIE
PROG
BTFSS REG1 ; staat er een 1 in het bestand
GOTO PROG ; zo niet blijven kijken
BSF OUT1 ;ja zet dan out 1 hoog
GOTO prog
END
de fouten komen op BTFSS BTFSC daar geeft mplab fouten op
ja dat klopt BTFSS staat voor Bit Test File Skip if Set en je geeft een compleet register op ipv 1 bit uit dat file dus het moet zo
geld dus ook voor BTFSC dat staat dus voor Bit Test File Skip if Cleared
code:
btfss reg,1
zet volgende error file hier ook ff neer of in ieder code die juist is geschreven dus geen commando's in de eerste kolom
[Bericht gewijzigd door timmie op 21 juli 2007 17:07:03 (12%)
is dit een zinige code zou dit dmx kunnen ontvangen ?
Error[113] C:\PIC\TEST DMX.ASM 70 : Symbol not previously defined (prog)
Error[113] C:\PIC\TEST DMX.ASM 68 : Symbol not previously defined (D_ADDR)
Error[116] C:\PIC\TEST DMX.ASM 77 : Address label duplicated or different in second pass (START)
Error[113] C:\PIC\TEST DMX.ASM 82 : Symbol not previously defined (REG1
Error[113] C:\PIC\TEST DMX.ASM 90 : Symbol not previously defined (prog)
dat zijn de fouten
de fouten zijn eruit heb net de fouten allemaal opgelost
maar dan blijft de vraag of ik daar mee al een test kan doen voor dmx te ontvangen of is dit nog niet oke ?
[Bericht gewijzigd door nonkel_dw op 21 juli 2007 19:13:32 (15%)
test het gewoon das de beste manier
ik heb het net getest het doet niets
hebben jullie nog sugesties ?
ik probeer je code te begrijpen.
code:
INTERUPT
MOVWF INT1 ;zet wat er in w staat in de file
vlak voor RETFIE zet je INT1 niet terug in W ;had dat niet gemoeten.
code:
START
BTFSC PIR1,RCIF ; kijk of er een echte interupt is
GOTO INTERUPT ; zo niet terug naar interupt
dit begrijp ik niet. je bent op deze plaats in de code omdat er een interrupt is en dan toch weer check of er echt wel een interrupt is.
code:
START
BTFSS RCSTA,2 ;FRAMING ERROR
RCSTA ken ik nog niet. heb nu geen tijd datascheet te bekijken.
code:
GOTO START
BTFSS RCSTA,0 ;kijk of er 9 bit is zo ja
het lijkt me dat je hier het eerste bit bekijkt. maar HET 9e bit bekijken?? dat doe je toch met het carrie bit.
code:
MOVFW RCREG ; zet het rcreg in map
MOVWF REG1
RETFIE
misschien heb je hier nix aan. dit is voor mij ook een test of ik dergelijke code begrijp.
punt 1. heb ik geen antwoord op
punt 2. je kijkt of het wel om de door jou bedoelde interrupt gaat
punt 3. dat is een bit ter controle van een frame error(je byte en start stop bits bij elkaar is een frame gaat daarbj iets fout zie je het hieraan)
punt 4. dat komt omdat er bij dmx 2 stopbits worden verzonden dus 1 parity bit en een stopbit
hopelijk kan je zo weer een beetje verder
ik ben niet mee
kan je geen voorbeeld code schrijven
wat er zou moeten in staan
voor interupt routine
dat is nu net het probleem ik zit ff zonder ideeën ik zal strx nog ff in de DS duiken voor je als ik heb gegeten
oke bedankt
is mss niet handig voor verder te zoeken via msn?
dat is goed ik heb het niet voor nix in men profiel staan;)
iemand nog ide voor de zien of hij daat werkelijk een interupt genereerd
ja een icd gebruiken
ja een led aanzetten zodra er een(maakt niet uit welke) interrupt wordt gegenereerd
mij dmx signaal komt van de velleman kit usb to dmx
heeft er iemand nog iets meer gevonden voor dmx ontvangen te krijgen ?
Ik ben even ten einde raad
NOG MEER?
Kijk eens hier, een compleet stuk code, vrij recht-toe-recht-aan, die op een kleinigheidje na (beschreven in topic) zou moeten werken.
En anders haal je wat van internet, genoeg kant-en-klare stukken code voor een PIC, waarin je in je diverse DMX-topics overigens ook al op gewezen bent.
ik heb dit stuk code geschreven voor ontvangen
maar wil niet lukken
het probleem volgens mij is dat de uart niet de juist byts intvangt met data
code:
list P=16F628A
#INCLUDE <P16F628a.INC>
__CONFIG _CP_ON & _PWRTE_OFF & _WDT_OFF & _HS_OSC & _LVP_OFF
#DEFINE OUT1 PORTA,0 ; PWM UITGANG
#DEFINE OUT2 PORTA,2 ; KIJKEN VOOR INTERUPT
#DEFINE OUT3 PORTB,3 ; KIJKEN VOOR RESETTEN VAN INTERUPT
#DEFINE OUT4 PORTB,4
;de geheugen plaatsen
Reg1 EQU 021h
Reg2 EQU 022h
Reg3 EQU 023h
Reg4 EQU 024h
INT1 EQU 25H
INT2 EQU 26H
ADRES EQU 27H
REGIS EQU 28H
ORG 00h
GOTO INIT ;Initialize PIC
ORG 04h ;START VAN DE INTERUPT
GOTO INTERUPT
INIT movlw 0x07
movwf CMCON ;zet alles digitaal
CLRF PORTA ;maak porta laag
CLRF PORTB ;maak portb laag
movlw B'00001100'
movwf CCP1CON
bsf T2CON, TMR2ON
movlw 03Fh
movwf PR2
BSF STATUS,RP0 ;Select Bank1
MOVLW B'00000000' ;maak van poort A uitgangen
MOVWF TRISA
MOVLW b'00000010' ;maak van poort B uitgangen met uitzondering de uart ingang pin 7
MOVWF TRISB
MOVLW 04h ;de waarde is 4 voor het instellen van de snelheid van de uart
MOVWF SPBRG ;snelheid instellen 250 Kbaut weg zetten van info
BSF TXSTA,BRGH ;high speed
BCF TXSTA,SYNC ;Async connection
CLRF PIE1 ;clear other interrupts
BSF PIE1,RCIE ;Set recieve interrupt (zet de ontvang interupt aan)
BCF STATUS,RP0 ;ga terug naar bank 0
BSF RCSTA,RX9 ;set de 9bit data ontvanging
MOVF RCREG,W ;clear RCREG FIFO
MOVF RCREG,W
MOVF RCREG,W
BSF RCSTA,CREN ;Enable recieve
BSF RCSTA,SPEN ;Enable UART
BSF INTCON,PEIE ;Enable interrupts
BSF INTCON,GIE
CLRF Reg1 ;alles clearen
CLRF Reg2
CLRF Reg3
CLRF Reg4
CLRF REGIS
MOVLW B'00000100'
MOVWF ADRES
INCFSZ ADRES,1
MOVFW ADRES
MOVWF REGIS
goto PROG
INTERUPT MOVWF INT1
BSF OUT2 ;zet wat er in w staat in de file
DECFSZ REGIS,1 ;ADRES MET 1 VERLAGEN
GOTO EINDE ;NIET 0 DAN STOPPEN
MOVF RCREG,W ; ZET RCREG REGISTER IN MAP
MOVWF Reg1 ; ZET ONTVANGEN DATA IN FILE REG1
GOTO EINDE ; STOPPEN
EINDE
BCF OUT2
MOVF INT1,0 ; TERUG WETTEN VAN DATA IN W
RETFIE ; EINDE INTERUPT
PROG
movf Reg1,0 ; ZET ALLES IN PWM
movwf CCPR1L
goto PROG
RESET
BSF OUT3
BCF RCSTA,FERR ; RESET FRAMMING EROR
MOVF ADRES,W ; RESET TERUG ALLES VOOR NIEUWE CYCLUS
MOVWF REGIS
BCF OUT3
GOTO PROG
END
Ik denk dat hij verkeerd synchronizeert
en dat hij zo de verkeerde 8 bit telkens binne haalt
ik leg het dmx signaal aan en de pwm let gaat aan
zonder dat ik iets stuur met de dmx tafel alle schuiven staan naar onder
Heeft iemand een idee?
of een fout in deze code gevonden?