Blitzsignale im VLF Bereich kann man recht gut empfangen und zählen. Mit der Pong Platine und der 12 * 10 Led Matrix lassen sich die Zählergebnisse zusätzlich auch graphisch darstellen, als Balkenddiagramm. So erhält man die Übersicht, wie oft es pro Zeiteinheit geblitzt hat. Falls innerhalb der Zählzeit von 10 Sekunden Impulse an Int0 eintreffen, dann inkrementieren sie den Blitzzähler. Danach geht es weiter von links nach rechts zur nächsten Spalte. Die Led ganz oben in Zeile 1 zeigt an, wo gerade gezählt wird. Wenn nichts passiert dann wandert die Led Anzeige alle 10 Sekunden eins nach rechts. Der erste Blitz setzt die Zeit zurück und die Zählung beginnt ganz links in der ersten Spalte, dafür sorgen zwei Flags im Programm. Nach einem vollen Durchlauf von 120 Sekunden werden die Flags wieder zurückgesetzt. Jetzt könnte man die Led Matrix löschen, das wird hier aber nicht gemacht. Man sieht jeweils die Aktivität der letzten 2 MinutenDie Balkendiagramm Anzeige, die Blitze werden 10 Sekunden lang gezählt
Zitate:http://www.elektronik-labor.de/Projekte/Blitzwarner3.html%20#opv
'*********************************************************************
' ATMega8 PongBlitz GS 2013
'
' displays last 12 flash counts as histogram
'
' upper row led moves 1 to right every 10 sec
' counts pulses on Int0 during 10 sec, can be changed
' If Seconds = 10 Then...
' first pulse resets time, count starts on left column
'
' Int0 (Rising ) increases CntFlash, connect to frontend
' use pull-down resistor on P4 to GND !!!
'
' optional RS232 Print Minutes ; ";" ; Cntflash
'
' led matrix updated every 1 ms in Compare1a interrupt
'
''***************************************************************************
' This program is free software; you can redistribute it and/or
' modify it under the terms of the GNU General Public License.
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY;
'***************************************************************************
'
' ATMega8 PDIP
'
' (RESET) PC6 1 28 PC5 (ADC5/SCL)
' (RXD) PD0 2 27 PC4 (ADC4/SDA)
' (TXD) PD1 3 26 PC3 (ADC3)
' (INT0) PD2 4 25 PC2 (ADC2)
' (INT1) PD3 5 24 PC1 (ADC1)
' (XCK/T0) PD4 6 23 PC0 (ADC0)
' VCC 7 22 GND
' GND 8 21 AREF
' (XTAL1/TOSC1)PB6 9 20 AVCC
' (XTAL2/TOSC2)PB7 10 19 PB5 (SCK)
' (T1) PD5 11 18 PB4 (MISO)
' (AIN0) PD6 12 17 PB3 (MOSI/OC2)
' (AIN1) PD7 13 16 PB2 (SS/OC1B)
' (ICP1) PB0 14 15 PB1 (OC1A)
'
'***************************************************************************
$crystal = 8000000
$regfile = "m8def.dat"
$hwstack = 64
$swstack = 64
$framesize = 64
$baud = 9600 ' use baud rate if print
Const C_value = 8000 - 1 ' for 1 ms
Ipulse Alias Portd.3
Dim Dispcnt As Byte ' display CntFlash
Dim Icnt As Word ' ISR Count
Dim Cntflash As Byte ' CntFlash
Dim Cnttotal As Word
Dim Flag1 As Byte ' detects first flash
Dim Flag2 As Byte
Dim Minutes As Byte
Dim Seconds As Byte
Dim Col1 As Word
Dim Mynum As Byte
Dim Cnt(12) As Byte ' store last 12 counts
Dim Leds(12) As Word
Dim Vhelp As Word
Dim Vy As Byte
Dim Col As Byte
Dim Portdout As Byte
Dim Portcout As Byte
Dim X As Byte
Dim Y As Byte
Declare Sub Test
'*********************************************************************
Config Portb = Output
Ddrc = &B00111111
Portc = &B00000000
Ddrd = &B11111010
Portd = &B00001011
' Config Timer1
Config Timer1 = Timer , Prescale = 1
Tccr1a = &B00000000 '
Tccr1b = &B00001001 'CTC, ck 1
Ocr1ah = High(c_value)
Ocr1al = Low(c_value) ' c_value Timer1 for Period of 1ms
Enable Compare1a
On Compare1a T1cmpa
Enable Timer1
Config Int0 = Rising 'Rising
On Int0 Int0_isr
Enable Int0
Enable Interrupts
Gosub Test
Minutes = 1
Do 'loop
If Dispcnt = 1 Then
Dispcnt = 0
If Flag1 = 1 And Flag2 = 0 Then 'first flash
Leds(minutes).0 = 0 'resets time
Flag2 = 1 'start in left column
Minutes = 1
Seconds = 0
End If
Incr Seconds
Cnt(minutes) = Cntflash 'for future use
Mynum = Cntflash 'display counts
Gosub Getcols
Leds(minutes) = Col1
Leds(minutes).0 = 1
If Seconds = 10 Then 'can change
Seconds = 0
' Print Minutes ; ";" ; Cntflash 'optional
Leds(minutes).0 = 0
Incr Minutes
If Minutes = 13 Then
Minutes = 1 'in 12 Minutes
Cnttotal = 0
Flag1 = 0 'reset flags
Flag2 = 0 'wait for first flash
End If
Cnttotal = Cnttotal + Cntflash
Cntflash = 0 'reset
End If 'if seconds
End If 'if dispcnt
Loop
'*********************************************************************
T1cmpa: 'interrupt
Ipulse = 1
Incr Icnt
If Icnt = 1000 Then
Icnt = 0 '1 second
Dispcnt = 1
End If 'Icnt
Col = Col + 1
If Col = 13 Then Col = 1
Vy = Col + 0
Portd = 0
Portb = 0
Portc = 0
If Col = 1 Then Portb.4 = 0 Else Portb.4 = 1
Portb.3 = 1 'cl
Portb.3 = 0
Portb.2 = 1 'Str
Portb.2 = 0
Portdout = Low(leds(vy))
Portcout = Portdout And 15
Portdout = Portdout And 240
Portd = Portdout
Portc = Portcout
Portb = High(leds(vy))
Ipulse = 0
Return 'reti
'***************************************************************************
Int0_isr: 'count every flash
Incr Cntflash
Flag1 = 1
Return 'reti
'***************************************************************************
Sub Test
For X = 1 To 12
For Y = 1 To 12
Leds(y) = 0
Next Y
Leds(x) = 1023
Waitms 100
Next X
For Y = 1 To 10
For X = 1 To 12
Vhelp = Y - 1
Vhelp = 2 ^ Vhelp
Leds(x) = Vhelp
Next X
Waitms 100
Next Y
For X = 1 To 12
Leds(x) = 0
Next X
End Sub
'***************************************************************************
Getcols:
Select Case Mynum
Case 0:
Col1 = 0
Case 1:
Col1 = 512
Case 2:
Col1 = 768
Case 3:
Col1 = 896
Case 4:
Col1 = 960
Case 5:
Col1 = 992
Case 6:
Col1 = 1008
Case 7:
Col1 = 1016
Case 8:
Col1 = 1020
Case 9:
Col1 = 1022
Case 10:
Col1 = 1023
Case Else Col1 = 1023
End Select
Return
'***************************************************************************
End