Elektronik-Labor
Projekte
AVR
Tiny85
' Netzfreq-4.bas ' Fuses: L = 0xff H = 0xdf E = 0xfe ' Compiler BASCOM 2.0.7.5 DEMO ' Das Programm ermittelt die genaue Netzfrequenz und gibt einen Zählwert ' per serieller Schnittstelle aus. ' ' Version 4: Ausgabe der genauen Netzfrequenz in mHz mit etwas reduzierter ' Genauigkeit (um Fliesskomma-Arithmetik zu vermeiden). Die mHz-Werte ' werden im Arduino-Plotter gut aufgelöst. $Regfile = "attiny85.dat" $Crystal = 16000000 $Hwstack = 40 $Swstack = 4 $Framesize = 4 Dim F As DWord ' DWord: unsigned Long Dim Ovfcnt As DwordIm Nachhinein stellte sich heraus, dass der Mikrocontroller bei 16 MHz doch schnell genug ist, um zeitaufwenige Fließkomma-Arithmetik zu bewältigen. Die beigefügte Version "netzfreq-5.bas" gibt die Frequenz in Hz aus, was im Terminal besser aussieht, aber - wie oben geschildert - nicht für die Arduino-Plotter geeignet ist.
Config Portb.0 = Output
Config PortB.1 = Output
' bei Verwendung eines RS232-USB-Wandlers: Open "comb.1:115200,8,n,1,INVERTED" For Output As #1 ' bei Verwendung eines TTL-USB-Wandlers stattdessen: ' Open "comb.1:115200,8,n,1" For Output As #1 Config Timer0 = Counter , Edge = Falling
Enable Timer0
On Timer0 Tim0isr
Config Timer1 = Timer , Prescale = 256 ' statt 128 Enable Timer1
On Timer1 Tim1isr
Enable Interrupts
Do If Ovfcnt < 15 Then ' erzeugt Blinksignal PortB.0 = 1 Else PortB.0 = 0 End If Loop Tim0isr: F = TCNT1
TCNT1 = 0 ' Counter1 zuruecksetzen TCNT0 = 206 ' Counter0 zuruecksetzen Shift Ovfcnt, Left, 8 ' ist schneller als Multiplikation mit 256 F = F + Ovfcnt ' Werte um 125000 Ovfcnt = 0
F= 3125800000 / F ' 3125800000 passt gerade so in ein DWord Print #1 , F
Return Tim1isr: Incr Ovfcnt ' Ovfcnt: Overflow-Counter Return End