Fragen zu Interrupt und AVRGCC & Atmega644
Ich habe aktuell folgendes Problem.
Wie in einem anderem Thread beschrieben, versuche ich eine bestehende (fast fertige) Bascom Anwendung in C zu übernehmen.
Zugegeben als C Neuling keine leichte Aufgabe.
Nun habe ich folgendes schon hin bekommen:
a.) Holger Klabunde's SD LIB ( Mit leichten Änderungen für die ATMEGA644 Spezialitäten und viel Schweis mit falsch formatierten Karten) läuft.
b.) Eigene Lib für MCP23S17 (Porterweiterung 2 x 8 BIT, preiswert und wirklich universell, per SPI anzusteuern mit Interruptausgangje Port)
c.) SD-Karte und MCP an einem SPI BUS mit zwei verschiedenen CS.
Was mir noch fehlt ist die Interruptroutine.
Ich benötige den Interrupt, um damit ein Interruptereignis von einem MCP abzufangen. Den MCP23S17 habe ich so konfiguriert, dass bei Änderung eines Eingangs ein Int ausgelößt wird. Wird der Interrupt ausgelößt lese ich die beiden Ports auf dem Portexpander aus.
Die eigene Interruptroutine ließt also den Port aus und danach einen Datensatz von der SD Karte.
Ich will den INT2 nutzen. Der Interrupt soll ausgelößt werden wenn INT2 LOW ist.
Später soll dann INT0 oder INT2 noch genutzt werden, um ein paar Integerwerte im EEMEM zu sichern. Dieser Interrupt soll praktisch bei Netzausfall aktiv werden.
1.) Wie muß ich die Register setzten und welchen Registerflags muß ich setzten, damit der Interruptvektor auf meine ISR Routine aufläuft?
2.) Muß ich Register vorher sichern?
Wäre nett, wenn mir jemand auf die Sprünge helfen würde.
Ach ja, ich habe ein paar schöne Stunden verbracht mit folgendem Fehler.
Beim Senden der SPI Befehle habe ich die Adressen der Bausteine per ODER mit den Steuerflags verbunden.
Sah so aus:
- SPI_WRITE((addr <<1) || 0x40);
Wahrscheinlich muß ich niemandem sagen wie lange ich dafür gebraucht habe um zu merken, dass || kein bitweises ODER sondern eine Oderverknüpfung ganzer Variablen ist. Tja dumm gelaufen.
Nach ein paar Stunden und einer glorreichen Seite im C Buch (Übersicht aller Operatoren) habe ich dann per | (Bit-OR) alles ans laufen bekommen.
Ein Satz noch zum Thema C: Vom LED Blinker mal abgesehen, war bis jetzt in C die Entwicklungzeit mit gleichzeitigen "learning by doing" um mindestens Faktor 5 geringer als in Bascom. Gut, ich muß zugeben, zum Teil weiß ich jetzt wonach ich suchen muß. Für mich hat sich auf jeden Fall der Umstieg gelohnt. Gerade alle Bitoperationen und boolschen Variablenmanipulationen sind in C besser abzubilden.
Wollte damit nur alle "Wankelmütigen" einen kleinen Motivationsschub geben. ;-)
Gruß,
Stephan
Re: Fragen zu Interrupt und AVRGCC & Atmega644
Zitat:
Zitat von stekohl
...war bis jetzt in C die Entwicklungzeit ... um mindestens Faktor 5 geringer als in Bascom.
Hey Stephan, das ist interessant zu hören, sagen doch die meisten Umsteiger das Gegenteil.
Ich persönlich habe mit ASM angefangen und bin dann auf C umgestiegen. In BASCOM habe ich noch nie programmiert.
Zusatzfragen zum Thema SPI BUS
Ich denke das Hauptproblem bei C ist die Struktur und der eigenwillige Syntax.
Also in meinem Fall ist es so, dass ich für bestimmte log. Operationen oder Abfrage in Bascom mehr Quelltext gebraucht habe.
Beispiel: Ich habe eine Adresse mit 3 Bit länge, die um 1 Bit links verschoben wird und dann per Oder mit HEX40 verknüft wird.
Habe in Bascom für jede Bitmanipulation eine Quelltextzeile benötigt, in C habe ich das so gelößt - ((adr & 0x7)<<1) | 0x40 MCP_CS_OFF()
.
Ich finde die Operatoren, wenn man sie kennt, viel einfacher und eindeutiger in der Bedeutung und der Benutzung.
Ja sicher habe ich auch schon Stunden vor Syntaxfehler gehockt, die nur zur Laufzeit ihr "schädliches" Ich zeigten. Es wird einem mehr Struktur abverlang.
Andere Sprachen und Compiler helfen da doch etwas besser.
Jetzt aber noch ein Frage:
Ich habe am SPI Bus einmal die SD-Karte und den Portexpander.
Die SD Karte wird einfach nur per Widerstand an den MC angeschlossen und die Portexpander arbeiten sowieso mit 5 Volt.
Nun läuft das alles zwar getrennt, oder besser gesagt. Der 5 Volt Part ist ok, nur alles was mit 3,3 Volt Pegel läuft ist Mist.
Jetzt die Frage: Wenn ich den SD-Karten Pegel sauber wandle (mit Pegelwandler) kann ich dann damit rechnen, dass das alles zuverlässiger läuft?
Gruß,
Stephan