Hallo
Timer 1 ist doch ein 16Bit-Timer. Deshalb muss man auch hier das Zählregister in der ISR manipulieren um ein messbares Ergebniss zu erhalten:
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
Tcnt1 = 65280 '16Bit! 65536-256
Enable Timer1
On Timer1 Timer_eins
'---------------------------------------
' Timer 2
Config Timer2 = Timer , Prescale = 8
Tcnt2 = 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:
Tcnt1 = Tcnt1+65283 '16Bit! 65536-256+3
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 TCNT2-Wertes.
Timer_zwei:
Tcnt2 = Tcnt2 + 9 'Frequenzkorrektur (256-6-3)
If Takt3 < 250 Then 'solange Takt3 kleiner 250
Takt3 = Takt3 + 1 'Takt3 erhöhen
Else 'die 1/2 Sek. vorbei
Takt3 = 0 'Takt3 reseten
Takt1 = Takt1_temp 'Zähler auslesen
Takt1_temp = 0 'und reseten
Takt2 = Takt2_temp
Takt2_temp = 0
End If
Return
'------------------------------------------------------------------------------
Meine Frequenzberechnungen ergeben die Anzahl der ISR-Aufrufe. Die effektive Frequenz an der Led muss man natürlich halbieren.... (nobody is perfect ;)
Mein Testprogramm für den mit 8MHz getakteten RP6:
Code:
$regfile "m32def.dat" 'Definiert den Atmega als Atmega 32
$crystal = 8000000 'Gibt die Quarzfrequenz an in Herz
$hwstack = 32 'Default use 32 for the hardware stack
$swstack = 10 'Default use 10 for the SW stack
$baud = 38400
'-------------------------------------------------------------------------------
'Led1 PC4
'Led2 PC5
'LED3 PC6
'------------------------------------------------------------------------------
' Variablen
Dim Takt1 As Word
Dim Takt2 As Word
Dim Takt3 As Word
Dim Takt1_temp As Word
Dim Takt2_temp As Word
'------------------------------------------------------------------------------
Ddrc = &B01110000 ' PC4-6 sind die Leds
'------------------------------------------------------------------------------
' Timer 0
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
On Timer0 Timer_null
'---------------------------------------
' Timer 1
Config Timer1 = Timer , Prescale = 64
Tcnt1 = 65280 '16Bit! 65536-256
Enable Timer1
On Timer1 Timer_eins
'---------------------------------------
' Timer 2
Config Timer2 = Timer , Prescale = 64 'RP6 mit 8MHz
Tcnt2 = 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:
Print "Takt1: " ; Takt1
Print "Takt2: " ; Takt2
Print
Return
'--------------------------------- T I M E R - 0 -----------------------------
Timer_null:
Toggle Portc.4 ' Led 1
Takt1_temp = Takt1_temp + 1
Return
'--------------------------------- T I M E R - 1 ------------------------------
Timer_eins:
Tcnt1 = Tcnt1+65283 '16Bit! 65536-256+3
Toggle Portc.5 ' Led 2
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 TCNT2-Wertes.
Timer_zwei:
Tcnt2 = Tcnt2 + 9 'Frequenzkorrektur (256-6-3)
If Takt3 < 250 Then 'solange Takt3 kleiner 250
Takt3 = Takt3 + 1 'Takt3 erhöhen
Else 'die 1/2 Sek. vorbei
Toggle Portc.6 ' Led 3
Takt3 = 0 'Takt3 reseten
Takt1 = Takt1_temp 'Zähler auslesen
Takt1_temp = 0 'und reseten
Takt2 = Takt2_temp
Takt2_temp = 0
End If
Return
'------------------------------------------------------------------------------
Die Ausgabe:
Code:
Takt1: 15
Takt2: 244
Takt1: 15
Takt2: 244
Takt1: 15
Takt2: 245
Takt1: 15
Takt2: 245
Gruß
mic
Lesezeichen