lite hjlp på traven med Pic

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

lite hjlp på traven med Pic

Inlägg av newbadboy »

Kan ha blivit lite blind men jag har en liten krets som skall skicka ordet Garage 10ggr när hela kretsen spänningsätts.

Jag har en gjort en funktion kallad delay somhittar på ngt skumt om jag sätter in a till tex 600 eller lägre så skickas ordet men sätter jag det tex 1200 så vägrar det funka. Har inte gjort ngra mätningar ännu och inte heller testat fram exkat vid vilken värde det ballar ut men koden är så enkel att jag inte bergriper alls vad som kan fela?

Kod: Markera allt

#define RF_en PORTA.F4
#define Switch PORTA.F5
int i=0,k=0;
int Vadc;

//Set 4Mhz clk
//Set digital I/O registers and analog I/O
//Disable ccm
//Enable uart module with 9600baud
//Disable RF module to save power

void initMain(){
OSCCON=0b01101000;
TRISA=0b00100100;
ANSELA=0b00000100;
C1ON_bit=0;
SRLEN_bit=0;
UART1_Init(9600);
RF_en=1;
delay_ms(100);
RF_en=0;
    }

// Enables sleep mode after sending data to achive power save
void Sleep(){
     RF_en=0;
     ADON_bit=0;
     asm sleep;
    }

//sec_Delay is used to avoid false triggering depending on user case
//Int a sets delay time in sec. 60sec, 3600sec, etc
void sec_Delay(int a){
    while(k<a){
          delay_ms(1000);
          k++;
          }
    k=0;
    }


//When used as mail trigger, (do not use Sleep() here)
void PostTX(){
    while(1){
         if(Switch==1){
            RF_en=1;
            delay_ms(1000);
            for(i=0;i<11;i++){
               UART1_Write_Text("Post\n");
               delay_ms(500);
               }
            RF_en=0;
            }
         }
     }
     

//Enable  RF module and sent trigger word 10 times
//Disble RF module to save power and set PIC in sleep mode
//Also set proper sec_Delay(a) time
/*Trigger words
1 1Brunn
2 2Brunn
3 Badkar
4 Kyl
5 Frys
6 3Kok
7 Toalett
8 Dusch
9 4Tvattstuga
10 Garage
*/
void WaterHeatTX(){
    sec_Delay(600);                      //ÄNDRA DELAY HÄR!!!!
    RF_en=1;
    delay_ms(1000);
    for(i=0;i<11;i++){
       UART1_Write_Text("Garage\n");     //ÄNDRA TRIGGER <ORD HÄR!!!!
       delay_ms(500);
       }
    }
    
//Read channel 2 from adc. ADC_Read initializes adc with internal Vref and clk
//Check if the value is less then 13dec. Converted to INT
// Vx=(1024/Vref)*Vth, Vth=5,5/2=2,75V, Vx=(1024/5)*2,75= 563 (int) calculated
//Blink LED if Vbat is low!
void Vbat(){
    Vadc=ADC_Read(2);
    if(Vadc<580){
         while(1){
                 RF_en=1;
                 delay_ms(100);
                 RF_en=0;
                 delay_ms(1000);
                 }
          }
    }


//Initiate registers
//Execute WaterHeatTX OR Post TX
//Execute Sleep mode, (only used with WaterHeatTX!!!!)
void main(){
    initMain();
    WaterHeatTX();
    //PostTX();
    Vbat();
    Sleep();
    }
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: lite hjlp på traven med Pic

Inlägg av ToPNoTCH »

Nu var det hundra år sedan jag höll på med PIC och då assembler, men jag får för mig att man behöver definera frekvensen för att delay skall funka rätt.
Nu funkar den ju i och för sig med ett visst värde så det borde inte ha med det att göra kanske. Du har ju inte beskrivit "hur" det ballar ur i och för sig.

p.s
Du borde kanske deklarera variablerna i funktionerna när dom bara används där.
d.s
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: lite hjlp på traven med Pic

Inlägg av newbadboy »

Ja just det. Jag har en mottagare som tar emot ordet garage. Den tar inte emot ngt helt enkelt. Modulerna kör 433Mhz mellan varandra.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: lite hjlp på traven med Pic

Inlägg av ToPNoTCH »

Jag pratar om MCU frekvensen.

Kika lite på http://thinkinbinary.blogspot.se/2013/0 ... elays.html
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: lite hjlp på traven med Pic

Inlägg av newbadboy »

Osccon är satt i initMain() så frekvensen skall stämma.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: lite hjlp på traven med Pic

Inlägg av TomasL »

Vilken del av koden är det som gör att det kraschar, du anropar delay ett stort antal gånger, men var ändrar du så det kraschar?

Hur ser Delay ut, den är inte med i listningen.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: lite hjlp på traven med Pic

Inlägg av newbadboy »

Delay_ms() är en färdig funktion som finns i min kompilator.

Det är när jag anger ett för högt int a som används i sec_delay() som det slutar funka
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: lite hjlp på traven med Pic

Inlägg av TomasL »

OK, hur är delay() deklarerad?
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: lite hjlp på traven med Pic

Inlägg av Icecap »

Detta gör ingen ändring i Delay() men den är bättre:

Kod: Markera allt

void sec_Delay(unsignad short a)
  {
  while(a--)
    {
    delay_ms(1000);
    }
Felet kan ha varit för att k var ospecificerat i din version.
Min version kollar om a är annat än noll (noll = falskt, allt annat = sant), är den inte kallas delay_ms(1000) och EFTER kollen räknas a ner ett steg.

Sedan har du definierat variablerna till att vara 'int', detta är inte en bra sak. 'int' betyder "den mest naturliga variabel" vilket för en 8-bit µC ofta är 1 byte...

Om du menar en 16 bit värde ska du deklarera som short eller unsigned short. Visst, int kan vara definierat som en short i kompilern men den definition är kompilerberoende och det är lika bra att göra rätt från början.

EDIT: läste lite mer noga på din felbeskrivning och det verkar ganska säkert att det är just för att en 'int' blir en byte som ger problemet. Samtidig är den avkänning du har av om antalet sekunder har gått mycket knasig och den kombination gör jobbet för dig.
Senast redigerad av Icecap 23 februari 2018, 13:07:18, redigerad totalt 1 gång.
kabelhaerva
Inlägg: 93
Blev medlem: 11 september 2010, 09:41:58
Ort: Gbg

Re: lite hjlp på traven med Pic

Inlägg av kabelhaerva »

__delay_ms() är beroende av att du satt en define på processorns hastighet i Xc8 har jag för mig.
Prova lägga till #define _XTAL_FREQ 4000000

Edit: Ändrade från 8000000 till 4000000
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: lite hjlp på traven med Pic

Inlägg av newbadboy »

Ser ut som att om programmeringsdongeln hänger på kortet med vcc gnd och mclr så skickas kretsen ordet även med lång delat. Får nog börja mäta lite ihop med att kolla mer på koden.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: lite hjlp på traven med Pic

Inlägg av newbadboy »

Hittade felet ser det ut som. Hängde på mer avkoppling nära mcun och det funkar bra nu. Sen varför det funkade med kortare delay vete fanken.
Skriv svar