En hårdvarufråga MCU.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

En hårdvarufråga MCU.

Inlägg av Repaterion »

Tjenis!

Sitter och fipplar med en PIC12F509 och knackar lite C för det höga nöjets skull.

Men jag har reagerat på en sak programmet som körs är skitenkelt, det är en långsamt blinkande LED på GP2 och en snabb på GP0 och en "knapp" på GP1.
Nu till saken, man ser att LED blinkar låt oss säga 20ggr sedan en liten paus(vi pratar <100mS) sedan blinkar "rätt" 20ggr, samma med båda LED.
Har även sett detta på Atmega328P.

Vad beror detta på? Jag har inga räknare som skall nå ett visst värde utan enbart en for-loop och en while i main som snurrar på.
Har detta med hur lång __delay_ms() är i förhållande till osc? Kör intern klocka á 4MHz på PIC12 och 16MHz på UNO (Atmega328p), lite som att den hamnar i otakt.
Användarvisningsbild
adent
Inlägg: 4103
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: En hårdvarufråga MCU.

Inlägg av adent »

Du får nog visa oss koden. Tycker inte det borde bli några hopp. Om du har interrupt på, kan det i teorin påverka, men i praktiken är de oerhört korta. Känns mer som den bootar om?
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: En hårdvarufråga MCU.

Inlägg av Repaterion »

Nepp inga avbrottsrutiner, timers(delay.h), matar med en pickit2 iofs men testat att köra från 2,5-5Vdc med samma resultat.
Använder iofs blockerande paus men ändå.
Märkligt :humm:


De två funktionerna som kallas.

Kod: Markera allt

void fastLED(void){
    GP1 = ~GP1;
    __delay_ms(125);
    if (!GP1){
        GP0 = 1;
    }
    else GP0 = 0;
}
void slowLED(void){
    GP1 = ~GP1;
    __delay_ms(500);

}
header

Kod: Markera allt

#include <stdlib.h>
#include <stdint.h>
#include <xc.h>
/* Variabler */
#define _XTAL_FREQ 4000000      // Sets XTAL to 4MHz

// PWM relaterat, all tid är millisekunder
// Functions

uint16_t userDelay(uint16_t tid);
void setup(void);
void slowLED(void);
void fastLED(void);
#endif	/* XC_HEADER_TEMPLATE_H */

Main

Kod: Markera allt

#include "header.h"


int main(void) {     
    TRISGPIO = 0b00000100;
    void setup(void);
    if(GP2 == 1){
        GP0 = 0;
        GP1 = 0;
        slowLED();
        }
    else {
        fastLED();
    }
return 0;
}
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45304
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: En hårdvarufråga MCU.

Inlägg av TomasL »

Hur ser FUSES ut?
Har du t.ex. lyckats slå på WDT?
Du kör nog main() från början med jämna mellanrum

Kod: Markera allt

nt main(void) {     
    TRISGPIO = 0b00000100;
    void setup(void);
    if(GP2 == 1){
        GP0 = 0;
        GP1 = 0;
        slowLED();
        }
    else {
        fastLED();
    }			// koden tar slut, main() startar om
return 0;
Så här funkar nog bättre

Kod: Markera allt

nt main(void) {     
    TRISGPIO = 0b00000100;
    void setup(void);
    while (1)
    {
   	 if(GP2 == 1){
      	  GP0 = 0;
      	  GP1 = 0;
     	   slowLED();
      	  }
  	  else {
     	   fastLED();
   	 }
    }
return 0;
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: En hårdvarufråga MCU.

Inlägg av Repaterion »

Ooops missade visst.

Kod: Markera allt

// PIC12C509 Configuration Bit Settings
#pragma config OSC = IntRC      // Oscillator selection bits (internal RC oscillator)
#pragma config WDT = ON         // Watchdog timer enable bit (WDT enabled)
#pragma config CP = OFF         // Code protection bit (Code protection off)
#pragma config MCLRE = OFF      // MCLR enable bit (MCLR pin enabled)

#define _XTAL_FREQ 4000000      // Sets XTAL to 4MHz
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45304
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: En hårdvarufråga MCU.

Inlägg av TomasL »

WDT är konfigurerad och påslagen, den startar om prollen med jämna mellanrum, om du inte skriver till WDT.

Antingen så hanterar du WDT i din kod, eller så stänger du av den.
Vidare, gör den förändringen jag föreslog i inlägget ovan.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: En hårdvarufråga MCU.

Inlägg av Repaterion »

Ändrade WDT till OFF och som jag kan se det så försvann "rycket", kan det varit så enkelt som nämdes tidigare att den helt enkelt startade om...
Detta för att WDT inte nollställdes som den skulle?

Svarade om varandra där tror jag. :)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45304
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: En hårdvarufråga MCU.

Inlägg av TomasL »

WDT är till för att övervaka att koden körs, och startar om prollen om koden skulle hänga sig, tanken är då att man med jämna mellanrum nollställer WDT, så att den startar om sin uppräkning.
WDT konfigureras till en lämplig tid, tror dock att det finns någon PO-standardtid om man inte konfigurerar den.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: En hårdvarufråga MCU.

Inlägg av Repaterion »

Japp tack å bock,
det var ganske exakt samma antal blink mellan varje omstart. Kanske 5sek grovt uppskattat.
Kollar på detta i morgon igen, så skall jag se att få till den uppräkningen så att WDT-biten sätts rätt efter X-tid.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: En hårdvarufråga MCU.

Inlägg av sodjan »

Det behöver inte vara någon speciell x-tid, bara nolla wdt en gång i din main loop. Bara ett extra kommando. Wdt tiden är ju uppenbarligen tillräckligt lång i alla fall.

Eller mycket enklare, stäng av wdt i config...
Skriv svar