Hätte mich auch gewundert wenns nicht geht!
Dann wird beim Compilieren was falsch laufen
... Habe die Programme jetzt ausprobiert
@KingTobi
Das Programm von dir funktioniert ... zumindest bei mir
das Programm (hab ich schon mal gepostet)
funktioniert einwandfreiCode:int main(void) { initRP6Control(); while(true) { DDRC &= ~IO_PC6; if(PINC & IO_PC6) { writeString_P("PC6 is HIGH!\n"); } else { writeString_P("PC6 is LOW!\n"); } } return 0; }
... dann muss es bei dir an etwas anderem liegen
Hast du die neueste Version des RP6Loader ?
http://www.arexx.com/rp6/html/de/software.htm
edit:
@ KingTobi
Normalerweise dürfte es doch keinen Unterschied machen, ob man die Programme selbst kompiliert oder die fertigen hexfiles verwendet.
Hab das auch gerade probiert ... das macht (bei mir) überhaupt keinen Unterschied.
Hätte mich auch gewundert wenns nicht geht!
Dann wird beim Compilieren was falsch laufen
Noch ne Idee:
Vl hast du die Ordnerstrukturen nicht richtig angelegt?
Du musst den Ordner mit den Beispielprogrammen an irgendeinen Ort auf der Festplatte kopieren und IN DIESEN Ordner kannst du dann einen neuen Ordner erstellen, indem du dann ein Projekt erstellst (mit Makefile und so).
BSP:
...\RP6Control_Examples\LCD\ und das sind dann alle Daten des Projekt drin
nämlich (z.B.):
lcd.c
lcd_p.pnprog
makefile
make_all.bat
make_clean.bat
und ev. lcd_p.pnps
@KingTobi: ich habe das hexfile des beispielprogramm direkt genommen und es nicht nochmal extra kompiliert.
aber das bei mir grundsätzlich was beim kompilieren falsch läuft, kann ich ausschließen, da ich schon andere ordner erstellt habe und darin programme erstellt habe, welche auch korrekt liefen.
das am RP6Loader was nicht stimmt, kann ich daher auch ausschließen.
@Xandi11: wie ich das mit den ordner gemacht habe, habe ich in einem meiner letzten post schon ausführlich erklärt, aber ich glaube ich habe es genauso gemacht, wie du es mir hier erklärt hast.
was aber durchaus ein grund sein könnte, ist das, das irgendwas in genau diesem verzeichnis falsch kompiliert, wird, da irgendwelche orderdateien nicht korrekt sind.
das hier sind alle dateien in diesem ordner:
- Testprogramm_C (C-datei)
- make_all (einfach aus button-beispielprogramm kopiert)
-makefile(von buttons-beispielprogramm kopiert, bei target auf Testprogramm_C abgeändert)
- make clean(von buttons- beipsielprogramm kopiert)
- .dep ->Testprogramm_C.o.d.
- Testprogramm_C.elf
- Testprogramm_C.lss
- Testprogramm_C.map
- Testprogramm_C (Sym- datei)
- Testprogramm_C (hex.datei)
- Testprogramm_C.lst
- Testprogramm_C.o (O- datei)
leider kann ich gerade keiner eurer vorschläge ausprobieren, da ich erst am freitag wieder heim komme.
was mir jetzt gerade noch einfällt und evtl. wichtig sein könnte ist, dass ich den timer 1 auf 36khz CTC modus mit interrupt zur verwendung eines ir- kollisionssystems initialisiert habe. das sah folgendermaßen aus:
timerinitialisierung:Code:#include "RP6ControlLib.h" uint8_t counter; ISR(TIMER1_COMPA_vect) {counter++; if(counter <21) {PORTD ^= (1<<PD5); writeString_P("Interrupt Timer1 Compare\n");} if(counter > 20 && interruptcounter <41) {writeString_P("Interrupt Pause\n");} if(counter == 41) {counter =0;} } void infrarotempfang(void) {if (PINC & (1<<6)) {writeString_P("Infrarot empfangen\n"); } } int main(void) {initRP6Control(); DDRD |= (1<<PD5); //PD5 als Ausgang DDRC &=~ (1<<6); //PC6 als Eingang while(true) { infrarotempfang(); } return 0; }
dieses programm hatte ich auch im Testprogramm_C ordner und bei diesem programm kamen alle textmeldungen des interrupts korrekt. nur die textmeldung am eingang kam nicht.Code:TCCR1B = (0 << ICNC1) | (0 << ICES1) | (0 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10); OCR1A = 221; // Timer 2 - used for beeper: TCCR2 = 0; OCR2 = 0xFF; // Enable timer interrupts: TIMSK = (1 << OCIE0)|(1<<OCIE1A); sei();
deshalb habe ich das programm anschließend abgeändert (ohne interrupt) um dem problem mit der eingangstextmeldung genauer auf den grund zu gehen.
alles ein bischen verwirrend, z.b. auch, warum das ganz einfache programm von KingTobi mit der Textmeldung jetzt auch keine textmeldung bringt.
vielleicht kann mir ja jetzt jemand entscheidend weiterhelfen.
danke auf jeden fall schon jetzt mal für euer großes bemühen.
mfg
Ich versteh jetzt nicht ganz was dein Programm mit der Interruptroutine mit dem Problem, dass du keine Textausgaben bekommst zu tun hat.
Edit:
Du könntest versuchen einfach alles neu zu machen.dieses programm hatte ich auch im Testprogramm_C ordner
Nimm einfach nur mal den Code von KingTobi (der mit der Endlosschleife) und erstell einen ganz neuen Ordner, Projekt usw.
Dann könntest du auch ausschließen, dass es eine Verknüpfung mit deinem früheren Programm gibt.
Ich glaube allerdings, dass das nicht ändern wird ... aber nen Versuch ist allemal wert.
lg
danke Xandi für den tipp, ich werde es am freitag wenn ich wieder daheim bin ausprobieren.
bis dann
so, jetzt hab ich wieder daheim. also jetzt habe ich gerade mal den ordner mit dem Testprogramm_C komplett gelöscht und einen neuen Ordner mit M32Test erstellt. in diesen habe ich dann das makefile, make clean und die c datei des buttons- beispielprogramm kopiert und umbenannt.
anschließend habe ich im programmers notepad das ganze buttons programm, welches bei mir ja jetzt M32Test heißt kompiliert. das ging alles fehlerfrei.
anschließend habe ich die hexdatei des M32Test mit dem RP6Loader in die M32 geladen.
jetzt kommts:
Die M32 macht bei diesem programm gar nichts.
also muss bei mir irgendetwas beim kompilieren falsch laufen. komischerweise ging das bis vor ein paar wochen alles noch.
was noch auffällig ist, ist, dass die hexdatei des M32Test- programms 12,2Kb speicherplatz hat, während das original hexfile des buttonsprogramm nur 11,7Kb hat.
das alles lässt auf einen fehler beim kompilieren schließen.
auf jeden fall brauche ich jetzt mal gute ratschläge...
mfg
Auf die Schnelle fällt mir eigentlich nur eins ein ....
Die Software deinstallieren (wirklich alles löschen) und anschließend wieder neu installieren.
Einen Versuch wär das Wert, denn mehr als 10 Minunten dürfte das nicht dauern.
Lad dir für die Neuinstallation auch das Setup neu vom Internet herunter.
hallelujah, es geht.
alles neu installiert und nun geht es.
ich danke euch allen für eure hilfe.
mfg
so, jetzt habe ich herausgefunden, warum das programm nicht mehr funktioniert hat.
in meinem letzten post hab ich ja geschrieben, dass jetzt wieder alles funktioniert, seit ich alles neu installiert habe. das funktionierte aber nur so lange, bis ich meinen timer 1 in der library initialisiert habe. ab diesem zeitpunkt trat wieder das selbe problem auf.
darum habe ich die timerinitialisierung nun etwas abgeändert.
ursprünglich war der timer so initalisiert:
als er so initialisiert war hat folgendes programm nur ausschließlich den interrupt abgearbeitet (war über textmeldungen erkennbar) und sonst gar ncihts gemacht, also auch keinen eingang abgefragt.Code:TCCR1B = (0 << ICNC1) | (0 << ICES1) | (0 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10); OCR1A = 221; // Timer 2 - used for beeper: TCCR2 = 0; OCR2 = 0xFF; // Enable timer interrupts: TIMSK = (1 << OCIE0)|(1<<OCIE1A); sei();
darum habe ich die timerinitialisierung so abgeändert, dass wieder der eingang abgefragt wird:Code:#include "RP6ControlLib.h" uint8_t a; uint8_t interruptcounter; ISR(TIMER1_COMPA_vect) {interruptcounter++; if(interruptcounter <50) {PORTD ^= (1<<PD5); writeString_P("Interrupt Timer1 Compare\n");} if(interruptcounter > 50 && interruptcounter <101) {writeString_P("Interrupt Pause\n");} if(interruptcounter > 100) {interruptcounter =0;} } void infrarotempfang(void) {if (PINC & (1<<PC3)) { a++; } if (a >100) {writeString_P("Infrarot empfangen\n"); startStopwatch1();} if (getStopwatch1() >1000) {setStopwatch1(0);} } int main(void) {initRP6Control(); DDRD |= (1<<PD5); //PD5 als Ausgang DDRC &=~ (1<<PC3); //PC3 als Eingang while(true) { infrarotempfang(); } return 0; }
nun ist es so, dass in meinem programm der eingang wieder abgefragt wird, aber nun kein interrupt mehr ausgelöst wird.Code:TCCR1B = (0 << ICNC1) | (0 << ICES1) | (0 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10); OCR1A = 221; TIMSK = (1<< OCIE1A); sei(); // Timer 2 - used for beeper: TCCR2 = 0; OCR2 = 0xFF; // Enable timer interrupts: TIMSK = (1 << OCIE0);
kann mir einer der RP6 experten sagen, warum das überhaupt so ist, dass die timerinitialisierung das programm derart beeinflusst?
was muss ich jetzt noch ändern, damit der eingang abgefragt wird und gleichzeitig der interrupt auslöst?
mfg
Lesezeichen