Forum: Mikrocontroller und Digitale Elektronik AT90S2313 Code für ATtiny2313 angleichen


von Christian Nöding (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Mikrokontrollergemeinde,


ich habe ein Problem mit dem Umstieg vom leider abgekündigten AT90S2313
auf den ATtiny2313. Aber erst mal die Vorgeschichte, bevor ich konkret
zu meinem Problem komme:
mit einem AT90S2313 habe ich eine 128 Kanal Phasenanschnittssteuerung
weiterentwickelt, die ihren Ursprung im Elektor-Magazin hat.

Da der AT90S2313 z.B. in den USA und Kanada schon nicht mehr verfügbar
ist und auch bei uns irgendwann die Segel streicht, möchte ich den
Sourcecode für den ATtiny2313 angleichen.

Mit AVRStudio 4 wird der Code wunderbar kompiliert (ich nutze den
AT90S2313-Code nur mit tn2313def.inc, in der ja schon Register, wie USR
usw. schon in UCSRA usw. zur Kompatibilität umbenannt werden). Nach dem
flashen des ATtiny bootet der auch schön und die Status-LED leuchtet
korrekt.



Mein Problem liegt jetzt bei der Kommunikation mit dem Computer: Die
ist über die RS232-Schnittstelle und dem UART der Atmels (jetzt ja
USART) realisiert. Es wird ein 6 Byte-Frame vom PC gesendet und vom
Controller gecheckt. Wenn die 6 Bytes je 7 Daten-Bits und ein Bit für
den Framestart haben, dann ist es korrekt und es wird die Adresse (über
Schalter an PD3,PD4,PD5,PD6) mit vier Bits aus dem ersten Byte
verglichen. Wenn das alles passt, soll die LED blinken und die internen
Routinen werden mit neuen Daten gefüttert.

Nun blinkt die LED nur hin und wieder und zwar auch zu falschen
Adressen. Es wird auch nur murks in die Routinen geschickt, da
irgendwann plötzlich eine angeschlossene Lampe wild blinkt.


Meine Frage an euch: was muss ich im Sourcecode für Änderungen für den
ATtiny2313 machen, damit die RS232-Kommunikation richtig läuft? Die
Daten von Atmel haben mir nicht wirklich weitergeholfen, da ich in
Assembler eher ein Anfänger bin und meine Hauptarbeit in der
Windowssoftware liegt...


Der ATtiny2313 läuft auf externem Quartztakt mit 8MHz, habe auch den
internen Takt erfolglos versucht - scheint also leider wirklich am
Quelltext zu liegen.


wäre toll, wenn sich einer mal den Sourcecode im Anhang ansehen und mir
ein paar Tipps geben könnte :)



wer noch mehr Infos braucht: das PC_DIMMER-Projekt liegt auf
http://www.pcdimmer.de

von Christian Nöding (Gast)


Lesenswert?

Sorry, ich habe den AT90S2313-Sourcecode mit angehängt, statt des
ATtiny2313-Codes, aber einfach
".include "2313def.inc"
durch
".include "tn2313def.inc"
ersetzt denken - sonst sind die Codes ja identisch, da ich keine
Unstimmigkeiten gefunden habe. :-/


tschüss, Christian

von crazy horse (Gast)


Lesenswert?


von Christian Nöding (Gast)


Lesenswert?

Mit "Daten von Atmel" meinte ich genau dieses Dokument... da steht
letztendlich nur drin, dass im Tiny2313 neue Register drin sind, die
alten nur neu heißen, aber sonst identisch angesprochen werden.

Am Watchdog haben sie was getunt und die UART durch die neue USART
ersetzt. Deswegen habe ich doch hier gepostet :)

Ich kann keine, für mich relevanten Daten aus dem Dokument ersehen.
Alle Interrupts und Pins sind am gleichen Platz geblieben - ich
verstehe nicht, warum der Tiny2313 mein RS232-Frame nicht richtig
umsetzt...


gute Nacht,
Christian :)

von crazy horse (Gast)


Lesenswert?

guten Morgen :)
ist das nicht ungerecht, so früh aufstehen zu müssen - und das am
Samstag vor Pfingsten?

versuch doch probehalber mal, was zu senden, dann wirst du sehen, ob
zumindest der Baudratenkram stimmt.
Ich habe bis jetzt ein Projekt von 2313 auf Tiny2313 umgestellt.
Änderungen: UCSRA/B, UCSRC, UBRRH/L. Wenn ich mich recht erinnere, war
an den Interruptvektoren auch was zu drehen.
Zu guter Letzt: es gibt eine fuse CKDIV8, die kann dir auch jedes
timing kaputtmachen :-)

von Christian Nöding (Gast)


Lesenswert?

Tja, senden klappt ja, aber völlig unkontrolliert. Die Receive LED soll
ja bei jedem korrekt empfangenen RS232-Frame blinken, was sie mit dem
Tiny2313 aber nur dann macht, wenn ich wie irre Frames mit meinem
Programm verschicke. Also stimmt da was nicht.

Die Änderungen (UCSRA/B, etc.) sind dahingehend doch nicht nötig, dass
sie in der tn2313def.inc bereits drin sind. Wenn ich USR usw. schreibe,
wird das automtisch durch diese Datei korrigiert...


Was muss ich denn an den Interruptverktoren ändern? Kann ich überhaupt
wie gewohnt die Pins abfragen (PD0-PDx)??


An der Taktteilung wird es nicht liegen - habe sie mit AVRProg 1.40 auf
vollen 8MHz externen XTAL-Takt geschaltet!



bis denn,
Christian

von Christian Nöding (Gast)


Lesenswert?

Hallo,


hat denn keiner einen anderen Tipp für mich? Wenigstens einen Ansatz,
was ich im Quelltext falsch habe?

Im Internet scheint es (noch) keine konkreten Infos zum ATtiny2313 zu
geben, sodass ich nur hier Infos erhoffen kann :D



Vielleicht hat ja auch einer einen fertigen Sourcecode (egal wofür) für
nen ATtiny2313, wo ich mal schauen kann, wie man ne USART für den Tiny
aufbaut, oder wie die Source aussieht.


besten Dank und schönen Abend noch,
Christian :)

von marcel (Gast)


Angehängte Dateien:

Lesenswert?

also hier mal der noch nicht fertige code für mein zprog der läuft mit
einem externen 15 MHz takt.
ich denke mal das das dumme ckdiv8 fuse ist...
wie hast du den tiny mit avrprog programmiert (taucht in der 1.4 nicht
auf)

von Christian Nöding (Gast)


Lesenswert?

Nun, erst mal besten Dank für den Code! :) Werde da mal reinschaun. Mit
Klaus Leidingers AVR910-Programmer habe ich einfach den ATtiny2313 als
ATtiny26 beschrieben (letzte Einstellung in AVRProg 1.40. Damit klappts
offensichtlich (kam jedenfalls keine Fehlermeldung g)

ansonsten habe ich auch avrdude, aber dafür bin ich zu bequem


ich kann allerdings mit AVRProg die ckdiv8-Fuse NICHT explizit
ausschalten, allerdings müsste doch mit dem Umschalten auf externen
XTAL-Takt diese Taktteilung doch weg sein!?


Also, ich schau mir den Sourcecode mal an, vielleicht finde ich ja dann
das Problem ;)

nochmals danke!
Christian

von marcel (Gast)


Lesenswert?

das ist es ja wenn du das fuse nicht wegbekommst, geht das auch mit dem
externen Quarz nicht. die teilt den takt immer (hab mich da auch
gewundert, ... , aber es es so)
also wirst du dann doch avrdude oder ähnliches nehmen und die fuse
wegmachen müssen. (oder die 8x mit in die taktung einrechnen)

wenn du noch ein paar widerstände und zdioden und ein hw uart am pc
hast, dann bau dir ein si prog und nimm ponyprog das ist zwar auch
etwas umständlich aber geht immer noch.

ODER du nimmst ein terminalprogramm wie z.B. hyperterminal und ein
gerät, dass eine uart-spi bridge hat (der "new universal command"
müsste auch gehen - der ist schon drin) und gibst die spi-programm
befehle per hand ein. (deshalb will diesen befehl unbedingt in meinen
programmer einbauen - pc software ist schneller aktualisiert als die
programmer firmware - und der programmer kann dann auch eeproms und so
'n zeug beschreiben.)

viel erfolg

von Thomas (Gast)


Lesenswert?

Den Clock Prescaler kann man zur Laufzeit umstellen.

So läuft der Tiny2313 mit vollem Takt:

ldi r16,$80
out CLKPR,r16
clr r16
out CLKPR,r16

Gruß Thomas

von Christian Nöding (Gast)


Lesenswert?

Das werde ich gleich mal testen! Besten Dank! :)

Ich habe es mittlerweile auch geschafft, dass mein RS232 Rahmen
komplett gelesen wird und die Receive-LED richtig blinkt, aber die
ZeroCrossing-Detection-Routine läuft irgendwie nicht... das wird dann
ja wohl am Takt liegen... mal sehen

Bis denn,
Christian

von Christian Nöding (Gast)


Lesenswert?

hmm, wenn ich die obigen vier Zeilen in die Reset-Routine (nur beim
booten) reinbau, dann klappt der RS232-Empfang wieder nicht. Nur wenn
ich wie wild Daten verschicke, dann klappts irgendwann

ich lade mir nochmal ne andere Doku zum ATtiny2313 - ich dachte
Attiny2313 und AT90S2313 wären bis auf Zusatzregister kompatibel - so
ein Mist...


ich geb bald auf,
Christian

von Hauke Radtki (Gast)


Lesenswert?

naja du musst natürlich wieder die frequenzeinstellung im code anpassen!
sonst gehts nicht!

von Christian Nöding (Gast)


Lesenswert?

mein Code ist ja für 8MHz, ich habe nen externen 8MHz Quarz dran. Ohne
Taktteilung müsste dann doch für den Code die richtige Frequenz
anliegen...

Delphi zu programmieren ist leichter als Assembler, oder? lach



ich tüftel noch ein bisschen rum, falls aber sich einer erbarmt und mir
meinen Quelltext anpasst....... :D


bis denn, danke nochmal für die Hilfe.
Chris

von Mark Hämmerling (Gast)


Lesenswert?

Salve,

das hier ist jetzt kein wirklich konstruktiver Beitrag, aber ich wollte
nur mal bescheidsagen, daß ich meinen alten ("Crystal") Dimmer (auch
mit RS232) ohne irgendwelche Änderungen auf den Tiny übertragen konnte.
Das einzige, was ich machen mußte, war die Low-Fuse so einstellen, daß
er sich wie der alte 2313 verhält. Der Code ist identisch, auch das
alte 2313 Includefile hab ich so drin gelassen.

Das neueste Release unterstützt den ATtiny2313 daher offiziell:
http://sourceforge.net/project/showfiles.php?group_id=80137&package_id=81709

Es wundert mich, daß es bei Dir nicht funktioniert. Bei mir läuft der
Tiny inzwischen seit Wochen ohne irgendwelche Unterschiede (RS232
klappt einwandfrei, IR-Eingang und Nullerkennung ebenfalls) zum alten
2313.

Wie ist denn Deine Low-Fuse eingestellt?

Mir fällt grad was ein... hat der Tiny nicht auch zwei RX-Puffer? Da
muß man die I/O-Register in einer festgelegten Reihenfolge auslesen.
Nur so als Idee... hab Deinen Source jetzt nicht angesehen.

Viel Erfolg bei der Suche!

Mark

von Christian Nöding (Gast)


Angehängte Dateien:

Lesenswert?

Hi Mikrocontrollergemeinde,

nachdem ich seit Mai diesen Jahres erneut stundenlang wieder über
meinem Problem mit dem Tiny2313 gesessen habe, bin ich endlich auf die
Lösung gekommen. Da andere Leute sicher auch mal zu diesem Problem
kommen werden, möchte ich nun hier kurz erläutern, wie ich meinen
AT90S2313 Code unter dem ATTiny2313 zum laufen bekommen habe.

Das Problem waren die Fusebits, die laut doc4298.pdf von Atmel
angeglichen werden müssen. Es lag, wie schon vermutet, an dem ClockDiv,
der den 8MHz Takt auf 1MHz runterschraubt. Allerdings war ich bis eben
nicht in der Lage, diese mit AVRdude zu verändern.

Vorgehensweise:

1) Textdatei mit Notepad erstellen und "0xDC" bzw. "11011100"
eintragen (CLKDIV wech und CLKSEL AT90S2313 kompatibel machen).

2) Datei nicht als ANSI, sondern als Unicode(!!!)-Datei abspeichern
(hier: "attiny2313patch"). Darauf bin ich erst SEEEHR spät gekommen.

3) in der Kommandozeile von Windows folgenden Befehl eingeben:
"avrdude -p t2313 -c avr910 -C avrdude.conf -P com1 -U
lfuse:w:attiny2313patch"

4) Freuen, dass alles so einfach war und keiner das gesagt hat.


Ich hoffe, das hilft verzweifelten Suchern, wie ich einer war g



PS: im Anhang hängt eine Zip-File, in der AVRdude und eine kleine
Batchfile drin sind, mit denen man den Tiny2313 patchen kann.



beste Grüße und nochmals danke an alle Ideengeber,
Christian Nöding


endlich ist dieser Thread (jedenfalls für mich) "CLOSED"

von Sssssss (Gast)


Lesenswert?

Fuse setzen geht auch einfacher. zB: low=0x9F, hi=0xC9:
avrdude .... -U lfuse:w:0x9f:m -U hfuse:w:0xc9:m

von Christian Nöding (Gast)


Lesenswert?

Das hatte bei mir nicht hingehauen, da er immer motzte, dass die
Datei(?) in einem ungültigen Zustand war. Er nam die 0xc9 nicht als
Hex-Wert, sondern als Dateiname. Oder ändert das ":m" dahinter was?
Das hatte ich nicht versucht.

Das kann ich beim nächsten Flashen mal probieren :) Danke für den
Tipp!


tschö,
Christian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.