Dziwne zachowanie Atmega8

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!
ODPOWIEDZ
Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Dziwne zachowanie Atmega8

Post autor: M@ciej » 22 lip 2008, 8:52

Witam wszystkich :)

Zbudowałem układ prościutkiego analizatora - coś w rodzaju oscyloskopu na matrycy LED 8x8 (schemat w załączniku). Do procka załadowałem następujący program:

Kod: Zaznacz cały

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

Config Adc = Single , Prescaler = 16 , Reference = Avcc

Config Portb = Output
        Portb = &B00000000
Config Portc = Input
         portc=&B00001111
Config Portd = Output
        Portd = &B11111111

S1 Alias Pinb.0
S2 Alias Pinb.1
S3 Alias Pinb.2
S4 Alias Pinb.3

Config Timer0 = Timer , Prescale = 64                       'konfiguracja Timer0 do wyświetlania
On Timer0 Wyswietl                                          'wywołanie podprogramu "Wyświetl" po przepełnieniu Timer0
Enable Interrupts                                           'Uruchomienie systemu przerwań
Enable Timer0                                               'Uruchomienie Timer 0
Load Timer0 , 125  

Dim X(8) As Byte
Dim Y(16) As Byte
Dim Licznik8 As Byte
Dim L8 As Byte
Dim A(8) As Integer
Dim K As Byte
Dim Opu As Byte

X(1) = &B11111110
X(2) = &B11111101
X(3) = &B11111011
X(4) = &B11110111
X(5) = &B11101111
X(6) = &B11011111
X(7) = &B10111111
X(8) = &B01111111

Y(1) = &B00000001
Y(2) = &B00000010
Y(3) = &B00000100
Y(4) = &B00001000
Y(5) = &B00010000
Y(6) = &B00100000
Y(7) = &B01000000
Y(8) = &B10000000

Y(9) = &B00000001
Y(10) = &B00000011
Y(11) = &B00000111
Y(12) = &B00001111
Y(13) = &B00011111
Y(14) = &B00111111
Y(15) = &B01111111
Y(16) = &B11111111

Licznik8 = 1
L8 = 1
Opu = 86
K = 0
Do
 Incr L8
 If L8 > 8 Then L8 = 1
 Start Adc
 A(l8) = Getadc(5)
 Waitms Opu
 Stop Adc
 If S1 = 0 And Opu > 1 Then Opu = Opu -2
 If S2 = 0 And Opu <= 255 Then Opu = Opu + 2
 If S3 = 0 Then K = 8
 If S4 = 0 Then K = 0
Loop
End     

Wyswietl:
 Load Timer0 , 125
 Incr Licznik8
 If Licznik8 > 8 Then Licznik8 = 1
 Portd = X(licznik8)
 Select Case A(licznik8)
  Case 0 To 31 : Portb = &B00000000
  Case 32 To 127 : Portb = Y(1 + K)
  Case 128 To 255 : Portb = Y(2 + K)
  Case 256 To 383 : Portb = Y(3 + K)
  Case 384 To 511 : Portb = Y(4 + K)
  Case 512 To 639 : Portb = Y(5 + K)
  Case 640 To 767 : Portb = Y(6 + K)
  Case 768 To 895 : Portb = Y(7 + K)
  Case 896 To 1023 : Portb = Y(8 + K)
 End Select
Return

Potencjometr podłączony do wejścia ADC5 ma symulować zmiany napięcia. Przyciski S3 i S4 mają przełączać tryb wyświetlania DOT/BAR. Mój problem to:

1. S3 i S4 nie działają, ale S1, S2 tak.
2. Po pokręceniu potencjometru do połowy suwaka (ok. 2,3V), układ przełącza się w tryb BAR samoczynnie i nie wiem dlaczego?

Układ sprawdzałem po kilka razy, program także i nie widzę błędu. Może jednak coś źle zrobiłem?[/code]
Załączniki
Schemat.jpg

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

Post autor: Aro » 22 lip 2008, 9:00

Kod: Zaznacz cały

S1 Alias Pinb.0 
S2 Alias Pinb.1 
S3 Alias Pinb.2 
S4 Alias Pinb.3
Może lepiej zmień na Pinc.0.... itd.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 22 lip 2008, 9:49

Czemu RESET "wisi" w powietrzu?

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 22 lip 2008, 10:29

Zawsze zostawiałem RESET wiszący,czy podłączyć go gdzieś?

A co do aliasów,to nie mam możliwości zrobić ich inaczej, niż dla portu C, bo do sterowania matrycą potrzebuję 2 8-bitowych portów a portC jest 7-bitowy, więc użyłem go do wszystkich pozostałych funkcji. Być może współdzielenie przycisków wraz z wejściem AC na jednym porcie powoduje te problemy? Wg. mnie program zachowuje się nieoczekiwanie.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 22 lip 2008, 10:42

M@ciej pisze:Wg. mnie program zachowuje się nieoczekiwanie.
M@ciej pisze:Zawsze zostawiałem RESET wiszący
dlatego ci się program zachowywać może nieoczekiwanie. Podciągnij go do VCC przez jakiś rezystor.

valbios
-
Posty: 5
Rejestracja: 06 kwie 2008, 12:51
Lokalizacja: katowice

Post autor: valbios » 22 lip 2008, 12:20

Warto by również dać dławik 10uH między Vcc a AVcc

[ Dodano: 2008-07-22, 13:23 ]
A druga sprawa że te przyciski nie mogą ci działać poprawnie bo zadeklarowałeś je pod piny portu b a podłączone je masz pod port c

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 22 lip 2008, 13:29

Dławika już nie dam rady wmontować, gdyż CVCC i AVCC mam połączone zworą pod podstawką. A co do przycisków to rzeczywiście miałem błąd. RESET zewrę z Vcc przez opornik 10k,powinno wystarczyć.

Dzięki wszystkim za rady :)

Awatar użytkownika
olo16
Użytkownik
Posty: 396
Rejestracja: 12 paź 2007, 16:37
Lokalizacja: w-wa

Post autor: olo16 » 22 lip 2008, 13:36

snow pisze:dlatego ci się program zachowywać może nieoczekiwanie. Podciągnij go do VCC przez jakiś rezystor.
Przecierz w mikroknotrolerze jest podciąganie do plusa.
M@ciej pisze:Dławika już nie dam rady wmontować, gdyż CVCC i AVCC mam połączone zworą pod podstawką.
I tak nic by nie dał. Atmega8 ma wewnątrz płączenie VCC - AVCC, około 50 ohm (patrz: Edw 5/2008, projekt okładkowy.) Tam reset też wisi.

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 22 lip 2008, 14:15

W każdym razie układ "ruszył". Podlutowałem opornik 10k od strony druku a także zmieniłem Aliasy z Pinb na pinC i wszystko gra! :)

Niech zarówno układ, jak i program po poprawkach będą inspiracją do stworzenia innych, ciekawych projektów przez Forumowiczów :)

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 22 lip 2008, 15:17

olo16 pisze:Przecierz w mikroknotrolerze jest podciąganie do plusa.
Możesz podać źródło tej informacji?

ZbeeGin

Post autor: ZbeeGin » 22 lip 2008, 16:42

Możesz podać źródło tej informacji?
Datasheet. Strona 38 rysunek 14. Zapraszam na stronę www.atmel.com

Awatar użytkownika
olo16
Użytkownik
Posty: 396
Rejestracja: 12 paź 2007, 16:37
Lokalizacja: w-wa

Post autor: olo16 » 22 lip 2008, 16:50

snow pisze:Możesz podać źródło tej informacji?
1. Na schemacie z Edw 5/2008, projekt okładkowy TEŻ reset wisi w powietrzu.
2. Wszystkie AVR-y mają programowalne podciąganie, na wszystkich portach, to na resecie też.

ZbeeGin

Post autor: ZbeeGin » 22 lip 2008, 16:57

olo16 pisze:2. Wszystkie AVR-y mają programowalne podciąganie, na wszystkich portach, to na resecie też.
Na końcówce RESET nie jest ono programowalne. PC6 bez skasowania bezpiecznika RSTDIS nie jest portem we/wy.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 22 lip 2008, 17:06

ZbeeGin pisze:PC6 bez skasowania bezpiecznika RSTDIS nie jest portem we/wy.
Dlatego przyjąłem ze nie ma a z pdf'a jednoznacznie nie wynika (czyt. nie znalazłem w tekście) ;) Stąd moja pomyłka, mea culpa :)

ODPOWIEDZ