Hallo allemaal,

Ik heb een heel vreemd probleem, ik ben een timertje aan het maken met een pic16f628. Op TMR0 zit een kristaloscillator van 32.768 KHz, dit wordt intern door twee gedeeld, en genereerst elke 256 keer een interrupt. Dus dat is 32768 / 2 / 256 = 64 keer per seconde. Elke interrupt wordt een teller opgehoogd, en als die teller 64 is dan is er een seconde voorbij en wordt de teller op 0 gezet.

Vervolgens worden er nog een aantal dingen gedaan, een schakelaar wordt uitgelezen (drie standen schakelaar). Deze schakelaar bepaald wanneer het alarm af moet gaan, na 20, 30 of 40 seconden. De ledjes geven de status aan dus: 10 seconden voorbij, 20 enz... De reset knop laat alles opnieuw beginnen.

Alles werkt, maar er is iets heel vreemds. De ledjes leken wel gedimd te branden, dus ik zet mijn scoop er op en wat blijkt ze worden de hele tijd gepwmt met een frequentie van ongeveer 6KHz. Hoe kan dat nou?

De code:



void ledjes(){
//ledjes

     if (tijd > 8){
        if (tijd > 18){
           if (tijd > 28){
              if (tijd > 38){
                 PORTA.F1 = 1;//groen
                 PORTA.F0 = 1;//groen
                 PORTA.F7 = 1;//geel
                 PORTA.F6 = 1;//rood
              }
              else
              {
                 PORTA.F1 = 1;//groen
                 PORTA.F0 = 1;//groen
                 PORTA.F7 = 1;//geel
                 PORTA.F6 = 0;//rood
              
              }
           }
           else
           {
               PORTA.F1 = 1;//groen
               PORTA.F0 = 1;//groen
               PORTA.F7 = 0;//geel
               PORTA.F6 = 0;//rood
           }

        }
        else
        {
           PORTA.F1 = 1;//groen
           PORTA.F0 = 0;//groen
           PORTA.F7 = 0;//geel
           PORTA.F6 = 0;//rood
        }


     }
     else
     {
     PORTA.F1 = 0;//groen
     PORTA.F0 = 0;//groen
     PORTA.F7 = 0;//geel
     PORTA.F6 = 0;//rood
     }

}


[Bericht gewijzigd door pientertje op (23%)]

Kan je je ledjes(){} functie eens aanpassen hiernaar:


void ledjes()
{
	unsigned byte led = 0;
	unsigned byte offmask = 0b00111100;
	
	//vul led in
	if(tijd > 38)	led |= 0b01000000;
	if(tijd > 28)	led |= 0b10000000;
	if(tijd > 18)	led |= 0b00000001;
	if(tijd > 8 )	led |= 0b00000010;
	
	//switch all leds off
	PORTA &= offmask;
	
	//switch juiste leds aan
	PORTA |= led;
}

Dat maakt het hele gebeuren een hele hoop prettiger om te lezen.
Daarbij kan je ook geen probleem krijgen van het RMW effect dat bij de pic16f voor kan komen :-)

tnx. Dat lost het probleem van de status ledjes op. Alleen nu doet het alarm ledje (PORTA.F2) nog moeiljk... Zelfde probleem.

Kan mijn stukje met de schakelaar nog mooier?

Dat kan zeker. >:)


void schakelaar_lees()
{
    //schakelaar
    PORTB.F0 = 0;
    PORTB.F2 = 1;
    if (PORTB.F1 == 1) {        // <<<
	PORTB.F0 = 1;
	PORTB.F2 = 0;
	if (PORTB.F1 == 1) {    // <<<
	    schakelaar = 2;
	} else {
	    schakelaar = 3;
	}
    } else {
	schakelaar = 1;
    }
}

Nu valt het (voor mij) beter op dat je twee maal na mekaar PORTB.F1 test.

Ben vergeten uit te leggen wat dat stukje moet doen:
Er zit daar een drie standen schakelaar (1-0-1), één pool aan F0 middelste aan F1 (met pullup) en de andere aan F2. De schakelaar wordt 2x getest, dus moet hij ook twee keer worden uitgelezen.

Een wisselschakelaar met een nul-stand, waarbij niets met de COMMON verbonden is? Kan je dan de COMMON niet met GND verbinden, en de twee andere pinnen met F0 en F1, elk met een pull-up? Dat scheelt een pin, en je hebt 3 mogelijkheden:

  1. F0 laag en F1 hoog.
  2. F0 hoog en F1 hoog.
  3. F0 hoog en F1 laag.