problem med Hyperterminal och rs232 överföring
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås
problem med Hyperterminal och rs232 överföring
Hej
Jag har gjort ett program i min PIC16F877A som sänder data till PC:n
men.....
Jag ser inget i hyperterminalen, har även ändrat picen men det hjälper inget
måste jag ha någon drivrutin eftersom jag andvänder XP eller????
Jag har provat alla inställningar som går nu tror mig
Kan man kanske med XP på något enkelt sätt implementera WIN 98 och vara där och se vad som händer på serieporten i stället eftersom det inte funka med XP
Jag har gjort ett program i min PIC16F877A som sänder data till PC:n
men.....
Jag ser inget i hyperterminalen, har även ändrat picen men det hjälper inget
måste jag ha någon drivrutin eftersom jag andvänder XP eller????
Jag har provat alla inställningar som går nu tror mig
Kan man kanske med XP på något enkelt sätt implementera WIN 98 och vara där och se vad som händer på serieporten i stället eftersom det inte funka med XP
- MadModder
- Co Admin
- Inlägg: 30155
- Blev medlem: 6 september 2003, 13:32:07
- Ort: MadLand (Enköping)
- Kontakt:
Om du bara kör med jord och TX från PICen måste du på PC:n stänga av allt vad flödeskontroll heter.
Timeout: OFF
XON/XOFF: OFF
CTS-handskakning: OFF
DSR-handskakning: OFF
DSR-känslighet: OFF
DTR-krets: OFF
RTS-krets: OFF
samt att det kommer inte upp något alls om det inte skickas ett ASCII(13) sist.
Timeout: OFF
XON/XOFF: OFF
CTS-handskakning: OFF
DSR-handskakning: OFF
DSR-känslighet: OFF
DTR-krets: OFF
RTS-krets: OFF
samt att det kommer inte upp något alls om det inte skickas ett ASCII(13) sist.
Du behöver inte skriva några drivrutiner.
Ställ bara in hyperterminalen på den baudrate stopbitar och paritet du använder. STÄNG av all flödesreglering.
Kontrollera så att du skickar ASCI tecken till PC och inte försöker skicka ut binära värden.
Altså om du har en variabel i som har värde 13, kan du inte bara göra en SendByte(i) och tro att hyperterminalen ska visa siffrorna "1" och "3". Vad som kommer "visa" är en radbytning!!
OBS Funktionen SendByte vet jag inte om den existerar utan funkar bara som exempel. De flesta basicspråken har säkert en "skriv ut tal på serieporten" funktioner. Detta är den funktion du ska använda...
Ställ bara in hyperterminalen på den baudrate stopbitar och paritet du använder. STÄNG av all flödesreglering.
Kontrollera så att du skickar ASCI tecken till PC och inte försöker skicka ut binära värden.
Altså om du har en variabel i som har värde 13, kan du inte bara göra en SendByte(i) och tro att hyperterminalen ska visa siffrorna "1" och "3". Vad som kommer "visa" är en radbytning!!
OBS Funktionen SendByte vet jag inte om den existerar utan funkar bara som exempel. De flesta basicspråken har säkert en "skriv ut tal på serieporten" funktioner. Detta är den funktion du ska använda...
Varför skulle det inte komma upp nått om man inte skickar en ASCII(13) sist??MadModder skrev:
samt att det kommer inte upp något alls om det inte skickas ett ASCII(13) sist.
Detta har då ingen berättat för min Hyperterminal på jobb (eller nån annan stans heller för den delen, men jobbets är den enda XP jag kört...)
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås
Hej igen
andvänder denna kod i picen::
-- usart asynchronous serial routine
-- writen and tested in jal by Surducan Vasile
-- distributed under GPL licence ( all you see is yours, gave me some credits)
-- some ideea taken from picuart.asm by Thomas Mc.Gahee
include 16f877_20
-- uart initialization
-- -------------------------------------------------------------------------
pin_c6_direction = output -- tx
pin_c7_direction = input -- rx
bank_1
f877_txsta = 0b_0010_0100 ; asynch mode, 8bit, transmit enable, high speed
; f877_txsta = 0b_0010_0000 ; asynch mode, 8bit, transmit enable, low speed
f877_spbrg = 129 ; set baudrate at 115200 bps; set your owns according the
; table below
bank_0
f877_rcsta = 0b_1001_0000 ; serial port enable, 8bit mode,
; constant reception
assembler
movf f877_rcreg, w -- clear uart receiver and 2 fifo's
movf f877_rcreg, w
movf f877_rcreg, w
movlw 0
movwf f877_txreg -- send out one dummy caracter
end assembler
-- end of usart initialization
procedure async_rx ( byte out rx_data ) is
assembler
local ser_in, uart_ready, no_int, overerror,
frameerror
ser_in:
btfsc f877_rcsta,oerr
goto overerror -- to overflow error...
btfsc f877_rcsta,ferr
goto frameerror -- to framing error...
uart_ready:
btfss f877_pir1,rcif
goto ser_in -- wait if not ready...
no_int:
bcf intcon_gie -- switch off interrupts
btfsc intcon_gie -- be sure
goto no_int
movf f877_rcreg,w -- recover uart data
bsf intcon_gie -- re-enable interrupts
movwf rx_data -- save in reception register
return
overerror: -- if f877_rcreg is still full at third byte stop bit detection
bcf intcon_gie -- turn interrupts off
btfsc intcon_gie -- be sure
goto overerror
bcf f877_rcsta,cren -- disable continuous receive, reset oerr
movf f877_rcreg,w -- flush rcreg + 2 fifo, this will clears the
movf f877_rcreg,w -- ferr flag
movf f877_rcreg,w
bsf f877_rcsta,cren -- enable continous receive, clear oerr
bsf intcon_gie -- enable interrupts.
goto ser_in -- try again...
frameerror: -- if garbage is coming in
bcf intcon_gie -- disable interrupts
btfsc intcon_gie
goto frameerror -- be sure
movf f877_rcreg,w -- reading rcreg clears ferr flag
-- bcf f877_rcsta,ferr -- sure clears ferr
bsf intcon_gie
goto ser_in
end assembler
end procedure
procedure async_tx ( byte in tx_data ) is
assembler
local transmit, interrupt
movf tx_data,w -- copy tx_data to w.
transmit:
btfss f877_pir1,txif
goto transmit -- wait for transmitter interrupt flag
interrupt:
bcf intcon_gie -- disable interrupts
btfsc intcon_gie -- be sure
goto interrupt
movwf f877_txreg -- load data to be sent...
bsf intcon_gie -- re-enable interrupts
return -- transmitted data is in W
end assembler
end procedure
var byte data
forever loop
async_rx ( data ) -- receive a character ( 8,N,1, hardware flow DTR=DSR,
-- RTS=CTS or none )
async_tx ( data ) -- send back to terminal
end loop
Och denna som är ett exempelprogram borde väl skicka ASCII
kod???
andvänder denna kod i picen::
-- usart asynchronous serial routine
-- writen and tested in jal by Surducan Vasile
-- distributed under GPL licence ( all you see is yours, gave me some credits)
-- some ideea taken from picuart.asm by Thomas Mc.Gahee
include 16f877_20
-- uart initialization
-- -------------------------------------------------------------------------
pin_c6_direction = output -- tx
pin_c7_direction = input -- rx
bank_1
f877_txsta = 0b_0010_0100 ; asynch mode, 8bit, transmit enable, high speed
; f877_txsta = 0b_0010_0000 ; asynch mode, 8bit, transmit enable, low speed
f877_spbrg = 129 ; set baudrate at 115200 bps; set your owns according the
; table below
bank_0
f877_rcsta = 0b_1001_0000 ; serial port enable, 8bit mode,
; constant reception
assembler
movf f877_rcreg, w -- clear uart receiver and 2 fifo's
movf f877_rcreg, w
movf f877_rcreg, w
movlw 0
movwf f877_txreg -- send out one dummy caracter
end assembler
-- end of usart initialization
procedure async_rx ( byte out rx_data ) is
assembler
local ser_in, uart_ready, no_int, overerror,
frameerror
ser_in:
btfsc f877_rcsta,oerr
goto overerror -- to overflow error...
btfsc f877_rcsta,ferr
goto frameerror -- to framing error...
uart_ready:
btfss f877_pir1,rcif
goto ser_in -- wait if not ready...
no_int:
bcf intcon_gie -- switch off interrupts
btfsc intcon_gie -- be sure
goto no_int
movf f877_rcreg,w -- recover uart data
bsf intcon_gie -- re-enable interrupts
movwf rx_data -- save in reception register
return
overerror: -- if f877_rcreg is still full at third byte stop bit detection
bcf intcon_gie -- turn interrupts off
btfsc intcon_gie -- be sure
goto overerror
bcf f877_rcsta,cren -- disable continuous receive, reset oerr
movf f877_rcreg,w -- flush rcreg + 2 fifo, this will clears the
movf f877_rcreg,w -- ferr flag
movf f877_rcreg,w
bsf f877_rcsta,cren -- enable continous receive, clear oerr
bsf intcon_gie -- enable interrupts.
goto ser_in -- try again...
frameerror: -- if garbage is coming in
bcf intcon_gie -- disable interrupts
btfsc intcon_gie
goto frameerror -- be sure
movf f877_rcreg,w -- reading rcreg clears ferr flag
-- bcf f877_rcsta,ferr -- sure clears ferr
bsf intcon_gie
goto ser_in
end assembler
end procedure
procedure async_tx ( byte in tx_data ) is
assembler
local transmit, interrupt
movf tx_data,w -- copy tx_data to w.
transmit:
btfss f877_pir1,txif
goto transmit -- wait for transmitter interrupt flag
interrupt:
bcf intcon_gie -- disable interrupts
btfsc intcon_gie -- be sure
goto interrupt
movwf f877_txreg -- load data to be sent...
bsf intcon_gie -- re-enable interrupts
return -- transmitted data is in W
end assembler
end procedure
var byte data
forever loop
async_rx ( data ) -- receive a character ( 8,N,1, hardware flow DTR=DSR,
-- RTS=CTS or none )
async_tx ( data ) -- send back to terminal
end loop
Och denna som är ett exempelprogram borde väl skicka ASCII
kod???
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås
Den skickar väll vad du skickar till den. Så den borde skriva ut ett synligt tecken... Men skickar du inte nått till den kommer den hänga sig i ser_in loopen väll... och altså aldrig skicka nått !!
*Ryser lite över gotos*
BTW prova Code flaggan nästa gång du postar kod så blir det enklare att läsa (iof blir asm aldrig lättläst.. hur kan man ens koda i det frivilligt??
)
Edit:
Flödesregleringen stänger du av under Arkiv -> Egenskaper -> Configure
Längst ner har du FlowControl: välj None där.. de andra borde skulla vara:
115200 8 None 1
Har du btw rätt klocka för delayerna i koden? Kör du utan MAX232? har du då rätt invertering på utdatan?
*Ryser lite över gotos*
BTW prova Code flaggan nästa gång du postar kod så blir det enklare att läsa (iof blir asm aldrig lättläst.. hur kan man ens koda i det frivilligt??
![Laughing :lol:](./images/smilies/lol.gif)
Edit:
Flödesregleringen stänger du av under Arkiv -> Egenskaper -> Configure
Längst ner har du FlowControl: välj None där.. de andra borde skulla vara:
115200 8 None 1
Har du btw rätt klocka för delayerna i koden? Kör du utan MAX232? har du då rätt invertering på utdatan?
Senast redigerad av AndLi 2 januari 2005, 23:00:20, redigerad totalt 2 gånger.
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås
-
- Inlägg: 72
- Blev medlem: 22 juni 2003, 23:00:56
- Ort: Torsås
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
Prova lite och se vart det skiter sig..
1) Kör hyperterminal, slå av all flödeshantering. Koppla ihop pinne 2 & 3 och knappa lite på tangentbordet. Tecknena ska då ekas tillbaka.
2) Koppla in kablen mellan datorn och max232'an. Ta bort pic'en och sätt en bygel i mellan RX & TX på picen. Knappa på tangentbordet och kolla om tecknena ekas.
3) Skriv ett program i picen som lägger ut en konstant ström med tecken. Kolla om du får tecknena på skärmen. Om inte kolla att du verkligen får några pulser på TX-porten (med logikpenna eller om du inte har det, en högtalare med ett 100 ohms motstånd - det ska låta i den om du ha en normal hastighet typ 9600 baud.)
1) Kör hyperterminal, slå av all flödeshantering. Koppla ihop pinne 2 & 3 och knappa lite på tangentbordet. Tecknena ska då ekas tillbaka.
2) Koppla in kablen mellan datorn och max232'an. Ta bort pic'en och sätt en bygel i mellan RX & TX på picen. Knappa på tangentbordet och kolla om tecknena ekas.
3) Skriv ett program i picen som lägger ut en konstant ström med tecken. Kolla om du får tecknena på skärmen. Om inte kolla att du verkligen får några pulser på TX-porten (med logikpenna eller om du inte har det, en högtalare med ett 100 ohms motstånd - det ska låta i den om du ha en normal hastighet typ 9600 baud.)
Ett bättre alternativ till Hyperterminal är http://bray.velenje.cx/avr/terminal/
Där får man även tecken i binär och HEX form, vilket betyder att du ser allt som kommer på serieporten inte bara vanliga tecken.
Där får man även tecken i binär och HEX form, vilket betyder att du ser allt som kommer på serieporten inte bara vanliga tecken.
Var bara tvungen att prova.
Detta kommer ut på Hyperterminalen som en rad.
Har ingen flödesreglering på hyper, standard ascii inställningar.
Och nä koden är inte för PIC/AVR
Kod: Markera allt
void inti_tx()
{
DDR4_D45 = 1;
SMR1 = 0x01;
SCR1 = 0x13;
U1CDCR = 0x88;
SSR1 |= 0x02;
}
void tx(char *str)
{
while(*str)
{
while(!(SSR1 & 0x08));
SODR1 = *str++;
}
}
main (void)
{
init_tx();
tx("-----");
tx("Hello world!");
while(1);
}
Har ingen flödesreglering på hyper, standard ascii inställningar.
Och nä koden är inte för PIC/AVR