forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
spatna funkce switch case

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Jiné mikrokontroléry, procesory, hradla
 
juraw
Profesionál
Profesionál


Založen: 24.9.2012
Příspěvky: 47

PříspěvekZaslal: 27 únor 2013, 10:01    Předmět: spatna funkce switch case Citovat

Zdravim, pokousel jsem se napsat kod pro maticovou klavesnici 4x4, problem nastal se switch casem, do jednoho z 16 casu to skoci bez problemu, za jednotlivymi "casy" mam if, kdyz se nesplni, tak to skoci az na posledni else z 16. Cast kodu je zde

kód:

void klavesnice_cteni(void)

{      
   while(1)
   {      
      portef = PINF;
      switch (portef)
      {
      case 0b11101110:  if (osetreno)
                     {
                     pom_znak+=0b00000001;
                     lcd_gotoxy (0,2);
                     lcd_puts("1    ");      
                     posun_radku();   
                     }            
                    else
                       {
                     lcd_gotoxy (0,2);
                     lcd_puts("-    ");
                     zakmit();
                     }
                    break;

      case 0b11011110: if (osetreno)
                     {
                     pom_znak+=0b00000010;
                     lcd_gotoxy (0,2);
                     lcd_puts("2    ");      
                     posun_radku();
                     }            
                    else
                         {
                     lcd_gotoxy (0,2);
                     lcd_puts("-    ");
                     zakmit();
                     }
                    break;


         default:  lcd_gotoxy (0,2);
            lcd_puts("-");
            break;
      }
   }
}


Arrow administrator: přesunuto z "Ostatní"
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 708

PříspěvekZaslal: 27 únor 2013, 10:25    Předmět: Citovat

Zkusil bych přidat závorky takto :
kód:

void klavesnice_cteni(void)

{     
   while(1)
   {     
      portef = PINF;
      switch (portef)
      {
      case 0b11101110:
                      { 
                           if (osetreno)
                           {
                           pom_znak+=0b00000001;
                           lcd_gotoxy (0,2);
                           lcd_puts("1    ");     
                           posun_radku();   
                           }           
                          else
                             {
                           lcd_gotoxy (0,2);
                           lcd_puts("-    ");
                           zakmit();
                           }
                      }
                    break;

      case 0b11011110:
                      {
                           if (osetreno)
                           {
                           pom_znak+=0b00000010;
                           lcd_gotoxy (0,2);
                           lcd_puts("2    ");     
                           posun_radku();
                           }           
                          else
                               {
                           lcd_gotoxy (0,2);
                           lcd_puts("-    ");
                           zakmit();
                           }
                      }
                    break;


         default:  lcd_gotoxy (0,2);
            lcd_puts("-");
            break;
      }
   }
}



Nevím, jestli to pomůže a teoreticky by to mělo být jedno, ale za zkoušku nic nedáš ...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Atlan
Profesionál
Profesionál


Založen: 4.2.2009
Příspěvky: 889

PříspěvekZaslal: 27 únor 2013, 10:26    Předmět: Citovat

Za dvojbotkou zatvorku a za breakom tiez, v kazdoma case
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Panda38
Profesionál
Profesionál


Založen: 18.9.2012
Příspěvky: 398
Bydliště: Praha, Most

PříspěvekZaslal: 27 únor 2013, 11:04    Předmět: Citovat

Nemělo by se projevit, na závorky to bylo v pořádku (pokud překladač funguje správně).

Nevím jaký to je MCU - nepřeteče zásobník, že by to pak skočilo kam nemá?

Nebo chyba úvahy - protože jsou všechny else stejné. Jestli to zjišťuješ v debuggeru, tak pak je pravděpodobné, že to takto optimalizuje překladač a spojí stejné větve.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
 

 
juraw
Profesionál
Profesionál


Založen: 24.9.2012
Příspěvky: 47

PříspěvekZaslal: 27 únor 2013, 12:11    Předmět: Citovat

zavorky nepomohly, delam to v debuggeru v avr studiu 4, ale i kdyz to nahraju do procesoru (ATmega128), tak to stale vypisuje "-"

opravdu, kdyz zmenim obsah za else, tak se vykona spravne, jen me nenapada jak to obejit
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Panda38
Profesionál
Profesionál


Založen: 18.9.2012
Příspěvky: 398
Bydliště: Praha, Most

PříspěvekZaslal: 27 únor 2013, 12:21    Předmět: Citovat

Bez znalosti ostatního kódu (kde se bere "osetreno") se radit nedá.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
 

 
juraw
Profesionál
Profesionál


Založen: 24.9.2012
Příspěvky: 47

PříspěvekZaslal: 27 únor 2013, 12:31    Předmět: Citovat

omlouvam se..

kód:


void posun_radku(void)
{   
   if ((n>0) && (n<5)) {
      PORTF |= _BV(n-1);}
   
   if (n == 4) {n=0;}         // po n=3 radku pokracuje od nulteho

      PORTF &= ~(_BV(n));      //naeguje n-ty radek, obdoba clear bit
      n++;
      osetreno = false;
      klavesnice_cteni();
}



void zakmit(void)
{   
   _delay_ms(20);
   osetreno = true;
   klavesnice_cteni();
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
juraw
Profesionál
Profesionál


Založen: 24.9.2012
Příspěvky: 47

PříspěvekZaslal: 27 únor 2013, 12:32    Předmět: Citovat

a jeste definice osetrena...

typedef enum {false,true}boolean;
boolean osetreno = false;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Panda38
Profesionál
Profesionál


Založen: 18.9.2012
Příspěvky: 398
Bydliště: Praha, Most

PříspěvekZaslal: 27 únor 2013, 12:39    Předmět: Citovat

To máš celé nějaké zmatené:

- z funkce klavesnice_cteni se Ti to nikdy nevrátí, ty příkazy "break" platí jen pro přerušení větví switche

- Voláš s nekonečnou rekurzí funkce posun_radku/zakmit s klavesnice_cteni, takže po pár průchodech se Ti zahltí stack a program se zblázní

- "osetreno" nemá vlastně žádný význam, to nemáš dobře promyšlené. V jednom okamžiku přečteš a zobrazíš klávesu, hned to zas smažeš, počkáš 20 ms a znovu testuješ - to není ošetření zákmitů, díky tomu vidíš trvale že nic nebylo stisknuto

Možná jsi zvyklý z BASICu nebo assembleru že se skáče na labely. Ale funkce v C jsou podprogramy do kterých se vleze (uloží se návratová adresa do zásobníku) a ze kterých se to po ukončení vrátí (obnoví se ze zásobníku původní adresa programu).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
 

 
juraw
Profesionál
Profesionál


Založen: 24.9.2012
Příspěvky: 47

PříspěvekZaslal: 27 únor 2013, 17:34    Předmět: Citovat

Dekuji za pripominky, pravda, nejvic jsem delal v assemberu a basicu Confused program jsem opravil Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Jiné mikrokontroléry, procesory, hradla Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2017 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)