[b]kommunicera PIC <-> PC[/b]
-
- Inlägg: 35
- Blev medlem: 2 februari 2005, 17:18:12
- Ort: Göteborg
[b]kommunicera PIC <-> PC[/b]
Att kommunicera mellan PCns portar och en PIC mm. Vill gärna lära mig hur man praktiskt går till väga,har pluggat en dvla massa teori men HUR man gör är det väldigt svårt att få reda på.Typiskt något alla kan men inte talar om.Vore snällt med liten beskrivning,kodsnuttar(C,C++,eller JAVA,litteraturförslag,hemsidor mm.
Visa gärna en enkel beskrivning på att tända och släcka en lysdiod på datorns portar
Tack på förhand[/b]
Visa gärna en enkel beskrivning på att tända och släcka en lysdiod på datorns portar
Tack på förhand[/b]
Saxat från mitt program:
movlw d'5' ; Set comm. data to 9K6 baud
btfss PORTC,4 ; Test if High comm. speed is used
movlw d'23' ; Set comm. data to 2K4 baud
SetBank 1
movwf SPBRG ; 2K4/9K6 Baud @ X-tal 3.686.400 Hz
bcf TXSTA,BRGH ; BRGH = '0'
bcf TXSTA,SYNC ; Set to async.
bsf TXSTA,TXEN ; Enable USART Tx
bsf PIE1,TMR1IE ; Enable TIMER1 overflow interrupt
SetBank 0 ; Select Bank 0
bsf RCSTA,SPEN ; Enable USART in general
Jag kan välja med PORTC,4 om det ska vara hög eller låg hastighet
När jag tar emot:
MainLoop:
btfss PIR1,RCIF ; Is there anything in the Reciever ???
goto MainLoop ; If not, re-test
bcf PIR1,RCIF ; Acknowledge it
movf RCSTA,W ; Read Rx status with fault bits
andlw b'00000010' ; Mask out fault bit
btfss STATUS,Z ; test if any error exist
goto Rx_Error ; Go there if error occured
movf RCREG,W ; Read recieved byte
Sända:
Taken
SetBank 1
Taken1
btfss TXSTA,TRMT ; Test if Transmitter is empty
goto Taken1 ; Wait for it if not
SetBank 0
movwf TXREG ; Send along down the chain
goto MainLoop ; Done
SetBank är ett macro:
ifdef EEDATA
SetBank Macro x
if x == 0
bcf STATUS,RP0
bcf STATUS,RP1
endif
if x == 1
bsf STATUS,RP0
bcf STATUS,RP1
endif
if x == 2
bcf STATUS,RP0
bsf STATUS,RP1
endif
if x == 3
bsf STATUS,RP0
bsf STATUS,RP1
endif
endm
else ; def EEDATA
SetBank Macro x
if x
bsf STATUS,RP0
else
bcf STATUS,RP0
endif
endm
endif ; def EEDATA
Nu kan det väl vara nog eller hur?
movlw d'5' ; Set comm. data to 9K6 baud
btfss PORTC,4 ; Test if High comm. speed is used
movlw d'23' ; Set comm. data to 2K4 baud
SetBank 1
movwf SPBRG ; 2K4/9K6 Baud @ X-tal 3.686.400 Hz
bcf TXSTA,BRGH ; BRGH = '0'
bcf TXSTA,SYNC ; Set to async.
bsf TXSTA,TXEN ; Enable USART Tx
bsf PIE1,TMR1IE ; Enable TIMER1 overflow interrupt
SetBank 0 ; Select Bank 0
bsf RCSTA,SPEN ; Enable USART in general
Jag kan välja med PORTC,4 om det ska vara hög eller låg hastighet
När jag tar emot:
MainLoop:
btfss PIR1,RCIF ; Is there anything in the Reciever ???
goto MainLoop ; If not, re-test
bcf PIR1,RCIF ; Acknowledge it
movf RCSTA,W ; Read Rx status with fault bits
andlw b'00000010' ; Mask out fault bit
btfss STATUS,Z ; test if any error exist
goto Rx_Error ; Go there if error occured
movf RCREG,W ; Read recieved byte
Sända:
Taken
SetBank 1
Taken1
btfss TXSTA,TRMT ; Test if Transmitter is empty
goto Taken1 ; Wait for it if not
SetBank 0
movwf TXREG ; Send along down the chain
goto MainLoop ; Done
SetBank är ett macro:
ifdef EEDATA
SetBank Macro x
if x == 0
bcf STATUS,RP0
bcf STATUS,RP1
endif
if x == 1
bsf STATUS,RP0
bcf STATUS,RP1
endif
if x == 2
bcf STATUS,RP0
bsf STATUS,RP1
endif
if x == 3
bsf STATUS,RP0
bsf STATUS,RP1
endif
endm
else ; def EEDATA
SetBank Macro x
if x
bsf STATUS,RP0
else
bcf STATUS,RP0
endif
endm
endif ; def EEDATA
Nu kan det väl vara nog eller hur?
-
- Inlägg: 35
- Blev medlem: 2 februari 2005, 17:18:12
- Ort: Göteborg
[b]kommunicera PIC <-> PC[/b]
skitbra beskrivning älskar kod!! Antar att du använder en färdig UART inbyggd,behändigt.
vet inte så mycket hur jag addresserar till i PC:ns COM port.
Behöver man skriva egen Transmitt och Receivekod eller klarar PC:N detta automatiskt?
Vänliga hälsingar "Gammal o Trög"
vet inte så mycket hur jag addresserar till i PC:ns COM port.
Behöver man skriva egen Transmitt och Receivekod eller klarar PC:N detta automatiskt?
Vänliga hälsingar "Gammal o Trög"
-
- Inlägg: 35
- Blev medlem: 2 februari 2005, 17:18:12
- Ort: Göteborg
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
Det går att klicka på "Ändra-knappen" för att ändra i ett redan skrivet inlägg, man behöver inte skriva ett helt nytt.
Dessutom tror jag att kommporten i en PC faktiskt bara är en UART, jag har inget minne av att man kan köra synkront i en 16550.
Vad är det du hade tänkt tig att kommunicera mellan PC'n och PIC'en? Och hur? I båda riktningarna eller bara i en riktning? Samtidigt eller en i riktning taget?
Det blir mycket lättare om du har nån mer specifik ide om vad du egentligen vill åstakomma än bara "tala om allt för mig som kan kan komma att behöva veta oavsett applikation, programspråk och hårdvara".
En bra början är kanske att välja ett språk som du antingen redan kan (eller i avsaknad av detta ett som du vill lära dig) och ta reda på hur man skickar en byte på kommporten och hur man tar emot något på den. Koppla in ett modem på den och skicka AT<enter> och se om du kan ta emot OK från modemet. När du kommit så långt på väg är det kanske dags att börja tänka på hur det ska göras på pic/avr-sidan.
Ett steg i taget - fint och lugnt...
Dessutom tror jag att kommporten i en PC faktiskt bara är en UART, jag har inget minne av att man kan köra synkront i en 16550.
Vad är det du hade tänkt tig att kommunicera mellan PC'n och PIC'en? Och hur? I båda riktningarna eller bara i en riktning? Samtidigt eller en i riktning taget?
Det blir mycket lättare om du har nån mer specifik ide om vad du egentligen vill åstakomma än bara "tala om allt för mig som kan kan komma att behöva veta oavsett applikation, programspråk och hårdvara".
En bra början är kanske att välja ett språk som du antingen redan kan (eller i avsaknad av detta ett som du vill lära dig) och ta reda på hur man skickar en byte på kommporten och hur man tar emot något på den. Koppla in ett modem på den och skicka AT<enter> och se om du kan ta emot OK från modemet. När du kommit så långt på väg är det kanske dags att börja tänka på hur det ska göras på pic/avr-sidan.
Ett steg i taget - fint och lugnt...
Jepp, jag använder den inbyggda UART, koden är saxat från en PIC16F873. Jag vet att det finns mjukvara-UART men de är ointressanta för mig, jag anser att hårdvara är bättre.
Om du vill se vad PIC:en skicker kan du använda HyperTerm eller det trevliga terminalprogram som angavs i en annan tråd i detta forum.
Om du t.ex. vill att PIC:en ska reagerar på vad du sender kan du bestämma ett protokoll själv. Det kan t.ex. vara talen 0-9, när PIC:en får dom (ett åt gången) kan du jämnföra med a'0' om du trycker på "0"-tangenten, a'1' vid "1"-tangenten osv.
För att samla ihop flersifriga tal nollar man ett resultat och tar sedan emot.
Vid varje tal (a'0'-a'9') multiplicerar man resultatet med 10 och lägger sedan till det inkommande tecken och dra ifrån a'0'.
För att multiplicera med 10 i assembler gör man först ett kopia av talet som ska multipliceras, dubblar talet (shift left) (ger 2x), dubblar igen (ger 4x), adderar kopian (ger 5x) och dubblar sista gången (ger 10x).
Om du vill se vad PIC:en skicker kan du använda HyperTerm eller det trevliga terminalprogram som angavs i en annan tråd i detta forum.
Om du t.ex. vill att PIC:en ska reagerar på vad du sender kan du bestämma ett protokoll själv. Det kan t.ex. vara talen 0-9, när PIC:en får dom (ett åt gången) kan du jämnföra med a'0' om du trycker på "0"-tangenten, a'1' vid "1"-tangenten osv.
För att samla ihop flersifriga tal nollar man ett resultat och tar sedan emot.
Vid varje tal (a'0'-a'9') multiplicerar man resultatet med 10 och lägger sedan till det inkommande tecken och dra ifrån a'0'.
För att multiplicera med 10 i assembler gör man först ett kopia av talet som ska multipliceras, dubblar talet (shift left) (ger 2x), dubblar igen (ger 4x), adderar kopian (ger 5x) och dubblar sista gången (ger 10x).
-
- Inlägg: 35
- Blev medlem: 2 februari 2005, 17:18:12
- Ort: Göteborg
Hyperterminal är ett terminal program som finns med i Windows. Om du kollar lite runt i forumet hittar du en länk till ett annat trevligt gratis terminalprogram.
Om du kör Win NT/XP kan du inte komma åt serieportens registra utan speciella driverprogram och det är det ingen anledning till heller, du behöver ju något sätt att knåpa ihop ett PC-program och till detta program finns nästan alltid tillgång till serieportarna, man kan göra det vid att öppna en fil som en stream som heter "COM1" (eller 2...).
Men där kommer vi in på tyngre Windows programmering och det är en helt annan femma. Till det använder jag Borland C Builder 6 med TurboPower Async Professional komponenter och det är en helt annan bollgata.
Så ska du bara se att PIC:en skrivar ut något till serieporten duger HyperTerm helt bra och ska du göra ett PC-program som samverkar med PIC:en är du ju i alla fall så kunnig att du klarar COM-porten utan problem.
Om du kör Win NT/XP kan du inte komma åt serieportens registra utan speciella driverprogram och det är det ingen anledning till heller, du behöver ju något sätt att knåpa ihop ett PC-program och till detta program finns nästan alltid tillgång till serieportarna, man kan göra det vid att öppna en fil som en stream som heter "COM1" (eller 2...).
Men där kommer vi in på tyngre Windows programmering och det är en helt annan femma. Till det använder jag Borland C Builder 6 med TurboPower Async Professional komponenter och det är en helt annan bollgata.
Så ska du bara se att PIC:en skrivar ut något till serieporten duger HyperTerm helt bra och ska du göra ett PC-program som samverkar med PIC:en är du ju i alla fall så kunnig att du klarar COM-porten utan problem.