ADC ATmega8 BASCOM

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Awatar użytkownika
Krystian1989
-
Posty: 47
Rejestracja: 06 kwie 2007, 8:56
Lokalizacja: TBG
Kontakt:

ADC ATmega8 BASCOM

Post autor: Krystian1989 » 05 sty 2008, 20:10

Witam wszystkich i proszę o sprawdzenie kodu dla wejść ADC . Nie mam jeszcze wprawy w pisaniu softów . Zachęcam do komentowania.

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 8000000

Config Portc = Input
Config Portb = Output

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Adc = Free , Prescaler = Auto , Reference = Off
Cursor = Off
Cls
Start Adc

Dim Wolty As Word
Dim Ampery As Word
Dim Ogr As Word
Dim Temp As Word

Dim Channel1 As Byte
Dim Channel2 As Byte
Dim Channel3 As Byte
Dim Channel4 As Byte

Channel1 = 0
Channel2 = 1
Channel3 = 2
Channel4 = 3
Do
Wolty = Getadc(channel1)
Wolty = Getadc(channel1)
waitms 50
Ampery = Getadc(channel2)
Ampery = Getadc(channel2)
Waitms 50
Ogr = Getadc(channel3)
Ogr = Getadc(channel3)
Waitms 50
Temp = Getadc(channel4)
Temp = Getadc(channel4)
Waitms 50

Lcd "U=" ; Wolty ; "  I=" ; Ampery
Lowerline
Lcd "T=" ; Temp ; " *I=" ; Ogr

Cls

Loop

maxzwp
-
Posty: 36
Rejestracja: 31 sty 2006, 15:13

Post autor: maxzwp » 06 sty 2008, 0:40

Nie za bardzo rozumiem sens twej prośby. Nie napisałeś nawet jak chcesz by działał twój program. Czy masz jakiś problem z tym programem? Jeśli tak to go przedstaw. Pozdrawiam

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 06 sty 2008, 10:09

Bardzo, bardzo dawno nic nie pisałem w bascomie, ale wydaje mi się, że program jest poprawny. Ale juz widze że można go troche zoptymalizowac. Zmienne Channel zadeklaruj jako stałe, po co marnowac pamięc, i wydłużac kod na pobieranie numeru kanału ADC. Wiem, że to to krótki program, ale potem mogą byc problemy ze zmieszczeniem większych. Jak program ma tylko wyświetlac te dane to możesz jeszcze bardziej zmniejszyc użycie pamięci SRAM, pobrac jedną watośc i wyświetlic, drugą, itd. używając jednej zmiennej. Troche optymalizacji nigdy nie zaszkodzi :)

Awatar użytkownika
Krystian1989
-
Posty: 47
Rejestracja: 06 kwie 2007, 8:56
Lokalizacja: TBG
Kontakt:

Post autor: Krystian1989 » 06 sty 2008, 10:46

maxzwp pisze:Nie za bardzo rozumiem sens twej prośby. Nie napisałeś nawet jak chcesz by działał twój program. Czy masz jakiś problem z tym programem? Jeśli tak to go przedstaw. Pozdrawiam
Chodzi mi o to, że na razie jeszcze nie mam procka i chciałbym się dowiedzieć jak cały program będzie się zachowywał. Jeśli byłby ktoś , kto zna się na symulatorze z BASCOM-a , to prosiłbym o pokierowanie mnie bo ja nic z tego symulatora nie rozumiem.

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 06 sty 2008, 11:24

Kompilujesz plik program->compile , otwierasz symulator i dajesz run program, otwierasz ikonke z wyświetlaczem LCD, i w tym okienku jest suwak, to jest właśnie ADC, pod nim ustawiasz kanał do którego doprowadzasz "napiecie". Wyniki masz na wirtualnym LCDku.

ZbeeGin

Post autor: ZbeeGin » 06 sty 2008, 11:43

Zacznijmy od początku. Skompiluj program i naciśnij klawisz "SIM" z belki lub z menu głównego uruchom symulację.

Otworzy się nowe okno z treścią programu i paroma innymi polami. Ustaw sobie tutaj co nieco (patrz na obrazek):
1. Włącz opcję odświeżania zmiennych - kliknij na "kartka z rączką".
2. Włącz okno urządzeń dodatkowych - kliknij na ekranik.

Teraz kliknij w treści programu w linii Wolty = Getadc(channel1) i naciśnij klawisz F9. Dodasz sobie pułapkę nr.1. Teraz kliknij w linii Cls i znów klawisz F9, druga pułapka. Z boku powinny się pojawić dwa czerwone znaczki (jak na obrazku).
Jeśli okno "Hardware simulation" zniknie to włącz je ponownie jak w pkt.2.

Jeśli masz już to przygotowane to kliknij start symulacji (Play). Program przeleci i zatrzyma się na pułapce nr.1. Teraz czas na trochę interakcji z naszej strony - ustawienie wartości zwracanych przez ADC.
Na dodatkowym oknie jest suwak a pod nim wybierak (patrz obrazek). Wybierakiem ustalasz numer kanału ADC do którego za pomocą suwaka będziesz zmieniał wartość jaką odczyta GETADC. Proponuję po kolei ustawić sobie różne wartości w kanałach 0, 1, 2, 3. Za każdym razem zmień numer kanału i suwakiem wyreguluj. Masz już?
Ok. Teraz znów uruchom symulację - Play. Program znów powinien przelecieć parę instrukcji i zatrzymać się na pułapce nr.2.
Spójrz na LCD... Czy wartości jakie ustaliłeś suwakiem pokazały się na wyświetlaczu?
Ok. To uruchom dalej. Ekran się wykasuje, a program znów zatrzyma się na pułapce nr.1 i znów przed odczytaniem wartości przez GETADC możesz pozmieniać dane za pomocą wybieraka i suwaka. Itd., itd., aż Ci się znudzi.


To wszystko na dzisiejszej lekcji. Koniec zajęć. :cool:
Załączniki
simbascom.jpg
Okno symulacji z oknem sprzętu.

ROM
Użytkownik
Posty: 257
Rejestracja: 15 cze 2005, 0:11
Lokalizacja: Poznań

Post autor: ROM » 06 sty 2008, 19:12

Dodam jeszcze tylko, aby na początku programu dodać niewinne $Sim, żeby program po skompilowaniu można było uruchomić w symulatorze (nie zapomnieć o usunięciu dyrektywy przy kompilacji, którą zamierzamy umieścić w procku).

ZbeeGin

Post autor: ZbeeGin » 06 sty 2008, 19:22

Symulację da się uruchomić także bez $SIM kolego ROM. Przeczytaj dokładnie w helpie do czego ona służy i nie wprowadzaj w błąd.

Awatar użytkownika
Krystian1989
-
Posty: 47
Rejestracja: 06 kwie 2007, 8:56
Lokalizacja: TBG
Kontakt:

Post autor: Krystian1989 » 07 sty 2008, 19:35

Dziękuję kolego ZbeeGin teraz już wiem o co chodzi. Co do tej dyrektywy $sim to bez niej symulacja mi nie działa.

ZbeeGin

Post autor: ZbeeGin » 07 sty 2008, 19:40

No cóż. Opóźnienie w symulacji pętli opóźniających jest dość duże, zatem na początku może wydawać się, że nic się nie dzieje - nie działa. Zrzut obrazu zrobiłem właśnie podczas symulacji Twojego programu, bez tej dyrektywy.

Proponuję jeszcze drobną zmianę w programie. Jeśli chcesz definiować sobie który kanał będzie przypisany do danego czujnika, to użyj stałych nie zmiennych:

Kod: Zaznacz cały

Const Channel1 = 0
Const Channel2 = 1
Const Channel3 = 2
Const Channel4 = 3
Co prawda nie będziesz mógł ich zmieniać w programie dynamicznie, ale chyba nie taka była idea przypisywania im wartości jako zmiennych.

Awatar użytkownika
Krystian1989
-
Posty: 47
Rejestracja: 06 kwie 2007, 8:56
Lokalizacja: TBG
Kontakt:

Post autor: Krystian1989 » 07 sty 2008, 20:10

Jak wyświetlić dokładnie tzn. np. gdy podzielę zmienną wolty przez 30 to na wyświetlaczu nie pokazuje mi nic po przecinku. Jakiego polecenia użyć ?

ZbeeGin

Post autor: ZbeeGin » 07 sty 2008, 20:12

Musisz użyć normalnego operatora dzielenia, ale wynik przypisać do zmiennej typu Single, gdyż typ Word nie potrafi przechowywać wartości ułamkowych. Warto również dokonać formatowania wyniku, by nie wyświetlał więcej niż 2 liczby po przecinku za pomocą funkcji FUSING():

Kod: Zaznacz cały

Dim sWolty As Single

'--- ciąg dalszy programu

  sWolty = Wolty / 30

  Lcd "U=" ; Fusing(sWolty , "#.##") ; "  I=" ; Ampery

'--- ciąg dalszy programu
Niestety operacje na liczbach zmiennoprzecinkowych pożerają znaczną cześć pamięci Flash.

Awatar użytkownika
Krystian1989
-
Posty: 47
Rejestracja: 06 kwie 2007, 8:56
Lokalizacja: TBG
Kontakt:

Post autor: Krystian1989 » 08 sty 2008, 9:42

Zrobiłem tak jak mi kazałeś i działa bezproblemowo, ale mam jeszcze jeden problem. Jak zrobić , żeby wolty zamiast 0,0 na początku wyświetlały 00,0?
Załączam zrzut z symulacji :
Załączniki
SIM- BASCOM.jpg

ZbeeGin

Post autor: ZbeeGin » 08 sty 2008, 13:15

Przecież to bardzo proste. Zmień maskę w funkcji FUSING!

Awatar użytkownika
Krystian1989
-
Posty: 47
Rejestracja: 06 kwie 2007, 8:56
Lokalizacja: TBG
Kontakt:

Post autor: Krystian1989 » 08 sty 2008, 16:42

Kod: Zaznacz cały

Lcd " " ; Fusing(swolty , "##.##") ; "V   " ; Fusing(sampery , "#.##") ; "A"
Zmieniłem na takie coś ale dalej wyświetla mi 0,00.

ODPOWIEDZ