Autor |
Wo den C-Befehlssatz (gcc/WinAVR) für ATMega(8) finden? Suche nach: atmega (404) |
|
|
|
|
BID = 520990
BlackLight Inventar
Beiträge: 5309
|
|
Hallo.
Ich hab mal wieder meinen ATMega8(L) ausgegraben, diesmal zu WinAVR-20080411, AVR-Studio 4(SP2) und PonyProg gegriffen und eine Testplatine und einen LPT-ISP-Programmer gebastelt.
Als ersten Schritt dann von http://www.roboternetz.de oder http://www.mikrocontroller.net ein 'Hello World'-Programm besorgt und erfolgreich getestet. Nachdem das Basteln an fertigen Programmen seinen Reiz verloren hat, stehe ich nun vor dem Problem, dass mir eine Auflistung der wichtigen Befehle für den Mega8 in C (gcc/WinAVR) zur Realisierung meiner Ideen fehlen.
Auf die IOm8.h bin ich schon gestoßen, nur hilft deren Inhalt mir auch nicht weiter.
Um mein aktuelles Problem zu nennen, ich suche den Codeschnipsel für den Unterprogrammaufruf für den Overflow-Interrupt von Timer0.
(Müsste Richtung "ISR(TIMER0_OVF_vect) {}" lauten.)
Momentan stehe ich halt wie ein Ochs vorm Berg und weiss nicht, ob der Fehler an der Initialisierung, falschem Code oder fehlendem Oszi liegt.
Da das nicht mein letztes Problem sein wird, hier meine Frage:
Wo finde ich, bzw. gibt es eine Dokumentation, die den Großteil der Anweisungen erhält, die zu meiner C-Version passen und am liebsten noch zum ATMega8?
Oder gibt es nur die Möglichkeit sich irgendwoher einen unpassenden Codeschnipsel zu besorgen, so lange rumprobieren bis er für seinen Typ und Sprache passt? |
|
BID = 521006
elektroluchs Gesprächig
Beiträge: 194 Wohnort: Austria
|
|
Mit dem AVR-gcc wird ANSI-C programmiert, die Register für Spezialfunktionen sind im jeweiligen Datenblatt(!) des µC ersichtlich.
--Das Datenblatt des µC ist das wichtigste Dokument beim proggen!!!!!--
Diese Register heißen dann logischerweise auch bei avr-gcc gleich und sind in der ioxx.h definiert. (z.b.: iom8.h)
In der ioxx.h finden sich auch die Namen der Interruptvektoren.
Mich verwundert jetzt, dass du mikrocontroller.net schon erwähnt hast und trotzdem nach einer Doku fragst!?!?
mikrocontroller.net ist DIE Doku wenn es um AVR-Programmierung geht. Auf der Seite findet sich eine Doku sowohl für Assembler, als auch für C, die eigentlich alle Dinge die man für AVR-Programmierung braucht enthält. Auch für dein Problem ist da alles dabei
meg
_________________
So einfach wie möglich, aber nicht einfacher! (Albert Einstein) |
|
BID = 521007
BjörnB Stammposter
Beiträge: 242 Wohnort: Dortmund
|
|
BID = 521026
BlackLight Inventar
Beiträge: 5309
|
@BjörnB, Danke.
War irgendwie klar, dass ich den Wald vor lauter Bäumen nicht gesehen habe, danke für den kleinen RTFM-Rempler.
Die 16-seitige Interrupt-Tabelle(Seite 110ff) mit Namen und Typ - sehr schön. Danke.
Zitat :
elektroluchs hat am 11 Mai 2008 18:31 geschrieben :
|
--Das Datenblatt des µC ist das wichtigste Dokument beim proggen!!!!!-- |
Sehe ich anders. Meiner Meinung nach dient es Größtenteils dazu, den µC in Funktion und elektrischen Eigenschaften zu beschreiben. (Hab es gebunden hier liegen, geholfen hat es nicht viel.)
Zu µC.net, zum kurz mal Nachschauen sind die Tutorials bestimmt gut.
Im GCC-Tutorial stehen viele nützliche Tabellen mit Registerbelegungen, aber meiner Meinung nach als Einsteiger zu viele Programmbruchstücke, die ohne Kontext nicht viel bringen.
|
BID = 521031
ich2000 Gerade angekommen
Beiträge: 7 Wohnort: irgendwo
|
Zitat :
BlackLight hat am 11 Mai 2008 20:19 geschrieben :
|
Zitat :
elektroluchs hat am 11 Mai 2008 18:31 geschrieben :
|
--Das Datenblatt des µC ist das wichtigste Dokument beim proggen!!!!!-- | Sehe ich anders. Meiner Meinung nach dient es Größtenteils dazu, den µC in Funktion und elektrischen Eigenschaften zu beschreiben. (Hab es gebunden hier liegen, geholfen hat es nicht viel.)
|
Dann machst du irgendwas falsch. Ohne das Datenblatt kann man kein µC Programm schreiben (außer in BASCOM vielleicht, aber das ist für mich keine ernstzunehmende Programmiersprache).
Aus dem Datenblatt sind alle Register und Bitnamen ersichtlich, und man erfährt welche Funktionen diese haben.
|
BID = 521091
elektroluchs Gesprächig
Beiträge: 194 Wohnort: Austria
|
Ok, aber woher weißt du dann wie man richtig 16bit Register ausliest, den Timer richtig konfiguriert oder die serielle Schnittstelle richtig parametriert???? Was ist mit Fusebits setzen????
Bitte erklären! Danke
meg
_________________
So einfach wie möglich, aber nicht einfacher! (Albert Einstein)
|
BID = 521411
BlackLight Inventar
Beiträge: 5309
|
Offtopic :
| @ich2000 & elektroluchs, immer langsam mit den jungen Pferden, so weit bin ich lange noch nicht. Und wenn werde ich wohl bei µC.net reinschauen, falls es funktioniert. |
[ Diese Nachricht wurde geändert von: BlackLight am 13 Mai 2008 20:15 ]
|
BID = 521415
bastler16 Schreibmaschine
Beiträge: 2140 Wohnort: Frankreich
|
Offtopic :
|
Zitat :
elektroluchs hat am 11 Mai 2008 18:31 geschrieben :
|
--Das Datenblatt des µC ist das wichtigste Dokument beim proggen!!!!!-- | Sehe ich anders. Meiner Meinung nach dient es Größtenteils dazu, den µC in Funktion und elektrischen Eigenschaften zu beschreiben. (Hab es gebunden hier liegen, geholfen hat es nicht viel.)
|
Eine gebundene Version vom Datenblatt des mega8? Wo hast du das her?
|
|
BID = 521418
BjörnB Stammposter
Beiträge: 242 Wohnort: Dortmund
|
Ich hatte mir das Datenblatt auch vor einiger Zeit mal ausgedruckt und habe es immer parat liegen, wenn ich programmieren. Für die Konfiguration der Timer, Schnittstellen etc. ist es eigentlich unabdingbar, sofern ich nicht ein vorheriges Programm 1:1 recycle.
Schöne Grüße,
Björn
|
BID = 521478
BlackLight Inventar
Beiträge: 5309
|
Offtopic :
|
Zitat : bastler16 hat am 13 Mai 2008 20:31 geschrieben :
| Eine gebundene Version vom Datenblatt des mega8? Wo hast du das her?
| Bei mir fällt unter gebunden, doppelseitig ausdrucken und im örtlichen Copyshop eine Stahl-Klebebindung verpassen lassen.
|
|
BID = 521515
bastler16 Schreibmaschine
Beiträge: 2140 Wohnort: Frankreich
|
Offtopic :
|
Zitat :
BlackLight hat am 14 Mai 2008 00:20 geschrieben :
|
Zitat : bastler16 hat am 13 Mai 2008 20:31 geschrieben :
| Eine gebundene Version vom Datenblatt des mega8? Wo hast du das her?
| Bei mir fällt unter gebunden, doppelseitig ausdrucken und im örtlichen Copyshop eine Stahl-Klebebindung verpassen lassen.
|
Sowas hab ich mir schon gedacht. Ich brauche öfters das Mega8-Datenblatt und das Instruction Set (zusammen 450 Seiten ), ans Ausdrucken hab ich mich noch nicht gewagt... (Ein Laserdrucker ist wohl empfehlenswert.)
|
4. Edit, warum kann ich heute nicht richtig schreiben???
[ Diese Nachricht wurde geändert von: bastler16 am 14 Mai 2008 10:46 ]
|
BID = 522575
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Zitat :
| stehe ich nun vor dem Problem, dass mir eine Auflistung der wichtigen Befehle für den Mega8 in C |
Kannst du denn C?
So wie die Fragestellung formuliert ist, gehe ich davon aus, dass du mal Bascom Basic o.ä. verwendet hast. Es gibt hier eben nicht alles bereits vorgekaut oder gar fertig, sondern der Programmierer muss entweder entsprechend fertige, funktionstüchtige Bibliotheken einbinden oder aber diese, anhand des Datenblatts(!) selbst schreiben.
Da kommt es vor, dass man ein kleines Projekt mit 10 Dateien erstellt, von denen 5 Header- und 5 reine C-Quellkodedateien sind, aber der erzeugte Quellkode nichtmal 100 Byte groß ist - so ist das eben in ordentlichen Sprachen! Alles sauber trennen, denn dann kann man besser portieren oder generischer machen oder in anderen Projekten weiterverwenden.
Ich bin auch mittlerweile dazu übergegangen, alle wichtigen Definitionen im Makefile vorzunehmen.
_________________
|
BID = 524882
BlackLight Inventar
Beiträge: 5309
|
Zitat : DonComi hat am 19 Mai 2008 12:15 geschrieben :
|
Kannst du denn C? |
Nicht wirklich. Nur etwas Basic, V-Basic, Pascal, Delphi, Java, Matlab und Singular und evt. minimal LabView.
Zurück zu meinem Problem, der Timer0 geht nun - war ein ganz blöder Fehler, falls es mal jemand mal gebrauchen kann:
(Hatte den Timer nicht aktiviert. )
Code : |
// Timer0-Init
TCCR0 |= (1<<CS00)|(1<<CS02); // Timer0 initialisieren mit Teiler 1024
TIMSK |= (1<<TOIE0) // Timer0 aktivieren
// Interrupt-Routine - Timer0-Überlauf
ISR(TIMER0_OVF_vect)
{
//ISR-Code
} |
|
|
BID = 524965
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Hallo Schwarzlicht ,
Das sieht doch hervorragend aus!
Vielleicht ein Tipp:
Zitat :
| TCCR0 |= (1<<CS00)|(1<<CS02); |
Dort wird mit einem bitweisen ODER das Register TCCR0 maskiert.
In diesem Fall wird dieses Register nur von einem Timer benötigt. Mit dieser Operation wird aber nicht garantiert, dass alle anderen Bits auch auf 0 stehen! Sollten also, warum und wie auch immer, vorher im Register bestimmte Bitmuster gestanden haben, werden diese durch die Maske nur dahingehend verändert, dass diese beiden Bits gesetzt werden. Andere Bits werden nicht verändert. So kann man sich potentielle Fehler ins Programm holen, die sogar soweit führen können, dass der Timer nicht das macht, was man ursprünglich wollte.
Besser ist in diesem Fall, den Registerwert absolut festzulegen:
TCCR0 = (1<<CS00)|(1<<CS02);
Da sind dann alle Bits 0, bis auf CS00 und CS02.
Zitat :
| TIMSK |= (1<<TOIE0) |
Ist in diesem Fall absolut perfekt (bis auf das Fehlende Semikolon ).
TIMSK ist das Register, dass für mehrere Timer zuständig ist, dort sollte man, wie du das richtig gemacht hast, nur Bits verändern, indem man mit dem Komplement verUNDet (Bits löscht) oder mit der Maske verODERt (Bits setzt).
_________________
|