Hallo
Das war ja klar, dass es nicht auf Anhieb funktioniert ;)
Der Takt der grünen Led:
1000000Hz/256/1024 oder etwa 3,81Hz
Rote Led:
1000000Hz/256/64 oder etwa 61Hz
(Rot zu Grün wie 1024 zu 64 oder 61/16=3,8125)
Der grobe Fehler ist sicher die Zeitmessung mit waitms. Dazu kommen noch die Funktionsaufrufe und die Ausgaben zum LCD. Wissenschaftlicher wäre die Verwendung eines zusätzlichen Timers zum Auslesen der Frequenzzähler:
Code:
' Display an folgenden Ports
' Enable = Port C.4
' RS = Port C.5
' DB7 = Port C.7
' DB6 = Port C.6
' DB5 = Port C.3
' DB4 = Port C.2
'
' Leds an folgenden Ports
' Grün an A.0
'
$regfile "m32def.dat" 'Definiert den Atmega als Atmega 32
$crystal = 1000000 'Gibt die Quarzfrequenz an in Herz
$hwstack = 32 'Default use 32 for the hardware stack
$swstack = 10 'Default use 10 for the SW stack
'-------------------------------------------------------------------------------
' Konfiguration fürs Display
Config Lcd = 16 * 2 'definiert das LCD Display in Art und Größe
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.6 , Db7 = Portc.7 , Rs = Portc.5 , E = Portc.4
'------------------------------------------------------------------------------
' Variablen
Dim Takt1 As Word
Dim Takt2 As Word
Dim Takt3 As Word
Dim Takt1_temp As Word
Dim Takt2_temp As Word
'------------------------------------------------------------------------------
Portb = &B00011110 ' Pull Up setzen für Pin B1
Ddra = &B11111111 ' Pin A.7 als Ausgang setzen für blaue Led
'------------------------------------------------------------------------------
' Timer 0
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
On Timer0 Timer_null
'---------------------------------------
' Timer 1
Config Timer1 = Timer , Prescale = 64
Enable Timer1
On Timer1 Timer_eins
'---------------------------------------
' Timer 2
Config Timer2 = Timer , Prescale = 8
Ocr2 = 6 'nach 250 Zählschritten folgt der Interrupt
Enable Timer2
On Timer2 Timer_zwei
Enable Interrupts
Takt3 = 0
Cls
'------------------------- H A U P T P R O G R A M M --------------------------
Do
Gosub Anzeige
Waitms 300
Loop
'------------------------------ D I S P L A Y - A N Z E I G E -----------------
Anzeige:
Cls
Locate 1 , 1
Lcd "Takt1: " ; Takt1
Lcd "Takt2: " ; Takt2
Return
'--------------------------------- T I M E R - 0 -----------------------------
Timer_null:
Toggle Porta.0 ' Led Grün
Takt1_temp = Takt1_temp + 1
Return
'--------------------------------- T I M E R - 1 ------------------------------
Timer_eins:
Toggle Porta.7 ' Led Blau
Takt2_temp = Takt2_temp + 1
Return
'--------------------------------- T I M E R - 2 ------------------------------
'Die Werte werden jede 1/2 Sekunde ausgelesen. Das Setup des Timers sieht so aus:
'1MHz mit Prescaler/8 ergibt 125000 Timertakte pro Sekunde. Das Zählregister startet
'mit 6, nach 250 Schritten erfolgt der Interrupt. Das ergibt 125000/250=500 Interrupts
'pro Sekunde.Nach 250 Interrupts werden dann die Werte eingelesen und zurückgesetzt.
'Die Frequenzkorrektur berücksichtigt auch die Takte, die schon gezählt wurden und
'entfernt zusätzliche 3 Takte für Laden, Berechnen und Speichern des OCR2-Wertes.
Timer_zwei:
Ocr2 = Ocr2 + 9 'Frequenzkorrektur (256-6-3)
If Takt3 < 250 Then
Takt3 = Takt3 + 1
Else
Takt3 = 0
Takt1 = Takt1_temp 'Zähler auslesen und resten
Takt1_temp = 0
Takt2 = Takt2_temp
Takt2_temp = 0
End If
Return
'------------------------------------------------------------------------------
(ungetestet)
Ich hoffe, das passt jetzt so in etwa. Ich bin mir nicht sicher, ob OCR2 wirklich mit 6 oder nur mit 5 starten muss.
Gruß
mic
Lesezeichen