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

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
alvr
Příspěvky: 288
Registrován: 25 led 2008, 01:00

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

#1 Příspěvek 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
}
}

Uživatelský avatar
SDZ
Příspěvky: 420
Registrován: 11 bře 2011, 01:00

#2 Příspěvek 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

Uživatelský avatar
alvr
Příspěvky: 288
Registrován: 25 led 2008, 01:00

#3 Příspěvek 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.

Uživatelský avatar
SDZ
Příspěvky: 420
Registrován: 11 bře 2011, 01:00

#4 Příspěvek od SDZ »

Maš nadefinováno
#define VSTUP PORTB0
což je jeden pin portu B,nebo ne?

Uživatelský avatar
Atlan
Příspěvky: 4499
Registrován: 10 kvě 2004, 02:00
Bydliště: Košice

#5 Příspěvek 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))

Uživatelský avatar
alvr
Příspěvky: 288
Registrován: 25 led 2008, 01:00

#6 Příspěvek 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??
}

Uživatelský avatar
SDZ
Příspěvky: 420
Registrován: 11 bře 2011, 01:00

#7 Příspěvek 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 ?

Uživatelský avatar
alvr
Příspěvky: 288
Registrován: 25 led 2008, 01:00

#8 Příspěvek od alvr »

Ano, melo by, ale nevezme mi to kompilator a prave nechapu proc?

Error - lvalue required as left operand of assignment

Uživatelský avatar
MiroH
Příspěvky: 54
Registrován: 28 led 2011, 01:00
Bydliště: Nitra

#9 Příspěvek 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.

Uživatelský avatar
Crifodo
Příspěvky: 14471
Registrován: 11 říj 2005, 02:00

#10 Příspěvek od Crifodo »

MiroH píše:Pretoze AVR nemaju na porty bitovy pristup.
:scared:
Odkdy?

Uživatelský avatar
alvr
Příspěvky: 288
Registrován: 25 led 2008, 01:00

#11 Příspěvek 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?

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#12 Příspěvek 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.

Uživatelský avatar
Atlan
Příspěvky: 4499
Registrován: 10 kvě 2004, 02:00
Bydliště: Košice

#13 Příspěvek 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;

Uživatelský avatar
petus
Příspěvky: 594
Registrován: 12 led 2009, 01:00
Bydliště: Pelhřimov
Kontaktovat uživatele:

#14 Příspěvek 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
Pokud něco chcete a neodpovídám,pošlete SZ :)
https://chiptron.cz - novinky ze světa elektro (Arduino, Raspberry Pi, ESP8266, STM32, ESP32...)
Peťus

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#15 Příspěvek 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.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“