Atmega32 nefunkční proměnná v přerušení – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Atmega32 nefunkční proměnná v přerušení – Mikrokontroléry – Fórum – Programujte.comAtmega32 nefunkční proměnná v přerušení – Mikrokontroléry – Fórum – Programujte.com

 

Protos0
Newbie
7. 12. 2012   #1
-
0
-


Zdravím, potřebuji ovládat osm serv tak jsem spáchal tento program a on částečne funguje serva nastaví výchozí polohu to je v pořádku, problém mám v tom že když v hlavní smičce while přepíšu proměnou novou hodnotou tak na ní program nereaguje a generuje stále ten ze začátku programu, copa dělám špatně ?

uint8_t port = 0;
uint8_t cas = 100;
uint8_t servox = 0;
#define servomin 91
uint8_t servo0 = 100;
uint8_t servo1 = 100;
uint8_t servo2 = 100;
uint8_t servo3 = 100;
uint8_t servo4 = 100;
uint8_t servo5 = 100;
uint8_t servo6 = 100;
uint8_t servo7 = 100;           
uint16_t hodnota;

ISR(TIMER0_COMP_vect)
{

switch(servox)
     {
     case  0:PORTC = 0b01000000;TCNT0 = 0;OCR0 = servomin;servox += 1;break;     // čas potřebný pro min polohu
     case  1:PORTC = 0b01000000;TCNT0 = 0;OCR0 = servo1;servox += 1;break;        // nastavení polohy serva 1
     case  2:PORTC = 0b00100000;TCNT0 = 0;OCR0 = servomin;servox += 1;break;
     case  3:PORTC = 0b00100000;TCNT0 = 0;OCR0 = servo2;servox += 1;break;
     case  4:PORTC = 0b00010000;TCNT0 = 0;OCR0 = servomin;servox += 1;break;
     case  5:PORTC = 0b00010000;TCNT0 = 0;OCR0 = servo3;servox += 1;break;
     case  6:PORTC = 0b00001000;TCNT0 = 0;OCR0 = servomin;servox += 1;break; 
     case  7:PORTC = 0b00001000;TCNT0 = 0;OCR0 = servo4;servox += 1;break;  
     case  8:PORTC = 0b00000100;TCNT0 = 0;OCR0 = servomin;servox += 1;break;
     case  9:PORTC = 0b00000100;TCNT0 = 0;OCR0 = servo5;servox += 1;break;
     case 10:PORTC = 0b00000010;TCNT0 = 0;OCR0 = servomin;servox += 1;break;
     case 11:PORTC = 0b00000010;TCNT0 = 0;OCR0 = servo6;servox += 1;break;
     case 12:PORTC = 0b00000001;TCNT0 = 0;OCR0 = servomin;servox += 1;break;
     case 13:PORTC = 0b00000001;TCNT0 = 0;OCR0 = servo7;servox += 1;break;
     case 14:PORTC = 0b10000000;TCNT0 = 0;OCR0 = servomin;servox += 1;break;
     case 15:PORTC = 0b10000000;TCNT0 = 0;OCR0 = servo0;servox = 0; break;
     } 

}


int main(void)
{
DDRC = 0b11111111;                    // port c jako výstup
TCCR0 |= 1<<CS01 | 1<<CS00;           // nastavení předděličky časovače 0 na 64
OCR0 = cas;                           // registr pro porovnání obsahu časovače
sei();                                // povolení přerušení
TIMSK |= 1<<OCIE0;                    // povolení přerušení od časovače 0

   while(1)
      {
       servo1 = 50;
    servo2 = 150;

      }

}

Nahlásit jako SPAM
IP: 176.12.115.–
Vše co dělám hřeje.
KIIV
~ Moderátor
+43
God of flame
7. 12. 2012   #2
-
0
-

chybi ti klicove slovo volatile ....  c optimalizuje promenne do registru a meni data v ram, az kdyz je to potreba... volatile mu u promenne rekne, ze se muze menit prubezne hodnota a prikaze, ze se ma vzdy nacist z ram/zapisovat do ni

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
7. 12. 2012   #3
-
0
-

#2 KIIV
byls rychlejší

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Protos0
Newbie
7. 12. 2012   #4
-
0
-

Děkuji, vyzkoušeno a šlape porgramuji teprv týden zatím jsem myslel že C je jenom vitamín  

Nahlásit jako SPAM
IP: 176.12.115.–
Vše co dělám hřeje.
7. 12. 2012   #5
-
0
-

#4 Protos
vitamin tady na fóru taky je  

hu

Nahlásit jako SPAM
IP: 188.95.60.–
KIIV
~ Moderátor
+43
God of flame
7. 12. 2012   #6
-
0
-

a ten volatile je naprosto obvykla zacatecnicka chyba :D (nekteri z avrfreaks.net maj v podpisu rovnou FAQ a todle je jedna z prvnich polozek)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
10. 12. 2012   #7
-
0
-

#6 KIIV
mohu potvrdit, když jsem psal první program v C pro 8051 tak jsem se na to nachytal při práci s SPI rozhraním. Nakonec jsem to vybádal sám, když jsem na tyto modifikátory narazil v Učebnici jazyka C od Herouta

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
10. 12. 2012   #8
-
0
-

#7 hlucheucho
ja pokud si pamatuju tak sem o tom neco cetl - a pak, kdyz sem na to narazil, tak uz sem tusil odkud vitr vane...  (tedy aspon doufam ze uz sem nezapomel nejaky jiny incident tohoto typu :D)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý