Sida 1 av 1

Steglös baud

Postat: 4 maj 2007, 18:11:45
av Kjelle
Finns här någon duktig comportsprogrammerare(RS232), vill gärna veta
hur man ställer in steglös Baud i comporten ?

Tänkte börja forska lite i bilars OBD(diagnostik).

Många bilar har udda Baud, t.ex. GM har 160, 8192

Comportskretsen 16C550(eller kompatibel) kan jag köra på dom
vanliga hastigheterna 110, 4800, 9600, 14400 o.s.v. inga problem.

Genom att manipulera register DLM i 16C550'an kommer jag även
åt dom dolda baudhastigheterna 8861, 10472 m.m.

16C550 har ju en intern osc på 1.8432 MHz och den delas ju ner.
T.ex. med 1 i DLM ger 115200, 115200/12 ger 9600 o.s.v. ett alternativ vore ju att ändra osc i 16C550’an.
Men jag kan inte på något sätt se att det mjukvarumässigt går att ändra på 16C550'ans osc. det vore kul att ställa baudgeneratorn exakt på önskad hastighet, men jag har inte lyckats finna ett svar någonstans.

Steglös baud finns ju annars i emulatorerna till piratkortstv m.m. så på något sätt går det att lösa.

Nu kanske någon säger varför köper du inte en färdig OBD scanner för några hundralappar, men då är det ju inte tekniskt intressant. :)


Kjelle

Postat: 4 maj 2007, 18:19:52
av sodjan
Först...

> vill gärna veta hur man ställer in steglös Baud i comporten ?

Det kan du *aldrig* få.

Mycket *små* steg kanske, men *aldrig* "steglös"...

Jag vet inte hur man gör på en *PC* (om det är det som frågan
gäller), men på en vanlig mircocontroller (AVR/PIC/whatever) är
det bara att ställa baudrate registret som man vill.

T.ex när det gäller PIC, så kan man i de nyare modellerna
(med 16-bitars baudrate register istället för 8 bitars) få väldigt
fin upplösning.

Postat: 4 maj 2007, 18:24:45
av Kjelle
Jag menar med steglös Baud t.ex. 8192, 8193, 8194 o.s.v alltså
ändra Baud med ett stegs upplösning.
Steglös kanske var fel uttryck av mig, ensteg är bättre.


Kjelle

Postat: 4 maj 2007, 18:34:56
av sodjan
Men varför måste du ställa i baud i steg om 0.0122%
(i fallet med 8192 -> 8193) när en serielina (med
vanligt 8n1 UART protokoll) accepterar 1-2% "fel"
i baudrate utan att tappa data ????

Det borde alltså vara OK om du har en lösning som
kan stega baudrate i steg om ca 1%, t.ex 8192 -> 8274
(bara för att ta ett exempel)...

Så varför den väldigt fina upplösningen ?

Postat: 4 maj 2007, 18:55:50
av björn
I vilket operativsystem? I windows kan man nog glömma det, dock har man lite bättre förutsättningar i lunix/unix.

Postat: 4 maj 2007, 19:22:57
av arvidb
Du behöver en UART som kan klockas m.h.a. en timer. Jag behövde 500 kbaud i en liten dator som kör Linux på en Etrax LX100-processor (32 bit, 100 Mhz, ingen FPU). Det enklaste där blev att aktivera drivrutinens stöd för extern klocka, och hänga på en 4 MHz-kristall externt. Drivrutinen hade inget stöd för timer-klockning.

I en AVR/PIC kan det nog vara mycket enklare att använda en timer för att få "steglös" baudrate.

Arvid

Postat: 4 maj 2007, 19:37:50
av Kjelle
Sodjan:

Jo dom lägre hastigheterna typ 8192 är säkert inga problem.
Tar jag och delar 115200/14 får jag 8228 och det hamnar inom feltoleransen så det lär säkert fungera bra.

Men vill jag läsa högre hastigheter mellan t.ex. 28800 och 38400
så blir det problem.
115200/3 = 38400
115200/4 = 28800
Bilfabrikanter vill försvåra för amatörer att komma in på databussarna
så därför kan dom välja kanske 31200 som hastighet och då faller
toleransen direkt.
Sen kör dom inverterad bitsföljd och bitsvärde men det är inte svårt att
fixa till.

Björn:

Det var intressant om det går med Linux.
Själv kan jag bara Windows miljön och programera i VB.
Kanske du kan utveckla mera ?

Kjelle

Postat: 4 maj 2007, 20:48:13
av björn
Tyvärr vet jag inte så mycket om det, men jag håller själv på med ett enkelt OBD interface till BMW'n och den använder ISO 9141-2 med en datarate på 10.4 Kbaud samt 1 baud och i övrigt som vanlig RS232 kommunikation (fast 12V och 0v nivåer).
När jag började kollade jag på olika alternativ där jag hade valet att antingen använda en processor (AVR/PIC) för att skapa olika hastigheter eller också ett "dumt" interface med bara nivåomvandling, då hittade jag information om att det inte gick att skapa i Windows miljö pga multitaskingen men i linux är det lättare då man kan köra i realtidsläge och få ful kontroll.

Jag har inte gjort program för kommunikationen själv så jag vet inte hur det är programmerat utan jag hittade ett program för linux som funkar för mina enkla krav.

Postat: 4 maj 2007, 22:39:17
av mri
Kjelle: Jag har pysslat en del med RS-232 och UARTen under DOS, Windows och Linux man jag har aldrig hört eller läst om något annat sätt än att konfigurera Baud Rate Divisor registret, som ju delar ner 115200. Åtminstone inte standard UART kretsarna som sitter i PC'n.
Det finns speciella UART kretsar som garanterat fixar jobbet. T.ex. använde jag en gång ett kort med 4 portar som vardera hade 256 byte FIFO. Men det kortet hade egna drivrutiner, etc.

Postat: 4 maj 2007, 22:43:19
av Micke_s
Vanliga FTDI usb->seriall chip har jag för mig klarar nästan valfri baudrate.