Atmega32 AD převodník
Moderátor: Moderátoři
Atmega32 AD převodník
Na vstup převodníku např.PINA.0 budu přivádět napětí a výsledek chci zobrazovat na diodách připojených k portu B. Dejme tomu, že chci zobrazit pouze registr ADCL(mám pouze 8diod takže výsledek ADCW nelze celý zobrazit). Začal jsem takto:
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB=0xFF;
ADMUX=0;
ADCSRA=0x40;
PORTB=ADCL;
}
A ještě bych prosil o vysvětlení jak fungují tyto příkazy
#include <avr/io.h>
int main (void) //hlavní funkce
{
DDRB = 0xff; //(0xff = 0b11111111) -> Piny 0 - 7 portu "B" budou výstupní
DDRD = 0; //Port "D" bude vstupní (tlačítko je připojeno k portu "D")
while (1)
{
if(PIND & 0b00000001)
{
PORTB = 0b11110000; //Rozsviť vybrané ledky
}
else
{
PORTB = 0; //zhasni všechny ledky
}
}
}
celkem všemu rozumím až na toto: if(PIND & 0b00000001)
nerozumím tomu jak funguje tento příkaz. Proč nefunguje klasické porovnání if(PIND == 0b00000001)??
Tlačítka jsou připojena přes zem přímo k pinům uPC. Děkuji za odpovědi.
pepabruna píše:if(PIND & 0b00000001)
Střelím od boku: ampersand plní funkci AND pin po pinu a celkový výraz je vyhodnocení zda nejméně významný bit se rovná jedné.
Záleží jestli PIND je deklarován jako jeden jednobitový pin, nebo jako celý osmibitový port.
(Nemusí mít platnou revizi.)
(Celkově budu raději, když se to obejde bez papírů.)
{
}
nebylo by tohle lepší?
https://chiptron.cz - novinky ze světa elektro (Arduino, Raspberry Pi, ESP8266, STM32, ESP32...)
Peťus
pepabruna píše:int main(void)
{
DDRB=0xFF;
ADMUX=0;
ADCSRA=0x40;
PORTB=ADCL;
}
Takhle ti to fungovat nebude. A/D převodník je potřeba zapnout, správně nakonfigurovat (ty máš zvenku připojenou referenci?), spustit převod, počkat na konec převodu a pak teprve lze přečíst výsledek.
A co má ten program dělat, až ten výsledek přečte?