Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[AVR] Programmeren van knopjes

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dag mensen,

ik ben bezig om een beetje te experimenteren met een AVR controllertje. Een tijdje terug heb ik al een printje ge-etst en een programmer gemaakt zodat de ontwikkelomgeving helemaal compleet is.

Ondertussen ben ik al bezig geweest met timers, displays en ledjes maar ik zou nu wat willen doen met knopjes. Ik zou graag een aantal counters willen ophogen als ik verschillende knopjes druk, dus knop 1 is counter 1 ophogen, knop 2 is counter 1 verminderen, knop 3 is counter 2 ophogen etc etc.

Hoe kan ik nou het beste een button handler maken in C voor een AVR controllertje zonder dat ik aanslagen mis. Deze code: download mist namelijk best vaak bepaalde acties. En hoe meer knopjes hoe vaker het fout gaat.

Hoe kan ik dit het beste oplossen?

  • Unicron
  • Registratie: November 2001
  • Laatst online: 16-11 20:54
Kun je niet gebruik maken van CodeVision, dat doe ik namelijk altijd bij een Atmel?

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 28-11 20:28
Kan je die knoppen niet aan 1 of meerdere interrupt source(s) hangen? Elke keer waneer er een knop word ingedrukt dat dan specifieke code voor die knop word uitgevoerd. Dat lijk me sneller te gaan dan telkens te pollen of een knop is ingedrukt.

Verwijderd

Topicstarter
Unicron schreef op 02 november 2003 @ 17:15:
Kun je niet gebruik maken van CodeVision, dat doe ik namelijk altijd bij een Atmel?
Ik maak gebruik van de CodeVision ontwikkelomgeving (standard editie). Maar wat zou ik hierin kunnen doen?


Een interrupt kun je alleen op 2 externe pinnen doen, en die wil ik graag voor andere doeleinden gaan gebruiken.

Verwijderd

Volgensmij kan dit ook niet echt werken, het werkt alleen als je het knopje tijdens de delay van 100uSec loslaat. Daarom gaat het helemaal mis met meerdere knoppen. Interrupts werkt inderdaad beter. Je zou met wat logica een gesharde interruptlijn kunnen maken. De knopjes wel afzonderlijk op een input hangen. Na een interrupt pol je effe in je interrupt server routine welke knop de interrupt heeft veroorzaakt.
Polling moet overigens ook gewoon werken, maar niet zo. Probeer zoiets eens:

if ((PINC & 0x01) && knop == FALSE)
{
counter++;
knop = TREU;
}
if ( !(PINC & 0x01) )
{
knop = FALSE;
}

Mischien dat je je knop ook moet ontdenderen. Gewoon effe wat proberen.

Verwijderd

Topicstarter
Verwijderd schreef op 02 november 2003 @ 18:02:
Volgensmij kan dit ook niet echt werken, het werkt alleen als je het knopje tijdens de delay van 100uSec loslaat. Daarom gaat het helemaal mis met meerdere knoppen. Interrupts werkt inderdaad beter. Je zou met wat logica een gesharde interruptlijn kunnen maken. De knopjes wel afzonderlijk op een input hangen. Na een interrupt pol je effe in je interrupt server routine welke knop de interrupt heeft veroorzaakt.
Polling moet overigens ook gewoon werken, maar niet zo. Probeer zoiets eens:

if ((PINC & 0x01) && knop == FALSE)
{
counter++;
knop = TREU;
}
if ( !(PINC & 0x01) )
{
knop = FALSE;
}

Mischien dat je je knop ook moet ontdenderen. Gewoon effe wat proberen.
Zo werkt ie perfect :) :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void button_handler(void)
{
    //Button 1 increase
    if ((PINC & 0x01) && knop == 0)
    {
        delay_ms(60);
        
        if (PINC & 0x01)
        {
            counter++;
            knop = 1;
        }
    }
    
    if ( !(PINC & 0x01) )
    {
        knop = 0;
    }
    
    //Button 2 decrease
    if ((PINC & 0x02) && knop2 == 0)
    {
        delay_ms(60);
        
        if (PINC & 0x02)
        {
            counter--;
            knop2 = 1;
        }
    }
    
    if ( !(PINC & 0x02) )
    {
        knop2 = 0;
    }
    
    PORTB = counter;
}

Verwijderd

tuurlijk kan je meerdere knoppen aan 1 interrupt hangen, gewoon met een or-poortje aan 1 interrupt.
en als er dan een interrupt binnenkomt kijken welke knop er ingedrukt is.

zowizo zal je je knoppen moeten ontdenderen met een delay (zoals hierboven aangegeven) anders heb je ineens wel een heleboel ophoginkjes te pakken :)

[ Voor 31% gewijzigd door Verwijderd op 02-11-2003 22:37 ]


  • Benadski
  • Registratie: November 2001
  • Laatst online: 28-11 12:55
Een OR-poortje is wat overdreven, een diode is goed genoeg! :)

Na elke ontdenderde knop een diode zetten met de anode aan een interrupt lijntje werkt goed! Welke knop er ook wordt ingedrukt, de diode sluist het ook door naar de interrupt pin.

Wat je ook kan doen is een timer gebruiken, als je elke 50ms tot 200ms even de poort inleest mis je vast niet veel.

suc6 :)

  • Dr Nix
  • Registratie: September 2000
  • Laatst online: 28-11 13:40

Dr Nix

a.k.a. Dr. Nix

Ontdenderen kan ook hardwarematig: bijvoorbeeld een RS-flipflop of een simpel rc-netwerkje. Scheelt weer software :)

Een koe is en blijft een merkwaardig beest!


  • sebastius
  • Registratie: September 2000
  • Laatst online: 28-11 22:17

sebastius

Laten we lekker link gaan doen

In een basic voor de atmels (MCS AVR Basic) doen ze het met een standaard functie Debounce. Die werkt ongeveer het volgende:

Check of knopje is ingedrukt. Zo nee ga dan verder naar de rest van het programma. Zo ja wacht hij een bepaald aantal miliseconden en dan checkt ie de toestand van de poort nogmaals. En als ie daar doorheen komt voert ie de functie uit.

Verwijderd

sebastius schreef op 03 november 2003 @ 15:22:
In een basic voor de atmels (MCS AVR Basic) doen ze het met een standaard functie Debounce. Die werkt ongeveer het volgende:

Check of knopje is ingedrukt. Zo nee ga dan verder naar de rest van het programma. Zo ja wacht hij een bepaald aantal miliseconden en dan checkt ie de toestand van de poort nogmaals. En als ie daar doorheen komt voert ie de functie uit.
Dat kan wel werken, maar niet altijd wenselijk zijn, omdat je knop reactie hierdoor dus vertraagt wordt. Je kunt beter iets programmeren als:
kijk of knop is ingedrukt....
als ingedrukt, voer dan direct de code uit voor de knop...
voordat een toets weer gecontroleerd mag worden, moet er een minimale tijd verstreken zijn (x aantal miliseconden).

Bij sommige stukken code is het helemaal niet nodig om deze tijd bij te houden, omdat de code zelf een vertraging vormt (als je dus enkele 100en instructies hebt bijvoorbeeld). In de gevallen waarbij het aantal instructies te weinig is, kun je dan de tijd opnemen met een hardwarematige Timer.

Verwijderd

Ff een ander vraagje maar het heeft wel met AVR temaken..

Ik ben opzoek naar een programmer voor de Atmel AVR serie (o.a. de 2313 en 8535) op de serieele poort. De paralelle poort vind ik zeer onhandig omdat m'n printer daar op aan gesloten zit. Een serieele poort heb je altijd wel vrij en zit op elke pc.

Ik heb deze programmer gevonden: http://www.avr1.org/pavr/pavr.html maar vraag me af of hij werkt.
Iemand mischien andere ideeen voor een niet al te dure (liefst zelfbouw dus) programmer?
Pagina: 1