Hallo zusammen,
ich verzweifel langsam bei der Aufgabe ein Signal vom PC-Terminal HTrem
an den ATtiny 2313 zu schicken. Der Interrupt wird einfach nicht
ausgelöst.
Ich benutze das Pollin Entwicklungsboard 2.01 und den externen Quarz mit
8Mhz. Die Fuses habe ich im AVR Studio 5 auf 8Mhz Externer Quarz mit
maximaler Verzögerung eingestellt.
Zum Test hab ich mal den RX und TX Pin am Ausgang des MAX 232
kurzgeschlossen, um zu sehen ob ich ein Echo bekomme. Dabei habe ich
festgestellt, dass das Terminal ordnungsgemäß sendet. Senden geht mit
der USART jedoch nicht empfangen.
Hier ist mein kleines Programm. Ich initialisiere auf 9O1 Daten-Frame
und 9600 baud. Dann schalte ich den Empfänger und Receiver ein und gebe
den Interrupt mit RXCIE frei. Dann stelle ich eine ISR zur Verfügung mit
dem Argument USART_RX_vect. Darin lese ich UDR aus in schreibe in ein
Buffer. Anschließend gebe ich den Inhalt als Echo wieder an UDR aus und
schalte eine LED ein. Im Hauptprogramm setze ich die globale
Interrupt-Freigabe mit sei().
Soweit so gut, aber es funktioniert nicht! Auch habe ich einen anderen
ATtiny 2313 ausprobiert, mit dem selben Ergebnis. Was mache ich falsch?
Zur Erklärung:
Ich lese Sensoren mit 9O1 Daten-Frame aus. Ich weiß, dass das Terminal
das nicht erkennt. Es müssen aber zumindest Daten ankommen, wenn auch
zerstückelt und unleserlich.
Wenn ich den Sensor an den RX-Pin vom Tiny lege passiert nichts. Lege
ich ihn direkt an den Max 232 kann ich den Datenstrom am Terminal
auslesen. Das serielle Sensorsignal scheint in Ordnung zu sein.
Das die Interrupt-Routine nicht erreicht wird sieht mann auch daran,
dass die LED nicht eingeschaltet wird.
Kann es sein, dass die Interrupt-Einsprungadressen falsch vom Compiler
gesetzt wurden?
Ciao
Daniel
Funktionniert die LED überhaupt? Eine andere Ausgabemethode hast du ja
derzeit nicht. [EDIT] Übersehen, dass du die Daten zurücksendest.
[/EDIT]
Hat zwar erst Bedeutung, wenn du in die ISR kommst aber wenn du 9
Datenbits hast, dann musst du sie auch korrekt auslesen, auch wenn du
nur (absichtlich?) die unteren 8 Bits abspeicherst.
Datasheet UCSRB Register:
Bit 1 – RXB8: Receive Data Bit 8
RXB8 is the ninth data bit of the received character when operating with
serial frames with nine
data bits. Must be read before reading the low bits from UDR.
Selbiges gilt dann auch fürs senden mit TXB8.
Christopher G. schrieb:> Funktionniert die LED überhaupt?
Die LED funktioniert. Ich habe sie testweise mal mit PORTD |= (1<<PD6)
im Hauptprogramm eingeschaltet.
Hat keiner eine Idee woran es liegen könnte?
Also, halten wir mal fest:
- LED geht
- Sensor geht
- Code passt in etwa (manchmal vertraust du auf die Defaultwerte der
Register)
Hast du mal die Leitung vom Sensor zum ATTiny kontrolliert (d.h.
durchgepiepst und gemessen)? Am richtigen Pin angeschlossen? Für den
richtigen ATTiny kompiliert?
Was anderes, wenn du hier mit dem Sensor testest, warum schickst du ihm
dann die Daten zurück? Oder testest du mit dem PC? Dann geht 9O1 nicht.
Hallo,
schau mal im Datenblatt bei UCSRB
• Bit 1 – RXB8: Receive Data Bit 8
RXB8 is the ninth data bit of the received character when operating with
serial frames with nine data bits. Must be read before reading the low
bits from UDR.
• Bit 0 – TXB8: Transmit Data Bit 8
TXB8 is the ninth data bit in the character to be transmitted when
operating with serial frames with nine data bits. Must be written before
writing the low bits to UDR
Viel Erfolg
gatsby
Christopher G. schrieb:> - Code passt in etwa (manchmal vertraust du auf die Defaultwerte der>> Register)>>>> Hast du mal die Leitung vom Sensor zum ATTiny kontrolliert (d.h.>> durchgepiepst und gemessen)? Am richtigen Pin angeschlossen? Für den>> richtigen ATTiny kompiliert?>>>> Was anderes, wenn du hier mit dem Sensor testest, warum schickst du ihm>> dann die Daten zurück? Oder testest du mit dem PC? Dann geht 9O1 nicht.
Stimmt manchmal vertraue ich einfach den Defaultwerten. Vielleicht
sollte ich die Register byte weise adressieren. Danke! Das ist ein
Anhaltspunkt.
Also der Sensor gibt seine Daten einwandfrei raus. Das habe ich mit dem
Pegelwandler MAX 232 und dem PC getestet. Der tiny bekommt definitiv
Daten am RX-Eingang "PD0" bereitgestellt.
Ich benutze den ATtiny 2313 ohne Zusatz "a", da bin ich mir ganz sicher,
das habe ich auch im AVR Studio so eingestellt.
Das Terminalprogramm HTerm habe ich nur Testweise verwendet um zu
prüfen, ob überhaupt Signale empfangen werden. Ich benutze den Sensor an
PD0 als Datenquelle. In der Interrupt-Routine gebe ich zu Testzwecken
das Signal an das PC-Terminal weiter. So gesehen also kein Echo an den
Sender. 9O1 geht mit dem PC, wenn mann das Paritätsbit opfert. Dann
kommt aber nur Schrott raus.
Woher weißt du, dass der Tiny Daten bekommt? Nur weil der Sensor sie
ausgibt heisst das noch lange nichts. Hast du die physikalische
Verbindung von Tiny zu Sensor geprüft (Datenleitung, GND, ggf VCC)?
Halte dich mal an die wiederholt gepostete Vorgehensweise für 9
Datenbits, sofern noch nicht geschehen. Zusätzlich noch die LED als
allererstes in der ISR andrehen, bevor du irgendwas anderes machst.
Ich habe den Tiny aus der Schaltung genommen und RX und TX am IC-Sockel
verbunden. Ich bekomme kein Echo am PC-Terminal! Also ist mein
Entwicklungsboard defekt.
Naja, das wollte ich nur mitteilen damit der Thread zu einem sinnvollen
Abschluß kommt. Der obige Code funktioniert übrigens einwandfrei!
Danke an alle, die versucht haben mir zu helfen.
Ciao
Daniel