Používání knihovních funkcí - import knihoven z AVR Studia

Tak abych byl trošku konkrétnější. Teď se snažím udělat přerušení na zmáčknuté tlačítko - pokud se zmáčkne tlačítko, zvětší se proměnná v procesoru a zobrazí se na displeji. Takto mi to pořád nefunguje - při stisku tlačítka se displej vymaže a za chvilku zobrazuje stále 15.5.
Díky za pomoc

[code]volatile int temp = -155;
volatile char buf[6];

ISR(INT0_vect) //obsluha preruseni
{
if (PINB == 0b00000100) // zmacknute tlacitko na PB2 - zvetsi a vypis
{
temp=temp+10;
pisdesetine(buf, temp);
lcd_gotoxy(0,0);
lcd_puts(buf);
_delay_ms(250);
}

void InitPorts() //zakladni nastaveni portu
{
DDRB = 0x00; // port B bude vstup
PCICR=0b00000001;//preruseni pcint0 ?
PCMSK0=0b000111100;//preruseni pro PB2 až PB5
}

int main(void)
{
InitPorts();
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_gotoxy(0,0);

_delay_ms(500);
pisdesetine(buf, temp);
lcd_puts(buf);

sei();//povoleni preruseni
while(1);
}
[/code]

Zobrazuje to 15.5 nebo -15.5?
Podmínka “if (PINB == 0b00000100)” není správně - testuješ sice PB2, ale zároveň ostatní piny MUSÍ být v nule. Lepší řešení je:
if (PINB & (1<<PB2)). Pokud by ti logický operace dělaly problém, používej makra a nemusíš to řešit.

Vektor přerušení je “PCINT0_vect”. “INT0_vect” je jiné přerušení (PD2).

Co se táká časového spouštění v různých intervalech - např. si udělej globální proměnnou na čas. Nastav čítač např. tak, aby přetekl 10x za vteřinu a při každém přetečení časovou proměnnou inkrementuj.
V mainu pak jen kontroluješ, jesli je čas “o víc než 9 větší” než při posledním spuštění funkce a pokud ano, tak ji spustíš. Tento nový čas si uložíš pro příští test. Funkce se bude spouštět každou vteřinu. To samé můžeš udělat pro další funkce i s různými periodami.

jo už to funguje
ukazovalo to samozřejmě -15.5
stačilo tam přepsat PCINT0_vect

Díky

Seš moc rychlej. Než dopíšu editaci, tak už jsi tu :slight_smile:. Dopsal jsem ti vejš časový spouštění funkcí.

Tu podmínku si taky oprav - zkus si zmáčknout a držet nejdřív PB1 a pak přidat PB2. Uvidíš, že ti to nepůjde.

Teďko tady nějak nemůžu udělat obsluhu druhého tlačítka. Jdu na to podle tohoto kódu. Můžu udělat takto 2 tlačítka do jedné obsluhy přerušení ?
Takhle pokud zmáčknu PB2 tak reaguje jakoby za obě tlačítka, PB3 nereaguje vůbec.

ISR(PCINT0_vect) //obsluha preruseni 
{ 
if (PINB & (1<<PB2)) // zmacknute tlacitko na PB2 - zvetsi a vypis 
{ 
temp=temp+10; 
pisdesetine(buf, temp); 
lcd_gotoxy(0,0); 
lcd_puts(buf); 
_delay_ms(250); 
}

if (PINB & (1<<PB3)) // zmacknute tlacitko na PB3 - zmensi a vypis 
{ 
temp=temp-10; 
pisdesetine(buf, temp); 
lcd_gotoxy(0,0); 
lcd_puts(buf); 
_delay_ms(250); 
}

V kódu úplně nahoře i tady ti chybí ukončovací složená závorka obsluhy, což bys viděl, kdybys kód s každou úrovní odsazoval a neplácal to do jednoho sloupce. Nic jinýh, proč by to nemělo jít, nevidím.
Jak přesně se to projevuje? Když stiskneš PB2 tak se provedou obě podmínky? To by se dít nemělo.

Mimochodem - celá tato stránka už by měla být v jiném tématu :wink:.

To co sem píšu je takový základ, já to tu mám o něco rozvinutější, takže komplikovanější. Pokud jsem zapojil pouze PB2 tlačítko tak mi to fungovalo dobře, jakmile jsme přidal PB3 talčítko, tak se po zmačknutí PB2 nejdříve přičetlo a poté odečetlo. PB3 nedělalo nic. Teď jsem to trochu předělával a rozvinutější věci zakomentovával a už to nefunguje vůbec. Takže to zkusím pořádně prozkoumat od nejjednoduššího.
Tlačítka jsou připojena před odpor. Zjistil jsem že pin PB3 má na sobě v klidu cca 2-3 V, což se mi zdá nějaké divné. (Na PB3 je zapojeno MOSI z neustále připojeného LPT programátoru, tak jestli to s tím možná nesouvisí)

Vzhledem k napětí na PB3 je tento pin stále vyhodnocován jako “1” a tedy při stisku tlačítka se nic neděje (žádná změna stavu). Naopak při stisku PB2 se změna zaregistruje, provede se PB2, ale protože je i PB3 stále v “1”, provádí se i PB3.
Napětí vklidu musí být pod 0.3VCC (viz DC characteristics v datashetu).
Ovšem zrovna u PB3 je problém, protože je to vstup (PC je výstup). Musíš to zařídit tak, aby sis nezničil port PC, ovšem pak ti pravděpodobně nepůjde programování. Programátor by se totiž měl od mcu po naprogramování sám odpojit, ale to ty bastly na paralelní port obvykle nedělají (u odporového ani omylem).
Buď musíš tedy odpojvat programátor, nebo si vybrat jiný pin. Mimochodem u SCK (PB5) bys měl stejný problém.
Druhé řešení (mezi jednočipáři obvyklé) je připojení tlačítka na zem. Tedy při stisku tlačítka je na pinu “0”.

Tak jsem tlačítka předělal , při stisknutí přivedou na procesor 0V.
je podmínka pro stisknuté tlačítko správně ? Nějak se mi to nezdá.

if (PINB & (1<<PB2))

Zkus do třetice toto

if (!(PINB & (1<<PB4))  // jestliže PINB.4 = 0

jo, to taky funguje

a este lepsie je toto: #define tl !(PINB & (1<<PB4)) //vstupy

potom staci if (tl)… napr nabijanie();

nebudes musiet menit priradeie tlacidiel v celom programe staci len zmenit v define… ale to patri k zakladom…