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%)]
Daan Timmer
Ik ben programmeur! geen electronicus! http://www.daantimmer.nl/ Er is een ontwerp! nu nog inhoud :-)
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?
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
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.
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
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:
- F0 laag en F1 hoog.
- F0 hoog en F1 hoog.
- F0 hoog en F1 laag.