Sida 5 av 5

Postat: 18 augusti 2008, 20:11:12
av gripner
ok, missförstod dig björn, dock har jag testat att köra baudrate registret satt till 6 enligt databladet viket skall ge 9600 baud vid 1MHz, och jag får bara skräp vid 9600baud då. funkar bättre vid 1200-4800baud dock .......

Postat: 18 augusti 2008, 20:23:39
av sodjan
OK, 0V i genomsnitt, right, då är jag med...

Men men, om det faktiskt blir 1200 b/s så kör du antingen
1 MHz istället för 8 MHz, eller så är USART'en felinställd.
Om du kör 1 MHz eller inte kan du kanske (om inte annat)
kolla med en blinkande LED med känd cykel-tid. Eller genom
att du är 100% säker på att USART'en är rätt inställd.

> en leverantör som lagt till en extern ocilator

Extern kristall. Jo, det är skillnad.

> att köra baudrate registret satt till 6 enligt databladet

Vilken felprocent har du då ? 51/8 är ju lika med 6.375, d.v.s
*mer* än 6% fel (om 51 var dead-on). Och med 6% fel i baudraten
så är det ju inte konstigt att du får skräp, eller hur ? Du får
snarare 9600 x 1.0625 = 10.200 baud. Inga konstigheter där...

Även om det ska läggas till eller dras av 1 någonstans i baudrate formeln,
så blir det fortfarande för mycket fel.

Så kolla alltid upp hur stort *felet* blir när du sätter baudrate!

Postat: 18 augusti 2008, 20:31:37
av björn
Efter Sodjan utlägg kunde jag varit tyst men jag tar siffrorna från databladet :
OM den (vilket jag är övertygad om) går i 1MHz så har du ett fel på 7% vid 9600 baud, men håller du dig på 4800 och under så ligger felet på 0,2%. Se sidan 168 i databladet för mer exempel.

(och om den skulle gå på interna oscillatorn så är det ännu en felkälla)

Postat: 18 augusti 2008, 20:38:33
av sodjan
> så har du ett fel på 7% vid 9600 baud...

OK, i så fall är inte heller 51 exakt 9600 baud, men då
har man i alla fall ett tillräckligt litet fel.

Dessutom står ju tydligen felprocenten i klartext i databladet.

Generellt sätt är det inte bra (varken på AVR eller PIC) att
köra med så låga baudrate registervärden, det blir ofta
för stora fel. *OM* det inte är så att man använder en
kristall med "rätt" frekvens, d.v.s en som ger 0% fel
vid alla normala baud rates.

Processorn har inget val av hög/låg "växel" för baudrate registret ?
Ibland finns det det för att undvika att få så låga värden.

Postat: 18 augusti 2008, 20:40:40
av thepirateboy
Man kan sätta Double speed på UART:n så får man mycket mindre fel.

"• Bit 1 – U2Xn: Double the USART Transmission Speed
This bit only has effect for the asynchronous operation. Write this bit to zero when using synchronous
operation.
Writing this bit to one will reduce the divisor of the baud rate divider from 16 to 8 effectively doubling
the transfer rate for asynchronous communication."

Postat: 18 augusti 2008, 20:48:12
av gripner
ska testa med dubblingen, då kan man ju som jag förstår det köra på 4800baud med 0% fel.

Medveten om att de är -7% fel vid 9600@1MHz dock skall det resultera i tex om man ekar ink0ommande qwert blir det tex qw3ert eller liknande inte CCCCCCCCCCCCCCCCC vilket jag får....... det har jag kollat genom att med flit på annan utrustning köra på 9600*1.07 på baudraten och 9600 på baudraten på andra enheten

givetvis aldrig klokt att köra med dålig "tolerans" men försöker ju än så länge bara lura ut exakt vad för freqvens som används
1MHz är ju misstänkt, dock svarar leverantören annat....

Postat: 18 augusti 2008, 21:05:03
av sodjan
> Medveten om att de är -7% fel vid 9600@1MHz

OK, då så. Det lät som att du inte visste varför det blev fel :

> ...viket skall ge 9600 baud vid 1MHz, och jag får bara skräp vid 9600baud då.

Du hade ju kunnat nämna att du faktiskt *visste* varför... :roll:

Exakt vad som händer beror väldigt mycket på hur
bit-samplingen är konstruerad. Det går inte att jämföra
med en annan utrustning. Dessutom vet du inte hur
fel PC'n ligger.

Om "6" ligger 7% fel, så är det rätta värdet 6 x 1.07 = 6.42.
Med dubbla hastigheten så skulle det bli 12.84.
Närmaste helötal ("13") blir då 13/12.84 = ca 1.2 - 1.3 % fel,
vilket normalt är acceptabelt.

Var det 7% fel åt "andra hållet", så blir det "11" med ca 2% fel.
Gränsfall...

Om du kan köra 4800 utan fel med biten = 0, så ska/borde
det även bli 9600 utan fel i "double speed".

> 1MHz är ju misstänkt, dock svarar leverantören annat....

Olimex sa ingenting om hastigheten, bara *att* kristallen används.

Kan man inte köra på 1 MHz med en 8 MHz kristall ?
Jag kanske missförstog något tidigare inlägg, det kanske
bara är 8 MHz intosc som kan delas ner med 8...

Postat: 18 augusti 2008, 21:17:23
av anrhm
Vad händer om du använder Olimex exempelkod?

Kod: Markera allt

void uart_init ()
{
// Crystal Oscillator division factor: 1
CLKPR=0x80;
CLKPR=0x00;
.....

CLKPR känns ju ganska lovande och den prescalern ändrade du inte på i din kod vad jag kunde se...

Postat: 18 augusti 2008, 21:20:18
av björn
sodjan skrev: Kan man inte köra på 1 MHz med en 8 MHz kristall ?
Jag kanske missförstog något tidigare inlägg, det kanske
bara är 8 MHz intosc som kan delas ner med 8...
Nejdå, du förstod rätt.

Postat: 18 augusti 2008, 21:22:04
av gripner
sant att dom inte sa någonting om hastigheten, men jag frågade i mitt email om do gör någonting med freqvensen, vilket dom inte direkt svarade på utan bara sa att dom givetvis använder 8MHz kristellen dom hakat på.

ska testa lite mera nu

edit

testade med
CLKPR=0x80;
CLKPR=0x00;

nu funkar det med baudregistret satt till 51 dvs 9600baud@8Mhz
, jag har nog missförstått. trodde inte man kunde ändra externa ocilatorn utan bara interna...?
trodde iof att freqvensmodifieringar, inte bara val av ext/int va tvungen att göra ibootloadern altså via anna programer än flip

Postat: 18 augusti 2008, 21:57:26
av björn
Kul att det funkar :) Då är det bara till att fortsätta utforska.

Postat: 18 augusti 2008, 23:46:02
av sodjan
Ah, va skönt ! :-)