Hinter :
If N = 255 Then
A = A + 1
Fehlt noch das "N=0" sonst läuft N gegen unendlich....
Hallo,
ich habejetzt mal versucht eine LED mittels interrupt blinken zu lassen.
auf die art und weiße will ich später damit mal eine uhr bauen. deswegen der interrupt, sonst könnte ich ja auch wait 1 nehmen.
nur leider blinken die an portd angeschloßenen led nicht. entweder die blinken zu schnell so das ich es nicht sehen kann, oder der interrupt funktioniert nicht (was ich eher denke).
findet ihr ein fehler?
hier mein programm:
wie kann man die frequenz berechnen.Code:'****************************** '* Atmega8 mit 8MHz * '* Interupt-testprogramm * '****************************** $regfile "m8def.dat" $crystal = 8000000 Config Portd = Output Dim A As Byte , N As Byte N = 0 A = 0 On Timer1 Ontimer1 'Interrupt-Routine für Timer1-Overflow Config Timer1 = Timer , Prescale = 256 'Takt: Quarz/256 Enable Timer1 'Timer1-Overflow-Interrupt einschalten Enable Interrupts 'Interrupts global zulassen '--------------------------------------------------------- Do 'Hauptschleife Loop '--------------------------------------------------------- Ontimer1: 'Interrupt-Routine N = N + 1 If N = 255 Then A = A + 1 If A = 255 Then Toggle Portd.0 A = 0 End If End If Return
weil 8MHz/256 = 31,25KHz / 256 = 122Hz /256 = 0,5Hz.
also müsste meine led aller 2 sekunden an und aus gehen. macht sie aber nicht.
danke für die hilfe
arno
Hinter :
If N = 255 Then
A = A + 1
Fehlt noch das "N=0" sonst läuft N gegen unendlich....
Gruß
Ratber
Versuche mal das Programm, das sollte so funktionieren! Die Werte sind mit rnAVR berechnet, was du auch hier irgentwo im Forum findest.
$regfile "m8def.dat"
$crystal = 8000000
Config Portd = Output
led alias portd.0
Config Timer1 = Timer, Prescale = 256
Const Timervorgabe = 3036
on timer1 ontimer1
enable timer1
enable interrupts
do
loop
ontimer1:
Timer1 = Timervorgabe
Toggle Led
Return
n läuft nicht in unendlich, da es als byte deffiniert wurde und somit bis 255 läuft und danach wieder bei 0 beginnt.
Dann kann man dann auch "A=0" in der Schleife weglassen.
Gruß
Ratber
theoretisch ja, ist aber schlampig so zu programmieren
Ja eben,mein Reden.
Entweder alle oder keinen.
Egal:
Was mir gerade mal so ein- und auffällt:
Der Timer läuft ja fröhlich weiter wärend er in der Int.Schleife steckt.
So übern Daumen kommt der vermutlich nicht mal bis zum Toggle weil er auf den nächsten Timer-Int läuft.
Also am Anfang der Int-Routine Timer abschalten und am Ende wieder einschalten (Disable Timer1/Enable Timer1)
Gruß
Ratber
Hallo,
> wie kann man die frequenz berechnen.
> weil 8MHz/256 = 31,25KHz / 256 = 122Hz /256 = 0,5Hz.
> also müsste meine led aller 2 sekunden an und aus gehen. macht sie
> aber nicht.
Verständlich!
Der Timer1-OVF wird nach 2^16 * 256 Prozessortakten ausgeführt.
Der Timer1-OVF muss 255 * 256 mal ausgefürt werden bis der Portpin getoggelt wird.
Mach bei 8MHz Prozessortakt alle 136.902,08 Sekunden einen Zustandswechsel, bzw eine Blinkfrequenz von 0,00000365 Hz
(3.65 * 10^-6 Hz)!
Gruß Werner
P.S.
> Also am Anfang der Int-Routine Timer abschalten und am Ende wieder
> einschalten (Disable Timer1/Enable Timer1)
2^24 Takte wird die Interrupt Routine nicht benötigen
Yep,da bin ich auch gerade drauf gestoßen.
Der Simulator is ja langsam aber sooo langsam nu auch wieder nicht
Gruß
Ratber
Hallo,
danke an eure Hilfe, leider habe ich mein Programm nicht zu laufen bekommen. Aber das programm von hardstyleroxx läuft super.
nur mal noch paar fragen. was ist das:
Const Timervorgabe = 3036
ich denke mal damit wird doch der timer irgendwie eingestellt. aber wie genau.
ich würde das gerne auch mal selber mal berechnen.
weil die nächste mir selber gestellte aufgabe ist eine Uhr.
und da brauche ich ja einen schönen 1 sekundentakt.
thx for help
Arno
Lesezeichen