Sida 1 av 1

En hårdvarufråga MCU.

Postat: 22 november 2023, 21:26:25
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.

Re: En hårdvarufråga MCU.

Postat: 22 november 2023, 21:46:07
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?

Re: En hårdvarufråga MCU.

Postat: 22 november 2023, 21:58:57
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;
}

Re: En hårdvarufråga MCU.

Postat: 22 november 2023, 22:23:13
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;

Re: En hårdvarufråga MCU.

Postat: 22 november 2023, 22:49:38
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

Re: En hårdvarufråga MCU.

Postat: 22 november 2023, 22:52:33
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.

Re: En hårdvarufråga MCU.

Postat: 22 november 2023, 22:55:31
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. :)

Re: En hårdvarufråga MCU.

Postat: 22 november 2023, 22:59:06
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.

Re: En hårdvarufråga MCU.

Postat: 22 november 2023, 23:05:45
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.

Re: En hårdvarufråga MCU.

Postat: 23 november 2023, 12:38:12
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...