RS232 problem
RS232 problem
Hej!
Jag sitter och försöker få igång en RS232 koppling mellan datorn och en pic18f458. Men det fungerar inte.
jag har skrivit koden i C och har testat den på ett annat kretskort för en pic 18f248, och det fungerar finfint.
Men nu när jag kompilerat om den för 18f458, så blir nått skummt. Det kommer över tecken till Hyperterminalen som jag använder. Problemet är att det är fel tecken. jag skickar t.ex ett 'a' och får fram ett 'X'.
Jag tycker det verkar vara ett baudrate problem. nått som inte stämmer med klockfrekvensen.
jag har ingen aning om vart jag ska leta efter felet. Jag kan däremot lista upp vad jag kollat och dubbelkollat.
* kollat #include filen, select device och *.lkr filen, så att de stämmer överens med p18f458
*kollat configuration bits. kristall = HS, powerup timer enabled, resten är disabled.
*kollat så att alla kondensatorer och ledningar är dragna rätt med max232 kretsen
*kollat med oscilloskop på signalen och sett att den verkar stämma överens med baudraten. en puls uppskattade jag till ca50uS och 1/19200 = 52uS, så det verkar vara i närheten iaf. äver försäkrat mig om att signalen håller rätt nivåer.
*dubbelkollat formeln för BRGH_HIGH och baudrate 19200 = Fosc/(16*(spbrg+1)) => spbrg = Fosc/(16*19200)-1 som ger spgrb = 25.
Dessutom hade som sagt den andra processorn exakt samma kristall, och där fungerar det.
*testat att ändra spbrg från 23 upp till 27, men det blir endå fel tecken.
*byta kristall och även byta processor, men det blir fortfarande samma sorts tecken.
*testat med lägra budrate ner till 1200, men det kommer forfrarande samma sorts feltecken.
Har ni några förslag på vad felet kan vara?
Antagligen är det nått superlätt som jag missat. t.ex nån inställning jag glömmt när jag kompilerat om koden för den nya processorn.
Jag sitter och försöker få igång en RS232 koppling mellan datorn och en pic18f458. Men det fungerar inte.
jag har skrivit koden i C och har testat den på ett annat kretskort för en pic 18f248, och det fungerar finfint.
Men nu när jag kompilerat om den för 18f458, så blir nått skummt. Det kommer över tecken till Hyperterminalen som jag använder. Problemet är att det är fel tecken. jag skickar t.ex ett 'a' och får fram ett 'X'.
Jag tycker det verkar vara ett baudrate problem. nått som inte stämmer med klockfrekvensen.
jag har ingen aning om vart jag ska leta efter felet. Jag kan däremot lista upp vad jag kollat och dubbelkollat.
* kollat #include filen, select device och *.lkr filen, så att de stämmer överens med p18f458
*kollat configuration bits. kristall = HS, powerup timer enabled, resten är disabled.
*kollat så att alla kondensatorer och ledningar är dragna rätt med max232 kretsen
*kollat med oscilloskop på signalen och sett att den verkar stämma överens med baudraten. en puls uppskattade jag till ca50uS och 1/19200 = 52uS, så det verkar vara i närheten iaf. äver försäkrat mig om att signalen håller rätt nivåer.
*dubbelkollat formeln för BRGH_HIGH och baudrate 19200 = Fosc/(16*(spbrg+1)) => spbrg = Fosc/(16*19200)-1 som ger spgrb = 25.
Dessutom hade som sagt den andra processorn exakt samma kristall, och där fungerar det.
*testat att ändra spbrg från 23 upp till 27, men det blir endå fel tecken.
*byta kristall och även byta processor, men det blir fortfarande samma sorts tecken.
*testat med lägra budrate ner till 1200, men det kommer forfrarande samma sorts feltecken.
Har ni några förslag på vad felet kan vara?
Antagligen är det nått superlätt som jag missat. t.ex nån inställning jag glömmt när jag kompilerat om koden för den nya processorn.
Jag kör C18 senaste studentversionen.
Processorn har ingen inbyggd oscillator, utan jag kör på en kristall på 8Mhz.
Det är inte alltid X som kommer upp, utan det är olika tecken. Jag tror att jag har kommit en bit närme nu. Det verkar inte som att processorn skickar med någon startbit, fastän den är inställd på asynkron dataöverföring.
Kollade registerna för USARTen.
TXSTA = 1010 0110 = 0xA6
vilket ska ge inställningen:
8 bitars dataöverföring
transmit enabled
asynkronus mode
RGBH = high speed
SKa man ställa in startbiten själv i nått annat register jag missat?
Processorn har ingen inbyggd oscillator, utan jag kör på en kristall på 8Mhz.
Det är inte alltid X som kommer upp, utan det är olika tecken. Jag tror att jag har kommit en bit närme nu. Det verkar inte som att processorn skickar med någon startbit, fastän den är inställd på asynkron dataöverföring.
Kollade registerna för USARTen.
TXSTA = 1010 0110 = 0xA6
vilket ska ge inställningen:
8 bitars dataöverföring
transmit enabled
asynkronus mode
RGBH = high speed
SKa man ställa in startbiten själv i nått annat register jag missat?
- Schnegelwerfer
- Inlägg: 1863
- Blev medlem: 8 november 2004, 13:46:56
Även stoppbit är obligatorisk i RS232! Men man kan välja mellan 1 eller 2 men MINST 1!
Som en lösning hade jag föreslagit att du skickade 1 byte åt gången med ett visst mellanrum, du ska veta vilken det är och den ska ha ett mönster som är lätt att känna igen.
0xFF vill visa enbart startbitten (som ju är en nolla)
0xAA och 0x55 kan vara bra att titta på också, växelvis 101010....
Du har ju tillgång till oscilloskop så detta sätt skulle klara av detta med startbitten (0xFF...), då ser du även exakt bit-längd och därmed baud-rate.
Tittar du på 0x01 ser du hur lång tid 8 nollor tar på sig och kan därmed räkna bättre tid.
Sen efter detta skulle jag tro att du har ett bra hum om vad som händer eller inte händer.
Som en lösning hade jag föreslagit att du skickade 1 byte åt gången med ett visst mellanrum, du ska veta vilken det är och den ska ha ett mönster som är lätt att känna igen.
0xFF vill visa enbart startbitten (som ju är en nolla)
0xAA och 0x55 kan vara bra att titta på också, växelvis 101010....
Du har ju tillgång till oscilloskop så detta sätt skulle klara av detta med startbitten (0xFF...), då ser du även exakt bit-längd och därmed baud-rate.
Tittar du på 0x01 ser du hur lång tid 8 nollor tar på sig och kan därmed räkna bättre tid.
Sen efter detta skulle jag tro att du har ett bra hum om vad som händer eller inte händer.
om jag skickar värdet 0xff så ligger signalen låg hela tiden.
Om jag skicar värdet 0x55, så får jag 4st pulser, och inte 5 vilket jag tycker styrker att det är startpulsen som fattas.
Startbiten är vad jag förstått att signalen går från låg till hög och sedan till låg igen, innan resten av bitarna kommer. stopbiten är att signalen går låg på slutet. rätta mig om jag har fel, för då blir det lättare att hitta vad som e galet
Baudraten på signalen verkar stämma. den totala pulslängden för att skicka värdet 0x00 är ca 420uS vilket ger 52.5uS/ puls
Enligt databladet för processorn så är startbiten är obligatorisk om man kör med asynkron överföring, men inte om man kör med synkron.
Jag har testat att ställa in både asynkron och synkron överföring, men det blir ingen skillnad på signalerna.
what to do, what to do??
Om jag skicar värdet 0x55, så får jag 4st pulser, och inte 5 vilket jag tycker styrker att det är startpulsen som fattas.
Startbiten är vad jag förstått att signalen går från låg till hög och sedan till låg igen, innan resten av bitarna kommer. stopbiten är att signalen går låg på slutet. rätta mig om jag har fel, för då blir det lättare att hitta vad som e galet

Baudraten på signalen verkar stämma. den totala pulslängden för att skicka värdet 0x00 är ca 420uS vilket ger 52.5uS/ puls
Enligt databladet för processorn så är startbiten är obligatorisk om man kör med asynkron överföring, men inte om man kör med synkron.
Jag har testat att ställa in både asynkron och synkron överföring, men det blir ingen skillnad på signalerna.
what to do, what to do??
Utan startbit blir det ingen asynkron seriekommunikation (eller rättare sagt, den första databiten som är 0 tolkas som startbit av mottagaren).
Det låter väldigt konstigt det här, speciellt om du får precis samma i synkront läge. För är det inte så att TX-pinnen (async) är klock-pinnen i synkront läge? Så det borde inte komma någon data där i synk-läge!
Händer det något på den andra pinnen i något av lägena? (RX/DT)
Det låter väldigt konstigt det här, speciellt om du får precis samma i synkront läge. För är det inte så att TX-pinnen (async) är klock-pinnen i synkront läge? Så det borde inte komma någon data där i synk-läge!
Händer det något på den andra pinnen i något av lägena? (RX/DT)
Låter definitivt som om att du har missat något i setup av UART'en! Det är dax att lusläsa databladet och ta alla inställninger från början.
Jag är osäker på om det skiljer mellan 16xxx och 18xxx men jag har ställt UART'en på en 16F873 på 3,6864MHz såhär:
Jag är osäker på om det skiljer mellan 16xxx och 18xxx men jag har ställt UART'en på en 16F873 på 3,6864MHz såhär:
Kod: Markera allt
movlw b'10010000' ; Set to all out except Rx- and Speed-Select pin
movwf TRISC ; And do it on PORTC
movlw d'2' ; Set comm. data to 19K2 baud
movwf SPBRG ; 19K2 Baud @ X-tal 3.686.400 Hz
bcf TXSTA,BRGH ; BRGH = '0'
bcf TXSTA,SYNC ; Set to async.
bsf TXSTA,TXEN ; Enable USART Tx
Nu e det löst. tack för tipset cyr!
problemet var att jag växlat på RX och TX mellan picen och max232, måste slarvat när jag kollade ledningarna.
Tycker endå det var lite skumt att det kommer signaler på RX linan med asynkron överföring, det förvirrade mig en hel del
Det var ju endå ett ganska enkelt fel, som jag förmodade i början, synd att man inte kan lita på sig själv..
tack alla ni andra oxå! Nu kan jag rs232 utan och innan
problemet var att jag växlat på RX och TX mellan picen och max232, måste slarvat när jag kollade ledningarna.
Tycker endå det var lite skumt att det kommer signaler på RX linan med asynkron överföring, det förvirrade mig en hel del

Det var ju endå ett ganska enkelt fel, som jag förmodade i början, synd att man inte kan lita på sig själv..
tack alla ni andra oxå! Nu kan jag rs232 utan och innan
