problem med Hyperterminal och rs232 överföring

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
m_josefsson74
Inlägg: 72
Blev medlem: 22 juni 2003, 23:00:56
Ort: Torsås

problem med Hyperterminal och rs232 överföring

Inlägg av m_josefsson74 »

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
Användarvisningsbild
MadModder
Co Admin
Inlägg: 30155
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Inlägg av MadModder »

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.
Användarvisningsbild
AndLi
Inlägg: 17362
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

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...
Användarvisningsbild
AndLi
Inlägg: 17362
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

MadModder skrev:
samt att det kommer inte upp något alls om det inte skickas ett ASCII(13) sist.
Varför skulle det inte komma upp nått om man inte skickar en 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...)
m_josefsson74
Inlägg: 72
Blev medlem: 22 juni 2003, 23:00:56
Ort: Torsås

Inlägg av m_josefsson74 »

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???
m_josefsson74
Inlägg: 72
Blev medlem: 22 juni 2003, 23:00:56
Ort: Torsås

Inlägg av m_josefsson74 »

Vad stänger jag av flödesreglering med mera???
Användarvisningsbild
AndLi
Inlägg: 17362
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

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?? :lol: )

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.
m_josefsson74
Inlägg: 72
Blev medlem: 22 juni 2003, 23:00:56
Ort: Torsås

Inlägg av m_josefsson74 »

Ursäkta mig lite

Skickade bara exempel koden!!

nere vid FOREVER LOOP har jag tagit bort async_rx och har bara async_tx (20)
Användarvisningsbild
AndLi
Inlägg: 17362
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

Förklarar saken, ASCII(20) är inte ett utskrivbart tecken

Prova skicka async_tx(33) eller nått sånt 33 ska vara '!'.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Som sagt, jag hoppas du har en MAX232 mellan datorn och PICen, annars lär det inte funka.
m_josefsson74
Inlägg: 72
Blev medlem: 22 juni 2003, 23:00:56
Ort: Torsås

Inlägg av m_josefsson74 »

det har jag!!!!
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

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.)
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

Inlägg av AsmN »

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.
Användarvisningsbild
MadModder
Co Admin
Inlägg: 30155
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Inlägg av MadModder »

Jahaja... mina datorer har iaf aldrig skrivit ut nåt alls om inte CR skickas efteråt. Skumt.
Användarvisningsbild
AndLi
Inlägg: 17362
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

Var bara tvungen att prova.

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);
}
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
Skriv svar