Jag får inte det till att lira. Den verkar inte läsa ngt adc värde. Har en extern spänningskälla där jag ställt tillräckligt högt värde men den reagerar inte.
adc ingång 3 används.
Däremot varje gång jag spännningsätter kortet går den genom while loopen i main en gång, går in i CurrentMeas() och där tycker den då att den läser ett högtt ADC värde då den går in i den lilla while loopen och väntar på knapptryckning. Efter jag tryckt på knappen snurrar koden igen bortsett från att den inte reagerar på adc värden.
Beteendet ovan får jag även om jag jordar adc ingången

...
Till sist måste jag också göra om CurrentMeas() till ngn form av mjukvaru interrupt så att säga. Jag vill att den ska reagera snabbt på strömförändringar och ligger jag inne i ngn delay som tänder LED så blir det en onödig fördröjning.
Här kommer hela koden så ni slipper gissa. Jag har kastat om s mycket grejer nu så ag har tappat tråden lite.
Kod: Markera allt
#define LoadCTRL GPIO.F2
#define Reset GPIO.F1
#define LedOut GPIO.F5
unsigned short State;
int a, ShuntValue, Currentlimit;
void InitMain(){
TRISIO=0b00001010;
ANSEL=0b00001000;
CMCON=0b00000111;
LoadCTRL=1; //utgång av innan eeprom värde är inläst
State=EEPROM_Read(0x80);
LoadCTRL=0; //sätt igång +5V utgång
if((State!=1)&&(State!=2)&&(State!=3)){ //allra första gången vid start kan det finnas ngt konstigt i minnet. Finns det ngt annat än siffran 1,2 eller 3 skirver man en etta för att
State=1; //undvika konstiga beteende
EEPROM_Write(0x80,0x1);
}
for(a=0; a<7; a++){
LedOut=1;
delay_ms(50);
LedOut=0;
delay_ms(50);
}
delay_ms(500);
}
void CurrentSet(){
if(State==1)
Currentlimit=936; //520mA för att fåcdet till int 0.936x1000=936
else if(State==2)
Currentlimit=1656; //920mA
else if(State==3)
Currentlimit=2736; //1520mA
}
void ModeINCR(){
State++;
if(State>3){
State=1;
}
EEPROM_Write(0x80,State);
CurrentSet();
while(Reset==0){ //utan denna räknas State kontinuerligt så länge man håller in knappen. Denna ska bara räkna ett steg för varje knapptryck
LedOut=1;
}
}
void LEDmode(){
if((State==1)&&(Reset=1)){
LedOut=1;
delay_ms(100);
LedOut=0;
delay_ms(1000);
}
if((State==2)&&(Reset=1)){
LedOut=1;
delay_ms(100);
LedOut=0;
delay_ms(150);
LedOut=1;
delay_ms(100);
LedOut=0;
delay_ms(1000);
}
if((State==3)&&(Reset=1)){
LedOut=1;
delay_ms(100);
LedOut=0;
delay_ms(150);
LedOut=1;
delay_ms(100);
LedOut=0;
delay_ms(150);
LedOut=1;
delay_ms(100);
LedOut=0;
delay_ms(1000);
}
}
void CurrentMeas(){
ShuntValue=ADC_Read(3);
ShuntValue=(ShuntValue/310); //1024/3.3=310
if(ShuntValue>CurrentLimit){
delay_ms(3);
ShuntValue=ADC_Read(3);
ShuntValue=(ShuntValue/310);
if(ShuntValue>CurrentLimit){
while(Reset==1){
LoadCTRL=1;
LedOut=1;
}
}
LoadCTRL=0;
}
}
void main() {
InitMain();
while(1){
if(Button(&GPIO, 1, 200, 0)){
ModeINCR();
}
LEDmode();
CurrentMeas();
}
}