AVR - jak pristoupit k jednotlivym pinum, ne k celemu portu?
Moderátor: Moderátoři
AVR - jak pristoupit k jednotlivym pinum, ne k celemu portu?
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
}
}
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
}
}
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??
}
#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??
}
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?
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?
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 ![Smile :)](./images/smilies/icon_smile.gif)
https://chiptron.cz - novinky ze světa elektro (Arduino, Raspberry Pi, ESP8266, STM32, ESP32...)
Peťus
![Smile :)](./images/smilies/icon_smile.gif)
https://chiptron.cz - novinky ze světa elektro (Arduino, Raspberry Pi, ESP8266, STM32, ESP32...)
Peťus