PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AT Tiny mit 57600Baud?



Chris266
22.09.2006, 07:42
Hallo zusammen,

kurze Frage: gibt es einen möglichst kleinen Prozessor der Daten über eine "virtuelle" (siehe Bascom) oder echte (UART) serielle Schnittstelle mit 57600baud auf TTL Ebene senden und empfangen kann - OHNE einen externen Quarz?

Mit klein meine ich die üblichen 8 PIN Prozessoren. SMD traue ich mir nicht zu.

Anders formuliert:

Suche einen möglichst kleinen Prozessor der es mir ermöglicht Daten seriell (mit oder ohne Hardware UART) und mit 57600baud zu empfangen als auch zu senden (TTL Signale).

Die Picaxe gehen ohne externen Quarts nur bis 2400baud zuverlässig(max. 4800).

RAM/FLASH etc. spielt kaum eine Rolle. 64Bytes SRAM und 256 Bytes Flash sind ausreichend.

Ich schätze jedoch dass die internen Quarze für diese Baudrate alle zu klein sind? :-s

Danke!

Kosta
23.09.2006, 10:22
Ich glaube Du wirst wenig Glück haben!!

Die meisten internen Oszillatoren der AVR Familie (bis auf wenige Ausnahmen
z.B. ATtiny 15 hat einen 1,6 MHz Oszillator) sind geradzahlig d.h. 1, 4 und 8 MHz).

Aus diesen Frequenzen lassen sich nicht alle Baudraten generieren!!!

http://www.rowalt.de/mc/avr/toolsd.htm

Hier findest Du ein Tool (Baud_Calc) zum berechen der Baudrate. Der prozentuale Fehler sollte kleiner als 2% sein, ansonsten funktioniert die Übertragung nicht oder nicht einwandfrei.

Beste Möglchkeit deine Baud von 57600 zu erzeugen ist ein externer Quarz mit einer Frequenz von 7,3728 MHz.

Aus dieser Oszillator Frequenz lassen sich alle gängige Baudraten generieren

Chris266
24.09.2006, 09:00
Vielen Dank, hatte ich befürchtet.

Doch so schnell möchte ich nicht aufgeben.

Ich wünsche einen iRobot Roomba zu steuern, dieser Kommuniziert default mäßig mit 57600Baud.
Mit einem kleinen Trick lässt sich der auf 19200Baud umschalten.

Meine favorisierte CPU ist diesmal ein PicAxe 08M. Jetzt bitte nicht meckern: ich habe selbst die ATMegas auch schon programmiert und Zuhause rumliegen: sehr gute CPUs!

Der PicAxe 08M hat die Eigenschaft 4Mhz zu haben und den Opcodeschonenden "serin" und "serout" Befehl zu besitzen. Doch leider unterstützt dieser nur offiziell 2400Baud bei 4Mhz.


Ziel ist es nun dem Roomba über 19200Baud mitzuteilen dass dieser 2400 Baud zu verwenden hat.

Dazu muss der PicAxe folgende Bytes mit 19200Baud (die offiziell nicht unterstützt werden) an den Roomba senden:

1) Byte mit dem Wert: 128
2) Byte mit dem Wert: 129
3) Byte mit dem Wert: 3

Erst dann verwendet der Roomba 2400Baud.

Es existiert ein "PulsOut" Befehl im PicAxe mit dem sich Pulse generieren lassen mit einer Mindeslänge von 10us.

D.h. bei 4Mhz würde der Befehl "PulsOut 3,1" einen Puls an Pin 3 mit einer Dauer von 10us Sekunden ausgeben.

Da wie gesagt der eigentliche "SerOut" Befehl keine 19200Baud unterstützt müsste ich diese Bytes von "Hand" senden.

Glücklicherweise lässt sich der PicAxe kurzzeitig und per Software auf 8Mhz umschalten. Damit hätte ich dann eine "Genauigkeit" von 5us.
D.h. das Kommando "PulsOut 3,1" würde nun einen Puls erzeugen der nur 5us (0,000005) Sekunden lang ist.

Laut Wikipedia muss ein Bit bei 19200 Baud 52us Sekunden betragen.
Mit Start und Stop bit dauert eine Übertragung von einem Byte also 10x52us=520us.

Zu übertragene Zeichen:
Dez=Binär
128=10000000
129=10000001
003=00000011
Mit Start und Stopbit sowie der Umgekehrten Reihenfolge der Bit wie sie später also seriell übertragen werden (Startbit=0, Stopbit=1), ergeben sich zu erzeugende (logische) Signale:

0 00000001 1 - 0 10000001 1 - 0 00000011 1
~~~~~~~~~~~~~~~~~~~~
Also:
für 8x52us=416us muss eine 0 anstehen
für 2x52us=104us muss eine 1 anstehen
für 1x52us=052us muss eine 0 anstehen
für 1x52us=052us muss eine 1 anstehen
für 6x52us=312us muss eine 0 anstehen
für 2x52us=104us muss eine 1 anstehen
für 7x52us=364us muss eine 0 anstehen
für 3x52us=156us muss eine 1 anstehen
SUMME=1560us

D.h. ich muss diese Bits "manuell" mittels PulsOut "simulieren".

Da der vielfache, bzw. die kleinste Einheit von "PulsOut" 5us ist, kommt es da wirklich auf eine us an oder ist eine geringe Ungenauigkeit erfahrungsgemäß erlaubt?
Also:
415us muss eine 0 anstehen
105us muss eine 1 anstehen
50us muss eine 0 anstehen
50us muss eine 1 anstehen
315us muss eine 0 anstehen
105us muss eine 1 anstehen
365us muss eine 0 anstehen
155us muss eine 1 anstehen
SUMME=1560us

Ich hoffe mich klar ausgedrückt zu haben.
In der Doku vom PicAxe wird beschrieben dass die Baudrate und einem internen Taktgeber von der Temperatur abhängig ist, diese Abweichung kommt natürlich hinzu.

Sollte sich jemand dieser Denksportaufgabe gewachsen fühlen wäre ich einer Antwort dankbar!