Stránka 1 z 2

AVR - jak pristoupit k jednotlivym pinum, ne k celemu portu?

Napsal: 15 bře 2012, 11:08
od alvr
Zdravim. Zacinam od piky s AVR chipama (pred tim jsem zkousel jen nejake pokusy s C51 v KeiluVision).
Nemuzu nikde najit jak nadefinovat a pristupovat pouze pinove, ne portove k jednotlivym pinum. Jedna se mi o nadefinovani nazvu konkretniho pinu a nasledne k pristupu k nemu pres jeho nazev, ne pres prime nazvy jeho registru. Cteni a zapis celeho portu je v jasny, ale pinove (bitove) se mi na to nedari prijit. Poradi mi nekdo? Prikladam priklad kodu:

#include <avr/io.h>

#define VSTUP PORTB0 //definice nazvu pinu 0 na portu B
#define VYSTUP PORTB1 //definice nazvu pinu 1 na portu B
int main(void)
{
DDB0 = 0; //nastaveni pinu jako vstupni
DDB1 = 1; //nastaveni pinu jako vystupni
while(1)
{
VYSTUP = VSTUP; //zapsani hodnoty vstupu na vystup
}
}

Napsal: 15 bře 2012, 11:42
od SDZ
Keil moc neznám,ale PORTB0 by měl být pin na portu B,nebo ne?
Celý port bych tipoval nastavit na log. 1 PORTB=0x255

Napsal: 15 bře 2012, 11:49
od alvr
To jo, vsak jsem psal, ze pristup k celemu portu B (PORTB) chodi, ale nevim jak pristoupit jenom k jednomu pinu a navic pres pojmenovani toho pinu.

Napsal: 15 bře 2012, 11:53
od SDZ
Maš nadefinováno
#define VSTUP PORTB0
což je jeden pin portu B,nebo ne?

Napsal: 15 bře 2012, 11:54
od Atlan
#define bsf(port,pin) port |= 1<<pin //nastav bit
#define bcf(port,pin) port &= ~(1<<pin) //nuluj bit

#define motorvlavo (bsf(PORTD,7));
#define motorvlavooff (bcf(PORTD,7));

vstupy
#define ok (PINC & (1<<PC0))
#define c (PINC & (1<<PC1))

Napsal: 15 bře 2012, 12:21
od alvr
To mi nepripada zrovna jednoduchy zpusob. Zkusim to jeste vice zjednodusit:

#define A PORTA
#define B PORTB

int main() {
DDRA = 0x00;
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;

B = A; //na PORTB se zapise nactena hodnota portu PORTA - to chodi vcetne definic normalne
PORTC = 5; //tento zapis na cely port taky chodi normalne

PORTD3 = 1; //jak ale zapisu napr pouze na pin 3 portu D hodnotu?? Jak se primo pristupuje k tomu samotnemu pinu 3?? Ted tady ani nemotam definici nazvu pinu pomoci #define. Tento zapis nechodi a nevim proc??
}

Napsal: 15 bře 2012, 12:33
od SDZ
PORTD3 = 1; //nastaví pin 3 portu D na log. 1
PORTD3 = 0; //nastaví pin 3 portu D na log. 0
Je to tak ?

Napsal: 15 bře 2012, 12:35
od alvr
Ano, melo by, ale nevezme mi to kompilator a prave nechapu proc?

Error - lvalue required as left operand of assignment

Napsal: 15 bře 2012, 13:01
od MiroH
Pretoze AVR nemaju na porty bitovy pristup. Sprav to ako pisal Atlan, robi sa to pomocou logickych operacii. Zjednodusis si to, ked si nadefinujes makro a to potom pouzivas tak, ako v Keili C51. Kompilator to rozlozi do viacerych instrukcii a je to.

Napsal: 15 bře 2012, 14:20
od Crifodo
MiroH píše:Pretoze AVR nemaju na porty bitovy pristup.
:scared:
Odkdy?

Napsal: 15 bře 2012, 14:32
od alvr
Jak je to tedy? Umi AVR pristupovat primo k bitum portu, nebo jen celemu portu??

To nastaveni a nulovani bitu pres makra a pak volani funguje:

#define bsf(port,pin) port |= 1<<pin //nastav bit
#define bcf(port,pin) port &= ~(1<<pin) //nuluj bit

bsf(PORTA,5); //nastavim bit 5 na portu A
bcf(PORTA,3); //nuluji bit 3 na portu A

Ale nepochopil jsem ty makra pro cteni bitu jak uvedl Atlan. Jak ten bit prectu?

Napsal: 15 bře 2012, 15:25
od Andrea
alvr píše:Jak je to tedy? Umi AVR pristupovat primo k bitum portu, nebo jen celemu portu??
Jak ke kterým, pokud mají do čtyř portů, tak ano, nad čtyři jen k některým.

Napsal: 15 bře 2012, 18:50
od Atlan
vstupy
#define ok (PINC & (1<<PC0))
#define c (PINC & (1<<PC1))

predpokladam ze myslis stav na danom pine portu ?

if (ok) rozsviet ledku;

Napsal: 16 bře 2012, 10:32
od petus
Záleží jaky IDE používáš. Když budeš používat CodeVision, tak ten umí číst i psát bitove. AvrStudio umí myslím pouze číst. Pokud chceš zapisovat musíš maskovat Port-> viz Atlan

Napsal: 16 bře 2012, 16:35
od mtajovsky
Tomu nerozumím. Co když budu zdroják psát v notepadu a překládat z povelové řádky? Doteď jsem si myslel, že to dáno možnostmi procesoru, resp. jeho instrukční sady.