PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AtTiny26 per UART mit Computer verbinden



BurningWave
08.11.2008, 20:45
Hallo,

ich habe hier einen AtTiny26, den ich mit der UART Schnittstelle mit dem Computer verbinden (also an die serielle Schnittstelle anschließen) will, um Daten auszutauschen. Dieser µC hat zwar keine UART-Schnittstelle, diese würde ich aber per Software nachbilden.

Meine Fragen sind jetzt:
1. Wie ist die Pinnbelegung der seriellen Schnittstelle?
2. Wie muss man den µC an die Schnittstelle anschließen (welche Anschlüsse außer RxD und TxD benötige ich noch)?
3. Was für ein Terminalprogramm kann man für die Datenübertragung verwenden?

Danke für eure Hilfe,
_R2D2

Besserwessi
08.11.2008, 21:57
Der Tiny26 hat keine Hardware UART. Man muß also eine Software UART nehmen. Welche Pins man da nimmt ist ziehmlich egal. Das Eingangssignal legt man aber am besten auf einen Interruptfähigen Eingang wie ICP, INT0, INT1.
Normaler weise reichen GND, TxD und RxD. Handshake-Leitungen werden eher selten genutzt. Bei der 9 Poligen Sub D buchse sind da Pins 5, 2 und 3 . Wobei man etwas aufpassen muß mit RxD und TxD, je nach kabel werden die auch mal getauscht.


Als Terminalprogram reicht Hyperterm. Auch das Terminal Program in der BASCOM mgebung ist recht gut.

McJenso
09.11.2008, 11:01
Hallo,

bei vielen Tinys ist nur noch das abgespeckte USI vorhanden. Bevor ich den UART komplett in der Software realisiere, würde ich mir das Interface schon genauer anschauen. Selber habe ich bisher nur SPI mit dem USI realisiert. Habe aber auf den ersten Blick im Datenblatt schon Register für Start und Stop 'Condition' gefunden. Da ist bestimmt was möglich. :-)

Gruß

Jens

Besserwessi
09.11.2008, 13:12
Es gibt für die Software UART in den Application notes von Atmel Beispiel mit und ohne USI. Mir kam die Lösung ohne USI einfacher vor. Vor allem hat man da mehr Freiheiten bei der Baudrate. Die Lösung mit USI ist was für hohe Baudraten, die dann aber zum Quarz passen müssen.

oberallgeier
09.11.2008, 14:14
Hi _R2D2,


... AtTiny26 ... mit der UART Schnittstelle mit dem Computer verbinden ... um Daten auszutauschen ...Vor ein paar Tagen hatte ich meinen tiny2313 rausgekramt, der hat ein Hardware-UART. Ich hatte den ein paar Bemerkungen ausgeben lassen an den PC. Das Programm war sonst unbedeutend, Sprache C. Seltsamerweise hatte sich da garnix getan, bis mir aufgefallen war, was im AVRStudio unter den Compilier-Daten stand: Data: irgendwas und 150.0% Full. Und das blos bei ein paar wenigen, sehr kurzen Wörtern. Als ich auf 96% runter war, lief das Ganze - aber die Ausgabe war dann von einer völlig ungenügenden Länge.

Fazit:
Der Speicher vom tiny2313 - der genauso groß ist wie der vom t26 - reicht für ein paar Datenausgaben nur SEHR knapp. Mir reichte er nicht.

Allerdings gäbe es ein lustiges Spielchen mit wenig Speicherbedarf: lass den tiny das zurücksenden, was er zugesandt bekommt.

BurningWave
09.11.2008, 14:58
@oberallgeier
ich möchte nur die Werte von ein paar Variablen an den Computer versenden. Dazu müsste der Speicher auf jeden Fall ausreichen.

Danke für eure schnelle Hilfe.
mfg
_R2D2

PS.:
Mir ist gerade noch etwas eingefallen: Ist es möglich jeweils eine LED einzuschalten, wenn Daten mit RxD empfangen, bzw. mit TxD gesendet werden?

Besserwessi
09.11.2008, 17:38
Meistens kann man an die RxD Leitung (z.B. zwischen Controller und max232, wenn man den denn braucht) einfach eine LED mit Vorwiderstand hängen.

Wenn der Speicher nicht reicht gibt es mitlerweilen auch Tiny461 und Tiny861 als Ersatz mit 4 bzw. 8 kB RAM. In Assembler kriegt man auch in den Tiny2313 oder tiny26 noch eine Menge rein. Viel mehr macht in ASM aber auch keinen Spaß.
Für meine bidirektionale Software UART mit zykischem Sende-Puffer habe ich nur etwa 200 Bytes gebraucht

BurningWave
10.11.2008, 14:41
Mir ist noch etwas aufgefallen, die serielle Schnittstelle arbeitet doch mit 12V, das ist doch zuviel für den µC. Muss man da noch Widerstände dazwischen schalten? Wenn ja, wo genau und welche Werte?

mfg

McJenso
10.11.2008, 15:13
Hallo,

Max232 (http://www.elektronik-magazin.de/page/der-pegelumsetzer-max232-15)

Gruß

Jens

BurningWave
10.11.2008, 15:19
Geht es auch einfacher (ich habe gerade keinen Max232 da)?

Besserwessi
10.11.2008, 16:24
Es geht auch einfacher, ist dann aber nicht mit ganz RS232, sondern nur so was ähnliches, was fast alle PCs noch akzeptieren. Vom PC zum µC kann man einen Spannungsteiler und ggf. eine Diode gegen die Negativen spannungen nehmen. Wegen der Invertierung geht das auch gut mit einem Transistor, einer Diode gegen die Negativen Spannungen und ein paar Widerständen. Das geht dann sogar noch weitgehend normkonform.

Von µC könnte man im einfachsten Fall direkt das 0/5 V Signal Rausgeben, fast alle Pcs kommen damit klar. Als Schutz, zur invertierung und auch um ein paar HF Störungen weniger zu haben, ist es aber besser auch hier einen Transistor als Inverter dazwischenzuschalten.
Ein Beispiel gibt es z.B. in Atmel Appl. Note 910, dem einfachen seriellen Pragrammierer.

Wenn man will kann man das Ganze auch mit Optokopplern machen. Dann geht auch eine einfache isolierte UART, bis 9600 Baud, deutlich darüber wirds schwieriger.

BurningWave
10.11.2008, 17:06
@besserwesi
Das habe ich nicht so ganz verstanden.

Kann man nicht einfach jeweils einen Widerstand zwischen RxD bzw. TxD an der seriellen Schnittstelle und TxD bzw. RxD am µC schalten?

oberallgeier
10.11.2008, 17:12
... ich habe gerade keinen Max232 da ...So und ähnlich ging es mir anfangs immer wieder und auch jetzt noch häufig. Es ist gerade kein "IrgendeinpassendesTeil" da. Bei Teilen für 50 Zent ist das ein bescheidenes Argument. Mittlerweile habe ich auf vielen Platinen einen Max232 drauf - und in Notfällen ziehe ich die beiden TTL-Strippen zu einer passenden Platine. Das funzt auch.

BurningWave
10.11.2008, 17:19
So und ähnlich ging es mir anfangs immer wieder und auch jetzt noch häufig. Es ist gerade kein "IrgendeinpassendesTeil" da. Bei Teilen für 50 Zent ist das ein bescheidenes Argument. Mittlerweile habe ich auf vielen Platinen einen Max232 drauf - und in Notfällen ziehe ich die beiden TTL-Strippen zu einer passenden Platine. Das funzt auch.


Ich habe gerade kein passendes Teil da und wohne auch nicht in der Nähe eines Elektronikfachgeschäftes. Ich müsste mir welche bestellen, was auch seine Zeit braucht.

Besserwessi
10.11.2008, 19:12
So hier noch mal die Einfache Schaltung als Plan. Den 470 Ohm Widerstand vor dem Ausgang kann man auch ganz gut weglassen.
Die Schaltung sollte mit fast allen PCs gehen, ist aber besonders auf der Senderseite nicht normkonform.

BurningWave
10.11.2008, 19:26
@Besserwessi
Danke

BurningWave
13.11.2008, 18:46
Jetzt habe ich dei Schaltung aufgebaut , doch empfängt Hyperterminal keine Daten, stattdessen bekomme ich folende Fehlermeldung angezeigt:


Wnindows has reported a TAPI error (80000048). Use the Phone and Modem Options icon in the control panel to ensure that a modem is installed properly.

Was bedeutet das im Klartext?

Kann ich zwei Transistor vom Typ BC547A nehmen?

mfg

Besserwessi
13.11.2008, 19:00
Der BC547 sollte als Typ für die Schaltung richtig sein.

Die Fehlermeldung läßt darauf schließen, das da noch eine Treiber für an Modem an der Serielle Schnittstelle installiert ist. Den Treiber wird man wohl erst entfernen müssen. Es könntematürlich auch sein das nur die Einstellungen beim Hterm fasch sind: da darf kein Modem eingatragen sein, sondern nur COM1, COM1 direkt oder so.

BurningWave
13.11.2008, 19:08
Ich habe an meinem Computer noch nie einen Modem Treiber installiert / ein Modem angeschlossen und finde im Geräte-Manager auch keinen entsprechenden Treiber.

Besserwessi
13.11.2008, 22:09
Die Fehlermeldung sollte daher kommen, das Windows versucht eine Modemverbindung herzustellen.
Was steht denn im Hyperterminal unter Datei-Eigenschaften unter "Verbindung herstellen über" ? da sollte sowas wie COM1 stehen.

BurningWave
15.11.2008, 11:39
Da steht auch COM1. Die Einstellungen sind alle richtig.

McJenso
15.11.2008, 12:01
Hallo,

vergiss bitte Hyperterminal. Nimm z.B. hterm (http://www.der-hammer.info/terminal/).
Dann setzt mal eine Brücke zwischen die Controller Pinne TxD und RxD. Pinne dafür auf Eingang oder am besten Programm vorher vom Controller löschen. Jetzt müsstest du, wenn du Zeichen vom PC losschickst, die selben als Echo wieder empfangen.

Gruß

Jens

BurningWave
15.11.2008, 12:28
Ich habe vergessen, die Baudrate umzustellen und habe auf einmal etwas empfangen. Also der Controller sendet irgendetwas, nur nicht das, was ich will. Ich werde jetzt mal einen externen Quarz anlöten und schauen, ob ich dann bessere Ergebnisse bekomme.

Hier ist mal mein Code:

PCF8574P
15.11.2008, 13:50
Fusebits richtig gestellt? Wegen Internen und externen quarz?

Besserwessi
15.11.2008, 14:39
Die Warteschleifen solle der Compiler wegoptimieren, außer bei -o0. da sollte man besser fertige delays nehmen, sonst zur not eine "volatiles NOP" in die Schleife". In C wäre sonst die benutzung eines timers oder doch der USI sicher von Vorteil. Mit aktiven Warteschleifen wird da immer ein Ziehmlicher Abgleich bis es geht, und schon bei der nächsten Compilerversion gehts von vorne los.

BurningWave
15.11.2008, 14:46
Durch was genau soll ich die Warteschleifen jetzt ersetzen?

BurningWave
15.11.2008, 14:53
Kann man nicht einfach


while((UART_PIN & (1 << UART_RXD)))
__asm__ volatile ("nop");

schreiben?

Besserwessi
15.11.2008, 16:51
Ich habe es noch nicht benutzt, aber wahrscheinlich wäre es in C am einfachsten den USI block zu benutzen. Da Wird der Bittakt per hardware erzeugt und man muss sich nur noch um start / stopbits kümmern, wenn ich mich richtig erinnere. Vermutlich sollte sich da eine Atmel Application note zu finden.