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.
Mikrokontrolery dla początkujących
- w przeciwnym razie (jeśli PinD.0 = 1 - puszczony przycisk) ustaw portb.1 na 1- 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 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.
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
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
Ćwiczenie 6 - licznik dekadowy
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.
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.