Nowe zadanie , nowy problem


Witam po dłuższym czasie jak zwykle z problemem.

Zrobiłem licznik dni sterowany z odbiornika GPS.
Od zadanej przyciskami wartości początkowej licznik
jest zwiększany o jeden gdy Y1,Y2 - godziny = 00
Y3,Y4 - minuty = 00 i Y5,Y6 - sekundy =00, czyli
o godzinie 00:00:00.
Wszystko działa jak należy.
Oto kod

$regfile = "m8def.dat"
$crystal = 11059200
$hwstack = 32
$swstack = 8
$framesize = 24
 
Open "comc.2:9600,8,n,1" For Input As #2                    ' PinC.2 jako wejście UART
 
Dim Gpsin As Byte
Dim X As Byte ,
Dim Count As Byte
Dim Y(10) As Byte
Dim Z As Byte
Dim Mux As Byte
Dim Kopia(10) As Byte
Dim Jednostki As Byte
Dim Dziesiatki As Byte
Dim Setki As Byte
Dim Tysiace As Byte
 
Config Portd = Output                                       '8 bitów na 7seg.
 
Config Pinb.5 = Output                                      'anoda1
Config Pinb.4 = Output                                      'anoda2
Config Pinb.3 = Output                                      'anoda3
Config Pinb.2 = Output                                      'anoda4
 
Config Pinc.1 = Input                                       'przełącznik czasu ZIMA/LATO
Config Pinc.5 = Input                                       '  +1 ustawianie licznika dni
Config Pinc.4 = Input                                       ' +10 ustawianie licznika dni
Config Pinc.3 = Input                                       '+100 ustawianie licznika dni
 
Config Timer0 = Timer , Prescale = 256
Enable Interrupts
Enable Timer0
On Timer0 Co4ms
 
Do
 
Start:
Gpsin = Waitkey(#2)
If Gpsin <> "$" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "G" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "P" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "G" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "G" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "A" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "," Then Goto Start
Count = 0
For X = 1 To 6
Gpsin = Waitkey(#2)
While Gpsin = ","
Gpsin = Waitkey(#2)
Count = Count + 1
If Count = 5 Then Goto Start
Wend
Y(x) = Gpsin - 48
Next X
 
Z = Y(1) * 10
Z = Z + Y(2)
Z = Z + 1
If Z = 24 Then Z = 0
 
If Pinc.1 = 1 Then Z = Z + 1
 
If Z = 24 Then Z = 0
Y(1) = Z / 10
Y(2) = Z Mod 10
 
 
 
If Pinc.5 = 0 Then Incr Jednostki
If Pinc.4 = 0 Then Incr Dziesiatki
If Pinc.3 = 0 Then Incr Setki
 
If Jednostki = 10 Then Incr Dziesiatki
If Jednostki = 10 Then Jednostki = 0
If Dziesiatki = 10 Then Incr Setki
If Dziesiatki = 10 Then Dziesiatki = 0
If Setki = 10 Then Incr Tysiace
If Setki = 10 Then Setki = 0
If Tysiace = 10 Then Tysiace = 0
 
If Y(1) = 0 Then
If Y(2) = 0 Then
If Y(3) = 0 Then
If Y(4) = 0 Then
If Y(5) = 0 Then
If Y(6) = 0 Then
Incr Jednostki
 
End If
End If
End If
End If
End If
End If
 
Y(7) = Jednostki
Y(8) = Dziesiatki
Y(9) = Setki
Y(10) = Tysiace
 
Kopia(7) = Y(7)
Kopia(8) = Y(8)
Kopia(9) = Y(9)
Kopia(10) = Y(10)
 
Kopia(7) = Lookup(kopia(7) , Tabela2)
Kopia(8) = Lookup(kopia(8) , Tabela2)
Kopia(9) = Lookup(kopia(9) , Tabela2)
Kopia(10) = Lookup(kopia(10) , Tabela2)
 
Loop
End
 
Co4ms:
Timer0 = 110
 
   Incr Mux
   If Mux = 4 Then Mux = 0
 
   Select Case Mux
 
 
   Case 0:
 
   Reset Portb.5
   Portd = Kopia(7)
   Set Portb.2
 
   Case 1:
 
   Reset Portb.2
   Portd = Kopia(8)
   Set Portb.3
 
   Case 2:
 
   Reset Portb.3
   Portd = Kopia(9)
   Set Portb.4
 
   Case 3:
 
   Reset Portb.4
   Portd = Kopia(10)
   Set Portb.5
 
 
 
End Select
 
 
Return
 
Tabela2:
    Data 63 , 6 , 91 , 79 , 102 , 109 , 125 , 7 , 127 , 111 , 0

Obsługi wyswietlania godziny tu nie ma, ale to nie problem.

Problem pojawił się gdy zachciało mnie się takiego samego licznika
ale liczącego w dół od zadanej wartości.
Jakieś podpowiedzi ?




Portret użytkownika matrix

Re: Nowe zadanie , nowy problem

Widzę że wszystkie zmienne masz zadeklarowane jako byte więc musisz chwilę pomyśleć co się dzieje jeśli zmniejszasz zmienną i ona schodzi poniżej zera. Jaką wartość osiąga ?.....
Bingo, 255. Stawiasz warunek:

If Dziesiatki = 255 then Dziesiatki = 9

W ten sposób gdy dziesiątka zejdzie Ci poniżej zera będziesz miał nie 255 a 9

Portret użytkownika Wieslaw.S

Dzięki

Dzięki za podpowiedź , właśnie na to wpadłem, gdy rozpisałem sobie
całą procedurę na kartce przy pomocy pseudojęzyka. Tak jak uczyli w szkole.

Temat można zamknąć.

Portret użytkownika Wieslaw.S

Nowe zadanie

Tym razem mam nowe zadanie do rozgryzienia.
Sterowanie wyświetlaczami 7seg przy pomocy 74HC595
ale .... bez multipleksowania czyli anody wyswietlaczy
na stałe podłączone do +5V.
Na przykład tak jak na tym schemacie.

Oczywiście chodzi mi o obsługę tego w Bascomie.

To jest układ ze wspólną katodą ale to tylko przykład.

Czy i tym razem ktoś pomoże ?

Portret użytkownika EDC

Odp. 74HC595

Na dole strony LINK jest kod dla jednego rejestru. Musisz wysłac cztery bajty po czym zatwierdzić/zatrzasnać tą sekwencją

Set Stcp_rclk                     'zatwierdź
   Reset Stcp_rclk

W kodzie jest opis co podłaczyć do którego pinu i sa aliasy dla nazw które odpowiadają tym z noty układu.

-

BARTek
Moja strona

Portret użytkownika Wieslaw.S

Nie działa

Hurrrra !

Już wiem jak to zrobić !
Dzięki stukrotne BARTek .

Ds Alias Portd.5                                            'Pin (14)--> Data
Stcp Alias Portd.0                                          'Pin (12)--> Zatrzask
Shcp Alias Portd.1                                          'Pin (11)--> Zegar
 
Do
A = 12
B = 182
C = 158
D = 204
 
Shiftout Ds , Shcp , A                                      'wyslij wartosc bajtu B
Shiftout Ds , Shcp , B
Shiftout Ds , Shcp , C
Shiftout Ds , Shcp , D
 
Set Stcp                                                    'zatwierdź
Reset Stcp
Waitms 300
 
Loop
End

Ale to proste !

Tylko dlaczego muszę podać

A = 12
B = 182
C = 158
D = 204

Bo jak dam

A = 1
B = 2
C = 3
D = 4

to wyświetlają się głupoty.

Portret użytkownika EDC

Odp. 74HC595

"Mądrej głowie, dość po słowie" Może tu wystarczy obrazek ;)

-

BARTek
Moja strona

Portret użytkownika Wieslaw.S

Już doszedłem do tego

Już doszedłem do tego.
Wysyłałem np. liczbę 64 i patrzyłem który segment się zapali.
No i musiałem utworzyć własną tablicę znaków.

$regfile = "attiny2313.dat"
$crystal = 12000000
$hwstack = 32
$swstack = 8
$framesize = 24
 
Dim W1 As Byte
Dim W2 As Byte
Dim W3 As Byte
Dim W4 As Byte
Dim W5 As Byte
Dim W6 As Byte
Dim W7 As Byte
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim Temp As Byte
 
 
'     74HC595
Config Portd = Output
Ds Alias Portd.5                                            'Pin (14)--> Data
Stcp Alias Portd.0                                          'Pin (12)--> Zatrzask
Shcp Alias Portd.1                                          'Pin (11)--> Zegar
 
 
Do
 
 W7 = 1
 W6 = 2
 W5 = 3
 W4 = 4
 W3 = 5
 W2 = 6
 W1 = 7
 
 
 
 
 
W1 = Lookup(w1 , Tabela2)
W2 = Lookup(w2 , Tabela2)
W3 = Lookup(w3 , Tabela2)
W4 = Lookup(w4 , Tabela2)
W5 = Lookup(w5 , Tabela2)
W6 = Lookup(w6 , Tabela2)
W7 = Lookup(w7 , Tabela2)
 
Tabela2:
 
   Data 126 , 48 , 109 , 121 , 51 , 91 , 95 , 112 , 127 , 123 , 0
 
Shiftout Ds , Shcp , W1 , 3
Shiftout Ds , Shcp , W2 , 3
Shiftout Ds , Shcp , W3 , 3
Shiftout Ds , Shcp , W4 , 3
Shiftout Ds , Shcp , W5 , 3
Shiftout Ds , Shcp , W6 , 3
Shiftout Ds , Shcp , W7 , 3
 
Set Stcp
Reset Stcp
 
Waitms 300
 
Loop

No i teraz działa jak ta lala.

U mnie liczba 2 to dec 109 a nie 118 ----- co jest tego powodem nie wiem.