- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Timer funktioniert nicht

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    13.08.2004
    Beiträge
    11

    Timer funktioniert nicht

    Anzeige

    E-Bike
    Hi
    Ich habe hier mit der Methode versucht die Signal() funktion in
    die Timer()funktion über die Variable globaloverflows hinüberzuleiten.
    Da ich den Timer nicht die ganze Zeit brauch sondern nur immer
    speziel für verschiedenen Aufgaben. Das LED soll ned die ganze Zeit immer blinken im später Programm.
    Ich hoffe ihr blickt durch.
    danke
    Angehängte Dateien Angehängte Dateien

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    13.08.2004
    Beiträge
    11
    Ich habe die globaloverflow variable jetzt auch als volatile deklariert.
    Aba funktioniert immer noch ned.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    68
    Beiträge
    531
    Hallo barlip,

    wass ist den mit:

    tmp+globaloverflows;
    gemeint?

    dass tut nix. (mein compiler gibt hier eine warnung)

    gruss

    Henk

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo, in den neuen winavr-version gibt es kein "outp() mehr und kein sbi und cbi". da kommen dann warnmeldungen.
    mfg pebisoft

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    13.08.2004
    Beiträge
    11
    Hi
    Bei meiner Version von WinAVR funktioniert sbi() und cbi() noch.
    Daran kann es also ned liegen.
    Warum wurden die beiden Funktionen rausgenommen?

    mit : tmp+globaloverflows;
    meine ich
    tmp += globaloverflows; << besser ausgedrückt

    also i bekommt die 50 ( 50*20ms = 1 sek.)
    i wird in tmp kopiert // überflüssiger schirtt weiß auch ned warum ich das gemacht habe

    auf die 50 (tmp) wird die Zahl der aktuellen überläufe(globaloverflows) draufgerechnet

    nun wird for so lange "geschleift" bis 50 weitere überläufe passiert sind
    also tmp == globaloverflows

    da ja bei jedem über lauf globaloverflows++ passiert

    SIGNAL(SIG_OVERFLOW0)
    {
    TCNT2= 236;
    globaloverflows++;

    }

    TCNT2= 236; <-- ist dieser schritt eigentlich überflüssig fängt er auto matisch wieder bei 236 an ?????

    oder kennt jm. ne anderen gute möglich keit das signal BUFFEROVERFLOW0
    in der Hauptroutine zu empfangen??
    anstatt in der nebenroutine SIGNAL()


    danke für eure Hilfe

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    68
    Beiträge
    531
    Hallo barlip,

    in SIGNAL function steht TCNT2=236 (Timer ZWEI)
    in initimer function steht TCNT0=236 (Timer NUL)
    vielleicht eine verschreibung?

    TCNT0 ist dass actuelle Register dass hochzahlt, wenn mann
    TCNT0 beliebig auslehst wird man immer ein anderen wert bekommen
    abhangig von bis wie weit die timer gerade gezahlt hat beim auslesen.

    Wenn du TCNT0 nicht wieder beschreibst wird die timer immer nach
    MAX (0xFF) bei 0x00 anfangen. Dass aufsneu beschreiben vom TCNT im interupt function ist ja richtig.

    Du hattest schon globaloverflows als volatile definiert?
    volatile unsigned int globaloverflows=0;
    Mit WinAvr macht dass ein richtigen unterschied.

    Schick sonst mahl die compilierten listfile, kann ich vielleicht nachgucken wo's schief geht.

    gruss

    Henk

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    13.08.2004
    Beiträge
    11
    ja war ein schreibfehler.
    so trotzdem danke für eure
    hilfe,
    habe nun das ganze ein bischen umgebaut und nun funktionierts..
    zwar leider 2 variablen mehr aber egal.
    wer will kann es sich ja mal anschauen ..
    guten n'baned noch
    Angehängte Dateien Angehängte Dateien
    • Dateityp: c test4.c (820 Bytes, 14x aufgerufen)

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    68
    Beiträge
    531
    Ist ja auch schon,

    immer freudig wenn's functioniert.

    versteh nur nicht was im interrupt function mit

    if(gofs>=65000)
    {
    gofs = 0;
    }

    gemeint ist.

    wenn gofs 65535 ist wird gofs auomatisch durchnummerieren
    und wieder bei 0 anfangen.

    gruss

    Henk

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    13.08.2004
    Beiträge
    11
    Genau .
    Aba da ich gerade 65535 nicht genau wusste sondern nur etwas mit 65xxx
    und ich auch nicht mein Buch rausholen woltte habe ich einfach 65000
    genommen.
    Ist dieser Schritt denn eigentlich überflüssig?? Gibts es einen Bufferoverflow wenn ich einen höhere Zahl als 65535 reinspeichere? oder fängt es automatisch bei 0 an..
    Theoretisch müsste doch ein Bufferoverflow passieren oder ist dort
    eine Sicherung drinnnen..
    danke

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    68
    Beiträge
    531
    Code:
    ein integer is 16 bit
    
    bit 15 (links) bis zum bit0 (rechts)
    1111 1100 0000 0000
    5432 1098 7654 3210
    xxxx xxxx xxxx xxxx
    
    Einige Beispiele...
    
    0000 0000 0000 0000 = hex 0x0000 = decimal 0
      0    0    0    0
    
    0000 0000 0000 0001 = hex 0x0001 = decimal 1
      0    0    0    1
    
    0000 0000 0000 0010 = hex 0x0002 = decimal 2
      0    0    0    2
    
    0000 0000 0000 0100 = hex 0x0004 = decimal 4
      0    0    0    4
    
    0000 0000 0000 1000 = hex 0x0008 = decimal 8
      0    0    0    8
    
    0000 0000 0001 0000 = hex 0x0010 = decimal 16
      0    0    1    0
    
    usw..usw..usw...
    
    1001 0110 1100 0111 = hex 0x96C7 = decimal 38599
      9    6    C    7
    
    1111 1111 1111 1111 = hex 0xFFFF = decimal 65535
      F    F    F    F
    
    unsigned int var;
    var = 0xFFFF; //oder var = 65535;
    var=var+2;
    //dann bevindet sich danach 0x0001 (1) in 'var'
    
    65535+2=65537 oder 0xFFFF+0x0002=0x10001
    0001 0000 0000 0000 0001 = 0x1FFFF
         xxxx xxxx xxxx xxxx <-- nur diesen bits werden angeschaut bei 'int' uder 'unsigned int' so dort steht '1'
    
    Dass umrechnen von hex <---> decimal kan mann auch mit die windows calculator machen.

    Gruss

    Henk

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen