stekohl
15.11.2008, 21:58
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
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