Hey allemaal
Momenteel ben ik bezig met een poging tot een menu weergave op een LCD scherm geprogrammeerd in C op een Atmega32.
ISR(INT2_vect){
PORTB ^= 0x40;
_delay_us(1520000);
i++;
_delay_us(1520000);
if (i==1){
a++;
}
if (i==2){
a += 5
}
if (a==5){
a=1;
}
printMenu();
i=0;
}Wat ik met deze code probeer te doen is het volgende.
i moet de interrupt telling voorstellen
en a het gevolg van de telling.
Als i 1 keer hoog is in een seconde, dan a++.
Als i 2 keer hoog is in een seconde, dan a += 5.
Dan zou ik dus dit effect moeten krijgen.
Hoofdmenu *drukt op knop* (i = 1, a++)
menu1 *drukt op knop* (i = 1, a++)
menu2 *drukt op knop* (i = 1, a++)
menu3 *drukt op knop* (i = 1, a++)
menu4 *drukt op knop* (i = 1, a++)
menu5 --> word menu1.
deelmenu van menu1 (a = 6)
deelmenu van menu2 (a = 7)
deelmenu van menu3 (a = 8)
deelmenu van menu4 (a = 9)
Om een menu te 'selecteren': twee keer op de knop drukken. Wat er voor zorgt dat i = 2. Wat er voor zorgt dat a += 5.
Maar wat doet de code in de praktijk:
Als ik op het knopje druk, wacht hij even, en doet a++.
Als ik twee keer op het knopje druk, wacht hij even, en doet a++. Wacht weer even, en doet een tweede keer a++.
Terwijl hij het eigelijk zou moeten optellen, wat er voor zou moeten zorgen dat hij a+=5 doet.
Hoe los ik dit op?
Alvast bedankt! 
Jeroen
P.s. Ik had een ander bijprobleempje bij het display (2x16)
Bij de eerste regel valt telkens de eerste letter weg. Nu heb ik er gewoon een extra tekentje voor gedaan.. maar dit is natuurlijk niet de juiste oplossing =P
Weet iemand hoe dit komt? ^^
[Bericht gewijzigd door J-r0en op (95%)]
Heb je nog ergens een timer lopen waarin je bepaald hoeveel tijd er is verlopen nadat de knop 1 x is ingedrukt, anders gaat dat nooit werken.
Je kan om 4 bij a op te tellen het volgende doen:
a = a + 4;
a += 4;
Nee ik heb er geen timer in zitten.
Dacht dat het gewoon kon door middel van de delay.
dat je in de tijd van de delay op het knopje drukt, en na de delay, als i=1, dat hij dan a++ doet.
Hoe moet zo'n timer eruit zien dan?
Beginner hier 
Bedankt voor je reactie 
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Welke processor gebruik je dan ... ik neem aan dat je bv iedere 10 ms een interrupt kan generen. Hierin laat een teller aflopen naar nul.
int teller;
int i;
timer () {
if (teller != 0) teller --;
}
knop () {
if (teller > 0) {
// knop 2 x ingedrukt binnen 1 seconde
i += 4;
teller = 0;
}
else {
teller = 100; // 100 x 10 ms
i++;
}
}
op zo'n manier dus ....
Op 8 mei 2009 21:27:16 schreef flipflop:
Zou je de openingspost niet eerst even herstellen? Het is maar een ideetje hoor
Dat ideetje had ik ook 
Is gefixed.
Op 8 mei 2009 21:29:48 schreef willem4ever:
int teller;
int i;timer () {
if (teller != 0) teller --;
}
knop () {
if (teller > 0) {
// knop 2 x ingedrukt binnen 1 seconde
i += 4;
teller = 0;
}
else {
teller = 100; // 100 x 10 ms
i++;
}}
op zo'n manier dus ....
Wat doet '!=' precies? Kleiner of gelijk aan?
Dus dit zorgt voor die seconde *druk* tijd voor 10ms delay:
if (teller != 0) teller --;Maar hoe zorgt de knop er voor dat die teller-- word onderbroken zodat teller = 100 en dan i++ doet?
Op 8 mei 2009 21:37:51 schreef J-r0en:
[...]Wat doet '!=' precies? Kleiner of gelijk aan?
Dus dit zorgt voor die seconde *druk* tijd voor 10ms delay:if (teller != 0) teller --;Maar hoe zorgt de knop er voor dat die teller-- word onderbroken zodat teller = 100 en dan i++ doet?
!= is ongelijk aan, de letter loopt af totdat hij bij nul is dan stop hij. Als je de knop de eerste keer indrukt wordt de teller op 100 gezet en begint dan af te lopen. Ik ben van een timer interrupt van 10 ms uitgegaan, dus na 1 seconde staat de teller op nul en stopt met af te tellen.
Als je nu twee keer binnen 1 seconde de knop indrukt zal de teller dus ergens tussen 100 en 0 zijn, dus als de teller groter als nul is is de knop waarschijnlijk 2 x binnen een seconde ingedrukt.
Je kan != ook vervangen door > maakt in dit geval niets uit, zolang de teller maar op nul stopt.
Aah op die fiets. Klinkt alsof het werkt =P
Ik ga het even uitproberen 
Zal zo even het resultaat posten ^^
Jeroen
Op 8 mei 2009 21:59:32 schreef J-r0en:
Aah op die fiets. Klinkt alsof het werkt =P
Ik ga het even uitproberen
Zal zo even het resultaat posten ^^Jeroen
Je moet natuurlijk wel zorgen dat je de timer interrupt activeert, maar ik heb nog steeds geen idee wat je voor processortje je gebruikt. Dit is een voorbeeld waarin ik de aanname heb gedaan dat de timer interrupt dus iedere 10 ms plaats vindt.
Op 8 mei 2009 22:08:00 schreef willem4ever:
[...]Je moet natuurlijk wel zorgen dat je de timer interrupt activeert, maar ik heb nog steeds geen idee wat je voor processortje je gebruikt. Dit is een voorbeeld waarin ik de aanname heb gedaan dat de timer interrupt dus iedere 10 ms plaats vindt.
Microcontroller Atmega32, had ik even geplaatst in de openingspost.
Ben nu bezig met het integreren van de timer in de interruptfunctie.
Heb paar errors, ben ik aan het proberen te verhelpen =P
Edit;
//volatile int i=0;
//volatile int a=0;
int i=0;
int b=0;
ISR(INT2_vect){
PORTB ^= 0x40;
int teller(){
if (b>0);
b--;
}
void knop(){
if (b > 0)
{
i += 4;
b = 0;
}
else {
b=100;
i++;
}
}
printMenu();
}
Had dit ervan gemaakt. Errors waren weg, alleen als ik hem ging testen ging het niet zoals het hoorde.
Te tekst '*Hoofdmenu' kwam op het beeld.(zoals het hoort)
Maar als ik op het knopje drukte, veranderde het in 'Hoofdmenu'
En als ik dan nog een keer druk, veranderd er niks.
En als ik twee keer heel enel druk, gebeurd er ook niks .. =P
Blijft blijkbaar haken en telt geen i++
de timer is een aparte interrupt routine, zoiets als hieronder. Google even op "atmega32 timer counter" voor meer info over de timers in de atmega32 Hier bijvoorbeeld
ISR(TIMER2_OVF_vect) {
}
ISR(INT2_vect){
PORTB ^= 0x40;
}
[Bericht gewijzigd door willem4ever op (14%)]
if(knop ingedrukt){
i++;
starttimer van 1 seconde;
1 sec voorbij;
if(knop nog een keer is ingedrukt in die 1 sec){
a+=5;
}
else{
a++
}
}
Snap alleen niet hoe ik me dat voor elkaar moet krijgen :\
Ben nu moederdagcadeau dus ik reageer pas weer in de namiddag. Reacties zijn welkom!
Bedankt voor de hulp
Ik ben nog bezig geweest met de Timer code, maar ik kwam er echt niet uit :\
Is er anders een manier om een tweede interrupt aan te sluiten voor a += 5?
Dit moet dan gebeuren op een poort die eigelijk geen interrupt is. Omdat we de interrupts op de D poort al gebruiken als data voor het LCD scherm.
Kan iemand mij daarbij helpen?
Henry S.
Moderator
Confucius says chà bù duo. Deze post is niet door ChatGPT gegenereerd. De 2019 CO labvoeding.
4 topics over 1 project is niet nodig: http://www.circuitsonline.net/forum/view/73201
Slotje.
