Al_Bundy: baudrate ställs vid att ladda ett visst register med ett visst värde, ibland är det ett par register som måste ställas.
Väldigt många av de problem du har beror helt enkelt på att du har noll koll på vad du lekar med och hur en µC fungerar men
hade du kollat i databladet hade du
kanske hittat lite beskrivning av USART. I det datablad jag har för en ATmega 168 finns det ett register som kallas UBRR0, däri ställs delningen av systemklockan så att man får rätt baudrate med USART0.
För 11.0592MHz får man 9600 baud vid ett värde av 71 i UBRR0 vid U2X0 = 0, fel: ±0,0%.
För 16MHz får man 9615,38 baud vid ett värde av 103 i UBRR0 vid U2X0 = 0, fel: +0,16% mot 9600.
Formeln för detta står mycket tydligt i databladet också: UBRR0 = (Fosc/(16*baudrate)) - 1
Slutsatsen är alltså att 11,0592MHz kristallen är mer exakt om du ska uppnå 9600 baud än 16MHz kristallen - och det är mycket ofta därför dessa kristaller med "sned" frekvens tillverkas.
Förvisso är felet så pass litet vid 16MHz så det inte har någon verklig betydelse men det enda som skiljer i baudrate är inställningen i UBRR0.
Självklart kommer exekveringshastigheten att vara lägre också (30,88% lägre), använder man timer-interrupt är det likaledes bara att trimma till rätt värde i rätt register och använder man delay() i någon form gör man oftast fel ändå...
EDIT: och lite C-kod för att göra allt enklare:
Kod: Markera allt
#define X_TAL 11059200
#define BAUDRATE 9600
UBRR0 = (X_TAL / (16*BAUDRATE)) - 1;
Svårare än så är det inte att släppa Arduino-träsket...
Likaså kan man räkna andra hållet:
Baudrate = X_TAL / (16*(UBRR0+1))
Och ja: "industristandard". Det var ju vad nu ungdomar utropade Arduino till samtidig som ni var framtidens hopp.
"Framtidens hopp" kan jag hålla med om, jag kommer inte att sluta hoppas att ni lär er något någon gång i framtiden...
Skulle Arduino bli svensk industris standard lär det gå käpprätt åt fanders med Sverige och jag kommer nog att flytta till Kina eller Indien, där håller de på med moderna grejer istället.