Witam,
Od jakiegoś czasu w ramach wolnego czasu uczę się programowania mikrokontrolera ATmega32. Koduję w C (pracuję jako programista wiec ten język jest mi bliższy niż asembler), dotychczas nie miałem jakichś większych problemów, udało mi się nawet obsłużyć wyświetlacz LCD i sądziłem, że obsługa czujnika temperatury DS18B20 nie sprawi mi większych kłopotów - niestety myliłem się. Przeczytałem dziesiątki postów, kilkanaście artykułów i jak dotąd nie potrafię go obsłużyć - nie potrafię nawet wysłać prawidłowo sygnału reset.
Mój schemat podłączenia wygląda tak:
W samym mikrokontrolerze linia 1wire jest podpięta pod 3 pin w porcie D.
Mikrokontroler podpięty jest pod zewnętrzny kwarc 12MHz a jest częstotliwość mam wprowadzoną w pliku makefile w F_CPU 12000000UL.
Po wielu próbach podszedłem do tematu minimalistycznie - im mniej kodu tym mniej szans na błąd. Napisałem sobie poniższy skrypt:
W powyższym przypadku stan sprawdzam po tym która dioda zaświeci mi się po wykonaniu programu - niestety zawsze świeci się nie ta co powinna.
Być może błąd jest banalnie prosty i go nie zauważam niemniej proszę o jakieś rady abym mógł ruszyć z miejsca.
Od jakiegoś czasu w ramach wolnego czasu uczę się programowania mikrokontrolera ATmega32. Koduję w C (pracuję jako programista wiec ten język jest mi bliższy niż asembler), dotychczas nie miałem jakichś większych problemów, udało mi się nawet obsłużyć wyświetlacz LCD i sądziłem, że obsługa czujnika temperatury DS18B20 nie sprawi mi większych kłopotów - niestety myliłem się. Przeczytałem dziesiątki postów, kilkanaście artykułów i jak dotąd nie potrafię go obsłużyć - nie potrafię nawet wysłać prawidłowo sygnału reset.
Mój schemat podłączenia wygląda tak:
W samym mikrokontrolerze linia 1wire jest podpięta pod 3 pin w porcie D.
Mikrokontroler podpięty jest pod zewnętrzny kwarc 12MHz a jest częstotliwość mam wprowadzoną w pliku makefile w F_CPU 12000000UL.
Po wielu próbach podszedłem do tematu minimalistycznie - im mniej kodu tym mniej szans na błąd. Napisałem sobie poniższy skrypt:
#include <avr/io.h>
#include <util/delay.h>
#define PIN_1WIRE 2
#define PORT_1WIRE PIND
#define OUT_1WIRE_LOW PORT_1WIRE&=~(1<<PIN_1WIRE);
#define OUT_1WIRE_HIGH PORT_1WIRE|=1<<PIN_1WIRE;
#define DIR_1WIRE_IN DDRD&=~(1<<PIN_1WIRE);
#define DIR_1WIRE_OUT DDRD|=1<<PIN_1WIRE;
void delays(unsigned int ile)
{
unsigned long licznik=0;
unsigned long koniec=ile*100;
do
{
_delay_ms(10);
licznik++;
}while(licznik<koniec);
}
int main(void)
{
DDRA = 0xFF;
PORTA = 0x00;
delays(3);
OUT_1WIRE_LOW; //ustaw port w stan niski
DIR_1WIRE_OUT; //kierunek pinu na wyjście
_delay_loop_2(1500); //odczekanie 500us
DIR_1WIRE_IN; //kierunek pinu na wejście
_delay_loop_2(135);//odczekanie 45us
if (bit_is_clear(PORT_1WIRE, PIN_1WIRE)) //sprawdzenie poziomu linii
{
//odebrano bit PRESENCE
PORTA = 0x02;
}
else
{
//stan nieaktywności
PORTA = 0x01;
}
delays(50);
return 0;
}
W powyższym przypadku stan sprawdzam po tym która dioda zaświeci mi się po wykonaniu programu - niestety zawsze świeci się nie ta co powinna.
Być może błąd jest banalnie prosty i go nie zauważam niemniej proszę o jakieś rady abym mógł ruszyć z miejsca.
