- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 15

Thema: SainSmart Arduino UNO R3 Timer

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Hi,

    deine Anfangsberechnungen sind richtig, allerdings machst du einen Fehler, weil ein Timer im AVR nicht von 0 - xxx sondern von xxx - max. Wert ( 8- od. 16Bit) zählt.
    Also:
    1) 16MHz / 8 = 2MHz
    2) 1 / 1MHz = 0.5µs
    3) (65536-50000)*0.5µs = 7768µs = 7.768ms = 0.007768s
    4) 10s / 7768µs = 1287

    Gruß
    Chris

    EDIT:
    Deine Vorangehensweise ist übrigens IMHO auch nicht ganz richtig. Normalerweise benutzt man den Interrupt von einem Timer, um eine bestimmte Aktion auszuführen. Du könntest beim Ovf in eine Sub springen, dort dann x inkrementieren und das dann im Main-Loop abfragen. Oder du multiplizierst die schon vergangen Timer-Ticks mit einer Variable / Konstante. Wenn das Ergebnis dann einen bestimmten Wert erreicht oder überschreitet, kannst du wieder eine Aktion durchführen.
    Geändert von Che Guevara (05.05.2013 um 10:12 Uhr)

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    05.05.2013
    Beiträge
    8
    Hi,

    danke für die Antwort. Zu deinem Hinweis mit dem Interrupt: Ich nutze den Timer um einen IR-Sensor zu dekodieren. Meine Vorgehensweise habe ich mir aus verschiedenen Quellen zusammengeholt.

    Beispiel Start-Bit nach NEC:

    9000µs HIGH, 4500µs LOW

    Anfangs hatte ich etwas in der Art wie:

    Code:
    unsigned long startTime, highPulsTime, lowPulsTime;
    
    void waitForStartSequence() {
      startTime = millis();
    
      while(IsIrHigh); // call macro which checks if ir is high
      
      highPulsTime = millis();
    
      while(IsIrLow);
    
      lowPulsTime = millis();
    
      lowPulsTime -= highPulsTime;
      highPulsTime -= time;
    
      if(highPulsTime >= THE_VALUE_FOR_9600us  IsAlmostEqual(lowPulsTime , THE_VALUE_FOR_4500us, TOLERANCE))
         Serial.println("X");
    }
    Das hat zur Erkennung des Start-Bits soweit funktioniert. Um dann aber die weiteren bits auszulesen scheint millis nicht akkurat genug zu sein. Wie könnte da eine saubere Lösung aussehen?

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Hi,

    also ich würde das Signal auf einen ext. Interrupt-Pin legen (zur Not ginge auch PinChange). Dann würde ich den Timer so initialisieren, dass er alle 10ms (als Beispie) einen Ovf hat. Wenn jetzt dein ext. Interrupt getriggert wird, liest du den aktuellen Zählerstand aus und setzt den Timer wieder auf 0, sodass der nächste Interrupt wieder erst nach 10ms kommen würde. Der ausgelesene Wert enthält dann die Information, wie lange eine Flanke gedauert hat. Wenn nötig müsstest du noch in einem Flag speichern, ob der Pegel high oder low ist.

    Gruß
    Chris

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    05.05.2013
    Beiträge
    8
    Ich komme da echt nicht weiter... Ich habe es jetzt wie folgt versucht:

    Code:
    void setup()
    {
      Serial.begin(9600);
    	
      noInterrupts();
    	
      OCR1A = 0xFFFF - 3000; // Der Wert scheint völlig egal zu sein!
      TCCR1A = 0;
      TCCR1B = 4 | 5; // Mode 4, CTC on OCR1A; divide by 1024
      TIMSK1 = 2;     //Set interrupt on compare match for OCIE1A
      TCNT1 = 0;
    
      interrupts();
    }
    
    ISR(TIMER1_COMPA_vect) {
      Serial.println("X");
    }
    
    void loop()
    {
    }
    In der Zeile OCR1A = 0xFFFF - 3000; habe ich verschiedenste Werte eingetragen, trotzdem wird nur etwa alle 4 Sekunden etwas auf Serial ausgegeben... Wieso ist das so?

    EDIT: Ich habe übrigends das Dingen: http://www.sainsmart.com/arduino-com...no-uno-r3.html

    Leider scheint es dazu kein Datenblatt zu geben...
    Geändert von SACO (05.05.2013 um 17:09 Uhr)

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Hi,

    also zunächst mal, es gibt mit SICHERHEIT ein DB vom ATMega328(p).
    Dann wäre es hilfreich, wenn du das ganze Programm einstellst und nicht nur Ausschnitte. Du rufst nirgends die Setup-Funktion auf.
    Du musst außerdem den Timer nach jedem OVF new vorladen, da sonst nur der erste OVF richtig getimed ist. Ich weiß nicht, was noInterrupts() bzw. Interrupts() bedeutet. Sind das Makros die cli() bzw. sei() beinhalten? Ansonsten fehlt das auch.

    Gruß
    Chris

Ähnliche Themen

  1. SainSmart uno r3-atmega328
    Von Droggelbecher im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 18
    Letzter Beitrag: 04.01.2013, 11:57
  2. Arduino Uno .... [GELÖST]
    Von Jonas15 im Forum Arduino -Plattform
    Antworten: 0
    Letzter Beitrag: 27.03.2012, 21:08
  3. Arduino Uno mit BASCOM
    Von uddo im Forum Arduino -Plattform
    Antworten: 0
    Letzter Beitrag: 14.02.2012, 19:22
  4. Arduino uno ... need help
    Von Leftbehindesp im Forum Arduino -Plattform
    Antworten: 3
    Letzter Beitrag: 09.02.2012, 11:46
  5. [ERLEDIGT] [ARDUINO] 2 Motoren + Servo mit dem Arduino Uno steuern
    Von Torrentula im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 31.08.2011, 16:31

Berechtigungen

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

Labornetzteil AliExpress