Blitzzähler mit der Pong Platine         

von Gerd Sinning                       
Elektronik-Labor  AVR  HF  Projekte 

Die Balkendiagramm Anzeige, die Blitze werden 10 Sekunden lang gezählt

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 Minuten

In der Matrix mit 10 Leds pro Spalte lassen sich Zahlen von 0 bis 9 anzeigen, das sollte ausreichen. Wenn mehr als 10 Blitze in 10 Sekunden eintreffen, dann hat man ohnehin ein Problem. Die Zählzeit kann man hier anpassen If Seconds = 10 Then... Dann will man evtl. die Daten auf den PC übertragen, das geht wenn man das Häkchen vor ' Print Minutes ; ";" ; Cntflash entfernt.

Die Platine wird in in eine Zip Drive Hülle eingebaut. Den Programmierstecker muss man abschneiden, sonst passt die Höhe nicht
Der Blitzempfänger ist die Version mit dem OpAmp. Der läuft mit 12 V, daher braucht man noch einen Spannungsteiler, 15k 6,8k und eine Schutzdiode am Int0 Eingang der Pong Platine. Angeschlossen wird das an den 10 ms Ausgang des OpAmps.

Blitz und Donner stecken in einer Plastikdose, links ist der Blitzempfänger und rechts der Schallempfänger.
Jetzt müsste man nur noch Störungen von einem echten Blitz unterscheiden können. Morgens ist bei mir erhöhte 'Blitz' Aktivität, Licht im Bad, Toaster usw. werden angezeigt. Immerhin hat man ein schönes Balkendiagramm.

Nachtrag: Es gab Gewitter hier. Die Pong-Platine zeigt das gut an, bereits lange bevor man den Donner hört.
 
Zitate:
http://www.elektronik-labor.de/Projekte/Blitzwarner3.html%20#opv
Datasheet ATMega8, Atmel.com


Download: Pongblitz2.zip

'*********************************************************************
' 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


Elektronik-Labor  AVR  HF  Projekte