Witam
Mam banalny program, po włączaniu zasilania startuje licznik czasu, program prawie działa nie do końca dobrze.
Atmega8 steruje wyświetlaczem LED (segmenty) z portu D, poszczególne cyfry od najbardziej znaczącej W4,W3,W2,W1 sterowane z portu B, z portu B jest też sterowanie jasnością wyświetlaczy (PWM) i buzerem.
Ogólnie licznik liczy ale buzer mimo wyłączenie piszczy
chyba w takt przemiatania cyfr i na W4 świeci się segment g (środkowa kreska) jeśli tylko na innej dowolnej cyfrze jest ona aktywna.
Zegar jest poganiany z T2 i kwarca 32,...kHz.
Chyba się nie wyspałem ale nie wiem dlaczego te dwa błędy wystpują.
Układowo z pewnością wszystko jest OK, na tej samej płytce działa program z zestawu AVT i nie ma problemów z wyświetlaczem.
Mam banalny program, po włączaniu zasilania startuje licznik czasu, program prawie działa nie do końca dobrze.
Atmega8 steruje wyświetlaczem LED (segmenty) z portu D, poszczególne cyfry od najbardziej znaczącej W4,W3,W2,W1 sterowane z portu B, z portu B jest też sterowanie jasnością wyświetlaczy (PWM) i buzerem.
Ogólnie licznik liczy ale buzer mimo wyłączenie piszczy
Zegar jest poganiany z T2 i kwarca 32,...kHz.
Chyba się nie wyspałem ale nie wiem dlaczego te dwa błędy wystpują.
'program licznika sekund, sterowanie LED 7 segmentowe
$regfile = "m8def.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 8
$framesize = 24
Config Portd = Output 'sterowanie segmentów LED
Config Pinb.0 = Output 'sterowanie W3
Config Pinb.1 = Output 'sterowanie PWM
Config Pinb.2 = Output 'sterowanie buzer
Config Pinb.3 = Output 'sterowanie W4
Config Pinb.4 = Output 'sterowanie W1
Config Pinb.5 = Output 'sterowanie W2
W1 Alias Portb.4
W2 Alias Portb.5
W3 Alias Portb.0
W4 Alias Portb.2
Dim W As Byte
Dim Sekunda As Byte
Dim Minuta As Byte
Dim Nr_wysw As Byte
Dim Cyfra4 As Byte
Dim Cyfra3 As Byte
Dim Cyfra2 As Byte
Dim Cyfra1 As Byte
Sekunda = 0
Minuta = 0
Config Timer0 = Timer , Prescale = 256
'Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Disconnect , Prescale = 1
Config Timer2 = Timer , Async = On , Prescale = 128 'generowanie przerwań od T2 co 1 sekunda
On Timer2 Myisr
On Timer0 Mult_wysw
Enable Interrupts
Enable Timer2
Disable Timer1
Enable Timer0
Load Timer0 , 20
'Pwm1a = 220
Portb.1 = 0
Portb.2 = 1
Do
Loop
End
Myisr:
If Sekunda < 58 Then
Incr Sekunda
Else
Sekunda = 0
Incr Minuta
End If
Cyfra4 = Minuta / 10
Cyfra3 = Minuta Mod 10
Cyfra2 = Sekunda / 10
Cyfra1 = Sekunda Mod 10
Return
Mult_wysw:
Load Timer0 , 20
Set W1
Set W2
Set W3
Set W4
Select Case Nr_wysw
Case 0:
Portd = Lookup(cyfra1 , Kody7seg)
Reset W1
Case 1:
Portd = Lookup(cyfra2 , Kody7seg)
Reset W2
Case 2:
Portd = Lookup(cyfra3 , Kody7seg)
Reset W3
Case 3:
Portd = Lookup(cyfra4 , Kody7seg)
Reset W4
End Select
Incr Nr_wysw
If Nr_wysw = 4 Then
Nr_wysw = 0
End If
Return
Kody7seg:
'kody cyfr
Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001,
Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000
Układowo z pewnością wszystko jest OK, na tej samej płytce działa program z zestawu AVT i nie ma problemów z wyświetlaczem.
