-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Interrupt Probleme -> LED blinkt nicht

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272

    Interrupt Probleme -> LED blinkt nicht

    Anzeige

    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:

    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
    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.

    danke für die hilfe

    arno

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Hinter :

    If N = 255 Then
    A = A + 1



    Fehlt noch das "N=0" sonst läuft N gegen unendlich....
    Gruß
    Ratber

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    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

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710
    n läuft nicht in unendlich, da es als byte deffiniert wurde und somit bis 255 läuft und danach wieder bei 0 beginnt.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Dann kann man dann auch "A=0" in der Schleife weglassen.
    Gruß
    Ratber

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710
    theoretisch ja, ist aber schlampig so zu programmieren

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    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

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    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

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Yep,da bin ich auch gerade drauf gestoßen.

    Der Simulator is ja langsam aber sooo langsam nu auch wieder nicht
    Gruß
    Ratber

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •