Mikrokontrolery dla początkujących

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
FreeHack
-
Posty: 19
Rejestracja: 26 sty 2011, 23:20
Lokalizacja: Quaramonte

Mikrokontrolery dla początkujących

Post autor: FreeHack » 03 sty 2013, 22:21

Witam,

Zwracam się do Was z prośbą o pomoc w zrozumieniu poniższej składni programu (jej fragmentu). Owy fragment wydaje mi się tak kretyńsko niezrozumiały, że postanowiłem zasięgnąć cudzych spojrzeń, licząc na oświecenie. Program realizuje funkcję przerzutnika T. Nie rozumiem fragmentu pętli, którą prezentuję:

Do
If Pind.0=0 Then
If Portb.1=1 Then
Toggle Portb.7
Portb.1=0
End If
Else
Portb.1=1
End If
Loop

Mój tok rozumowania:
- jeśli PinD.0 =0 (zwarty przycisk) wtedy;
- jeśli Portb.1=1 (wszystkie końcówki mają skonfigurowany stan spoczynkowy na - 1, więc to zgodne z prawdą) wtedy;
- zmień stan końcówki PortB.7 na przeciwny (czyli zaświeć lampkę);
- PortB.1=0 - zgodnie z opisem: "blokuj możliwość zmian" - jaki związek mają wzmianki o PortB.1 ? Nie potrafię tego zrozumieć. Rozumiem jakie było założenie użycia PortuB.1 jako bitu pomocniczego, ale nie jestem w stanie pojąć w jaki sposób wpływa on na funkcjonowanie tego programu.

Czy ktoś mógłby mi to wyjaśnić? Stoję w miejscu i nie bardzo mogę ruszyć do przodu. Z góry dziękuję za podpowiedzi.

Awatar użytkownika
tom5555
Użytkownik
Posty: 625
Rejestracja: 23 sty 2008, 1:20
Lokalizacja: Zabrze
Kontakt:

Post autor: tom5555 » 03 sty 2013, 22:41

- jeśli PinD.0 =0 (zwarty przycisk) wtedy;
- jeśli Portb.1=1 (wszystkie końcówki mają skonfigurowany stan spoczynkowy na - 1, więc to zgodne z prawdą) wtedy;
- zmień stan końcówki PortB.7 na przeciwny (czyli zaświeć lampkę);
- PortB.1=0 - zgodnie z opisem: "blokuj możliwość zmian"
- w przeciwnym razie (jeśli PinD.0 = 1 - puszczony przycisk) ustaw portb.1 na 1

W przypadku naciśnięcia przycisku zostanie zmieniony stan końcówki PB.7 na przeciwny (zapalona lub zgaszona lampka). Tak długo jak trzymamy wciśnięty przycisk, dalsze zmiany stanu PB.7 zostają zablokowane przez ustawienie bitu pomocniczego PB.1. Po puszczeniu przycisku pin 0 portu D zostanie ustawiony w stan wysoki (poprzez rezystor pull-up), i zostanie wykonana część kodu po "else", czyli ustawienie PB.1 w stan wysoki, co spowoduje odblokowanie reakcji programu na wciśnięcie przycisku.

FreeHack
-
Posty: 19
Rejestracja: 26 sty 2011, 23:20
Lokalizacja: Quaramonte

Post autor: FreeHack » 04 sty 2013, 12:48

tom5555 dziękuję za odpowiedź.

Po analizie Twojego opisu i ponownej próbie własnej dedukcji, zrozumiałem co następuje:
Kluczem jest PORTB.1 który pozwala na jednokrotne zrealizowanie pętli dzięki ostatniemu jej warunkowi: PORTB.1=0, wskutek czego program przechodzi do części ELSE i tam ustawiwszy 1 na PORTB.1 umożliwia ponowne wykonanie pętli po następnym spełnieniu warunku (PIND.0=0 i ustawione po ELSE PORTB.1=1).

Dziękuję raz jeszcze za odpowiedź.

Pozdrawiam,
FreeHack

FreeHack
-
Posty: 19
Rejestracja: 26 sty 2011, 23:20
Lokalizacja: Quaramonte

Ćwiczenie 6 - licznik dekadowy

Post autor: FreeHack » 10 sty 2013, 17:25

Witam ponownie,

Dotarłem do 6 ćwiczenia i napotkałem na pewien problem. Treść programu jest zrozumiała, jednak po zaprogramowaniu mikrokontrolera (ATtiny 2313) nie ma żadnej reakcji na przycisk. Dodam, że wcześniejsza wersja tego programu licząca binarnie, działała bez zarzutu. Problem pojawił się po dopisaniu tabeli z odnośnikami liczb dziesiętnych. Zamieszczam poniżej oryginalny listing:

' C006d Licznik dekadowy z przyciskiem
' licznikiem nie jest już rejestr PortB
' tylko rejestr o nazwie EEDR
' prawy wyświetlacz pokazuje stan licznika "po ludzku"
Config Portb = 255 'wszystkie końcówki jako wyjścia
Portb = &B11111111 'na początek wygaś
Config Portd = &B1111100 'dwie najmłodsze jako wejścia
Portd = &B1110111 'włączony prawy wyświetlacz
'Eedr = 0 automatycznie na początek w liczniku zero
Do 'pętla
Debounce Pind.0 , 0 , Zwieksz , Sub 'naciśnięcie S1
Loop
End

Zwieksz: 'etykieta zakończona dwukropkiem
Incr Eedr 'zwięk zawartość licznika
If Eedr = 10 Then Eedr = 0 ' skracanie cyklu
Portb = Lookup(eedr , Tabela) 'przepisz do PortB kody
Return 'powróć do programu głównego

Tabela:
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
' Data kod0, kod1 ,kod2, kod3, itd.

Czy ktoś z Was orientuje się w czym tkwi problem? Z góry dziękuję za pomoc.

FreeHack
-
Posty: 19
Rejestracja: 26 sty 2011, 23:20
Lokalizacja: Quaramonte

Post autor: FreeHack » 10 sty 2013, 18:00

Problem rozwiązany. Reset zasilania płytki sprawił, że licznik działa zgodnie z założeniem.

ODPOWIEDZ