| Forfatter | Melding |
|---|
ece4afe
Joined: 16 juni 2005 Innlegg: 16
| 22 april 2006 17:31 UART seriell kommunikasjon | | |
|
| hallo,
Pls råde meg hvordan man implementerer seriell kommunikasjon tru programvare programmering. il bruker en pic16f84a som ikke har en innebygd UART. Jeg vet teorien om seriell kommunikasjon, og jeg vil implementere det gjennom programvaren programmering. Vennligst lære meg å programmere den, eller hvis du har eksempelkode for meg å lese og forstå. Dette er min første gang å programmere seriell kommunikasjon. min plan er å sende ASCII tegn fra PIC til PC, som vil bli sett i HyperTerminal. Jeg ønsker å realisere og verdsette teorien om seriell kommunikasjon. Behage hjelpe meg på denne.
Tnx,
Chris |
|
| Tilbake til toppen | |
 |
hermin
Joined: 19 Apr 2005 Innlegg: 135 Hjalp: 9
| 22 april 2006 17:50 m_rs096.asm | | |
|
| | først velge hva programmeringsspråk du vil bruke, slik at datamaskinen og MCU ville formidle, kan du bruke enten C, Visual Basic og selv matlab. For MCU, kan du enten lage en inngang være en seriell inngang bare ved å lage et program som gjør at porten mottar serielle data |
|
| Tilbake til toppen | |
 |
BeeBop
Joined: 19 februar 2006 Innlegg: 161 Hjalp: 15
| 23 april 2006 3:46 hva er linjeskift i seriell kommunikasjon | | |
|
| Hei Chris, Jeg trodde jeg hadde noen av mine egne eksempler, men det har blitt lenge siden jeg gjorde noe med F84, men jeg finner noe som er pent kodet, og skal tjene deg godt. Jeg tror det kom fra: http://www.electronic-engineering.ch/microchip/index.html som er en nyttig side. (og du kan trenge noen andre header filer derfra) Allikevel, her er eksempel, jeg håper det fungerer for deg. Best wishes, Robert
PS, ja du må gå til sitt nettsted og få M_WAIT og m_bank filer, men skal du ha noen problemer, la meg vite, og jeg skal hjelpe deg så mye som jeg kan. hilsen
| Code: | ;************************************************* ************************** ; ; RS232 Communication Test for PIC 16XXX ; ====================================== ; ; Skrevet av Peter Luethi, 26.03.1999, Dietikon, Sveits ; Http://www.electronic-engineering.ch ; Sist oppdatert: 11.04.2004 ; ; V1.02: Fast kopier / lim inn nummeret av ISR sammenheng lagre / gjenoppretting ; (Ingen er perfekte): feilaktig slettet INTCON, INTF ; Clearing, som resulterer i endeløs ISR ringer ... ; Re-strukturerte hele ISR og RS232 ekko sub-rutiner ; (11.04.2004) ; V1.01: ISR sammenheng gjenopprette forbedringer (30.12.2000) ; V1.00: Første utgave (26.3.1999) ; ; Denne koden og tilhørende filer kan distribueres fritt og ; Endret, forutsatt at denne overskriften med mitt navn og denne kunngjøringen fortsatt ; Intakt. Eierrettigheter fortsatt med meg. ; Du kan ikke selge denne programvaren uten godkjenning min. ; ; Denne programvaren leveres med ingen garanti eller garanti fra meg ; Gode intensjoner. Ved å bruke denne koden du godtar å beskytte meg fra ; Ethvert ansvar som måtte oppstå fra bruken. ; ; ; SPESIFIKASJONER: ; =============== ; Prosessor: Microchip PIC 16F84 ; Clock Frequency: 4.00 MHz XT ; Throughput: 1 MIPS ; Baud Rate: 9600 baud, 8 bit, ingen paritet, 1 stopbit ; Kode Størrelse på hele programmet: ca. 570 instruksjon ord ; Nødvendig maskinvare: 232 MAX, dot matrix LCD-skjerm ; ; ; BESKRIVELSE: ; ============ ; Utviklet og testet på 16F84 PIC, executeable på alle avbryte ; Kjennetegnet pics. ; Programmet håndterer alle aspekter av ; Transmission (Registrer TXD) og ; Reception (Registrer RXD) gjennom avbrudd. ; Visning av mottatt ASCII tegn sendt fra RS232 vert og ; Deres desimal representasjon på punktmatrise LCD-display. ; The microcontroller sender tilbakemeldinger på mottatte tegn til ; Terminalvinduet. ; ;************************************************* **************************
;***** COMPILATION MELDINGER & ADVARSLER *****
ERRORLEVEL -207; funnet etiketten etter kolonne 1 ERRORLEVEL -302 registrere i Operand ikke i banken 0
;***** PROCESSOR ERKLÆRING & KONFIGURASJON *****
PROCESSOR 16F84 # include "p16f84.inc"
; Embed Configuration Data innenfor. ASM File __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;***** MEMORY STRUKTUR *****
ORG 0x00; prosessor tilbakestille vektor goto MAIN; hovedprogrammet
ORG 0x04; interrupt vektor goto ISR; Interrupt Service Routine (ISR)
;***** PARAMETERIZATION *****
KONSTANT LCDWAIT = 0x02; LCD vente for initialisering KONSTANT LCDSPEED = 0x01; konfigureres i henhold til PIC klokke
;***** PORT ERKLÆRING *****
# define TXport PORTA, 0x00, RS232-utgang, kan # define TXtris Trisa, 0x00; noen aktiv push / pull-port
LCDtris EQU TRISB LCDport EQU PORTB
;***** KONSTANT ERKLÆRING *****
KONSTANT BASE = 0x0C; base-adressen til brukeren registrerer filen
;***** REGISTRER ERKLÆRING *****
TEMP1 satt BASE d'0 '; Universal midlertidig register TEMP2 satt BASE d'1 '; ATTENTION! TEMP3 satt BASE d'2 '; De brukes av ulike moduler. TEMP4 satt BASE d'3 '; Hvis du bruker dem, sørg for å ikke bruke TEMP5 satt BASE d'4 '; dem samtidig! Ingen bruk i ISR!
LO EQU BASE d'5 ' LO_TEMP EQU BASE d'6 '
FLAGreg EQU BASE d'7 ' # define RSflag FLAGreg, 0x00; RS232 data mottak flag # define LCDbusy FLAGreg, 0x01; LCD opptatt flag # define LCDcflag FLAGreg, 0x02; LCD kommando / data flag # define BCflag FLAGreg, 0x04, blank brikke for foregående nuller
TXD EQU BASE d'8 '; TX-Data register RXD EQU BASE d'9 '; RX-Data register
W_TEMP EQU BASE d'10 '; kontekst register (ISR) STATUS_TEMP EQU BASE d'11 '; kontekst register (ISR) PCLATH_TEMP EQU BASE d'12 '; kontekst register (ISR) FSR_TEMP EQU BASE d'13 '; kontekst register (ISR)
;***** Inkluderer filer *****
# include ".. \ .. \ m_bank.asm" # include ".. \ .. \ m_wait.asm" # include ".. \ .. \ m_lcd_bf.asm" # include ".. \ .. \ m_lcdv08.asm" # include ".. \ .. \ m_rs096.asm", standard RS232 overføringshastighet
;***** MACroS *****
;***** SUB-ETTERSYN *****
RSservice LCD_DDAdr 0x45 movfw RXD; bli mottatt RS232 data LCDw; sende til LCD-skjerm LCD_DDAdr 0x4D movfw RXD movwf LO LCDval_08; display desimalverdi
SEND TAB SEND 'r' SEND 'e' SEND 'c' SEND 'e' SEND 'i' SEND 'v' SEND 'e' SEND 'd' SEND ''
movfw RXD; bli mottatt RS232 data SENDw; overføre over RS232
SEND '' SEND 'o' SEND 'n' SEND '' SEND 'M' SEND 'i' SEND 'c' SEND 'r' SEND 'o' SEND 'c' SEND 'h' SEND 'i' SEND "p" SEND '' SEND "P" SEND 'jeg' SEND 'C' SEND '1 ' SEND '6 ' SEND "F" SEND '8 ' SEND '4 ' SEND CR; Vognretur SEND LF; Line Feed
; Slutten av RS232-tjenesten (ekko & display) BCF RSflag; restarte RS232 data mottak flag bSF INTCON, INTE; aktivere RB0/INT avbryte RETURN
;***** Avbryte SERVICE rutine *****
ISR ;************************ ; *** ISR CONTEXT SPAR *** ;************************
BCF INTCON, GIE; deaktivere alle avbrudd btfsc INTCON, GIE; forsikrer avbrudd er deaktivert goto ISR movwf W_TEMP; sammenheng spare: W swapf STATUS, W; kontekst spare: STATUS movwf STATUS_TEMP; sammenheng lagre clrf STATUS; banken 0, uavhengig av nåværende bank movfw PCLATH; sammenheng spare: PCLATH movwf PCLATH_TEMP; sammenheng lagre clrf PCLATH; siden null, uavhengig av gjeldende side BCF STATUS, IRP; tilbake til banken 0 movfw FSR; sammenheng spare: FSR movwf FSR_TEMP; sammenheng lagre ; *** Sammenheng lagre gjort ***
;************************** ; *** ISR MAIN EXECUTION *** ;**************************
; *** Fastslå opphavet til avbruddet *** btfsc INTCON, INTF; sjekk for RB0/INT avbryte goto _ISR_RS232; hvis angitt, var det et tastatur hjerneslag
; Catch-all goto ISRend; uventet IRQ, si utføring av ISR
;****************************** ; *** RS232 DATA ACQUISITION *** ;****************************** _ISR_RS232 ; Først deaktivere avbryte kilde BCF INTCON, INTE; deaktivere RB0/INT avbryte ; Andre, skaffe RS232 data MOTTA; makro av RS232 programvare timer bSF RSflag; aktivere RS232 data mottak flag goto _ISR_RS232end; avslutte RS232 ISR riktig
;*********************************** ; *** Clearing av Interrupt FLAGS *** ;*********************************** ; MERK: Nedenfor jeg bare klare avbruddet flaggene! Dette er ikke ; Nødvendigvis bety at den avbryter allerede reaktiveres. ; Utgangspunktet interrupt re-aktivering blir utført på slutten av ; Tilsvarende tjeneste rutine i normal drift modus. ; Flagget ansvarlig for den aktuelle ISR samtalen må være ryddet ; Å hindre rekursive ISR samtaler. Andre avbryte flagg, aktiveres ; Under utførelse av denne ISR, vil umiddelbart bli servert ved ; Oppsigelse av gjeldende ISR løpe. _ISR_RS232error bSF INTCON, INTE; etter feil, aktiverer IRQ allerede her _ISR_RS232end BCF INTCON, INTF; klart RB0/INT avbryte flag ; goto ISRend; avslutte utførelse av ISR
;***************************************** ; *** ISR OPPSIGELSE (CONTEXT RESTORE) *** ;*****************************************
ISRend movfw FSR_TEMP; sammenheng restaurere movwf FSR; sammenheng restaurere movfw PCLATH_TEMP; sammenheng restaurere movwf PCLATH; sammenheng restaurere swapf STATUS_TEMP, W; sammenheng restaurere movwf STATUS; sammenheng restaurere swapf W_TEMP, F; sammenheng restaurere swapf W_TEMP, W; sammenheng restaurere RETFIE; aktivere global interrupt (INTCON, GIE)
;***** END OF avbryte TJENESTEN rutine *****
;************** MAIN **************
MAIN LCDinit; LCD Initialisering RS232init; RS232 Initialisering clrf FLAGreg; initialisere alle flagg
; *** Oppstartsmeldingen av LCD *** LCDchar 'R' LCDchar 'S' LCDchar '2 ' LCDchar '3 ' LCDchar '2 ' LCDchar '' LCDchar 'C' LCDchar 'o' LCDchar 'm' LCDchar 'm' LCDchar 'u' LCDchar 'n' LCDchar 'i' LCDchar 'c' LCDchar 'a' LCDchar '-'
LCDline 2
LCDchar 't' LCDchar 'i' LCDchar 'o' LCDchar 'n' LCDchar '' LCDchar 'o' LCDchar 'n' LCDchar '' LCDchar 'P' LCDchar 'jeg' LCDchar 'C' LCDchar '1 ' LCDchar '6 ' LCDchar 'F' LCDchar '8 ' LCDchar '4 '
; *** Oppstartsmeldingen til RS232 *** , Dette gjøres ved å lese en look-up table ; Definere mengden tabellen elementer for oppstart melding # define tab_size4 d'48 ' movlw tab_size4; store beløp på bordet elementer i skranke movwf TEMP5 ; Sende melding _ILOOP1 Movlw HIGH WelcomeTable; få riktig side for PCLATH movwf PCLATH; forberede høyre side bit for table lese movfw TEMP5; får faktisk telle ned verdien sublw tab_size4; tabellen offset: w = tab_size4 - TEMP6 Ring WelcomeTable; samtale søketabellen SENDw; RS232 utgang decfsz TEMP5, f; Decrement counter goto _ILOOP1
0x1a WAITX, b'00000111 '; vent litt tid
; Litt animasjon ... SEND 'a' SEND 'n' SEND 'i' SEND 'm' SEND 'a' SEND 't' SEND 'i' SEND 'n' SEND 'g' SEND '' SEND 'L' SEND 'C' SEND 'D' SEND ". SEND ". SEND ". SEND CR; Vognretur SEND LF; Line Feed
movlw d'16 ' movwf TEMP5 _SHL1 LCDcmd LCDSL; skift venstre LCD display innhold WAIT 0xC0 decfsz TEMP5, f goto _SHL1
, Og endelig restarte / clear LCD LCDcmd LCDCLR
LCDchar 'R' LCDchar 'S' LCDchar '2 ' LCDchar '3 ' LCDchar '2 ' LCDchar '' LCDchar 'R' LCDchar 'e' LCDchar 'c' LCDchar 'e' LCDchar 'p' LCDchar 't' LCDchar 'i' LCDchar 'o' LCDchar 'n' LCDchar ':'
LCDline 2
LCDchar 'C' LCDchar 'h' LCDchar 'a' LCDchar 'r' LCD_DDAdr 0x47 LCDchar 'V' LCDchar 'a' LCDchar 'l' LCDchar 'u' LCDchar 'e'
SEND 'r' SEND 'e' SEND 'a' SEND 'd' SEND "y" SEND ". SEND ". SEND ". SEND CR; Vognretur SEND LF; Line Feed
;****************************** LOOP btfsc RSflag; finne RS232 data mottak flag Ring RSservice; hvis angitt, kaller RS232 ekko & LCD display rutine goto LOOP ;******************************
; ORG 0x230, om nødvendig, flytte look-up bord
WelcomeTable addwf PCL, F; legge utlignet til bords base pekeren retlw CR retlw LF DT «Microchip PIC16F84 tilkoblet og stand-by ..." , Opprette tabell retlw CR WTableEND retlw LF IF (HIGH (WelcomeTable)! = HØY (WTableEND)) ERROR "WelcomeTable treff siden grensen!" Endif
END
|
|
|
| Tilbake til toppen | |
 |
ece4afe
Joined: 16 juni 2005 Innlegg: 16
| 24 april 2006 9:34 UART teori | | |
|
| hallo,
mitt mål er å ha en seriell kommunikasjon, som er en ren programvare, ingen UART siden f84 har ingen innebygd UART, og ingen interrupt også. Så derfor vil programmet se slik måte,
la oss si at hvis jeg vil sende kapital C som er 43hex, til PC, vil jeg sende første start bit som er en logikk null, forsinkelse (9600kbps ---> om 104us) og dataene som er bokstaven C (01000011 i binær), hvor i, MSB først, deretter forsinkelse igjen, så neste bit, forsinkelse ............... før jeg ankommer Siste eller høyttaler, forsinkelse så stopp bit, noe som er en logikk én.
Jeg bruker C i programmering.
Kan du gi meg atleast et hint om hvordan du skal angripe dette problemet
Hilsen,
Chris |
|
| Tilbake til toppen | |
 |
hermin
Joined: 19 Apr 2005 Innlegg: 135 Hjalp: 9
| 24 april 2006 13:30 kommuniserer via UART i c | | |
|
| | Jeg tror det beste du kan bruke vil være en konstant bithastighet, seriell kommunikasjon. og jeg anbefaler også å bruke et null-tegn i stedet for en start eller stopp litt, |
|
| Tilbake til toppen | |
 |
Google AdSense

| 24 april 2006 13:30 Annonser | | |
|
|
|
|
| Tilbake til toppen | |
 |
BeeBop
Joined: 19 februar 2006 Innlegg: 161 Hjalp: 15
| 24 april 2006 15:44 hvordan programvaren leser seriell kommunikasjon | | |
|
| Chris, Hvis du så på forsamlingen jeg ga deg, det er for en 16F84, som jeg skjønner har ingen maskinvare UART. Og hvis du ser på dataarket for PIC finner du på side 3 at den har: | Quote: | Fire avbryte kilder: - Eksterne RB0/INT pin - TMR0 timer overflow - PORTB <7:4> avbruddet på endring - Data EEPROM skrive ferdig | Du gjorde ikke si hvordan du programmerer den, men du sa du ville | Quote: | | å forstå og sette pris på teorien om seriell kommunikasjon | som ledet meg til å tro at du ville ha noe i forsamlingen. Mens C er nærmere maskinvaren enn de fleste høye språk, er det fortsatt et høyt nivå språk, og du vil ikke få så mye ut av det som du ville gjort montering. Når det er sagt, som C-kompilator bruker du? De har sine egne måter å produsere hex-kode, og noen enda inkludere enkelte biblioteker. I mange kompilatorer, for å få riktig timing, må du inline assembly, iallfall for forsinkelsene, for at dette skal fungere godt. Hvis jeg husker også, sender du LSB først, ikke MSB. I utgangspunktet sløyfe deg gjennom byte du vil sende. Din linjen er høy i inaktiv, fjerner du den til å sende en start litt, og deretter ringe forsinkelsen. Les den første bit av dataene du ønsker å sende. Hvis det er en, og angi deretter pin og ringe forsinkelsen. (Her er blir vanskelig med C - hvor mange ganger tar det å komme inn i Dely med kompilatoren?) Så du flytter din biter til høyre, og se neste bit. Hvis bit er høy, sett pin. Hvis bit er lav, fjerne pin. Så ringe forsinkelsen igjen. Gjør dette før du har skiftet din byte ut, og når du er ferdig, sende stoppbit. Jeg vil anbefale å sende bare ett tegn før du har det fungerer. Hvis du bare sende fra PIC, mottar ikke, bør du kunne gjøre det uten avbrudd, med mindre du velger å bruke dem for timing. Igjen, som kompilator bruker du? Hilsen, Robert
PS her er en tutorial på programvare Serial Comms: http://www.sparkfun.com/commerce/present.php?p=The% 20Serial% 20Biggie% 20Page1 |
|
| Tilbake til toppen | |
 |