Heyho
ich muss gerade fuer die uni ein batterieladegeraet bauen und bin eg
schon recht fertig hab nur noch ein problem mit dem interrupt.
Mein interrupt soll jede minute kommen und dann vergleicht es die
temperaturwerte von der batterie. Nun falls ein gewisser wert
ueberschritten wird soll der zustand geaendert werden. Aber wenn ich
meine state variable im interrupt aendere dann resetet der nach dem
interrupt und ich weis nicht warum vllt koennt ihr mir ja helfen. Danke
im vorraus
PS die ganzen display sachen koennt ihr natuerlich einfach ignorieren
1
#include<adc.h>
2
#include<delays.h>
3
#include<p18f4550.h>
4
#include<stdlib.h>
5
#include<string.h>
6
#include<timers.h>
7
8
/*#pragma config FOSC = INTOSC_HS
9
#pragma config PWRT = ON // AN
10
#pragma config BOR = OFF
11
#pragma config WDT = OFF // Watch Dog AUS
12
#pragma config LVP = OFF
13
#pragma config PBADEN = OFF
14
#pragma config VREGEN = OFF
15
#pragma config MCLRE = ON
16
*/
17
volatileintstate=0;// Indicates in which state the charger is 0 =Idle , 1 = Fast charge , 2 = Top up charge , 3 = Trickle charge
18
longTsum=0;
19
longBVsum=0;
20
longBV=0;// Battery Voltage in mV
21
longT=0;// Battery Temperature
22
longTold=0;// Temperature 1 min before
23
longtimer=0;// Count up to 30 to determine when 30 mins are over
/////////////////////////////////////////////////////////////////////////////////////////////////// Use the ADC to measure the temperature of the battery
124
voidTemperature_Battery(void)
125
{
126
doubleDV;// The output from the op amp to measure the diagonal voltage
127
doubleV0;// The input voltage of the Wheatstone bridge
Reset nach Interrupt hört sich spontan nach einem nicht behandelten
Interrupt an. Mit PIC kenne ich mich nun gar nicht aus, aber gibt es da
vielleicht sowas wie einen "Universalinterruptcatcher" wie BADISRvect in
der avr-libc? Wenn ja, den einfach mal einbauen und schauen, ob immer
noch ein reset kommt.
Andere Idee wäre noch, ob sich nach dem Reset die Resetquelle bei den
PIC's auslesen läßt, wie z.B. das Register MCUCSR beim AVR.
Alex K. schrieb:> programmiere in matlab ide
wohl eher nicht ... könnte es vielleicht MPLAB heißen ?
- ich hab's gerade leider nicht im Kopf aber es gibt ein Register,
welches den letzten Resetgrund angibt.
- Stichwort Stack-Overflow-Reset -> Configbits
- Interruptroutine ist komisch. Ich verwende diese:
http://www.edaboard.com/thread72386.html
- Was für Configbits verwendest du? Du hast die im Code auskommentiert
also was für welche hast du gesetzt? Hast du sie überhaupts gesetzt oder
ist der Default vom C18 Compiler noch drin -> MPLAB
- kannst du die Hardware ausschließen (Einbruch der Spannungsversorgung,
etc...)
- Das da geht eigentlich nicht:
Alex K. schrieb:> void Send_Data_Lcd(char data[]);
oh jo natürlich mplab war noch nebenbei mit matlab am arbeiten :>
-ich benutze normal die config bits die ich oben auskommentiert hab.
Hatte aber gerade die bits von mplab setzen lassen.
- die hardware hab ich schon getestet und nichts auffälliges bemerkt.
-das mit dem register muss ich morgen dann mal genauer untersuchen aber
hab was gelesen das es auch einen reset gibt nach dem interrupt wenn man
in nen speicherbereich schreibt wo man net darf. Damit konnte ich nur
leider zurzeit nichts anfangen. Wüsste nicht was ich mehr als volatile
machen könnte.
Lehrmann Michael schrieb:> Alex K. schrieb:>> void Send_Data_Lcd(char data[]);
ja aer es funktioniert bei mir xD. Aber muss dazu sagen dass das mein
erstes projekt mit nem mikrocontroller ist daher ist das noch net alles
100% perfekt ;)
Lehrmann Michael schrieb:> Hast mal einen Schaltplan dann lass ich das kurz mit Proteus> durchsimulieren ...
äh könnte ich dir nachher machen habs leider net digital da und bin
zurzeit aufm heimweg :>
Alex K. schrieb:> oh man sorry *vorn kop hau> ich nutze einen pic18f4550> programmiere in matlab ide und hab nen pickit2 hier falls das wichtig> ist
Na, dann kannst Du doch prima im Emulator sehen, wann was
passiert.....warum fragst Du dann hier?
Brauchst Du eine Anleitung zum Pickit?
Und Uwe S. hat Dir die Loesung doch auch schon geschrieben:
Mit MPLAB kanst Du prima feststellen, was da passiert!
Gruss
Michael
Alex K. schrieb:> Lehrmann Michael schrieb:>>> Alex K. schrieb:>>> void Send_Data_Lcd(char data[]);>> ja aer es funktioniert bei mir xD. Aber muss dazu sagen dass das mein> erstes projekt mit nem mikrocontroller ist daher ist das noch net alles> 100% perfekt ;)
ich weiß zurzeit noch nicht wozu das pickit 2 vllt fähig ist aber werde
ich dann morgen auch nochma googlen danke für die info
zumal das was Uwe S. geschrieben hat hat nicht das problem gelöst...
leider
kenne mich in C nicht aus und mit Pics habe ich auch nichts am Hut.
Vielleicht kann ich dir aber trotzdem helfen.
Ich vermute das du die Interrupt-Routine nicht richtig beendest sondern
einfach weiter im Programm verzweigst dadurch läuft irgendwann der Stack
über also auch der Programmcounter dein Programm läuft irgendwann wieder
vom Beginn an so als wenn es resettet hätte.
Schau dir mal in der Simulation den Stack an und lass das Programm noch
weiterlaufen, denke das ist nur eine frage der Zeit bis du zum
Stacküberlauf kommst.
Hast du den 2. Post beachtet?
Ein goto legt keine Rücksprungadresse auf den Stack. Gerade die wird
aber benötigt wenn du aus der Funktion zurückspringst.
außerdem wird versucht ein ASM Befehl auszuführen, GOTO stammt aber eher
aus der BASIC Ecke
///// asm code to use the intterupt
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh(void){
_asm
goto InterruptHandlerHigh
_endasm
}
#pragma code
/////
aber wieso erst in C programmieren und dann doch ASM Befehle, läuft das
ganze etwa zu langsam?
Thomas O. schrieb:> aber wieso erst in C programmieren und dann doch ASM Befehle, läuft das> ganze etwa zu langsam?
Das wird wohl beim PIC die Methode sein, einen Interrupthandler zu
definieren. Da kocht jeder Compilerbauer sein eigenes Süppchen.
Ein Jump vom Vektor zum Handler ist schon richtig, das RETI macht dann
die C-Funktion.
Man will ja nicht zur Vektortabelle zurück, sondern zum Main-Kontext.
Vielleicht sollte man für den Low-Interrupt noch nen Dummy-Handler
aufsetzen.
Peter
Was auffällt, Du machst viel zu viel im Interrupt.
Ein Interrupt ist ne 2.Task, die darf mit dem Main nicht gleichzeitg
dieselbe Ressource benutzen!
LCD in Main und Interrupt geht schonmal garnicht.
Und gemeinsame Variablen >8Bit müssen im Main atomar zugegriffen werden.
Eine Minute ist auch nichts, was man im Interrupt machen muß. Da setzt
man im Interrupt nur ein Bit und das Main macht die Sachen, wenn das Bit
gesetzt ist.
Damit lösen sich alle Konflikte von selber auf.
Interrupts sind für wirklich eilige Sachen (wenige µs bis ms).
Peter
okay hab mitlerweile den fehler gefunden. Es liegt nicht an nem overflow
sondern das ich im state 2 einen Mosfet mit dem pic ausschalte der
gerade 1.2A fuehrt. Wenn ich das weg machen laeuft es wunderbar. Nun ist
aber die frage warum der pic resetet wenn ich den Mosfet ausschalten
will.
so hier ist die schaltung die Mosfets sind IRLZ34NPBF
und der Spannungsregler ist ein LM 350
und die mosfets sind ueber pull down widerstaende an den pic
angeschlossen
aeh die mosfets sind natuerlich andersrum verbunden
und die spannungsquelle am ende soll eine NiMH batterie darstellen