Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

AVR-GCC

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    AVR-GCC

    Oskab keegi öelda mis on allolevas koodis valesti, et "while" tsükkel ei katke? Katkestus juhtub kindlalt ning ka kood käivitatakse kenasti. Kas võib olla, AVR GCC'l on mingi imelik muutuja skoobi teema?

    Kompiileriks on, nagu mainitud, AVR GCC mida olen kasutanud alles paar päeva ning pole veel päris põhjalikult süveneda jõudnud. CodeVision AVRiga sarnane kood nagu oleks toiminud.

    Tänud ette.

    --
    Kood:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    unsigned char lipp;
    
    SIGNAL (SIG_INTERRUPT0) { // Katkestus
     lipp = 1;
    }
    
    int main() {
     // Võtame arvesse katkestused INT0 ning INT1
     // Katkestused juhtuvad madala nivoo puhul.
    
     GIMSK = 0xC0;
     GIFR = 0xC0;
    
     while (!lipp) {
      // Teeme midagi ning ootame, et katkestus tuleks
     }
    
     // ... muud kood 
    
    }

    #2
    Ehk nii?!
    Kood:
    include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    unsigned int lipp;
    
    SIGNAL (SIG_INTERRUPT0) { // Katkestus
     lipp = 1;
    }
    
    int main() {
     // Võtame arvesse katkestused INT0 ning INT1
     // Katkestused juhtuvad madala nivoo puhul.
    
     GIMSK = 0xC0;
     GIFR = 0xC0;
    
     while (!lipp=1) {
      // Teeme midagi ning ootame, et katkestus tuleks
     }
    
    
    
    
     // ... muud kood 
    
    }
    C kohta võid abi siit leida:

    http://computer.howstuffworks.com/c.htm[B]

    Comment


      #3
      Originally posted by doktorms@Jun 7 2004, 21:11
      Ehk nii?!
      Ei. Selline konditsioon nagu "(!lipp = 1)" ei saa kohe mingil juhul töötada. Pigem siis "(lipp != 1)" aga hetkel teeb see sama välja mis "(!lipp)". Proovitud on mõlemaga.

      Samuti pole antud juhul vahet kas on kasutuses char (0-255) või int (0-65535). Kindluse mõttes sai jällegi proovitud muidugi mõlemaga. Ainult 0 ja 1 väärtuse jaoks on tegelikult mõlemad tüübid liialt suured. Praegu testimiseks sobivad küll, eks pärast optimeerib nii et mitu lippu asub ühes baidis koos.

      Ning C peaks nagu enamvähem käpas olema, vähemalt i386 platvormil. :/ Samuti toimis mäletamist mööda sarnane syntax CodeVision AVR C's kenasti. Mingi AVR GCC spetsiifiline asi?

      Comment


        #4
        Ma olen pime. Ma ei saa aru kuidas mul AVR GCC FAQs just see (esimene) punkt kahe silma vahele jäi. Oligi skoobi ning optimeerimise küsimus. Õige kasutus oleks nii:
        Kood:
        volatile unsigned char lipp;

        Comment


          #5
          Õige ta on kasutada volatile keywordi. See ei luba kompilaatoril optimiseerimist kasutada ja muutuja kirjutatakse peale omistamist kohe mällu.
          Kindlam oleks ka muutuja algväärtustamine kas definitsioonis või eraldi ennem kasutamist.

          #define TRUE 1
          #define FALSE 0

          volatile unsigned char cLipp = FALSE ;
          Taavi Jantson

          Comment

          Working...
          X