AT90S2313 als I2C-Slave (Software-Implementierung)
Hallo zusammen,
ich habe mal das Thema I2C für AVR-Mikrocontroller ohne die entsprechende Hardwareunterstützung umgesetzt. Ausgehend von den originalen Atmel-Applikationvorschlägen gibt es das jetzt als Assemblerprogramm und auch in C mit WinAVR unter http://www.talentraspel.de/portal/index.php?id=226.
Da diese Form der Umsetzung jedoch wenig Parallelität zulässt, habe ich das Ganze noch in veränderter Form als I2C-Servosteuerung (http://www.talentraspel.de/portal/index.php?id=227) und als I2C-PWM (http://www.talentraspel.de/portal/index.php?id=228) implementiert. Die Lösung arbeitet jitterfrei und lässt sich auch vom Ausfall der Kommunikation nicht stören.
Um die Ansteuerung vom PC aus auch ohne eigenes I2C-Interface zu ermöglichen, habe ich die Kommunikation über die ISP-Schnittstelle (http://www.talentraspel.de/portal/index.php?id=197) um eine I2C-ISP-Bridge (http://www.talentraspel.de/portal/index.php?id=229) erweitert.
Viel Spass beim ausprobieren, ich freue mich auf eure Kommentare.
Grüße,
Kai.
Viele (alle) Wege führen nach Rom ...
Sogar auf einem ATTiny13 kann man eine softwarebasierte I2C-PWM-Motorsteuerung realisieren. Der Code ist deutlich unter 1KByte, er kann also auch in einen ATTiny13 rein. Allerdings macht das so direkt keinen Sinn. Statt die PWM über den Timer-1 laufen zu lassen, muss man die Hardware-PWM verwenden. Das reicht aber in jedem Fall, da man aufgrund der geringen Pinzahl eh nur einem Motor vernünftig rechts/links mit PWM anschliessen kann.
Einfache Rechnung:
- ATTiny13 mit internem Takt => 6 I/O-Leitungen
- 2 fallen weg für I2C => 4 I/O Leitungen zur Motorsteuerung
- 3 brauche ich pro Motor wenn ich z. B. einen L298 direkt anschliesse (rechts, links und enable), damit ich Rechtslauf, Linkslauf, Stop und Leerlauf unterscheiden kann. Das kann ich nur über einen zusätzlichen Inverter auf zwei Leitungen reduzieren. Also passt in der einfachen Variante nur ein Motor dran.
Man kann zwar das Problem mit dem ATTiny13 auch lösen. Aber warum so kompliziert und warum immer wieder ein neues Design? Wenn es schon ein Tiny sein soll, dann einfach der zum AT90S2313 kompatible ATTiny2313. Quarz dran, Software rein und fertig. Mit einem 20MHz Quarz kommt man dann sogar auf 100KHz SCL.
Wenn mir jemand einen vernünftigen Grund liefert, warum eine solche Lösung unbedingt mit einem ATTiny13 gemacht werden soll, baue ich das eventuell mal um.
Die I2C-Ansteuerung des voeliegenden PWM-Moduls kann am besten nachvollzogen werden, wenn man sich das zugehörige Testprogramm anschaut. Ausserdem sieht man im Slave-Programm in der Hauptkommunikationsschleife einen Programmteil, der die empfangenen Kommandos auswertet und die Parameter für die interne PWM-Routine neu stetzt.
Es gibt Kommandos zum Setzen des PWM-Anteils für die einzelnen Motoren, Kommandos für rechts/links/stop pro Motor und ein generelles RESET-Kommando zum Rückstellen des Moduls.
Grüße,
Kai.