USI-UART mit ATTiny85: MSB kaputt

OP #7605134
Lesenswert?

Servus zusammen,

Seit einiger Zeit versuche ich einen half duplex USI UART auf dem ATTiny85 zu implementieren. Das ganze noch in Rust, als gute Gelegenheit Erfahrung zu sammeln. Irgendwann soll das mal Sensorwerte via RS-485 verschicken. Screenshot des Schaltplans anbei.

Inzwischen funktioniert das Senden schon ... fast! Ich kann (unglaublich) meinen Testwert 0x45 und 0x00 verschicken und auf Tx/PB1 kommt raus was ich erwarte (siehe rw_low.png). RS-485 ignorieren wir mal.

Dann hab' ich gemerkt, daß ich im Code noch vergessen habe, RW/PB3 auf HIGH zu setzen, damit der RS-485 transceiver auch sendet. Als das erledigt war, war das MSB von meinen Testwerten kaputt: aus 0x45 = 0b0100_0101 wurde 0xC5=0b1100_0101 und aus 0x00 wurde 0x80=0b1000_0000 (siehe rw_high.png). Was man in rw_high.png ganz gut sieht: das MSB wird irgendwie auf HIGH gezogen, bevor es dann ganz kurz doch auf LOW geht.

Testwert 0xFF wird mit RW/PB3=LOW auch kaputt gemacht, zu 0x7F.

Und ganz ehrlich: ich habe keine Ahnung was da passiert. Es ist immer das MSB, immer abhängig von RW/PB3. Mein Aufbau ist auf einem kleinen, ordentlichen PCB, aber um einen möglichst minimalen Test zu habe, habe ich das ganze auch auf dem Breadboard aufgebaut, nur mit U1 (ATTiny85) und C1. Das Ergebnis ist genau das Gleiche.

Könnt Ihr mir da irgendwie weiterhelfen?

cu The Grue

PS:

  • In Sensor.zip ist der Rust code. Compiliert aber aktuell nur mit genau dem richtigen nightly build des Compilers 😬
  • In Sensor.zip finden sich auch die Pulseview-Quellen zu rw_*.png

PPS: Weil gerne nach der Motivation gefragt wird: Ich wollte mal wieder was mit 'nem möglichst kleinen µC machen, weil das letzte Mal schon 20 Jahre her ist oder so. In Rust, weil ich Rust lernen möchte. Die Kombination Rust auf so nem kleinen µC ist schon haarig, macht aber Spaß :)

Angehängte Dateien:
OP #7605240
Lesenswert?

Schon mal vielen Dank für die Hinweise zu den Problemen mit RS-485! Die werde ich nachher sicher gut brauchen können :)

Aber wie im ersten Post geschrieben:

1
RS-485 ignorieren wir mal.
2
[...]
3
um einen möglichst minimalen Test zu habe, habe 
4
ich das ganze auch auf dem Breadboard aufgebaut, nur mit U1 (ATTiny85) 
5
und C1. Das Ergebnis ist genau das Gleiche.

Drum hier auch nochmal der "Breadboard" "Schaltplan".

Angehängte Dateien:
#7605274
Lesenswert?

Markus G. schrieb:

Was man in rw_high.png ganz gut sieht: das MSB wird irgendwie auf HIGH gezogen, bevor es dann ganz kurz doch auf LOW geht.

Schaltest Du den Treiber zu früh ab? Woher stammt Dein Takt?

Und was schon angemerkt wurde: Internen Pullup für RXD aktivieren, sonst ist der beim Senden floating, und Du empfängst ggf. beim Senden Müll.

#7605928
Lesenswert?

Georg M. schrieb:

Der ATtiny85 ist schon 19 Jahre alt. Die neueren tinyAVRs sind besser ausgestattet.

Ist es dadurch schlechter? Ich spiele oft eine Orgel, die ca. 160 Jahre alt. Eigentlich ein ganz gutes Instrument... Die Werke von heute schon 338 Jahre alten J.S.Bach klingen schön... Die Werke von 199 Jahre alten Anton Bruckner mag ich auch gerne. Und hier so junge Tiny, nur 19 Jahre alt...

Was ATtiny85 betrifft: ich bin immer von drei Sachen abgeschreckt (nicht von Alter) - zu wenig Füße, kein JTAG und komische USI. Übrigens, es gibt Sachen, wo USI gut wäre. Dann lieber so etwas wie ATmega645 oder ATmega649 nehmen: USI und USART zusammen und gleichzeitig. Auch JTAG, viele Füße und viel mehr SRAM und FLASH als bei ATtiny85.

Sonst, wenn keine andere Gedanken, nehme ich fast immer ATmega1284. Wenn ich als Liebhaber nur gelegentlich etwas bastele, ist es vernünftig, mit weniger Typen zu hantieren: so lernt man sie besser und so macht man folglich weniger Fehler. Preis ist dann zweitrangig, und für die meisten Aufgaben ist ATmega1284(P) ausreichend. Es sei denn, man braucht mehr als zwei USART und mehr Füße, dann kommt ATmega2560 in Frage, zwar etwas schwieriger zu löten, geht aber auch... Diese zwei Typen würde ich für alles empfehlen. Für CAN noch AT90CAN128, aber man kann auch ohne, mit einem externen CAN-Controller alles machen. Aber 8-Füßler - wozu?

#7606467
Lesenswert?

Maxim B. schrieb:

Verschleiß von Flash ist dadurch inakzeptabel.

Da das nur in der Entwicklungsphase auftritt, das Flash des Tiny85 über 10000 Lösch/Schreibzyklen aushält, würde ich sagen: Du übertreibst.

Notfalls musst Du halt alle paar Monate einen neun Tiny85 für Dein Entwicklungssystem verwenden.

Ist das ein realistisches Szenario? Arbeitest Du monate-, gar jahrelang immer mit genau dem selben µC und änderst weder dessen Firmware noch lässt dessen Firmware selbst das Flash beschreiben, und bestehst Du dann auch noch darauf, diesen "Entwicklungs"-µC weiterhin in der fertigen Zielschaltung betreiben zu können?

Ernsthaft?

#7606807
Lesenswert?

Harald K. schrieb:

Da das nur in der Entwicklungsphase auftritt

Für Liebhaber, zum Unterschied von Profis, gibt es nur die Entwicklungsphase.

Na ja, vielleicht kann man auch aus 8-Füßler was vernünftiges machen. Etwas ganz einfaches... Aber gerade für Liebhaber ist Debug am wichtigsten. Profi kann auch ohne oder mit Minimum von Debug alles richtig machen. Deshalb würde ich kleine Tiny lieber für Profi lassen, wo es um Serienprodukt geht und wo Kosten minimiert sein sollten. Für private Projekte lieber etwas Größeres nehmen, mit 40 Fuß und mehr.

Das merke ich selbst: als Liebhaber habe ich keine Möglichkeit, Tag für Tag mit Mikrocontrollern zu hantieren. Wenn wieder nach einigen Monaten Bedarf besteht, muß ich vieles wieder erfrischen. Deshalb Fehler, Fehlersuche und Programm schrittweise. Bei Debugwire bedeutet aber jeder (!) Schritt eine Umprogrammierung von Tiny. 1000 Schritte und keine Garantie weiter, Schluß... In SO-8 heißt das Umlöten, dann wird Platine vielleicht beschädigt, wieder eine neue Platine (gut daß man in China gleich 5 Stück macht), andere IC, R, C, L und alles mögliche löten...

#7606850
Lesenswert?

Maxim B. schrieb:

Na ja, vielleicht kann man auch aus 8-Füßler was vernünftiges machen. Etwas ganz einfaches... Aber gerade für Liebhaber ist Debug am wichtigsten. Profi kann auch ohne oder mit Minimum von Debug alles richtig machen. Deshalb würde ich kleine Tiny lieber für Profi lassen, wo es um Serienprodukt geht und wo Kosten minimiert sein sollten. Für private Projekte lieber etwas Größeres nehmen, mit 40 Fuß und mehr.

Wo ist das Problem? Auch die 8-Pin-Tinys haben ein Debug-Interface.

1
 
2
ATtiny412:
3
 
4
• Single-cycle I/O access
5
• Two-level interrupt controller
6
• Two-cycle hardware multiplier
7
• Single-Pin Unified Program and Debug Interface (UPDI)
8
• One 16-bit Timer/Counter type A (TCA) with a dedicated period register and three compare channels
9
• One 16-bit Timer/Counter type B (TCB) with input capture
10
• One 12-bit Timer/Counter type D (TCD) optimized for control applications
11
• One 16-bit Real-Time Counter (RTC) running from an external crystal, external clock, or internal RC oscillator
12
• One USART with fractional baud rate generator, auto-baud, and start-of-frame detection
13
• One host/client Serial Peripheral Interface (SPI)
14
• One Two-Wire Interface (TWI) with dual address match, Philips I²C compatible
15
• Analog Comparator (AC) with a low propagation delay
16
• 10-bit 115 ksps Analog-to-Digital Converter (ADC)
17
• 8-bit Digital-to-Analog Converter (DAC) with one external channel
18
• Multiple voltage references (VREF)
19
• Event System (EVSYS) for CPU independent and predictable inter-peripheral signaling
20
• External interrupt on all general purpose pins
21
 

https://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ProductDocuments/DataSheets/ATtiny212-214-412-414-416-DataSheet-DS40002287A.pdf

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren