Ik heb de UART van mij 2313 AVR verbonden met de serieele poort van mijn computer (gebruik makend van een ST232 , een Max232 equivalent). Met hyperterminal verstuur ik karakters naar de AVR, die de AVR vervolgens op portb zet.

Mijn instellingen in hyperterminal zijn: 9600 8-N-1. Het baudrateregister van de AVR staat ingesteld op 23, zodat hij met een 3,6864 MHz. kristal een baudrate van 9600 baud zou moeten halen (3686400/(16*(23+1)).

Het probleem is echter dat de AVR niet op de ingestelde baudrate schijnt te lopen. Met het kristal van 3,6864 MHz. ontvangt de AVR niets, maar wanneer ik een 4 MHz. kristal gebruik, of de waarde in het UBRR aanpas naar 21 ontvangt de AVR wel iets (maar wat hij dan ontvangt is soms fout).

Mijn vraag is nu: wat doe ik fout?

- Beide kristallen heb ik al getest, en die geven de juiste frequentie.
- Ik heb ook al een andere 2313 geprobeerd, maar die geeft hetzelfde probleem

Duidelijk een geval van een verkeerd ingestelde klok.

Een AVR kan op meerdere klokken lopen, intern, extern, en dan ook nog verschillende typen. Extern snel, langzaam enz. Je dat ding natuurlijk wel vertellen waar die op moet lopen, dat doe je door de fuse bits in te stellen.

Kijk dus even in de datasheet van je 2313 om te kijken wel fuse bits je moet instellen voor het gebruik van jou kristal.

Je kunt dit het beste testen door vanuit de AVR iets richting je terminal te sturen. In de terminal kun je dan telkens de baud rate aanpassen totdat je ziet dat je de juiste karakters ontvangt. Die baudrate kun je dan weer gebruiken om terug te rekenen wat de klok is waar de AVR momenteel op loopt.

Waarschijnlijk loopt die op 1MHz.

[Bericht gewijzigd door Bastiaan op ]

Ik heb op mijn 2313 een oscillator van 10mhz, en gebruik gewoon de UART op 9600 Baud. Werkt perfect.

Hmm, de 2313 heeft geen klok opties dat ik weet. Alleen een externe klok. Daar zal het dus niet aan liggen. Heb je het aantal bits goed ingesteld in de AVR? Die kan namelijk ook 9 bits data verwachten. 3,7 / 8 * 9 = 4MHZ ongeveer!

Hyperterminal is trouwens geen goed programma voor dit soort zaken. Daar krijg ik nooit goede responses mee. Gebruik liever deze terminal. :)

ARGGGHHH...

[Bericht gewijzigd door Benadski op ]

Ik schaam mij diep...

Na enig klooien met de functie custom baudrate in de door Benadski aangegeven terminal kwam ik erachter dat er blijkbaar geen goede baudrate te vinden was. Na de zoveelste keer de code door te lezen zag ik eindelijk het volgende:

in TEMP,USR
sbrs TEMP,FE	; Return from interrupt if framing error occured (FE)
	reti

Oftewel: ik haalde alleen de data uit het register als er wel een framing error geweest was. |:-(

Nu ik sbrs in sbrc veranderd heb werkt het prima.