problem z INT0 INT1 w ATtiny 2313

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
robson
Użytkownik
Posty: 226
Rejestracja: 22 sty 2006, 19:51
Lokalizacja: S.M.
Kontakt:

problem z INT0 INT1 w ATtiny 2313

Post autor: robson » 11 lut 2007, 21:32

Witam:)

Jestem jeszcze dosć "zielony" w dziedzinie programowania, dlatego proszę Was tu obecnych o pomoc:)

Planuje zrobić licznik osób na mikrokontrolerze ATtiny2313. Zmontowałem układ na płytce stykowej, napisałem program i....układ nie działa :???:

Sprawa wygląda tak; podczas przerwania INT0 i INT1 procek ma skoczyć do podprogramu zwiększającego zmienną o nazwie Licznik a po wykryciu przyciśnięcia przycisku podciągniętego pod PD.0 wyświetlać zawartość zmiennej na wyświetlaczu LCD. Na Razie program jest w powijakach i dużo mu brakuje, między innymi planowanego przejścia w stan Power Down. Układ wyświetla zawartość zmiennej na LCD ale wartość ciągle wynosi 0. Po prostu procek "nie chce" obsłużyć przerwania INT0 ani INT1.,

Wiem że co dla niektórych to pytanie banalne i pewnie dziwią się, jak można popełnić taki błąd, ale nie potrafie sobie z nim poradzić ani tym bardziej wykryć co jest nie tak, dlatego założyłem ten temat:(.

Z góry dziękuje wszystkim za pomoc i przpraszam za banalne pytanie :???:
Dołączam skan schematu (sorry za jakość) i listing programu w BASCOM AVR.
Pozdrawiam robson:)
Załączniki
Listing+schemat.rar
(110.64 KiB) Pobrany 661 razy

ZbeeGin

Post autor: ZbeeGin » 11 lut 2007, 22:06

W kwestii układowej, brak kondensatorów dla rezonatora kwarcowego. A ponadto bez zmian w fuse-bitach mikrokontorler nie użyje tego kwarcu. Będzie pracował z częstotliwością domyślną 1MHz pobieraną z wewnętrznego generatora RC.

W kwestii programowej, pierwsze co rzuca się w oczy to błędnie wykonane instrukcje:

Kod: Zaznacz cały

Enable Interrupts
Enable Int0 , Low Level
Enable Int1 , Low Level
Enable Timer0

Config Debounce = 35
Config Timer0 = Timer , Prescale = 64

On Int0 Zwieksz
On Int1 Zmniejsz
On Timer0 Sprawdz
Najpierw konfiguruje się urządzenia przez CONFIG, później ustala procedury obsługi przerwań przez ON, później się je włącza przez ENABLE a na końcu włącza się globalny system przerwań przez ENABLE INTERRUPTS.

Ta instrukcja jest po prostu bez sensu!:

Kod: Zaznacz cały

If Licznik = 0 Then
      Licznik = 0
End If
Pomyłka w literkach:

Kod: Zaznacz cały

Config Portd = &B1110000 : Portb = &B1110000
Skoro ten pin już wykorzystujesz jako przerwanie to użycie DEBOUNCE nie ma sensu.

Kod: Zaznacz cały

Debounce Pind.2 , 0 , Zwieksz , Sub
Ponadto jak zastosujesz Low Level a nie Falling to przyciśnięcie i przytrzymanie przycisku dość szybko zwiększy ilość osób do kilku milionów. Oczywiście zmienna Licznik tego nie zarejestruje w pełni.

Stosowanie takich czasochłonnych instrukcji w procedurach przerwań jest błędne:

Kod: Zaznacz cały

    Cls
    Lcd Licznik ; " " ; "Osób"
----------
Moje poprawki nie zaburzające Twojego pomysłu:

Kod: Zaznacz cały

$regfile = "attiny2313.dat"
$crystal = 4000000  'jeśli nie zmieniłeś fuse-bitów wpisz 1000000 i zmień podział w Prescale na 8

'LICZNIK OSÓB

Dim Licznik As Byte
Dim Pokaz As Bit

Config Portd = &B1110000 : Portd = &B1110000
Config Debounce = 35
Config Timer0 = Timer , Prescale = 64
Config Int0 = Falling
Config Int1 = Falling

On Int0 Zwieksz
On Int1 Zmniejsz
On Timer0 Sprawdz
Enable Int0
Enable Int1
Enable Timer0
Enable Interrupts

'-------------------------------
Licznik = 0
Pokaz = 1
Do
  If Pokaz = 1 Then
    Cls
    Lcd Licznik ; " " ; "Osób"
    Pokaz = 0
  End If
Loop

End

'-------------------------------
Sprawdz:
  If Pind.0 = 0 Then Pokaz = 1
Return

Zwieksz:
 If Pind.2 = 0 Then
   Incr Licznik
   If Licznik = 100 Then
      Licznik = 0
   End If
 End If
Return

Zmniejsz:
 If Pind.3 = 0 Then
   Decr Licznik
   If Licznik = 255 Then
      Licznik = 0
   End If
 End If
Return
:idea: Przed zaprogramowaniem procesora polecam skorzystanie z Symulatora zawartego w pakiecie BASCOM.

Awatar użytkownika
robson
Użytkownik
Posty: 226
Rejestracja: 22 sty 2006, 19:51
Lokalizacja: S.M.
Kontakt:

Post autor: robson » 12 lut 2007, 17:19

Kurcze ale błędów narobiłem aż wstyd :oops: Wielkie dzięki za cenne wskazówki, dowiedziałem się kilku ważnych rzeczy.

Kondesatory są; 2 razy po 33p, tylko jakoś nie narysowałem ich na kartce, chyba w pośpiechu :???:. Na razie po zastosowaniu poprawek jak powyżej niestety jeszcze nie działa prawidłowo tzn. dalej jest to samo :???: cały czas 0 na wyświetlaczu :???:

Dzieki jeszcze raz!!!
Pzdr. robson:)

ZbeeGin

Post autor: ZbeeGin » 12 lut 2007, 19:18

Właśnie. Zarówno w symulatorze BASCOM jak i w AVR Studio, program pracuje poprawnie. Po załadowaniu do procesora już nie wyglądało to tak różowo. Skorzystałem w tym celu z płytki AVT3500.
Końcówkę PD.0 podciągam do stanu wysokiego (zworka J5 założona) by wyświetlacz ciągle nie wyświetlał komunikatu (Może tutaj robisz błąd!). Reakcja na impulsy podawane na INT0 była mocno przesadzona, liczba osób gwałtownie wzrastała. Rekacją na INT1 było wyzerowanie licznika - przyczyna taka sama jak wyżej. Prawdopodobnie drgania styków były zbyt duże. Rozwiązaniem tego problemu okazało się dodanie po kondensatorze 100nF do masy na tych końcówkach.

Jeszcze jedna uwaga. Na płytce AVT3500 błędnie oznaczono goldpin z portu D, numeracja jest odwrotna.

Awatar użytkownika
robson
Użytkownik
Posty: 226
Rejestracja: 22 sty 2006, 19:51
Lokalizacja: S.M.
Kontakt:

Post autor: robson » 12 lut 2007, 20:59

Witam znów:)

Po stokroć dzięki!!!. Rozjaśniłeś mi nieco pogląd na te przerwania i uświadomiłes, że diabeł tkwi w szczegółach. Wystarczyło zdjąć zworkę z J5....U mnie działa bez kondensatorów, ale to chyba tylko dlatego, że to jeszcze nie używane przyciski. Te zamienione golpiny jakimś cudem wypatrzyłem :mrgreen: Jeszcze raz WIELKIE DZIęKI!!!:)

Pzdr. robson:)

[ Dodano: 2007-02-12, 21:00 ]
Sorry założyć zworkę J5 a nie zdjąć :???:

[ Dodano: 2007-02-12, 21:03 ]
Sorry to przez te 2 kawy oczywiście że chodziło o zdjęcie tejże zworki :???:
jednak musze to na chwilę odłożyć.... :mrgreen:

ZbeeGin

Post autor: ZbeeGin » 12 lut 2007, 21:22

W sumie można było się nie bawić w zewnętrzne podciąganie tylko dokonać drobnej modyfikacji tej linii:

Kod: Zaznacz cały

Config Portd = &B1110000 : Portd = &B1110001
P.s. Spójrz na schemat. Zworka J5 jednak założona tylko tak dołączysz rezystor R26 do PD.0

ODPOWIEDZ