Sobald man die Taste drückt, stoppt das System, Entfernt man die LCD
funktion läuft wieder alles.
Sonst funktionieren die LCD funktionen überall. Und hab auch andere
zeichen als 7 Probiert.
Hier die benutzte LCD funktion:
Bello schrieb:> abc schrieb:>> Will einfach im IR eine zahl am Display ausgeben:> Warum diese Verrenkungen? Das geht auch mit 'nem 8-Bitter.
Was meinst genau?
Ist ein größeres Projekt bei dem ich mich für diesen Prozessor
entschieden habe, auch wenns mit Atmega auch umsetzbar gewesen sein
sollte.
Dieses Projekt beinhaltet: SD-Card, I2C bus anbindungen, USART, RTC, 10
IR fähige Taster, 10 LEDs, LCD usw ;).
Ok, das hattest du nicht geschrieben. Wenn ich soetwas machen wollte,
würde ich das mit meinem neuen mikroelektronka Pascal-Compiler machen,
so sie deinen bisher ungenannten µC unterstützen. Dieses C-Gescheibsel
ist mir einfach zu unübersichtlich.
Ja es geht jetzt nicht um entfehlungen oder sonstwas. Ich mache das mit
dem Cortex STM32DiscoveryF3 board (STM32F10x Prozessor).
Und der Code ist für diesen Prozessor halt der CMSIS Standart, an dem
man sich erst gewöhnen muss, aber dann auch schnell damit Programmieren
kann.
Aber diese Diskussionen bringen bei der Lösung des Problems jetzt nichts
;).
In Interruptroutinen macht man keine Ausgaben auf Displays, die hält man
so kurz wie möglich.
Geh erstmal die Grundlagen lernen bevor du mit nem STM32 anfängst. Sonst
lässt die ächste Frage nicht lange auf sich warten.
Es ist grundsätzlich keine gute Idee, wenn man LCD Ausgaben in einer
Interruptroutine macht. Der bessere Weg ist, im Interrupt ein Flag zu
setzen, was dem Hauptprogramm signalisiert, das was anzuzeigen ist. Die
eigentliche LCD-Ausgabe erledigt dann das Hauptprogramm. Ich hoffe, Du
machst nicht in beiden (Int. und Main) LCD-Ausgaben.
Und ein Delay() hat nichts in einer Interruptroutine zu suchen.
Ich Programmier mittlerweile schon 2 Jahre auf dem STM32 und ein teil
meiner Abiturarbeit war über die Programmierung des Cortex M3, also ich
weiß eigentlich schon was ich tu.
Es sollte ja nur ein Test sein, und ich seh keinen Grund warum man im
Interrupt nicht etwas ausgeben kann zu testzwecken, Solange dauert die
Ausgabe auch wieder nicht und die Interruptroutine muss trotzdem
verlassen werden nach einer Gewissen Zeit x, dies Passiert nicht und
gibt Konkreten Anlass zu dieser Frage.
Der Interrupt hier sollte durch das Delay max etwas mehr als 1ms
aufgerufen und das system unterbrochen sein sein, aber warum hängt sich
da das system dabei auf?
Kann es sein, das Du durch Deine LCD Ausgabe einen erneuten Interrupt
auslöst und sich das Ding inneinander zu Tode verschachtelt?
Ich kenne mich mit den Cortexen nicht wirklich aus, aber ich würde am
Anfang Deiner ISR mal probehalber alle Anderen Interrupts sperren und
erst am Ende der ISR wieder freigeben..
Gruß,
Holm
Beim Display laufen sonst keine Interrupts, der Einzige Interrupt der
noch läuft ist der Interrupt des RTCs welcher allerdings in einer
Höheren Interruptklasse läuft, diesen Unterbricht und dann dieser
Fortsetzen würde.
Wie auch immer werd jetz ne Variable im IR setzen und im Hauptprogramm
ausgeben wie es auch geplant war. Ist nur merkwürdig warum das anders
net geht.
Mit der Ausgabe im Hauptzyklus funktioniert es aufjedenfall ;).
Jap dass Tasterprellen hab ich mittels Kondensatoren gelöst, und wenn
das nicht reicht entprell ich den Rest softwaremäßig, hat aber mit dem
Problem nix zu tun.
Hat eigentlich jemand Ahnung mit dem Remappen des PB3 Tasters?
Hier das Datenblatt:
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/CD00267113.pdf
Auf Seite 16 steht PB3 Main funkion JTDO und PB4 auch etwas, PB4
funktioniert aber ganz normal als I/O nur auf PB3 kann ich nicht
zugreifen.
Ich schätze dass diese Pins für die JTAG funktion sind.
Laut schaltungen zb. S19 steht das Als Programmierleitungen TCK/SWCLK
und TMS/SWDIO verwendet werden. Und weiter oben dass JTAG nicht
verwendet wird bei dem Board.
Also da ich ausgehe dass PB3 auf JTAG Konfiguriert ist, denke ich dass
man JTAG einfach deaktivieren müsste? Oder besteht da eine Gefahr dass
ich dann kein Zugriff mehr habe.
Mögliche Konfigurationen:
1
#define GPIO_Remap_SWJ_NoJTRST ((uint32_t)0x00300100) /*!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */
2
#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200) /*!< JTAG-DP Disabled and SW-DP Enabled */
Eigentliche müsste es ja mit #define GPIO_Remap_SWJ_JTAGDisable gehn.
Nur ich hab öfters gelesen dass PA13/14 auch deaktiviert werden, diese
sind aber die Programmierleitungen.
Ich frag lieber bevor ich dann kein Zugriff mehr habe, aber ich denke
dass hier die chance gering ist jemanden zu finden der sich damit
auskennt ;).
Okay habs probiert und hat Problemlos funktioniert.
Also für alle die PB3/PB4/PA15 mal nützen wollen einfach:
GPIO_PinRemapConfig (GPIO_Remap_SWJ_JTAGDisable, ENABLE);
Keine Ahnung was du gerade meinst.
Passen diese Einstellungen zusammen?:
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
EXTI_InitStruct.EXTI_Line = EXTI_Line7;
Bei mir sieht das so aus:
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
Diese Einstellungen passen aufjedenfall zusammen. da es keinen eigenen
Interrupthändler für Line 7 gibt, aber eine EXTI_Line7 welche in den
Interrupthändler EXTI9_5 fällt.
Es funktioniert auch alles ;).
git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd
für alle die noch nicht wissen dass die kommende Version von openocd
(0.6) beide versionen des ST-Link unterstützt.
Der Exti hat 19 Ausgangsleitungen, wovon 11 zum NVIC führen.
EXTI0-EXTI4 direkt verbunden mit NVIC
EXTI5-9 sind nach dem Exti "kurzgeschlossen" und mit einer Leitung zum
NVIC geführt.
EXTI10-15 genauso
Dann führen noch EXTI16-EXTI19 direkt zum NVIC.