Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Problem z DS18B20 i zewnętrznym przerwaniem ....

matul7
-
-
Posty:3
Rejestracja:24 wrz 2006, o 20:47
Lokalizacja:Warszawa
Problem z DS18B20 i zewnętrznym przerwaniem ....

Postautor: matul7 » 23 lis 2006, o 22:09

Układ wygląda tak:

1. AT Mega 16 - taktowany wewnętrznym oscylatorem
2. DS1307 - zegar na I2C , przerwanie z niego na INT0, ustawione przerwanie co 1s
3. 4 x DS18B20 na 1wire - Portc.2
4. LCD 2 x 16 - na Portb

I teraz tak - ma pusta pętlę, co 1s wywołuje przerwanie i wykonuje kolejno:

1. Pierwsze wywołanie przerwania
- odczyt z zegara
- wysyłam do czujników instrukcję do pomiaru
- wyświetlam godzinę na LCD
2. Drugie wywołanie
- odczyt z zegara
- odczytuje zmierzona temp. z 4 czujników
- wyświetlam godzinę na LCD
3. tj punkt 1
4. tj punkt 2
5. itd

Program wywala się na odczycie temperatury, ale jak robię to samo w pętli (wyłączone przerwanie) to wszystko gra jak należy.

Co tu jest nie tak ? Może ktoś się już spotkał z takim problemem. Na początku myślałem że I2c zakłóca mi 1-wire ale okazał się że to na odwrót i po małej korekcie w odczycie z I2C jest OK (przywracanie stanu końcówek SDA i SCL na początku transmisji).

bat42
-
-
Posty:26
Rejestracja:20 maja 2004, o 18:19

Postautor: bat42 » 23 lis 2006, o 22:20

Cześć,
czy wykonanie punktu drugiego nie zabiera > 1 sek ?

Jeżeli program się "zawiesza" to można tymczasowo podłączyć
led'a do jakiegoś pinu i wstawiać w różnych miejscach
programu instrukcje zapalającą go - w ten sposób
po kilku próbach możesz ustalić miejsce w którym
występuje problem.

matul7
-
-
Posty:3
Rejestracja:24 wrz 2006, o 20:47
Lokalizacja:Warszawa

Postautor: matul7 » 23 lis 2006, o 22:41

Właśnie odkryłem ciekawostkę: jak podłączę czujniki po wystartowaniu programu to jest wszystko OK, cuda niewidy po prostu


Sposobem diody doszedłem co jest nie tak, i mam pytanie czym się różni:

x= 1wread()

od

x = 1wread(1)

Bo jak jest 1wread(1) to przechodzi ten moment ale niewiadomo dlaczego zmienia mi wartości niektórych zmiennych na jakieś dziwne liczby ??

mw
-
-
Posty:242
Rejestracja:23 lut 2003, o 23:22
Lokalizacja:Busko Zdrój
Kontaktowanie:

Postautor: mw » 24 lis 2006, o 02:20

Moze to wina za malych stosow?
Zwieksz kazdy z nich do 30 bajtow.

matul7
-
-
Posty:3
Rejestracja:24 wrz 2006, o 20:47
Lokalizacja:Warszawa

Postautor: matul7 » 24 lis 2006, o 09:57

Ze stosem popróbuję wieczorem ale w nocy zauważyłem jeszcze jedna rzecz. Mam procedurę wybierającą przemiennie: zapis czujników / odczyt temperatury. Wygląda to tak:

Int_0:
Select Case A
Case 0 : Gosub Temp_go
Case 1 : Gosub Temp_read
End Select
Toggle A
Return

Temp_go i Temp_read - etykiety obsługujące czujniki temp.

ale jak napiszę tak:

Int_0:
Gosub Wybor
Return

Wybor:
Select Case A
Case 0 : Gosub Temp_go
Case 1 : Gosub Temp_read
End Select
Toggle A
Return

czyli podwójny skok, to wykonuje się wszystko jak należy.
W pierwszym przypadku wywala się jak już ma odczytać 2 bajty z pierwszego czujnika (LSB i MSB temperatury)

Nie rozumiem tego kompletnie, czyżby Bascom miał jakieś kłopoty z wykonywaniem skoków ??

mw
-
-
Posty:242
Rejestracja:23 lut 2003, o 23:22
Lokalizacja:Busko Zdrój
Kontaktowanie:

Postautor: mw » 24 lis 2006, o 10:03

Jak wykonuje odczyt z czujnika to skacze do ich procedur. Czyli skoki dzialaja.

bat42
-
-
Posty:26
Rejestracja:20 maja 2004, o 18:19

Postautor: bat42 » 24 lis 2006, o 18:10

Cześć
1wread( 1 ) , ta 1 to ilość bajtów do odczytania z magistrali.

Popatrz na :

http://avrhelp.mcselec.com/bascom-avr.html?1WREAD

jest tam przykład

Pozdrawiam

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 22 gości