[C]Een variabele verandere buiten while loop

Pagina: 1
Acties:

  • Beuker
  • Registratie: December 2000
  • Laatst online: 20-05 20:52
Hey,

Ik heb een while loop:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
main()
{   
    TRISB0 = 0;
    TRISB1 = 0;
    TRISB2 = 0;
    TRISB3 = 0;
    TRISB4 = 0;
    TRISB5 = 0;
    TRISB6 = 0;
    TRISB7 = 1;
    RB0 =1;
    RB1 =1;
    RB2 =1;
    RB3 =1;
    RB4 =1;
        RBPU = 0;   // enable internal pullups on PORTB

while(1)    // continually
    {
        if (RB7)
        { 
            RB2 = aan;
                                    RB3 = aan;
        }

            if (!RB7)       // if the switch is at logic one
            {
            RB2 = uit;
                                    RB1 = aan;
                                    delay(4);
                                    RB1 = uit;
                                    RB0 = aan;
                                    delay(4);
                                    RB3 = uit;
                                    RB4 = aan;
                                    delay(12);
                                    RB4 = uit;
                                    delay(2);
                                    RB4 = aan;
                                    delay(2);
                                    RB4 = uit;
                                    delay(2);
                                    RB4 = aan;
                                    delay(2);
                                    RB4 = uit;
                                    RB3 = aan;
                                    delay(4);
                                    RB0 = uit;
                                    RB2 = aan;
            }
    }



Nu wordt de loop continue doorlopen met RB7 als input 1 of 0.

Nu wil ik door middel van een interrupt oid continue checken op RB7 of er gedrukt wordt. Dus ook als de loop aan het lopen is. Weet iemand hoe ik dat doe? Dus als je halverwege de loop zit, en je geeft een input(een knop) dat die dan wordt onthouden. Nu zit ik met het probleem, als de loop loopt, en ik op de knop druk, de loop pas aan het einde checkt of er gedrukt is(en dan is de druk op de knop alweer verlopen).

  • Yoeri
  • Registratie: Maart 2003
  • Niet online

Yoeri

O+ Joyce O+

(overleden)
euh... zeg het me als ik onzin blaat, maar is een eventhandler (keypress event) geen optie?
DJ_Flowerz schreef op 31 maart 2004 @ 15:06:
Dit is C code dat op een PIC 18F252 microcontroller draait.
Gebruik dan ook geen C# in je topictitle 8)7

[ Voor 55% gewijzigd door Yoeri op 31-03-2004 15:09 ]

Kijkje in de redactiekeuken van Tweakers.net
22 dec: Onze reputatie hooghouden
20 dec: Acht fouten


  • Beuker
  • Registratie: December 2000
  • Laatst online: 20-05 20:52
Robbedoeske schreef op 31 maart 2004 @ 14:33:
euh... zeg het me als ik onzin blaat, maar is een eventhandler (keypress event) geen optie?
Euhm wat vergeten er bij te zetten |:(

Dit is C code dat op een PIC 18F252 microcontroller draait.

Wat ik wil is dat als ik op een knopje druk (RB7 is input) dat er een functie word aangeroepen waar ik bijv een waarde met 1 verhoog zodat ik aan het einde van die while lus naar kan kijken of die dus 1 is.

  • Beuker
  • Registratie: December 2000
  • Laatst online: 20-05 20:52
Robbedoeske schreef op 31 maart 2004 @ 14:33:
Gebruik dan ook geen C# in je topictitle 8)7
Ja foutje... De verandering is al bij de mannen van dit topic...

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Titel fxd :)

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

globale static ervan maken, en dan in je interrupt handler die zetten? En natuurlijk even locken dan met een semaphore oid om problemen te voorkomen...

  • Beuker
  • Registratie: December 2000
  • Laatst online: 20-05 20:52
Zoijar schreef op 31 maart 2004 @ 15:55:
globale static ervan maken, en dan in je interrupt handler die zetten? En natuurlijk even locken dan met een semaphore oid om problemen te voorkomen...
Euhm watte!! :)

Ik ben n00b wat betreft dit... Zou je me iets meer op weg kunnen helpen...

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Zoiets

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
static int pressed = 0;

void int_handler() {
   pressed++;
}

int main() {
   while (1) {
      if (pressed) {
          pressed--;

      } ...
   }
}


Als het gewoon op een ding draait hoef je niet te locken, zat aan twee threads te denken, maar interrupt onderbreekt gewoon je loop eventjes, dus kan nooit fout gaan.

[ Voor 35% gewijzigd door Zoijar op 31-03-2004 16:23 ]


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Zowiezo zijn twee threads niet direct nodig. Je kunt eventueel ook gebruikmaken van select()-functiecall. Hiermee kun je in de gaten houden of er iets wordt geschreven naar een fd en kun je om de zoveel tijd (kun je zelf instellen) door de loop gaan.

offtopic:
[code][/code]

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

offtopic:
doh...niet echt wakker vandaag

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Shadowman schreef op 31 maart 2004 @ 16:16:
Zowiezo zijn twee threads niet direct nodig. Je kunt eventueel ook gebruikmaken van select()-functiecall. Hiermee kun je in de gaten houden of er iets wordt geschreven naar een fd en kun je om de zoveel tijd (kun je zelf instellen) door de loop gaan.
select() ? Op een microcontroller? FileDescriptors? Gaat niet werken hoor.
De oplossing is inderdaad een interrupt, en dan global schrijven. Maar gezien het feit dat de TS moeite heeft met if...else... weet ik niet of hij op dit moment al meteen embedded stuff moet proberen, of dat hij eerst eens wat op desktops met debuggers moet rotzooien.

[ Voor 1% gewijzigd door MSalters op 31-03-2004 18:35 . Reden: [/ verklooid ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Zoijar schreef op 31 maart 2004 @ 16:01:
Als het gewoon op een ding draait hoef je niet te locken, zat aan twee threads te denken, maar interrupt onderbreekt gewoon je loop eventjes, dus kan nooit fout gaan.
Je vergist je; het kan wel fout gaan :)

Op een 8bits uP ( Zoals deze PIC waarchijnlijk ) bestaat een add v/e int uit twee instructies ( een add, en een add with carry ), waartussen een interrupt kan optreden.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat maakt niet uit (overigens gebruikt de code zelf een sub, dus dan met een subtraction with borrow)

Als de waarde 256 zou zijn, en de eerste byte wordt gesubtract, dan wordt het even 511. Een subtraction met borrow van 0 op de 2e byte zal er 255 van maken, maar ipv hiervan wordt de interrupt uitgevoerd. In de interrupt handler wordt de waarde met 1 verhoogd, dus daar wordt hij 512. Als hij terug komt in de oorspronkelijke code doet ie alsnog de subtraction with borrow, waardoor het 256 wordt. Dit is precies wat het zou moeten zijn na -1+1

[ Voor 4% gewijzigd door .oisyn op 31-03-2004 21:27 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

farlane schreef op 31 maart 2004 @ 21:22:
Op een 8bits uP ( Zoals deze PIC waarchijnlijk ) bestaat een add v/e int uit twee instructies ( een add, en een add with carry ), waartussen een interrupt kan optreden.
Interrupts staan uit binnen een interrupt toch? In ieder geval die van hoger level. Als er dan zoiets zou gebeuren, dan is het niet een interrupt van je programma die ook die waarde kan/zal gebruiken.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Zoijar schreef op 31 maart 2004 @ 21:50:
Interrupts staan uit binnen een interrupt toch? In ieder geval die van hoger level. Als er dan zoiets zou gebeuren, dan is het niet een interrupt van je programma die ook die waarde kan/zal gebruiken.
Maar pressed-- wordt iets als:
code:
1
2
3
mov al, pressed
inc al
mov pressed, al

Als de interrupt service routine tussen instructie 1 en 3 wordt uitgevoerd, dan ben je een pressed++ kwijt omdat pressed-- er overheen schrijft.

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Ik heb eerlijk gezegd geen flauw idee hoe goed C wordt ondersteund op zon microcontroller, maar what about...

C:
1
volatile int a;

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Korben schreef op 01 april 2004 @ 09:14:
Ik heb eerlijk gezegd geen flauw idee hoe goed C wordt ondersteund op zon microcontroller, maar what about...

C:
1
volatile int a;
De C compiler die ik gebruik is nog niet helemaal zover :), dat zou inline asm worden waarschijnlijk.

[edit]
Hmmm, zat met mijn gedachten bij het 'register' keyword

[ Voor 9% gewijzigd door farlane op 01-04-2004 12:54 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Korben schreef op 01 april 2004 @ 09:14:
Ik heb eerlijk gezegd geen flauw idee hoe goed C wordt ondersteund op zon microcontroller, maar what about...

C:
1
volatile int a;
Ja, what about it?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

volatile is toch alleen maar een compiler hint, dat er geen optimalisaties mogen worden gedaan op de var die er vanuit gaan dat deze constant blijft als deze code geen wijzigingen maakt? Je moet dan nog steeds wel locken.

(oh en olaf, je had natuurlijk helemaal gelijk... thread en int verschillen niet eens zo veel van elkaar zelfs...)

[ Voor 22% gewijzigd door Zoijar op 01-04-2004 11:40 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Zoijar schreef op 01 april 2004 @ 11:39:
volatile is toch alleen maar een compiler hint, dat er geen optimalisaties mogen worden gedaan op de var die er vanuit gaan dat deze constant blijft als deze code geen wijzigingen maakt? Je moet dan nog steeds wel locken.
Als de operatie atomair (dwz expandeert tot 1 enkele asm-instructie) is hoef je een volatile operatie niet te locken. Dat dit spelen met vuur is omdat je in de shit gaat raken zodra je naar een platform port waar dat niet zo is is een tweede :)

Professionele website nodig?


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

curry684 schreef op 01 april 2004 @ 11:58:
Als de operatie atomair (dwz expandeert tot 1 enkele asm-instructie) is hoef je een volatile operatie niet te locken. Dat dit spelen met vuur is omdat je in de shit gaat raken zodra je naar een platform port waar dat niet zo is is een tweede :)
Je moet toch ook je memory bus locken? Gewoon BTS (test and set) kan fout gaan (alleen op multi processor systemen?) Het lijkt me in ieder geval beter om met LOCK BTS te werken voor de zekerheid. Of genereert je compiler die automatisch aan de hand van het volatile keyword?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Zoijar schreef op 01 april 2004 @ 12:16:
[...]

Je moet toch ook je memory bus locken? Gewoon BTS (test and set) kan fout gaan (alleen op multi processor systemen?) Het lijkt me in ieder geval beter om met LOCK BTS te werken voor de zekerheid. Of genereert je compiler die automatisch aan de hand van het volatile keyword?
Volgens mij is SMP zo gebouwd dat 2 CPU's nooit 'tegelijk', dus 'tijdens' een instructie, op hetzelfde geheugenadres kunnen werken, ik weet niet zeker echter hoe dat geimplementeerd is.

Professionele website nodig?


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
curry684 schreef op 01 april 2004 @ 11:58:
Als de operatie atomair (dwz expandeert tot 1 enkele asm-instructie) is hoef je een volatile operatie niet te locken. Dat dit spelen met vuur is omdat je in de shit gaat raken zodra je naar een platform port waar dat niet zo is is een tweede :)
Fout. Als een andere CPU of een device de waarde wijzigt, zit je nog steeds in de problemen.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
OlafvdSpek schreef op 01 april 2004 @ 13:31:
Fout. Als een andere CPU of een device de waarde wijzigt, zit je nog steeds in de problemen.
curry684 schreef op 01 april 2004 @ 12:32:
Volgens mij is SMP zo gebouwd dat 2 CPU's nooit 'tegelijk', dus 'tijdens' een instructie, op hetzelfde geheugenadres kunnen werken, ik weet niet zeker echter hoe dat geimplementeerd is.
In x86 heb je dan een LOCK prefix nodig, het gaat niet automatisch. Dat zou ook wel erg veel overhead opleveren.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

OlafvdSpek schreef op 01 april 2004 @ 13:33:
[...]


[...]

In x86 heb je dan een LOCK prefix nodig, het gaat niet automatisch. Dat zou ook wel erg veel overhead opleveren.
Hum ik meende dat die synchronizatie op de geheugenbus zelf werd uitgevoerd door de SMP chipset... * curry684 wordt ook dagje ouder blijkbaar :)

Professionele website nodig?


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Maar als de data in de cache zit, ziet de bus alleen de write.

Verwijderd

misshien een beetje offtopic, maar effe een vraag aan de TS.
Waarmee compile jij dit? Ik heb MPLAB IDE met een plugin zodat ie C ondersteunt, maar ik krijg een -p error bij het compilen van wat dan ook.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Verwijderd schreef op 01 april 2004 @ 15:47:
misshien een beetje offtopic, maar effe een vraag aan de TS.
Waarmee compile jij dit? Ik heb MPLAB IDE met een plugin zodat ie C ondersteunt, maar ik krijg een -p error bij het compilen van wat dan ook.
What the hell is een -p error ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

een of andere internal error waar je zelf volgens niets aan kan doen :s maar ik dacht misshien doe ik iets verkeerd ofzo. Ik heb het een paar keer geinstalleerd, maar steeds hetzelfde

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Welke c compiler heb je geinstalleerd dan ? De CSS compiler ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Belgar
  • Registratie: Januari 2002
  • Laatst online: 22-09-2025

Belgar

Archmaster ranzige code..

De PIC zet zowiezo een interrupt bit die je kan bekijken zonder dat je ook werkelijk een sprong moet doen. Deze bit wordt gezet als op bepaalde poorten de input veranderd. deze bit kun je gewoon bekijken in je loop.

op de 16 serie is dat RBIF en triggert op poortten RB4 RB5 RB6 en RB7, maar alleen als de betreffende poort als een input gedefineerd is

...Als het maar werkt


Verwijderd

farlane schreef op 01 april 2004 @ 23:24:
Welke c compiler heb je geinstalleerd dan ? De CSS compiler ?
picc compiler van http://www.htsoft.com/
Pagina: 1